Permalink
Browse files

First bunch of bugfixes to UIC code. Initialization works now.

  • Loading branch information...
1 parent 1bfcd3e commit e1233c83be4b5bc89b1121bf921fe170aa48cef2 Jens Kehne committed Jun 23, 2010
Showing with 66 additions and 72 deletions.
  1. +3 −0 .hgignore
  2. +57 −64 kernel/src/platform/ppc44x/uic.cc
  3. +6 −8 kernel/src/platform/ppc44x/uic.h
View
@@ -27,3 +27,6 @@ syntax: regexp
syntax: regexp
^user-install$
+
+syntax: regexp
+^kernel/src/generic/simics\.h$
@@ -30,6 +30,7 @@
********************************************************************/
#include <debug.h>
#include <kdb/tracepoints.h>
+#include <generic/simics.h>
#include <lib.h>
#include INC_ARCH(string.h)
@@ -47,124 +48,116 @@ void SECTION (".init") intctrl_t::init_arch()
fdt_property_t *prop;
//Controller 0
+ printf("Looking for interrupt controller 0... ");
hdr = fdt->find_subtree("/interrupt-controller0");
if (!hdr)
panic("Couldn't find interrupt controller 0 in FDT\n");
+ else
+ printf("found!\n");
+ printf("Checking whether UIC0 is compatible... ");
prop = fdt->find_property_node(hdr, "compatible");
- if (!prop || strcmp(prop->get_string(), "ibm,uic") || strcmp(prop->get_string(), "ibm,uic-440gp") != 0)
- panic("UIC0: Couldn't find compatible node in FDT\n");
+ if ((!prop) || ((strcmp(prop->get_string(), "ibm,uic") != 0) && (strcmp(prop->get_string(), "ibm,uic-440gp") != 0)))
+ panic("UIC0: Couldn't find compatible node in FDT\ncompatibility string was %s",prop->get_string());
+ else
+ printf("it is!\n");
+ printf("Looking for UIC0's DCR base address... ");
prop = fdt->find_property_node(hdr, "dcr-reg");
- //FIXME: What is the right size?
if (!prop) // || prop->get_len() != 2 * sizeof(u32_t))
panic("UIC0: Couldn't find 'dcr-reg' node in FDT (%p, %d)\n",
prop, prop->get_len());
- UIC0_DCR_BASE = prop->get_word(0); //FIXME: Is this really a full word or just 6 bits?
-
- //FIXME: Check if lengh is 9
-#if 0
- mem_size = prop->get_word(2);
-#endif
+ if (UIC0_DCR_BASE == prop->get_word(0))
+ printf("Found at 0x%x\n",UIC0_DCR_BASE);
+ else
+ panic("UIC0 is not at its expected DCR base address!");
- //TODO: What is this? Only one controller has it.
-#if 0
- prop = fdt->find_property_node(hdr, "interrupts");
- if (!prop || prop->get_len() != sizeof(u32_t))
- panic("UIC0: Couldn't find valid 'interrupts' node in FDT\n");
+ if (prop->get_word(1) != 9)
+ panic("Invalid number of control registers found (%d)",prop->get_word(1));
- num_irqs = prop->get_word(0);
- if (num_irqs > BGP_MAX_IRQS)
- panic("UIC0: reported number IRQs of %d exceeds specification\n", num_irqs);
+#if defined(PPC440EPx)
+ num_irqs=30;
#else
- num_irqs=31; //FIXME
+ num_irqs=31;
#endif
- TRACE_INIT("UIC0: %x, %d interrupts\n",
+ TRACE_INIT("UIC0: DCR base 0x%x, %d interrupts\n",
UIC0_DCR_BASE, num_irqs);
//Controller 1
+ printf("Looking for interrupt controller 1... ");
hdr = fdt->find_subtree("/interrupt-controller1");
if (!hdr)
- panic("Couldn't find interrupt controller 1 in FDT\n");
+ panic("Couldn't find interrupt controller 1 in FDT\n");
+ else
+ printf("found!\n");
+ printf("Checking whether UIC1 is compatible... ");
prop = fdt->find_property_node(hdr, "compatible");
- if (!prop || strcmp(prop->get_string(), "ibm,uic") || strcmp(prop->get_string(), "ibm,uic-440gp") != 0)
- panic("UIC1: Couldn't find compatible node in FDT\n");
+ if ((!prop) || ((strcmp(prop->get_string(), "ibm,uic") != 0) && (strcmp(prop->get_string(), "ibm,uic-440gp") != 0)))
+ panic("UIC1: Couldn't find compatible node in FDT\ncompatibility string was %s",prop->get_string());
+ else
+ printf("it is!\n");
+ printf("Looking for UIC1's DCR base address... ");
prop = fdt->find_property_node(hdr, "dcr-reg");
- //FIXME: What is the right size?
if (!prop) // || prop->get_len() != 2 * sizeof(u32_t))
panic("UIC1: Couldn't find 'dcr-reg' node in FDT (%p, %d)\n",
prop, prop->get_len());
- UIC1_DCR_BASE = prop->get_word(0); //FIXME: Is this really a full word or just 6 bits?
+ if (UIC1_DCR_BASE == prop->get_word(0))
+ printf("Found at 0x%x\n",UIC1_DCR_BASE);
+ else
+ panic("UIC1 is not at its expected DCR base address!");
- //FIXME: Check if lengh is 9
-#if 0
- mem_size = prop->get_word(2);
-#endif
+ if (prop->get_word(1) != 9)
+ panic("UIC1: Invalid number of control registers found (%d)",prop->get_word(1));
- //TODO: What is this? Only one controller has it.
-#if 0
- prop = fdt->find_property_node(hdr, "interrupts");
- if (!prop || prop->get_len() != sizeof(u32_t))
- panic("UIC1: Couldn't find valid 'interrupts' node in FDT\n");
+ num_irqs=32;
- num_irqs = prop->get_word(0);
- if (num_irqs > BGP_MAX_IRQS)
- panic("UIC1: reported number IRQs of %d exceeds specification\n", num_irqs);
-#else
- num_irqs=32; //FIXME
-#endif
-
- TRACE_INIT("UIC1: %x, %d interrupts\n",
+ TRACE_INIT("UIC1: DCR base 0x%x, %d interrupts\n",
UIC1_DCR_BASE, num_irqs);
//Controller 2
#if defined(PPC440EPx)
+ printf("Looking for interrupt controller 2... ");
hdr = fdt->find_subtree("/interrupt-controller2");
if (!hdr)
- panic("Couldn't find interrupt controller 2 in FDT\n");
+ panic("Couldn't find interrupt controller 2 in FDT\n");
+ else
+ printf("found!\n");
+ printf("Checking whether UIC2 is compatible... ");
prop = fdt->find_property_node(hdr, "compatible");
- if (!prop || strcmp(prop->get_string(), "ibm,uic") || strcmp(prop->get_string(), "ibm,uic-440gp") != 0)
- panic("UIC2: Couldn't find compatible node in FDT\n");
+ if ((!prop) || ((strcmp(prop->get_string(), "ibm,uic") != 0) && (strcmp(prop->get_string(), "ibm,uic-440gp") != 0)))
+ panic("UIC2: Couldn't find compatible node in FDT\ncompatibility string was %s",prop->get_string());
+ else
+ printf("it is!\n");
+ printf("Looking for UIC2's DCR base address... ")
prop = fdt->find_property_node(hdr, "dcr-reg");
- //FIXME: What is the right size?
if (!prop) // || prop->get_len() != 2 * sizeof(u32_t))
panic("UIC2: Couldn't find 'dcr-reg' node in FDT (%p, %d)\n",
prop, prop->get_len());
- UIC2_DCR_BASE = prop->get_word(0); //FIXME: Is this really a full word or just 6 bits?
-
- //FIXME: Check if lengh is 9
-#if 0
- mem_size = prop->get_word(2);
-#endif
+ if (UIC2_DCR_BASE == prop->get_word(0))
+ printf("Found at 0x%x\n",UIC2_DCR_BASE);
+ else
+ panic("UIC2 is not at its expected DCR base address!")
- //TODO: What is this? Only one controller has it.
-#if 0
- prop = fdt->find_property_node(hdr, "interrupts");
- if (!prop || prop->get_len() != sizeof(u32_t))
- panic("UIC2: Couldn't find valid 'interrupts' node in FDT\n");
+ if (prop->get_word(1) != 9)
+ panic("UIC2: Invalid number of control registers found (%d)",prop->get_word(1));
- num_irqs = prop->get_word(0);
- if (num_irqs > BGP_MAX_IRQS)
- panic("UIC2: reported number IRQs of %d exceeds specification\n", num_irqs);
-#else
- num_irqs=32; //FIXME
-#endif
+ num_irqs=32;
- TRACE_INIT("UIC2: %x, %d interrupts\n",
+ TRACE_INIT("UIC2: DCR base 0x%x, %d interrupts\n",
UIC2_DCR_BASE, num_irqs);
-#endif
+#endif //PPC440EPx
init_controllers();
// route all IRQs to CPU0
@@ -38,16 +38,20 @@
#define mfdcr(rn) \
({ \
unsigned long rval; \
- asm volatile("mfdcr %0,%1" : "=r"(rval) : "r"(rn)); \
+ asm volatile("mfdcr %0,%1" : "=r"(rval) : "i"(rn)); \
rval; \
})
-#define mtdcr(rn, val) asm volatile("mtdcr %0,%1" : : "r"(rn), "r"(val))
+#define mtdcr(rn, val) asm volatile("mtdcr %0,%1" : : "i"(rn), "r"(val))
/*
* Universal Interrupt Controller register definitions. Each is a separate
* DCR register.
*/
+#define UIC0_DCR_BASE 0xc0
+#define UIC1_DCR_BASE 0xd0
+//FIXME: What is the correct base address for UIC2?
+
#define UIC0_SR (UIC0_DCR_BASE+0x0) /* UIC status */
#define UIC0_SRS (UIC0_DCR_BASE+0x1) /* UIC status register set */
#define UIC0_ER (UIC0_DCR_BASE+0x2) /* UIC enable */
@@ -190,12 +194,6 @@ class intctrl_t : public generic_intctrl_t
u8_t routing[BGP_MAX_IRQS / 4]; // 4 IRQs per byte
spinlock_t lock;
word_t num_irqs;
-
- word_t UIC0_DCR_BASE;
- word_t UIC1_DCR_BASE;
-#if defined(PPC440EPx)
- word_t UIC2_DCR_BASE;
-#endif
word_t mem_size;
word_t init_controllers();

0 comments on commit e1233c8

Please sign in to comment.