2021-03-02 15:51:04 +08:00
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
// Copyright(c) 2021 Intel Corporation.
/*
* Soundwire DMI quirks
*/
# include <linux/device.h>
# include <linux/dmi.h>
# include <linux/soundwire/sdw.h>
# include "bus.h"
struct adr_remap {
u64 adr ;
u64 remapped_adr ;
} ;
/*
2021-07-19 18:32:47 -05:00
* Some TigerLake devices based on an initial Intel BIOS do not expose
* the correct _ADR in the DSDT .
2021-03-02 15:51:04 +08:00
* Remap the bad _ADR values to the ones reported by hardware
*/
2021-07-19 18:32:47 -05:00
static const struct adr_remap intel_tgl_bios [ ] = {
2021-03-02 15:51:04 +08:00
{
2021-07-14 09:30:27 +08:00
0x000010025D070100ull ,
0x000020025D071100ull
2021-03-02 15:51:04 +08:00
} ,
{
2021-07-14 09:30:27 +08:00
0x000110025d070100ull ,
0x000120025D130800ull
2021-03-02 15:51:04 +08:00
} ,
{ }
} ;
2021-03-02 15:51:05 +08:00
/*
* The initial version of the Dell SKU 0 A3E did not expose the devices
* on the correct links .
*/
static const struct adr_remap dell_sku_0A3E [ ] = {
/* rt715 on link0 */
{
2021-07-14 09:30:27 +08:00
0x00020025d071100ull ,
0x00021025d071500ull
2021-03-02 15:51:05 +08:00
} ,
/* rt711 on link1 */
{
2021-07-14 09:30:27 +08:00
0x000120025d130800ull ,
0x000120025d071100ull ,
2021-03-02 15:51:05 +08:00
} ,
/* rt1308 on link2 */
{
2021-07-14 09:30:27 +08:00
0x000220025d071500ull ,
0x000220025d130800ull
2021-03-02 15:51:05 +08:00
} ,
{ }
} ;
2022-08-23 11:09:19 +08:00
/*
* The HP Omen 16 - k0005TX does not expose the correct version of RT711 on link0
* and does not expose a RT1316 on link3
*/
static const struct adr_remap hp_omen_16 [ ] = {
/* rt711-sdca on link0 */
{
0x000020025d071100ull ,
0x000030025d071101ull
} ,
/* rt1316-sdca on link3 */
{
0x000120025d071100ull ,
0x000330025d131601ull
} ,
{ }
} ;
2023-03-14 17:06:18 +08:00
/*
* Intel NUC M15 LAPRC510 and LAPRC710
*/
static const struct adr_remap intel_rooks_county [ ] = {
/* rt711-sdca on link0 */
{
0x000020025d071100ull ,
0x000030025d071101ull
} ,
/* rt1316-sdca on link2 */
{
0x000120025d071100ull ,
0x000230025d131601ull
} ,
{ }
} ;
2021-03-02 15:51:04 +08:00
static const struct dmi_system_id adr_remap_quirk_table [ ] = {
2022-08-23 11:09:19 +08:00
/* TGL devices */
2021-03-02 15:51:04 +08:00
{
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " HP " ) ,
2022-03-04 14:45:32 -06:00
DMI_MATCH ( DMI_PRODUCT_NAME , " HP Spectre x360 Conv " ) ,
2021-03-02 15:51:04 +08:00
} ,
2021-07-19 18:32:47 -05:00
. driver_data = ( void * ) intel_tgl_bios ,
} ,
2023-05-15 15:48:59 +08:00
{
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " HP " ) ,
DMI_MATCH ( DMI_BOARD_NAME , " 8709 " ) ,
} ,
. driver_data = ( void * ) intel_tgl_bios ,
} ,
2021-07-19 18:32:47 -05:00
{
/* quirk used for NUC15 'Bishop County' LAPBC510 and LAPBC710 skews */
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Intel(R) Client Systems " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " LAPBC " ) ,
} ,
. driver_data = ( void * ) intel_tgl_bios ,
2021-03-02 15:51:04 +08:00
} ,
2022-10-18 09:25:00 +08:00
{
/* quirk used for NUC15 LAPBC710 skew */
. matches = {
DMI_MATCH ( DMI_BOARD_VENDOR , " Intel Corporation " ) ,
DMI_MATCH ( DMI_BOARD_NAME , " LAPBC710 " ) ,
} ,
. driver_data = ( void * ) intel_tgl_bios ,
} ,
2023-03-14 17:06:18 +08:00
{
/* quirk used for NUC15 'Rooks County' LAPRC510 and LAPRC710 skews */
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Intel(R) Client Systems " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " LAPRC " ) ,
} ,
. driver_data = ( void * ) intel_rooks_county ,
} ,
2021-03-02 15:51:05 +08:00
{
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc " ) ,
DMI_EXACT_MATCH ( DMI_PRODUCT_SKU , " 0A3E " )
} ,
. driver_data = ( void * ) dell_sku_0A3E ,
} ,
2022-08-23 11:09:19 +08:00
/* ADL devices */
{
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " HP " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " OMEN by HP Gaming Laptop 16-k0xxx " ) ,
} ,
. driver_data = ( void * ) hp_omen_16 ,
} ,
2021-03-02 15:51:04 +08:00
{ }
} ;
u64 sdw_dmi_override_adr ( struct sdw_bus * bus , u64 addr )
{
const struct dmi_system_id * dmi_id ;
/* check if any address remap quirk applies */
dmi_id = dmi_first_match ( adr_remap_quirk_table ) ;
if ( dmi_id ) {
2021-05-11 10:50:35 +08:00
struct adr_remap * map ;
2021-03-02 15:51:04 +08:00
for ( map = dmi_id - > driver_data ; map - > adr ; map + + ) {
if ( map - > adr = = addr ) {
dev_dbg ( bus - > dev , " remapped _ADR 0x%llx as 0x%llx \n " ,
addr , map - > remapped_adr ) ;
addr = map - > remapped_adr ;
break ;
}
}
}
return addr ;
}