diff options
Diffstat (limited to 'drivers/edac/amd64_edac.h')
-rw-r--r-- | drivers/edac/amd64_edac.h | 81 |
1 files changed, 25 insertions, 56 deletions
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index a2bc9a650fff..1964f89a28bc 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
@@ -160,6 +160,14 @@ | |||
160 | #define OFF false | 160 | #define OFF false |
161 | 161 | ||
162 | /* | 162 | /* |
163 | * Create a contiguous bitmask starting at bit position @lo and ending at | ||
164 | * position @hi. For example | ||
165 | * | ||
166 | * GENMASK(21, 39) gives us the 64bit vector 0x000000ffffe00000. | ||
167 | */ | ||
168 | #define GENMASK(lo, hi) (((1ULL << ((hi) - (lo) + 1)) - 1) << (lo)) | ||
169 | |||
170 | /* | ||
163 | * PCI-defined configuration space registers | 171 | * PCI-defined configuration space registers |
164 | */ | 172 | */ |
165 | 173 | ||
@@ -198,45 +206,14 @@ | |||
198 | /* | 206 | /* |
199 | * Function 2 - DRAM controller | 207 | * Function 2 - DRAM controller |
200 | */ | 208 | */ |
201 | #define K8_DCSB0 0x40 | 209 | #define DCSB0 0x40 |
202 | #define F10_DCSB1 0x140 | 210 | #define DCSB1 0x140 |
203 | 211 | #define DCSB_CS_ENABLE BIT(0) | |
204 | #define K8_DCSB_CS_ENABLE BIT(0) | ||
205 | #define K8_DCSB_NPT_SPARE BIT(1) | ||
206 | #define K8_DCSB_NPT_TESTFAIL BIT(2) | ||
207 | |||
208 | /* | ||
209 | * REV E: select [31:21] and [15:9] from DCSB and the shift amount to form | ||
210 | * the address | ||
211 | */ | ||
212 | #define REV_E_DCSB_BASE_BITS (0xFFE0FE00ULL) | ||
213 | #define REV_E_DCS_SHIFT 4 | ||
214 | |||
215 | #define REV_F_F1Xh_DCSB_BASE_BITS (0x1FF83FE0ULL) | ||
216 | #define REV_F_F1Xh_DCS_SHIFT 8 | ||
217 | |||
218 | /* | ||
219 | * REV F and later: selects [28:19] and [13:5] from DCSB and the shift amount | ||
220 | * to form the address | ||
221 | */ | ||
222 | #define REV_F_DCSB_BASE_BITS (0x1FF83FE0ULL) | ||
223 | #define REV_F_DCS_SHIFT 8 | ||
224 | |||
225 | /* DRAM CS Mask Registers */ | ||
226 | #define K8_DCSM0 0x60 | ||
227 | #define F10_DCSM1 0x160 | ||
228 | |||
229 | /* REV E: select [29:21] and [15:9] from DCSM */ | ||
230 | #define REV_E_DCSM_MASK_BITS 0x3FE0FE00 | ||
231 | |||
232 | /* unused bits [24:20] and [12:0] */ | ||
233 | #define REV_E_DCS_NOTUSED_BITS 0x01F01FFF | ||
234 | 212 | ||
235 | /* REV F and later: select [28:19] and [13:5] from DCSM */ | 213 | #define DCSM0 0x60 |
236 | #define REV_F_F1Xh_DCSM_MASK_BITS 0x1FF83FE0 | 214 | #define DCSM1 0x160 |
237 | 215 | ||
238 | /* unused bits [26:22] and [12:0] */ | 216 | #define csrow_enabled(i, dct, pvt) ((pvt)->csels[(dct)].csbases[(i)] & DCSB_CS_ENABLE) |
239 | #define REV_F_F1Xh_DCS_NOTUSED_BITS 0x07C01FFF | ||
240 | 217 | ||
241 | #define DBAM0 0x80 | 218 | #define DBAM0 0x80 |
242 | #define DBAM1 0x180 | 219 | #define DBAM1 0x180 |
@@ -412,6 +389,15 @@ struct dram_range { | |||
412 | struct reg_pair lim; | 389 | struct reg_pair lim; |
413 | }; | 390 | }; |
414 | 391 | ||
392 | /* A DCT chip selects collection */ | ||
393 | struct chip_select { | ||
394 | u32 csbases[NUM_CHIPSELECTS]; | ||
395 | u8 b_cnt; | ||
396 | |||
397 | u32 csmasks[NUM_CHIPSELECTS]; | ||
398 | u8 m_cnt; | ||
399 | }; | ||
400 | |||
415 | struct amd64_pvt { | 401 | struct amd64_pvt { |
416 | struct low_ops *ops; | 402 | struct low_ops *ops; |
417 | 403 | ||
@@ -434,29 +420,12 @@ struct amd64_pvt { | |||
434 | u32 dbam0; /* DRAM Base Address Mapping reg for DCT0 */ | 420 | u32 dbam0; /* DRAM Base Address Mapping reg for DCT0 */ |
435 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ | 421 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ |
436 | 422 | ||
437 | /* DRAM CS Base Address Registers F2x[1,0][5C:40] */ | 423 | /* one for each DCT */ |
438 | u32 dcsb0[NUM_CHIPSELECTS]; | 424 | struct chip_select csels[2]; |
439 | u32 dcsb1[NUM_CHIPSELECTS]; | ||
440 | |||
441 | /* DRAM CS Mask Registers F2x[1,0][6C:60] */ | ||
442 | u32 dcsm0[NUM_CHIPSELECTS]; | ||
443 | u32 dcsm1[NUM_CHIPSELECTS]; | ||
444 | 425 | ||
445 | /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ | 426 | /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ |
446 | struct dram_range ranges[DRAM_RANGES]; | 427 | struct dram_range ranges[DRAM_RANGES]; |
447 | 428 | ||
448 | /* | ||
449 | * The following fields are set at (load) run time, after CPU revision | ||
450 | * has been determined, since the dct_base and dct_mask registers vary | ||
451 | * based on revision | ||
452 | */ | ||
453 | u32 dcsb_base; /* DCSB base bits */ | ||
454 | u32 dcsm_mask; /* DCSM mask bits */ | ||
455 | u32 cs_count; /* num chip selects (== num DCSB registers) */ | ||
456 | u32 num_dcsm; /* Number of DCSM registers */ | ||
457 | u32 dcs_mask_notused; /* DCSM notused mask bits */ | ||
458 | u32 dcs_shift; /* DCSB and DCSM shift value */ | ||
459 | |||
460 | u64 top_mem; /* top of memory below 4GB */ | 429 | u64 top_mem; /* top of memory below 4GB */ |
461 | u64 top_mem2; /* top of memory above 4GB */ | 430 | u64 top_mem2; /* top of memory above 4GB */ |
462 | 431 | ||