aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorAristeu Rozanski <arozansk@redhat.com>2013-10-30 12:26:57 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-11-14 13:25:27 -0500
commitfb79a50926b8abadf24ec15e0e61778fa2b7d10b (patch)
tree993f5449c4e754634967e78b6f4c4a1db8882ed7 /drivers/edac
parentef1e8d03b13126261c6e7dcf058fb5d80d34b33c (diff)
sb_edac: isolate TOLM retrieval
This is in preparation for the Ivy Bridge support. Signed-off-by: Aristeu Rozanski <arozansk@redhat.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/sb_edac.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index 3f8c890d79c6..bc434ad5465d 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -273,9 +273,11 @@ static const u32 correrrthrsld[] = {
273#define NUM_CHANNELS 4 273#define NUM_CHANNELS 4
274#define MAX_DIMMS 3 /* Max DIMMS per channel */ 274#define MAX_DIMMS 3 /* Max DIMMS per channel */
275 275
276struct sbridge_pvt;
276struct sbridge_info { 277struct sbridge_info {
277 u32 mcmtr; 278 u32 mcmtr;
278 u32 rankcfgr; 279 u32 rankcfgr;
280 u64 (*get_tolm)(struct sbridge_pvt *pvt);
279}; 281};
280 282
281struct sbridge_channel { 283struct sbridge_channel {
@@ -459,6 +461,15 @@ static void free_sbridge_dev(struct sbridge_dev *sbridge_dev)
459 kfree(sbridge_dev); 461 kfree(sbridge_dev);
460} 462}
461 463
464static u64 sbridge_get_tolm(struct sbridge_pvt *pvt)
465{
466 u32 reg;
467
468 /* Address range is 32:28 */
469 pci_read_config_dword(pvt->pci_sad1, TOLM, &reg);
470 return GET_TOLM(reg);
471}
472
462/**************************************************************************** 473/****************************************************************************
463 Memory check routines 474 Memory check routines
464 ****************************************************************************/ 475 ****************************************************************************/
@@ -633,10 +644,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
633 * Step 1) Get TOLM/TOHM ranges 644 * Step 1) Get TOLM/TOHM ranges
634 */ 645 */
635 646
636 /* Address range is 32:28 */ 647 pvt->tolm = pvt->info.get_tolm(pvt);
637 pci_read_config_dword(pvt->pci_sad1, TOLM,
638 &reg);
639 pvt->tolm = GET_TOLM(reg);
640 tmp_mb = (1 + pvt->tolm) >> 20; 648 tmp_mb = (1 + pvt->tolm) >> 20;
641 649
642 mb = div_u64_rem(tmp_mb, 1000, &kb); 650 mb = div_u64_rem(tmp_mb, 1000, &kb);
@@ -1661,6 +1669,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev)
1661 mci->ctl_name = kasprintf(GFP_KERNEL, "Sandy Bridge Socket#%d", mci->mc_idx); 1669 mci->ctl_name = kasprintf(GFP_KERNEL, "Sandy Bridge Socket#%d", mci->mc_idx);
1662 mci->dev_name = pci_name(sbridge_dev->pdev[0]); 1670 mci->dev_name = pci_name(sbridge_dev->pdev[0]);
1663 mci->ctl_page_to_phys = NULL; 1671 mci->ctl_page_to_phys = NULL;
1672 pvt->info.get_tolm = sbridge_get_tolm;
1664 1673
1665 /* Set the function pointer to an actual operation function */ 1674 /* Set the function pointer to an actual operation function */
1666 mci->edac_check = sbridge_check_error; 1675 mci->edac_check = sbridge_check_error;