Subject: Re: port-atari/37464: NetBSD 3.1 doesn't boot on Atari Falcon
To: None <port-atari-maintainer@netbsd.org, gnats-admin@netbsd.org,>
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
List: netbsd-bugs
Date: 12/03/2007 14:15:06
The following reply was made to PR port-atari/37464; it has been noted by GNATS.
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@NetBSD.org
Cc: gnats-admin@NetBSD.org, netbsd-bugs@NetBSD.org,
tsutsui@ceres.dti.ne.jp
Subject: Re: port-atari/37464: NetBSD 3.1 doesn't boot on Atari Falcon
Date: Mon, 3 Dec 2007 23:10:50 +0900
alanh@fairlite.demon.co.uk wrote:
> >Synopsis: NetBSD 3.1 doesn't boot on Atari Falcon
How about this one?
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-atari-BOOTX-3.1.gz
Index: wdc_mb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/dev/wdc_mb.c,v
retrieving revision 1.24
diff -u -r1.24 wdc_mb.c
--- wdc_mb.c 20 Aug 2004 06:39:38 -0000 1.24
+++ wdc_mb.c 3 Dec 2007 14:03:03 -0000
@@ -60,6 +60,11 @@
#include <atari/dev/ym2149reg.h>
#include <atari/atari/device.h>
+/* Falcon IDE register locations (base and offsets). */
+#define FALCON_WD_BASE 0xfff00000
+#define FALCON_WD_LEN 0x40
+#define FALCON_WD_AUX 0x38
+
/*
* XXX This code currently doesn't even try to allow 32-bit data port use.
*/
@@ -95,7 +100,7 @@
struct ata_channel ch;
struct wdc_softc wdc;
struct wdc_regs wdr;
- int result = 0;
+ int result = 0, i;
u_char sv_ierb;
if ((machineid & ATARI_TT) || strcmp("wdc", aux) || wdc_matched)
@@ -111,14 +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, 0xfff00000, 0x40, 0, &wdr.cmd_baseioh))
- return 0;
- if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh, 0x38, 1,
+ if (bus_space_map(wdr.cmd_iot, FALCON_WD_BASE, FALCON_WD_LEN, 0,
+ &wdr.cmd_baseioh))
+ goto out;
+ for (i = 0; i < WDC_NREG; i++) {
+ if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh,
+ 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))
- return 0;
+ goto outunmap;
/*
* Make sure IDE interrupts are disabled during probing.
@@ -136,7 +149,9 @@
MFP->mf_ierb = sv_ierb;
- bus_space_unmap(wdr.cmd_iot, wdr.cmd_baseioh, 0x40);
+ outunmap:
+ bus_space_unmap(wdr.cmd_iot, wdr.cmd_baseioh, FALCON_WD_LEN);
+ out:
mb_free_bus_space_tag(wdr.cmd_iot);
if (result)
@@ -151,25 +166,37 @@
{
struct wdc_mb_softc *sc = (void *)self;
struct wdc_regs *wdr;
+ int i;
printf("\n");
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;
- if (bus_space_map(wdr->cmd_iot, 0xfff00000, 0x40, 0,
+ if (bus_space_map(wdr->cmd_iot, FALCON_WD_BASE, FALCON_WD_LEN, 0,
&wdr->cmd_baseioh)) {
printf("%s: couldn't map registers\n",
sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
return;
}
+ for (i = 0; i < WDC_NREG; i++) {
+ if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
+ i * 4, 4, &wdr->cmd_iohs[i]) != 0) {
+ bus_space_unmap(wdr->cmd_iot, wdr->cmd_baseioh,
+ FALCON_WD_LEN);
+ return;
+ }
+ }
+
if (bus_space_subregion(wdr->cmd_iot,
- wdr->cmd_baseioh, 0x38, 1, &wdr->ctl_ioh))
+ 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
@@ -189,6 +216,7 @@
sc->sc_channel.ch_channel = 0;
sc->sc_channel.ch_atac = &sc->sc_wdcdev.sc_atac;
sc->sc_channel.ch_queue = &sc->sc_chqueue;
+ wdc_init_shadow_regs(&sc->sc_channel);
/*
* Setup & enable disk related interrupts.
---
Izumi Tsutsui