From 852f925c55f3c10028a69e4949b693a2562467e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Mon, 12 Jan 2015 07:25:16 +0000 Subject: [PATCH] implemented initial version of XLB PCI interrupt handler. For now it just reports and clears errors. --- BaS_gcc/sys/BaS.c | 12 ++++++------ BaS_gcc/sys/interrupts.c | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/BaS_gcc/sys/BaS.c b/BaS_gcc/sys/BaS.c index 8b20429..b6d2fee 100644 --- a/BaS_gcc/sys/BaS.c +++ b/BaS_gcc/sys/BaS.c @@ -321,12 +321,12 @@ void init_isr(void) } MCF_XLB_XARB_IMR = MCF_XLB_XARB_IMR_SEAE | /* slave error acknowledge interrupt */ - MCF_XLB_XARB_IMR_MME | /* multiple master at prio 0 interrupt */ - MCF_XLB_XARB_IMR_TTAE | /* TT address only interrupt */ - MCF_XLB_XARB_IMR_TTRE | /* TT reserved interrupt enable */ - MCF_XLB_XARB_IMR_ECWE | /* external control word interrupt */ - MCF_XLB_XARB_IMR_TTME | /* TBST/TSIZ mismatch interrupt */ - MCF_XLB_XARB_IMR_BAE; /* bus activity tenure timeout interrupt */ + MCF_XLB_XARB_IMR_MME | /* multiple master at prio 0 interrupt */ + MCF_XLB_XARB_IMR_TTAE | /* TT address only interrupt */ + MCF_XLB_XARB_IMR_TTRE | /* TT reserved interrupt enable */ + MCF_XLB_XARB_IMR_ECWE | /* external control word interrupt */ + MCF_XLB_XARB_IMR_TTME | /* TBST/TSIZ mismatch interrupt */ + MCF_XLB_XARB_IMR_BAE; /* bus activity tenure timeout interrupt */ if (!isr_register_handler(64 + INT_SOURCE_PCIARB, 7, 1, pciarb_interrupt_handler, NULL, NULL)) { diff --git a/BaS_gcc/sys/interrupts.c b/BaS_gcc/sys/interrupts.c index fead8ad..c6f8ca9 100644 --- a/BaS_gcc/sys/interrupts.c +++ b/BaS_gcc/sys/interrupts.c @@ -263,8 +263,29 @@ bool pic_interrupt_handler(void *arg1, void *arg2) bool xlbpci_interrupt_handler(void *arg1, void *arg2) { + uint32_t reason; + dbg("XLB PCI interrupt\r\n"); + reason = MCF_PCI_PCIISR; + + if (reason & MCF_PCI_PCIISR_RE) + { + err("Retry error. Retry terminated or max retries reached. Cleared\r\n"); + MCF_PCI_PCIISR |= MCF_PCI_PCIISR_RE; + } + + if (reason & MCF_PCI_PCIISR_IA) + { + err("Initiator abort. No target answered in time. Cleared.\r\n"); + MCF_PCI_PCIISR |= MCF_PCI_PCIISR_IA; + } + + if (reason & MCF_PCI_PCIISR_TA) + { + err("Target abort. Cleared.\r\n"); + MCF_PCI_PCIISR |= MCF_PCI_PCIISR_TA; + } return true; }