EDAC, altera: Less Intrusive Error Injection
Subsystems (2)
PATCH 1/2 EDAC, altera: Less Intrusive Error Injection
From: Thor Thayer <[email protected]>
Improve the Arria10 and Stratix10 error injection routine by reading the data and changing just 1 bit before writing back out. Previous routine would overwrite the first bytes to 0 then change 1 bit but this method is less intrusive.
--- drivers/edac/altera_edac.c | 30 +++++++++++++----------------- drivers/edac/altera_edac.h | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-)
drivers/edac/altera_edac.c +13 -17
@@ -1762,28 +1762,24 @@ static ssize_t altr_edac_a10_device_trig2(struct file *file,if (trig_type ==ALTR_UE_TRIGGER_CHAR ) {writel (priv->ue_set_mask, set_addr); }else { -/* Setup write of 0 to first 4 bytes */ -writel (0x0 , drvdata->base +ECC_BLK_WDATA0_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA1_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA2_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA3_OFST ); -/* Setup write of 4 bytes */ +/* Setup read/write of 4 bytes */ writel (ECC_WORD_WRITE , drvdata->base +ECC_BLK_DBYTECTRL_OFST );/* Setup Address to 0 */ -writel (0x0 , drvdata->base +ECC_BLK_ADDRESS_OFST ); -/* Setup accctrl to write & data override */ -writel (ECC_WRITE_DOVR , drvdata->base +ECC_BLK_ACCCTRL_OFST ); -/* Kick it. */ -writel (ECC_XACT_KICK , drvdata->base +ECC_BLK_STARTACC_OFST ); -/* Setup accctrl to read & ecc override */ -writel (ECC_READ_EOVR , drvdata->base +ECC_BLK_ACCCTRL_OFST ); +writel (0 , drvdata->base +ECC_BLK_ADDRESS_OFST ); +/* Setup accctrl to read & ecc & data override */ +writel (ECC_READ_EDOVR , drvdata->base +ECC_BLK_ACCCTRL_OFST );/* Kick it. */ writel (ECC_XACT_KICK , drvdata->base +ECC_BLK_STARTACC_OFST );/* Setup write for single bit change */ -writel (0x1 , drvdata->base +ECC_BLK_WDATA0_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA1_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA2_OFST ); -writel (0x0 , drvdata->base +ECC_BLK_WDATA3_OFST ); +writel (readl (drvdata->base +ECC_BLK_RDATA0_OFST ) ^0x1 , + drvdata->base +ECC_BLK_WDATA0_OFST ); +writel (readl (drvdata->base +ECC_BLK_RDATA1_OFST ), + drvdata->base +ECC_BLK_WDATA1_OFST ); +writel (readl (drvdata->base +ECC_BLK_RDATA2_OFST ), + drvdata->base +ECC_BLK_WDATA2_OFST ); +writel (readl (drvdata->base +ECC_BLK_RDATA3_OFST ), + drvdata->base +ECC_BLK_WDATA3_OFST ); +/* Copy Read ECC to Write ECC */ writel (readl (drvdata->base +ECC_BLK_RECC0_OFST ), drvdata->base +ECC_BLK_WECC0_OFST );
drivers/edac/altera_edac.h +1 -1
@@ -321,7 +321,7 @@ struct altr_sdram_mc_data {#define ECC_BLK_STARTACC_OFST 0x7C#define ECC_XACT_KICK 0x10000 -#define ECC_WORD_WRITE 0xF +#define ECC_WORD_WRITE 0xFF#define ECC_WRITE_DOVR 0x101#define ECC_WRITE_EDOVR 0x103#define ECC_READ_EOVR 0x2
Signature · 1 line
2.7.4
PATCH 2/2 EDAC, altera: Initialize peripheral FIFOs in probe()
From: Thor Thayer <[email protected]>
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.
--- drivers/edac/altera_edac.c | 162 +++++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 71 deletions(-)
drivers/edac/altera_edac.c +91 -71
@@ -1361,8 +1361,19 @@ static const struct edac_device_prv_data a10_l2ecc_data = {#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 = { - .setup = altr_check_ecc_deps, + .setup = socfpga_init_ethernet_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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, }; -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 */ /********************** NAND Device Functions **********************/ #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 = { - .setup = altr_check_ecc_deps, + .setup = socfpga_init_nand_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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, }; -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 */ /********************** DMA Device Functions **********************/ #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 = { - .setup = altr_check_ecc_deps, + .setup = socfpga_init_dma_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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, }; -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 */ /********************** USB Device Functions **********************/ #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 = { - .setup = altr_check_ecc_deps, + .setup = socfpga_init_usb_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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, }; -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 */ /********************** QSPI Device Functions **********************/ #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 = { - .setup = altr_check_ecc_deps, + .setup = socfpga_init_qspi_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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, }; -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 */ /********************* SDMMC Device Functions **********************/
@@ -1593,6 +1613,35 @@ static int altr_portb_setup(struct altr_edac_device_dev *device)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) {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 = { - .setup = altr_portb_setup, + .setup = socfpga_init_sdmmc_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENA , .ue_clear_mask =ALTR_A10_ECC_DERRPENA , .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 = { - .setup = altr_portb_setup, + .setup = socfpga_init_sdmmc_ecc, .ce_clear_mask =ALTR_A10_ECC_SERRPENB , .ue_clear_mask =ALTR_A10_ECC_DERRPENB , .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, }; -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 */ /********************* Arria10 EDAC Device Functions *************************/
Signature · 1 line
2.7.4
Borislav Petkov
maintainerRe: [PATCH 2/2] EDAC, altera: Initialize peripheral FIFOs in probe()
Quoted 5 lines · On Tue, Mar 26, 2019 at 04:29:31PM -0500, [email protected] wrote:
From: Thor Thayer <[email protected]>
The FIFO memory and ECC initialization doesn't need to be done as a separate operation early in the startup.
Quoted 8 lines
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 <[email protected]>--- drivers/edac/altera_edac.c | 162 +++++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 71 deletions(-)
Both applied,
thanks.