mirror of https://gitee.com/openkylin/linux.git
EDAC/altera: Initialize peripheral FIFOs in probe()
The FIFO memory and ECC initialization doesn't need to be done as a separate operation early in the startup. Improve the Arria10 and Stratix10 peripheral FIFO init by initializing memory and enabling ECC as part of the device driver initialization. Signed-off-by: Thor Thayer <thor.thayer@linux.intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: James Morse <james.morse@arm.com> Cc: Mauro Carvalho Chehab <mchehab@kernel.org> Cc: linux-edac <linux-edac@vger.kernel.org> Link: https://lkml.kernel.org/r/1553635771-32693-2-git-send-email-thor.thayer@linux.intel.com
This commit is contained in:
parent
436b0a583a
commit
788586efd1
|
@ -1361,8 +1361,19 @@ static const struct edac_device_prv_data a10_l2ecc_data = {
|
||||||
|
|
||||||
#ifdef CONFIG_EDAC_ALTERA_ETHERNET
|
#ifdef CONFIG_EDAC_ALTERA_ETHERNET
|
||||||
|
|
||||||
|
static int __init socfpga_init_ethernet_ecc(struct altr_edac_device_dev *dev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = altr_init_a10_ecc_device_type("altr,socfpga-eth-mac-ecc");
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return altr_check_ecc_deps(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_enetecc_data = {
|
static const struct edac_device_prv_data a10_enetecc_data = {
|
||||||
.setup = altr_check_ecc_deps,
|
.setup = socfpga_init_ethernet_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1374,21 +1385,25 @@ static const struct edac_device_prv_data a10_enetecc_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_ethernet_ecc(void)
|
|
||||||
{
|
|
||||||
return altr_init_a10_ecc_device_type("altr,socfpga-eth-mac-ecc");
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_ethernet_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_ETHERNET */
|
#endif /* CONFIG_EDAC_ALTERA_ETHERNET */
|
||||||
|
|
||||||
/********************** NAND Device Functions **********************/
|
/********************** NAND Device Functions **********************/
|
||||||
|
|
||||||
#ifdef CONFIG_EDAC_ALTERA_NAND
|
#ifdef CONFIG_EDAC_ALTERA_NAND
|
||||||
|
|
||||||
|
static int __init socfpga_init_nand_ecc(struct altr_edac_device_dev *device)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = altr_init_a10_ecc_device_type("altr,socfpga-nand-ecc");
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return altr_check_ecc_deps(device);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_nandecc_data = {
|
static const struct edac_device_prv_data a10_nandecc_data = {
|
||||||
.setup = altr_check_ecc_deps,
|
.setup = socfpga_init_nand_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1400,21 +1415,25 @@ static const struct edac_device_prv_data a10_nandecc_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_nand_ecc(void)
|
|
||||||
{
|
|
||||||
return altr_init_a10_ecc_device_type("altr,socfpga-nand-ecc");
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_nand_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_NAND */
|
#endif /* CONFIG_EDAC_ALTERA_NAND */
|
||||||
|
|
||||||
/********************** DMA Device Functions **********************/
|
/********************** DMA Device Functions **********************/
|
||||||
|
|
||||||
#ifdef CONFIG_EDAC_ALTERA_DMA
|
#ifdef CONFIG_EDAC_ALTERA_DMA
|
||||||
|
|
||||||
|
static int __init socfpga_init_dma_ecc(struct altr_edac_device_dev *device)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = altr_init_a10_ecc_device_type("altr,socfpga-dma-ecc");
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return altr_check_ecc_deps(device);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_dmaecc_data = {
|
static const struct edac_device_prv_data a10_dmaecc_data = {
|
||||||
.setup = altr_check_ecc_deps,
|
.setup = socfpga_init_dma_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1426,21 +1445,25 @@ static const struct edac_device_prv_data a10_dmaecc_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_dma_ecc(void)
|
|
||||||
{
|
|
||||||
return altr_init_a10_ecc_device_type("altr,socfpga-dma-ecc");
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_dma_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_DMA */
|
#endif /* CONFIG_EDAC_ALTERA_DMA */
|
||||||
|
|
||||||
/********************** USB Device Functions **********************/
|
/********************** USB Device Functions **********************/
|
||||||
|
|
||||||
#ifdef CONFIG_EDAC_ALTERA_USB
|
#ifdef CONFIG_EDAC_ALTERA_USB
|
||||||
|
|
||||||
|
static int __init socfpga_init_usb_ecc(struct altr_edac_device_dev *device)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = altr_init_a10_ecc_device_type("altr,socfpga-usb-ecc");
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return altr_check_ecc_deps(device);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_usbecc_data = {
|
static const struct edac_device_prv_data a10_usbecc_data = {
|
||||||
.setup = altr_check_ecc_deps,
|
.setup = socfpga_init_usb_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1452,21 +1475,25 @@ static const struct edac_device_prv_data a10_usbecc_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_usb_ecc(void)
|
|
||||||
{
|
|
||||||
return altr_init_a10_ecc_device_type("altr,socfpga-usb-ecc");
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_usb_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_USB */
|
#endif /* CONFIG_EDAC_ALTERA_USB */
|
||||||
|
|
||||||
/********************** QSPI Device Functions **********************/
|
/********************** QSPI Device Functions **********************/
|
||||||
|
|
||||||
#ifdef CONFIG_EDAC_ALTERA_QSPI
|
#ifdef CONFIG_EDAC_ALTERA_QSPI
|
||||||
|
|
||||||
|
static int __init socfpga_init_qspi_ecc(struct altr_edac_device_dev *device)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = altr_init_a10_ecc_device_type("altr,socfpga-qspi-ecc");
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return altr_check_ecc_deps(device);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_qspiecc_data = {
|
static const struct edac_device_prv_data a10_qspiecc_data = {
|
||||||
.setup = altr_check_ecc_deps,
|
.setup = socfpga_init_qspi_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1478,13 +1505,6 @@ static const struct edac_device_prv_data a10_qspiecc_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_qspi_ecc(void)
|
|
||||||
{
|
|
||||||
return altr_init_a10_ecc_device_type("altr,socfpga-qspi-ecc");
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_qspi_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_QSPI */
|
#endif /* CONFIG_EDAC_ALTERA_QSPI */
|
||||||
|
|
||||||
/********************* SDMMC Device Functions **********************/
|
/********************* SDMMC Device Functions **********************/
|
||||||
|
@ -1593,6 +1613,35 @@ static int altr_portb_setup(struct altr_edac_device_dev *device)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init socfpga_init_sdmmc_ecc(struct altr_edac_device_dev *device)
|
||||||
|
{
|
||||||
|
int rc = -ENODEV;
|
||||||
|
struct device_node *child;
|
||||||
|
|
||||||
|
child = of_find_compatible_node(NULL, NULL, "altr,socfpga-sdmmc-ecc");
|
||||||
|
if (!child)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (!of_device_is_available(child))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (validate_parent_available(child))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* Init portB */
|
||||||
|
rc = altr_init_a10_ecc_block(child, ALTR_A10_SDMMC_IRQ_MASK,
|
||||||
|
a10_sdmmceccb_data.ecc_enable_mask, 1);
|
||||||
|
if (rc)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* Setup portB */
|
||||||
|
return altr_portb_setup(device);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
of_node_put(child);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static irqreturn_t altr_edac_a10_ecc_irq_portb(int irq, void *dev_id)
|
static irqreturn_t altr_edac_a10_ecc_irq_portb(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct altr_edac_device_dev *ad = dev_id;
|
struct altr_edac_device_dev *ad = dev_id;
|
||||||
|
@ -1617,7 +1666,7 @@ static irqreturn_t altr_edac_a10_ecc_irq_portb(int irq, void *dev_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_sdmmcecca_data = {
|
static const struct edac_device_prv_data a10_sdmmcecca_data = {
|
||||||
.setup = altr_portb_setup,
|
.setup = socfpga_init_sdmmc_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENA,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENA,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1630,7 +1679,7 @@ static const struct edac_device_prv_data a10_sdmmcecca_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct edac_device_prv_data a10_sdmmceccb_data = {
|
static const struct edac_device_prv_data a10_sdmmceccb_data = {
|
||||||
.setup = altr_portb_setup,
|
.setup = socfpga_init_sdmmc_ecc,
|
||||||
.ce_clear_mask = ALTR_A10_ECC_SERRPENB,
|
.ce_clear_mask = ALTR_A10_ECC_SERRPENB,
|
||||||
.ue_clear_mask = ALTR_A10_ECC_DERRPENB,
|
.ue_clear_mask = ALTR_A10_ECC_DERRPENB,
|
||||||
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
.ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
|
||||||
|
@ -1642,35 +1691,6 @@ static const struct edac_device_prv_data a10_sdmmceccb_data = {
|
||||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init socfpga_init_sdmmc_ecc(void)
|
|
||||||
{
|
|
||||||
int rc = -ENODEV;
|
|
||||||
struct device_node *child;
|
|
||||||
|
|
||||||
if (!socfpga_is_a10() && !socfpga_is_s10())
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
child = of_find_compatible_node(NULL, NULL, "altr,socfpga-sdmmc-ecc");
|
|
||||||
if (!child) {
|
|
||||||
edac_printk(KERN_WARNING, EDAC_DEVICE, "SDMMC node not found\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!of_device_is_available(child))
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
if (validate_parent_available(child))
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
rc = altr_init_a10_ecc_block(child, ALTR_A10_SDMMC_IRQ_MASK,
|
|
||||||
a10_sdmmcecca_data.ecc_enable_mask, 1);
|
|
||||||
exit:
|
|
||||||
of_node_put(child);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
early_initcall(socfpga_init_sdmmc_ecc);
|
|
||||||
|
|
||||||
#endif /* CONFIG_EDAC_ALTERA_SDMMC */
|
#endif /* CONFIG_EDAC_ALTERA_SDMMC */
|
||||||
|
|
||||||
/********************* Arria10 EDAC Device Functions *************************/
|
/********************* Arria10 EDAC Device Functions *************************/
|
||||||
|
|
Loading…
Reference in New Issue