Module Name:    src
Committed By:   mrg
Date:           Sat Feb  6 00:23:30 UTC 2010

Modified Files:
        src/sys/arch/sparc64/conf: SCHIZO
        src/sys/arch/sparc64/dev: schizo.c schizovar.h
        src/sys/arch/sparc64/sparc64: locore.s

Log Message:
- properly map the schizo interrupt registers, so we can use the normal
  virtual mappings to access them.
- with the above fxied, kill SCHIZO_BUS_SPACE_BROKEN, and introduce
  an options CHEETAH for now, that disables the SPITFIRE code in locore.
- merge schizo_init() into schizo_attach() and clean up the softc a bit.

with this we are only one more step away from GENERIC booting on USIII
machines.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/sparc64/conf/SCHIZO
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/sparc64/dev/schizo.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc64/dev/schizovar.h
cvs rdiff -u -r1.310 -r1.311 src/sys/arch/sparc64/sparc64/locore.s

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/sparc64/conf/SCHIZO
diff -u src/sys/arch/sparc64/conf/SCHIZO:1.4 src/sys/arch/sparc64/conf/SCHIZO:1.5
--- src/sys/arch/sparc64/conf/SCHIZO:1.4	Thu Jan 28 06:04:23 2010
+++ src/sys/arch/sparc64/conf/SCHIZO	Sat Feb  6 00:23:30 2010
@@ -1,4 +1,4 @@
-# $NetBSD: SCHIZO,v 1.4 2010/01/28 06:04:23 mrg Exp $
+# $NetBSD: SCHIZO,v 1.5 2010/02/06 00:23:30 mrg Exp $
 #
 # GENERIC with schizo support enabled, with the annoying schizo interupt
 # option
@@ -7,9 +7,9 @@
 include 	"arch/sparc64/conf/GENERIC.MP"
 #include 	"arch/sparc64/conf/GENERIC"
 
-#ident		"SCHIZO.$Revision: 1.4 $"
+#ident		"SCHIZO.$Revision: 1.5 $"
 
-options 	SCHIZO_BUS_SPACE_BROKEN
+options 	CHEETAH
 
 makeoptions	DEBUG="-g"
 options 	DEBUG

Index: src/sys/arch/sparc64/dev/schizo.c
diff -u src/sys/arch/sparc64/dev/schizo.c:1.12 src/sys/arch/sparc64/dev/schizo.c:1.13
--- src/sys/arch/sparc64/dev/schizo.c:1.12	Wed Jan  6 05:55:01 2010
+++ src/sys/arch/sparc64/dev/schizo.c	Sat Feb  6 00:23:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: schizo.c,v 1.12 2010/01/06 05:55:01 mrg Exp $	*/
+/*	$NetBSD: schizo.c,v 1.13 2010/02/06 00:23:30 mrg Exp $	*/
 /*	$OpenBSD: schizo.c,v 1.55 2008/08/18 20:29:37 brad Exp $	*/
 
 /*
@@ -72,7 +72,6 @@
 CFATTACH_DECL(schizo, sizeof(struct schizo_softc),
     schizo_match, schizo_attach, NULL, NULL);
 
-void schizo_init(struct schizo_softc *);
 void schizo_init_iommu(struct schizo_softc *, struct schizo_pbm *);
 
 void schizo_set_intr(struct schizo_softc *, struct schizo_pbm *, int,
@@ -136,7 +135,10 @@
 {
 	struct schizo_softc *sc = (struct schizo_softc *)self;
 	struct mainbus_attach_args *ma = aux;
-	uint64_t eccctrl;
+	struct schizo_pbm *pbm;
+	struct pcibus_attach_args pba;
+	uint64_t reg, eccctrl;
+	int *busranges = NULL, nranges;
 	char *str;
 
 	printf(": addr %lx", ma->ma_reg[0].ur_paddr);
@@ -147,10 +149,8 @@
 	sc->sc_node = ma->ma_node;
 	sc->sc_dmat = ma->ma_dmatag;
 	sc->sc_bustag = ma->ma_bustag;
-	sc->sc_ctrl = ma->ma_reg[1].ur_paddr - 0x10000UL;
-	sc->sc_reg0 = ma->ma_reg[0];
 
-	if (bus_space_map(sc->sc_bustag, sc->sc_ctrl,
+	if (bus_space_map(sc->sc_bustag, ma->ma_reg[1].ur_paddr - 0x10000UL,
 	    sizeof(struct schizo_regs), 0,
 	    &sc->sc_ctrlh)) {
 		printf(": failed to map registers\n");
@@ -166,17 +166,6 @@
 		   SCZ_ECCCTRL_CE_INTEN;
 	schizo_write(sc, SCZ_ECCCTRL, eccctrl);
 
-	schizo_init(sc);
-}
-
-void
-schizo_init(struct schizo_softc *sc)
-{
-	struct schizo_pbm *pbm;
-	struct pcibus_attach_args pba;
-	int *busranges = NULL, nranges;
-	u_int64_t /*match,*/ reg;
-
 	pbm = malloc(sizeof(*pbm), M_DEVBUF, M_NOWAIT | M_ZERO);
 	if (pbm == NULL)
 		panic("schizo: can't alloc schizo pbm");
@@ -184,11 +173,21 @@
 	pbm->sp_sc = sc;
 	pbm->sp_regt = sc->sc_bustag;
 
-	if ((sc->sc_reg0.ur_paddr & 0x00700000) == 0x00600000)
+	if ((ma->ma_reg[0].ur_paddr & 0x00700000) == 0x00600000)
 		pbm->sp_bus_a = 1;
 	else
 		pbm->sp_bus_a = 0;
 
+	/*
+	 * Map interrupt registers
+	 */
+	if (bus_space_map(sc->sc_bustag, ma->ma_reg[0].ur_paddr,
+			  ma->ma_reg[0].ur_len,
+			  BUS_SPACE_MAP_LINEAR, &pbm->sp_intrh)) {
+		printf(": failed to interrupt map registers\n");
+		return;
+	}
+
 	if (prom_getprop(sc->sc_node, "ranges", sizeof(struct schizo_range),
 	    &pbm->sp_nrange, (void **)&pbm->sp_range))
 		panic("schizo: can't get ranges");
@@ -382,6 +381,9 @@
 	vaddr_t va;
 	char *name;
 
+	if (prom_getproplen(sc->sc_node, "no-streaming-cache") < 0) {
+	}
+
 	va = (vaddr_t)pbm->sp_flush[0x40];
 
 	/* punch in our copies */
@@ -483,6 +485,7 @@
 {
 	struct intrhand *ih;
 	u_int64_t mapoff, clroff;
+	uintptr_t intrregs;
 
 	DPRINTF(SDB_INTR, ("%s: ino %x ign %x fn %p arg %p", __func__,
 	    ino, sc->sc_ign, handler, arg));
@@ -498,8 +501,9 @@
 	if (ih == NULL)
 		return;
 	ih->ih_arg = arg;
-	ih->ih_map = (uint64_t *)((char *)sc->sc_reg0.ur_paddr + mapoff);
-	ih->ih_clr = (uint64_t *)((char *)sc->sc_reg0.ur_paddr + clroff);
+	intrregs = (uintptr_t)bus_space_vaddr(pbm->sp_regt, pbm->sp_intrh);
+	ih->ih_map = (uint64_t *)(intrregs + mapoff);
+	ih->ih_clr = (uint64_t *)(intrregs + clroff);
 	ih->ih_fun = handler;
 	ih->ih_pil = (1<<ipl);
 	ih->ih_number = INTVEC(schizo_pbm_read(pbm, mapoff));
@@ -708,9 +712,9 @@
 	int (*handler)(void *), void *arg, void (*fastvec)(void) /* ignored */)
 {
 	struct schizo_pbm *pbm = t->cookie;
-	struct schizo_softc *sc = pbm->sp_sc;
 	struct intrhand *ih = NULL;
 	uint64_t mapoff, clroff;
+	uintptr_t intrregs;
 	volatile uint64_t *intrmapptr = NULL, *intrclrptr = NULL;
 	int ino;
 	long vec;
@@ -738,11 +742,12 @@
 	DPRINTF(SDB_INTR, ("%s: intr %x: %p mapoff %lx clroff %lx\n",
 	    __func__, ino, intrlev[ino], mapoff, clroff));
 
-	intrmapptr = (uint64_t *)((char *)sc->sc_reg0.ur_paddr + mapoff);
-	intrclrptr = (uint64_t *)((char *)sc->sc_reg0.ur_paddr + clroff);
+	intrregs = (uintptr_t)bus_space_vaddr(pbm->sp_regt, pbm->sp_intrh);
+	intrmapptr = (uint64_t *)(intrregs + mapoff);
+	intrclrptr = (uint64_t *)(intrregs + clroff);
 
 	if (INTIGN(vec) == 0)
-		ino |= schizo_pbm_read(pbm, mapoff) & INTMAP_IGN;
+		ino |= schizo_pbm_readintr(pbm, mapoff) & INTMAP_IGN;
 	else
 		ino |= vec & INTMAP_IGN;
 
@@ -769,22 +774,22 @@
 	if (intrmapptr) {
 		u_int64_t imap;
 
-		imap = schizo_pbm_read(pbm, mapoff);
+		imap = schizo_pbm_readintr(pbm, mapoff);
 		DPRINTF(SDB_INTR, ("; read intrmap = %016qx",
 			(unsigned long long)imap));
 		imap |= INTMAP_V;
 		DPRINTF(SDB_INTR, ("; addr of intrmapptr = %p", intrmapptr));
 		DPRINTF(SDB_INTR, ("; writing intrmap = %016qx\n",
 			(unsigned long long)imap));
-		schizo_pbm_write(pbm, mapoff, imap);
-		imap = schizo_pbm_read(pbm, mapoff);
+		schizo_pbm_writeintr(pbm, mapoff, imap);
+		imap = schizo_pbm_readintr(pbm, mapoff);
 		DPRINTF(SDB_INTR, ("; reread intrmap = %016qx",
 			(unsigned long long)imap));
 		ih->ih_number |= imap & INTMAP_INR;
 	}
  	if (intrclrptr) {
  		/* set state to IDLE */
-		schizo_pbm_write(pbm, clroff, 0);
+		schizo_pbm_writeintr(pbm, clroff, 0);
  	}
 
 	return (ih);

Index: src/sys/arch/sparc64/dev/schizovar.h
diff -u src/sys/arch/sparc64/dev/schizovar.h:1.3 src/sys/arch/sparc64/dev/schizovar.h:1.4
--- src/sys/arch/sparc64/dev/schizovar.h:1.3	Sat Dec 13 08:07:23 2008
+++ src/sys/arch/sparc64/dev/schizovar.h	Sat Feb  6 00:23:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: schizovar.h,v 1.3 2008/12/13 08:07:23 mrg Exp $	*/
+/*	$NetBSD: schizovar.h,v 1.4 2010/02/06 00:23:30 mrg Exp $	*/
 /*	$OpenBSD: schizovar.h,v 1.10 2007/01/14 16:19:49 kettenis Exp $	*/
 
 /*
@@ -40,6 +40,7 @@
 	bus_space_tag_t		sp_iot;
 	bus_space_tag_t		sp_regt;
 	bus_space_handle_t	sp_regh;
+	bus_space_handle_t	sp_intrh;
 	bus_space_tag_t		sp_cfgt;
 	bus_space_handle_t	sp_cfgh;
 	bus_dma_tag_t		sp_dmat;
@@ -57,10 +58,8 @@
 	int sc_ign;
 	bus_dma_tag_t sc_dmat;
 	bus_space_tag_t sc_bustag;
-	bus_addr_t sc_ctrl;
 	bus_space_handle_t sc_ctrlh;
 	bus_space_handle_t sc_confh;
-	struct upa_reg sc_reg0;
 
 	int sc_busa;
 	int sc_tomatillo;
@@ -74,6 +73,10 @@
     bus_space_read_8((pbm)->sp_regt, (pbm)->sp_regh, (r))
 #define	schizo_pbm_write(pbm,r,v) \
     bus_space_write_8((pbm)->sp_regt, (pbm)->sp_regh, (r), (v))
+#define	schizo_pbm_readintr(pbm,r) \
+    bus_space_read_8((pbm)->sp_regt, (pbm)->sp_intrh, (r))
+#define	schizo_pbm_writeintr(pbm,r,v) \
+    bus_space_write_8((pbm)->sp_regt, (pbm)->sp_intrh, (r), (v))
 #define	schizo_cfg_read(pbm,r) \
     bus_space_read_4((pbm)->sp_cfgt, (pbm)->sp_cfgh, (r))
 #define	schizo_cfg_write(pbm,r,v) \

Index: src/sys/arch/sparc64/sparc64/locore.s
diff -u src/sys/arch/sparc64/sparc64/locore.s:1.310 src/sys/arch/sparc64/sparc64/locore.s:1.311
--- src/sys/arch/sparc64/sparc64/locore.s:1.310	Tue Feb  2 04:28:56 2010
+++ src/sys/arch/sparc64/sparc64/locore.s	Sat Feb  6 00:23:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.310 2010/02/02 04:28:56 mrg Exp $	*/
+/*	$NetBSD: locore.s,v 1.311 2010/02/06 00:23:30 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath
@@ -55,8 +55,8 @@
  *	@(#)locore.s	8.4 (Berkeley) 12/10/93
  */
 
-#ifndef SCHIZO_BUS_SPACE_BROKEN /* Need phys access for USIII so far */
-#define	SPITFIRE		/* Cheetah (USIII) */
+#ifndef CHEETAH
+#define	SPITFIRE
 #endif
 #undef	PARANOID		/* Extremely expensive consistency checks */
 #undef	NO_VCACHE		/* Map w/D$ disabled */
@@ -3946,11 +3946,7 @@
 
 	brz,pn	%l1, 0f
 	 add	%l5, %o0, %l5
-#ifdef SCHIZO_BUS_SPACE_BROKEN 
-	stxa	%g0, [%l1] ASI_PHYS_NON_CACHED		! Clear intr source
-#else
 	stx	%g0, [%l1]		! Clear intr source
-#endif
 	membar	#Sync			! Should not be needed
 0:
 	cmp	%l7, -1

Reply via email to