Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Apr 2006 17:33:08 GMT
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 95599 for review
Message-ID:  <200604191733.k3JHX87w002572@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=95599

Change 95599 by marcel@marcel_nfs on 2006/04/19 17:32:51

	Revamp ppc(4):
	o  Move the ppc files out of files.<arch> and into the
	   generic file. There's too much duplication.
	o  Move the ppc options from options.<arch> to options.
	   Too much duplication.
	o  Add a PCI bus attachment and probe single port parallel
	   cards. This requires the support for non-xero I/O port
	   RIDs.
	o  Add seperate ISA and ACPI attachments. When ISA is
	   configured in the kernel, the ACPI attachment will use
	   ISA dma.
	o  Remove any and all ISA specifics from ppc.c and move
	   it to the ISA bus attachment.
	o  Change ppc_write() to a dummy function that always
	   returns EINVAL. This is used by non-ISA attachments.
	o  White-space fixups.
	
	This breaks PC98.

Affected files ...

.. //depot/projects/uart/conf/files#60 edit
.. //depot/projects/uart/conf/files.alpha#15 edit
.. //depot/projects/uart/conf/files.amd64#18 edit
.. //depot/projects/uart/conf/files.i386#23 edit
.. //depot/projects/uart/conf/files.ia64#16 edit
.. //depot/projects/uart/conf/files.pc98#20 edit
.. //depot/projects/uart/conf/options#29 edit
.. //depot/projects/uart/conf/options.alpha#5 edit
.. //depot/projects/uart/conf/options.amd64#7 edit
.. //depot/projects/uart/conf/options.i386#12 edit
.. //depot/projects/uart/conf/options.ia64#6 edit
.. //depot/projects/uart/conf/options.pc98#11 edit
.. //depot/projects/uart/dev/ppc/ppc.c#9 edit
.. //depot/projects/uart/dev/ppc/ppc_acpi.c#1 add
.. //depot/projects/uart/dev/ppc/ppc_isa.c#1 add
.. //depot/projects/uart/dev/ppc/ppc_pci.c#1 add
.. //depot/projects/uart/dev/ppc/ppc_puc.c#4 edit
.. //depot/projects/uart/dev/ppc/ppcreg.h#2 edit
.. //depot/projects/uart/dev/ppc/ppcvar.h#4 edit

Differences ...

==== //depot/projects/uart/conf/files#60 (text+ko) ====

@@ -804,6 +804,11 @@
 dev/ppbus/pps.c			optional pps
 dev/ppbus/vpo.c			optional vpo
 dev/ppbus/vpoio.c		optional vpo
+dev/ppc/ppc.c			optional ppc
+dev/ppc/ppc_acpi.c		optional ppc acpi
+dev/ppc/ppc_isa.c		optional ppc isa
+dev/ppc/ppc_pci.c		optional ppc pci
+dev/ppc/ppc_puc.c		optional ppc puc
 dev/pst/pst-iop.c		optional pst
 dev/pst/pst-pci.c		optional pst pci
 dev/pst/pst-raid.c		optional pst

==== //depot/projects/uart/conf/files.alpha#15 (text+ko) ====

@@ -179,8 +179,6 @@
 dev/fdc/fdc_isa.c		optional	fdc isa
 dev/hwpmc/hwpmc_alpha.c		optional	hwpmc
 dev/kbd/kbd.c			optional	atkbd | sc | ukbd
-dev/ppc/ppc.c			optional        ppc
-dev/ppc/ppc_puc.c		optional	ppc puc
 dev/sio/sio.c			optional	sio
 dev/sio/sio_isa.c		optional	sio isa
 dev/syscons/schistory.c		optional	sc

==== //depot/projects/uart/conf/files.amd64#18 (text+ko) ====

@@ -173,8 +173,6 @@
 dev/kbd/kbd.c			optional	atkbd | sc | ukbd
 dev/mem/memutil.c		optional	mem
 dev/nve/if_nve.c		optional	nve pci
-dev/ppc/ppc.c			optional	ppc
-dev/ppc/ppc_puc.c		optional	ppc puc
 dev/sio/sio.c			optional	sio
 dev/sio/sio_isa.c		optional	sio isa
 dev/speaker/spkr.c		optional	speaker

==== //depot/projects/uart/conf/files.i386#23 (text+ko) ====

@@ -193,8 +193,6 @@
 dev/mse/mse_isa.c		optional mse isa
 dev/nve/if_nve.c		optional nve pci
 dev/pcf/pcf_isa.c		optional pcf
-dev/ppc/ppc.c			optional ppc
-dev/ppc/ppc_puc.c		optional ppc puc pci
 dev/random/nehemiah.c		optional random
 dev/sbni/if_sbni.c		optional sbni
 dev/sbni/if_sbni_isa.c		optional sbni isa

==== //depot/projects/uart/conf/files.ia64#16 (text+ko) ====

@@ -58,8 +58,6 @@
 dev/fb/vga.c			optional	vga
 dev/hwpmc/hwpmc_ia64.c		optional	hwpmc
 dev/kbd/kbd.c			optional	atkbd | sc | ukbd
-dev/ppc/ppc.c			optional	ppc isa
-dev/ppc/ppc_puc.c		optional	ppc puc
 dev/syscons/schistory.c		optional	sc
 dev/syscons/scmouse.c		optional	sc
 dev/syscons/scterm-dumb.c	optional	sc

==== //depot/projects/uart/conf/files.pc98#20 (text+ko) ====

@@ -110,7 +110,6 @@
 dev/mem/memutil.c		optional mem
 dev/mse/mse.c			optional mse
 dev/mse/mse_cbus.c		optional mse isa
-dev/ppc/ppc_puc.c		optional ppc puc pci
 dev/sbni/if_sbni.c		optional sbni
 dev/sbni/if_sbni_pci.c		optional sbni pci
 dev/snc/dp83932.c		optional snc

==== //depot/projects/uart/conf/options#29 (text+ko) ====

@@ -121,6 +121,8 @@
 MUTEX_WAKE_ALL
 NSWBUF_MIN	opt_swap.h
 PANIC_REBOOT_WAIT_TIME	opt_panic.h
+PPC_DEBUG	opt_ppc.h
+PPC_PROBE_CHIPSET opt_ppc.h
 PPS_SYNC	opt_ntp.h
 PREEMPTION	opt_sched.h
 QUOTA

==== //depot/projects/uart/conf/options.alpha#5 (text+ko) ====

@@ -18,9 +18,6 @@
 
 MAXMEM
 
-PPC_PROBE_CHIPSET       opt_ppc.h
-PPC_DEBUG               opt_ppc.h
-
 VGA_ALT_SEQACCESS	opt_vga.h
 VGA_DEBUG		opt_vga.h
 VGA_NO_FONT_LOADING	opt_vga.h

==== //depot/projects/uart/conf/options.amd64#7 (text+ko) ====

@@ -49,8 +49,6 @@
 # EOF
 # -------------------------------
 HAMMER			opt_cpu.h
-PPC_PROBE_CHIPSET	opt_ppc.h
-PPC_DEBUG		opt_ppc.h
 PSM_HOOKRESUME		opt_psm.h
 PSM_RESETAFTERSUSPEND	opt_psm.h
 PSM_DEBUG		opt_psm.h

==== //depot/projects/uart/conf/options.i386#12 (text+ko) ====

@@ -15,8 +15,6 @@
 PERFMON
 PMAP_SHPGPERPROC	opt_pmap.h
 POWERFAIL_NMI		opt_trap.h
-PPC_DEBUG		opt_ppc.h
-PPC_PROBE_CHIPSET	opt_ppc.h
 
 # Options for emulators.  These should only be used at config time, so
 # they are handled like options for static filesystems

==== //depot/projects/uart/conf/options.ia64#6 (text+ko) ====

@@ -11,9 +11,6 @@
 
 COMPAT_IA32		opt_compat.h
 
-PPC_PROBE_CHIPSET       opt_ppc.h
-PPC_DEBUG               opt_ppc.h
-
 VGA_ALT_SEQACCESS	opt_vga.h
 VGA_DEBUG		opt_vga.h
 VGA_NO_FONT_LOADING	opt_vga.h

==== //depot/projects/uart/conf/options.pc98#11 (text+ko) ====

@@ -14,8 +14,6 @@
 PERFMON
 PMAP_SHPGPERPROC	opt_pmap.h
 POWERFAIL_NMI		opt_trap.h
-PPC_DEBUG		opt_ppc.h
-PPC_PROBE_CHIPSET	opt_ppc.h
 
 # Options for emulators.  These should only be used at config time, so
 # they are handled like options for static filesystems

==== //depot/projects/uart/dev/ppc/ppc.c#9 (text+ko) ====

@@ -36,18 +36,17 @@
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/malloc.h>
-#include <sys/kdb.h>
   
-#include <vm/vm.h>
-#include <vm/pmap.h>
 #include <machine/clock.h>
 #include <machine/bus.h>
 #include <machine/resource.h>
-#include <machine/vmparam.h>
 #include <sys/rman.h>
 
-#include <isa/isareg.h>
-#include <isa/isavar.h>
+#ifdef __i386__
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <machine/vmparam.h>
+#endif
 
 #include <dev/ppbus/ppbconf.h>
 #include <dev/ppbus/ppb_msq.h>
@@ -57,9 +56,10 @@
 
 #include "ppbus_if.h"
 
-static int ppc_isa_probe(device_t dev);
+static void ppcintr(void *arg);
 
-static void ppcintr(void *arg);
+#define	IO_LPTSIZE_EXTENDED	8	/* "Extended" LPT controllers */
+#define	IO_LPTSIZE_NORMAL	4	/* "Normal" LPT controllers */
 
 #define LOG_PPC(function, ppc, string) \
 		if (bootverbose) printf("%s: %s\n", function, string)
@@ -68,37 +68,8 @@
 #define DEVTOSOFTC(dev) ((struct ppc_data *)device_get_softc(dev))
 
 devclass_t ppc_devclass;
-  
-static device_method_t ppc_methods[] = {
-	/* device interface */
-	DEVMETHOD(device_probe,         ppc_isa_probe),
-	DEVMETHOD(device_attach,        ppc_attach),
-	DEVMETHOD(device_detach,        ppc_detach),
-
-	/* bus interface */
-	DEVMETHOD(bus_read_ivar,	ppc_read_ivar),
-	DEVMETHOD(bus_setup_intr,	ppc_setup_intr),
-	DEVMETHOD(bus_teardown_intr,	ppc_teardown_intr),
-	DEVMETHOD(bus_alloc_resource,   bus_generic_alloc_resource),
+const char ppc_driver_name[] = "ppc";  
 
-	/* ppbus interface */
-	DEVMETHOD(ppbus_io,		ppc_io),
-	DEVMETHOD(ppbus_exec_microseq,	ppc_exec_microseq),
-	DEVMETHOD(ppbus_reset_epp,	ppc_reset_epp),
-	DEVMETHOD(ppbus_setmode,	ppc_setmode),
-	DEVMETHOD(ppbus_ecp_sync,	ppc_ecp_sync),
-	DEVMETHOD(ppbus_read,		ppc_read),
-	DEVMETHOD(ppbus_write,		ppc_write),
-
-        { 0, 0 }
-  };
-  
-static driver_t ppc_driver = {
-	"ppc",
-	ppc_methods,
-	sizeof(struct ppc_data),
-};
-
 static char *ppc_models[] = {
 	"SMC-like", "SMC FDC37C665GT", "SMC FDC37C666GT", "PC87332", "PC87306",
 	"82091AA", "Generic", "W83877F", "W83877AF", "Winbond", "PC87334",
@@ -1593,12 +1564,7 @@
 #ifdef PPC_DEBUG
 				printf("d");
 #endif
-				isa_dmadone(
-					ppc->ppc_dmaflags,
-					ppc->ppc_dmaddr,
-					ppc->ppc_dmacnt,
-					ppc->ppc_dmachan);
-
+				ppc->ppc_dmadone(ppc);
 				ppc->ppc_dmastat = PPC_DMA_COMPLETE;
 
 				/* wakeup the waiting process */
@@ -1620,163 +1586,10 @@
 	return (EINVAL);
 }
 
-/*
- * Call this function if you want to send data in any advanced mode
- * of your parallel port: FIFO, DMA
- *
- * If what you want is not possible (no ECP, no DMA...),
- * EINVAL is returned
- */
 int
 ppc_write(device_t dev, char *buf, int len, int how)
 {
-	struct ppc_data *ppc = DEVTOSOFTC(dev);
-	char ecr, ecr_sav, ctr, ctr_sav;
-	int s, error = 0;
-	int spin;
-
-#ifdef PPC_DEBUG
-	printf("w");
-#endif
-
-	ecr_sav = r_ecr(ppc);
-	ctr_sav = r_ctr(ppc);
-
-	/*
-	 * Send buffer with DMA, FIFO and interrupts
-	 */
-	if ((ppc->ppc_avm & PPB_ECP) && (ppc->ppc_registered)) {
-
-	    if (ppc->ppc_dmachan > 0) {
-
-		/* byte mode, no intr, no DMA, dir=0, flush fifo
-		 */
-		ecr = PPC_ECR_STD | PPC_DISABLE_INTR;
-		w_ecr(ppc, ecr);
-
-		/* disable nAck interrupts */
-		ctr = r_ctr(ppc);
-		ctr &= ~IRQENABLE;
-		w_ctr(ppc, ctr);
-
-		ppc->ppc_dmaflags = 0;
-		ppc->ppc_dmaddr = (caddr_t)buf;
-		ppc->ppc_dmacnt = (u_int)len;
-
-		switch (ppc->ppc_mode) {
-		case PPB_COMPATIBLE:
-			/* compatible mode with FIFO, no intr, DMA, dir=0 */
-			ecr = PPC_ECR_FIFO | PPC_DISABLE_INTR | PPC_ENABLE_DMA;
-			break;
-		case PPB_ECP:
-			ecr = PPC_ECR_ECP | PPC_DISABLE_INTR | PPC_ENABLE_DMA;
-			break;
-		default:
-			error = EINVAL;
-			goto error;
-		}
-
-		w_ecr(ppc, ecr);
-		ecr = r_ecr(ppc);
-
-		/* enter splhigh() not to be preempted
-		 * by the dma interrupt, we may miss
-		 * the wakeup otherwise
-		 */
-		s = splhigh();
-
-		ppc->ppc_dmastat = PPC_DMA_INIT;
-
-		/* enable interrupts */
-		ecr &= ~PPC_SERVICE_INTR;
-		ppc->ppc_irqstat = PPC_IRQ_DMA;
-		w_ecr(ppc, ecr);
-
-		isa_dmastart(
-			ppc->ppc_dmaflags,
-			ppc->ppc_dmaddr,
-			ppc->ppc_dmacnt,
-			ppc->ppc_dmachan);
-#ifdef PPC_DEBUG
-		printf("s%d", ppc->ppc_dmacnt);
-#endif
-		ppc->ppc_dmastat = PPC_DMA_STARTED;
-
-		/* Wait for the DMA completed interrupt. We hope we won't
-		 * miss it, otherwise a signal will be necessary to unlock the
-		 * process.
-		 */
-		do {
-			/* release CPU */
-			error = tsleep(ppc,
-				PPBPRI | PCATCH, "ppcdma", 0);
-
-		} while (error == EWOULDBLOCK);
-
-		splx(s);
-
-		if (error) {
-#ifdef PPC_DEBUG
-			printf("i");
-#endif
-			/* stop DMA */
-			isa_dmadone(
-				ppc->ppc_dmaflags, ppc->ppc_dmaddr,
-				ppc->ppc_dmacnt, ppc->ppc_dmachan);
-
-			/* no dma, no interrupt, flush the fifo */
-			w_ecr(ppc, PPC_ECR_RESET);
-
-			ppc->ppc_dmastat = PPC_DMA_INTERRUPTED;
-			goto error;
-		}
-
-		/* wait for an empty fifo */
-		while (!(r_ecr(ppc) & PPC_FIFO_EMPTY)) {
-
-			for (spin=100; spin; spin--)
-				if (r_ecr(ppc) & PPC_FIFO_EMPTY)
-					goto fifo_empty;
-#ifdef PPC_DEBUG
-			printf("Z");
-#endif
-			error = tsleep(ppc, PPBPRI | PCATCH, "ppcfifo", hz/100);
-			if (error != EWOULDBLOCK) {
-#ifdef PPC_DEBUG
-				printf("I");
-#endif
-				/* no dma, no interrupt, flush the fifo */
-				w_ecr(ppc, PPC_ECR_RESET);
-
-				ppc->ppc_dmastat = PPC_DMA_INTERRUPTED;
-				error = EINTR;
-				goto error;
-			}
-		}
-
-fifo_empty:
-		/* no dma, no interrupt, flush the fifo */
-		w_ecr(ppc, PPC_ECR_RESET);
-
-	    } else
-		error = EINVAL;			/* XXX we should FIFO and
-						 * interrupts */
-	} else
-		error = EINVAL;
-
-error:
-
-	/* PDRQ must be kept unasserted until nPDACK is
-	 * deasserted for a minimum of 350ns (SMC datasheet)
-	 *
-	 * Consequence may be a FIFO that never empty
-	 */
-	DELAY(1);
-
-	w_ecr(ppc, ecr_sav);
-	w_ctr(ppc, ctr_sav);
-
-	return (error);
+	return (EINVAL);
 }
 
 void
@@ -1809,31 +1622,8 @@
 	return (ENXIO);
 }
 
-static struct isa_pnp_id lpc_ids[] = {
-	{ 0x0004d041, "Standard parallel printer port" }, /* PNP0400 */
-	{ 0x0104d041, "ECP parallel printer port" }, /* PNP0401 */
-	{ 0 }
-};
-
-static int
-ppc_isa_probe(device_t dev)
-{
-	device_t parent;
-	int error;
-
-	parent = device_get_parent(dev);
-
-	error = ISA_PNP_PROBE(parent, dev, lpc_ids);
-	if (error == ENXIO)
-		return (ENXIO);
-	else if (error != 0)	/* XXX shall be set after detection */
-		device_set_desc(dev, "Parallel port");
-
-	return(ppc_probe(dev));
-}
-		
 int
-ppc_probe(device_t dev)
+ppc_probe(device_t dev, int rid)
 {
 #ifdef __i386__
 	static short next_bios_ppc = 0;
@@ -1848,11 +1638,10 @@
 	ppc = DEVTOSOFTC(dev);
 	bzero(ppc, sizeof(struct ppc_data));
 
-	ppc->rid_irq = ppc->rid_drq = ppc->rid_ioport = 0;
-	ppc->res_irq = ppc->res_drq = ppc->res_ioport = 0;
+	ppc->rid_ioport = rid;
 
 	/* retrieve ISA parameters */
-	error = bus_get_resource(dev, SYS_RES_IOPORT, 0, &port, NULL);
+	error = bus_get_resource(dev, SYS_RES_IOPORT, rid, &port, NULL);
 
 #ifdef __i386__
 	/*
@@ -1869,7 +1658,7 @@
 			device_printf(dev, "parallel port not found.\n");
 			return ENXIO;
 		}
-		bus_set_resource(dev, SYS_RES_IOPORT, 0, port,
+		bus_set_resource(dev, SYS_RES_IOPORT, rid, port,
 				 IO_LPTSIZE_EXTENDED);
 	}
 #endif
@@ -1878,7 +1667,7 @@
 	 * There isn't a bios list on alpha. Put it in the usual place.
 	 */
 	if (error) {
-		bus_set_resource(dev, SYS_RES_IOPORT, 0, 0x3bc,
+		bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x3bc,
 				 IO_LPTSIZE_NORMAL);
 	}
 #endif
@@ -1981,12 +1770,6 @@
 		device_printf(dev, "FIFO with %d/%d/%d bytes threshold\n",
 			      ppc->ppc_fifo, ppc->ppc_wthr, ppc->ppc_rthr);
 
-	if ((ppc->ppc_avm & PPB_ECP) && (ppc->ppc_dmachan > 0)) {
-		/* acquire the DMA channel forever */	/* XXX */
-		isa_dma_acquire(ppc->ppc_dmachan);
-		isa_dmainit(ppc->ppc_dmachan, 1024); /* nlpt.BUFSIZE */
-	}
-
 	/* add ppbus as a child of this isa to parallel bridge */
 	ppbus = device_add_child(dev, "ppbus", -1);
 
@@ -2192,6 +1975,4 @@
 	return (error);
 }
 
-DRIVER_MODULE(ppc, isa, ppc_driver, ppc_devclass, 0, 0);
-DRIVER_MODULE(ppc, acpi, ppc_driver, ppc_devclass, 0, 0);
 MODULE_DEPEND(ppc, ppbus, 1, 1, 1);

==== //depot/projects/uart/dev/ppc/ppc_puc.c#4 (text+ko) ====

@@ -33,7 +33,7 @@
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/bus.h>
-  
+
 #include <machine/bus.h>
 
 #include <dev/puc/puc_bus.h>
@@ -49,14 +49,15 @@
 
 static device_method_t ppc_puc_methods[] = {
 	/* device interface */
-	DEVMETHOD(device_probe,         ppc_puc_probe),
-	DEVMETHOD(device_attach,        ppc_attach),
+	DEVMETHOD(device_probe,		ppc_puc_probe),
+	DEVMETHOD(device_attach,	ppc_attach),
+	DEVMETHOD(device_detach,	ppc_detach),
 
 	/* bus interface */
 	DEVMETHOD(bus_read_ivar,	ppc_read_ivar),
 	DEVMETHOD(bus_setup_intr,	ppc_setup_intr),
 	DEVMETHOD(bus_teardown_intr,	ppc_teardown_intr),
-	DEVMETHOD(bus_alloc_resource,   bus_generic_alloc_resource),
+	DEVMETHOD(bus_alloc_resource,	bus_generic_alloc_resource),
 
 	/* ppbus interface */
 	DEVMETHOD(ppbus_io,		ppc_io),
@@ -67,11 +68,11 @@
 	DEVMETHOD(ppbus_read,		ppc_read),
 	DEVMETHOD(ppbus_write,		ppc_write),
 
-        { 0, 0 }
-  };
-  
+	{ 0, 0 }
+};
+
 static driver_t ppc_puc_driver = {
-	"ppc",
+	ppc_driver_name,
 	ppc_puc_methods,
 	sizeof(struct ppc_data),
 };
@@ -89,7 +90,7 @@
 		return (ENXIO);
 
 	device_set_desc(dev, "Parallel port");
-	return (ppc_probe(dev));
+	return (ppc_probe(dev, 0));
 }
 
 DRIVER_MODULE(ppc, puc, ppc_puc_driver, ppc_devclass, 0, 0);

==== //depot/projects/uart/dev/ppc/ppcreg.h#2 (text+ko) ====

@@ -82,6 +82,7 @@
 	int ppc_dmaflags;	/* dma transfer flags */
 	caddr_t ppc_dmaddr;	/* buffer address */
 	u_int ppc_dmacnt;	/* count of bytes sent with dma */
+	void (*ppc_dmadone)(struct ppc_data*);
 
 #define PPC_PWORD_MASK	0x30
 #define PPC_PWORD_16	0x00

==== //depot/projects/uart/dev/ppc/ppcvar.h#4 (text+ko) ====

@@ -28,7 +28,7 @@
  *
  */
 
-int ppc_probe(device_t dev);
+int ppc_probe(device_t dev, int rid);
 int ppc_attach(device_t dev);
 int ppc_detach(device_t dev);
 int ppc_read_ivar(device_t bus, device_t dev, int index, uintptr_t *val);
@@ -46,4 +46,5 @@
 void ppc_ecp_sync(device_t);
 int ppc_setmode(device_t, int);
 
-extern	devclass_t	ppc_devclass;
+extern devclass_t ppc_devclass;
+extern const char ppc_driver_name[];



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604191733.k3JHX87w002572>