1f6594cdfSPierre-Louis Bossart // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) 2f6594cdfSPierre-Louis Bossart // Copyright(c) 2021 Intel Corporation. 3f6594cdfSPierre-Louis Bossart 4f6594cdfSPierre-Louis Bossart /* 5f6594cdfSPierre-Louis Bossart * Soundwire DMI quirks 6f6594cdfSPierre-Louis Bossart */ 7f6594cdfSPierre-Louis Bossart 8f6594cdfSPierre-Louis Bossart #include <linux/device.h> 9f6594cdfSPierre-Louis Bossart #include <linux/dmi.h> 10f6594cdfSPierre-Louis Bossart #include <linux/soundwire/sdw.h> 11f6594cdfSPierre-Louis Bossart #include "bus.h" 12f6594cdfSPierre-Louis Bossart 13f6594cdfSPierre-Louis Bossart struct adr_remap { 14f6594cdfSPierre-Louis Bossart u64 adr; 15f6594cdfSPierre-Louis Bossart u64 remapped_adr; 16f6594cdfSPierre-Louis Bossart }; 17f6594cdfSPierre-Louis Bossart 18f6594cdfSPierre-Louis Bossart /* 19*caa15c8dSPierre-Louis Bossart * Some TigerLake devices based on an initial Intel BIOS do not expose 20*caa15c8dSPierre-Louis Bossart * the correct _ADR in the DSDT. 21f6594cdfSPierre-Louis Bossart * Remap the bad _ADR values to the ones reported by hardware 22f6594cdfSPierre-Louis Bossart */ 23*caa15c8dSPierre-Louis Bossart static const struct adr_remap intel_tgl_bios[] = { 24f6594cdfSPierre-Louis Bossart { 25433b3084SPierre-Louis Bossart 0x000010025D070100ull, 26433b3084SPierre-Louis Bossart 0x000020025D071100ull 27f6594cdfSPierre-Louis Bossart }, 28f6594cdfSPierre-Louis Bossart { 29433b3084SPierre-Louis Bossart 0x000110025d070100ull, 30433b3084SPierre-Louis Bossart 0x000120025D130800ull 31f6594cdfSPierre-Louis Bossart }, 32f6594cdfSPierre-Louis Bossart {} 33f6594cdfSPierre-Louis Bossart }; 34f6594cdfSPierre-Louis Bossart 35be3ae00fSPierre-Louis Bossart /* 36be3ae00fSPierre-Louis Bossart * The initial version of the Dell SKU 0A3E did not expose the devices 37be3ae00fSPierre-Louis Bossart * on the correct links. 38be3ae00fSPierre-Louis Bossart */ 39be3ae00fSPierre-Louis Bossart static const struct adr_remap dell_sku_0A3E[] = { 40be3ae00fSPierre-Louis Bossart /* rt715 on link0 */ 41be3ae00fSPierre-Louis Bossart { 42433b3084SPierre-Louis Bossart 0x00020025d071100ull, 43433b3084SPierre-Louis Bossart 0x00021025d071500ull 44be3ae00fSPierre-Louis Bossart }, 45be3ae00fSPierre-Louis Bossart /* rt711 on link1 */ 46be3ae00fSPierre-Louis Bossart { 47433b3084SPierre-Louis Bossart 0x000120025d130800ull, 48433b3084SPierre-Louis Bossart 0x000120025d071100ull, 49be3ae00fSPierre-Louis Bossart }, 50be3ae00fSPierre-Louis Bossart /* rt1308 on link2 */ 51be3ae00fSPierre-Louis Bossart { 52433b3084SPierre-Louis Bossart 0x000220025d071500ull, 53433b3084SPierre-Louis Bossart 0x000220025d130800ull 54be3ae00fSPierre-Louis Bossart }, 55be3ae00fSPierre-Louis Bossart {} 56be3ae00fSPierre-Louis Bossart }; 57be3ae00fSPierre-Louis Bossart 58f6594cdfSPierre-Louis Bossart static const struct dmi_system_id adr_remap_quirk_table[] = { 59f6594cdfSPierre-Louis Bossart { 60f6594cdfSPierre-Louis Bossart .matches = { 61f6594cdfSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "HP"), 62f6594cdfSPierre-Louis Bossart DMI_MATCH(DMI_PRODUCT_NAME, "HP Spectre x360 Convertible"), 63f6594cdfSPierre-Louis Bossart }, 64*caa15c8dSPierre-Louis Bossart .driver_data = (void *)intel_tgl_bios, 65*caa15c8dSPierre-Louis Bossart }, 66*caa15c8dSPierre-Louis Bossart { 67*caa15c8dSPierre-Louis Bossart /* quirk used for NUC15 'Bishop County' LAPBC510 and LAPBC710 skews */ 68*caa15c8dSPierre-Louis Bossart .matches = { 69*caa15c8dSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Intel(R) Client Systems"), 70*caa15c8dSPierre-Louis Bossart DMI_MATCH(DMI_PRODUCT_NAME, "LAPBC"), 71*caa15c8dSPierre-Louis Bossart }, 72*caa15c8dSPierre-Louis Bossart .driver_data = (void *)intel_tgl_bios, 73f6594cdfSPierre-Louis Bossart }, 74be3ae00fSPierre-Louis Bossart { 75be3ae00fSPierre-Louis Bossart .matches = { 76be3ae00fSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), 77be3ae00fSPierre-Louis Bossart DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A3E") 78be3ae00fSPierre-Louis Bossart }, 79be3ae00fSPierre-Louis Bossart .driver_data = (void *)dell_sku_0A3E, 80be3ae00fSPierre-Louis Bossart }, 81f6594cdfSPierre-Louis Bossart {} 82f6594cdfSPierre-Louis Bossart }; 83f6594cdfSPierre-Louis Bossart 84f6594cdfSPierre-Louis Bossart u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr) 85f6594cdfSPierre-Louis Bossart { 86f6594cdfSPierre-Louis Bossart const struct dmi_system_id *dmi_id; 87f6594cdfSPierre-Louis Bossart 88f6594cdfSPierre-Louis Bossart /* check if any address remap quirk applies */ 89f6594cdfSPierre-Louis Bossart dmi_id = dmi_first_match(adr_remap_quirk_table); 90f6594cdfSPierre-Louis Bossart if (dmi_id) { 9103721992SPierre-Louis Bossart struct adr_remap *map; 92f6594cdfSPierre-Louis Bossart 93f6594cdfSPierre-Louis Bossart for (map = dmi_id->driver_data; map->adr; map++) { 94f6594cdfSPierre-Louis Bossart if (map->adr == addr) { 95f6594cdfSPierre-Louis Bossart dev_dbg(bus->dev, "remapped _ADR 0x%llx as 0x%llx\n", 96f6594cdfSPierre-Louis Bossart addr, map->remapped_adr); 97f6594cdfSPierre-Louis Bossart addr = map->remapped_adr; 98f6594cdfSPierre-Louis Bossart break; 99f6594cdfSPierre-Louis Bossart } 100f6594cdfSPierre-Louis Bossart } 101f6594cdfSPierre-Louis Bossart } 102f6594cdfSPierre-Louis Bossart 103f6594cdfSPierre-Louis Bossart return addr; 104f6594cdfSPierre-Louis Bossart } 105