From owner-p4-projects@FreeBSD.ORG Wed Apr 19 17:33:09 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4417816A506; Wed, 19 Apr 2006 17:33:09 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E3D3A16A408 for ; Wed, 19 Apr 2006 17:33:08 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 9043243D45 for ; Wed, 19 Apr 2006 17:33:08 +0000 (GMT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id k3JHX8Wf002578 for ; Wed, 19 Apr 2006 17:33:08 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id k3JHX87w002572 for perforce@freebsd.org; Wed, 19 Apr 2006 17:33:08 GMT (envelope-from marcel@freebsd.org) Date: Wed, 19 Apr 2006 17:33:08 GMT Message-Id: <200604191733.k3JHX87w002572@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 95599 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Apr 2006 17:33:09 -0000 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. and into the generic file. There's too much duplication. o Move the ppc options from options. 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 #include #include -#include -#include -#include #include #include #include -#include #include -#include -#include +#ifdef __i386__ +#include +#include +#include +#endif #include #include @@ -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 #include #include - + #include #include @@ -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[];