Subject: Re: port-atari/37464: NetBSD 3.1 doesn't boot on Atari Falcon
To: None <alanh@fairlite.demon.co.uk>
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
List: netbsd-bugs
Date: 12/04/2007 03:00:31
alanh@fairlite.demon.co.uk wrote:

> Excellent.
> 
> The new boot image fixes the problem.

Thanks, could you also try a patched 4.0_RC5 kernel
to see if the similar patch works for a recent source?
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-atari-BOOTX-4.0_RC5.gz


Index: wdc_mb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/dev/wdc_mb.c,v
retrieving revision 1.28
diff -u -r1.28 wdc_mb.c
--- wdc_mb.c	29 Jan 2006 21:42:41 -0000	1.28
+++ wdc_mb.c	3 Dec 2007 17:56:04 -0000
@@ -63,19 +63,7 @@
 /* Falcon IDE register locations (base and offsets). */
 #define FALCON_WD_BASE	0xfff00000
 #define FALCON_WD_LEN	0x40
-
-static int falcon_wd_reg[WDC_NREG + WDC_NSHADOWREG] = {
-    0x00,	/* wd_data	*/
-    0x05,	/* wd_error	*/
-    0x09,	/* wd_seccnt	*/
-    0x0d,	/* wd_sector	*/
-    0x11,	/* wd_cyl_lo	*/
-    0x15,	/* wd_cyl_hi	*/
-    0x19,	/* wd_sdh	*/
-    0x1d,	/* wd_command	*/
-    0x39,	/* wd_status	*/
-    0x01	/* wd_features  */
-    };
+#define FALCON_WD_AUX	0x38
 
 /*
  * XXX This code currently doesn't even try to allow 32-bit data port use.
@@ -128,19 +116,22 @@
 	wdr.cmd_iot = wdr.ctl_iot = mb_alloc_bus_space_tag();
 	if (wdr.cmd_iot == NULL)
 		return 0;
-	wdr.cmd_iot->stride = 2;
+	wdr.cmd_iot->stride = 0;
 	wdr.cmd_iot->wo_1   = 1;
 
 	if (bus_space_map(wdr.cmd_iot, FALCON_WD_BASE, FALCON_WD_LEN, 0,
 	    &wdr.cmd_baseioh))
-		return 0;
-	for (i = 0; i < (WDC_NREG + WDC_NSHADOWREG); i++)
+		goto out;
+	for (i = 0; i < WDC_NREG; i++) {
 		if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh,
-		    falcon_wd_reg[i], i == 0 ? 2 : 1, &wdr.cmd_iohs[i]) != 0) {
-			bus_space_unmap(wdr.cmd_iot, wdr.cmd_baseioh,
-			    FALCON_WD_LEN);
-			return 0;
-		}
+		    i * 4, 4, &wdr.cmd_iohs[i]) != 0)
+			goto outunmap;
+	}
+	wdc_init_shadow_regs(&ch);
+
+	if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh, FALCON_WD_AUX, 4,
+	    &wdr.ctl_ioh))
+		goto outunmap;
 
 	/*
 	 * Make sure IDE interrupts are disabled during probing.
@@ -158,7 +149,9 @@
 
 	MFP->mf_ierb = sv_ierb;
 
+ outunmap:
 	bus_space_unmap(wdr.cmd_iot, wdr.cmd_baseioh, FALCON_WD_LEN);
+ out:
 	mb_free_bus_space_tag(wdr.cmd_iot);
 
 	if (result)
@@ -180,7 +173,7 @@
 	sc->sc_wdcdev.regs = wdr = &sc->sc_wdc_regs;
 	wdr->cmd_iot = wdr->ctl_iot =
 	    mb_alloc_bus_space_tag();
-	wdr->cmd_iot->stride = 2;
+	wdr->cmd_iot->stride = 0;
 	wdr->cmd_iot->wo_1   = 1;
 	wdr->cmd_iot->abs_rms_2 = read_multi_2_swap;
 	wdr->cmd_iot->abs_wms_2 = write_multi_2_swap;
@@ -190,15 +183,22 @@
 		    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
 		return;
 	}
-	for (i = 0; i < (WDC_NREG + WDC_NSHADOWREG); i++)
+	for (i = 0; i < WDC_NREG; i++) {
 		if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
-		    falcon_wd_reg[i], i == 0 ? 2 : 1, &wdr->cmd_iohs[i]) != 0) {
+		    i * 4, 4, &wdr->cmd_iohs[i]) != 0) {
 			printf("%s: couldn't subregion cmd reg %i\n",
 			    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, i);
 			bus_space_unmap(wdr->cmd_iot, wdr->cmd_baseioh,
 			    FALCON_WD_LEN);
 			return;
 		}
+	}
+
+	if (bus_space_subregion(wdr->cmd_iot,
+	    wdr->cmd_baseioh, FALCON_WD_AUX, 4, &wdr->ctl_ioh)) {
+		bus_space_unmap(wdr->cmd_iot, wdr->cmd_baseioh, FALCON_WD_LEN);
+		return;
+	}
 
 	/*
 	 * Play a nasty trick here. Normally we only manipulate the
@@ -219,6 +219,7 @@
 	sc->sc_channel.ch_atac = &sc->sc_wdcdev.sc_atac;
 	sc->sc_channel.ch_queue = &sc->sc_chqueue;
 	sc->sc_channel.ch_ndrive = 2;
+	wdc_init_shadow_regs(&sc->sc_channel);
 
 	/*
 	 * Setup & enable disk related interrupts.

---
Izumi Tsutsui