338 lines · c
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)2//3// This file is provided under a dual BSD/GPLv2 license. When using or4// redistributing this file, you may do so under either license.5//6// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.7//8// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>9//10 11/* ACP machine configuration module */12 13#include <linux/acpi.h>14#include <linux/bits.h>15#include <linux/dmi.h>16#include <linux/module.h>17#include <linux/pci.h>18 19#include "../sof/amd/acp.h"20#include "mach-config.h"21 22#define ACP_7_0_REV 0x7023 24static int acp_quirk_data;25 26static const struct config_entry config_table[] = {27 {28 .flags = FLAG_AMD_SOF,29 .device = ACP_PCI_DEV_ID,30 .dmi_table = (const struct dmi_system_id []) {31 {32 .matches = {33 DMI_MATCH(DMI_SYS_VENDOR, "AMD"),34 DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"),35 },36 },37 {}38 },39 },40 {41 .flags = FLAG_AMD_SOF,42 .device = ACP_PCI_DEV_ID,43 .dmi_table = (const struct dmi_system_id []) {44 {45 .matches = {46 DMI_MATCH(DMI_SYS_VENDOR, "Google"),47 },48 },49 {}50 },51 },52 {53 .flags = FLAG_AMD_LEGACY,54 .device = ACP_PCI_DEV_ID,55 .dmi_table = (const struct dmi_system_id []) {56 {57 .matches = {58 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),59 DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"),60 },61 },62 {}63 },64 },65 {66 .flags = FLAG_AMD_SOF,67 .device = ACP_PCI_DEV_ID,68 .dmi_table = (const struct dmi_system_id []) {69 {70 .matches = {71 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),72 DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),73 },74 },75 {}76 },77 },78 {79 .flags = FLAG_AMD_LEGACY,80 .device = ACP_PCI_DEV_ID,81 .dmi_table = (const struct dmi_system_id []) {82 {83 .matches = {84 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),85 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"),86 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),87 },88 },89 {}90 },91 },92 {93 .flags = FLAG_AMD_LEGACY,94 .device = ACP_PCI_DEV_ID,95 .dmi_table = (const struct dmi_system_id []) {96 {97 .matches = {98 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),99 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"),100 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),101 },102 },103 {}104 },105 },106 {107 .flags = FLAG_AMD_LEGACY,108 .device = ACP_PCI_DEV_ID,109 .dmi_table = (const struct dmi_system_id []) {110 {111 .matches = {112 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),113 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"),114 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),115 },116 },117 {}118 },119 },120 {121 .flags = FLAG_AMD_LEGACY,122 .device = ACP_PCI_DEV_ID,123 .dmi_table = (const struct dmi_system_id []) {124 {125 .matches = {126 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),127 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),128 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),129 },130 },131 {}132 },133 },134 {135 .flags = FLAG_AMD_LEGACY,136 .device = ACP_PCI_DEV_ID,137 .dmi_table = (const struct dmi_system_id []) {138 {139 .matches = {140 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),141 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),142 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"),143 },144 },145 {}146 },147 },148 {149 .flags = FLAG_AMD_LEGACY,150 .device = ACP_PCI_DEV_ID,151 .dmi_table = (const struct dmi_system_id []) {152 {153 .matches = {154 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),155 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),156 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"),157 },158 },159 {}160 },161 },162};163 164static int snd_amd_acp_acpi_find_config(struct pci_dev *pci)165{166 const union acpi_object *obj;167 int acp_flag = FLAG_AMD_LEGACY_ONLY_DMIC;168 169 if (!acpi_dev_get_property(ACPI_COMPANION(&pci->dev), "acp-audio-config-flag",170 ACPI_TYPE_INTEGER, &obj))171 acp_flag = obj->integer.value;172 173 return acp_flag;174}175 176int snd_amd_acp_find_config(struct pci_dev *pci)177{178 const struct config_entry *table = config_table;179 u16 device = pci->device;180 int i;181 182 /* Do not enable FLAGS on older platforms with Rev Id zero183 * For platforms which has ACP 7.0 or higher, read the acp184 * config flag from BIOS ACPI table and for older platforms185 * read it from DMI tables.186 */187 if (!pci->revision)188 return 0;189 else if (pci->revision >= ACP_7_0_REV)190 return snd_amd_acp_acpi_find_config(pci);191 192 for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {193 if (table->device != device)194 continue;195 if (table->dmi_table && !dmi_check_system(table->dmi_table))196 continue;197 acp_quirk_data = table->flags;198 return table->flags;199 }200 201 return 0;202}203EXPORT_SYMBOL(snd_amd_acp_find_config);204 205static struct snd_soc_acpi_codecs amp_rt1019 = {206 .num_codecs = 1,207 .codecs = {"10EC1019"}208};209 210static struct snd_soc_acpi_codecs amp_max = {211 .num_codecs = 1,212 .codecs = {"MX98360A"}213};214 215static struct snd_soc_acpi_codecs amp_max98388 = {216 .num_codecs = 1,217 .codecs = {"ADS8388"}218};219 220struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = {221 {222 .id = "10EC5682",223 .drv_name = "rt5682-rt1019",224 .pdata = (void *)&acp_quirk_data,225 .machine_quirk = snd_soc_acpi_codec_list,226 .quirk_data = &_rt1019,227 .fw_filename = "sof-rn.ri",228 .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",229 },230 {231 .id = "10EC5682",232 .drv_name = "rt5682-max",233 .pdata = (void *)&acp_quirk_data,234 .machine_quirk = snd_soc_acpi_codec_list,235 .quirk_data = &_max,236 .fw_filename = "sof-rn.ri",237 .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",238 },239 {240 .id = "RTL5682",241 .drv_name = "rt5682s-max",242 .pdata = (void *)&acp_quirk_data,243 .machine_quirk = snd_soc_acpi_codec_list,244 .quirk_data = &_max,245 .fw_filename = "sof-rn.ri",246 .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",247 },248 {249 .id = "RTL5682",250 .drv_name = "rt5682s-rt1019",251 .pdata = (void *)&acp_quirk_data,252 .machine_quirk = snd_soc_acpi_codec_list,253 .quirk_data = &_rt1019,254 .fw_filename = "sof-rn.ri",255 .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",256 },257 {258 .id = "AMDI1019",259 .drv_name = "renoir-dsp",260 .pdata = (void *)&acp_quirk_data,261 .fw_filename = "sof-rn.ri",262 .sof_tplg_filename = "sof-acp.tplg",263 },264 {},265};266EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines);267 268struct snd_soc_acpi_mach snd_soc_acpi_amd_vangogh_sof_machines[] = {269 {270 .id = "NVTN2020",271 .drv_name = "nau8821-max",272 .pdata = &acp_quirk_data,273 .machine_quirk = snd_soc_acpi_codec_list,274 .quirk_data = &_max98388,275 .fw_filename = "sof-vangogh.ri",276 .sof_tplg_filename = "sof-vangogh-nau8821-max.tplg",277 },278 {},279};280EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines);281 282struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_sof_machines[] = {283 {284 .id = "AMDI1019",285 .drv_name = "rmb-dsp",286 .pdata = &acp_quirk_data,287 .fw_filename = "sof-rmb.ri",288 .sof_tplg_filename = "sof-acp-rmb.tplg",289 },290 {291 .id = "10508825",292 .drv_name = "nau8825-max",293 .pdata = &acp_quirk_data,294 .machine_quirk = snd_soc_acpi_codec_list,295 .quirk_data = &_max,296 .fw_filename = "sof-rmb.ri",297 .sof_tplg_filename = "sof-rmb-nau8825-max98360.tplg",298 },299 {300 .id = "RTL5682",301 .drv_name = "rt5682s-hs-rt1019",302 .pdata = &acp_quirk_data,303 .machine_quirk = snd_soc_acpi_codec_list,304 .quirk_data = &_rt1019,305 .fw_filename = "sof-rmb.ri",306 .sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg",307 },308 {},309};310EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines);311 312struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sof_machines[] = {313 {314 .id = "AMDI1019",315 .drv_name = "acp63-dsp",316 .pdata = &acp_quirk_data,317 .fw_filename = "sof-acp_6_3.ri",318 .sof_tplg_filename = "sof-acp_6_3.tplg",319 },320 {},321};322EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sof_machines);323 324struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_sof_machines[] = {325 {326 .id = "AMDI1010",327 .drv_name = "acp70-dsp",328 .pdata = &acp_quirk_data,329 .fw_filename = "sof-acp_7_0.ri",330 .sof_tplg_filename = "sof-acp_7_0.tplg",331 },332 {},333};334EXPORT_SYMBOL(snd_soc_acpi_amd_acp70_sof_machines);335 336MODULE_DESCRIPTION("AMD ACP Machine Configuration Module");337MODULE_LICENSE("Dual BSD/GPL");338