Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'platform-drivers-x86-v6.12-4' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86

Pull x86 platform driver fixes from Hans de Goede:

- AMD PMF: Add new hardware id

- AMD PMC: Fix crash when loaded with enable_stb=1 on devices without STB

- Dell: Add Alienware hwid for Alienware systems with Dell WMI interface

- thinkpad_acpi: Quirk to fix wrong fan speed readings on L480

- New hotkey mappings for Dell and Lenovo laptops

* tag 'platform-drivers-x86-v6.12-4' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
platform/x86: thinkpad_acpi: Fix for ThinkPad's with ECFW showing incorrect fan speed
platform/x86: ideapad-laptop: add missing Ideapad Pro 5 fn keys
platform/x86: dell-wmi-base: Handle META key Lock/Unlock events
platform/x86: dell-smbios-base: Extends support to Alienware products
platform/x86/amd/pmc: Detect when STB is not available
platform/x86/amd/pmf: Add SMU metrics table support for 1Ah family 60h model

+42 -3
+5
drivers/platform/x86/amd/pmc/pmc.c
··· 998 998 amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, dev->s2d_msg_id, true); 999 999 amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, dev->s2d_msg_id, true); 1000 1000 1001 + if (!phys_addr_hi && !phys_addr_low) { 1002 + dev_err(dev->dev, "STB is not enabled on the system; disable enable_stb or contact system vendor\n"); 1003 + return -EINVAL; 1004 + } 1005 + 1001 1006 stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low); 1002 1007 1003 1008 /* Clear msg_port for other SMU operation */
+1
drivers/platform/x86/amd/pmf/core.c
··· 261 261 dev->mtable_size = sizeof(dev->m_table); 262 262 break; 263 263 case PCI_DEVICE_ID_AMD_1AH_M20H_ROOT: 264 + case PCI_DEVICE_ID_AMD_1AH_M60H_ROOT: 264 265 dev->mtable_size = sizeof(dev->m_table_v2); 265 266 break; 266 267 default:
+1
drivers/platform/x86/amd/pmf/spc.c
··· 86 86 ARRAY_SIZE(dev->m_table.avg_core_c0residency), in); 87 87 break; 88 88 case PCI_DEVICE_ID_AMD_1AH_M20H_ROOT: 89 + case PCI_DEVICE_ID_AMD_1AH_M60H_ROOT: 89 90 memcpy(&dev->m_table_v2, dev->buf, dev->mtable_size); 90 91 in->ev_info.socket_power = dev->m_table_v2.apu_power + dev->m_table_v2.dgpu_power; 91 92 in->ev_info.skin_temperature = dev->m_table_v2.skin_temp;
+1
drivers/platform/x86/dell/dell-smbios-base.c
··· 576 576 int ret, wmi, smm; 577 577 578 578 if (!dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL) && 579 + !dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Alienware", NULL) && 579 580 !dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "www.dell.com", NULL)) { 580 581 pr_err("Unable to run on non-Dell system\n"); 581 582 return -ENODEV;
+6
drivers/platform/x86/dell/dell-wmi-base.c
··· 80 80 static const struct key_entry dell_wmi_keymap_type_0000[] = { 81 81 { KE_IGNORE, 0x003a, { KEY_CAPSLOCK } }, 82 82 83 + /* Meta key lock */ 84 + { KE_IGNORE, 0xe000, { KEY_RIGHTMETA } }, 85 + 86 + /* Meta key unlock */ 87 + { KE_IGNORE, 0xe001, { KEY_RIGHTMETA } }, 88 + 83 89 /* Key code is followed by brightness level */ 84 90 { KE_KEY, 0xe005, { KEY_BRIGHTNESSDOWN } }, 85 91 { KE_KEY, 0xe006, { KEY_BRIGHTNESSUP } },
+3
drivers/platform/x86/ideapad-laptop.c
··· 1294 1294 { KE_KEY, 0x27 | IDEAPAD_WMI_KEY, { KEY_HELP } }, 1295 1295 /* Refresh Rate Toggle */ 1296 1296 { KE_KEY, 0x0a | IDEAPAD_WMI_KEY, { KEY_REFRESH_RATE_TOGGLE } }, 1297 + /* Specific to some newer models */ 1298 + { KE_KEY, 0x3e | IDEAPAD_WMI_KEY, { KEY_MICMUTE } }, 1299 + { KE_KEY, 0x3f | IDEAPAD_WMI_KEY, { KEY_RFKILL } }, 1297 1300 1298 1301 { KE_END }, 1299 1302 };
+25 -3
drivers/platform/x86/thinkpad_acpi.c
··· 7936 7936 static int fan_watchdog_maxinterval; 7937 7937 7938 7938 static bool fan_with_ns_addr; 7939 + static bool ecfw_with_fan_dec_rpm; 7939 7940 7940 7941 static struct mutex fan_mutex; 7941 7942 ··· 8683 8682 if (res < 0) 8684 8683 return res; 8685 8684 8686 - return sysfs_emit(buf, "%u\n", speed); 8685 + /* Check for fan speeds displayed in hexadecimal */ 8686 + if (!ecfw_with_fan_dec_rpm) 8687 + return sysfs_emit(buf, "%u\n", speed); 8688 + else 8689 + return sysfs_emit(buf, "%x\n", speed); 8687 8690 } 8688 8691 8689 8692 static DEVICE_ATTR(fan1_input, S_IRUGO, fan_fan1_input_show, NULL); ··· 8704 8699 if (res < 0) 8705 8700 return res; 8706 8701 8707 - return sysfs_emit(buf, "%u\n", speed); 8702 + /* Check for fan speeds displayed in hexadecimal */ 8703 + if (!ecfw_with_fan_dec_rpm) 8704 + return sysfs_emit(buf, "%u\n", speed); 8705 + else 8706 + return sysfs_emit(buf, "%x\n", speed); 8708 8707 } 8709 8708 8710 8709 static DEVICE_ATTR(fan2_input, S_IRUGO, fan_fan2_input_show, NULL); ··· 8784 8775 #define TPACPI_FAN_2CTL 0x0004 /* selects fan2 control */ 8785 8776 #define TPACPI_FAN_NOFAN 0x0008 /* no fan available */ 8786 8777 #define TPACPI_FAN_NS 0x0010 /* For EC with non-Standard register addresses */ 8778 + #define TPACPI_FAN_DECRPM 0x0020 /* For ECFW's with RPM in register as decimal */ 8787 8779 8788 8780 static const struct tpacpi_quirk fan_quirk_table[] __initconst = { 8789 8781 TPACPI_QEC_IBM('1', 'Y', TPACPI_FAN_Q1), ··· 8813 8803 TPACPI_Q_LNV3('R', '1', 'D', TPACPI_FAN_NS), /* 11e Gen5 GL-R */ 8814 8804 TPACPI_Q_LNV3('R', '0', 'V', TPACPI_FAN_NS), /* 11e Gen5 KL-Y */ 8815 8805 TPACPI_Q_LNV3('N', '1', 'O', TPACPI_FAN_NOFAN), /* X1 Tablet (2nd gen) */ 8806 + TPACPI_Q_LNV3('R', '0', 'Q', TPACPI_FAN_DECRPM),/* L480 */ 8816 8807 }; 8817 8808 8818 8809 static int __init fan_init(struct ibm_init_struct *iibm) ··· 8855 8844 pr_info("ECFW with non-standard fan reg control found\n"); 8856 8845 fan_with_ns_addr = 1; 8857 8846 /* Fan ctrl support from host is undefined for now */ 8847 + tp_features.fan_ctrl_status_undef = 1; 8848 + } 8849 + 8850 + /* Check for the EC/BIOS with RPM reported in decimal*/ 8851 + if (quirks & TPACPI_FAN_DECRPM) { 8852 + pr_info("ECFW with fan RPM as decimal in EC register\n"); 8853 + ecfw_with_fan_dec_rpm = 1; 8858 8854 tp_features.fan_ctrl_status_undef = 1; 8859 8855 } 8860 8856 ··· 9085 9067 if (rc < 0) 9086 9068 return rc; 9087 9069 9088 - seq_printf(m, "speed:\t\t%d\n", speed); 9070 + /* Check for fan speeds displayed in hexadecimal */ 9071 + if (!ecfw_with_fan_dec_rpm) 9072 + seq_printf(m, "speed:\t\t%d\n", speed); 9073 + else 9074 + seq_printf(m, "speed:\t\t%x\n", speed); 9089 9075 9090 9076 if (fan_status_access_mode == TPACPI_FAN_RD_TPEC_NS) { 9091 9077 /*