Module Name:    src
Committed By:   rkujawa
Date:           Fri Jan  3 00:33:06 UTC 2014

Modified Files:
        src/sys/arch/amiga/amiga: gayle.c gayle.h
        src/sys/arch/amiga/conf: files.amiga
        src/sys/arch/amiga/dev: acafhreg.h efa.c efareg.h gayle_pcmcia.c
            wdc_acafh.c wdc_amiga.c
        src/sys/arch/amiga/include: bus.h
Added Files:
        src/sys/arch/amiga/amiga: amiga_bus_simple_0x1000.c

Log Message:
Rework handling of Commodore Gayle chip. Avoid ugly struct casts, introduce
proper bus_space accesses and some abstraction layer. All drivers that utilised
Gayle also had to be refactored.

I tried not to break anything more, but this clearly needs more testing...


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/arch/amiga/amiga/amiga_bus_simple_0x1000.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amiga/amiga/gayle.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/amiga/amiga/gayle.h
cvs rdiff -u -r1.173 -r1.174 src/sys/arch/amiga/conf/files.amiga
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/amiga/dev/acafhreg.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/amiga/dev/efa.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/amiga/dev/efareg.h \
    src/sys/arch/amiga/dev/wdc_acafh.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/amiga/dev/gayle_pcmcia.c
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/amiga/dev/wdc_amiga.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/amiga/include/bus.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amiga/amiga/gayle.c
diff -u src/sys/arch/amiga/amiga/gayle.c:1.6 src/sys/arch/amiga/amiga/gayle.c:1.7
--- src/sys/arch/amiga/amiga/gayle.c:1.6	Sun Dec 11 12:16:26 2005
+++ src/sys/arch/amiga/amiga/gayle.c	Fri Jan  3 00:33:06 2014
@@ -1,30 +1,193 @@
-/*	$NetBSD: gayle.c,v 1.6 2005/12/11 12:16:26 christos Exp $	*/
+/*	$NetBSD: gayle.c,v 1.7 2014/01/03 00:33:06 rkujawa Exp $	*/
 
 /* public domain */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gayle.c,v 1.6 2005/12/11 12:16:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gayle.c,v 1.7 2014/01/03 00:33:06 rkujawa Exp $");
 
 /*
- * Gayle management routines
+ * Gayle management - provide functions for use in the drivers that utilise
+ * the chip.
  *
- *   Any module that uses gayle should call gayle_init() before using anything
- *   related to gayle. gayle_init() can be called multiple times.
+ * These overly complicated routines try to deal with a few variants of
+ * Gayle chip that exists. 
  */
+#include <sys/bus.h>
+#include <sys/systm.h>
+
+#include <machine/cpu.h>
 
 #include <amiga/amiga/gayle.h>
 #include <amiga/dev/zbusvar.h>
 
-struct gayle_struct *gayle_base_virtual_address = 0;
+/* #define GAYLE_DEBUG 1 */
+
+struct gayle_tag {
+	struct bus_space_tag gayle_io_bst;
+	bus_space_tag_t gayle_io_t;
+	bus_space_handle_t gayle_io_h;
+
+	struct bus_space_tag gayle_isr_bst;
+	bus_space_tag_t gayle_isr_t;
+	bus_space_handle_t gayle_isr_h;
+};
 
-#define GAYLE_PHYS_ADDRESS      0xda8000
+typedef struct gayle_tag *gayle_tag_t;
 
+/*
+ * Having these as static variables is ugly, but they don't fit into
+ * driver's softc, as the chip might be utilised by many different drivers.
+ * And since we can only have one Gayle per system it should be okay.
+ */
+static struct gayle_tag gayle;
+static gayle_tag_t gayle_t = NULL;
+
+/*
+ * Any module that uses gayle should call gayle_init() before using anything
+ *   related to gayle. gayle_init() can be called multiple times.
+ */
 void
 gayle_init(void) {
+	bus_addr_t gayle_vbase;
 
-	if (gayle_base_virtual_address != 0)
+	if (gayle_t != NULL)
 		return;
 
-	gayle_base_virtual_address =
-	    (struct gayle_struct *) __UNVOLATILE(ztwomap(GAYLE_PHYS_ADDRESS));
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: doing init\n");
+#endif /* GAYLE_DEBUG */
+
+	gayle_t = &gayle;
+
+	gayle_vbase = (bus_addr_t) __UNVOLATILE(ztwomap(GAYLE_REGS_BASE));
+
+	gayle_t->gayle_io_bst.base = gayle_vbase;
+	gayle_t->gayle_io_bst.absm = &amiga_bus_stride_0x1000;
+	gayle_t->gayle_io_t = &(gayle_t->gayle_io_bst);
+
+	bus_space_map(gayle_t->gayle_io_t, 0, 0x4, 0, &gayle_t->gayle_io_h);
+
+	/* 
+	 * The A4000 variant of Gayle has interrupt status register at offset
+	 * +0x1000 from IDE registers.
+	 * XXX: in fact, on A4000 we should initialise only this part...
+	 */
+	if (is_a4000()) {
+		gayle_t->gayle_isr_bst.base = (bus_addr_t) __UNVOLATILE(ztwomap(
+		    GAYLE_IDE_BASE_A4000+GAYLE_IDE_INTREQ_A4000));
+
+		gayle_t->gayle_io_bst.absm = &amiga_bus_stride_1;
+		gayle_t->gayle_isr_t = &(gayle_t->gayle_isr_bst);
+	} else {
+		bus_space_subregion(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+		    GAYLE_INTREQ, 0x1, &(gayle_t->gayle_isr_h));
+
+		gayle_t->gayle_isr_bst = gayle_t->gayle_io_bst;
+		gayle_t->gayle_isr_t = gayle_t->gayle_io_t;
+	}
+
 }
+
+uint8_t 
+gayle_intr_status(void)
+{
+	uint8_t rv;
+
+	rv = bus_space_read_1(gayle_t->gayle_isr_t, gayle_t->gayle_isr_h, 0); 
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: intr status %x\n", rv);
+#endif /* GAYLE_DEBUG */
+
+	return rv;
+}
+
+uint8_t
+gayle_intr_enable_read(void)
+{
+	uint8_t rv;
+
+	rv = bus_space_read_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_INTENA);
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: intr enable register read %x\n", rv);
+#endif /* GAYLE_DEBUG */
+
+	return rv;
+}
+
+void
+gayle_intr_enable_write(uint8_t val)
+{
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: intr enable register write %x\n", val);
+#endif /* GAYLE_DEBUG */
+	bus_space_write_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_INTENA, val);
+}
+
+void
+gayle_intr_enable_set(uint8_t bits)
+{
+	uint8_t val;
+	val = gayle_intr_enable_read();
+	gayle_intr_enable_write(val | bits);
+}
+
+void 
+gayle_intr_ack(uint8_t val)
+{
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: intr ack write %x\n", val);
+#endif /* GAYLE_DEBUG */
+	bus_space_write_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_INTREQ, val);
+}
+
+uint8_t
+gayle_pcmcia_status_read(void)
+{
+	uint8_t rv;
+
+	rv = bus_space_read_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_PCC_STATUS);
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: pcmcia status read %x\n", rv);
+#endif /* GAYLE_DEBUG */
+
+	return rv;
+}
+
+void 
+gayle_pcmcia_status_write(uint8_t val)
+{
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: pcmcia status write %x\n", val);
+#endif /* GAYLE_DEBUG */
+	bus_space_write_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_PCC_STATUS, val);
+}
+
+void 
+gayle_pcmcia_config_write(uint8_t val)
+{
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: pcmcia config write %x\n", val);
+#endif /* GAYLE_DEBUG */
+	bus_space_write_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_PCC_CONFIG, val);
+}
+
+uint8_t
+gayle_pcmcia_config_read(void)
+{
+	uint8_t rv;
+
+	rv = bus_space_read_1(gayle_t->gayle_io_t, gayle_t->gayle_io_h, 
+	    GAYLE_PCC_CONFIG);
+#ifdef GAYLE_DEBUG
+	aprint_normal("gayle: pcmcia config read %x\n", rv);
+#endif /* GAYLE_DEBUG */
+
+	return rv;
+}
+

Index: src/sys/arch/amiga/amiga/gayle.h
diff -u src/sys/arch/amiga/amiga/gayle.h:1.2 src/sys/arch/amiga/amiga/gayle.h:1.3
--- src/sys/arch/amiga/amiga/gayle.h:1.2	Sat Jan 26 13:24:54 2002
+++ src/sys/arch/amiga/amiga/gayle.h	Fri Jan  3 00:33:06 2014
@@ -1,58 +1,73 @@
-/*	$NetBSD: gayle.h,v 1.2 2002/01/26 13:24:54 aymeric Exp $	*/
+/*	$NetBSD: gayle.h,v 1.3 2014/01/03 00:33:06 rkujawa Exp $	*/
 #ifndef AMIGA_GAYLE_H_
 #define AMIGA_GAYLE_H_
 
 #include <sys/types.h>
 
-struct gayle_struct {
-	volatile u_int8_t	pcc_status;
+#define GAYLE_IDE_BASE          0xDA0000
+#define GAYLE_IDE_BASE_A4000	0xDD2020
+#define GAYLE_IDE_INTREQ_A4000		0x1000	/* with stride of 1 */
+
+#define GAYLE_REGS_BASE		0xDA8000
+
+#define GAYLE_PCC_STATUS		0x0
+
 /* Depending on the mode the card is in, most of the bits have different
    meanings */
-#define GAYLE_CCMEM_DETECT	0x40
-#define GAYLE_CCMEM_BVD1	0x20
-#define GAYLE_CCMEM_BVD2	0x10
-#define GAYLE_CCMEM_WP		0x08
-#define GAYLE_CCMEM_BUSY	0x04
-
-#define GAYLE_CCIO_STSCHG	0x20
-#define GAYLE_CCIO_SPKR		0x10
-#define GAYLE_CCIO_IREQ		0x04
-
-	u_int8_t __pad0[0xfff];
-	volatile u_int8_t	intreq;
-
-	u_int8_t __pad1[0xfff];
-	volatile u_int8_t	intena;
-#define GAYLE_INT_IDE		0x80
-#define GAYLE_INT_DETECT	0x40
-#define GAYLE_INT_BVD1		0x20
-#define GAYLE_INT_STSCHG	0x20
-#define GAYLE_INT_BVD2		0x10
-#define GAYLE_INT_SPKR		0x10
-#define GAYLE_INT_WP		0x08
-#define GAYLE_INT_BUSY		0x04
-#define GAYLE_INT_IREQ		0x04
-#define GAYLE_INT_IDEACK0	0x02
-#define GAYLE_INT_IDEACK1	0x01
-
-	u_int8_t __pad2[0xfff];
-	volatile u_int8_t	pcc_config;
-};
-
-#define GAYLE_PCMCIA_START	0xa00000
-#define GAYLE_PCMCIA_ATTR_START	0xa00000
-#define GAYLE_PCMCIA_ATTR_END	0xa20000
+#define GAYLE_CCMEM_DETECT			__BIT(6)	
+#define GAYLE_CCMEM_BVD1			__BIT(5)
+#define GAYLE_CCMEM_BVD2			__BIT(4)
+#define GAYLE_CCMEM_WP				__BIT(3)
+#define GAYLE_CCMEM_BUSY			__BIT(2)
+
+#define GAYLE_CCIO_STSCHG			__BIT(5)
+#define GAYLE_CCIO_SPKR				__BIT(4)	
+#define GAYLE_CCIO_IREQ				__BIT(2)	
+
+#define GAYLE_INTREQ			0x1 /* 0x1000 */
+#define GAYLE_INTENA			0x2 /* 0x2000 */
+
+#define GAYLE_INT_IDE				__BIT(7)	
+#define GAYLE_INT_DETECT			__BIT(6)
+#define GAYLE_INT_BVD1				__BIT(5)	
+#define GAYLE_INT_STSCHG			__BIT(5)
+#define GAYLE_INT_BVD2				__BIT(4)	
+#define GAYLE_INT_SPKR				__BIT(4)	
+#define GAYLE_INT_WP				__BIT(3)	
+#define GAYLE_INT_BUSY				__BIT(2)	
+#define GAYLE_INT_IREQ				__BIT(2)	
+#define GAYLE_INT_IDEACK0			__BIT(1)
+#define GAYLE_INT_IDEACK1			__BIT(0)
+
+#define GAYLE_INT_IDEACK			(GAYLE_INT_IDEACK0 | GAYLE_INT_IDEACK1)
+
+#define GAYLE_PCC_CONFIG		0x3 /* 0x3000 */	
+
+#define GAYLE_PCMCIA_START	0xA00000
+#define GAYLE_PCMCIA_ATTR_START	0xA00000
+#define GAYLE_PCMCIA_ATTR_END	0xA20000
 
-#define GAYLE_PCMCIA_IO_START	0xa20000
-#define GAYLE_PCMCIA_IO_END	0xa40000
+#define GAYLE_PCMCIA_IO_START	0xA20000
+#define GAYLE_PCMCIA_IO_END	0xA40000
 
-#define GAYLE_PCMCIA_RESET	0xa40000
-#define GAYLE_PCMCIA_END	0xa42000
+#define GAYLE_PCMCIA_RESET	0xA40000
+#define GAYLE_PCMCIA_END	0xA42000
 #define NPCMCIAPG		btoc(GAYLE_PCMCIA_END - GAYLE_PCMCIA_START)
 
-extern struct gayle_struct *gayle_base_virtual_address;
-#define gayle (*gayle_base_virtual_address)
-
+/*
+ * Convenience functions for expansions that have Gayle and even those that
+ * don't have real Gayle but have implemented some portions of it for the sake
+ * of compatibility.
+ */
 void gayle_init(void);
+uint8_t gayle_intr_status(void);
+uint8_t gayle_intr_enable_read(void);
+void gayle_intr_enable_write(uint8_t);
+void gayle_intr_enable_set(uint8_t);
+void gayle_intr_ack(uint8_t);
+uint8_t gayle_pcmcia_status_read(void);
+void gayle_pcmcia_status_write(uint8_t);
+uint8_t gayle_pcmcia_config_read(void);
+void gayle_pcmcia_config_write(uint8_t);
 
 #endif /* AMIGA_GAYLE_H_ */

Index: src/sys/arch/amiga/conf/files.amiga
diff -u src/sys/arch/amiga/conf/files.amiga:1.173 src/sys/arch/amiga/conf/files.amiga:1.174
--- src/sys/arch/amiga/conf/files.amiga:1.173	Thu Dec 26 20:38:11 2013
+++ src/sys/arch/amiga/conf/files.amiga	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.amiga,v 1.173 2013/12/26 20:38:11 rkujawa Exp $
+#	$NetBSD: files.amiga,v 1.174 2014/01/03 00:33:06 rkujawa Exp $
 
 # maxpartitions must be first item in files.${ARCH}.newconf
 maxpartitions 16			# NOTE THAT AMIGA IS SPECIAL!
@@ -58,6 +58,9 @@ file	arch/amiga/amiga/amiga_bus_simple_1
 define	amibus_b800
 file	arch/amiga/amiga/amiga_bus_simple_0x800.c	amibus_b800
 
+define	amibus_b1000
+file	arch/amiga/amiga/amiga_bus_simple_0x1000.c	amibus_b1000
+
 define	amibus_b4000
 file	arch/amiga/amiga/amiga_bus_simple_0x4000.c	amibus_b4000
 
@@ -588,7 +591,7 @@ device	acafh: acafhbus, amibus_b4000
 attach	acafh at mainbus 
 file	arch/amiga/dev/acafh.c		acafh needs-count 
 
-attach	wdc at acafhbus with wdc_acafh
+attach	wdc at acafhbus with wdc_acafh: gayle, amibus_b1000
 file	arch/amiga/dev/wdc_acafh.c	wdc_acafh & acafh 
 
 include "arch/amiga/clockport/files.clockport"

Index: src/sys/arch/amiga/dev/acafhreg.h
diff -u src/sys/arch/amiga/dev/acafhreg.h:1.3 src/sys/arch/amiga/dev/acafhreg.h:1.4
--- src/sys/arch/amiga/dev/acafhreg.h:1.3	Thu Dec 26 20:38:11 2013
+++ src/sys/arch/amiga/dev/acafhreg.h	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: acafhreg.h,v 1.3 2013/12/26 20:38:11 rkujawa Exp $ */
+/*	$NetBSD: acafhreg.h,v 1.4 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -29,9 +29,11 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <amiga/amiga/gayle.h>
+
 #ifndef _AMIGA_ACAFHREG_H_
 
-#define GAYLE_IDE_BASE		0xDA0000 /* ACA500 has Gayle-compatible IDE */
+#define ACAFH_IDE_BASE		GAYLE_IDE_BASE /* ACA500 has Gayle-compatible IDE */
 #define ACAFH_CLOCKPORT_BASE	0xD80001
 
 #define ACAFH_MSB_SHIFT		0xF

Index: src/sys/arch/amiga/dev/efa.c
diff -u src/sys/arch/amiga/dev/efa.c:1.11 src/sys/arch/amiga/dev/efa.c:1.12
--- src/sys/arch/amiga/dev/efa.c:1.11	Tue Jul 31 15:50:31 2012
+++ src/sys/arch/amiga/dev/efa.c	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: efa.c,v 1.11 2012/07/31 15:50:31 bouyer Exp $ */
+/*	$NetBSD: efa.c,v 1.12 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -172,8 +172,6 @@ efa_attach(device_t parent, device_t sel
 
 	wdc_allocate_regs(&sc->sc_wdcdev);
 
-	sc->sc_intreg = &gayle.intreq;
-
 	for (i = 0; i < FATA1_CHANNELS; i++) 
 		efa_attach_channel(sc, i);
 
@@ -194,7 +192,7 @@ efa_attach(device_t parent, device_t sel
 		sc->sc_isr.isr_arg = sc;
 		sc->sc_isr.isr_ipl = 2;
 		add_isr (&sc->sc_isr);
-		gayle.intena |= GAYLE_INT_IDE;
+		gayle_intr_enable_set(GAYLE_INT_IDE);
 	}
 
 }
@@ -283,13 +281,13 @@ efa_intr(void *arg)
 {
 	struct efa_softc *sc = (struct efa_softc *)arg;
 	int r1, r2, ret;
-	u_char intreq;
+	uint8_t intreq;
 
-	intreq = *sc->sc_intreg;
+	intreq = gayle_intr_status();
 	ret = 0;
 
 	if (intreq & GAYLE_INT_IDE) {
-		gayle.intreq = 0x7c | (intreq & 0x03);
+		gayle_intr_ack(0x7C | (intreq & 0x03));
 		/* How to check which channel caused interrupt?
 		 * Interrupt status register is not very useful here. */
 		r1 = wdcintr(&sc->sc_ports[0].chan);

Index: src/sys/arch/amiga/dev/efareg.h
diff -u src/sys/arch/amiga/dev/efareg.h:1.2 src/sys/arch/amiga/dev/efareg.h:1.3
--- src/sys/arch/amiga/dev/efareg.h:1.2	Sat Oct 29 11:16:19 2011
+++ src/sys/arch/amiga/dev/efareg.h	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: efareg.h,v 1.2 2011/10/29 11:16:19 rkujawa Exp $ */
+/*	$NetBSD: efareg.h,v 1.3 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -31,7 +31,6 @@
 
 #ifndef _AMIGA_EFAREG_H_
 
-#define GAYLE_IDE_BASE		0xDA0000
 #define FATA1_BASE		0xDA2000
 
 /* Offsets. Stride of 4 is used, so multiply any offset by 4. */
Index: src/sys/arch/amiga/dev/wdc_acafh.c
diff -u src/sys/arch/amiga/dev/wdc_acafh.c:1.2 src/sys/arch/amiga/dev/wdc_acafh.c:1.3
--- src/sys/arch/amiga/dev/wdc_acafh.c:1.2	Sun Dec 22 23:02:38 2013
+++ src/sys/arch/amiga/dev/wdc_acafh.c	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: wdc_acafh.c,v 1.2 2013/12/22 23:02:38 rkujawa Exp $ */
+/*	$NetBSD: wdc_acafh.c,v 1.3 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2000, 2003, 2013 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc_acafh.c,v 1.2 2013/12/22 23:02:38 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc_acafh.c,v 1.3 2014/01/03 00:33:06 rkujawa Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -81,7 +81,6 @@ struct wdc_acafh_softc {
 	struct wdc_acafh_slot	sc_slots[WDC_ACAFH_SLOTS];
 
 	struct isr		sc_isr;
-	volatile u_char		*sc_intreg;
 
 	struct bus_space_tag	cmd_iot;
 
@@ -119,7 +118,6 @@ wdc_acafh_attach(device_t parent, device
 	sc->aca_sc = device_private(parent);
 
 	gayle_init();
-	sc->sc_intreg = &gayle.intreq;
 
 	/* XXX: take addr from attach args? */
 	sc->cmd_iot.base = (u_long) ztwomap(GAYLE_IDE_BASE + 2);
@@ -143,7 +141,7 @@ wdc_acafh_attach(device_t parent, device
 	sc->sc_isr.isr_ipl = 2;
 	add_isr (&sc->sc_isr);
 
-	gayle.intena |= GAYLE_INT_IDE;
+	gayle_intr_enable_set(GAYLE_INT_IDE);
 
 }
 
@@ -205,9 +203,13 @@ wdc_acafh_map_channel(struct wdc_acafh_s
 int
 wdc_acafh_intr(void *arg)
 {
-	struct wdc_acafh_softc *sc = (struct wdc_acafh_softc *)arg;
-	int ret = 0;
-	u_char intreq = *sc->sc_intreg;
+	struct wdc_acafh_softc *sc;
+	uint8_t intreq;
+	int ret;
+
+	sc = (struct wdc_acafh_softc *) arg;
+	intreq = gayle_intr_status();
+	ret = 0;
 
 	if (intreq & GAYLE_INT_IDE) {
 		if (acafh_cf_intr_status(sc->aca_sc, 1) == 1) {
@@ -216,7 +218,7 @@ wdc_acafh_intr(void *arg)
 		if (acafh_cf_intr_status(sc->aca_sc, 0) == 1) {
 			ret = wdcintr(&sc->sc_slots[0].channel);
 		}
-		gayle.intreq = 0x7c | (intreq & 0x03);
+		gayle_intr_ack(0x7C | (intreq & GAYLE_INT_IDEACK));
 	}
 
 	return ret;

Index: src/sys/arch/amiga/dev/gayle_pcmcia.c
diff -u src/sys/arch/amiga/dev/gayle_pcmcia.c:1.27 src/sys/arch/amiga/dev/gayle_pcmcia.c:1.28
--- src/sys/arch/amiga/dev/gayle_pcmcia.c:1.27	Mon Sep 23 08:39:28 2013
+++ src/sys/arch/amiga/dev/gayle_pcmcia.c	Fri Jan  3 00:33:06 2014
@@ -1,9 +1,9 @@
-/*	$NetBSD: gayle_pcmcia.c,v 1.27 2013/09/23 08:39:28 jandberg Exp $ */
+/*	$NetBSD: gayle_pcmcia.c,v 1.28 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /* public domain */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gayle_pcmcia.c,v 1.27 2013/09/23 08:39:28 jandberg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gayle_pcmcia.c,v 1.28 2014/01/03 00:33:06 rkujawa Exp $");
 
 /* PCMCIA front-end driver for A1200's and A600's. */
 
@@ -165,10 +165,10 @@ pccard_attach(device_t parent, device_t 
 	sc->devs[0].intr_arg = NULL;
 	sc->devs[0].flags = 0;
 
-	gayle.pcc_status = 0;
-	gayle.intreq = 0;
-	gayle.pcc_config = 0;
-	gayle.intena &= GAYLE_INT_IDE;
+	gayle_pcmcia_status_write(0);
+	gayle_intr_ack(0);
+	gayle_pcmcia_config_write(0);
+	gayle_intr_enable_set(GAYLE_INT_IDE);
 
 	paa.paa_busname = "pcmcia";
 	paa.pct = &chip_functions;
@@ -201,15 +201,15 @@ pccard_attach(device_t parent, device_t 
 		panic("pccard kthread_create() failed");
 	}
 
-	gayle.intena |= GAYLE_INT_DETECT | GAYLE_INT_IREQ;
+	gayle_intr_enable_set(GAYLE_INT_DETECT | GAYLE_INT_IREQ);
 
 	/* reset the card if it's already there */
-	if (gayle.pcc_status & GAYLE_CCMEM_DETECT) {
+	if (gayle_pcmcia_status_read() & GAYLE_CCMEM_DETECT) {
 		volatile u_int8_t x;
 		*reset_card_reg = 0x0;
 		delay(1000);
 		x = *reset_card_reg;
-		gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR;
+		gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR);
 	}
 
 	pccard_attach_slot(&sc->devs[0]);
@@ -220,9 +220,9 @@ pccard_intr6(void *arg)
 {
 	struct pccard_softc *sc = arg;
 
-	if (gayle.intreq & GAYLE_INT_DETECT) {
-		gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_STSCHG |
-		    GAYLE_INT_SPKR | GAYLE_INT_WP | GAYLE_INT_IREQ;
+	if (gayle_intr_status() & GAYLE_INT_DETECT) {
+		gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_STSCHG |
+		    GAYLE_INT_SPKR | GAYLE_INT_WP | GAYLE_INT_IREQ);
 		sc->devs[0].flags |= SLOT_NEW_CARD_EVENT;
 		return 1;
 	}
@@ -239,15 +239,15 @@ pccard_intr2(void *arg)
 		slot->flags &= ~SLOT_NEW_CARD_EVENT;
 
 		/* reset the registers */
-		gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_DETECT;
-		gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR;
-		gayle.pcc_config = 0;
+		gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT);
+		gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR);
+		gayle_pcmcia_config_write(0);
 		pccard_attach_slot(&sc->devs[0]);
 	} else {
-		int intreq = gayle.intreq &
+		int intreq = gayle_intr_status() &
 		    (GAYLE_INT_STSCHG | GAYLE_INT_WP | GAYLE_INT_IREQ);
 		if (intreq) {
-			gayle.intreq = (intreq ^ 0x2c) | 0xc0;
+			gayle_intr_ack((intreq ^ 0x2c) | 0xc0);
 
 			return slot->flags & SLOT_OCCUPIED &&
 		   		slot->intr_func != NULL &&
@@ -268,12 +268,12 @@ pccard_kthread(void *arg)
 
 		if (slot->flags & SLOT_NEW_CARD_EVENT) {
 			slot->flags &= ~SLOT_NEW_CARD_EVENT;
-			gayle.intreq = 0xc0;
+			gayle_intr_ack(0xc0);
 
 			/* reset the registers */
-			gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_DETECT;
-			gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR;
-			gayle.pcc_config = 0;
+			gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT);
+			gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR);
+			gayle_pcmcia_config_write(0);
 			pccard_attach_slot(&sc->devs[0]);
 		}
 		splx(s);
@@ -287,7 +287,7 @@ pccard_attach_slot(struct pccard_slot *s
 {
 
 	if (!(slot->flags & SLOT_OCCUPIED) &&
-			gayle.pcc_status & GAYLE_CCMEM_DETECT) {
+			gayle_pcmcia_status_read() & GAYLE_CCMEM_DETECT) {
 		if (pcmcia_card_attach(slot->card) == 0)
 			slot->flags |= SLOT_OCCUPIED;
 	}

Index: src/sys/arch/amiga/dev/wdc_amiga.c
diff -u src/sys/arch/amiga/dev/wdc_amiga.c:1.36 src/sys/arch/amiga/dev/wdc_amiga.c:1.37
--- src/sys/arch/amiga/dev/wdc_amiga.c:1.36	Tue Jul 31 15:50:31 2012
+++ src/sys/arch/amiga/dev/wdc_amiga.c	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: wdc_amiga.c,v 1.36 2012/07/31 15:50:31 bouyer Exp $ */
+/*	$NetBSD: wdc_amiga.c,v 1.37 2014/01/03 00:33:06 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc_amiga.c,v 1.36 2012/07/31 15:50:31 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc_amiga.c,v 1.37 2014/01/03 00:33:06 rkujawa Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -59,10 +59,8 @@ struct wdc_amiga_softc {
 	struct	ata_queue sc_chqueue;
 	struct wdc_regs sc_wdc_regs;
 	struct isr sc_isr;
-	volatile u_char *sc_intreg;
 	struct bus_space_tag cmd_iot;
 	struct bus_space_tag ctl_iot;
-	char	sc_a1200;
 };
 
 int	wdc_amiga_probe(device_t, cfdata_t, void *);
@@ -93,16 +91,14 @@ wdc_amiga_attach(device_t parent, device
 	sc->sc_wdcdev.sc_atac.atac_dev = self;
 	sc->sc_wdcdev.regs = wdr = &sc->sc_wdc_regs;
 
+	gayle_init();
+
 	if (is_a4000()) {
-		sc->cmd_iot.base = (u_long)ztwomap(0xdd2020 + 2);
-		sc->sc_intreg = (volatile u_char *)ztwomap(0xdd2020 + 0x1000);
-		sc->sc_a1200 = 0;
+		sc->cmd_iot.base = (bus_addr_t) ztwomap(GAYLE_IDE_BASE_A4000 + 2);
 	} else {
-		sc->cmd_iot.base = (u_long) ztwomap(0xda0000 + 2);
-		gayle_init();
-		sc->sc_intreg = &gayle.intreq;
-		sc->sc_a1200 = 1;
+		sc->cmd_iot.base = (bus_addr_t) ztwomap(GAYLE_IDE_BASE + 2);
 	}
+
 	sc->cmd_iot.absm = sc->ctl_iot.absm = &amiga_bus_stride_4swap;
 	wdr->cmd_iot = &sc->cmd_iot;
 	wdr->ctl_iot = &sc->ctl_iot;
@@ -146,8 +142,8 @@ wdc_amiga_attach(device_t parent, device
 	sc->sc_isr.isr_ipl = 2;
 	add_isr (&sc->sc_isr);
 
-	if (sc->sc_a1200)
-		gayle.intena |= GAYLE_INT_IDE;
+	if (!is_a4000())
+		gayle_intr_enable_set(GAYLE_INT_IDE);
 
 	wdcattach(&sc->sc_channel);
 }
@@ -155,15 +151,20 @@ wdc_amiga_attach(device_t parent, device
 int
 wdc_amiga_intr(void *arg)
 {
-	struct wdc_amiga_softc *sc = (struct wdc_amiga_softc *)arg;
-	u_char intreq = *sc->sc_intreg;
-	int ret = 0;
+	struct wdc_amiga_softc *sc;
+	uint8_t intreq;
+	int ret;
+
+	sc = (struct wdc_amiga_softc *)arg;
+	ret = 0;
+	intreq = gayle_intr_status();
 
 	if (intreq & GAYLE_INT_IDE) {
-		if (sc->sc_a1200)
-			gayle.intreq = 0x7c | (intreq & 0x03);
+		if (!is_a4000())
+			gayle_intr_ack(0x7C | (intreq & GAYLE_INT_IDEACK));
 		ret = wdcintr(&sc->sc_channel);
 	}
 
 	return ret;
 }
+

Index: src/sys/arch/amiga/include/bus.h
diff -u src/sys/arch/amiga/include/bus.h:1.28 src/sys/arch/amiga/include/bus.h:1.29
--- src/sys/arch/amiga/include/bus.h:1.28	Sun Dec 22 02:21:51 2013
+++ src/sys/arch/amiga/include/bus.h	Fri Jan  3 00:33:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus.h,v 1.28 2013/12/22 02:21:51 rkujawa Exp $	*/
+/*	$NetBSD: bus.h,v 1.29 2014/01/03 00:33:06 rkujawa Exp $	*/
 
 /*
  * Copyright (c) 1996 Leo Weppelman.  All rights reserved.
@@ -279,6 +279,7 @@ extern const struct amiga_bus_space_meth
 extern const struct amiga_bus_space_methods amiga_bus_stride_4;
 extern const struct amiga_bus_space_methods amiga_bus_stride_4swap;
 extern const struct amiga_bus_space_methods amiga_bus_stride_16;
+extern const struct amiga_bus_space_methods amiga_bus_stride_0x1000;
 extern const struct amiga_bus_space_methods amiga_bus_stride_0x4000;
 extern const struct amiga_bus_space_methods empb_bus_swap;
 

Added files:

Index: src/sys/arch/amiga/amiga/amiga_bus_simple_0x1000.c
diff -u /dev/null src/sys/arch/amiga/amiga/amiga_bus_simple_0x1000.c:1.1
--- /dev/null	Fri Jan  3 00:33:06 2014
+++ src/sys/arch/amiga/amiga/amiga_bus_simple_0x1000.c	Fri Jan  3 00:33:06 2014
@@ -0,0 +1,38 @@
+/* $NetBSD: amiga_bus_simple_0x1000.c,v 1.1 2014/01/03 00:33:06 rkujawa Exp $ */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ignatios Souvatzis.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(1, "$NetBSD: amiga_bus_simple_0x1000.c,v 1.1 2014/01/03 00:33:06 rkujawa Exp $");
+
+#define AMIGA_SIMPLE_BUS_STRIDE 0x1000		/* 1 byte per 0x1000 bytes */
+#define AMIGA_SIMPLE_BUS_WORD_METHODS
+
+#include "simple_busfuncs.c"

Reply via email to