cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dmi-quirks.c (2114B)


      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 Conv"),
     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}