Index: kernel/genarch/src/ofw/ebus.c
===================================================================
--- kernel/genarch/src/ofw/ebus.c	(revision e2cc9a09d69ac8aab988fa3f12b67e7a42704641)
+++ kernel/genarch/src/ofw/ebus.c	(revision 8ce84991b196fbdd0b7d639a36b146cf784f38fb)
@@ -37,5 +37,4 @@
 
 #include <genarch/ofw/ofw_tree.h>
-#include <arch/drivers/pci.h>
 #include <arch/memstr.h>
 #include <arch/trap/interrupt.h>
@@ -78,5 +77,5 @@
 }
 
-bool ofw_ebus_map_interrupts(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *inr)
+bool ofw_ebus_map_interrupt(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *inr)
 {
 	ofw_tree_property_t *prop;
@@ -115,7 +114,5 @@
 	/*
 	 * We found the device that functions as an interrupt controller
-	 * for the interrupt. We also found mapping from interrupt to INR.
-	 * What needs to be done now is to verify that this indeed is a PCI
-	 * node.
+	 * for the interrupt. We also found partial mapping from interrupt to INO.
 	 */
 
@@ -131,17 +128,10 @@
 	}
 
-	pci_t *pci = controller->device;
-	if (!pci) {
-		pci = pci_init(controller);
-		if (!pci)
-			return false;
-		controller->device = pci;
-		
-	}
-	pci_enable_interrupt(pci, intr_map[i].controller_inr);
+	/*
+	 * Let the PCI do the next step in mapping the interrupt.
+	 */
+	if (!ofw_pci_map_interrupt(controller, NULL, intr_map[i].controller_ino, inr))
+		return false;
 
-	*inr = intr_map[i].controller_inr;
-	*inr |= 0x1f << IGN_SHIFT;		/* 0x1f is hardwired IGN */
-	
 	return true;
 }
Index: kernel/genarch/src/ofw/fhc.c
===================================================================
--- kernel/genarch/src/ofw/fhc.c	(revision e2cc9a09d69ac8aab988fa3f12b67e7a42704641)
+++ kernel/genarch/src/ofw/fhc.c	(revision 8ce84991b196fbdd0b7d639a36b146cf784f38fb)
@@ -110,5 +110,5 @@
 }
 
-bool ofw_fhc_map_interrupts(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uint32_t interrupt, int *inr)
+bool ofw_fhc_map_interrupt(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uint32_t interrupt, int *inr)
 {
 	fhc_t *fhc = NULL;
Index: kernel/genarch/src/ofw/pci.c
===================================================================
--- kernel/genarch/src/ofw/pci.c	(revision e2cc9a09d69ac8aab988fa3f12b67e7a42704641)
+++ kernel/genarch/src/ofw/pci.c	(revision 8ce84991b196fbdd0b7d639a36b146cf784f38fb)
@@ -37,4 +37,6 @@
 
 #include <genarch/ofw/ofw_tree.h>
+#include <arch/drivers/pci.h>
+#include <arch/trap/interrupt.h>
 #include <arch/memstr.h>
 #include <func.h>
@@ -45,4 +47,6 @@
 #define PCI_ABS_MASK		0x80000000	
 #define PCI_REG_MASK		0x000000ff
+
+#define PCI_IGN			0x1f
 
 bool ofw_pci_apply_ranges(ofw_tree_node_t *node, ofw_pci_reg_t *reg, uintptr_t *pa)
@@ -111,4 +115,26 @@
 }
 
+/** Map PCI interrupt.
+ *
+ * So far, we only know how to map interrupts of non-PCI devices connected
+ * to a PCI bridge.
+ */
+bool ofw_pci_map_interrupt(ofw_tree_node_t *node, ofw_pci_reg_t *reg, int ino, int *inr)
+{
+	pci_t *pci = node->device;
+	if (!pci) {
+		pci = pci_init(node);
+		if (!pci)
+			return false;
+		node->device = pci;
+	}
+
+	pci_enable_interrupt(pci, ino);
+
+	*inr = (PCI_IGN << IGN_SHIFT) | ino;
+
+	return true;
+}
+
 /** @}
  */
