aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/amd64_edac.h
diff options
context:
space:
mode:
authorBorislav Petkov <borislav.petkov@amd.com>2010-10-21 12:52:53 -0400
committerBorislav Petkov <borislav.petkov@amd.com>2011-03-17 09:46:11 -0400
commit7f19bf755ced6fa16dbf118c0eff60586760496b (patch)
tree93b050e1a30efe33aaa1ffdf26473bd9ab55a585 /drivers/edac/amd64_edac.h
parentb2b0c605436e343a9a24f00e7fc8fb89a8316e20 (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.h73
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 */
404struct reg_pair {
405 u32 lo, hi;
406};
407
408/*
409 * See F1x[1, 0][7C:40] DRAM Base/Limit Registers
410 */
411struct dram_range {
412 struct reg_pair base;
413 struct reg_pair lim;
414};
415
398struct amd64_pvt { 416struct 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
485static 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
495static 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);