Commit 259b897e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v5.18-3' of...

Merge tag 'platform-drivers-x86-v5.18-3' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86

Pull x86 platform driver fixes from Hans de Goede:
 "Highlights:

   - asus-wmi bug-fixes

   - intel-sdsu bug-fixes

   - build (warning) fixes

   - couple of hw-id additions"

* tag 'platform-drivers-x86-v5.18-3' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
  platform/x86/intel: pmc/core: change pmc_lpm_modes to static
  platform/x86/intel/sdsi: Fix bug in multi packet reads
  platform/x86/intel/sdsi: Poll on ready bit for writes
  platform/x86/intel/sdsi: Handle leaky bucket
  platform/x86: intel-uncore-freq: Prevent driver loading in guests
  platform/x86: gigabyte-wmi: added support for B660 GAMING X DDR4 motherboard
  platform/x86: dell-laptop: Add quirk entry for Latitude 7520
  platform/x86: asus-wmi: Fix driver not binding when fan curve control probe fails
  platform/x86: asus-wmi: Potential buffer overflow in asus_wmi_evaluate_method_buf()
  tools/power/x86/intel-speed-select: fix build failure when using -Wl,--as-needed
parents fd5a4c7d eb2fd9b4
...@@ -371,10 +371,14 @@ static int asus_wmi_evaluate_method_buf(u32 method_id, ...@@ -371,10 +371,14 @@ static int asus_wmi_evaluate_method_buf(u32 method_id,
switch (obj->type) { switch (obj->type) {
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
if (obj->buffer.length > size) if (obj->buffer.length > size) {
err = -ENOSPC; err = -ENOSPC;
if (obj->buffer.length == 0) break;
}
if (obj->buffer.length == 0) {
err = -ENODATA; err = -ENODATA;
break;
}
memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length); memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length);
break; break;
...@@ -2223,9 +2227,10 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available, ...@@ -2223,9 +2227,10 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
err = fan_curve_get_factory_default(asus, fan_dev); err = fan_curve_get_factory_default(asus, fan_dev);
if (err) { if (err) {
if (err == -ENODEV || err == -ENODATA) pr_debug("fan_curve_get_factory_default(0x%08x) failed: %d\n",
return 0; fan_dev, err);
return err; /* Don't cause probe to fail on devices without fan-curves */
return 0;
} }
*available = true; *available = true;
......
...@@ -80,6 +80,10 @@ static struct quirk_entry quirk_dell_inspiron_1012 = { ...@@ -80,6 +80,10 @@ static struct quirk_entry quirk_dell_inspiron_1012 = {
.kbd_led_not_present = true, .kbd_led_not_present = true,
}; };
static struct quirk_entry quirk_dell_latitude_7520 = {
.kbd_missing_ac_tag = true,
};
static struct platform_driver platform_driver = { static struct platform_driver platform_driver = {
.driver = { .driver = {
.name = "dell-laptop", .name = "dell-laptop",
...@@ -336,6 +340,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = { ...@@ -336,6 +340,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = {
}, },
.driver_data = &quirk_dell_inspiron_1012, .driver_data = &quirk_dell_inspiron_1012,
}, },
{
.callback = dmi_matched,
.ident = "Dell Latitude 7520",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 7520"),
},
.driver_data = &quirk_dell_latitude_7520,
},
{ } { }
}; };
......
...@@ -148,6 +148,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = { ...@@ -148,6 +148,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550I AORUS PRO AX"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550I AORUS PRO AX"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B660 GAMING X DDR4"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z390 I AORUS PRO WIFI-CF"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z390 I AORUS PRO WIFI-CF"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 AORUS ELITE"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 AORUS ELITE"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 GAMING X"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 GAMING X"),
......
...@@ -236,7 +236,7 @@ enum ppfear_regs { ...@@ -236,7 +236,7 @@ enum ppfear_regs {
#define ADL_LPM_STATUS_LATCH_EN_OFFSET 0x1704 #define ADL_LPM_STATUS_LATCH_EN_OFFSET 0x1704
#define ADL_LPM_LIVE_STATUS_OFFSET 0x1764 #define ADL_LPM_LIVE_STATUS_OFFSET 0x1764
const char *pmc_lpm_modes[] = { static const char *pmc_lpm_modes[] = {
"S0i2.0", "S0i2.0",
"S0i2.1", "S0i2.1",
"S0i2.2", "S0i2.2",
......
...@@ -51,6 +51,8 @@ ...@@ -51,6 +51,8 @@
#define MBOX_TIMEOUT_US 2000 #define MBOX_TIMEOUT_US 2000
#define MBOX_TIMEOUT_ACQUIRE_US 1000 #define MBOX_TIMEOUT_ACQUIRE_US 1000
#define MBOX_POLLING_PERIOD_US 100 #define MBOX_POLLING_PERIOD_US 100
#define MBOX_ACQUIRE_NUM_RETRIES 5
#define MBOX_ACQUIRE_RETRY_DELAY_MS 500
#define MBOX_MAX_PACKETS 4 #define MBOX_MAX_PACKETS 4
#define MBOX_OWNER_NONE 0x00 #define MBOX_OWNER_NONE 0x00
...@@ -81,7 +83,7 @@ enum sdsi_command { ...@@ -81,7 +83,7 @@ enum sdsi_command {
struct sdsi_mbox_info { struct sdsi_mbox_info {
u64 *payload; u64 *payload;
u64 *buffer; void *buffer;
int size; int size;
}; };
...@@ -163,9 +165,7 @@ static int sdsi_mbox_cmd_read(struct sdsi_priv *priv, struct sdsi_mbox_info *inf ...@@ -163,9 +165,7 @@ static int sdsi_mbox_cmd_read(struct sdsi_priv *priv, struct sdsi_mbox_info *inf
total = 0; total = 0;
loop = 0; loop = 0;
do { do {
int offset = SDSI_SIZE_MAILBOX * loop; void *buf = info->buffer + (SDSI_SIZE_MAILBOX * loop);
void __iomem *addr = priv->mbox_addr + offset;
u64 *buf = info->buffer + offset / SDSI_SIZE_CMD;
u32 packet_size; u32 packet_size;
/* Poll on ready bit */ /* Poll on ready bit */
...@@ -196,7 +196,7 @@ static int sdsi_mbox_cmd_read(struct sdsi_priv *priv, struct sdsi_mbox_info *inf ...@@ -196,7 +196,7 @@ static int sdsi_mbox_cmd_read(struct sdsi_priv *priv, struct sdsi_mbox_info *inf
break; break;
} }
sdsi_memcpy64_fromio(buf, addr, round_up(packet_size, SDSI_SIZE_CMD)); sdsi_memcpy64_fromio(buf, priv->mbox_addr, round_up(packet_size, SDSI_SIZE_CMD));
total += packet_size; total += packet_size;
...@@ -243,8 +243,8 @@ static int sdsi_mbox_cmd_write(struct sdsi_priv *priv, struct sdsi_mbox_info *in ...@@ -243,8 +243,8 @@ static int sdsi_mbox_cmd_write(struct sdsi_priv *priv, struct sdsi_mbox_info *in
FIELD_PREP(CTRL_PACKET_SIZE, info->size); FIELD_PREP(CTRL_PACKET_SIZE, info->size);
writeq(control, priv->control_addr); writeq(control, priv->control_addr);
/* Poll on run_busy bit */ /* Poll on ready bit */
ret = readq_poll_timeout(priv->control_addr, control, !(control & CTRL_RUN_BUSY), ret = readq_poll_timeout(priv->control_addr, control, control & CTRL_READY,
MBOX_POLLING_PERIOD_US, MBOX_TIMEOUT_US); MBOX_POLLING_PERIOD_US, MBOX_TIMEOUT_US);
if (ret) if (ret)
...@@ -263,7 +263,7 @@ static int sdsi_mbox_acquire(struct sdsi_priv *priv, struct sdsi_mbox_info *info ...@@ -263,7 +263,7 @@ static int sdsi_mbox_acquire(struct sdsi_priv *priv, struct sdsi_mbox_info *info
{ {
u64 control; u64 control;
u32 owner; u32 owner;
int ret; int ret, retries = 0;
lockdep_assert_held(&priv->mb_lock); lockdep_assert_held(&priv->mb_lock);
...@@ -273,13 +273,29 @@ static int sdsi_mbox_acquire(struct sdsi_priv *priv, struct sdsi_mbox_info *info ...@@ -273,13 +273,29 @@ static int sdsi_mbox_acquire(struct sdsi_priv *priv, struct sdsi_mbox_info *info
if (owner != MBOX_OWNER_NONE) if (owner != MBOX_OWNER_NONE)
return -EBUSY; return -EBUSY;
/* Write first qword of payload */ /*
writeq(info->payload[0], priv->mbox_addr); * If there has been no recent transaction and no one owns the mailbox,
* we should acquire it in under 1ms. However, if we've accessed it
* recently it may take up to 2.1 seconds to acquire it again.
*/
do {
/* Write first qword of payload */
writeq(info->payload[0], priv->mbox_addr);
/* Check for ownership */
ret = readq_poll_timeout(priv->control_addr, control,
FIELD_GET(CTRL_OWNER, control) == MBOX_OWNER_INBAND,
MBOX_POLLING_PERIOD_US, MBOX_TIMEOUT_ACQUIRE_US);
if (FIELD_GET(CTRL_OWNER, control) == MBOX_OWNER_NONE &&
retries++ < MBOX_ACQUIRE_NUM_RETRIES) {
msleep(MBOX_ACQUIRE_RETRY_DELAY_MS);
continue;
}
/* Check for ownership */ /* Either we got it or someone else did. */
ret = readq_poll_timeout(priv->control_addr, control, break;
FIELD_GET(CTRL_OWNER, control) & MBOX_OWNER_INBAND, } while (true);
MBOX_POLLING_PERIOD_US, MBOX_TIMEOUT_ACQUIRE_US);
return ret; return ret;
} }
......
...@@ -212,6 +212,9 @@ static int __init intel_uncore_init(void) ...@@ -212,6 +212,9 @@ static int __init intel_uncore_init(void)
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
int ret; int ret;
if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
return -ENODEV;
id = x86_match_cpu(intel_uncore_cpu_ids); id = x86_match_cpu(intel_uncore_cpu_ids);
if (!id) if (!id)
return -ENODEV; return -ENODEV;
......
...@@ -42,7 +42,7 @@ ISST_IN := $(OUTPUT)intel-speed-select-in.o ...@@ -42,7 +42,7 @@ ISST_IN := $(OUTPUT)intel-speed-select-in.o
$(ISST_IN): prepare FORCE $(ISST_IN): prepare FORCE
$(Q)$(MAKE) $(build)=intel-speed-select $(Q)$(MAKE) $(build)=intel-speed-select
$(OUTPUT)intel-speed-select: $(ISST_IN) $(OUTPUT)intel-speed-select: $(ISST_IN)
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ $(QUIET_LINK)$(CC) $(CFLAGS) $< $(LDFLAGS) -o $@
clean: clean:
rm -f $(ALL_PROGRAMS) rm -f $(ALL_PROGRAMS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment