[U-Boot-Users] [PATCH] Improve handling of PCI interrupt device tree fixup on MPC85xx CDS

Kumar Gala galak at kernel.crashing.org
Thu Oct 11 07:34:04 CEST 2007


On the MPC85xx CDS we have two issues:

1. The device tree fixup code did not check to see if the property we are
trying to update is actually found.  Its possible that it would update
random memory starting at 0.

2. Newer Linux kernel's have moved the location of the PCI nodes to be
sibilings of the soc node and not children.  The explicit PATH to the PCI
node would not be found for these device trees.  Add the ability to handle
both paths.  In the future we shouldn't handle such fixups by explicit path.

Signed-off-by: Kumar Gala <galak at kernel.crashing.org>
---

This is a fix that really needs to go into 1.3.0.  We've seen a number of
issues pop up because of this.  Randy Vinson pointed me at this code being
at fault for an issue in which ramdisks didn't work with newer
kernels/device trees.

 board/cds/common/ft_board.c  |   23 +++++++++++++++--------
 include/configs/MPC8541CDS.h |    1 +
 include/configs/MPC8548CDS.h |    1 +
 include/configs/MPC8555CDS.h |    1 +
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/board/cds/common/ft_board.c b/board/cds/common/ft_board.c
index 9d97905..3eda100 100644
--- a/board/cds/common/ft_board.c
+++ b/board/cds/common/ft_board.c
@@ -37,17 +37,24 @@ static void cds_pci_fixup(void *blob)

 	map = ft_get_prop(blob, "/" OF_SOC "/pci at 8000/interrupt-map", &len);

-	len /= sizeof(u32);
+	if (!map)
+		map = ft_get_prop(blob, "/" OF_PCI "/interrupt-map", &len);

-	slot = get_pci_slot();
+	if (map) {
+		len /= sizeof(u32);

-	for (i=0;i<len;i+=7) {
-		/* We rotate the interrupt pins so that the mapping
-		 * changes depending on the slot the carrier card is in.
-		 */
-		map[3] = ((map[3] + slot - 2) % 4) + 1;
+		slot = get_pci_slot();

-		map+=7;
+		for (i=0;i<len;i+=7) {
+			/* We rotate the interrupt pins so that the mapping
+			 * changes depending on the slot the carrier card is in.
+			 */
+			map[3] = ((map[3] + slot - 2) % 4) + 1;
+
+			map+=7;
+		}
+	} else {
+		printf("*** Warning - No PCI node found\n");
 	}
 }
 #endif
diff --git a/include/configs/MPC8541CDS.h b/include/configs/MPC8541CDS.h
index 4e061bd..8dda665 100644
--- a/include/configs/MPC8541CDS.h
+++ b/include/configs/MPC8541CDS.h
@@ -316,6 +316,7 @@ extern unsigned long get_clock_freq(void);
 #define OF_SOC			"soc8541 at e0000000"
 #define OF_TBCLK		(bd->bi_busfreq / 8)
 #define OF_STDOUT_PATH		"/soc8541 at e0000000/serial at 4600"
+#define OF_PCI			"pci at e0008000"

 /*
  * I2C
diff --git a/include/configs/MPC8548CDS.h b/include/configs/MPC8548CDS.h
index 6083715..4edc7fd 100644
--- a/include/configs/MPC8548CDS.h
+++ b/include/configs/MPC8548CDS.h
@@ -340,6 +340,7 @@ extern unsigned long get_clock_freq(void);
 #define OF_SOC			"soc8548 at e0000000"
 #define OF_TBCLK		(bd->bi_busfreq / 8)
 #define OF_STDOUT_PATH		"/soc8548 at e0000000/serial at 4600"
+#define OF_PCI			"pci at e0008000"

 /*
  * I2C
diff --git a/include/configs/MPC8555CDS.h b/include/configs/MPC8555CDS.h
index 1d1b7c9..c414bf0 100644
--- a/include/configs/MPC8555CDS.h
+++ b/include/configs/MPC8555CDS.h
@@ -316,6 +316,7 @@ extern unsigned long get_clock_freq(void);
 #define OF_SOC			"soc8555 at e0000000"
 #define OF_TBCLK		(bd->bi_busfreq / 8)
 #define OF_STDOUT_PATH		"/soc8555 at e0000000/serial at 4600"
+#define OF_PCI			"pci at e0008000"

 /*
  * I2C
-- 
1.5.2.4





More information about the U-Boot mailing list