From: Greg Kroah-Hartman Date: Fri, 11 Feb 2022 12:09:40 +0000 (+0100) Subject: 5.15-stable patches X-Git-Tag: v4.9.302~55 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=21879906fe29f6890c88a0e07ba32afef6bca842;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch thermal-int340x-limit-kconfig-to-64-bit.patch tracing-propagate-is_signed-to-expression.patch --- diff --git a/queue-5.15/series b/queue-5.15/series index 065dbe6787d..df88f29c488 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -15,3 +15,8 @@ nfsd-fix-ia_size-underflow.patch nfsd-clamp-write-offsets.patch nfsd-fix-offset-type-in-i-o-trace-points.patch nfsd-fix-the-behavior-of-read-near-offset_max.patch +thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch +thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch +thermal-int340x-limit-kconfig-to-64-bit.patch +thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch +tracing-propagate-is_signed-to-expression.patch diff --git a/queue-5.15/thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch b/queue-5.15/thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch new file mode 100644 index 00000000000..aa57087b690 --- /dev/null +++ b/queue-5.15/thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch @@ -0,0 +1,298 @@ +From 2685c77b80a80c57e2a25a726b82fb31e6e212ab Mon Sep 17 00:00:00 2001 +From: Sumeet Pawnikar +Date: Thu, 23 Dec 2021 15:12:36 +0530 +Subject: thermal/drivers/int340x: Fix RFIM mailbox write commands + +From: Sumeet Pawnikar + +commit 2685c77b80a80c57e2a25a726b82fb31e6e212ab upstream. + +The existing mail mechanism only supports writing of workload types. + +However, mailbox command for RFIM (cmd = 0x08) also requires write +operation which is ignored. This results in failing to store RFI +restriction. + +Fixint this requires enhancing mailbox writes for non workload +commands too, so remove the check for MBOX_CMD_WORKLOAD_TYPE_WRITE +in mailbox write to allow this other write commands to be supoorted. + +At the same time, however, we have to make sure that there is no +impact on read commands, by avoiding to write anything into the +mailbox data register. + +To properly implement that, add two separate functions for mbox read +and write commands for the processor thermal workload command type. +This helps to distinguish the read and write workload command types +from each other while sending mbox commands. + +Fixes: 5d6fbc96bd36 ("thermal/drivers/int340x: processor_thermal: Export additional attributes") +Signed-off-by: Sumeet Pawnikar +Cc: 5.14+ # 5.14+ +Acked-by: Srinivas Pandruvada +[ rjw: Changelog edits ] +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + drivers/thermal/intel/int340x_thermal/processor_thermal_device.h | 3 + drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c | 100 +++++----- + drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c | 23 +- + 3 files changed, 73 insertions(+), 53 deletions(-) + +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h +@@ -80,7 +80,8 @@ void proc_thermal_rfim_remove(struct pci + int proc_thermal_mbox_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv); + void proc_thermal_mbox_remove(struct pci_dev *pdev); + +-int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp); ++int processor_thermal_send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp); ++int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data); + int proc_thermal_add(struct device *dev, struct proc_thermal_device *priv); + void proc_thermal_remove(struct proc_thermal_device *proc_priv); + int proc_thermal_suspend(struct device *dev); +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c +@@ -24,19 +24,15 @@ + + static DEFINE_MUTEX(mbox_lock); + +-static int send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp) ++static int wait_for_mbox_ready(struct proc_thermal_device *proc_priv) + { +- struct proc_thermal_device *proc_priv; + u32 retries, data; + int ret; + +- mutex_lock(&mbox_lock); +- proc_priv = pci_get_drvdata(pdev); +- + /* Poll for rb bit == 0 */ + retries = MBOX_RETRY_COUNT; + do { +- data = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE)); ++ data = readl(proc_priv->mmio_base + MBOX_OFFSET_INTERFACE); + if (data & BIT_ULL(MBOX_BUSY_BIT)) { + ret = -EBUSY; + continue; +@@ -45,53 +41,78 @@ static int send_mbox_cmd(struct pci_dev + break; + } while (--retries); + ++ return ret; ++} ++ ++static int send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data) ++{ ++ struct proc_thermal_device *proc_priv; ++ u32 reg_data; ++ int ret; ++ ++ proc_priv = pci_get_drvdata(pdev); ++ ++ mutex_lock(&mbox_lock); ++ ++ ret = wait_for_mbox_ready(proc_priv); + if (ret) + goto unlock_mbox; + +- if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_WRITE) +- writel(cmd_data, (void __iomem *) ((proc_priv->mmio_base + MBOX_OFFSET_DATA))); +- ++ writel(data, (proc_priv->mmio_base + MBOX_OFFSET_DATA)); + /* Write command register */ +- data = BIT_ULL(MBOX_BUSY_BIT) | cmd_id; +- writel(data, (void __iomem *) ((proc_priv->mmio_base + MBOX_OFFSET_INTERFACE))); ++ reg_data = BIT_ULL(MBOX_BUSY_BIT) | id; ++ writel(reg_data, (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE)); + +- /* Poll for rb bit == 0 */ +- retries = MBOX_RETRY_COUNT; +- do { +- data = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE)); +- if (data & BIT_ULL(MBOX_BUSY_BIT)) { +- ret = -EBUSY; +- continue; +- } ++ ret = wait_for_mbox_ready(proc_priv); + +- if (data) { +- ret = -ENXIO; +- goto unlock_mbox; +- } ++unlock_mbox: ++ mutex_unlock(&mbox_lock); ++ return ret; ++} + +- ret = 0; ++static int send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp) ++{ ++ struct proc_thermal_device *proc_priv; ++ u32 reg_data; ++ int ret; + +- if (!cmd_resp) +- break; ++ proc_priv = pci_get_drvdata(pdev); + +- if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_READ) +- *cmd_resp = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); +- else +- *cmd_resp = readq((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); ++ mutex_lock(&mbox_lock); + +- break; +- } while (--retries); ++ ret = wait_for_mbox_ready(proc_priv); ++ if (ret) ++ goto unlock_mbox; ++ ++ /* Write command register */ ++ reg_data = BIT_ULL(MBOX_BUSY_BIT) | id; ++ writel(reg_data, (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE)); ++ ++ ret = wait_for_mbox_ready(proc_priv); ++ if (ret) ++ goto unlock_mbox; ++ ++ if (id == MBOX_CMD_WORKLOAD_TYPE_READ) ++ *resp = readl(proc_priv->mmio_base + MBOX_OFFSET_DATA); ++ else ++ *resp = readq(proc_priv->mmio_base + MBOX_OFFSET_DATA); + + unlock_mbox: + mutex_unlock(&mbox_lock); + return ret; + } + +-int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp) ++int processor_thermal_send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp) + { +- return send_mbox_cmd(pdev, cmd_id, cmd_data, cmd_resp); ++ return send_mbox_read_cmd(pdev, id, resp); + } +-EXPORT_SYMBOL_GPL(processor_thermal_send_mbox_cmd); ++EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_read_cmd, INT340X_THERMAL); ++ ++int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data) ++{ ++ return send_mbox_write_cmd(pdev, id, data); ++} ++EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_write_cmd, INT340X_THERMAL); + + /* List of workload types */ + static const char * const workload_types[] = { +@@ -104,7 +125,6 @@ static const char * const workload_types + NULL + }; + +- + static ssize_t workload_available_types_show(struct device *dev, + struct device_attribute *attr, + char *buf) +@@ -146,7 +166,7 @@ static ssize_t workload_type_store(struc + + data |= ret; + +- ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_WRITE, data, NULL); ++ ret = send_mbox_write_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_WRITE, data); + if (ret) + return false; + +@@ -161,7 +181,7 @@ static ssize_t workload_type_show(struct + u64 cmd_resp; + int ret; + +- ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, 0, &cmd_resp); ++ ret = send_mbox_read_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, &cmd_resp); + if (ret) + return false; + +@@ -186,8 +206,6 @@ static const struct attribute_group work + .name = "workload_request" + }; + +- +- + static bool workload_req_created; + + int proc_thermal_mbox_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv) +@@ -196,7 +214,7 @@ int proc_thermal_mbox_add(struct pci_dev + int ret; + + /* Check if there is a mailbox support, if fails return success */ +- ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, 0, &cmd_resp); ++ ret = send_mbox_read_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, &cmd_resp); + if (ret) + return 0; + +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c +@@ -9,6 +9,8 @@ + #include + #include "processor_thermal_device.h" + ++MODULE_IMPORT_NS(INT340X_THERMAL); ++ + struct mmio_reg { + int read_only; + u32 offset; +@@ -194,8 +196,7 @@ static ssize_t rfi_restriction_store(str + struct device_attribute *attr, + const char *buf, size_t count) + { +- u16 cmd_id = 0x0008; +- u64 cmd_resp; ++ u16 id = 0x0008; + u32 input; + int ret; + +@@ -203,7 +204,7 @@ static ssize_t rfi_restriction_store(str + if (ret) + return ret; + +- ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, input, &cmd_resp); ++ ret = processor_thermal_send_mbox_write_cmd(to_pci_dev(dev), id, input); + if (ret) + return ret; + +@@ -214,30 +215,30 @@ static ssize_t rfi_restriction_show(stru + struct device_attribute *attr, + char *buf) + { +- u16 cmd_id = 0x0007; +- u64 cmd_resp; ++ u16 id = 0x0007; ++ u64 resp; + int ret; + +- ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp); ++ ret = processor_thermal_send_mbox_read_cmd(to_pci_dev(dev), id, &resp); + if (ret) + return ret; + +- return sprintf(buf, "%llu\n", cmd_resp); ++ return sprintf(buf, "%llu\n", resp); + } + + static ssize_t ddr_data_rate_show(struct device *dev, + struct device_attribute *attr, + char *buf) + { +- u16 cmd_id = 0x0107; +- u64 cmd_resp; ++ u16 id = 0x0107; ++ u64 resp; + int ret; + +- ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp); ++ ret = processor_thermal_send_mbox_read_cmd(to_pci_dev(dev), id, &resp); + if (ret) + return ret; + +- return sprintf(buf, "%llu\n", cmd_resp); ++ return sprintf(buf, "%llu\n", resp); + } + + static DEVICE_ATTR_RW(rfi_restriction); diff --git a/queue-5.15/thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch b/queue-5.15/thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch new file mode 100644 index 00000000000..2293d33e378 --- /dev/null +++ b/queue-5.15/thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch @@ -0,0 +1,209 @@ +From c4fcf1ada4ae63e0aab6afd19ca2e7d16833302c Mon Sep 17 00:00:00 2001 +From: Antoine Tenart +Date: Thu, 9 Sep 2021 10:56:13 +0200 +Subject: thermal/drivers/int340x: Improve the tcc offset saving for suspend/resume + +From: Antoine Tenart + +commit c4fcf1ada4ae63e0aab6afd19ca2e7d16833302c upstream. + +When the driver resumes, the tcc offset is set back to its previous +value. But this only works if the value was user defined as otherwise +the offset isn't saved. This asymmetric logic is harder to maintain and +introduced some issues. + +Improve the logic by saving the tcc offset in a suspend op, so the right +value is always restored after a resume. + +Signed-off-by: Antoine Tenart +Reviewed-by: Srinivas Pandruvada +Tested-by: Srinivas Pandruvada +Link: https://lore.kernel.org/r/20210909085613.5577-3-atenart@kernel.org +Signed-off-by: Daniel Lezcano +Signed-off-by: Sumeet Pawnikar +Signed-off-by: Greg Kroah-Hartman +--- + drivers/thermal/intel/int340x_thermal/int3401_thermal.c | 8 +- + drivers/thermal/intel/int340x_thermal/processor_thermal_device.c | 36 +++++++--- + drivers/thermal/intel/int340x_thermal/processor_thermal_device.h | 1 + drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c | 18 ++++- + drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c | 8 +- + 5 files changed, 60 insertions(+), 11 deletions(-) + +--- a/drivers/thermal/intel/int340x_thermal/int3401_thermal.c ++++ b/drivers/thermal/intel/int340x_thermal/int3401_thermal.c +@@ -44,15 +44,21 @@ static int int3401_remove(struct platfor + } + + #ifdef CONFIG_PM_SLEEP ++static int int3401_thermal_suspend(struct device *dev) ++{ ++ return proc_thermal_suspend(dev); ++} + static int int3401_thermal_resume(struct device *dev) + { + return proc_thermal_resume(dev); + } + #else ++#define int3401_thermal_suspend NULL + #define int3401_thermal_resume NULL + #endif + +-static SIMPLE_DEV_PM_OPS(int3401_proc_thermal_pm, NULL, int3401_thermal_resume); ++static SIMPLE_DEV_PM_OPS(int3401_proc_thermal_pm, int3401_thermal_suspend, ++ int3401_thermal_resume); + + static struct platform_driver int3401_driver = { + .probe = int3401_add, +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +@@ -68,8 +68,7 @@ static const struct attribute_group powe + .name = "power_limits" + }; + +-static ssize_t tcc_offset_degree_celsius_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static int tcc_get_offset(void) + { + u64 val; + int err; +@@ -78,8 +77,20 @@ static ssize_t tcc_offset_degree_celsius + if (err) + return err; + +- val = (val >> 24) & 0x3f; +- return sprintf(buf, "%d\n", (int)val); ++ return (val >> 24) & 0x3f; ++} ++ ++static ssize_t tcc_offset_degree_celsius_show(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ int tcc; ++ ++ tcc = tcc_get_offset(); ++ if (tcc < 0) ++ return tcc; ++ ++ return sprintf(buf, "%d\n", tcc); + } + + static int tcc_offset_update(unsigned int tcc) +@@ -107,8 +118,6 @@ static int tcc_offset_update(unsigned in + return 0; + } + +-static int tcc_offset_save = -1; +- + static ssize_t tcc_offset_degree_celsius_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +@@ -131,8 +140,6 @@ static ssize_t tcc_offset_degree_celsius + if (err) + return err; + +- tcc_offset_save = tcc; +- + return count; + } + +@@ -345,6 +352,18 @@ void proc_thermal_remove(struct proc_the + } + EXPORT_SYMBOL_GPL(proc_thermal_remove); + ++static int tcc_offset_save = -1; ++ ++int proc_thermal_suspend(struct device *dev) ++{ ++ tcc_offset_save = tcc_get_offset(); ++ if (tcc_offset_save < 0) ++ dev_warn(dev, "failed to save offset (%d)\n", tcc_offset_save); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(proc_thermal_suspend); ++ + int proc_thermal_resume(struct device *dev) + { + struct proc_thermal_device *proc_dev; +@@ -352,6 +371,7 @@ int proc_thermal_resume(struct device *d + proc_dev = dev_get_drvdata(dev); + proc_thermal_read_ppcc(proc_dev); + ++ /* Do not update if saving failed */ + if (tcc_offset_save >= 0) + tcc_offset_update(tcc_offset_save); + +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h +@@ -83,6 +83,7 @@ void proc_thermal_mbox_remove(struct pci + int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u32 *cmd_resp); + int proc_thermal_add(struct device *dev, struct proc_thermal_device *priv); + void proc_thermal_remove(struct proc_thermal_device *proc_priv); ++int proc_thermal_suspend(struct device *dev); + int proc_thermal_resume(struct device *dev); + int proc_thermal_mmio_add(struct pci_dev *pdev, + struct proc_thermal_device *proc_priv, +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c +@@ -314,6 +314,20 @@ static void proc_thermal_pci_remove(stru + } + + #ifdef CONFIG_PM_SLEEP ++static int proc_thermal_pci_suspend(struct device *dev) ++{ ++ struct pci_dev *pdev = to_pci_dev(dev); ++ struct proc_thermal_device *proc_priv; ++ struct proc_thermal_pci *pci_info; ++ ++ proc_priv = pci_get_drvdata(pdev); ++ pci_info = proc_priv->priv_data; ++ ++ if (!pci_info->no_legacy) ++ return proc_thermal_suspend(dev); ++ ++ return 0; ++} + static int proc_thermal_pci_resume(struct device *dev) + { + struct pci_dev *pdev = to_pci_dev(dev); +@@ -335,10 +349,12 @@ static int proc_thermal_pci_resume(struc + return 0; + } + #else ++#define proc_thermal_pci_suspend NULL + #define proc_thermal_pci_resume NULL + #endif + +-static SIMPLE_DEV_PM_OPS(proc_thermal_pci_pm, NULL, proc_thermal_pci_resume); ++static SIMPLE_DEV_PM_OPS(proc_thermal_pci_pm, proc_thermal_pci_suspend, ++ proc_thermal_pci_resume); + + static const struct pci_device_id proc_thermal_pci_ids[] = { + { PCI_DEVICE_DATA(INTEL, ADL_THERMAL, PROC_THERMAL_FEATURE_RAPL | PROC_THERMAL_FEATURE_FIVR | PROC_THERMAL_FEATURE_DVFS | PROC_THERMAL_FEATURE_MBOX) }, +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c +@@ -107,15 +107,21 @@ static void proc_thermal_pci_remove(stru + } + + #ifdef CONFIG_PM_SLEEP ++static int proc_thermal_pci_suspend(struct device *dev) ++{ ++ return proc_thermal_suspend(dev); ++} + static int proc_thermal_pci_resume(struct device *dev) + { + return proc_thermal_resume(dev); + } + #else ++#define proc_thermal_pci_suspend NULL + #define proc_thermal_pci_resume NULL + #endif + +-static SIMPLE_DEV_PM_OPS(proc_thermal_pci_pm, NULL, proc_thermal_pci_resume); ++static SIMPLE_DEV_PM_OPS(proc_thermal_pci_pm, proc_thermal_pci_suspend, ++ proc_thermal_pci_resume); + + static const struct pci_device_id proc_thermal_pci_ids[] = { + { PCI_DEVICE_DATA(INTEL, BDW_THERMAL, 0) }, diff --git a/queue-5.15/thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch b/queue-5.15/thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch new file mode 100644 index 00000000000..6be4df6813b --- /dev/null +++ b/queue-5.15/thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch @@ -0,0 +1,140 @@ +From aeb58c860dc516794fdf7ff89d96ead2644d5889 Mon Sep 17 00:00:00 2001 +From: Srinivas Pandruvada +Date: Tue, 2 Nov 2021 03:52:36 -0700 +Subject: thermal/drivers/int340x: processor_thermal: Suppot 64 bit RFIM responses + +From: Srinivas Pandruvada + +commit aeb58c860dc516794fdf7ff89d96ead2644d5889 upstream. + +Some of the RFIM mail box command returns 64 bit values. So enhance +mailbox interface to return 64 bit values and use them for RFIM +commands. + +Signed-off-by: Srinivas Pandruvada +Fixes: 5d6fbc96bd36 ("thermal/drivers/int340x: processor_thermal: Export additional attributes") +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sumeet Pawnikar +Signed-off-by: Greg Kroah-Hartman +--- + drivers/thermal/intel/int340x_thermal/processor_thermal_device.h | 2 + drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c | 22 +++++----- + drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c | 10 ++-- + 3 files changed, 19 insertions(+), 15 deletions(-) + +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.h +@@ -80,7 +80,7 @@ void proc_thermal_rfim_remove(struct pci + int proc_thermal_mbox_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv); + void proc_thermal_mbox_remove(struct pci_dev *pdev); + +-int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u32 *cmd_resp); ++int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp); + int proc_thermal_add(struct device *dev, struct proc_thermal_device *priv); + void proc_thermal_remove(struct proc_thermal_device *proc_priv); + int proc_thermal_suspend(struct device *dev); +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c +@@ -24,7 +24,7 @@ + + static DEFINE_MUTEX(mbox_lock); + +-static int send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u32 *cmd_resp) ++static int send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp) + { + struct proc_thermal_device *proc_priv; + u32 retries, data; +@@ -69,12 +69,16 @@ static int send_mbox_cmd(struct pci_dev + goto unlock_mbox; + } + +- if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_READ) { +- data = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); +- *cmd_resp = data & 0xff; +- } +- + ret = 0; ++ ++ if (!cmd_resp) ++ break; ++ ++ if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_READ) ++ *cmd_resp = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); ++ else ++ *cmd_resp = readq((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); ++ + break; + } while (--retries); + +@@ -83,7 +87,7 @@ unlock_mbox: + return ret; + } + +-int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u32 *cmd_resp) ++int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp) + { + return send_mbox_cmd(pdev, cmd_id, cmd_data, cmd_resp); + } +@@ -154,7 +158,7 @@ static ssize_t workload_type_show(struct + char *buf) + { + struct pci_dev *pdev = to_pci_dev(dev); +- u32 cmd_resp; ++ u64 cmd_resp; + int ret; + + ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, 0, &cmd_resp); +@@ -188,7 +192,7 @@ static bool workload_req_created; + + int proc_thermal_mbox_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv) + { +- u32 cmd_resp; ++ u64 cmd_resp; + int ret; + + /* Check if there is a mailbox support, if fails return success */ +--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c ++++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c +@@ -195,7 +195,7 @@ static ssize_t rfi_restriction_store(str + const char *buf, size_t count) + { + u16 cmd_id = 0x0008; +- u32 cmd_resp; ++ u64 cmd_resp; + u32 input; + int ret; + +@@ -215,14 +215,14 @@ static ssize_t rfi_restriction_show(stru + char *buf) + { + u16 cmd_id = 0x0007; +- u32 cmd_resp; ++ u64 cmd_resp; + int ret; + + ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp); + if (ret) + return ret; + +- return sprintf(buf, "%u\n", cmd_resp); ++ return sprintf(buf, "%llu\n", cmd_resp); + } + + static ssize_t ddr_data_rate_show(struct device *dev, +@@ -230,14 +230,14 @@ static ssize_t ddr_data_rate_show(struct + char *buf) + { + u16 cmd_id = 0x0107; +- u32 cmd_resp; ++ u64 cmd_resp; + int ret; + + ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp); + if (ret) + return ret; + +- return sprintf(buf, "%u\n", cmd_resp); ++ return sprintf(buf, "%llu\n", cmd_resp); + } + + static DEVICE_ATTR_RW(rfi_restriction); diff --git a/queue-5.15/thermal-int340x-limit-kconfig-to-64-bit.patch b/queue-5.15/thermal-int340x-limit-kconfig-to-64-bit.patch new file mode 100644 index 00000000000..1d52763d6e9 --- /dev/null +++ b/queue-5.15/thermal-int340x-limit-kconfig-to-64-bit.patch @@ -0,0 +1,50 @@ +From 994a04a20b03128838ec0250a0e266aab24d23f1 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Mon, 8 Nov 2021 12:13:41 +0100 +Subject: thermal: int340x: Limit Kconfig to 64-bit + +From: Arnd Bergmann + +commit 994a04a20b03128838ec0250a0e266aab24d23f1 upstream. + +32-bit processors cannot generally access 64-bit MMIO registers +atomically, and it is unknown in which order the two halves of +this registers would need to be read: + +drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c: In function 'send_mbox_cmd': +drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c:79:37: error: implicit declaration of function 'readq'; did you mean 'readl'? [-Werror=implicit-function-declaration] + 79 | *cmd_resp = readq((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA)); + | ^~~~~ + | readl + +The driver already does not build for anything other than x86, +so limit it further to x86-64. + +Fixes: aeb58c860dc5 ("thermal/drivers/int340x: processor_thermal: Suppot 64 bit RFIM responses") +Signed-off-by: Arnd Bergmann +Reviewed-by: Srinivas Pandruvada +Reviewed-by: Randy Dunlap +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sumeet Pawnikar +Signed-off-by: Greg Kroah-Hartman +--- + drivers/thermal/intel/int340x_thermal/Kconfig | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/thermal/intel/int340x_thermal/Kconfig ++++ b/drivers/thermal/intel/int340x_thermal/Kconfig +@@ -5,12 +5,12 @@ + + config INT340X_THERMAL + tristate "ACPI INT340X thermal drivers" +- depends on X86 && ACPI && PCI ++ depends on X86_64 && ACPI && PCI + select THERMAL_GOV_USER_SPACE + select ACPI_THERMAL_REL + select ACPI_FAN + select INTEL_SOC_DTS_IOSF_CORE +- select PROC_THERMAL_MMIO_RAPL if X86_64 && POWERCAP ++ select PROC_THERMAL_MMIO_RAPL if POWERCAP + help + Newer laptops and tablets that use ACPI may have thermal sensors and + other devices with thermal control capabilities outside the core diff --git a/queue-5.15/tracing-propagate-is_signed-to-expression.patch b/queue-5.15/tracing-propagate-is_signed-to-expression.patch new file mode 100644 index 00000000000..23579b7ec9d --- /dev/null +++ b/queue-5.15/tracing-propagate-is_signed-to-expression.patch @@ -0,0 +1,50 @@ +From 097f1eefedeab528cecbd35586dfe293853ffb17 Mon Sep 17 00:00:00 2001 +From: Tom Zanussi +Date: Thu, 27 Jan 2022 15:44:17 -0600 +Subject: tracing: Propagate is_signed to expression + +From: Tom Zanussi + +commit 097f1eefedeab528cecbd35586dfe293853ffb17 upstream. + +During expression parsing, a new expression field is created which +should inherit the properties of the operands, such as size and +is_signed. + +is_signed propagation was missing, causing spurious errors with signed +operands. Add it in parse_expr() and parse_unary() to fix the problem. + +Link: https://lkml.kernel.org/r/f4dac08742fd7a0920bf80a73c6c44042f5eaa40.1643319703.git.zanussi@kernel.org + +Cc: stable@vger.kernel.org +Fixes: 100719dcef447 ("tracing: Add simple expression support to hist triggers") +Reported-by: Yordan Karadzhov +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=215513 +Signed-off-by: Tom Zanussi +Signed-off-by: Steven Rostedt (Google) +[sudip: adjust context] +Signed-off-by: Sudip Mukherjee +Signed-off-by: Greg Kroah-Hartman +--- + kernel/trace/trace_events_hist.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/kernel/trace/trace_events_hist.c ++++ b/kernel/trace/trace_events_hist.c +@@ -2220,6 +2220,8 @@ static struct hist_field *parse_unary(st + (HIST_FIELD_FL_TIMESTAMP | HIST_FIELD_FL_TIMESTAMP_USECS); + expr->fn = hist_field_unary_minus; + expr->operands[0] = operand1; ++ expr->size = operand1->size; ++ expr->is_signed = operand1->is_signed; + expr->operator = FIELD_OP_UNARY_MINUS; + expr->name = expr_str(expr, 0); + expr->type = kstrdup_const(operand1->type, GFP_KERNEL); +@@ -2359,6 +2361,7 @@ static struct hist_field *parse_expr(str + + /* The operand sizes should be the same, so just pick one */ + expr->size = operand1->size; ++ expr->is_signed = operand1->is_signed; + + expr->operator = field_op; + expr->name = expr_str(expr, 0);