Date: Mon, 17 Nov 2008 02:24:26 GMT From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 153068 for review Message-ID: <200811170224.mAH2OQXe057690@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=153068 Change 153068 by nwhitehorn@nwhitehorn_trantor on 2008/11/17 02:23:57 Very small changes in very many files -- move ofw_bus.* from sparc64 into dev/ofw/ofw_bus_subr*. Both PowerPC and sparc64 now use this code, which works very nicely. This finishes the elimination of the ofw_pci_fixup() hack on PPC. Tested on: Sun Ultra 5, iBook G4, Powermac G3 Affected files ... .. //depot/projects/ppc-g5/sys/conf/files.powerpc#10 edit .. //depot/projects/ppc-g5/sys/conf/files.sparc64#5 edit .. //depot/projects/ppc-g5/sys/dev/ofw/ofw_bus_subr.c#2 edit .. //depot/projects/ppc-g5/sys/dev/ofw/ofw_bus_subr.h#2 edit .. //depot/projects/ppc-g5/sys/dev/ofw/ofw_imap.c#3 delete .. //depot/projects/ppc-g5/sys/dev/ofw/ofw_imap.h#2 delete .. //depot/projects/ppc-g5/sys/dev/ofw/openfirm.h#4 edit .. //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_isa.c#2 edit .. //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_pcib_pci.c#5 edit .. //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_pcibus.c#4 edit .. //depot/projects/ppc-g5/sys/powerpc/powermac/cpcht.c#10 edit .. //depot/projects/ppc-g5/sys/powerpc/powermac/grackle.c#8 edit .. //depot/projects/ppc-g5/sys/powerpc/powermac/uninorth.c#8 edit .. //depot/projects/ppc-g5/sys/sparc64/ebus/ebus.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/include/ofw_bus.h#2 delete .. //depot/projects/ppc-g5/sys/sparc64/isa/ofw_isa.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/apb.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pci.h#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcib.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcib_subr.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcibus.c#2 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/psycho.c#3 edit .. //depot/projects/ppc-g5/sys/sparc64/pci/schizo.c#3 edit .. //depot/projects/ppc-g5/sys/sparc64/sparc64/ofw_bus.c#2 delete .. //depot/projects/ppc-g5/sys/sparc64/sparc64/ofw_machdep.c#4 edit Differences ... ==== //depot/projects/ppc-g5/sys/conf/files.powerpc#10 (text+ko) ==== @@ -44,7 +44,6 @@ dev/ofw/ofw_bus_subr.c optional aim dev/ofw/ofw_console.c optional aim dev/ofw/ofw_disk.c optional ofwd aim -dev/ofw/ofw_imap.c optional aim dev/ofw/ofw_standard.c optional aim dev/powermac_nvram/powermac_nvram.c optional powermac_nvram powermac dev/quicc/quicc_bfe_ocp.c optional quicc mpc85xx ==== //depot/projects/ppc-g5/sys/conf/files.sparc64#5 (text+ko) ==== @@ -123,7 +123,6 @@ sparc64/sparc64/mp_locore.S optional smp sparc64/sparc64/mp_machdep.c optional smp sparc64/sparc64/nexus.c standard -sparc64/sparc64/ofw_bus.c standard sparc64/sparc64/ofw_machdep.c standard sparc64/sparc64/pmap.c standard sparc64/sparc64/prof_machdep.c optional profiling-routine ==== //depot/projects/ppc-g5/sys/dev/ofw/ofw_bus_subr.c#2 (text+ko) ==== @@ -1,4 +1,6 @@ /*- + * Copyright (C) 1996 Wolfgang Solfrank. + * Copyright (C) 1996 TooLs GmbH. * Copyright (c) 2005 Marius Strobl <marius@FreeBSD.org> * All rights reserved. * @@ -126,3 +128,135 @@ return (NULL); return (obd->obd_type); } + +static int +ofw_bus_searchprop(phandle_t node, char *propname, void *buf, int buflen) +{ + int rv; + + for (; node != 0; node = OF_parent(node)) { + if ((rv = OF_getprop(node, propname, buf, buflen)) != -1) + return (rv); + } + return (-1); +} + +void +ofw_bus_setup_iinfo(phandle_t node, struct ofw_bus_iinfo *ii, int intrsz) +{ + pcell_t addrc; + int msksz; + + if (OF_getprop(node, "#address-cells", &addrc, sizeof(addrc)) == -1) + addrc = 2; + ii->opi_addrc = addrc * sizeof(pcell_t); + + ii->opi_imapsz = OF_getprop_alloc(node, "interrupt-map", 1, + (void **)&ii->opi_imap); + if (ii->opi_imapsz > 0) { + msksz = OF_getprop_alloc(node, "interrupt-map-mask", 1, + (void **)&ii->opi_imapmsk); + /* + * Failure to get the mask is ignored; a full mask is used then. + * Barf on bad mask sizes, however. + */ + if (msksz != -1 && msksz != ii->opi_addrc + intrsz) { + panic("ofw_bus_setup_iinfo: bad interrupt-map-mask " + "property!"); + } + } + +} + +int +ofw_bus_lookup_imap(phandle_t node, struct ofw_bus_iinfo *ii, void *reg, + int regsz, void *pintr, int pintrsz, void *mintr, int mintrsz, + void *maskbuf) +{ + int rv; + + if (ii->opi_imapsz <= 0) + return (0); + KASSERT(regsz >= ii->opi_addrc, + ("ofw_bus_lookup_imap: register size too small: %d < %d", + regsz, ii->opi_addrc)); + rv = OF_getprop(node, "reg", reg, regsz); + if (rv < regsz) + panic("ofw_bus_lookup_imap: could not get reg property"); + return (ofw_bus_search_intrmap(pintr, pintrsz, reg, ii->opi_addrc, + ii->opi_imap, ii->opi_imapsz, ii->opi_imapmsk, maskbuf, mintr, + mintrsz)); +} + +/* + * Map an interrupt using the firmware reg, interrupt-map and + * interrupt-map-mask properties. + * The interrupt property to be mapped must be of size intrsz, and pointed to + * by intr. The regs property of the node for which the mapping is done must + * be passed as regs. This property is an array of register specifications; + * the size of the address part of such a specification must be passed as + * physsz. Only the first element of the property is used. + * imap and imapsz hold the interrupt mask and it's size. + * imapmsk is a pointer to the interrupt-map-mask property, which must have + * a size of physsz + intrsz; it may be NULL, in which case a full mask is + * assumed. + * maskbuf must point to a buffer of length physsz + intrsz. + * The interrupt is returned in result, which must point to a buffer of length + * rintrsz (which gives the expected size of the mapped interrupt). + * Returns 1 if a mapping was found, 0 otherwise. + */ +int +ofw_bus_search_intrmap(void *intr, int intrsz, void *regs, int physsz, + void *imap, int imapsz, void *imapmsk, void *maskbuf, void *result, + int rintrsz) +{ + phandle_t parent; + u_int8_t *ref = maskbuf; + u_int8_t *uiintr = intr; + u_int8_t *uiregs = regs; + u_int8_t *uiimapmsk = imapmsk; + u_int8_t *mptr; + pcell_t pintrsz; + int i, rsz, tsz; + + rsz = -1; + if (imapmsk != NULL) { + for (i = 0; i < physsz; i++) + ref[i] = uiregs[i] & uiimapmsk[i]; + for (i = 0; i < intrsz; i++) + ref[physsz + i] = uiintr[i] & uiimapmsk[physsz + i]; + } else { + bcopy(regs, ref, physsz); + bcopy(intr, ref + physsz, intrsz); + } + + mptr = imap; + i = imapsz; + tsz = physsz + intrsz + sizeof(phandle_t) + rintrsz; + while (i > 0) { + KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map")); + bcopy(mptr + physsz + intrsz, &parent, sizeof(parent)); + if (ofw_bus_searchprop(parent, "#interrupt-cells", + &pintrsz, sizeof(pintrsz)) == -1) + pintrsz = 1; /* default */ + pintrsz *= sizeof(pcell_t); + if (pintrsz != rintrsz) + panic("ofw_bus_search_intrmap: expected interrupt cell " + "size incorrect: %d > %d", rintrsz, pintrsz); + + /* + * XXX: Apple hardware used a second cell to set information + * on the interrupt trigger type. This information should + * be used. + */ + + if (bcmp(ref, mptr, physsz + intrsz) == 0) { + bcopy(mptr + physsz + intrsz + sizeof(parent), + result, rintrsz); + return (1); + } + mptr += tsz; + i -= tsz; + } + return (0); +} ==== //depot/projects/ppc-g5/sys/dev/ofw/ofw_bus_subr.h#2 (text+ko) ==== @@ -37,9 +37,27 @@ #include "ofw_bus_if.h" +#define ORIP_NOINT -1 +#define ORIR_NOTFOUND 0xffffffff + +struct ofw_bus_iinfo { + u_int8_t *opi_imap; + u_int8_t *opi_imapmsk; + int opi_imapsz; + pcell_t opi_addrc; +}; + int ofw_bus_gen_setup_devinfo(struct ofw_bus_devinfo *, phandle_t); void ofw_bus_gen_destroy_devinfo(struct ofw_bus_devinfo *); +/* Routines for processing firmware interrupt maps */ + +void ofw_bus_setup_iinfo(phandle_t, struct ofw_bus_iinfo *, int); +int ofw_bus_lookup_imap(phandle_t, struct ofw_bus_iinfo *, void *, int, + void *, int, void *, int, void *); +int ofw_bus_search_intrmap(void *, int, void *, int, void *, int, void *, + void *, void *, int); + ofw_bus_get_compat_t ofw_bus_gen_get_compat; ofw_bus_get_model_t ofw_bus_gen_get_model; ofw_bus_get_name_t ofw_bus_gen_get_name; ==== //depot/projects/ppc-g5/sys/dev/ofw/openfirm.h#4 (text+ko) ==== @@ -64,8 +64,9 @@ * Prototypes for Open Firmware Interface Routines */ -typedef unsigned int ihandle_t; -typedef unsigned int phandle_t; +typedef uint32_t ihandle_t; +typedef uint32_t phandle_t; +typedef uint32_t pcell_t; #ifdef _KERNEL #include <sys/cdefs.h> ==== //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_isa.c#2 (text+ko) ==== @@ -42,9 +42,9 @@ #include <sys/bus.h> #include <dev/ofw/openfirm.h> -#include <dev/ofw/ofw_imap.h> #include <dev/ofw/ofw_pci.h> #include <dev/ofw/ofw_bus.h> +#include <dev/ofw/ofw_bus_subr.h> #include <dev/pci/pcivar.h> ==== //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_pcib_pci.c#5 (text+ko) ==== @@ -35,8 +35,8 @@ #include <dev/ofw/openfirm.h> #include <dev/ofw/ofw_pci.h> -#include <dev/ofw/ofw_imap.h> #include <dev/ofw/ofw_bus.h> +#include <dev/ofw/ofw_bus_subr.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/powerpc/ofw/ofw_pcibus.c#4 (text+ko) ==== @@ -40,7 +40,6 @@ #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> #include <dev/ofw/ofw_pci.h> -#include <dev/ofw/ofw_imap.h> #include <dev/ofw/openfirm.h> #include <machine/bus.h> ==== //depot/projects/ppc-g5/sys/powerpc/powermac/cpcht.c#10 (text+ko) ==== @@ -46,7 +46,6 @@ #include <sys/rman.h> #include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_imap.h> #include <dev/ofw/ofw_bus_subr.h> #include <powerpc/powermac/cpchtvar.h> ==== //depot/projects/ppc-g5/sys/powerpc/powermac/grackle.c#8 (text+ko) ==== @@ -37,7 +37,7 @@ #include <dev/ofw/openfirm.h> #include <dev/ofw/ofw_pci.h> #include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_imap.h> +#include <dev/ofw/ofw_bus_subr.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/powerpc/powermac/uninorth.c#8 (text+ko) ==== @@ -35,7 +35,7 @@ #include <dev/ofw/openfirm.h> #include <dev/ofw/ofw_pci.h> #include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_imap.h> +#include <dev/ofw/ofw_bus_subr.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/sparc64/ebus/ebus.c#2 (text+ko) ==== @@ -51,7 +51,6 @@ #include <dev/ofw/ofw_bus_subr.h> #include <dev/ofw/openfirm.h> -#include <machine/ofw_bus.h> #include <machine/resource.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/sparc64/isa/ofw_isa.c#2 (text+ko) ==== @@ -41,10 +41,10 @@ #include <sys/bus.h> #include <dev/ofw/openfirm.h> +#include <dev/ofw/ofw_bus_subr.h> #include <machine/bus.h> #include <machine/resource.h> -#include <machine/ofw_bus.h> #include <sparc64/pci/ofw_pci.h> #include <sparc64/isa/ofw_isa.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/apb.c#2 (text+ko) ==== @@ -53,7 +53,6 @@ #include <dev/ofw/openfirm.h> #include <machine/bus.h> -#include <machine/ofw_bus.h> #include <machine/resource.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pci.h#2 (text+ko) ==== @@ -34,7 +34,7 @@ #ifndef _SPARC64_PCI_OFW_PCI_H_ #define _SPARC64_PCI_OFW_PCI_H_ -#include <machine/ofw_bus.h> +#include <dev/ofw/ofw_bus_subr.h> typedef uint32_t ofw_pci_intr_t; ==== //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcib.c#2 (text+ko) ==== @@ -45,7 +45,6 @@ #include <dev/ofw/openfirm.h> #include <machine/bus.h> -#include <machine/ofw_bus.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcib_subr.c#2 (text+ko) ==== @@ -37,7 +37,6 @@ #include <dev/ofw/openfirm.h> #include <machine/bus.h> -#include <machine/ofw_bus.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/ofw_pcibus.c#2 (text+ko) ==== @@ -40,7 +40,6 @@ #include <sys/pciio.h> #include <dev/ofw/ofw_bus.h> -#include <dev/ofw/ofw_bus_subr.h> #include <dev/ofw/ofw_pci.h> #include <dev/ofw/openfirm.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/psycho.c#3 (text+ko) ==== @@ -64,7 +64,6 @@ #include <machine/bus_private.h> #include <machine/iommureg.h> #include <machine/iommuvar.h> -#include <machine/ofw_bus.h> #include <machine/resource.h> #include <machine/ver.h> ==== //depot/projects/ppc-g5/sys/sparc64/pci/schizo.c#3 (text+ko) ==== @@ -64,7 +64,6 @@ #include <machine/fsr.h> #include <machine/iommureg.h> #include <machine/iommuvar.h> -#include <machine/ofw_bus.h> #include <machine/resource.h> #include <dev/pci/pcireg.h> ==== //depot/projects/ppc-g5/sys/sparc64/sparc64/ofw_machdep.c#4 (text+ko) ==== @@ -43,7 +43,6 @@ #include <machine/bus.h> #include <machine/idprom.h> -#include <machine/ofw_bus.h> #include <machine/ofw_machdep.h> void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811170224.mAH2OQXe057690>