1
2
3
4
5
6
7
8struct powernow_k8_data {
9 unsigned int cpu;
10
11 u32 numps;
12 u32 batps;
13 u32 max_hw_pstate;
14
15
16
17
18 u32 rvo;
19 u32 irt;
20 u32 vidmvs;
21 u32 vstable;
22 u32 plllock;
23 u32 exttype;
24
25
26 u32 currvid, currfid, currpstate;
27
28
29
30
31 struct cpufreq_frequency_table *powernow_table;
32
33#ifdef CONFIG_X86_POWERNOW_K8_ACPI
34
35
36 struct acpi_processor_performance acpi_data;
37#endif
38
39
40
41 cpumask_t *available_cores;
42};
43
44
45
46#define CPUID_PROCESSOR_SIGNATURE 1
47#define CPUID_XFAM 0x0ff00000
48#define CPUID_XFAM_K8 0
49#define CPUID_XMOD 0x000f0000
50#define CPUID_XMOD_REV_MASK 0x00080000
51#define CPUID_XFAM_10H 0x00100000
52#define CPUID_USE_XFAM_XMOD 0x00000f00
53#define CPUID_GET_MAX_CAPABILITIES 0x80000000
54#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
55#define P_STATE_TRANSITION_CAPABLE 6
56
57
58
59
60
61
62#define MSR_FIDVID_CTL 0xc0010041
63#define MSR_FIDVID_STATUS 0xc0010042
64
65
66#define MSR_C_LO_INIT_FID_VID 0x00010000
67#define MSR_C_LO_NEW_VID 0x00003f00
68#define MSR_C_LO_NEW_FID 0x0000003f
69#define MSR_C_LO_VID_SHIFT 8
70
71
72#define MSR_C_HI_STP_GNT_TO 0x000fffff
73
74
75#define MSR_S_LO_CHANGE_PENDING 0x80000000
76#define MSR_S_LO_MAX_RAMP_VID 0x3f000000
77#define MSR_S_LO_MAX_FID 0x003f0000
78#define MSR_S_LO_START_FID 0x00003f00
79#define MSR_S_LO_CURRENT_FID 0x0000003f
80
81
82#define MSR_S_HI_MIN_WORKING_VID 0x3f000000
83#define MSR_S_HI_MAX_WORKING_VID 0x003f0000
84#define MSR_S_HI_START_VID 0x00003f00
85#define MSR_S_HI_CURRENT_VID 0x0000003f
86#define MSR_C_HI_STP_GNT_BENIGN 0x00000001
87
88
89
90#define USE_HW_PSTATE 0x00000080
91#define HW_PSTATE_MASK 0x00000007
92#define HW_PSTATE_VALID_MASK 0x80000000
93#define HW_PSTATE_MAX_MASK 0x000000f0
94#define HW_PSTATE_MAX_SHIFT 4
95#define MSR_PSTATE_DEF_BASE 0xc0010064
96#define MSR_PSTATE_STATUS 0xc0010063
97#define MSR_PSTATE_CTRL 0xc0010062
98#define MSR_PSTATE_CUR_LIMIT 0xc0010061
99
100
101#define CPU_OPTERON 0
102#define CPU_HW_PSTATE 1
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119#define LO_FID_TABLE_TOP 7
120#define HI_FID_TABLE_BOTTOM 8
121
122#define LO_VCOFREQ_TABLE_TOP 1400
123#define HI_VCOFREQ_TABLE_BOTTOM 1600
124
125#define MIN_FREQ_RESOLUTION 200
126
127#define MAX_FID 0x2a
128#define LEAST_VID 0x3e
129
130#define MIN_FREQ 800
131#define MAX_FREQ 5000
132
133#define INVALID_FID_MASK 0xffffffc0
134#define INVALID_VID_MASK 0xffffffc0
135
136#define VID_OFF 0x3f
137
138#define STOP_GRANT_5NS 1
139
140#define PLL_LOCK_CONVERSION (1000/5)
141
142#define MAXIMUM_VID_STEPS 1
143#define VST_UNITS_20US 20
144
145
146
147
148
149
150#define IRT_SHIFT 30
151#define RVO_SHIFT 28
152#define EXT_TYPE_SHIFT 27
153#define PLL_L_SHIFT 20
154#define MVS_SHIFT 18
155#define VST_SHIFT 11
156#define VID_SHIFT 6
157#define IRT_MASK 3
158#define RVO_MASK 3
159#define EXT_TYPE_MASK 1
160#define PLL_L_MASK 0x7f
161#define MVS_MASK 3
162#define VST_MASK 0x7f
163#define VID_MASK 0x1f
164#define FID_MASK 0x1f
165#define EXT_VID_MASK 0x3f
166#define EXT_FID_MASK 0x3f
167
168
169
170
171
172
173
174
175
176
177#define PSB_ID_STRING "AMDK7PNOW!"
178#define PSB_ID_STRING_LEN 10
179
180#define PSB_VERSION_1_4 0x14
181
182struct psb_s {
183 u8 signature[10];
184 u8 tableversion;
185 u8 flags1;
186 u16 vstable;
187 u8 flags2;
188 u8 num_tables;
189 u32 cpuid;
190 u8 plllocktime;
191 u8 maxfid;
192 u8 maxvid;
193 u8 numps;
194};
195
196
197struct pst_s {
198 u8 fid;
199 u8 vid;
200};
201
202#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "powernow-k8", msg)
203
204static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid);
205static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvid);
206static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
207
208static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
209
210#ifdef CONFIG_X86_POWERNOW_K8_ACPI
211static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
212static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
213#endif
214
215#ifdef CONFIG_SMP
216static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
217{
218}
219#else
220static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
221{
222 cpu_set(0, cpu_sharedcore_mask[0]);
223}
224#endif
225