diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/edac/Kconfig | 6 | ||||
-rw-r--r-- | drivers/edac/mpc85xx_edac.c | 28 |
2 files changed, 22 insertions, 12 deletions
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index a3ca18e2d7cf..b82ad57c1082 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
@@ -176,11 +176,11 @@ config EDAC_I5100 | |||
176 | San Clemente MCH. | 176 | San Clemente MCH. |
177 | 177 | ||
178 | config EDAC_MPC85XX | 178 | config EDAC_MPC85XX |
179 | tristate "Freescale MPC85xx" | 179 | tristate "Freescale MPC83xx / MPC85xx" |
180 | depends on EDAC_MM_EDAC && FSL_SOC && MPC85xx | 180 | depends on EDAC_MM_EDAC && FSL_SOC && (PPC_83xx || MPC85xx) |
181 | help | 181 | help |
182 | Support for error detection and correction on the Freescale | 182 | Support for error detection and correction on the Freescale |
183 | MPC8560, MPC8540, MPC8548 | 183 | MPC8349, MPC8560, MPC8540, MPC8548 |
184 | 184 | ||
185 | config EDAC_MV64X60 | 185 | config EDAC_MV64X60 |
186 | tristate "Marvell MV64x60" | 186 | tristate "Marvell MV64x60" |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 1dd405e0e550..157f6504f25e 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
@@ -41,7 +41,9 @@ static u32 orig_pci_err_en; | |||
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | static u32 orig_l2_err_disable; | 43 | static u32 orig_l2_err_disable; |
44 | #ifdef CONFIG_MPC85xx | ||
44 | static u32 orig_hid1[2]; | 45 | static u32 orig_hid1[2]; |
46 | #endif | ||
45 | 47 | ||
46 | /************************ MC SYSFS parts ***********************************/ | 48 | /************************ MC SYSFS parts ***********************************/ |
47 | 49 | ||
@@ -789,19 +791,20 @@ static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci) | |||
789 | csrow = &mci->csrows[index]; | 791 | csrow = &mci->csrows[index]; |
790 | cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 + | 792 | cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 + |
791 | (index * MPC85XX_MC_CS_BNDS_OFS)); | 793 | (index * MPC85XX_MC_CS_BNDS_OFS)); |
792 | start = (cs_bnds & 0xfff0000) << 4; | 794 | |
793 | end = ((cs_bnds & 0xfff) << 20); | 795 | start = (cs_bnds & 0xffff0000) >> 16; |
794 | if (start) | 796 | end = (cs_bnds & 0x0000ffff); |
795 | start |= 0xfffff; | ||
796 | if (end) | ||
797 | end |= 0xfffff; | ||
798 | 797 | ||
799 | if (start == end) | 798 | if (start == end) |
800 | continue; /* not populated */ | 799 | continue; /* not populated */ |
801 | 800 | ||
801 | start <<= (24 - PAGE_SHIFT); | ||
802 | end <<= (24 - PAGE_SHIFT); | ||
803 | end |= (1 << (24 - PAGE_SHIFT)) - 1; | ||
804 | |||
802 | csrow->first_page = start >> PAGE_SHIFT; | 805 | csrow->first_page = start >> PAGE_SHIFT; |
803 | csrow->last_page = end >> PAGE_SHIFT; | 806 | csrow->last_page = end >> PAGE_SHIFT; |
804 | csrow->nr_pages = csrow->last_page + 1 - csrow->first_page; | 807 | csrow->nr_pages = end + 1 - start; |
805 | csrow->grain = 8; | 808 | csrow->grain = 8; |
806 | csrow->mtype = mtype; | 809 | csrow->mtype = mtype; |
807 | csrow->dtype = DEV_UNKNOWN; | 810 | csrow->dtype = DEV_UNKNOWN; |
@@ -985,6 +988,7 @@ static struct of_device_id mpc85xx_mc_err_of_match[] = { | |||
985 | { .compatible = "fsl,mpc8560-memory-controller", }, | 988 | { .compatible = "fsl,mpc8560-memory-controller", }, |
986 | { .compatible = "fsl,mpc8568-memory-controller", }, | 989 | { .compatible = "fsl,mpc8568-memory-controller", }, |
987 | { .compatible = "fsl,mpc8572-memory-controller", }, | 990 | { .compatible = "fsl,mpc8572-memory-controller", }, |
991 | { .compatible = "fsl,mpc8349-memory-controller", }, | ||
988 | { .compatible = "fsl,p2020-memory-controller", }, | 992 | { .compatible = "fsl,p2020-memory-controller", }, |
989 | {}, | 993 | {}, |
990 | }; | 994 | }; |
@@ -1001,13 +1005,13 @@ static struct of_platform_driver mpc85xx_mc_err_driver = { | |||
1001 | }, | 1005 | }, |
1002 | }; | 1006 | }; |
1003 | 1007 | ||
1004 | 1008 | #ifdef CONFIG_MPC85xx | |
1005 | static void __init mpc85xx_mc_clear_rfxe(void *data) | 1009 | static void __init mpc85xx_mc_clear_rfxe(void *data) |
1006 | { | 1010 | { |
1007 | orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1); | 1011 | orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1); |
1008 | mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~0x20000)); | 1012 | mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~0x20000)); |
1009 | } | 1013 | } |
1010 | 1014 | #endif | |
1011 | 1015 | ||
1012 | static int __init mpc85xx_mc_init(void) | 1016 | static int __init mpc85xx_mc_init(void) |
1013 | { | 1017 | { |
@@ -1040,26 +1044,32 @@ static int __init mpc85xx_mc_init(void) | |||
1040 | printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n"); | 1044 | printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n"); |
1041 | #endif | 1045 | #endif |
1042 | 1046 | ||
1047 | #ifdef CONFIG_MPC85xx | ||
1043 | /* | 1048 | /* |
1044 | * need to clear HID1[RFXE] to disable machine check int | 1049 | * need to clear HID1[RFXE] to disable machine check int |
1045 | * so we can catch it | 1050 | * so we can catch it |
1046 | */ | 1051 | */ |
1047 | if (edac_op_state == EDAC_OPSTATE_INT) | 1052 | if (edac_op_state == EDAC_OPSTATE_INT) |
1048 | on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0); | 1053 | on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0); |
1054 | #endif | ||
1049 | 1055 | ||
1050 | return 0; | 1056 | return 0; |
1051 | } | 1057 | } |
1052 | 1058 | ||
1053 | module_init(mpc85xx_mc_init); | 1059 | module_init(mpc85xx_mc_init); |
1054 | 1060 | ||
1061 | #ifdef CONFIG_MPC85xx | ||
1055 | static void __exit mpc85xx_mc_restore_hid1(void *data) | 1062 | static void __exit mpc85xx_mc_restore_hid1(void *data) |
1056 | { | 1063 | { |
1057 | mtspr(SPRN_HID1, orig_hid1[smp_processor_id()]); | 1064 | mtspr(SPRN_HID1, orig_hid1[smp_processor_id()]); |
1058 | } | 1065 | } |
1066 | #endif | ||
1059 | 1067 | ||
1060 | static void __exit mpc85xx_mc_exit(void) | 1068 | static void __exit mpc85xx_mc_exit(void) |
1061 | { | 1069 | { |
1070 | #ifdef CONFIG_MPC85xx | ||
1062 | on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0); | 1071 | on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0); |
1072 | #endif | ||
1063 | #ifdef CONFIG_PCI | 1073 | #ifdef CONFIG_PCI |
1064 | of_unregister_platform_driver(&mpc85xx_pci_err_driver); | 1074 | of_unregister_platform_driver(&mpc85xx_pci_err_driver); |
1065 | #endif | 1075 | #endif |