23
23
#include <linux/init.h>
24
24
#include <linux/module.h>
25
25
#include <linux/pci.h>
26
+ #include <asm/amd_nb.h>
26
27
#include <asm/processor.h>
27
28
28
29
MODULE_DESCRIPTION ("AMD Family 10h+ CPU core temperature monitor" );
@@ -40,8 +41,8 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
40
41
#define PCI_DEVICE_ID_AMD_17H_DF_F3 0x1463
41
42
#endif
42
43
43
- #ifndef PCI_DEVICE_ID_AMD_17H_RR_NB
44
- #define PCI_DEVICE_ID_AMD_17H_RR_NB 0x15d0
44
+ #ifndef PCI_DEVICE_ID_AMD_17H_M10H_DF_F3
45
+ #define PCI_DEVICE_ID_AMD_17H_M10H_DF_F3 0x15eb
45
46
#endif
46
47
47
48
/* CPUID function 0x80000001, ebx */
@@ -63,17 +64,20 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
63
64
#define NB_CAP_HTC 0x00000400
64
65
65
66
/*
66
- * For F15h M60h, functionality of REG_REPORTED_TEMPERATURE
67
- * has been moved to D0F0xBC_xD820_0CA4 [Reported Temperature
68
- * Control]
67
+ * For F15h M60h and M70h, REG_HARDWARE_THERMAL_CONTROL
68
+ * and REG_REPORTED_TEMPERATURE have been moved to
69
+ * D0F0xBC_xD820_0C64 [Hardware Temperature Control]
70
+ * D0F0xBC_xD820_0CA4 [Reported Temperature Control]
69
71
*/
72
+ #define F15H_M60H_HARDWARE_TEMP_CTRL_OFFSET 0xd8200c64
70
73
#define F15H_M60H_REPORTED_TEMP_CTRL_OFFSET 0xd8200ca4
71
74
72
75
/* F17h M01h Access througn SMN */
73
76
#define F17H_M01H_REPORTED_TEMP_CTRL_OFFSET 0x00059800
74
77
75
78
struct k10temp_data {
76
79
struct pci_dev * pdev ;
80
+ void (* read_htcreg )(struct pci_dev * pdev , u32 * regval );
77
81
void (* read_tempreg )(struct pci_dev * pdev , u32 * regval );
78
82
int temp_offset ;
79
83
u32 temp_adjust_mask ;
@@ -98,6 +102,11 @@ static const struct tctl_offset tctl_offset_table[] = {
98
102
{ 0x17 , "AMD Ryzen Threadripper 1910" , 10000 },
99
103
};
100
104
105
+ static void read_htcreg_pci (struct pci_dev * pdev , u32 * regval )
106
+ {
107
+ pci_read_config_dword (pdev , REG_HARDWARE_THERMAL_CONTROL , regval );
108
+ }
109
+
101
110
static void read_tempreg_pci (struct pci_dev * pdev , u32 * regval )
102
111
{
103
112
pci_read_config_dword (pdev , REG_REPORTED_TEMPERATURE , regval );
@@ -114,6 +123,12 @@ static void amd_nb_index_read(struct pci_dev *pdev, unsigned int devfn,
114
123
mutex_unlock (& nb_smu_ind_mutex );
115
124
}
116
125
126
+ static void read_htcreg_nb_f15 (struct pci_dev * pdev , u32 * regval )
127
+ {
128
+ amd_nb_index_read (pdev , PCI_DEVFN (0 , 0 ), 0xb8 ,
129
+ F15H_M60H_HARDWARE_TEMP_CTRL_OFFSET , regval );
130
+ }
131
+
117
132
static void read_tempreg_nb_f15 (struct pci_dev * pdev , u32 * regval )
118
133
{
119
134
amd_nb_index_read (pdev , PCI_DEVFN (0 , 0 ), 0xb8 ,
@@ -122,8 +137,8 @@ static void read_tempreg_nb_f15(struct pci_dev *pdev, u32 *regval)
122
137
123
138
static void read_tempreg_nb_f17 (struct pci_dev * pdev , u32 * regval )
124
139
{
125
- amd_nb_index_read ( pdev , PCI_DEVFN ( 0 , 0 ), 0x60 ,
126
- F17H_M01H_REPORTED_TEMP_CTRL_OFFSET , regval );
140
+ amd_smn_read ( amd_pci_dev_to_node_id ( pdev ) ,
141
+ F17H_M01H_REPORTED_TEMP_CTRL_OFFSET , regval );
127
142
}
128
143
129
144
static ssize_t temp1_input_show (struct device * dev ,
@@ -160,8 +175,7 @@ static ssize_t show_temp_crit(struct device *dev,
160
175
u32 regval ;
161
176
int value ;
162
177
163
- pci_read_config_dword (data -> pdev ,
164
- REG_HARDWARE_THERMAL_CONTROL , & regval );
178
+ data -> read_htcreg (data -> pdev , & regval );
165
179
value = ((regval >> 16 ) & 0x7f ) * 500 + 52000 ;
166
180
if (show_hyst )
167
181
value -= ((regval >> 24 ) & 0xf ) * 500 ;
@@ -181,13 +195,18 @@ static umode_t k10temp_is_visible(struct kobject *kobj,
181
195
struct pci_dev * pdev = data -> pdev ;
182
196
183
197
if (index >= 2 ) {
184
- u32 reg_caps , reg_htc ;
198
+ u32 reg ;
199
+
200
+ if (!data -> read_htcreg )
201
+ return 0 ;
185
202
186
203
pci_read_config_dword (pdev , REG_NORTHBRIDGE_CAPABILITIES ,
187
- & reg_caps );
188
- pci_read_config_dword (pdev , REG_HARDWARE_THERMAL_CONTROL ,
189
- & reg_htc );
190
- if (!(reg_caps & NB_CAP_HTC ) || !(reg_htc & HTC_ENABLE ))
204
+ & reg );
205
+ if (!(reg & NB_CAP_HTC ))
206
+ return 0 ;
207
+
208
+ data -> read_htcreg (data -> pdev , & reg );
209
+ if (!(reg & HTC_ENABLE ))
191
210
return 0 ;
192
211
}
193
212
return attr -> mode ;
@@ -268,11 +287,13 @@ static int k10temp_probe(struct pci_dev *pdev,
268
287
269
288
if (boot_cpu_data .x86 == 0x15 && (boot_cpu_data .x86_model == 0x60 ||
270
289
boot_cpu_data .x86_model == 0x70 )) {
290
+ data -> read_htcreg = read_htcreg_nb_f15 ;
271
291
data -> read_tempreg = read_tempreg_nb_f15 ;
272
292
} else if (boot_cpu_data .x86 == 0x17 ) {
273
293
data -> temp_adjust_mask = 0x80000 ;
274
294
data -> read_tempreg = read_tempreg_nb_f17 ;
275
295
} else {
296
+ data -> read_htcreg = read_htcreg_pci ;
276
297
data -> read_tempreg = read_tempreg_pci ;
277
298
}
278
299
@@ -302,7 +323,7 @@ static const struct pci_device_id k10temp_id_table[] = {
302
323
{ PCI_VDEVICE (AMD , PCI_DEVICE_ID_AMD_16H_NB_F3 ) },
303
324
{ PCI_VDEVICE (AMD , PCI_DEVICE_ID_AMD_16H_M30H_NB_F3 ) },
304
325
{ PCI_VDEVICE (AMD , PCI_DEVICE_ID_AMD_17H_DF_F3 ) },
305
- { PCI_VDEVICE (AMD , PCI_DEVICE_ID_AMD_17H_RR_NB ) },
326
+ { PCI_VDEVICE (AMD , PCI_DEVICE_ID_AMD_17H_M10H_DF_F3 ) },
306
327
{}
307
328
};
308
329
MODULE_DEVICE_TABLE (pci , k10temp_id_table );
0 commit comments