diff -urN linuxppc_2_4_devel-prev/arch/ppc/platforms/prep_setup.c linuxppc_2_4_devel-local/arch/ppc/platforms/prep_setup.c
--- linuxppc_2_4_devel-prev/arch/ppc/platforms/prep_setup.c	2003-01-11 10:53:20.000000000 +0000
+++ linuxppc_2_4_devel-local/arch/ppc/platforms/prep_setup.c	2003-01-11 13:28:19.000000000 +0000
@@ -836,7 +836,7 @@
 	{
 	case _PREP_IBM:
 		reg = inb(PREP_IBM_PLANAR);
-		printk(KERN_INFO "IBM planar ID: %08x", reg);
+		printk(KERN_INFO "IBM planar ID: %02x", reg);
 		switch (reg) {
 			case PREP_IBM_SANDALFOOT:
 				prep_gen_enable_l2();
diff -urN linuxppc_2_4_devel-prev/arch/ppc/platforms/prep_setup.c.orig linuxppc_2_4_devel-local/arch/ppc/platforms/prep_setup.c.orig
--- linuxppc_2_4_devel-prev/arch/ppc/platforms/prep_setup.c.orig	2003-01-09 02:33:57.000000000 +0000
+++ linuxppc_2_4_devel-local/arch/ppc/platforms/prep_setup.c.orig	2003-01-11 10:53:20.000000000 +0000
@@ -97,6 +97,8 @@
 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);
 extern void prep_tiger1_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
+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);
 
 
 #define cached_21	(((char *)(ppc_cached_irq_mask))[3])
@@ -140,8 +142,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
@@ -157,6 +159,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.
@@ -695,6 +703,116 @@
 #endif /* CONFIG_PREP_RESIDUAL */
 }
 
+/*
+ * Set BAT 2 to access 0x80000000 so early progress messages will work
+ */
+static __inline__ void
+prep_set_bat(void)
+{
+	static int mapping_set = 0;
+
+	if (!mapping_set) {
+		/* wait for all outstanding memory access to complete */
+		mb();
+
+		/* setup DBATs */
+		mtspr(DBAT2U, 0x80001ffe);
+		mtspr(DBAT2L, 0x8000002a);
+
+		/* wait for updates */
+		mb();
+
+		mapping_set = 1;
+	}
+}
+
+/*
+ * IBM 3-digit status LED - only if we have PReP residual data to find it with
+ */
+#ifdef CONFIG_PREP_RESIDUAL
+static unsigned int ibm_statusled_base __prepdata;
+
+static void __prep
+ibm_statusled_progress(char *s, unsigned short hex)
+{
+	/*
+	 * Progress uses 4 digits and we have only 3.  So, we map 0xffff to
+	 * 0xfff for display switch off.  Out of range values are mapped to
+	 * 0xeff, as I'm told 0xf00 and above are reserved for hardware codes.
+	 */
+	if (hex == 0xffff)
+		hex = 0xfff;
+	else
+		if (hex > 0xfff)
+			hex = 0xeff;
+
+	/* A small delay seems to be needed - purely guesswork */
+	outb(hex >> 0x08, ibm_statusled_base + 1);
+	udelay(100);
+	outb(hex  & 0xff, ibm_statusled_base);
+	udelay(200);
+}
+
+static int __prep
+ibm_statusled_panic(struct notifier_block *dummy1, unsigned long dummy2,
+		void * dummy3)
+{
+	ibm_statusled_progress(NULL, 0x505); /* Suggestions welcome */
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block ibm_statusled_block __prepdata = {
+	ibm_statusled_panic,
+	NULL,
+	INT_MAX /* try to do it first */
+};
+
+static void __init
+ibm_statusled_init(void)
+{
+	PPC_DEVICE *leddevice;
+	PnP_TAG_PACKET *pkt;
+
+	/*
+	 * The IBM 3-digit LED display is specified in the residual data
+	 * as an operator panel device, type "System Status LED".  Find
+	 * that device and determine its address.  We validate all the
+	 * other parameters on the off-chance another, similar device
+	 * exists.
+	 */
+	leddevice = residual_find_device(~0, NULL, SystemPeripheral,
+					 OperatorPanel, SystemStatusLED, 0);
+	if (!leddevice)
+		return;
+
+	pkt = PnP_find_packet((unsigned char *)&res->DevicePnPHeap[leddevice->AllocatedOffset], S8_Packet, 0);
+	if (!pkt)
+		return;
+
+	if (pkt->S8_Pack.IOInfo != ISAAddr16bit)
+		return;
+	if (*(unsigned short *)pkt->S8_Pack.RangeMin !=
+	    *(unsigned short *)pkt->S8_Pack.RangeMax)
+		return;
+	if (pkt->S8_Pack.IOAlign != 2)
+		return;
+	if (pkt->S8_Pack.IONum != 2)
+		return;
+
+	ibm_statusled_base = ld_le16( (unsigned short *)(pkt->S8_Pack.RangeMin));
+	ppc_md.progress = ibm_statusled_progress;
+
+	/* Set the LED on a panic - this works quite nicely */
+	notifier_chain_register(&panic_notifier_list,
+				&ibm_statusled_block);
+}
+#else /* !CONFIG_PREP_RESIDUAL */
+static void __init
+ibm_statusled_init(void)
+{
+}
+#endif /* CONFIG_PREP_RESIDUAL */
+
 static void __init
 prep_setup_arch(void)
 {
@@ -726,11 +844,26 @@
 				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 {
+#else /* !CONFIG_PREP_RESIDUAL */
+				{
+#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");
@@ -757,6 +890,12 @@
 				ppc_md.power_off = prep_sig750_poweroff;
 				ppc_md.show_cpuinfo = prep_tiger1_cpuinfo;
 				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");
 
@@ -1206,6 +1345,10 @@
 		ppc_md.set_rtc_time   = mc146818_set_rtc_time;
 		ppc_md.get_rtc_time   = mc146818_get_rtc_time;
 		ppc_md.calibrate_decr = prep_calibrate_decr;
+
+		/* Initialise progress early to get maximum benefit */
+		prep_set_bat();
+		ibm_statusled_init();
 	} else {
 		ppc_md.set_rtc_time   = mk48t59_set_rtc_time;
 		ppc_md.get_rtc_time   = mk48t59_get_rtc_time;
