Skip to content

Commit 2685c77

Browse files
sumeetpawnikarrafaeljw
authored andcommitted
thermal/drivers/int340x: Fix RFIM mailbox write commands
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: 5d6fbc9 ("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>
1 parent 9c33eef commit 2685c77

File tree

3 files changed

+73
-53
lines changed

3 files changed

+73
-53
lines changed

drivers/thermal/intel/int340x_thermal/processor_thermal_device.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ void proc_thermal_rfim_remove(struct pci_dev *pdev);
8080
int proc_thermal_mbox_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv);
8181
void proc_thermal_mbox_remove(struct pci_dev *pdev);
8282

83-
int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp);
83+
int processor_thermal_send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp);
84+
int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data);
8485
int proc_thermal_add(struct device *dev, struct proc_thermal_device *priv);
8586
void proc_thermal_remove(struct proc_thermal_device *proc_priv);
8687
int proc_thermal_suspend(struct device *dev);

drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c

Lines changed: 59 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,15 @@
2424

2525
static DEFINE_MUTEX(mbox_lock);
2626

27-
static int send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp)
27+
static int wait_for_mbox_ready(struct proc_thermal_device *proc_priv)
2828
{
29-
struct proc_thermal_device *proc_priv;
3029
u32 retries, data;
3130
int ret;
3231

33-
mutex_lock(&mbox_lock);
34-
proc_priv = pci_get_drvdata(pdev);
35-
3632
/* Poll for rb bit == 0 */
3733
retries = MBOX_RETRY_COUNT;
3834
do {
39-
data = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE));
35+
data = readl(proc_priv->mmio_base + MBOX_OFFSET_INTERFACE);
4036
if (data & BIT_ULL(MBOX_BUSY_BIT)) {
4137
ret = -EBUSY;
4238
continue;
@@ -45,53 +41,78 @@ static int send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cm
4541
break;
4642
} while (--retries);
4743

44+
return ret;
45+
}
46+
47+
static int send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data)
48+
{
49+
struct proc_thermal_device *proc_priv;
50+
u32 reg_data;
51+
int ret;
52+
53+
proc_priv = pci_get_drvdata(pdev);
54+
55+
mutex_lock(&mbox_lock);
56+
57+
ret = wait_for_mbox_ready(proc_priv);
4858
if (ret)
4959
goto unlock_mbox;
5060

51-
if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_WRITE)
52-
writel(cmd_data, (void __iomem *) ((proc_priv->mmio_base + MBOX_OFFSET_DATA)));
53-
61+
writel(data, (proc_priv->mmio_base + MBOX_OFFSET_DATA));
5462
/* Write command register */
55-
data = BIT_ULL(MBOX_BUSY_BIT) | cmd_id;
56-
writel(data, (void __iomem *) ((proc_priv->mmio_base + MBOX_OFFSET_INTERFACE)));
63+
reg_data = BIT_ULL(MBOX_BUSY_BIT) | id;
64+
writel(reg_data, (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE));
5765

58-
/* Poll for rb bit == 0 */
59-
retries = MBOX_RETRY_COUNT;
60-
do {
61-
data = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE));
62-
if (data & BIT_ULL(MBOX_BUSY_BIT)) {
63-
ret = -EBUSY;
64-
continue;
65-
}
66+
ret = wait_for_mbox_ready(proc_priv);
6667

67-
if (data) {
68-
ret = -ENXIO;
69-
goto unlock_mbox;
70-
}
68+
unlock_mbox:
69+
mutex_unlock(&mbox_lock);
70+
return ret;
71+
}
7172

72-
ret = 0;
73+
static int send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp)
74+
{
75+
struct proc_thermal_device *proc_priv;
76+
u32 reg_data;
77+
int ret;
7378

74-
if (!cmd_resp)
75-
break;
79+
proc_priv = pci_get_drvdata(pdev);
7680

77-
if (cmd_id == MBOX_CMD_WORKLOAD_TYPE_READ)
78-
*cmd_resp = readl((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA));
79-
else
80-
*cmd_resp = readq((void __iomem *) (proc_priv->mmio_base + MBOX_OFFSET_DATA));
81+
mutex_lock(&mbox_lock);
8182

82-
break;
83-
} while (--retries);
83+
ret = wait_for_mbox_ready(proc_priv);
84+
if (ret)
85+
goto unlock_mbox;
86+
87+
/* Write command register */
88+
reg_data = BIT_ULL(MBOX_BUSY_BIT) | id;
89+
writel(reg_data, (proc_priv->mmio_base + MBOX_OFFSET_INTERFACE));
90+
91+
ret = wait_for_mbox_ready(proc_priv);
92+
if (ret)
93+
goto unlock_mbox;
94+
95+
if (id == MBOX_CMD_WORKLOAD_TYPE_READ)
96+
*resp = readl(proc_priv->mmio_base + MBOX_OFFSET_DATA);
97+
else
98+
*resp = readq(proc_priv->mmio_base + MBOX_OFFSET_DATA);
8499

85100
unlock_mbox:
86101
mutex_unlock(&mbox_lock);
87102
return ret;
88103
}
89104

90-
int processor_thermal_send_mbox_cmd(struct pci_dev *pdev, u16 cmd_id, u32 cmd_data, u64 *cmd_resp)
105+
int processor_thermal_send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp)
91106
{
92-
return send_mbox_cmd(pdev, cmd_id, cmd_data, cmd_resp);
107+
return send_mbox_read_cmd(pdev, id, resp);
93108
}
94-
EXPORT_SYMBOL_GPL(processor_thermal_send_mbox_cmd);
109+
EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_read_cmd, INT340X_THERMAL);
110+
111+
int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data)
112+
{
113+
return send_mbox_write_cmd(pdev, id, data);
114+
}
115+
EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_write_cmd, INT340X_THERMAL);
95116

96117
/* List of workload types */
97118
static const char * const workload_types[] = {
@@ -104,7 +125,6 @@ static const char * const workload_types[] = {
104125
NULL
105126
};
106127

107-
108128
static ssize_t workload_available_types_show(struct device *dev,
109129
struct device_attribute *attr,
110130
char *buf)
@@ -146,7 +166,7 @@ static ssize_t workload_type_store(struct device *dev,
146166

147167
data |= ret;
148168

149-
ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_WRITE, data, NULL);
169+
ret = send_mbox_write_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_WRITE, data);
150170
if (ret)
151171
return false;
152172

@@ -161,7 +181,7 @@ static ssize_t workload_type_show(struct device *dev,
161181
u64 cmd_resp;
162182
int ret;
163183

164-
ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, 0, &cmd_resp);
184+
ret = send_mbox_read_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, &cmd_resp);
165185
if (ret)
166186
return false;
167187

@@ -186,8 +206,6 @@ static const struct attribute_group workload_req_attribute_group = {
186206
.name = "workload_request"
187207
};
188208

189-
190-
191209
static bool workload_req_created;
192210

193211
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 *pdev, struct proc_thermal_device *proc
196214
int ret;
197215

198216
/* Check if there is a mailbox support, if fails return success */
199-
ret = send_mbox_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, 0, &cmd_resp);
217+
ret = send_mbox_read_cmd(pdev, MBOX_CMD_WORKLOAD_TYPE_READ, &cmd_resp);
200218
if (ret)
201219
return 0;
202220

drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <linux/pci.h>
1010
#include "processor_thermal_device.h"
1111

12+
MODULE_IMPORT_NS(INT340X_THERMAL);
13+
1214
struct mmio_reg {
1315
int read_only;
1416
u32 offset;
@@ -194,16 +196,15 @@ static ssize_t rfi_restriction_store(struct device *dev,
194196
struct device_attribute *attr,
195197
const char *buf, size_t count)
196198
{
197-
u16 cmd_id = 0x0008;
198-
u64 cmd_resp;
199+
u16 id = 0x0008;
199200
u32 input;
200201
int ret;
201202

202203
ret = kstrtou32(buf, 10, &input);
203204
if (ret)
204205
return ret;
205206

206-
ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, input, &cmd_resp);
207+
ret = processor_thermal_send_mbox_write_cmd(to_pci_dev(dev), id, input);
207208
if (ret)
208209
return ret;
209210

@@ -214,30 +215,30 @@ static ssize_t rfi_restriction_show(struct device *dev,
214215
struct device_attribute *attr,
215216
char *buf)
216217
{
217-
u16 cmd_id = 0x0007;
218-
u64 cmd_resp;
218+
u16 id = 0x0007;
219+
u64 resp;
219220
int ret;
220221

221-
ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp);
222+
ret = processor_thermal_send_mbox_read_cmd(to_pci_dev(dev), id, &resp);
222223
if (ret)
223224
return ret;
224225

225-
return sprintf(buf, "%llu\n", cmd_resp);
226+
return sprintf(buf, "%llu\n", resp);
226227
}
227228

228229
static ssize_t ddr_data_rate_show(struct device *dev,
229230
struct device_attribute *attr,
230231
char *buf)
231232
{
232-
u16 cmd_id = 0x0107;
233-
u64 cmd_resp;
233+
u16 id = 0x0107;
234+
u64 resp;
234235
int ret;
235236

236-
ret = processor_thermal_send_mbox_cmd(to_pci_dev(dev), cmd_id, 0, &cmd_resp);
237+
ret = processor_thermal_send_mbox_read_cmd(to_pci_dev(dev), id, &resp);
237238
if (ret)
238239
return ret;
239240

240-
return sprintf(buf, "%llu\n", cmd_resp);
241+
return sprintf(buf, "%llu\n", resp);
241242
}
242243

243244
static DEVICE_ATTR_RW(rfi_restriction);

0 commit comments

Comments
 (0)