diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-22 21:48:29 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-10 10:44:46 -0400 |
commit | f122a89222510e8f57e8e0b9b5cdd3ec8863fe4c (patch) | |
tree | ae68dd91ff982cabfeb83e11243ada9cb82829f8 | |
parent | 8f331907578623f90a134261a559fa3249142caa (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.c | 33 |
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; |