| .. | .. |
|---|
| 96 | 96 | /* Hardware limit on ChipSelect rows per MC and processors per system */ |
|---|
| 97 | 97 | #define NUM_CHIPSELECTS 8 |
|---|
| 98 | 98 | #define DRAM_RANGES 8 |
|---|
| 99 | +#define NUM_CONTROLLERS 8 |
|---|
| 99 | 100 | |
|---|
| 100 | 101 | #define ON true |
|---|
| 101 | 102 | #define OFF false |
|---|
| .. | .. |
|---|
| 119 | 120 | #define PCI_DEVICE_ID_AMD_17H_M10H_DF_F6 0x15ee |
|---|
| 120 | 121 | #define PCI_DEVICE_ID_AMD_17H_M30H_DF_F0 0x1490 |
|---|
| 121 | 122 | #define PCI_DEVICE_ID_AMD_17H_M30H_DF_F6 0x1496 |
|---|
| 123 | +#define PCI_DEVICE_ID_AMD_17H_M60H_DF_F0 0x1448 |
|---|
| 124 | +#define PCI_DEVICE_ID_AMD_17H_M60H_DF_F6 0x144e |
|---|
| 125 | +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F0 0x1440 |
|---|
| 126 | +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F6 0x1446 |
|---|
| 127 | +#define PCI_DEVICE_ID_AMD_19H_DF_F0 0x1650 |
|---|
| 128 | +#define PCI_DEVICE_ID_AMD_19H_DF_F6 0x1656 |
|---|
| 122 | 129 | |
|---|
| 123 | 130 | /* |
|---|
| 124 | 131 | * Function 1 - Address Map |
|---|
| .. | .. |
|---|
| 168 | 175 | #define DCSM0 0x60 |
|---|
| 169 | 176 | #define DCSM1 0x160 |
|---|
| 170 | 177 | |
|---|
| 171 | | -#define csrow_enabled(i, dct, pvt) ((pvt)->csels[(dct)].csbases[(i)] & DCSB_CS_ENABLE) |
|---|
| 178 | +#define csrow_enabled(i, dct, pvt) ((pvt)->csels[(dct)].csbases[(i)] & DCSB_CS_ENABLE) |
|---|
| 179 | +#define csrow_sec_enabled(i, dct, pvt) ((pvt)->csels[(dct)].csbases_sec[(i)] & DCSB_CS_ENABLE) |
|---|
| 172 | 180 | |
|---|
| 173 | 181 | #define DRAM_CONTROL 0x78 |
|---|
| 174 | 182 | |
|---|
| .. | .. |
|---|
| 258 | 266 | |
|---|
| 259 | 267 | /* UMC CH register offsets */ |
|---|
| 260 | 268 | #define UMCCH_BASE_ADDR 0x0 |
|---|
| 269 | +#define UMCCH_BASE_ADDR_SEC 0x10 |
|---|
| 261 | 270 | #define UMCCH_ADDR_MASK 0x20 |
|---|
| 271 | +#define UMCCH_ADDR_MASK_SEC 0x28 |
|---|
| 262 | 272 | #define UMCCH_ADDR_CFG 0x30 |
|---|
| 263 | 273 | #define UMCCH_DIMM_CFG 0x80 |
|---|
| 264 | 274 | #define UMCCH_UMC_CFG 0x100 |
|---|
| .. | .. |
|---|
| 274 | 284 | |
|---|
| 275 | 285 | #define UMC_SDP_INIT BIT(31) |
|---|
| 276 | 286 | |
|---|
| 277 | | -#define NUM_UMCS 2 |
|---|
| 278 | | - |
|---|
| 279 | 287 | enum amd_families { |
|---|
| 280 | 288 | K8_CPUS = 0, |
|---|
| 281 | 289 | F10_CPUS, |
|---|
| .. | .. |
|---|
| 287 | 295 | F17_CPUS, |
|---|
| 288 | 296 | F17_M10H_CPUS, |
|---|
| 289 | 297 | F17_M30H_CPUS, |
|---|
| 298 | + F17_M60H_CPUS, |
|---|
| 299 | + F17_M70H_CPUS, |
|---|
| 300 | + F19_CPUS, |
|---|
| 290 | 301 | NUM_FAMILIES, |
|---|
| 291 | 302 | }; |
|---|
| 292 | 303 | |
|---|
| .. | .. |
|---|
| 313 | 324 | /* A DCT chip selects collection */ |
|---|
| 314 | 325 | struct chip_select { |
|---|
| 315 | 326 | u32 csbases[NUM_CHIPSELECTS]; |
|---|
| 327 | + u32 csbases_sec[NUM_CHIPSELECTS]; |
|---|
| 316 | 328 | u8 b_cnt; |
|---|
| 317 | 329 | |
|---|
| 318 | 330 | u32 csmasks[NUM_CHIPSELECTS]; |
|---|
| 331 | + u32 csmasks_sec[NUM_CHIPSELECTS]; |
|---|
| 319 | 332 | u8 m_cnt; |
|---|
| 320 | 333 | }; |
|---|
| 321 | 334 | |
|---|
| .. | .. |
|---|
| 353 | 366 | u32 dbam0; /* DRAM Base Address Mapping reg for DCT0 */ |
|---|
| 354 | 367 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ |
|---|
| 355 | 368 | |
|---|
| 356 | | - /* one for each DCT */ |
|---|
| 357 | | - struct chip_select csels[2]; |
|---|
| 369 | + /* one for each DCT/UMC */ |
|---|
| 370 | + struct chip_select csels[NUM_CONTROLLERS]; |
|---|
| 358 | 371 | |
|---|
| 359 | 372 | /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ |
|---|
| 360 | 373 | struct dram_range ranges[DRAM_RANGES]; |
|---|
| .. | .. |
|---|
| 366 | 379 | u32 dct_sel_hi; /* DRAM Controller Select High */ |
|---|
| 367 | 380 | u32 online_spare; /* On-Line spare Reg */ |
|---|
| 368 | 381 | |
|---|
| 369 | | - /* x4 or x8 syndromes in use */ |
|---|
| 382 | + /* x4, x8, or x16 syndromes in use */ |
|---|
| 370 | 383 | u8 ecc_sym_sz; |
|---|
| 371 | 384 | |
|---|
| 372 | 385 | /* place to store error injection parameters prior to issue */ |
|---|
| .. | .. |
|---|
| 399 | 412 | |
|---|
| 400 | 413 | static inline u32 get_umc_base(u8 channel) |
|---|
| 401 | 414 | { |
|---|
| 402 | | - /* ch0: 0x50000, ch1: 0x150000 */ |
|---|
| 403 | | - return 0x50000 + (!!channel << 20); |
|---|
| 415 | + /* chY: 0xY50000 */ |
|---|
| 416 | + return 0x50000 + (channel << 20); |
|---|
| 404 | 417 | } |
|---|
| 405 | 418 | |
|---|
| 406 | 419 | static inline u64 get_dram_base(struct amd64_pvt *pvt, u8 i) |
|---|
| .. | .. |
|---|
| 472 | 485 | struct amd64_family_type { |
|---|
| 473 | 486 | const char *ctl_name; |
|---|
| 474 | 487 | u16 f0_id, f1_id, f2_id, f6_id; |
|---|
| 488 | + /* Maximum number of memory controllers per die/node. */ |
|---|
| 489 | + u8 max_mcs; |
|---|
| 475 | 490 | struct low_ops ops; |
|---|
| 476 | 491 | }; |
|---|
| 477 | 492 | |
|---|