linux/drivers/soundwire/dmi-quirks.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
   2// Copyright(c) 2021 Intel Corporation.
   3
   4/*
   5 * Soundwire DMI quirks
   6 */
   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 expose
  20 * the correct _ADR in the DSDT.
  21 * Remap the bad _ADR values to the ones reported by hardware
  22 */
  23static const struct adr_remap intel_tgl_bios[] = {
  24        {
  25                0x000010025D070100ull,
  26                0x000020025D071100ull
  27        },
  28        {
  29                0x000110025d070100ull,
  30                0x000120025D130800ull
  31        },
  32        {}
  33};
  34
  35/*
  36 * The initial version of the Dell SKU 0A3E did not expose the devices
  37 * on the correct links.
  38 */
  39static const struct adr_remap dell_sku_0A3E[] = {
  40        /* rt715 on link0 */
  41        {
  42                0x00020025d071100ull,
  43                0x00021025d071500ull
  44        },
  45        /* rt711 on link1 */
  46        {
  47                0x000120025d130800ull,
  48                0x000120025d071100ull,
  49        },
  50        /* rt1308 on link2 */
  51        {
  52                0x000220025d071500ull,
  53                0x000220025d130800ull
  54        },
  55        {}
  56};
  57
  58static const struct dmi_system_id adr_remap_quirk_table[] = {
  59        {
  60                .matches = {
  61                        DMI_MATCH(DMI_SYS_VENDOR, "HP"),
  62                        DMI_MATCH(DMI_PRODUCT_NAME, "HP Spectre x360 Convertible"),
  63                },
  64                .driver_data = (void *)intel_tgl_bios,
  65        },
  66        {
  67                /* quirk used for NUC15 'Bishop County' LAPBC510 and LAPBC710 skews */
  68                .matches = {
  69                        DMI_MATCH(DMI_SYS_VENDOR, "Intel(R) Client Systems"),
  70                        DMI_MATCH(DMI_PRODUCT_NAME, "LAPBC"),
  71                },
  72                .driver_data = (void *)intel_tgl_bios,
  73        },
  74        {
  75                .matches = {
  76                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
  77                        DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A3E")
  78                },
  79                .driver_data = (void *)dell_sku_0A3E,
  80        },
  81        {}
  82};
  83
  84u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr)
  85{
  86        const struct dmi_system_id *dmi_id;
  87
  88        /* check if any address remap quirk applies */
  89        dmi_id = dmi_first_match(adr_remap_quirk_table);
  90        if (dmi_id) {
  91                struct adr_remap *map;
  92
  93                for (map = dmi_id->driver_data; map->adr; map++) {
  94                        if (map->adr == addr) {
  95                                dev_dbg(bus->dev, "remapped _ADR 0x%llx as 0x%llx\n",
  96                                        addr, map->remapped_adr);
  97                                addr = map->remapped_adr;
  98                                break;
  99                        }
 100                }
 101        }
 102
 103        return addr;
 104}
 105