rs/6000 e30 + 240 (doral) support
Christoph Hellwig
hch at lst.de
Fri Jul 30 00:16:31 EST 2004
On Thu, Jul 29, 2004 at 11:04:48AM -0300, Gustavo Barbieri wrote:
> > Most doesn't look too bad to me, but it's a lot of patches. I vaguely
> > remember they were discussed on linuxppc-dev, so we should check the
> > comments over there.
>
> A lot of patches? Well, there is a lot of "code"... it's not really
> code, but just structure definitions... actually the patche touches
> the real code at few points, one it's just a null pointer checking,
> other are added cases to the switch statement so it can handle those
> boards, so I really can't a problem there.
>
> I already sent an email to linuxppc-dev in the past, but no replies:
>
> http://lists.linuxppc.org/linuxppc-dev/200407/msg00085.html
Ah sorry, I confused it with Len's big IBM prep patchkit. Except for a
tiny style issue this patch is fine with me.
Any upstream comments as I'd hate to carry along a patch like that in
the Debian patchkit while we'd probably want it in Sarge.
Gustavo, if we apply this patch you'll have to sign up for d-i testing
on prep, though ;-)
diff -Naur linux-2.6.6-orig/arch/ppc/platforms/prep_pci.c linux-2.6.6/arch/ppc/platforms/prep_pci.c
--- linux-2.6.6-orig/arch/ppc/platforms/prep_pci.c 2004-05-09 23:33:20.000000000 -0300
+++ linux-2.6.6/arch/ppc/platforms/prep_pci.c 2004-06-01 19:06:41.000000000 -0300
@@ -42,6 +42,75 @@
/* Tables for known hardware */
+/*
+ * IBM RS/6000 7043-240 -- Leigh Brown
+ * XXX we should get all this from the residual data
+ */
+static char ibm_doral_pci_IRQ_map[23] __prepdata = {
+ 0, /* Slot 0 - unused */
+ 3, /* Slot 1 - PCI Slot 1 device 0x08 */
+ 5, /* Slot 2 - PCI Slot 3 device 0x10 */
+ 11, /* Slot 3 - PCI Slot 5 device 0x18 */
+ 2, /* Slot 4 - Integrated PCI device 0x20 */
+ 1, /* Slot 5 - Integrated PCI device 0x28 */
+ 0, /* Slot 6 - Integrated PCI device 0x30 - no IRQ */
+ 0, /* Slot 7 - Integrated PCI device 0x38 - no IRQ */
+ 0, /* Slot 8 - unused */
+ 0, /* Slot 9 - unused */
+ 0, /* Slot 10 - unused */
+ 0, /* Slot 11 - unused */
+ 0, /* Slot 12 - unused */
+ 0, /* Slot 13 - unused */
+ 0, /* Slot 14 - unused */
+ 0, /* Slot 15 - unused */
+ 0, /* Slot 16 - unused */
+ 0, /* Slot 17 - unused */
+ 0, /* Slot 18 - unused */
+ 0, /* Slot 19 - unused */
+ 0, /* Slot 20 - unused */
+ 0, /* Slot 21 - unused */
+ 0, /* Slot 22 - unused */
+};
+
+/*
+ * IBM RS/6000 7024-E30 -- Leigh Brown
+ * XXX we should get all this from the residual data
+ */
+static char ibm_7024e30_pci_IRQ_map[23] __prepdata = {
+ 0, /* Slot 0 - unused */
+ 0, /* Slot 1 - unused */
+ 0, /* Slot 2 - unused */
+ 0, /* Slot 3 - unused */
+ 0, /* Slot 4 - unused */
+ 0, /* Slot 5 - unused */
+ 0, /* Slot 6 - unused */
+ 0, /* Slot 7 - unused */
+ 0, /* Slot 8 - unused */
+ 0, /* Slot 9 - unused */
+ 0, /* Slot 10 - unused */
+ 0, /* Slot 11 - Unknown Integrated PCI device - no IRQ */
+ 0, /* Slot 12 - Unknown Integrated PCI device - no IRQ */
+ 0, /* Slot 13 - Unknown Integrated PCI device - no IRQ */
+ 2, /* Slot 14 - PCI Slot 1 INTA and INTC */
+ 4, /* Slot 15 - PCI Slot 2 INTA and INTC */
+ 0, /* Slot 16 - unused */
+ 0, /* Slot 17 - unused */
+ 0, /* Slot 18 - unused */
+ 0, /* Slot 19 - unused */
+ 0, /* Slot 20 - unused */
+ 0, /* Slot 21 - unused */
+ 0, /* Slot 22 - unused */
+};
+
+static char ibm_7024e30_pci_IRQ_routes[] __prepdata = {
+ 0, /* Line 0 - unused */
+ 15, /* Line 1 */
+ 15, /* Line 2 */
+ 15, /* Line 3 */
+ 15, /* Line 4 */
+};
+
+
/* Motorola PowerStackII - Utah */
static char Utah_pci_IRQ_map[23] __prepdata =
{
@@ -885,6 +954,50 @@
}
static void __init
+ibm_7024e30_pci_map_non0(struct pci_dev *dev)
+{
+ unsigned char intpin;
+ int irq;
+ static unsigned char bridge_intrs[5][4] = {
+ { 1, 0, 0, 0 },
+ { 8, 9, 8, 9 },
+ { 10, 11, 10, 11 },
+ { 12, 13, 12, 13 }
+ };
+
+ if (dev == NULL || PCI_SLOT(dev->devfn) > 4)
+ return;
+ pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &intpin);
+ if (intpin < 1 || intpin > 4)
+ return;
+ irq = bridge_intrs[PCI_SLOT(dev->devfn)][intpin - 1];
+ dev->irq = openpic_to_irq(irq);
+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+}
+
+void __init
+prep_doral_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi)
+{
+ Motherboard_map_name = "IBM 7043-240 (Doral)";
+ Motherboard_map = ibm_doral_pci_IRQ_map;
+ Motherboard_routes = NULL;
+ Motherboard_non0 = NULL;
+ *irq_edge_mask_lo = 0x00; /* irq's 0-7 all edge-triggered */
+ *irq_edge_mask_hi = 0xA0; /* irq's 13, 15 level-triggered */
+}
+
+void __init
+prep_7024e30_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi)
+{
+ Motherboard_map_name = "IBM 7024-E30";
+ Motherboard_map = ibm_7024e30_pci_IRQ_map;
+ Motherboard_routes = ibm_7024e30_pci_IRQ_routes;
+ Motherboard_non0 = ibm_7024e30_pci_map_non0;
+ *irq_edge_mask_lo = 0x00; /* irq's 0-7 all edge-triggered */
+ *irq_edge_mask_hi = 0xA0; /* irq's 13, 15 level-triggered */
+}
+
+static void __init
ibm43p_pci_map_non0(struct pci_dev *dev)
{
unsigned char intpin;
@@ -1021,11 +1134,13 @@
return;
}
- /* Set up mapping from slots */
- for (i = 1; i <= 4; i++)
- ibc_pirq[i-1] = Motherboard_routes[i];
- /* Enable PCI interrupts */
- *ibc_pcicon |= 0x20;
+ if (Motherboard_routes) { /* Doral does not like this code */
+ /* Set up mapping from slots */
+ for (i = 1; i <= 4; i++)
+ ibc_pirq[i-1] = Motherboard_routes[i];
+ /* Enable PCI interrupts */
+ *ibc_pcicon |= 0x20;
+ }
}
void __init
@@ -1269,7 +1384,8 @@
hostbridge = residual_find_device(PROCESSORDEVICE, NULL,
BridgeController, PCIBridge, -1, 0);
if (hostbridge &&
- hostbridge->DeviceId.Interface == PCIBridgeIndirect) {
+ ((hostbridge->DeviceId.Interface == PCIBridgeIndirect) ||
+ (hostbridge->DeviceId.Interface == PCIBridgeRS6K))) {
PnP_TAG_PACKET * pkt;
pkt = PnP_find_large_vendor_packet(
res->DevicePnPHeap+hostbridge->AllocatedOffset,
diff -Naur linux-2.6.6-orig/arch/ppc/platforms/prep_setup.c linux-2.6.6/arch/ppc/platforms/prep_setup.c
--- linux-2.6.6-orig/arch/ppc/platforms/prep_setup.c 2004-05-09 23:33:13.000000000 -0300
+++ linux-2.6.6/arch/ppc/platforms/prep_setup.c 2004-06-01 19:25:58.000000000 -0300
@@ -80,6 +80,8 @@
int _prep_type;
+extern void prep_doral_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
+extern void prep_7024e30_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
extern void prep_sandalfoot_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
extern void prep_thinkpad_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
extern void prep_carolina_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
@@ -128,8 +130,8 @@
/* planar ID values: */
/* Sandalfoot/Sandalbow (6015/7020) */
#define PREP_IBM_SANDALFOOT 0xfc
-/* Woodfield, Thinkpad 850/860 (6042/7249) */
-#define PREP_IBM_THINKPAD 0xff /* planar ID unimplemented */
+/* Woodfield, Thinkpad 850/860 (6042/7249), 7043-240 */
+#define PREP_IBM_NO_PLANAR_ID 0xff /* planar ID unimplemented */
/* PowerSeries 830/850 (6050/6070) */
#define PREP_IBM_CAROLINA_IDE_0 0xf0
#define PREP_IBM_CAROLINA_IDE_1 0xf1
@@ -146,6 +148,12 @@
#define PREP_IBM_TIGER1_180 0xd3
#define PREP_IBM_TIGER1_xxx 0xd4 /* unknown, but probably exists */
#define PREP_IBM_TIGER1_333 0xd5 /* missing from Tiger Tech Spec */
+/* 7024-E30 */
+#define PREP_IBM_7024E30 0x95
+
+/* Residual data model strings */
+#define PREP_IBM_MODEL_TIGER1 "IBM Model 7042/7043 (ED)"
+#define PREP_IBM_MODEL_DORAL "IBM PPS Model 7043 (ED)"
/* setup_ibm_pci:
* set Motherboard_map_name, Motherboard_map, Motherboard_routes.
@@ -715,11 +723,24 @@
ppc_md.power_off = prep_sig750_poweroff;
ppc_md.show_cpuinfo = prep_sandalfoot_cpuinfo;
break;
- case PREP_IBM_THINKPAD:
- prep_gen_enable_l2();
- setup_ibm_pci = prep_thinkpad_setup_pci;
- ppc_md.power_off = prep_carrera_poweroff;
- ppc_md.show_cpuinfo = prep_thinkpad_cpuinfo;
+ case PREP_IBM_NO_PLANAR_ID:
+#ifdef CONFIG_PREP_RESIDUAL
+ if (res &&
+ strcmp(res->VitalProductData.PrintableModel,
+ PREP_IBM_MODEL_DORAL) == 0) {
+ prep_carolina_enable_l2();
+ setup_ibm_pci = prep_doral_setup_pci;
+ ppc_md.power_off = prep_sig750_poweroff;
+ ppc_md.show_cpuinfo = prep_tiger1_cpuinfo;
+ } else
+#endif /* CONFIG_PREP_RESIDUAL */
+ {
+ /* Assume it is a thinkpad */
+ prep_gen_enable_l2();
+ setup_ibm_pci = prep_thinkpad_setup_pci;
+ ppc_md.power_off = prep_carrera_poweroff;
+ ppc_md.show_cpuinfo = prep_thinkpad_cpuinfo;
+ }
break;
default:
printk(" -- unknown! Assuming Carolina");
@@ -748,6 +771,12 @@
ppc_md.show_cpuinfo = prep_tiger1_cpuinfo;
ppc_md.progress = prep_tiger1_progress;
break;
+ case PREP_IBM_7024E30:
+ prep_carolina_enable_l2();
+ setup_ibm_pci = prep_7024e30_setup_pci;
+ ppc_md.power_off = prep_sig750_poweroff;
+ ppc_md.show_cpuinfo = prep_carolina_cpuinfo;
+ break;
}
printk("\n");
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list