180 lines · c
1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)2// Copyright(c) 2021 Intel Corporation.3 4/*5 * Soundwire DMI quirks6 */7 8#include <linux/device.h>9#include <linux/dmi.h>10#include <linux/soundwire/sdw.h>11#include "bus.h"12 13struct adr_remap {14 u64 adr;15 u64 remapped_adr;16};17 18/*19 * Some TigerLake devices based on an initial Intel BIOS do not expose20 * the correct _ADR in the DSDT.21 * Remap the bad _ADR values to the ones reported by hardware22 */23static const struct adr_remap intel_tgl_bios[] = {24 {25 0x000010025D070100ull,26 0x000020025D071100ull27 },28 {29 0x000110025d070100ull,30 0x000120025D130800ull31 },32 {}33};34 35/*36 * The initial version of the Dell SKU 0A3E did not expose the devices37 * on the correct links.38 */39static const struct adr_remap dell_sku_0A3E[] = {40 /* rt715 on link0 */41 {42 0x00020025d071100ull,43 0x00021025d071500ull44 },45 /* rt711 on link1 */46 {47 0x000120025d130800ull,48 0x000120025d071100ull,49 },50 /* rt1308 on link2 */51 {52 0x000220025d071500ull,53 0x000220025d130800ull54 },55 {}56};57 58/*59 * The HP Omen 16-k0005TX does not expose the correct version of RT711 on link060 * and does not expose a RT1316 on link361 */62static const struct adr_remap hp_omen_16[] = {63 /* rt711-sdca on link0 */64 {65 0x000020025d071100ull,66 0x000030025d071101ull67 },68 /* rt1316-sdca on link3 */69 {70 0x000120025d071100ull,71 0x000330025d131601ull72 },73 {}74};75 76/*77 * Intel NUC M15 LAPRC510 and LAPRC71078 */79static const struct adr_remap intel_rooks_county[] = {80 /* rt711-sdca on link0 */81 {82 0x000020025d071100ull,83 0x000030025d071101ull84 },85 /* rt1316-sdca on link2 */86 {87 0x000120025d071100ull,88 0x000230025d131601ull89 },90 {}91};92 93static const struct dmi_system_id adr_remap_quirk_table[] = {94 /* TGL devices */95 {96 .matches = {97 DMI_MATCH(DMI_SYS_VENDOR, "HP"),98 DMI_MATCH(DMI_PRODUCT_NAME, "HP Spectre x360 Conv"),99 },100 .driver_data = (void *)intel_tgl_bios,101 },102 {103 .matches = {104 DMI_MATCH(DMI_SYS_VENDOR, "HP"),105 DMI_MATCH(DMI_BOARD_NAME, "8709"),106 },107 .driver_data = (void *)intel_tgl_bios,108 },109 {110 /* quirk used for NUC15 'Bishop County' LAPBC510 and LAPBC710 skews */111 .matches = {112 DMI_MATCH(DMI_SYS_VENDOR, "Intel(R) Client Systems"),113 DMI_MATCH(DMI_PRODUCT_NAME, "LAPBC"),114 },115 .driver_data = (void *)intel_tgl_bios,116 },117 {118 /* quirk used for NUC15 LAPBC710 skew */119 .matches = {120 DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),121 DMI_MATCH(DMI_BOARD_NAME, "LAPBC710"),122 },123 .driver_data = (void *)intel_tgl_bios,124 },125 {126 /* quirk used for NUC15 'Rooks County' LAPRC510 and LAPRC710 skews */127 .matches = {128 DMI_MATCH(DMI_SYS_VENDOR, "Intel(R) Client Systems"),129 DMI_MATCH(DMI_PRODUCT_NAME, "LAPRC"),130 },131 .driver_data = (void *)intel_rooks_county,132 },133 {134 /* quirk used for NUC15 LAPRC710 skew */135 .matches = {136 DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),137 DMI_MATCH(DMI_BOARD_NAME, "LAPRC710"),138 },139 .driver_data = (void *)intel_rooks_county,140 },141 {142 .matches = {143 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),144 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A3E")145 },146 .driver_data = (void *)dell_sku_0A3E,147 },148 /* ADL devices */149 {150 .matches = {151 DMI_MATCH(DMI_SYS_VENDOR, "HP"),152 DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16"),153 },154 .driver_data = (void *)hp_omen_16,155 },156 {}157};158 159u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr)160{161 const struct dmi_system_id *dmi_id;162 163 /* check if any address remap quirk applies */164 dmi_id = dmi_first_match(adr_remap_quirk_table);165 if (dmi_id) {166 struct adr_remap *map;167 168 for (map = dmi_id->driver_data; map->adr; map++) {169 if (map->adr == addr) {170 dev_dbg(bus->dev, "remapped _ADR 0x%llx as 0x%llx\n",171 addr, map->remapped_adr);172 addr = map->remapped_adr;173 break;174 }175 }176 }177 178 return addr;179}180