Lines Matching refs:edac

78 static void xgene_edac_pcp_rd(struct xgene_edac *edac, u32 reg, u32 *val)  in xgene_edac_pcp_rd()  argument
80 *val = readl(edac->pcp_csr + reg); in xgene_edac_pcp_rd()
83 static void xgene_edac_pcp_clrbits(struct xgene_edac *edac, u32 reg, in xgene_edac_pcp_clrbits() argument
88 spin_lock(&edac->lock); in xgene_edac_pcp_clrbits()
89 val = readl(edac->pcp_csr + reg); in xgene_edac_pcp_clrbits()
91 writel(val, edac->pcp_csr + reg); in xgene_edac_pcp_clrbits()
92 spin_unlock(&edac->lock); in xgene_edac_pcp_clrbits()
95 static void xgene_edac_pcp_setbits(struct xgene_edac *edac, u32 reg, in xgene_edac_pcp_setbits() argument
100 spin_lock(&edac->lock); in xgene_edac_pcp_setbits()
101 val = readl(edac->pcp_csr + reg); in xgene_edac_pcp_setbits()
103 writel(val, edac->pcp_csr + reg); in xgene_edac_pcp_setbits()
104 spin_unlock(&edac->lock); in xgene_edac_pcp_setbits()
147 struct xgene_edac *edac; member
197 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat); in xgene_edac_mc_check()
198 xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat); in xgene_edac_mc_check()
267 mutex_lock(&ctx->edac->mc_lock); in xgene_edac_mc_irq_ctl()
279 ctx->edac->mc_registered_mask |= 1 << ctx->mcu_id; in xgene_edac_mc_irq_ctl()
282 if (ctx->edac->mc_registered_mask == in xgene_edac_mc_irq_ctl()
283 ctx->edac->mc_active_mask) { in xgene_edac_mc_irq_ctl()
285 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_mc_irq_ctl()
288 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_mc_irq_ctl()
309 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_mc_irq_ctl()
311 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_mc_irq_ctl()
315 ctx->edac->mc_registered_mask &= ~(1 << ctx->mcu_id); in xgene_edac_mc_irq_ctl()
318 mutex_unlock(&ctx->edac->mc_lock); in xgene_edac_mc_irq_ctl()
326 if (regmap_read(ctx->edac->csw_map, CSW_CSWCR, &reg)) in xgene_edac_mc_is_active()
334 if (regmap_read(ctx->edac->mcbb_map, MCBADDRMR, &reg)) in xgene_edac_mc_is_active()
342 if (regmap_read(ctx->edac->mcba_map, MCBADDRMR, &reg)) in xgene_edac_mc_is_active()
348 if (!ctx->edac->mc_active_mask) in xgene_edac_mc_is_active()
349 ctx->edac->mc_active_mask = mcu_mask; in xgene_edac_mc_is_active()
354 static int xgene_edac_mc_add(struct xgene_edac *edac, struct device_node *np) in xgene_edac_mc_add() argument
364 tmp_ctx.edac = edac; in xgene_edac_mc_add()
366 if (!devres_open_group(edac->dev, xgene_edac_mc_add, GFP_KERNEL)) in xgene_edac_mc_add()
371 dev_err(edac->dev, "no MCU resource address\n"); in xgene_edac_mc_add()
374 tmp_ctx.mcu_csr = devm_ioremap_resource(edac->dev, &res); in xgene_edac_mc_add()
376 dev_err(edac->dev, "unable to map MCU resource\n"); in xgene_edac_mc_add()
383 dev_err(edac->dev, "no memory-controller property\n"); in xgene_edac_mc_add()
427 dev_err(edac->dev, "edac_mc_add_mc failed\n"); in xgene_edac_mc_add()
434 list_add(&ctx->next, &edac->mcus); in xgene_edac_mc_add()
438 devres_remove_group(edac->dev, xgene_edac_mc_add); in xgene_edac_mc_add()
440 dev_info(edac->dev, "X-Gene EDAC MC registered\n"); in xgene_edac_mc_add()
446 devres_release_group(edac->dev, xgene_edac_mc_add); in xgene_edac_mc_add()
525 struct xgene_edac *edac; member
753 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat); in xgene_edac_pmd_check()
803 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_pmd_hw_ctl()
806 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_pmd_hw_ctl()
880 if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs) in xgene_edac_pmd_create_debugfs_nodes()
884 dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs); in xgene_edac_pmd_create_debugfs_nodes()
899 static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np, in xgene_edac_pmd_add() argument
910 if (!devres_open_group(edac->dev, xgene_edac_pmd_add, GFP_KERNEL)) in xgene_edac_pmd_add()
915 dev_err(edac->dev, "no pmd-controller property\n"); in xgene_edac_pmd_add()
919 rc = regmap_read(edac->efuse_map, 0, &val); in xgene_edac_pmd_add()
939 ctx->edac = edac; in xgene_edac_pmd_add()
941 ctx->ddev = *edac->dev; in xgene_edac_pmd_add()
950 dev_err(edac->dev, "no PMD resource address\n"); in xgene_edac_pmd_add()
953 ctx->pmd_csr = devm_ioremap_resource(edac->dev, &res); in xgene_edac_pmd_add()
955 dev_err(edac->dev, in xgene_edac_pmd_add()
968 dev_err(edac->dev, "edac_device_add_device failed\n"); in xgene_edac_pmd_add()
976 list_add(&ctx->next, &edac->pmds); in xgene_edac_pmd_add()
980 devres_remove_group(edac->dev, xgene_edac_pmd_add); in xgene_edac_pmd_add()
982 dev_info(edac->dev, "X-Gene EDAC PMD%d registered\n", ctx->pmd); in xgene_edac_pmd_add()
988 devres_release_group(edac->dev, xgene_edac_pmd_add); in xgene_edac_pmd_add()
1033 struct xgene_edac *edac; member
1146 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_l3_hw_init()
1148 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_l3_hw_init()
1151 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_l3_hw_init()
1153 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_l3_hw_init()
1184 if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs) in xgene_edac_l3_create_debugfs_nodes()
1188 dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs); in xgene_edac_l3_create_debugfs_nodes()
1196 static int xgene_edac_l3_add(struct xgene_edac *edac, struct device_node *np, in xgene_edac_l3_add() argument
1206 if (!devres_open_group(edac->dev, xgene_edac_l3_add, GFP_KERNEL)) in xgene_edac_l3_add()
1211 dev_err(edac->dev, "no L3 resource address\n"); in xgene_edac_l3_add()
1214 dev_csr = devm_ioremap_resource(edac->dev, &res); in xgene_edac_l3_add()
1216 dev_err(edac->dev, in xgene_edac_l3_add()
1235 ctx->edac = edac; in xgene_edac_l3_add()
1237 ctx->ddev = *edac->dev; in xgene_edac_l3_add()
1251 dev_err(edac->dev, "failed edac_device_add_device()\n"); in xgene_edac_l3_add()
1259 list_add(&ctx->next, &edac->l3s); in xgene_edac_l3_add()
1263 devres_remove_group(edac->dev, xgene_edac_l3_add); in xgene_edac_l3_add()
1265 dev_info(edac->dev, "X-Gene EDAC L3 registered\n"); in xgene_edac_l3_add()
1271 devres_release_group(edac->dev, xgene_edac_l3_add); in xgene_edac_l3_add()
1280 edac_device_del_device(l3->edac->dev); in xgene_edac_l3_remove()
1603 xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat); in xgene_edac_soc_check()
1604 xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat); in xgene_edac_soc_check()
1605 xgene_edac_pcp_rd(ctx->edac, MEMERRINTSTS, &reg); in xgene_edac_soc_check()
1654 xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_soc_hw_init()
1659 xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_soc_hw_init()
1662 xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK, in xgene_edac_soc_hw_init()
1667 xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK, in xgene_edac_soc_hw_init()
1678 xgene_edac_pcp_setbits(ctx->edac, MEMERRINTMSK, in xgene_edac_soc_hw_init()
1683 static int xgene_edac_soc_add(struct xgene_edac *edac, struct device_node *np, in xgene_edac_soc_add() argument
1693 if (!devres_open_group(edac->dev, xgene_edac_soc_add, GFP_KERNEL)) in xgene_edac_soc_add()
1698 dev_err(edac->dev, "no SoC resource address\n"); in xgene_edac_soc_add()
1701 dev_csr = devm_ioremap_resource(edac->dev, &res); in xgene_edac_soc_add()
1703 dev_err(edac->dev, in xgene_edac_soc_add()
1722 ctx->edac = edac; in xgene_edac_soc_add()
1724 ctx->ddev = *edac->dev; in xgene_edac_soc_add()
1736 dev_err(edac->dev, "failed edac_device_add_device()\n"); in xgene_edac_soc_add()
1744 list_add(&ctx->next, &edac->socs); in xgene_edac_soc_add()
1748 devres_remove_group(edac->dev, xgene_edac_soc_add); in xgene_edac_soc_add()
1750 dev_info(edac->dev, "X-Gene EDAC SoC registered\n"); in xgene_edac_soc_add()
1757 devres_release_group(edac->dev, xgene_edac_soc_add); in xgene_edac_soc_add()
1766 edac_device_del_device(soc->edac->dev); in xgene_edac_soc_remove()
1806 struct xgene_edac *edac; in xgene_edac_probe() local
1811 edac = devm_kzalloc(&pdev->dev, sizeof(*edac), GFP_KERNEL); in xgene_edac_probe()
1812 if (!edac) in xgene_edac_probe()
1815 edac->dev = &pdev->dev; in xgene_edac_probe()
1816 platform_set_drvdata(pdev, edac); in xgene_edac_probe()
1817 INIT_LIST_HEAD(&edac->mcus); in xgene_edac_probe()
1818 INIT_LIST_HEAD(&edac->pmds); in xgene_edac_probe()
1819 INIT_LIST_HEAD(&edac->l3s); in xgene_edac_probe()
1820 INIT_LIST_HEAD(&edac->socs); in xgene_edac_probe()
1821 spin_lock_init(&edac->lock); in xgene_edac_probe()
1822 mutex_init(&edac->mc_lock); in xgene_edac_probe()
1824 edac->csw_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in xgene_edac_probe()
1826 if (IS_ERR(edac->csw_map)) { in xgene_edac_probe()
1827 dev_err(edac->dev, "unable to get syscon regmap csw\n"); in xgene_edac_probe()
1828 rc = PTR_ERR(edac->csw_map); in xgene_edac_probe()
1832 edac->mcba_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in xgene_edac_probe()
1834 if (IS_ERR(edac->mcba_map)) { in xgene_edac_probe()
1835 dev_err(edac->dev, "unable to get syscon regmap mcba\n"); in xgene_edac_probe()
1836 rc = PTR_ERR(edac->mcba_map); in xgene_edac_probe()
1840 edac->mcbb_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in xgene_edac_probe()
1842 if (IS_ERR(edac->mcbb_map)) { in xgene_edac_probe()
1843 dev_err(edac->dev, "unable to get syscon regmap mcbb\n"); in xgene_edac_probe()
1844 rc = PTR_ERR(edac->mcbb_map); in xgene_edac_probe()
1847 edac->efuse_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in xgene_edac_probe()
1849 if (IS_ERR(edac->efuse_map)) { in xgene_edac_probe()
1850 dev_err(edac->dev, "unable to get syscon regmap efuse\n"); in xgene_edac_probe()
1851 rc = PTR_ERR(edac->efuse_map); in xgene_edac_probe()
1856 edac->pcp_csr = devm_ioremap_resource(&pdev->dev, res); in xgene_edac_probe()
1857 if (IS_ERR(edac->pcp_csr)) { in xgene_edac_probe()
1859 rc = PTR_ERR(edac->pcp_csr); in xgene_edac_probe()
1876 dev_name(&pdev->dev), edac); in xgene_edac_probe()
1885 edac->dfs = edac_debugfs_create_dir(pdev->dev.kobj.name); in xgene_edac_probe()
1891 xgene_edac_mc_add(edac, child); in xgene_edac_probe()
1893 xgene_edac_pmd_add(edac, child, 1); in xgene_edac_probe()
1895 xgene_edac_pmd_add(edac, child, 2); in xgene_edac_probe()
1897 xgene_edac_l3_add(edac, child, 1); in xgene_edac_probe()
1899 xgene_edac_l3_add(edac, child, 2); in xgene_edac_probe()
1901 xgene_edac_soc_add(edac, child, 0); in xgene_edac_probe()
1903 xgene_edac_soc_add(edac, child, 1); in xgene_edac_probe()
1914 struct xgene_edac *edac = dev_get_drvdata(&pdev->dev); in xgene_edac_remove() local
1922 list_for_each_entry_safe(mcu, temp_mcu, &edac->mcus, next) in xgene_edac_remove()
1925 list_for_each_entry_safe(pmd, temp_pmd, &edac->pmds, next) in xgene_edac_remove()
1928 list_for_each_entry_safe(node, temp_node, &edac->l3s, next) in xgene_edac_remove()
1931 list_for_each_entry_safe(node, temp_node, &edac->socs, next) in xgene_edac_remove()