Skip to content

Commit cdc36b6

Browse files
raagjadavrodrigovivi
authored andcommitted
drm/xe: Expose fan control and voltage regulator version
Add sysfs attributes for late binding features which expose bound version to the user. v2: Rework attribute and macro naming (Badal) v3: Drop fancy formatting (Rodrigo) v4: Form version string using local variables (Rodrigo) Signed-off-by: Raag Jadav <[email protected]> Reviewed-by: Rodrigo Vivi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 017ef12 commit cdc36b6

File tree

2 files changed

+157
-1
lines changed

2 files changed

+157
-1
lines changed

drivers/gpu/drm/xe/xe_device_sysfs.c

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
*
2525
* vram_d3cold_threshold - Report/change vram used threshold(in MB) below
2626
* which vram save/restore is permissible during runtime D3cold entry/exit.
27+
*
28+
* lb_fan_control_version - Fan control version provisioned by late binding.
29+
* Exposed only if supported by the device.
30+
*
31+
* lb_voltage_regulator_version - Voltage regulator version provisioned by late
32+
* binding. Exposed only if supported by the device.
2733
*/
2834

2935
static ssize_t
@@ -65,6 +71,135 @@ vram_d3cold_threshold_store(struct device *dev, struct device_attribute *attr,
6571

6672
static DEVICE_ATTR_RW(vram_d3cold_threshold);
6773

74+
static ssize_t
75+
lb_fan_control_version_show(struct device *dev, struct device_attribute *attr, char *buf)
76+
{
77+
struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
78+
struct xe_tile *root = xe_device_get_root_tile(xe);
79+
u32 cap, ver_low = FAN_TABLE, ver_high = FAN_TABLE;
80+
u16 major = 0, minor = 0, hotfix = 0, build = 0;
81+
int ret;
82+
83+
xe_pm_runtime_get(xe);
84+
85+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
86+
&cap, NULL);
87+
if (ret)
88+
goto out;
89+
90+
if (REG_FIELD_GET(V1_FAN_PROVISIONED, cap)) {
91+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_LOW, 0),
92+
&ver_low, NULL);
93+
if (ret)
94+
goto out;
95+
96+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_HIGH, 0),
97+
&ver_high, NULL);
98+
if (ret)
99+
goto out;
100+
101+
major = REG_FIELD_GET(MAJOR_VERSION_MASK, ver_low);
102+
minor = REG_FIELD_GET(MINOR_VERSION_MASK, ver_low);
103+
hotfix = REG_FIELD_GET(HOTFIX_VERSION_MASK, ver_high);
104+
build = REG_FIELD_GET(BUILD_VERSION_MASK, ver_high);
105+
}
106+
out:
107+
xe_pm_runtime_put(xe);
108+
109+
return ret ?: sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
110+
}
111+
static DEVICE_ATTR_ADMIN_RO(lb_fan_control_version);
112+
113+
static ssize_t
114+
lb_voltage_regulator_version_show(struct device *dev, struct device_attribute *attr, char *buf)
115+
{
116+
struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
117+
struct xe_tile *root = xe_device_get_root_tile(xe);
118+
u32 cap, ver_low = VR_CONFIG, ver_high = VR_CONFIG;
119+
u16 major = 0, minor = 0, hotfix = 0, build = 0;
120+
int ret;
121+
122+
xe_pm_runtime_get(xe);
123+
124+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
125+
&cap, NULL);
126+
if (ret)
127+
goto out;
128+
129+
if (REG_FIELD_GET(VR_PARAMS_PROVISIONED, cap)) {
130+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_LOW, 0),
131+
&ver_low, NULL);
132+
if (ret)
133+
goto out;
134+
135+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_VERSION_HIGH, 0),
136+
&ver_high, NULL);
137+
if (ret)
138+
goto out;
139+
140+
major = REG_FIELD_GET(MAJOR_VERSION_MASK, ver_low);
141+
minor = REG_FIELD_GET(MINOR_VERSION_MASK, ver_low);
142+
hotfix = REG_FIELD_GET(HOTFIX_VERSION_MASK, ver_high);
143+
build = REG_FIELD_GET(BUILD_VERSION_MASK, ver_high);
144+
}
145+
out:
146+
xe_pm_runtime_put(xe);
147+
148+
return ret ?: sysfs_emit(buf, "%u.%u.%u.%u\n", major, minor, hotfix, build);
149+
}
150+
static DEVICE_ATTR_ADMIN_RO(lb_voltage_regulator_version);
151+
152+
static int late_bind_create_files(struct device *dev)
153+
{
154+
struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
155+
struct xe_tile *root = xe_device_get_root_tile(xe);
156+
u32 cap;
157+
int ret;
158+
159+
xe_pm_runtime_get(xe);
160+
161+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
162+
&cap, NULL);
163+
if (ret)
164+
goto out;
165+
166+
if (REG_FIELD_GET(V1_FAN_SUPPORTED, cap)) {
167+
ret = sysfs_create_file(&dev->kobj, &dev_attr_lb_fan_control_version.attr);
168+
if (ret)
169+
goto out;
170+
}
171+
172+
if (REG_FIELD_GET(VR_PARAMS_SUPPORTED, cap))
173+
ret = sysfs_create_file(&dev->kobj, &dev_attr_lb_voltage_regulator_version.attr);
174+
out:
175+
xe_pm_runtime_put(xe);
176+
177+
return ret;
178+
}
179+
180+
static void late_bind_remove_files(struct device *dev)
181+
{
182+
struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
183+
struct xe_tile *root = xe_device_get_root_tile(xe);
184+
u32 cap;
185+
int ret;
186+
187+
xe_pm_runtime_get(xe);
188+
189+
ret = xe_pcode_read(root, PCODE_MBOX(PCODE_LATE_BINDING, GET_CAPABILITY_STATUS, 0),
190+
&cap, NULL);
191+
if (ret)
192+
goto out;
193+
194+
if (REG_FIELD_GET(V1_FAN_SUPPORTED, cap))
195+
sysfs_remove_file(&dev->kobj, &dev_attr_lb_fan_control_version.attr);
196+
197+
if (REG_FIELD_GET(VR_PARAMS_SUPPORTED, cap))
198+
sysfs_remove_file(&dev->kobj, &dev_attr_lb_voltage_regulator_version.attr);
199+
out:
200+
xe_pm_runtime_put(xe);
201+
}
202+
68203
/**
69204
* DOC: PCIe Gen5 Limitations
70205
*
@@ -151,8 +286,10 @@ static void xe_device_sysfs_fini(void *arg)
151286
if (xe->d3cold.capable)
152287
sysfs_remove_file(&xe->drm.dev->kobj, &dev_attr_vram_d3cold_threshold.attr);
153288

154-
if (xe->info.platform == XE_BATTLEMAGE)
289+
if (xe->info.platform == XE_BATTLEMAGE) {
155290
sysfs_remove_files(&xe->drm.dev->kobj, auto_link_downgrade_attrs);
291+
late_bind_remove_files(xe->drm.dev);
292+
}
156293
}
157294

158295
int xe_device_sysfs_init(struct xe_device *xe)
@@ -170,6 +307,10 @@ int xe_device_sysfs_init(struct xe_device *xe)
170307
ret = sysfs_create_files(&dev->kobj, auto_link_downgrade_attrs);
171308
if (ret)
172309
return ret;
310+
311+
ret = late_bind_create_files(dev);
312+
if (ret)
313+
return ret;
173314
}
174315

175316
return devm_add_action_or_reset(dev, xe_device_sysfs_fini, xe);

drivers/gpu/drm/xe/xe_pcode_api.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@
5050
#define READ_PL_FROM_FW 0x1
5151
#define READ_PL_FROM_PCODE 0x0
5252

53+
#define PCODE_LATE_BINDING 0x5C
54+
#define GET_CAPABILITY_STATUS 0x0
55+
#define V1_FAN_SUPPORTED REG_BIT(0)
56+
#define VR_PARAMS_SUPPORTED REG_BIT(3)
57+
#define V1_FAN_PROVISIONED REG_BIT(16)
58+
#define VR_PARAMS_PROVISIONED REG_BIT(19)
59+
#define GET_VERSION_LOW 0x1
60+
#define GET_VERSION_HIGH 0x2
61+
#define MAJOR_VERSION_MASK REG_GENMASK(31, 16)
62+
#define MINOR_VERSION_MASK REG_GENMASK(15, 0)
63+
#define HOTFIX_VERSION_MASK REG_GENMASK(31, 16)
64+
#define BUILD_VERSION_MASK REG_GENMASK(15, 0)
65+
#define FAN_TABLE 1
66+
#define VR_CONFIG 2
67+
5368
#define PCODE_FREQUENCY_CONFIG 0x6e
5469
/* Frequency Config Sub Commands (param1) */
5570
#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0

0 commit comments

Comments
 (0)