aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2015-06-01 18:09:35 -0400
committerBorislav Petkov <bp@suse.de>2015-06-02 13:07:50 -0400
commit451bb7fbccdc0f5d942227913afa5dea3afd12f7 (patch)
tree0e47457317b2c99328f1eb94c2f1b87c4c9fbadd /drivers/edac
parent2ce39109a5062b06df440fbf2993ce9ab3bf6e08 (diff)
EDAC, xgene: Fix cpuid abuse
The new x-gene EDAC driver incorrectly tried to figure out the version of one of its IP blocks by looking at the version of the CPU core, which is only vagely related. This removes the incorrect code and instead uses the version of the IP block in the compatible string where it belongs. Found using build testing on x86, which does not provide the arm64 cpuid interface. Signed-off-by: Arnd Bergmann <arnd@arndb.de> [ Changed subnode to "apm,xgene-edac-pmd-v2", adjusted check. ] Signed-off-by: Loc Ho <lho@apm.com> Cc: devicetree@vger.kernel.org Cc: dougthompson@xmission.com Cc: ijc+devicetree@hellion.org.uk Cc: jcm@redhat.com Cc: linux-arm-kernel@lists.infradead.org Cc: linux-edac <linux-edac@vger.kernel.org> Cc: mark.rutland@arm.com Cc: mchehab@osg.samsung.com Cc: patches@apm.com Cc: robh+dt@kernel.org Link: http://lkml.kernel.org/r/3195065.IK73o60xya@wuerfel Signed-off-by: Borislav Petkov <bp@suse.de>
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/xgene_edac.c55
1 files changed, 8 insertions, 47 deletions
diff --git a/drivers/edac/xgene_edac.c b/drivers/edac/xgene_edac.c
index b5158572f6ab..14636e4b6a08 100644
--- a/drivers/edac/xgene_edac.c
+++ b/drivers/edac/xgene_edac.c
@@ -523,6 +523,7 @@ struct xgene_edac_pmd_ctx {
523 struct edac_device_ctl_info *edac_dev; 523 struct edac_device_ctl_info *edac_dev;
524 void __iomem *pmd_csr; 524 void __iomem *pmd_csr;
525 u32 pmd; 525 u32 pmd;
526 int version;
526}; 527};
527 528
528static void xgene_edac_pmd_l1_check(struct edac_device_ctl_info *edac_dev, 529static void xgene_edac_pmd_l1_check(struct edac_device_ctl_info *edac_dev,
@@ -784,50 +785,6 @@ static void xgene_edac_pmd_cpu_hw_cfg(struct edac_device_ctl_info *edac_dev,
784 writel(0x00000101, pg_f + MEMERR_CPU_MMUECR_PAGE_OFFSET); 785 writel(0x00000101, pg_f + MEMERR_CPU_MMUECR_PAGE_OFFSET);
785} 786}
786 787
787static bool xgene_edac_pmd_l2c_version1(void)
788{
789 /* Check all chips with PMD L2C version 1 HW */
790 #define REVIDR_MINOR_REV(revidr) ((revidr) & 0x00000007)
791
792 switch (MIDR_VARIANT(read_cpuid_id())) {
793 case 0:
794 switch (MIDR_REVISION(read_cpuid_id())) {
795 case 0:
796
797 switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
798 case 1:
799 case 2:
800 return true;
801 };
802 break;
803 case 1:
804 if (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1)) == 1)
805 return true;
806 break;
807 }
808 break;
809 case 1:
810 switch (MIDR_REVISION(read_cpuid_id())) {
811 case 0:
812 switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
813 case 1:
814 return true;
815 };
816 break;
817 case 1:
818 switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
819 case 1:
820 case 0:
821 return true;
822 };
823 break;
824 }
825 break;
826 }
827
828 return false;
829}
830
831static void xgene_edac_pmd_hw_cfg(struct edac_device_ctl_info *edac_dev) 788static void xgene_edac_pmd_hw_cfg(struct edac_device_ctl_info *edac_dev)
832{ 789{
833 struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info; 790 struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
@@ -837,7 +794,7 @@ static void xgene_edac_pmd_hw_cfg(struct edac_device_ctl_info *edac_dev)
837 /* Enable PMD memory error - MEMERR_L2C_L2ECR and L2C_L2RTOCR */ 794 /* Enable PMD memory error - MEMERR_L2C_L2ECR and L2C_L2RTOCR */
838 writel(0x00000703, pg_e + MEMERR_L2C_L2ECR_PAGE_OFFSET); 795 writel(0x00000703, pg_e + MEMERR_L2C_L2ECR_PAGE_OFFSET);
839 /* Configure L2C HW request time out feature if supported */ 796 /* Configure L2C HW request time out feature if supported */
840 if (!xgene_edac_pmd_l2c_version1()) 797 if (ctx->version > 1)
841 writel(0x00000119, pg_d + CPUX_L2C_L2RTOCR_PAGE_OFFSET); 798 writel(0x00000119, pg_d + CPUX_L2C_L2RTOCR_PAGE_OFFSET);
842} 799}
843 800
@@ -956,7 +913,8 @@ static int xgene_edac_pmd_available(u32 efuse, int pmd)
956 return (efuse & (1 << pmd)) ? 0 : 1; 913 return (efuse & (1 << pmd)) ? 0 : 1;
957} 914}
958 915
959static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np) 916static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np,
917 int version)
960{ 918{
961 struct edac_device_ctl_info *edac_dev; 919 struct edac_device_ctl_info *edac_dev;
962 struct xgene_edac_pmd_ctx *ctx; 920 struct xgene_edac_pmd_ctx *ctx;
@@ -998,6 +956,7 @@ static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np)
998 ctx->edac = edac; 956 ctx->edac = edac;
999 ctx->edac_dev = edac_dev; 957 ctx->edac_dev = edac_dev;
1000 ctx->ddev = *edac->dev; 958 ctx->ddev = *edac->dev;
959 ctx->version = version;
1001 edac_dev->dev = &ctx->ddev; 960 edac_dev->dev = &ctx->ddev;
1002 edac_dev->ctl_name = ctx->name; 961 edac_dev->ctl_name = ctx->name;
1003 edac_dev->dev_name = ctx->name; 962 edac_dev->dev_name = ctx->name;
@@ -1169,7 +1128,9 @@ static int xgene_edac_probe(struct platform_device *pdev)
1169 if (of_device_is_compatible(child, "apm,xgene-edac-mc")) 1128 if (of_device_is_compatible(child, "apm,xgene-edac-mc"))
1170 xgene_edac_mc_add(edac, child); 1129 xgene_edac_mc_add(edac, child);
1171 if (of_device_is_compatible(child, "apm,xgene-edac-pmd")) 1130 if (of_device_is_compatible(child, "apm,xgene-edac-pmd"))
1172 xgene_edac_pmd_add(edac, child); 1131 xgene_edac_pmd_add(edac, child, 1);
1132 if (of_device_is_compatible(child, "apm,xgene-edac-pmd-v2"))
1133 xgene_edac_pmd_add(edac, child, 2);
1173 } 1134 }
1174 1135
1175 return 0; 1136 return 0;