aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-06-22 21:48:29 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-10 10:44:46 -0400
commitf122a89222510e8f57e8e0b9b5cdd3ec8863fe4c (patch)
treeae68dd91ff982cabfeb83e11243ada9cb82829f8
parent8f331907578623f90a134261a559fa3249142caa (diff)
i7core_edac: Show read/write virtual/physical channel association
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/edac/i7core_edac.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 79aa84eaa12d..09a0998e1c3f 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -68,6 +68,10 @@
68 #define QUAD_RANK_PRESENT (1 << 22) 68 #define QUAD_RANK_PRESENT (1 << 22)
69 #define REGISTERED_DIMM (1 << 15) 69 #define REGISTERED_DIMM (1 << 15)
70 70
71#define MC_CHANNEL_MAPPER 0x60
72 #define RDLCH(r, ch) ((((r) >> (3 + (ch * 6))) & 0x07) - 1)
73 #define WRLCH(r, ch) ((((r) >> (ch * 6)) & 0x07) - 1)
74
71#define MC_CHANNEL_RANK_PRESENT 0x7c 75#define MC_CHANNEL_RANK_PRESENT 0x7c
72 #define RANK_PRESENT_MASK 0xffff 76 #define RANK_PRESENT_MASK 0xffff
73 77
@@ -100,6 +104,8 @@
100 #define NUMCOL_MASK 3 104 #define NUMCOL_MASK 3
101 #define NUMCOL(x) ((x) & NUMCOL_MASK) 105 #define NUMCOL(x) ((x) & NUMCOL_MASK)
102 106
107#define MC_RANK_PRESENT 0x7c
108
103#define MC_SAG_CH_0 0x80 109#define MC_SAG_CH_0 0x80
104#define MC_SAG_CH_1 0x84 110#define MC_SAG_CH_1 0x84
105#define MC_SAG_CH_2 0x88 111#define MC_SAG_CH_2 0x88
@@ -135,6 +141,7 @@ struct i7core_info {
135 u32 mc_control; 141 u32 mc_control;
136 u32 mc_status; 142 u32 mc_status;
137 u32 max_dod; 143 u32 max_dod;
144 u32 ch_map;
138}; 145};
139 146
140 147
@@ -289,9 +296,19 @@ static int get_dimm_config(struct mem_ctl_info *mci)
289 if (!pvt->pci_mcr[0]) 296 if (!pvt->pci_mcr[0])
290 return -ENODEV; 297 return -ENODEV;
291 298
292 pci_read_config_dword(pvt->pci_mcr[0], MC_CONTROL, &pvt->info.mc_control); 299 /* Device 3 function 0 reads */
293 pci_read_config_dword(pvt->pci_mcr[0], MC_STATUS, &pvt->info.mc_status); 300 pci_read_config_dword(pvt->pci_mcr[0], MC_CONTROL,
294 pci_read_config_dword(pvt->pci_mcr[0], MC_MAX_DOD, &pvt->info.max_dod); 301 &pvt->info.mc_control);
302 pci_read_config_dword(pvt->pci_mcr[0], MC_STATUS,
303 &pvt->info.mc_status);
304 pci_read_config_dword(pvt->pci_mcr[0], MC_MAX_DOD,
305 &pvt->info.max_dod);
306 pci_read_config_dword(pvt->pci_mcr[0], MC_CHANNEL_MAPPER,
307 &pvt->info.ch_map);
308
309 debugf0("MC control=0x%08x status=0x%08x dod=0x%08x map=0x%08x\n",
310 pvt->info.mc_control, pvt->info.mc_status,
311 pvt->info.max_dod, pvt->info.ch_map);
295 312
296 if (ECC_ENABLED(pvt)) 313 if (ECC_ENABLED(pvt))
297 debugf0("ECC enabled with x%d SDCC\n", ECCx8(pvt)?8:4); 314 debugf0("ECC enabled with x%d SDCC\n", ECCx8(pvt)?8:4);
@@ -318,6 +335,7 @@ static int get_dimm_config(struct mem_ctl_info *mci)
318 continue; 335 continue;
319 } 336 }
320 337
338 /* Devices 4-6 function 0 */
321 pci_read_config_dword(pvt->pci_ch[i][0], 339 pci_read_config_dword(pvt->pci_ch[i][0],
322 MC_CHANNEL_DIMM_INIT_PARAMS, &data); 340 MC_CHANNEL_DIMM_INIT_PARAMS, &data);
323 341
@@ -330,10 +348,13 @@ static int get_dimm_config(struct mem_ctl_info *mci)
330 else 348 else
331 pvt->channel[i].dimms = 2; 349 pvt->channel[i].dimms = 2;
332 350
333 debugf0("Channel %d (0x%08x): %d ranks, %d dimms " 351 debugf0("Ch%d (0x%08x): rd ch %d, wr ch %d, "
334 "(%sregistered)\n", i, data, 352 "%d ranks, %d %cDIMMs\n",
353 i, data,
354 RDLCH(pvt->info.ch_map, i),
355 WRLCH(pvt->info.ch_map, i),
335 pvt->channel[i].ranks, pvt->channel[i].dimms, 356 pvt->channel[i].ranks, pvt->channel[i].dimms,
336 (data & REGISTERED_DIMM)? "" : "un" ); 357 (data & REGISTERED_DIMM)? 'R' : 'U' );
337 } 358 }
338 359
339 return 0; 360 return 0;