Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'edac_urgent_for_v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras

Pull EDAC fixes from Borislav Petkov:

- Relax the condition under which the DIMM label in ghes_edac is set in
order to accomodate an HPE BIOS which sets only the device but not
the bank

- Two forgotten fixes to synopsys_edac when handling error interrupts

* tag 'edac_urgent_for_v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras:
EDAC/ghes: Set the DIMM label unconditionally
EDAC/synopsys: Re-enable the error interrupts on v3 hw
EDAC/synopsys: Use the correct register to disable the error interrupt on v3 hw

+33 -22
+8 -3
drivers/edac/ghes_edac.c
··· 103 104 dmi_memdev_name(handle, &bank, &device); 105 106 - /* both strings must be non-zero */ 107 - if (bank && *bank && device && *device) 108 - snprintf(dimm->label, sizeof(dimm->label), "%s %s", bank, device); 109 } 110 111 static void assign_dmi_dimm_info(struct dimm_info *dimm, struct memdev_dmi_entry *entry)
··· 103 104 dmi_memdev_name(handle, &bank, &device); 105 106 + /* 107 + * Set to a NULL string when both bank and device are zero. In this case, 108 + * the label assigned by default will be preserved. 109 + */ 110 + snprintf(dimm->label, sizeof(dimm->label), "%s%s%s", 111 + (bank && *bank) ? bank : "", 112 + (bank && *bank && device && *device) ? " " : "", 113 + (device && *device) ? device : ""); 114 } 115 116 static void assign_dmi_dimm_info(struct dimm_info *dimm, struct memdev_dmi_entry *entry)
+25 -19
drivers/edac/synopsys_edac.c
··· 514 memset(p, 0, sizeof(*p)); 515 } 516 517 /** 518 * intr_handler - Interrupt Handler for ECC interrupts. 519 * @irq: IRQ number. ··· 577 /* v3.0 of the controller does not have this register */ 578 if (!(priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR)) 579 writel(regval, priv->baseaddr + DDR_QOS_IRQ_STAT_OFST); 580 return IRQ_HANDLED; 581 } 582 ··· 860 mci->ctl_page_to_phys = NULL; 861 862 init_csrows(mci); 863 - } 864 - 865 - static void enable_intr(struct synps_edac_priv *priv) 866 - { 867 - /* Enable UE/CE Interrupts */ 868 - if (priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR) 869 - writel(DDR_UE_MASK | DDR_CE_MASK, 870 - priv->baseaddr + ECC_CLR_OFST); 871 - else 872 - writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK, 873 - priv->baseaddr + DDR_QOS_IRQ_EN_OFST); 874 - 875 - } 876 - 877 - static void disable_intr(struct synps_edac_priv *priv) 878 - { 879 - /* Disable UE/CE Interrupts */ 880 - writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK, 881 - priv->baseaddr + DDR_QOS_IRQ_DB_OFST); 882 } 883 884 static int setup_irq(struct mem_ctl_info *mci,
··· 514 memset(p, 0, sizeof(*p)); 515 } 516 517 + static void enable_intr(struct synps_edac_priv *priv) 518 + { 519 + /* Enable UE/CE Interrupts */ 520 + if (priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR) 521 + writel(DDR_UE_MASK | DDR_CE_MASK, 522 + priv->baseaddr + ECC_CLR_OFST); 523 + else 524 + writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK, 525 + priv->baseaddr + DDR_QOS_IRQ_EN_OFST); 526 + 527 + } 528 + 529 + static void disable_intr(struct synps_edac_priv *priv) 530 + { 531 + /* Disable UE/CE Interrupts */ 532 + if (priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR) 533 + writel(0x0, priv->baseaddr + ECC_CLR_OFST); 534 + else 535 + writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK, 536 + priv->baseaddr + DDR_QOS_IRQ_DB_OFST); 537 + } 538 + 539 /** 540 * intr_handler - Interrupt Handler for ECC interrupts. 541 * @irq: IRQ number. ··· 555 /* v3.0 of the controller does not have this register */ 556 if (!(priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR)) 557 writel(regval, priv->baseaddr + DDR_QOS_IRQ_STAT_OFST); 558 + else 559 + enable_intr(priv); 560 + 561 return IRQ_HANDLED; 562 } 563 ··· 835 mci->ctl_page_to_phys = NULL; 836 837 init_csrows(mci); 838 } 839 840 static int setup_irq(struct mem_ctl_info *mci,