xref: /linux/sound/soc/intel/avs/tgl.c (revision 68a052239fc4b351e961f698b824f7654a346091)
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // Copyright(c) 2021-2024 Intel Corporation
4 //
5 // Authors: Cezary Rojewski <cezary.rojewski@intel.com>
6 //          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
7 //
8 
9 #include <linux/pci.h>
10 #include "avs.h"
11 #include "debug.h"
12 #include "messages.h"
13 
14 #define CPUID_TSC_LEAF 0x15
15 
16 static int avs_tgl_dsp_core_power(struct avs_dev *adev, u32 core_mask, bool power)
17 {
18 	core_mask &= AVS_MAIN_CORE_MASK;
19 
20 	if (!core_mask)
21 		return 0;
22 	return avs_dsp_core_power(adev, core_mask, power);
23 }
24 
25 static int avs_tgl_dsp_core_reset(struct avs_dev *adev, u32 core_mask, bool reset)
26 {
27 	core_mask &= AVS_MAIN_CORE_MASK;
28 
29 	if (!core_mask)
30 		return 0;
31 	return avs_dsp_core_reset(adev, core_mask, reset);
32 }
33 
34 static int avs_tgl_dsp_core_stall(struct avs_dev *adev, u32 core_mask, bool stall)
35 {
36 	core_mask &= AVS_MAIN_CORE_MASK;
37 
38 	if (!core_mask)
39 		return 0;
40 	return avs_dsp_core_stall(adev, core_mask, stall);
41 }
42 
43 static int avs_tgl_config_basefw(struct avs_dev *adev)
44 {
45 	struct pci_dev *pci = adev->base.pci;
46 	struct avs_bus_hwid hwid;
47 	int ret;
48 #ifdef CONFIG_X86
49 	unsigned int ecx;
50 
51 #include <asm/cpuid/api.h>
52 	ecx = cpuid_ecx(CPUID_TSC_LEAF);
53 	if (ecx) {
54 		ret = avs_ipc_set_fw_config(adev, 1, AVS_FW_CFG_XTAL_FREQ_HZ, sizeof(ecx), &ecx);
55 		if (ret)
56 			return AVS_IPC_RET(ret);
57 	}
58 #endif
59 
60 	hwid.device = pci->device;
61 	hwid.subsystem = pci->subsystem_vendor | (pci->subsystem_device << 16);
62 	hwid.revision = pci->revision;
63 
64 	ret = avs_ipc_set_fw_config(adev, 1, AVS_FW_CFG_BUS_HARDWARE_ID, sizeof(hwid), &hwid);
65 	if (ret)
66 		return AVS_IPC_RET(ret);
67 
68 	return 0;
69 }
70 
71 const struct avs_dsp_ops avs_tgl_dsp_ops = {
72 	.power = avs_tgl_dsp_core_power,
73 	.reset = avs_tgl_dsp_core_reset,
74 	.stall = avs_tgl_dsp_core_stall,
75 	.dsp_interrupt = avs_cnl_dsp_interrupt,
76 	.int_control = avs_dsp_interrupt_control,
77 	.load_basefw = avs_icl_load_basefw,
78 	.load_lib = avs_hda_load_library,
79 	.transfer_mods = avs_hda_transfer_modules,
80 	.config_basefw = avs_tgl_config_basefw,
81 	.log_buffer_offset = avs_icl_log_buffer_offset,
82 	.log_buffer_status = avs_apl_log_buffer_status,
83 	.coredump = avs_apl_coredump,
84 	.d0ix_toggle = avs_icl_d0ix_toggle,
85 	.set_d0ix = avs_icl_set_d0ix,
86 	AVS_SET_ENABLE_LOGS_OP(icl)
87 };
88