Skip to content

Commit fff489f

Browse files
committed
Merge branch 'thermal-int340x'
Merge int340x thermal driver update fixing RFIM mailbox write commands handling for 5.17-rc1. * thermal-int340x: thermal/drivers/int340x: Fix RFIM mailbox write commands
2 parents 125521a + 2685c77 commit fff489f

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)