📄 interrupts.c
字号:
sint_status &= SINT_MASK; /* isolate SINTA, SINTB, and SINTC */
switch(sint_status)
{
case SINTA_INT:
num_sources += sinta_handler(); /* IRQ0 = SINTA? */
/* printf(" sinta status = %#x\n", sint_status); */
break;
case SINTB_INT:
num_sources += sintb_handler(); /* IRQ1 = SINTB? */
/* printf(" sintb status = %#x\n", sint_status); */
break;
case SINTC_INT:
num_sources += sintc_handler(); /* IRQ2 = SINTC? */
/* printf(" sintc status = %#x\n", sint_status); */
break;
default:
/* printf(" sint? status = %#x\n", sint_status); */
break; /* probably should test for more conditions: 011b, 101b, 110b, 111b */
}
}
}
else /* RI# pin on UART2 is pulled up to 3.3V. Cannot read board revision register, not implemented */
{
num_sources += sinta_handler(); /* IRQ0 = SINTA? */
num_sources += sintb_handler(); /* IRQ1 = SINTB? */
num_sources += sintc_handler(); /* IRQ2 = SINTC? */
}
/* 12/18/00 jwf */
/* Original code */
/* No S_INTA - S_INTC status register, call handlers always */
/* This may change in next revision of board */
/*num_sources += sinta_handler();*/ /* IRQ0 = SINTA? */
/*num_sources += sintb_handler();*/ /* IRQ1 = SINTB? */
/*num_sources += sintc_handler();*/ /* IRQ2 = SINTC? */
/* Read IRQ3 Status Register, and if any of the multiple sources are
interrupting, call corresponding handler */
int_status_reg = (UINT8 *)X3ISR_ADDR;
int_status = *int_status_reg;
{
if (int_status & TIMER_INT) /* timer interrupt? */
{
/* call user ISR, if connected */
if (usr_timer_isr != NULL)
(*usr_timer_isr)(usr_timer_arg);
else
printf ("\nUnhandled Timer Interrupt Detected!\n");
num_sources++;
}
if (int_status & ENET_INT) /* ethernet interrupt? */
{
/* call user ISR, if connected */
if (usr_enet_isr != NULL)
(*usr_enet_isr)(usr_enet_arg);
else
printf ("\nUnhandled Ethernet Interrupt Detected!\n");
num_sources++;
}
if (int_status & UART1_INT) /* uart1 interrupt? */
{
/* call user ISR, if connected */
if (usr_uart1_isr != NULL)
(*usr_uart1_isr)(usr_uart1_arg);
else
printf ("\nUnhandled UART1 Interrupt Detected!\n");
num_sources++;
}
if (int_status & UART2_INT) /* uart2 interrupt? */
{
/* call user ISR, if connected */
if (usr_uart2_isr != NULL)
(*usr_uart2_isr)(usr_uart2_arg);
else
printf ("\nUnhandled UART2 Interrupt Detected!\n");
num_sources++;
}
if (int_status & SINTD_INT) /* SPCI_INTD? */
{
num_sources += sintd_handler();
}
}
/* Read XINT6 Status Register, and if any of the multiple sources are
interrupting, call corresponding handler */
int_status_reg = (UINT8 *)X6ISR_ADDR;
int_status = *int_status_reg;
{
if (int_status & DMA0_INT) /* dma0 interrupt? */
{
if (usr_dma0_isr != NULL)
(*usr_dma0_isr)(usr_dma0_arg);
else
printf ("\nUnhandled DMA Channel 0 Interrupt Detected!\n");
num_sources++;
}
if (int_status & DMA1_INT) /* dma1 interrupt? */
{
if (usr_dma1_isr != NULL)
(*usr_dma1_isr)(usr_dma1_arg);
else
printf ("\nUnhandled DMA Channel 1 Interrupt Detected!\n");
num_sources++;
}
if (int_status & DMA2_INT) /* dma2 interrupt? */
{
if (usr_dma2_isr != NULL)
(*usr_dma2_isr)(usr_dma2_arg);
else
printf ("\nUnhandled DMA Channel 2 Interrupt Detected!\n");
num_sources++;
}
if (int_status & PM_INT) /* performance monitoring interrupt? */
{
if (usr_pm_isr != NULL)
(*usr_pm_isr)(usr_pm_arg);
else
printf ("\nUnhandled Performance Monitoring Unit Interrupt Detected!\n");
num_sources++;
}
if (int_status & AA_INT) /* application accelerator interrupt? */
{
if (usr_aa_isr != NULL)
(*usr_aa_isr)(usr_aa_arg);
else
printf ("\nUnhandled Application Accelerating Unit Interrupt Detected!\n");
num_sources++;
}
}
/* Read XINT7 Status Register, and if any of the multiple sources are
interrupting, call corresponding handler */
int_status_reg = (UINT8 *)X7ISR_ADDR;
int_status = *int_status_reg;
{
if (int_status & I2C_INT) /* i2c interrupt? */
{
if (usr_i2c_isr != NULL)
(*usr_i2c_isr)(usr_i2c_arg);
else
printf ("\nUnhandled I2C Unit Interrupt Detected!\n");
num_sources++;
}
if (int_status & MU_INT) /* messaging unit interrupt? */
{
if (usr_mu_isr != NULL)
(*usr_mu_isr)(usr_mu_arg);
else
printf ("\nUnhandled Messaging Unit Interrupt Detected!\n");
num_sources++;
}
if (int_status & PATU_INT) /* primary ATU / BIST start interrupt? */
{
if (usr_patu_isr != NULL)
(*usr_patu_isr)(usr_patu_arg);
else
printf ("\nUnhandled Primary ATU Interrupt Detected!\n");
num_sources++;
}
}
/* return the number of interrupt sources found */
return (num_sources);
}
/****************************************************************
* nmi_ecc_isr - ECC NMI Interrupt Handler
*
* This module handles the NMI caused by an ECC error.
* For a Single-bit error it does a read-nodify-write
* to correct the error in memory. For a multi-bit or
* nibble error it does absolutely nothing.
*/
void nmi_ecc_isr(void)
{
UINT32 eccr_register;
UINT32* reg32;
/* Read current state of ECC register */
eccr_register = *(UINT32 *)ECCR_ADDR;
/* Turn off all ecc error reporting */
*(UINT32 *)ECCR_ADDR = 0x4;
/* Check for ECC Error 0 */
if(*(UINT32 *)MCISR_ADDR & 0x1)
{
reg32 = (UINT32*)ELOG0_ADDR;
error_print("ELOG0 = 0x%X\n",*reg32,0,0,0);
reg32 = (UINT32*)ECAR0_ADDR;
error_print("ECC Error Detected at Address 0x%X\n",*reg32,0,0,0);
/* Check for single-bit error */
if(!(*(UINT32 *)ELOG0_ADDR & 0x00000100))
{
/* call ECC restoration function */
_scrub_ecc(*reg32);
/* Clear the MCISR */
*(UINT32 *)MCISR_ADDR = 0x1;
}
else
error_print("Multi-bit or nibble error\n",0,0,0,0);
}
/* Check for ECC Error 1 */
if(*(UINT32 *)MCISR_ADDR & 0x2)
{
reg32 = (UINT32*)ELOG1_ADDR;
error_print("ELOG0 = 0x%X\n",*reg32,0,0,0);
reg32 = (UINT32*)ECAR1_ADDR;
error_print("ECC Error Detected at Address 0x%X\n",*reg32,0,0,0);
/* Check for single-bit error */
if(!(*(UINT32 *)ELOG1_ADDR & 0x00000100))
{
/* call ECC restoration function */
_scrub_ecc(*reg32);
/* Clear the MCISR */
*(UINT32 *)MCISR_ADDR = 0x2;
}
else
error_print("Multi-bit or nibble error\n",0,0,0,0);
}
/* Check for ECC Error N */
if(*(UINT32 *)MCISR_ADDR & 0x4)
{
/* Clear the MCISR */
*(UINT32 *)MCISR_ADDR = 0x4;
error_print("Uncorrectable error during RMW\n",0,0,0,0);
}
/* Turn on ecc error reporting */
*(UINT32 *)ECCR_ADDR = eccr_register;
}
/******************************************************************************
* iq80310_fiq_handler - Interrupt dispatcher for IQ80310 FIQ Interrupts
*
*
*/
int iq80310_fiq_handler()
{
unsigned long nmi_status = *(volatile unsigned long *)NISR_ADDR;
unsigned long status;
int srcs_found = 0;
if (nmi_status & MCU_ERROR)
{
status = *(volatile unsigned long *)MCISR_ADDR;
*MSB_DISPLAY_REG = LETTER_E;
if (status & 0x001)
*LSB_DISPLAY_REG = ONE;
if (status & 0x002)
*LSB_DISPLAY_REG = TWO;
if (status & 0x004)
*LSB_DISPLAY_REG = FOUR;
srcs_found++;
#if 0
error_print ("**** 80312 Memory Controller Error ****\n",0,0,0,0);
if (status & 0x001) error_print ("One ECC Error Detected and Recorded in ELOG0\n",0,0,0,0);
if (status & 0x002) error_print ("Second ECC Error Detected and Recorded in ELOG1\n",0,0,0,0);
if (status & 0x004) error_print ("Multiple ECC Errors Detected\n",0,0,0,0);
#endif
/* call ecc interrupt handler */
nmi_ecc_isr();
/* clear the interrupt condition*/
AND_WORD((volatile unsigned long *)MCISR_ADDR, 0x07);
/* 02/02/01 jwf */
ecc_error_reported = TRUE;
}
if (nmi_status & PATU_ERROR)
{
srcs_found++;
error_print ("**** Primary ATU Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)PATUISR_ADDR;
if (status & 0x001) error_print ("PPCI Master Parity Error\n",0,0,0,0);
if (status & 0x002) error_print ("PPCI Target Abort (target)\n",0,0,0,0);
if (status & 0x004) error_print ("PPCI Target Abort (master)\n",0,0,0,0);
if (status & 0x008) error_print ("PPCI Master Abort\n",0,0,0,0);
if (status & 0x010) error_print ("Primary P_SERR# Detected\n",0,0,0,0);
if (status & 0x080) error_print ("Internal Bus Master Abort\n",0,0,0,0);
if (status & 0x100) error_print ("PATU BIST Interrupt\n",0,0,0,0);
if (status & 0x200) error_print ("PPCI Parity Error Detected\n",0,0,0,0);
if (status & 0x400) error_print ("Primary P_SERR# Asserted\n",0,0,0,0);
/* clear the interrupt conditions */
AND_WORD((volatile unsigned long *)PATUISR_ADDR, 0x79f);
CLEAR_PATU_STATUS();
/* tell the config cleanup code about error */
if (pci_config_cycle == 1)
pci_config_error = TRUE;
}
if (nmi_status & SATU_ERROR)
{
srcs_found++;
error_print ("**** Secondary ATU Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)SATUISR_ADDR;
if (status & 0x001) error_print ("SPCI Master Parity Error\n",0,0,0,0);
if (status & 0x002) error_print ("SPCI Target Abort (target)\n",0,0,0,0);
if (status & 0x004) error_print ("SPCI Target Abort (master)\n",0,0,0,0);
if (status & 0x008) error_print ("SPCI Master Abort\n",0,0,0,0);
if (status & 0x010) error_print ("Secondary P_SERR# Detected\n",0,0,0,0);
if (status & 0x080) error_print ("Internal Bus Master Abort\n",0,0,0,0);
if (status & 0x200) error_print ("SPCI Parity Error Detected\n",0,0,0,0);
if (status & 0x400) error_print ("Secondary S_SERR# Asserted\n",0,0,0,0);
/* clear the interrupt conditions */
AND_WORD((volatile unsigned long *)SATUISR_ADDR, 0x69f);
CLEAR_SATU_STATUS();
/* tell the config cleanup code about error */
if (pci_config_cycle == 1)
pci_config_error = TRUE;
}
if (nmi_status & PBRIDGE_ERROR)
{
srcs_found++;
error_print ("**** Primary Bridge Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)PBISR_ADDR;
if (status & 0x001) error_print ("PPCI Master Parity Error\n",0,0,0,0);
if (status & 0x002) error_print ("PPCI Target Abort (Target)\n",0,0,0,0);
if (status & 0x004) error_print ("PPCI Target Abort (Master)\n",0,0,0,0);
if (status & 0x008) error_print ("PPCI Master Abort\n",0,0,0,0);
if (status & 0x010) error_print ("Primary P_SERR# Asserted\n",0,0,0,0);
if (status & 0x020) error_print ("PPCI Parity Error Detected\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)PBISR_ADDR, 0x3f);
CLEAR_PBRIDGE_STATUS();
/* tell the config cleanup code about error */
if (pci_config_cycle == 1)
pci_config_error = TRUE;
}
if (nmi_status & SBRIDGE_ERROR)
{
srcs_found++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -