📄 interrupts.c
字号:
/* don't print configuration secondary bridge errors */
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)SBISR_ADDR, 0x7f);
CLEAR_SBRIDGE_STATUS();
/* tell the config cleanup code about error */
if (pci_config_cycle == 1)
pci_config_error = TRUE;
}
if (nmi_status & DMA_0_ERROR)
{
srcs_found++;
error_print ("**** DMA Channel 0 Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)CSR0_ADDR;
if (status & 0x001) error_print ("DMA Channel 0 PCI Parity Error\n",0,0,0,0);
if (status & 0x004) error_print ("DMA Channel 0 PCI Target Abort\n",0,0,0,0);
if (status & 0x008) error_print ("DMA Channel 0 PCI Master Abort\n",0,0,0,0);
if (status & 0x020) error_print ("Internal PCI Master Abort\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)CSR0_ADDR, 0x2D);
}
if (nmi_status & DMA_1_ERROR)
{
srcs_found++;
error_print ("**** DMA Channel 1 Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)CSR1_ADDR;
if (status & 0x001) error_print ("DMA Channel 1 PCI Parity Error\n",0,0,0,0);
if (status & 0x004) error_print ("DMA Channel 1 PCI Target Abort\n",0,0,0,0);
if (status & 0x008) error_print ("DMA Channel 1 PCI Master Abort\n",0,0,0,0);
if (status & 0x020) error_print ("Internal PCI Master Abort\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)CSR1_ADDR, 0x2D);
}
if (nmi_status & DMA_2_ERROR)
{
srcs_found++;
error_print ("**** DMA Channel 2 Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)CSR2_ADDR;
if (status & 0x001) error_print ("DMA Channel 2 PCI Parity Error\n",0,0,0,0);
if (status & 0x004) error_print ("DMA Channel 2 PCI Target Abort\n",0,0,0,0);
if (status & 0x008) error_print ("DMA Channel 2 PCI Master Abort\n",0,0,0,0);
if (status & 0x020) error_print ("Internal PCI Master Abort\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)CSR2_ADDR, 0x2D);
}
if (nmi_status & MU_ERROR)
{
status = *(volatile unsigned long *)IISR_ADDR;
if (status & 0x20)
{
srcs_found++;
error_print ("Messaging Unit Outbound Free Queue Overflow\n",0,0,0,0);
/* clear the interrupt condition; note that the clearing of the NMI doorbell
is handled by the PCI comms code */
} AND_WORD((volatile unsigned long *)IISR_ADDR, 0x20);
}
if (nmi_status & AAU_ERROR)
{
srcs_found++;
error_print ("**** Application Accelerator Unit Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)ASR_ADDR;
if (status & 0x020) error_print ("Internal PCI Master Abort\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)ASR_ADDR, 0x20);
}
if (nmi_status & BIU_ERROR)
{
srcs_found++;
error_print ("**** Bus Interface Unit Error ****\n",0,0,0,0);
status = *(volatile unsigned long *)BIUISR_ADDR;
if (status & 0x004) error_print ("Internal PCI Master Abort\n",0,0,0,0);
/* clear the interrupt condition */
AND_WORD((volatile unsigned long *)BIUISR_ADDR, 0x04);
}
return (srcs_found);
}
/**********************************************************************
* isr_connect - Disconnect a user Interrupt Service Routine
*
* NOT TO BE USED FOR SPCI INTERRUPTS! - use pci_isr_connect instead
*
*/
int isr_connect(int int_num, void (*handler)(int), int arg)
{
switch (int_num)
{
case DMA0_INT_ID:
usr_dma0_isr = handler;
usr_dma0_arg = arg;
break;
case DMA1_INT_ID:
usr_dma1_isr = handler;
usr_dma1_arg = arg;
break;
case DMA2_INT_ID:
usr_dma2_isr = handler;
usr_dma2_arg = arg;
break;
case PM_INT_ID:
usr_pm_isr = handler;
usr_pm_arg = arg;
break;
case AA_INT_ID:
usr_aa_isr = handler;
usr_aa_arg = arg;
break;
case I2C_INT_ID:
usr_i2c_isr = handler;
usr_i2c_arg = arg;
break;
case MU_INT_ID:
usr_mu_isr = handler;
usr_mu_arg = arg;
break;
case PATU_INT_ID:
usr_patu_isr = handler;
usr_patu_arg = arg;
break;
case TIMER_INT_ID:
usr_timer_isr = handler;
usr_timer_arg = arg;
break;
case ENET_INT_ID:
usr_enet_isr = handler;
usr_enet_arg = arg;
break;
case UART1_INT_ID:
usr_uart1_isr = handler;
usr_uart1_arg = arg;
break;
case UART2_INT_ID:
usr_uart2_isr = handler;
usr_uart2_arg = arg;
break;
default:
return (ERROR);
break;
}
return (OK);
}
/**********************************************************************
* isr_disconnect - Disconnect a user Interrupt Service Routine
*
* NOT TO BE USED FOR SPCI INTERRUPTS! - use pci_isr_disconnect instead
*
*/
int isr_disconnect(int int_num)
{
switch (int_num)
{
case DMA0_INT_ID:
usr_dma0_isr = NULL;
usr_dma0_arg = 0;
break;
case DMA1_INT_ID:
usr_dma1_isr = NULL;
usr_dma1_arg = 0;
break;
case DMA2_INT_ID:
usr_dma2_isr = NULL;
usr_dma2_arg = 0;
break;
case PM_INT_ID:
usr_pm_isr = NULL;
usr_pm_arg = 0;
break;
case AA_INT_ID:
usr_aa_isr = NULL;
usr_aa_arg = 0;
break;
case I2C_INT_ID:
usr_i2c_isr = NULL;
usr_i2c_arg = 0;
break;
case MU_INT_ID:
usr_mu_isr = NULL;
usr_mu_arg = 0;
break;
case PATU_INT_ID:
usr_patu_isr = NULL;
usr_patu_arg = 0;
break;
case TIMER_INT_ID:
usr_timer_isr = NULL;
usr_timer_arg = 0;
break;
case ENET_INT_ID:
usr_enet_isr = NULL;
usr_enet_arg = 0;
break;
case UART1_INT_ID:
usr_uart1_isr = NULL;
usr_uart1_arg = 0;
break;
case UART2_INT_ID:
usr_uart2_isr = NULL;
usr_uart2_arg = 0;
break;
default:
return (ERROR);
break;
}
/* i960 disabled interrupt here - should we? */
return (OK);
}
/********************************************************************
* disable_external_interrupt - Mask an external interrupt
*
*/
int disable_external_interrupt(int int_id)
{
unsigned char* ext_mask_reg = (unsigned char*) X3MASK_ADDR;
unsigned char new_mask_value;
/* make sure interrupt to enable is an external interrupt */
if ((int_id < TIMER_INT_ID) || (int_id > SINTD_INT_ID))
return (ERROR);
new_mask_value = *ext_mask_reg; /* read current mask status */
switch (int_id)
{
case TIMER_INT_ID:
new_mask_value |= TIMER_INT;
break;
case ENET_INT_ID:
new_mask_value |= ENET_INT;
break;
case UART1_INT_ID:
new_mask_value |= UART1_INT;
break;
case UART2_INT_ID:
new_mask_value |= UART2_INT;
break;
case SINTD_INT_ID:
new_mask_value |= SINTD_INT;
break;
default:
break; /* leave mask register as it was */
}
*ext_mask_reg = new_mask_value; /* set new mask value */
return (OK);
}
/********************************************************************
* enable_external_interrupt - Unmask an external interrupt
*
*/
int enable_external_interrupt(int int_id)
{
unsigned char* ext_mask_reg = (unsigned char*) X3MASK_ADDR;
unsigned char new_mask_value;
/* make sure interrupt to enable is an external interrupt */
if ((int_id < TIMER_INT_ID) || (int_id > SINTD_INT_ID))
return (ERROR);
new_mask_value = *ext_mask_reg; /* read current mask status */
switch (int_id)
{
case TIMER_INT_ID:
new_mask_value &= ~(TIMER_INT);
break;
case ENET_INT_ID:
new_mask_value &= ~(ENET_INT);
break;
case UART1_INT_ID:
new_mask_value &= ~(UART1_INT);
break;
case UART2_INT_ID:
new_mask_value &= ~(UART2_INT);
break;
case SINTD_INT_ID:
new_mask_value &= ~(SINTD_INT);
break;
default:
break; /* leave mask register as it was */
}
*ext_mask_reg = new_mask_value; /* set new mask value */
return (OK);
}
void error_print (
char *fmt,
int arg0,
int arg1,
int arg2,
int arg3
)
{
/* Wait until host configures the boards to start printing NMI errors */
UINT32* atu_reg = (UINT32*)PIABAR_ADDR;
if ((*atu_reg & 0xfffffff0) == 0)
return;
if (nmi_verbose) printf (fmt, arg0, arg1, arg2, arg3);
return;
}
extern void __diag_IRQ(void);
extern void __diag_FIQ(void);
void config_ints()
{
int xint, x;
unsigned int* pirsr_ptr = (unsigned int*)PIRSR_ADDR;
*pirsr_ptr = 0xf; /* this is an errata in the original Yavapai manual.
The interrupt steering bits are reversed, so a '1'
routes XINT interrupts to FIQ
*/
/* install diag IRQ handlers */
((volatile unsigned *)0x20)[6] = (unsigned)__diag_IRQ;
((volatile unsigned *)0x20)[7] = (unsigned)__diag_FIQ;
_flushICache();
/* make sure interrupts are enabled in CSPR */
_cspr_enable_irq_int();
_cspr_enable_fiq_int();
/* initialize the PCI interrupt table */
for (xint = 0; xint < NUM_PCI_XINTS; xint++)
{
for (x = 0; x < MAX_PCI_HANDLERS; x++)
{
pci_int_handlers[xint][x].handler = NULL;
pci_int_handlers[xint][x].arg = (int)NULL;
pci_int_handlers[xint][x].bus = (int)NULL;
pci_int_handlers[xint][x].device = (int)NULL;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -