Pci.h revision a2760a4d593af57a19ec32cdfd1723b68495df8c
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.h,v 1.36 2002/12/23 15:37:26 tsi Exp $ */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Copyright 1998 by Concurrent Computer Corporation
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Permission to use, copy, modify, distribute, and sell this software
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * and its documentation for any purpose is hereby granted without fee,
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * provided that the above copyright notice appear in all copies and that
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * both that copyright notice and this permission notice appear in
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * supporting documentation, and that the name of Concurrent Computer
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Corporation not be used in advertising or publicity pertaining to
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * distribution of the software without specific, written prior
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * permission. Concurrent Computer Corporation makes no representations
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * about the suitability of this software for any purpose. It is
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * provided "as is" without express or implied warranty.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * CONCURRENT COMPUTER CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * AND FITNESS, IN NO EVENT SHALL CONCURRENT COMPUTER CORPORATION BE
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
8b43440b7ef4b81c69c31de7ff820dc07a780254Lennart Poettering * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
8b43440b7ef4b81c69c31de7ff820dc07a780254Lennart Poettering * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Copyright 1998 by Metro Link Incorporated
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Permission to use, copy, modify, distribute, and sell this software
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * and its documentation for any purpose is hereby granted without fee,
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * provided that the above copyright notice appear in all copies and that
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * both that copyright notice and this permission notice appear in
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * supporting documentation, and that the name of Metro Link
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * Incorporated not be used in advertising or publicity pertaining to
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * distribution of the software without specific, written prior
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * permission. Metro Link Incorporated makes no representations
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * about the suitability of this software for any purpose. It is
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * provided "as is" without express or implied warranty.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED BE
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * This file is derived in part from the original xf86_PCI.h that included
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * following copyright message:
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org>
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Permission to use, copy, modify, distribute, and sell this software and its
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * documentation for any purpose is hereby granted without fee, provided that
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * the above copyright notice appear in all copies and that both that
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * copyright notice and this permission notice appear in supporting
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * documentation, and that the names of the above listed copyright holder(s)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * not be used in advertising or publicity pertaining to distribution of
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * the software without specific, written prior permission. The above listed
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * copyright holder(s) make(s) no representations about the suitability of this
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * software for any purpose. It is provided "as is" without express or
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * implied warranty.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * This file has the private Pci definitions. The public ones are imported
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * from xf86Pci.h. Drivers should not use this file.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Global Definitions
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define MAX_PCI_DEVICES 64 /* Max number of devices accomodated */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering /* by xf86scanpci */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#if defined(sun) && defined(SVR4) && defined(sparc)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering# define MAX_PCI_BUSES 4096 /* Max number of PCI buses */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#elif defined(__alpha__) && defined (linux)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# define MAX_PCI_BUSES (MAX_PCI_DOMAINS*256) /* 256 per domain */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering# define MAX_PCI_BUSES 256 /* Max number of PCI buses */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering ((CARD32)((PCI_CHIP_##device << 16) | PCI_VENDOR_##vendor))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_DOMBUS_MASK (((PCI_DOM_MASK) << 8) | 0x0ffu)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * "b" contains an optional domain number.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_MAKE_TAG(b,d,f) ((((b) & (PCI_DOMBUS_MASK)) << 16) | \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_MAKE_BUS(d,b) ((((d) & (PCI_DOM_MASK)) << 8) | ((b) & 0xffu))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_DOM_FROM_TAG(tag) (((tag) >> 24) & (PCI_DOM_MASK))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_BUS_FROM_TAG(tag) (((tag) >> 16) & (PCI_DOMBUS_MASK))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_DEV_FROM_TAG(tag) (((tag) & 0x0000f800u) >> 11)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_FUNC_FROM_TAG(tag) (((tag) & 0x00000700u) >> 8)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_DFN_FROM_TAG(tag) (((tag) & 0x0000ff00u) >> 8)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_BDEV_FROM_TAG(tag) ((tag) & 0x00fff800u)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_DOM_FROM_BUS(bus) (((bus) >> 8) & (PCI_DOM_MASK))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_TAG_NO_DOMAIN(tag) ((tag) & 0x00ffff00u)
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * Macros for bus numbers found in P2P headers.
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering ((((x) & PCI_PRIMARY_BUS_MASK ) >> 0) | (PCI_DOM_FROM_TAG(tag) << 8))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_SECONDARY_BUS_EXTRACT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering ((((x) & PCI_SECONDARY_BUS_MASK ) >> 8) | (PCI_DOM_FROM_TAG(tag) << 8))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_SUBORDINATE_BUS_EXTRACT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering ((((x) & PCI_SUBORDINATE_BUS_MASK) >> 16) | (PCI_DOM_FROM_TAG(tag) << 8))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering (((x) & ~PCI_PRIMARY_BUS_MASK ) | (((y) & 0xffu) << 0))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering (((x) & ~PCI_SECONDARY_BUS_MASK ) | (((y) & 0xffu) << 8))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_SUBORDINATE_BUS_INSERT(x, y) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering (((x) & ~PCI_SUBORDINATE_BUS_MASK) | (((y) & 0xffu) << 16))
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering/* Ditto for CardBus bridges */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_PRIMARY_BUS_EXTRACT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_CARDBUS_BUS_EXTRACT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_SUBORDINATE_BUS_EXTRACT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_PRIMARY_BUS_INSERT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_CARDBUS_BUS_INSERT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CB_SUBORDINATE_BUS_INSERT(x, tag) \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#define PCI_CPU(val) (((val >> 24) & 0x000000ff) | \
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering/* #define DEBUGPCI 2 */ /* Disable/enable trace in PCI code */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#else /* !defined(DEBUGPCI) */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering#endif /* !defined(DEBUGPCI) */
3e2cda698f05d7290a8b9444d2c7d5c2599b2a27Lennart Poettering * PCI Config mechanism definitions
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * Select architecture specific PCI init function
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# elif defined(__FreeBSD__) || defined(__OpenBSD__)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# define XF86SCANPCI_WRAPPER ia64ScanPCIWrapper
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# define ARCH_PCI_HOST_BRIDGE ix86PciHostBridge
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# define INCLUDE_XF86_NO_DOMAIN /* Needs kernel work to remove */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# elif defined(PowerMAX_OS) /* This port is broken */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# elif defined(__OpenBSD__) && defined(__sparc64__)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#error No PCI support available for this architecture/OS combination
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringextern void ARCH_PCI_INIT(void);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringextern void ARCH_PCI_OS_INIT(void);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringextern void ARCH_PCI_HOST_BRIDGE(pciConfigPtr pPCI);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringextern void ARCH_PCI_PCI_BRIDGE(pciConfigPtr pPCI);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringextern void XF86SCANPCI_WRAPPER(scanpciWrapperOpt flags);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * Table of functions used to access a specific PCI bus domain
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * (e.g. a primary PCI bus and all of its secondaries)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering void (*pciWriteLong)(PCITAG, int, CARD32);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering void (*pciSetBitsLong)(PCITAG, int, CARD32, CARD32);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering ADDRESS (*pciAddrHostToBus)(PCITAG, PciAddrType, ADDRESS);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering ADDRESS (*pciAddrBusToHost)(PCITAG, PciAddrType, ADDRESS);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * The next three are optional. If NULL, the corresponding function is
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * to be performed generically.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering CARD16 (*pciControlBridge)(int, CARD16, CARD16);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering void (*pciGetBridgeBusses)(int, int *, int *, int *);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering /* Use pointer's to avoid #include recursion */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering void (*pciGetBridgeResources)(int, pointer *, pointer *, pointer *);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * pciBusInfo_t - One structure per defined PCI bus
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering unsigned char configMech; /* PCI config type to use */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering unsigned char numDevices; /* Range of valid devnums */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering unsigned char secondary; /* Boolean: bus is a secondary */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering unsigned long ppc_io_base; /* PowerPC I/O spc membase */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering unsigned long ppc_io_size; /* PowerPC I/O spc size */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering pciBusFuncs_p funcs; /* PCI access functions */
15411c0cb1192799b37ec8f25d6f30e8d7292fc6David Herrmann void *pciBusPriv; /* Implementation private data */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering pciConfigPtr bridge; /* bridge that opens this bus */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#define HOST_NO_BUS ((pciBusInfo_t *)(-1))
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering/* configMech values */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#define PCI_CFG_MECH_UNKNOWN 0 /* Not yet known */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#define PCI_CFG_MECH_1 1 /* Most machines */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#define PCI_CFG_MECH_OTHER 3 /* Something else */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering/* Generic PCI service functions and helpers */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart PoetteringCARD32 pciCfgMech1Read(PCITAG tag, int offset);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringvoid pciCfgMech1Write(PCITAG tag, int offset, CARD32 val);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringvoid pciCfgMech1SetBits(PCITAG tag, int offset, CARD32 mask,
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart PoetteringADDRESS pciAddrNOOP(PCITAG tag, PciAddrType type, ADDRESS);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#endif /* _PCI_H */