]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Feb 2022 12:09:40 +0000 (13:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Feb 2022 12:09:40 +0000 (13:09 +0100)
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

queue-5.15/series
queue-5.15/thermal-drivers-int340x-fix-rfim-mailbox-write-commands.patch [new file with mode: 0644]
queue-5.15/thermal-drivers-int340x-improve-the-tcc-offset-saving-for-suspend-resume.patch [new file with mode: 0644]
queue-5.15/thermal-drivers-int340x-processor_thermal-suppot-64-bit-rfim-responses.patch [new file with mode: 0644]
queue-5.15/thermal-int340x-limit-kconfig-to-64-bit.patch [new file with mode: 0644]
queue-5.15/tracing-propagate-is_signed-to-expression.patch [new file with mode: 0644]

index 065dbe6787d429293ea6e29d3d45e66818e47c79..df88f29c48805a9d040deacfa6f307f50cb7fa24 100644 (file)
@@ -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 (file)
index 0000000..aa57087
--- /dev/null
@@ -0,0 +1,298 @@
+From 2685c77b80a80c57e2a25a726b82fb31e6e212ab Mon Sep 17 00:00:00 2001
+From: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+Date: Thu, 23 Dec 2021 15:12:36 +0530
+Subject: thermal/drivers/int340x: Fix RFIM mailbox write commands
+
+From: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+
+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 <sumeet.r.pawnikar@intel.com>
+Cc: 5.14+ <stable@vger.kernel.org> # 5.14+
+Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+[ rjw: Changelog edits ]
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <linux/pci.h>
+ #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 (file)
index 0000000..2293d33
--- /dev/null
@@ -0,0 +1,209 @@
+From c4fcf1ada4ae63e0aab6afd19ca2e7d16833302c Mon Sep 17 00:00:00 2001
+From: Antoine Tenart <atenart@kernel.org>
+Date: Thu, 9 Sep 2021 10:56:13 +0200
+Subject: thermal/drivers/int340x: Improve the tcc offset saving for suspend/resume
+
+From: Antoine Tenart <atenart@kernel.org>
+
+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 <atenart@kernel.org>
+Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+Tested-by: Srinivas Pandruvada <srinivas.pI andruvada@linux.intel.com>
+Link: https://lore.kernel.org/r/20210909085613.5577-3-atenart@kernel.org
+Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
+Signed-off-by: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..6be4df6
--- /dev/null
@@ -0,0 +1,140 @@
+From aeb58c860dc516794fdf7ff89d96ead2644d5889 Mon Sep 17 00:00:00 2001
+From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+Date: Tue, 2 Nov 2021 03:52:36 -0700
+Subject: thermal/drivers/int340x: processor_thermal: Suppot 64 bit RFIM responses
+
+From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+
+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 <srinivas.pandruvada@linux.intel.com>
+Fixes: 5d6fbc96bd36 ("thermal/drivers/int340x: processor_thermal: Export additional attributes")
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..1d52763
--- /dev/null
@@ -0,0 +1,50 @@
+From 994a04a20b03128838ec0250a0e266aab24d23f1 Mon Sep 17 00:00:00 2001
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Mon, 8 Nov 2021 12:13:41 +0100
+Subject: thermal: int340x: Limit Kconfig to 64-bit
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+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 <arnd@arndb.de>
+Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..23579b7
--- /dev/null
@@ -0,0 +1,50 @@
+From 097f1eefedeab528cecbd35586dfe293853ffb17 Mon Sep 17 00:00:00 2001
+From: Tom Zanussi <zanussi@kernel.org>
+Date: Thu, 27 Jan 2022 15:44:17 -0600
+Subject: tracing: Propagate is_signed to expression
+
+From: Tom Zanussi <zanussi@kernel.org>
+
+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 <ykaradzhov@vmware.com>
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=215513
+Signed-off-by: Tom Zanussi <zanussi@kernel.org>
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+[sudip: adjust context]
+Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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);