Lines Matching refs:edac
11 #include <linux/edac.h>
66 static void xgene_edac_pcp_rd(struct xgene_edac *edac, u32 reg, u32 *val)
68 *val = readl(edac->pcp_csr + reg);
71 static void xgene_edac_pcp_clrbits(struct xgene_edac *edac, u32 reg,
76 spin_lock(&edac->lock);
77 val = readl(edac->pcp_csr + reg);
79 writel(val, edac->pcp_csr + reg);
80 spin_unlock(&edac->lock);
83 static void xgene_edac_pcp_setbits(struct xgene_edac *edac, u32 reg,
88 spin_lock(&edac->lock);
89 val = readl(edac->pcp_csr + reg);
91 writel(val, edac->pcp_csr + reg);
92 spin_unlock(&edac->lock);
135 struct xgene_edac *edac;
185 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
186 xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat);
255 mutex_lock(&ctx->edac->mc_lock);
267 ctx->edac->mc_registered_mask |= 1 << ctx->mcu_id;
270 if (ctx->edac->mc_registered_mask ==
271 ctx->edac->mc_active_mask) {
273 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
276 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
297 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
299 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
303 ctx->edac->mc_registered_mask &= ~(1 << ctx->mcu_id);
306 mutex_unlock(&ctx->edac->mc_lock);
314 if (regmap_read(ctx->edac->csw_map, CSW_CSWCR, ®))
322 if (regmap_read(ctx->edac->mcbb_map, MCBADDRMR, ®))
330 if (regmap_read(ctx->edac->mcba_map, MCBADDRMR, ®))
336 if (!ctx->edac->mc_active_mask)
337 ctx->edac->mc_active_mask = mcu_mask;
342 static int xgene_edac_mc_add(struct xgene_edac *edac, struct device_node *np)
352 tmp_ctx.edac = edac;
354 if (!devres_open_group(edac->dev, xgene_edac_mc_add, GFP_KERNEL))
359 dev_err(edac->dev, "no MCU resource address\n");
362 tmp_ctx.mcu_csr = devm_ioremap_resource(edac->dev, &res);
364 dev_err(edac->dev, "unable to map MCU resource\n");
371 dev_err(edac->dev, "no memory-controller property\n");
414 dev_err(edac->dev, "edac_mc_add_mc failed\n");
421 list_add(&ctx->next, &edac->mcus);
425 devres_remove_group(edac->dev, xgene_edac_mc_add);
427 dev_info(edac->dev, "X-Gene EDAC MC registered\n");
433 devres_release_group(edac->dev, xgene_edac_mc_add);
512 struct xgene_edac *edac;
740 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
790 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
793 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
867 if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs)
871 dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs);
886 static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np,
897 if (!devres_open_group(edac->dev, xgene_edac_pmd_add, GFP_KERNEL))
902 dev_err(edac->dev, "no pmd-controller property\n");
906 rc = regmap_read(edac->efuse_map, 0, &val);
926 ctx->edac = edac;
928 ctx->ddev = *edac->dev;
937 dev_err(edac->dev, "no PMD resource address\n");
940 ctx->pmd_csr = devm_ioremap_resource(edac->dev, &res);
942 dev_err(edac->dev,
955 dev_err(edac->dev, "edac_device_add_device failed\n");
963 list_add(&ctx->next, &edac->pmds);
967 devres_remove_group(edac->dev, xgene_edac_pmd_add);
969 dev_info(edac->dev, "X-Gene EDAC PMD%d registered\n", ctx->pmd);
975 devres_release_group(edac->dev, xgene_edac_pmd_add);
1020 struct xgene_edac *edac;
1133 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
1135 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
1138 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
1140 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
1171 if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs)
1175 dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs);
1183 static int xgene_edac_l3_add(struct xgene_edac *edac, struct device_node *np,
1193 if (!devres_open_group(edac->dev, xgene_edac_l3_add, GFP_KERNEL))
1198 dev_err(edac->dev, "no L3 resource address\n");
1201 dev_csr = devm_ioremap_resource(edac->dev, &res);
1203 dev_err(edac->dev,
1222 ctx->edac = edac;
1224 ctx->ddev = *edac->dev;
1238 dev_err(edac->dev, "failed edac_device_add_device()\n");
1246 list_add(&ctx->next, &edac->l3s);
1250 devres_remove_group(edac->dev, xgene_edac_l3_add);
1252 dev_info(edac->dev, "X-Gene EDAC L3 registered\n");
1258 devres_release_group(edac->dev, xgene_edac_l3_add);
1267 edac_device_del_device(l3->edac->dev);
1471 if (!ctx->edac->rb_map)
1481 if (regmap_read(ctx->edac->rb_map, RBCSR, ®))
1487 if (regmap_read(ctx->edac->rb_map, RBEIR, ®))
1506 if (regmap_write(ctx->edac->rb_map, RBEIR, 0))
1508 if (regmap_write(ctx->edac->rb_map, RBCSR, 0))
1643 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
1644 xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat);
1645 xgene_edac_pcp_rd(ctx->edac, MEMERRINTSTS, ®);
1694 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
1699 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
1702 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
1707 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
1718 xgene_edac_pcp_setbits(ctx->edac, MEMERRINTMSK,
1723 static int xgene_edac_soc_add(struct xgene_edac *edac, struct device_node *np,
1733 if (!devres_open_group(edac->dev, xgene_edac_soc_add, GFP_KERNEL))
1738 dev_err(edac->dev, "no SoC resource address\n");
1741 dev_csr = devm_ioremap_resource(edac->dev, &res);
1743 dev_err(edac->dev,
1762 ctx->edac = edac;
1764 ctx->ddev = *edac->dev;
1776 dev_err(edac->dev, "failed edac_device_add_device()\n");
1784 list_add(&ctx->next, &edac->socs);
1788 devres_remove_group(edac->dev, xgene_edac_soc_add);
1790 dev_info(edac->dev, "X-Gene EDAC SoC registered\n");
1797 devres_release_group(edac->dev, xgene_edac_soc_add);
1806 edac_device_del_device(soc->edac->dev);
1846 struct xgene_edac *edac;
1851 edac = devm_kzalloc(&pdev->dev, sizeof(*edac), GFP_KERNEL);
1852 if (!edac)
1855 edac->dev = &pdev->dev;
1856 platform_set_drvdata(pdev, edac);
1857 INIT_LIST_HEAD(&edac->mcus);
1858 INIT_LIST_HEAD(&edac->pmds);
1859 INIT_LIST_HEAD(&edac->l3s);
1860 INIT_LIST_HEAD(&edac->socs);
1861 spin_lock_init(&edac->lock);
1862 mutex_init(&edac->mc_lock);
1864 edac->csw_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1866 if (IS_ERR(edac->csw_map)) {
1867 dev_err(edac->dev, "unable to get syscon regmap csw\n");
1868 rc = PTR_ERR(edac->csw_map);
1872 edac->mcba_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1874 if (IS_ERR(edac->mcba_map)) {
1875 dev_err(edac->dev, "unable to get syscon regmap mcba\n");
1876 rc = PTR_ERR(edac->mcba_map);
1880 edac->mcbb_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1882 if (IS_ERR(edac->mcbb_map)) {
1883 dev_err(edac->dev, "unable to get syscon regmap mcbb\n");
1884 rc = PTR_ERR(edac->mcbb_map);
1887 edac->efuse_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1889 if (IS_ERR(edac->efuse_map)) {
1890 dev_err(edac->dev, "unable to get syscon regmap efuse\n");
1891 rc = PTR_ERR(edac->efuse_map);
1899 edac->rb_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1901 if (IS_ERR(edac->rb_map)) {
1902 dev_warn(edac->dev, "missing syscon regmap rb\n");
1903 edac->rb_map = NULL;
1907 edac->pcp_csr = devm_ioremap_resource(&pdev->dev, res);
1908 if (IS_ERR(edac->pcp_csr)) {
1910 rc = PTR_ERR(edac->pcp_csr);
1927 dev_name(&pdev->dev), edac);
1936 edac->dfs = edac_debugfs_create_dir(pdev->dev.kobj.name);
1941 if (of_device_is_compatible(child, "apm,xgene-edac-mc"))
1942 xgene_edac_mc_add(edac, child);
1943 if (of_device_is_compatible(child, "apm,xgene-edac-pmd"))
1944 xgene_edac_pmd_add(edac, child, 1);
1945 if (of_device_is_compatible(child, "apm,xgene-edac-pmd-v2"))
1946 xgene_edac_pmd_add(edac, child, 2);
1947 if (of_device_is_compatible(child, "apm,xgene-edac-l3"))
1948 xgene_edac_l3_add(edac, child, 1);
1949 if (of_device_is_compatible(child, "apm,xgene-edac-l3-v2"))
1950 xgene_edac_l3_add(edac, child, 2);
1951 if (of_device_is_compatible(child, "apm,xgene-edac-soc"))
1952 xgene_edac_soc_add(edac, child, 0);
1953 if (of_device_is_compatible(child, "apm,xgene-edac-soc-v1"))
1954 xgene_edac_soc_add(edac, child, 1);
1965 struct xgene_edac *edac = dev_get_drvdata(&pdev->dev);
1973 list_for_each_entry_safe(mcu, temp_mcu, &edac->mcus, next)
1976 list_for_each_entry_safe(pmd, temp_pmd, &edac->pmds, next)
1979 list_for_each_entry_safe(node, temp_node, &edac->l3s, next)
1982 list_for_each_entry_safe(node, temp_node, &edac->socs, next)
1989 { .compatible = "apm,xgene-edac" },
1998 .name = "xgene-edac",