Module Name: src Committed By: dyoung Date: Sun Mar 14 20:19:06 UTC 2010
Modified Files: src/sys/arch/x86/include: pci_machdep.h src/sys/arch/x86/pci: pci_intr_machdep.c pci_machdep.c src/sys/arch/xen/include: pci_machdep.h Added Files: src/sys/arch/x86/include: pci_machdep_common.h Log Message: Add a new member, pc_super, to x86's pci_chipset_tag: pc.pc_super points to the tag that pc inherits its behavior from. Add code to deal with pc.pc_super. Pull identical declarations out of xen/include/pci_machdep.h and x86/include/pci_machdep.h into x86/include/pci_machdep_common.h. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/x86/include/pci_machdep.h cvs rdiff -u -r0 -r1.1 src/sys/arch/x86/include/pci_machdep_common.h cvs rdiff -u -r1.15 -r1.16 src/sys/arch/x86/pci/pci_intr_machdep.c cvs rdiff -u -r1.40 -r1.41 src/sys/arch/x86/pci/pci_machdep.c cvs rdiff -u -r1.16 -r1.17 src/sys/arch/xen/include/pci_machdep.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/x86/include/pci_machdep.h diff -u src/sys/arch/x86/include/pci_machdep.h:1.13 src/sys/arch/x86/include/pci_machdep.h:1.14 --- src/sys/arch/x86/include/pci_machdep.h:1.13 Thu Feb 25 20:48:34 2010 +++ src/sys/arch/x86/include/pci_machdep.h Sun Mar 14 20:19:06 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.13 2010/02/25 20:48:34 dyoung Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.14 2010/03/14 20:19:06 dyoung Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. @@ -34,126 +34,10 @@ #define _X86_PCI_MACHDEP_H_ /* - * Machine-specific definitions for PCI autoconfiguration. - */ -#define __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH - -/* - * i386-specific PCI structure and type definitions. - * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. - * - * Configuration tag; created from a {bus,device,function} triplet by - * pci_make_tag(), and passed to pci_conf_read() and pci_conf_write(). - * We could instead always pass the {bus,device,function} triplet to - * the read and write routines, but this would cause extra overhead. - * - * Mode 2 is historical and deprecated by the Revision 2.0 specification. - */ -union x86_pci_tag_u { - uint32_t mode1; - struct { - uint16_t port; - uint8_t enable; - uint8_t forward; - } mode2; -}; - -extern struct x86_bus_dma_tag pci_bus_dma_tag; -#ifdef _LP64 -extern struct x86_bus_dma_tag pci_bus_dma64_tag; -#endif - -struct pci_chipset_tag; -struct pci_attach_args; - -/* * Types provided to machine-independent PCI code */ -typedef struct pci_chipset_tag *pci_chipset_tag_t; -typedef union x86_pci_tag_u pcitag_t; typedef int pci_intr_handle_t; -struct pci_chipset_tag { - pcireg_t (*pc_conf_read)(pci_chipset_tag_t, pcitag_t, int); - - void (*pc_conf_write)(pci_chipset_tag_t, pcitag_t, int, pcireg_t); - -#if 0 - int (*pc_find_rom)(struct pci_attach_args *, bus_space_tag_t, - bus_space_handle_t, int, bus_space_handle_t *, bus_space_size_t *); -#endif - - int (*pc_intr_map)(struct pci_attach_args *, pci_intr_handle_t *); - - const char *(*pc_intr_string)(pci_chipset_tag_t, pci_intr_handle_t); - - const struct evcnt *(*pc_intr_evcnt)(pci_chipset_tag_t, - pci_intr_handle_t); - - void *(*pc_intr_establish)(pci_chipset_tag_t, pci_intr_handle_t, int, - int (*)(void *), void *); - - void (*pc_intr_disestablish)(pci_chipset_tag_t, void *); - - pcitag_t (*pc_make_tag)(pci_chipset_tag_t, int, int, int); - - void (*pc_decompose_tag)(pci_chipset_tag_t, pcitag_t, - int *, int *, int *); -}; - -/* - * i386-specific PCI variables and functions. - * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. - */ -void pci_mode_set(int); -int pci_mode_detect(void); -int pci_bus_flags(void); - -/* - * Functions provided to machine-independent PCI code. - */ -void pci_attach_hook(struct device *, struct device *, - struct pcibus_attach_args *); -int pci_bus_maxdevs(pci_chipset_tag_t, int); -pcitag_t pci_make_tag(pci_chipset_tag_t, int, int, int); -void pci_decompose_tag(pci_chipset_tag_t, pcitag_t, - int *, int *, int *); -pcireg_t pci_conf_read(pci_chipset_tag_t, pcitag_t, int); -void pci_conf_write(pci_chipset_tag_t, pcitag_t, int, - pcireg_t); -int pci_intr_map(struct pci_attach_args *, pci_intr_handle_t *); -const char *pci_intr_string(pci_chipset_tag_t, pci_intr_handle_t); -const struct evcnt *pci_intr_evcnt(pci_chipset_tag_t, pci_intr_handle_t); -void *pci_intr_establish(pci_chipset_tag_t, pci_intr_handle_t, - int, int (*)(void *), void *); -void pci_intr_disestablish(pci_chipset_tag_t, void *); - - -/* - * ALL OF THE FOLLOWING ARE MACHINE-DEPENDENT, AND SHOULD NOT BE USED - * BY PORTABLE CODE. - */ - -/* Extract Bus Number for a host bridge or -1 if unknown. */ -int pchb_get_bus_number(pci_chipset_tag_t, pcitag_t); - -/* - * Section 6.2.4, `Miscellaneous Functions' of the PCI Specification, - * says that 255 means `unknown' or `no connection' to the interrupt - * controller on a PC. - */ -#define X86_PCI_INTERRUPT_LINE_NO_CONNECTION 0xff - -void pci_device_foreach(pci_chipset_tag_t, int, - void (*)(pci_chipset_tag_t, pcitag_t, void*), - void *); - -void pci_device_foreach_min(pci_chipset_tag_t, int, int, - void (*)(pci_chipset_tag_t, pcitag_t, void*), - void *); - -void pci_bridge_foreach(pci_chipset_tag_t, int, int, - void (*) (pci_chipset_tag_t, pcitag_t, void *), void *); - +#include <x86/pci_machdep_common.h> #endif /* _X86_PCI_MACHDEP_H_ */ Index: src/sys/arch/x86/pci/pci_intr_machdep.c diff -u src/sys/arch/x86/pci/pci_intr_machdep.c:1.15 src/sys/arch/x86/pci/pci_intr_machdep.c:1.16 --- src/sys/arch/x86/pci/pci_intr_machdep.c:1.15 Thu Feb 25 20:51:10 2010 +++ src/sys/arch/x86/pci/pci_intr_machdep.c Sun Mar 14 20:19:06 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_intr_machdep.c,v 1.15 2010/02/25 20:51:10 dyoung Exp $ */ +/* $NetBSD: pci_intr_machdep.c,v 1.16 2010/03/14 20:19:06 dyoung Exp $ */ /*- * Copyright (c) 1997, 1998, 2009 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.15 2010/02/25 20:51:10 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.16 2010/03/14 20:19:06 dyoung Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -121,8 +121,15 @@ int bus, dev, func; #endif - if ((pc = pa->pa_pc) != NULL && pc->pc_intr_map != NULL) - return (*pc->pc_intr_map)(pa, ihp); + if ((pc = pa->pa_pc) != NULL) { + if (pc->pc_intr_map != NULL) + return (*pc->pc_intr_map)(pa, ihp); + if (pc->pc_super != NULL) { + struct pci_attach_args paclone = *pa; + paclone.pa_pc = pc->pc_super; + return pci_intr_map(&paclone, ihp); + } + } if (pin == 0) { /* No IRQ used. */ @@ -210,8 +217,12 @@ const char * pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih) { - if (pc != NULL && pc->pc_intr_string != NULL) - return (*pc->pc_intr_string)(pc, ih); + if (pc != NULL) { + if (pc->pc_intr_string != NULL) + return (*pc->pc_intr_string)(pc, ih); + if (pc->pc_super != NULL) + return pci_intr_string(pc->pc_super, ih); + } return intr_string(ih & ~MPSAFE_MASK); } @@ -221,8 +232,12 @@ pci_intr_evcnt(pci_chipset_tag_t pc, pci_intr_handle_t ih) { - if (pc != NULL && pc->pc_intr_evcnt != NULL) - return (*pc->pc_intr_evcnt)(pc, ih); + if (pc != NULL) { + if (pc->pc_intr_evcnt != NULL) + return (*pc->pc_intr_evcnt)(pc, ih); + if (pc->pc_super != NULL) + return pci_intr_evcnt(pc->pc_super, ih); + } /* XXX for now, no evcnt parent reported */ return NULL; @@ -258,8 +273,16 @@ #endif bool mpsafe; - if (pc != NULL && pc->pc_intr_establish != NULL) - return (*pc->pc_intr_establish)(pc, ih, level, func, arg); + if (pc != NULL) { + if (pc->pc_intr_establish != NULL) { + return (*pc->pc_intr_establish)(pc, ih, level, func, + arg); + } + if (pc->pc_super != NULL) { + return pci_intr_establish(pc->pc_super, ih, level, func, + arg); + } + } pic = &i8259_pic; pin = irq = (ih & ~MPSAFE_MASK); @@ -289,9 +312,15 @@ pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) { - if (pc != NULL && pc->pc_intr_disestablish != NULL) { - (*pc->pc_intr_disestablish)(pc, cookie); - return; + if (pc != NULL) { + if (pc->pc_intr_disestablish != NULL) { + (*pc->pc_intr_disestablish)(pc, cookie); + return; + } + if (pc->pc_super != NULL) { + pci_intr_disestablish(pc->pc_super, cookie); + return; + } } intr_disestablish(cookie); Index: src/sys/arch/x86/pci/pci_machdep.c diff -u src/sys/arch/x86/pci/pci_machdep.c:1.40 src/sys/arch/x86/pci/pci_machdep.c:1.41 --- src/sys/arch/x86/pci/pci_machdep.c:1.40 Thu Feb 25 20:51:10 2010 +++ src/sys/arch/x86/pci/pci_machdep.c Sun Mar 14 20:19:06 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.c,v 1.40 2010/02/25 20:51:10 dyoung Exp $ */ +/* $NetBSD: pci_machdep.c,v 1.41 2010/03/14 20:19:06 dyoung Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.40 2010/02/25 20:51:10 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.41 2010/03/14 20:19:06 dyoung Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -344,8 +344,14 @@ { pcitag_t tag; - if (pc != NULL && pc->pc_make_tag != NULL) - return (*pc->pc_make_tag)(pc, bus, device, function); + if (pc != NULL) { + if (pc->pc_make_tag != NULL) + return (*pc->pc_make_tag)(pc, bus, device, function); + if (pc->pc_super != NULL) { + return pci_make_tag(pc->pc_super, bus, device, + function); + } + } switch (pci_mode) { case 1: @@ -373,9 +379,15 @@ int *bp, int *dp, int *fp) { - if (pc != NULL && pc->pc_decompose_tag != NULL) { - (*pc->pc_decompose_tag)(pc, tag, bp, dp, fp); - return; + if (pc != NULL) { + if (pc->pc_decompose_tag != NULL) { + (*pc->pc_decompose_tag)(pc, tag, bp, dp, fp); + return; + } + if (pc->pc_super != NULL) { + pci_decompose_tag(pc->pc_super, tag, bp, dp, fp); + return; + } } switch (pci_mode) { @@ -409,8 +421,12 @@ KASSERT((reg & 0x3) == 0); - if (pc != NULL && pc->pc_conf_read != NULL) - return (*pc->pc_conf_read)(pc, tag, reg); + if (pc != NULL) { + if (pc->pc_conf_read != NULL) + return (*pc->pc_conf_read)(pc, tag, reg); + if (pc->pc_super != NULL) + return pci_conf_read(pc->pc_super, tag, reg); + } #if defined(__i386__) && defined(XBOX) if (arch_i386_is_xbox) { @@ -437,9 +453,15 @@ KASSERT((reg & 0x3) == 0); - if (pc != NULL && pc->pc_conf_write != NULL) { - (*pc->pc_conf_write)(pc, tag, reg, data); - return; + if (pc != NULL) { + if (pc->pc_conf_write != NULL) { + (*pc->pc_conf_write)(pc, tag, reg, data); + return; + } + if (pc->pc_super != NULL) { + pci_conf_write(pc->pc_super, tag, reg, data); + return; + } } #if defined(__i386__) && defined(XBOX) Index: src/sys/arch/xen/include/pci_machdep.h diff -u src/sys/arch/xen/include/pci_machdep.h:1.16 src/sys/arch/xen/include/pci_machdep.h:1.17 --- src/sys/arch/xen/include/pci_machdep.h:1.16 Thu Feb 25 22:20:03 2010 +++ src/sys/arch/xen/include/pci_machdep.h Sun Mar 14 20:19:06 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.16 2010/02/25 22:20:03 dyoung Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.17 2010/03/14 20:19:06 dyoung Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -57,114 +57,24 @@ #ifndef _XEN_PCI_MACHDEP_H_ #define _XEN_PCI_MACHDEP_H_ -#include "opt_xen.h" - -struct pci_attach_args; - -extern struct x86_bus_dma_tag pci_bus_dma_tag; -#ifdef _LP64 -extern struct x86_bus_dma_tag pci_bus_dma64_tag; -#endif - -/* Some values appropriate for x86, from x86/include/pci_machdep.h */ -#define __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH -#define PCI_PREFER_IOSPACE - -union x86_pci_tag_u { - uint32_t mode1; - struct { - uint16_t port; - uint8_t enable; - uint8_t forward; - } mode2; -}; - -#ifndef DOM0OPS -int xpci_enumerate_bus(struct pci_softc *, const int *, - int (*)(struct pci_attach_args *), struct pci_attach_args *); -#define PCI_MACHDEP_ENUMERATE_BUS xpci_enumerate_bus -#endif -struct pci_chipset_tag; -struct pci_attach_args; - /* * Types provided to machine-independent PCI code */ -typedef struct pci_chipset_tag *pci_chipset_tag_t; -typedef union x86_pci_tag_u pcitag_t; typedef struct xen_intr_handle pci_intr_handle_t; -struct pci_chipset_tag { - pcireg_t (*pc_conf_read)(pci_chipset_tag_t, pcitag_t, int); +#include <x86/pci_machdep_common.h> - void (*pc_conf_write)(pci_chipset_tag_t, pcitag_t, int, pcireg_t); +#include "opt_xen.h" -#if 0 - int (*pc_find_rom)(struct pci_attach_args *, bus_space_tag_t, - bus_space_handle_t, int, bus_space_handle_t *, bus_space_size_t *); +#ifndef DOM0OPS +int xpci_enumerate_bus(struct pci_softc *, const int *, + int (*)(struct pci_attach_args *), struct pci_attach_args *); +#define PCI_MACHDEP_ENUMERATE_BUS xpci_enumerate_bus #endif - int (*pc_intr_map)(struct pci_attach_args *, pci_intr_handle_t *); - - const char *(*pc_intr_string)(pci_chipset_tag_t, pci_intr_handle_t); - - const struct evcnt *(*pc_intr_evcnt)(pci_chipset_tag_t, - pci_intr_handle_t); - - void *(*pc_intr_establish)(pci_chipset_tag_t, pci_intr_handle_t, int, - int (*)(void *), void *); - - void (*pc_intr_disestablish)(pci_chipset_tag_t, void *); - - pcitag_t (*pc_make_tag)(pci_chipset_tag_t, int, int, int); - - void (*pc_decompose_tag)(pci_chipset_tag_t, pcitag_t, - int *, int *, int *); -}; - /* functions provided to MI PCI */ -void pci_attach_hook(device_t, device_t, - struct pcibus_attach_args *); -int pci_bus_maxdevs(pci_chipset_tag_t, int); -pcitag_t pci_make_tag(pci_chipset_tag_t, int, int, int); -void pci_decompose_tag(pci_chipset_tag_t, pcitag_t, - int *, int *, int *); -pcireg_t pci_conf_read(pci_chipset_tag_t, pcitag_t, int); -void pci_conf_write(pci_chipset_tag_t, pcitag_t, int, - pcireg_t); -int pci_intr_map(struct pci_attach_args *, pci_intr_handle_t *); -const char *pci_intr_string(pci_chipset_tag_t, pci_intr_handle_t); -const struct evcnt *pci_intr_evcnt(pci_chipset_tag_t, pci_intr_handle_t); -void *pci_intr_establish(pci_chipset_tag_t, pci_intr_handle_t, - int, int (*)(void *), void *); -void pci_intr_disestablish(pci_chipset_tag_t, void *); int xen_pci_enumerate_bus(struct pci_softc *, const int *, int (*)(struct pci_attach_args *), struct pci_attach_args *); -/* Extract Bus Number for a host bridge or -1 if unknown. */ -int pchb_get_bus_number(pci_chipset_tag_t, pcitag_t); - -/* - * Section 6.2.4, `Miscellaneous Functions' of the PCI Specification, - * says that 255 means `unknown' or `no connection' to the interrupt - * controller on a PC. - */ -#define X86_PCI_INTERRUPT_LINE_NO_CONNECTION 0xff - -void pci_mode_set(int); -int pci_mode_detect(void); -int pci_bus_flags(void); - -void pci_device_foreach(pci_chipset_tag_t, int, - void (*)(pci_chipset_tag_t, pcitag_t, void*), - void *); - -void pci_device_foreach_min(pci_chipset_tag_t, int, int, - void (*)(pci_chipset_tag_t, pcitag_t, void*), - void *); - -void pci_bridge_foreach(pci_chipset_tag_t, int, int, - void (*) (pci_chipset_tag_t, pcitag_t, void *), void *); - #endif /* _XEN_PCI_MACHDEP_H_ */ Added files: Index: src/sys/arch/x86/include/pci_machdep_common.h diff -u /dev/null src/sys/arch/x86/include/pci_machdep_common.h:1.1 --- /dev/null Sun Mar 14 20:19:06 2010 +++ src/sys/arch/x86/include/pci_machdep_common.h Sun Mar 14 20:19:06 2010 @@ -0,0 +1,157 @@ +/* $NetBSD: pci_machdep_common.h,v 1.1 2010/03/14 20:19:06 dyoung Exp $ */ + +/* + * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. + * Copyright (c) 1994 Charles M. Hannum. All rights reserved. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Charles M. Hannum. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +#ifndef _X86_PCI_MACHDEP_COMMON_H_ +#define _X86_PCI_MACHDEP_COMMON_H_ + +/* + * Machine-specific definitions for PCI autoconfiguration. + */ +#define __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH + +/* + * i386-specific PCI structure and type definitions. + * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. + * + * Configuration tag; created from a {bus,device,function} triplet by + * pci_make_tag(), and passed to pci_conf_read() and pci_conf_write(). + * We could instead always pass the {bus,device,function} triplet to + * the read and write routines, but this would cause extra overhead. + * + * Mode 2 is historical and deprecated by the Revision 2.0 specification. + */ +union x86_pci_tag_u { + uint32_t mode1; + struct { + uint16_t port; + uint8_t enable; + uint8_t forward; + } mode2; +}; + +extern struct x86_bus_dma_tag pci_bus_dma_tag; +#ifdef _LP64 +extern struct x86_bus_dma_tag pci_bus_dma64_tag; +#endif + +struct pci_attach_args; +struct pci_chipset_tag; + +/* + * Types provided to machine-independent PCI code + */ +typedef struct pci_chipset_tag *pci_chipset_tag_t; +typedef union x86_pci_tag_u pcitag_t; + +struct pci_chipset_tag { + pci_chipset_tag_t pc_super; + pcireg_t (*pc_conf_read)(pci_chipset_tag_t, pcitag_t, int); + + void (*pc_conf_write)(pci_chipset_tag_t, pcitag_t, int, pcireg_t); + +#if 0 + int (*pc_find_rom)(struct pci_attach_args *, bus_space_tag_t, + bus_space_handle_t, int, bus_space_handle_t *, bus_space_size_t *); +#endif + + int (*pc_intr_map)(struct pci_attach_args *, pci_intr_handle_t *); + + const char *(*pc_intr_string)(pci_chipset_tag_t, pci_intr_handle_t); + + const struct evcnt *(*pc_intr_evcnt)(pci_chipset_tag_t, + pci_intr_handle_t); + + void *(*pc_intr_establish)(pci_chipset_tag_t, pci_intr_handle_t, int, + int (*)(void *), void *); + + void (*pc_intr_disestablish)(pci_chipset_tag_t, void *); + + pcitag_t (*pc_make_tag)(pci_chipset_tag_t, int, int, int); + + void (*pc_decompose_tag)(pci_chipset_tag_t, pcitag_t, + int *, int *, int *); +}; + +/* + * i386-specific PCI variables and functions. + * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. + */ +int pci_bus_flags(void); +int pci_mode_detect(void); +void pci_mode_set(int); + +/* + * Functions provided to machine-independent PCI code. + */ +void pci_attach_hook(device_t, device_t, + struct pcibus_attach_args *); +int pci_bus_maxdevs(pci_chipset_tag_t, int); +pcitag_t pci_make_tag(pci_chipset_tag_t, int, int, int); +void pci_decompose_tag(pci_chipset_tag_t, pcitag_t, + int *, int *, int *); +pcireg_t pci_conf_read(pci_chipset_tag_t, pcitag_t, int); +void pci_conf_write(pci_chipset_tag_t, pcitag_t, int, + pcireg_t); +int pci_intr_map(struct pci_attach_args *, pci_intr_handle_t *); +const char *pci_intr_string(pci_chipset_tag_t, pci_intr_handle_t); +const struct evcnt *pci_intr_evcnt(pci_chipset_tag_t, pci_intr_handle_t); +void *pci_intr_establish(pci_chipset_tag_t, pci_intr_handle_t, + int, int (*)(void *), void *); +void pci_intr_disestablish(pci_chipset_tag_t, void *); + +/* + * ALL OF THE FOLLOWING ARE MACHINE-DEPENDENT, AND SHOULD NOT BE USED + * BY PORTABLE CODE. + */ + +/* Extract Bus Number for a host bridge or -1 if unknown. */ +int pchb_get_bus_number(pci_chipset_tag_t, pcitag_t); + +/* + * Section 6.2.4, `Miscellaneous Functions' of the PCI Specification, + * says that 255 means `unknown' or `no connection' to the interrupt + * controller on a PC. + */ +#define X86_PCI_INTERRUPT_LINE_NO_CONNECTION 0xff + +void pci_device_foreach(pci_chipset_tag_t, int, + void (*)(pci_chipset_tag_t, pcitag_t, void*), + void *); + +void pci_device_foreach_min(pci_chipset_tag_t, int, int, + void (*)(pci_chipset_tag_t, pcitag_t, void*), + void *); + +void pci_bridge_foreach(pci_chipset_tag_t, int, int, + void (*) (pci_chipset_tag_t, pcitag_t, void *), void *); + +#endif /* _X86_PCI_MACHDEP_COMMON_H_ */