diff options
author | Borislav Petkov <borislav.petkov@amd.com> | 2010-10-21 12:52:53 -0400 |
---|---|---|
committer | Borislav Petkov <borislav.petkov@amd.com> | 2011-03-17 09:46:11 -0400 |
commit | 7f19bf755ced6fa16dbf118c0eff60586760496b (patch) | |
tree | 93b050e1a30efe33aaa1ffdf26473bd9ab55a585 /drivers/edac/amd64_edac.h | |
parent | b2b0c605436e343a9a24f00e7fc8fb89a8316e20 (diff) |
amd64_edac: Remove DRAM base/limit subfields caching
Add a struct representing the DRAM base/limit range pairs and remove all
cached subfields. Replace them with accessor functions, which actually
saves us some space:
text data bss dec hex filename
14712 1577 336 16625 40f1 drivers/edac/amd64_edac_mod.o.after
14831 1609 336 16776 4188 drivers/edac/amd64_edac_mod.o.before
Also, it simplifies the code a lot allowing to merge the K8 and F10h
routines.
No functional change.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Diffstat (limited to 'drivers/edac/amd64_edac.h')
-rw-r--r-- | drivers/edac/amd64_edac.h | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 91c266b9f6cf..93af3575e427 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
@@ -153,8 +153,8 @@ | |||
153 | #define K8_REV_F 4 | 153 | #define K8_REV_F 4 |
154 | 154 | ||
155 | /* Hardware limit on ChipSelect rows per MC and processors per system */ | 155 | /* Hardware limit on ChipSelect rows per MC and processors per system */ |
156 | #define MAX_CS_COUNT 8 | 156 | #define NUM_CHIPSELECTS 8 |
157 | #define DRAM_REG_COUNT 8 | 157 | #define DRAM_RANGES 8 |
158 | 158 | ||
159 | #define ON true | 159 | #define ON true |
160 | #define OFF false | 160 | #define OFF false |
@@ -167,8 +167,14 @@ | |||
167 | /* | 167 | /* |
168 | * Function 1 - Address Map | 168 | * Function 1 - Address Map |
169 | */ | 169 | */ |
170 | #define K8_DRAM_BASE_LOW 0x40 | 170 | #define DRAM_BASE_LO 0x40 |
171 | #define K8_DRAM_LIMIT_LOW 0x44 | 171 | #define DRAM_LIMIT_LO 0x44 |
172 | |||
173 | #define dram_intlv_en(pvt, i) ((pvt->ranges[i].base.lo >> 8) & 0x7) | ||
174 | #define dram_rw(pvt, i) (pvt->ranges[i].base.lo & 0x3) | ||
175 | #define dram_intlv_sel(pvt, i) ((pvt->ranges[i].lim.lo >> 8) & 0x7) | ||
176 | #define dram_dst_node(pvt, i) (pvt->ranges[i].lim.lo & 0x7) | ||
177 | |||
172 | #define K8_DHAR 0xf0 | 178 | #define K8_DHAR 0xf0 |
173 | 179 | ||
174 | #define DHAR_VALID BIT(0) | 180 | #define DHAR_VALID BIT(0) |
@@ -186,9 +192,8 @@ | |||
186 | 192 | ||
187 | #define DCT_CFG_SEL 0x10C | 193 | #define DCT_CFG_SEL 0x10C |
188 | 194 | ||
189 | /* F10 High BASE/LIMIT registers */ | 195 | #define DRAM_BASE_HI 0x140 |
190 | #define F10_DRAM_BASE_HIGH 0x140 | 196 | #define DRAM_LIMIT_HI 0x144 |
191 | #define F10_DRAM_LIMIT_HIGH 0x144 | ||
192 | 197 | ||
193 | 198 | ||
194 | /* | 199 | /* |
@@ -395,6 +400,19 @@ struct error_injection { | |||
395 | u32 bit_map; | 400 | u32 bit_map; |
396 | }; | 401 | }; |
397 | 402 | ||
403 | /* low and high part of PCI config space regs */ | ||
404 | struct reg_pair { | ||
405 | u32 lo, hi; | ||
406 | }; | ||
407 | |||
408 | /* | ||
409 | * See F1x[1, 0][7C:40] DRAM Base/Limit Registers | ||
410 | */ | ||
411 | struct dram_range { | ||
412 | struct reg_pair base; | ||
413 | struct reg_pair lim; | ||
414 | }; | ||
415 | |||
398 | struct amd64_pvt { | 416 | struct amd64_pvt { |
399 | struct low_ops *ops; | 417 | struct low_ops *ops; |
400 | 418 | ||
@@ -418,23 +436,15 @@ struct amd64_pvt { | |||
418 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ | 436 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ |
419 | 437 | ||
420 | /* DRAM CS Base Address Registers F2x[1,0][5C:40] */ | 438 | /* DRAM CS Base Address Registers F2x[1,0][5C:40] */ |
421 | u32 dcsb0[MAX_CS_COUNT]; | 439 | u32 dcsb0[NUM_CHIPSELECTS]; |
422 | u32 dcsb1[MAX_CS_COUNT]; | 440 | u32 dcsb1[NUM_CHIPSELECTS]; |
423 | 441 | ||
424 | /* DRAM CS Mask Registers F2x[1,0][6C:60] */ | 442 | /* DRAM CS Mask Registers F2x[1,0][6C:60] */ |
425 | u32 dcsm0[MAX_CS_COUNT]; | 443 | u32 dcsm0[NUM_CHIPSELECTS]; |
426 | u32 dcsm1[MAX_CS_COUNT]; | 444 | u32 dcsm1[NUM_CHIPSELECTS]; |
427 | 445 | ||
428 | /* | 446 | /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ |
429 | * Decoded parts of DRAM BASE and LIMIT Registers | 447 | struct dram_range ranges[DRAM_RANGES]; |
430 | * F1x[78,70,68,60,58,50,48,40] | ||
431 | */ | ||
432 | u64 dram_base[DRAM_REG_COUNT]; | ||
433 | u64 dram_limit[DRAM_REG_COUNT]; | ||
434 | u8 dram_IntlvSel[DRAM_REG_COUNT]; | ||
435 | u8 dram_IntlvEn[DRAM_REG_COUNT]; | ||
436 | u8 dram_DstNode[DRAM_REG_COUNT]; | ||
437 | u8 dram_rw_en[DRAM_REG_COUNT]; | ||
438 | 448 | ||
439 | /* | 449 | /* |
440 | * The following fields are set at (load) run time, after CPU revision | 450 | * The following fields are set at (load) run time, after CPU revision |
@@ -472,6 +482,26 @@ struct amd64_pvt { | |||
472 | 482 | ||
473 | }; | 483 | }; |
474 | 484 | ||
485 | static inline u64 get_dram_base(struct amd64_pvt *pvt, unsigned i) | ||
486 | { | ||
487 | u64 addr = ((u64)pvt->ranges[i].base.lo & 0xffff0000) << 8; | ||
488 | |||
489 | if (boot_cpu_data.x86 == 0xf) | ||
490 | return addr; | ||
491 | |||
492 | return (((u64)pvt->ranges[i].base.hi & 0x000000ff) << 40) | addr; | ||
493 | } | ||
494 | |||
495 | static inline u64 get_dram_limit(struct amd64_pvt *pvt, unsigned i) | ||
496 | { | ||
497 | u64 lim = (((u64)pvt->ranges[i].lim.lo & 0xffff0000) << 8) | 0x00ffffff; | ||
498 | |||
499 | if (boot_cpu_data.x86 == 0xf) | ||
500 | return lim; | ||
501 | |||
502 | return (((u64)pvt->ranges[i].lim.hi & 0x000000ff) << 40) | lim; | ||
503 | } | ||
504 | |||
475 | /* | 505 | /* |
476 | * per-node ECC settings descriptor | 506 | * per-node ECC settings descriptor |
477 | */ | 507 | */ |
@@ -517,7 +547,6 @@ struct low_ops { | |||
517 | 547 | ||
518 | u64 (*get_error_address) (struct mem_ctl_info *mci, | 548 | u64 (*get_error_address) (struct mem_ctl_info *mci, |
519 | struct err_regs *info); | 549 | struct err_regs *info); |
520 | void (*read_dram_base_limit) (struct amd64_pvt *pvt, int dram); | ||
521 | void (*read_dram_ctl_register) (struct amd64_pvt *pvt); | 550 | void (*read_dram_ctl_register) (struct amd64_pvt *pvt); |
522 | void (*map_sysaddr_to_csrow) (struct mem_ctl_info *mci, | 551 | void (*map_sysaddr_to_csrow) (struct mem_ctl_info *mci, |
523 | struct err_regs *info, u64 SystemAddr); | 552 | struct err_regs *info, u64 SystemAddr); |