-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathvega10_extratemps-4.16.1.patch
167 lines (155 loc) · 6.45 KB
/
vega10_extratemps-4.16.1.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
--- linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h 2018-04-24 06:38:01.260639202 +0200
@@ -268,6 +268,9 @@
#define amdgpu_dpm_get_temperature(adev) \
((adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle))
+#define amdgpu_dpm_get_temperature_asic(adev) \
+ (amdgpu_pp_dpm_get_temperature_asic((adev)->powerplay.pp_handle))
+
#define amdgpu_dpm_set_fan_control_mode(adev, m) \
((adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)))
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu.h linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu.h
--- linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu.h 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu.h 2018-04-24 06:38:25.068347412 +0200
@@ -1969,6 +1969,8 @@
struct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock);
+extern int amdgpu_pp_dpm_get_temperature_asic(void *handle);
+
/* amdgpu_acpi.c */
#if defined(CONFIG_ACPI)
int amdgpu_acpi_init(struct amdgpu_device *adev);
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
--- linux-4.16.1-orig/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c 2018-04-24 06:39:52.947270283 +0200
@@ -794,6 +794,27 @@
return snprintf(buf, PAGE_SIZE, "%d\n", temp);
}
+static ssize_t amdgpu_hwmon_show_temp_asic(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct amdgpu_device *adev = dev_get_drvdata(dev);
+ struct drm_device *ddev = adev->ddev;
+ int temp;
+
+ /* Can't get temperature when the card is off */
+ if ((adev->flags & AMD_IS_PX) &&
+ (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
+ return -EINVAL;
+
+ if (adev->family != AMDGPU_FAMILY_AI)
+ return -EINVAL;
+
+ temp = amdgpu_dpm_get_temperature_asic(adev);
+
+ return snprintf(buf, PAGE_SIZE, "%d\n", temp);
+}
+
static ssize_t amdgpu_hwmon_show_temp_thresh(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -922,6 +943,7 @@
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, 0);
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 0);
static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 1);
+static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, amdgpu_hwmon_show_temp_asic, NULL, 0);
static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_pwm1, amdgpu_hwmon_set_pwm1, 0);
static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_pwm1_enable, amdgpu_hwmon_set_pwm1_enable, 0);
static SENSOR_DEVICE_ATTR(pwm1_min, S_IRUGO, amdgpu_hwmon_get_pwm1_min, NULL, 0);
@@ -932,6 +954,7 @@
&sensor_dev_attr_temp1_input.dev_attr.attr,
&sensor_dev_attr_temp1_crit.dev_attr.attr,
&sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
+ &sensor_dev_attr_temp2_input.dev_attr.attr,
&sensor_dev_attr_pwm1.dev_attr.attr,
&sensor_dev_attr_pwm1_enable.dev_attr.attr,
&sensor_dev_attr_pwm1_min.dev_attr.attr,
@@ -946,6 +969,10 @@
struct device *dev = kobj_to_dev(kobj);
struct amdgpu_device *adev = dev_get_drvdata(dev);
umode_t effective_mode = attr->mode;
+
+ if (adev->family != AMDGPU_FAMILY_AI &&
+ (attr == &sensor_dev_attr_temp2_input.dev_attr.attr))
+ return 0;
/* no skipping for powerplay */
if (adev->powerplay.cgs_device)
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/amd_powerplay.c linux-4.16.1/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
--- linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/amd_powerplay.c 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/powerplay/amd_powerplay.c 2018-04-24 06:41:01.298430622 +0200
@@ -29,6 +29,7 @@
#include "amd_powerplay.h"
#include "pp_instance.h"
#include "power_state.h"
+#include "hwmgr/vega10_thermal.h"
#define PP_DPM_DISABLED 0xCCCC
@@ -709,6 +710,25 @@
mutex_unlock(&pp_handle->pp_lock);
return ret;
}
+
+int amdgpu_pp_dpm_get_temperature_asic(void *handle)
+{
+ struct pp_hwmgr *hwmgr;
+ struct pp_instance *pp_handle = (struct pp_instance *)handle;
+ int ret = 0;
+
+ ret = pp_check(pp_handle);
+
+ if (ret)
+ return ret;
+
+ hwmgr = pp_handle->hwmgr;
+
+ mutex_lock(&pp_handle->pp_lock);
+ ret = vega10_thermal_get_temperature_asic(hwmgr);
+ mutex_unlock(&pp_handle->pp_lock);
+ return ret;
+}
static int pp_dpm_get_pp_num_states(void *handle,
struct pp_states_info *data)
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c linux-4.16.1/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
--- linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c 2018-04-24 06:41:56.909747463 +0200
@@ -376,6 +376,32 @@
}
/**
+* Reads the remote temperature from ASIC
+*
+* @param hwmgr The address of the hardware manager.
+*/
+int vega10_thermal_get_temperature_asic(struct pp_hwmgr *hwmgr)
+{
+ int temp;
+ uint32_t reg;
+
+ reg = soc15_get_register_offset(THM_HWID, 0,
+ mmCG_MULT_THERMAL_STATUS_BASE_IDX, mmCG_MULT_THERMAL_STATUS);
+
+ temp = cgs_read_register(hwmgr->device, reg);
+
+ temp = (temp & CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP_MASK) >>
+ CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP__SHIFT;
+
+ temp = temp & 0x1ff;
+
+ temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+ return temp;
+}
+
+
+/**
* Set the requested temperature range for high and low alert signals
*
* @param hwmgr The address of the hardware manager.
diff -rau linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h linux-4.16.1/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h
--- linux-4.16.1-orig/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h 2018-04-08 14:29:52.000000000 +0200
+++ linux-4.16.1/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h 2018-04-24 06:42:22.613431456 +0200
@@ -51,6 +51,7 @@
extern int vega10_thermal_get_temperature(struct pp_hwmgr *hwmgr);
+extern int vega10_thermal_get_temperature_asic(struct pp_hwmgr *hwmgr);
extern int vega10_thermal_stop_thermal_controller(struct pp_hwmgr *hwmgr);
extern int vega10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr,
struct phm_fan_speed_info *fan_speed_info);