From: John Jacques <john.jacq...@lsi.com> When memory is not re-initialized during a reset, some of the unmonitored bits stay set and cause the interrupt handler to be unable to clear interrupts.
Signed-off-by: John Jacques <john.jacq...@lsi.com> --- drivers/misc/lsi-smmon.c | 56 ++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/drivers/misc/lsi-smmon.c b/drivers/misc/lsi-smmon.c index 5e859db..33c52cf 100644 --- a/drivers/misc/lsi-smmon.c +++ b/drivers/misc/lsi-smmon.c @@ -23,7 +23,7 @@ #error "Only AXM55xx is Supported At Present!" #endif -static int log=1; +static int log = 1; module_param(log, int, 0755); MODULE_PARM_DESC(log, "Log each error on the console."); @@ -33,28 +33,28 @@ MODULE_PARM_DESC(log, "Log each error on the console."); Bit [24] = The software-initiated control word write has completed. Bit [23] = The user-initiated DLL resync has completed. Bit [22] = A state change has been detected on the dfi_init_complete signal - after initialization. + after initialization. Bit [21] = The assertion of the INHIBIT_DRAM_CMD parameter has successfully - inhibited the command queue. + inhibited the command queue. Bit [20] = The register interface-initiated mode register write has completed - and another mode register write may be issued. + and another mode register write may be issued. Bit [19] = A parity error has been detected on the address/control bus on a - registered DIMM. + registered DIMM. Bit [18] = The leveling operation has completed. Bit [17] = A leveling operation has been requested. Bit [16] = A DFI update error has occurred. Error information can be found in - the UPDATE_ERROR_STATUS parameter. + the UPDATE_ERROR_STATUS parameter. Bit [15] = A write leveling error has occurred. Error information can be found - in the WRLVL_ERROR_STATUS parameter. + in the WRLVL_ERROR_STATUS parameter. Bit [14] = A read leveling gate training error has occurred. Error information - can be found in the RDLVL_ERROR_STATUS parameter. + can be found in the RDLVL_ERROR_STATUS parameter. Bit [13] = A read leveling error has occurred. Error information can be found - in the RDLVL_ERROR_STATUS parameter. + in the RDLVL_ERROR_STATUS parameter. Bit [12] = The user has programmed an invalid setting associated with user - words per burst. Examples: Setting param_reduc when burst - length = 2. A 1:2 MC:PHY clock ratio with burst length = 2. + words per burst. Examples: Setting param_reduc when burst + length = 2. A 1:2 MC:PHY clock ratio with burst length = 2. Bit [11] = A wrap cycle crossing a DRAM page has been detected. This is - unsupported & may result in memory data corruption. + unsupported & may result in memory data corruption. Bit [10] = The BIST operation has been completed. Bit [09] = The low power operation has been completed. Bit [08] = The MC initialization has been completed. @@ -64,9 +64,9 @@ MODULE_PARM_DESC(log, "Log each error on the console."); Bit [04] = Multiple correctable ECC events have been detected. Bit [03] = A correctable ECC event has been detected. Bit [02] = Multiple accesses outside the defined PHYSICAL memory space have - occurred. + occurred. Bit [01] = A memory access outside the defined PHYSICAL memory space has - occurred. + occurred. Bit [00] = The memory reset is valid on the DFI bus. Of these, 1, 2, 3, 4, 5, 6, 7, 11, and 19 are of interest. @@ -202,15 +202,15 @@ smmon_read_proc(char *page, char **start, off_t offset, int count, length = sprintf(page, "------------ Counts for SM0/SM1 ----------\n" - " Illegal Access: %lu/%lu\n" - " Multiple Illegal Accesses: %lu/%lu\n" - " Correctable ECC Error: %lu/%lu\n" + " Illegal Access: %lu/%lu\n" + " Multiple Illegal Accesses: %lu/%lu\n" + " Correctable ECC Error: %lu/%lu\n" " Multiple Correctable ECC Errors: %lu/%lu\n" - " Uncorrectable ECC Error: %lu/%lu\n" + " Uncorrectable ECC Error: %lu/%lu\n" "Multiple Uncorrectable ECC Errors: %lu/%lu\n" - " Port Errors: %lu/%lu\n" - " Wrap Errors: %lu/%lu\n" - " Parity Errors: %lu/%lu\n", + " Port Errors: %lu/%lu\n" + " Wrap Errors: %lu/%lu\n" + " Parity Errors: %lu/%lu\n", counts.illegal_access[0], counts.illegal_access[1], counts.multiple_illegal_access[0], @@ -245,17 +245,27 @@ smmon_read_proc(char *page, char **start, off_t offset, int count, */ /* - ------------------------------------------------------------------------------- + ------------------------------------------------------------------------------ smmon_init */ static int __init smmon_init(void) { int rc; + int mask; printk("smmon: log=%d\n", log); create_proc_read_entry("smmon", 0, NULL, smmon_read_proc, NULL); memset(&counts, 0, sizeof(struct smmon_counts)); + + /* + Set the interrupt mask for each controller. + */ + + mask = 0x1f7f701; + ncr_write(NCP_REGION_ID(0x22, 0), 0x414, 4, &mask); + ncr_write(NCP_REGION_ID(0xf, 0), 0x414, 4, &mask); + rc = request_irq(32 + 161, smmon_isr, IRQF_ONESHOT, "smmon_0", NULL); rc |= request_irq(32 + 160, smmon_isr, IRQF_ONESHOT, @@ -274,7 +284,7 @@ static int __init smmon_init(void) module_init(smmon_init); /* - ------------------------------------------------------------------------------- + ------------------------------------------------------------------------------ smmon_exit */ -- 1.8.4.3 _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto