thermal: intel: int340x: Add DLVR support for Lunar Lake
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Wed, 19 Jun 2024 12:46:00 +0000 (05:46 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 21 Jun 2024 13:20:28 +0000 (15:20 +0200)
Add support for DLVR (Digital Linear Voltage Regulator) for Lunar Lake.
There are no new sysfs attributes or difference in operation compared
to prior generations.

MMIO offset and bit positions are changed compared to Meteor Lake
processors. Also for two attributes dlvr_frequency_mhz and
dlvr_frequency_select, the value presented or accepted by the firmware
is not raw frequency value but an index.
For example:
RFI_FREQ_SELECT and RFI_FREQ
: 0 DLVR freq point 2227.2 MHz
: 1 DLVR freq point 2140 MHz

Hence create a mapping table for Lunar Lake to map user space values
to the firmware accepted values.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Link: https://patch.msgid.link/20240619124600.491168-4-srinivas.pandruvada@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c

index 4a1bfebb1b8e52076fd536085c08c5e53204ee72..b6bb96d07ce259a7a55cddef3a98c747e8a253cb 100644 (file)
@@ -408,7 +408,8 @@ static SIMPLE_DEV_PM_OPS(proc_thermal_pci_pm, proc_thermal_pci_suspend,
 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_WT_REQ) },
-       { PCI_DEVICE_DATA(INTEL, LNLM_THERMAL, PROC_THERMAL_FEATURE_RAPL) },
+       { PCI_DEVICE_DATA(INTEL, LNLM_THERMAL, PROC_THERMAL_FEATURE_RAPL |
+         PROC_THERMAL_FEATURE_DLVR) },
        { PCI_DEVICE_DATA(INTEL, MTLP_THERMAL, PROC_THERMAL_FEATURE_RAPL |
          PROC_THERMAL_FEATURE_FIVR | PROC_THERMAL_FEATURE_DVFS | PROC_THERMAL_FEATURE_DLVR |
          PROC_THERMAL_FEATURE_WT_HINT | PROC_THERMAL_FEATURE_POWER_FLOOR) },
index c9c77bca20145b5d68918e123efea27abc567885..0e2dc1426282da29dbcdd6951768cdd73a05a8c7 100644 (file)
@@ -68,6 +68,25 @@ static const struct mmio_reg dlvr_mmio_regs[] = {
        { 1, 0x15A10, 1, 0x1, 16}, /* dlvr_pll_busy */
 };
 
+static const struct mmio_reg lnl_dlvr_mmio_regs[] = {
+       { 0, 0x5A08, 5, 0x1F, 0}, /* dlvr_spread_spectrum_pct */
+       { 0, 0x5A08, 1, 0x1, 5}, /* dlvr_control_mode */
+       { 0, 0x5A08, 1, 0x1, 6}, /* dlvr_control_lock */
+       { 0, 0x5A08, 1, 0x1, 7}, /* dlvr_rfim_enable */
+       { 0, 0x5A08, 2, 0x3, 8}, /* dlvr_freq_select */
+       { 1, 0x5A10, 2, 0x3, 30}, /* dlvr_hardware_rev */
+       { 1, 0x5A10, 2, 0x3, 0}, /* dlvr_freq_mhz */
+       { 1, 0x5A10, 1, 0x1, 23}, /* dlvr_pll_busy */
+};
+
+static const struct mapping_table lnl_dlvr_mapping[] = {
+       {"dlvr_freq_select", 0, "2227.2"},
+       {"dlvr_freq_select", 1, "2140"},
+       {"dlvr_freq_mhz", 0, "2227.2"},
+       {"dlvr_freq_mhz", 1, "2140"},
+       {NULL, 0, NULL},
+};
+
 static int match_mapping_table(const struct mapping_table *table, const char *attr_name,
                               bool match_int_value, const u32 value, const char *value_str,
                               char **result_str, u32 *result_int)
@@ -167,7 +186,12 @@ static ssize_t suffix##_show(struct device *dev,\
                mmio_regs = adl_dvfs_mmio_regs;\
        } else if (table == 2) { \
                match_strs = (const char **)dlvr_strings;\
-               mmio_regs = dlvr_mmio_regs;\
+               if (pdev->device == PCI_DEVICE_ID_INTEL_LNLM_THERMAL) {\
+                       mmio_regs = lnl_dlvr_mmio_regs;\
+                       mapping = lnl_dlvr_mapping;\
+               } else {\
+                       mmio_regs = dlvr_mmio_regs;\
+               } \
        } else {\
                match_strs = (const char **)fivr_strings;\
                mmio_regs = tgl_fivr_mmio_regs;\
@@ -206,7 +230,12 @@ static ssize_t suffix##_store(struct device *dev,\
                mmio_regs = adl_dvfs_mmio_regs;\
        } else if (table == 2) { \
                match_strs = (const char **)dlvr_strings;\
-               mmio_regs = dlvr_mmio_regs;\
+               if (pdev->device == PCI_DEVICE_ID_INTEL_LNLM_THERMAL) {\
+                       mmio_regs = lnl_dlvr_mmio_regs;\
+                       mapping = lnl_dlvr_mapping;\
+               } else {\
+                       mmio_regs = dlvr_mmio_regs;\
+               } \
        } else {\
                match_strs = (const char **)fivr_strings;\
                mmio_regs = tgl_fivr_mmio_regs;\