[PATCH] edac: xgene: fix cpuid abuse
Loc Ho
lho at apm.com
Mon Jun 1 10:04:51 PDT 2015
Hi Arnd,
Thanks for the changes, some minor change requested below.
> 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 at arndb.de>
> ---
>
> How about this one? We should make sure this gets fixed before the binding
> gets set in stone with a kernel release.
>
> Loc, do you know if some of the other blocks might also have versions
> associated with them? Normally we try to use more specific product names,
> but in case of APM there don't seem to be any more specific names
> than X-Gene and X-Gene2 any more.
>
I already asked the designer. There is no version register in the PMD block.
> diff --git a/Documentation/devicetree/bindings/edac/apm-xgene-edac.txt b/Documentation/devicetree/bindings/edac/apm-xgene-edac.txt
> index 480911c38ff9..e31b696ba939 100644
> --- a/Documentation/devicetree/bindings/edac/apm-xgene-edac.txt
> +++ b/Documentation/devicetree/bindings/edac/apm-xgene-edac.txt
> @@ -25,7 +25,7 @@ Required properties for memory controller subnode:
> - memory-controller : Instance number of the memory controller.
>
> Required properties for PMD subnode:
> -- compatible : Shall be "apm,xgene-edac-pmd".
> +- compatible : Shall be "apm,xgene-edac-pmd" or "apm,xgene-v2-edac-pmd"
Can we change to "apm,xgene-edac-pmd-v2". I would like to associate
with the PMD instead with the family name. The PMD (processor module)
might be re-use in future chip as is such as Gen3, Gen4, and etc.
> - reg : First resource shall be the PMD resource.
> - pmd-controller : Instance number of the PMD controller.
>
> diff --git a/drivers/edac/xgene_edac.c b/drivers/edac/xgene_edac.c
> index b5158572f6ab..8071c2223f92 100644
> --- a/drivers/edac/xgene_edac.c
> +++ b/drivers/edac/xgene_edac.c
> @@ -523,6 +523,7 @@ struct xgene_edac_pmd_ctx {
> struct edac_device_ctl_info *edac_dev;
> void __iomem *pmd_csr;
> u32 pmd;
> + int version;
> };
>
> static 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,
> writel(0x00000101, pg_f + MEMERR_CPU_MMUECR_PAGE_OFFSET);
> }
>
> -static bool xgene_edac_pmd_l2c_version1(void)
> -{
> - /* Check all chips with PMD L2C version 1 HW */
> - #define REVIDR_MINOR_REV(revidr) ((revidr) & 0x00000007)
> -
> - switch (MIDR_VARIANT(read_cpuid_id())) {
> - case 0:
> - switch (MIDR_REVISION(read_cpuid_id())) {
> - case 0:
> -
> - switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
> - case 1:
> - case 2:
> - return true;
> - };
> - break;
> - case 1:
> - if (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1)) == 1)
> - return true;
> - break;
> - }
> - break;
> - case 1:
> - switch (MIDR_REVISION(read_cpuid_id())) {
> - case 0:
> - switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
> - case 1:
> - return true;
> - };
> - break;
> - case 1:
> - switch (REVIDR_MINOR_REV(read_cpuid(REVIDR_EL1))) {
> - case 1:
> - case 0:
> - return true;
> - };
> - break;
> - }
> - break;
> - }
> -
> - return false;
> -}
> -
> static void xgene_edac_pmd_hw_cfg(struct edac_device_ctl_info *edac_dev)
> {
> 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)
> /* Enable PMD memory error - MEMERR_L2C_L2ECR and L2C_L2RTOCR */
> writel(0x00000703, pg_e + MEMERR_L2C_L2ECR_PAGE_OFFSET);
> /* Configure L2C HW request time out feature if supported */
> - if (!xgene_edac_pmd_l2c_version1())
> + if (ctx->version == 1)
The correct changes would be ctx->version > 1. So:
if (ctx->version > 1)
> writel(0x00000119, pg_d + CPUX_L2C_L2RTOCR_PAGE_OFFSET);
> }
>
> @@ -956,7 +913,7 @@ static int xgene_edac_pmd_available(u32 efuse, int pmd)
> return (efuse & (1 << pmd)) ? 0 : 1;
> }
>
> -static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np)
> +static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np, int version)
> {
> struct edac_device_ctl_info *edac_dev;
> struct xgene_edac_pmd_ctx *ctx;
> @@ -998,6 +955,7 @@ static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np)
> ctx->edac = edac;
> ctx->edac_dev = edac_dev;
> ctx->ddev = *edac->dev;
> + ctx->version = version;
> edac_dev->dev = &ctx->ddev;
> edac_dev->ctl_name = ctx->name;
> edac_dev->dev_name = ctx->name;
> @@ -1169,7 +1127,9 @@ static int xgene_edac_probe(struct platform_device *pdev)
> if (of_device_is_compatible(child, "apm,xgene-edac-mc"))
> xgene_edac_mc_add(edac, child);
> if (of_device_is_compatible(child, "apm,xgene-edac-pmd"))
> - xgene_edac_pmd_add(edac, child);
> + xgene_edac_pmd_add(edac, child, 1);
> + if (of_device_is_compatible(child, "apm,xgene-v2-edac-pmd"))
Change to "apm,xgene-edac-pmd-v2"
> + xgene_edac_pmd_add(edac, child, 2);
> }
>
> return 0;
Again... Thanks for the changes.
-Loc
More information about the linux-arm-kernel
mailing list