a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.h,v 1.36 2002/12/23 15:37:26 tsi Exp $ */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Copyright 1998 by Concurrent Computer Corporation
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Permission to use, copy, modify, distribute, and sell this software
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * and its documentation for any purpose is hereby granted without fee,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * provided that the above copyright notice appear in all copies and that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * both that copyright notice and this permission notice appear in
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * supporting documentation, and that the name of Concurrent Computer
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Corporation not be used in advertising or publicity pertaining to
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * distribution of the software without specific, written prior
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * permission. Concurrent Computer Corporation makes no representations
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * about the suitability of this software for any purpose. It is
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * provided "as is" without express or implied warranty.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * CONCURRENT COMPUTER CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * AND FITNESS, IN NO EVENT SHALL CONCURRENT COMPUTER CORPORATION BE
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * SOFTWARE.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Copyright 1998 by Metro Link Incorporated
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Permission to use, copy, modify, distribute, and sell this software
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * and its documentation for any purpose is hereby granted without fee,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * provided that the above copyright notice appear in all copies and that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * both that copyright notice and this permission notice appear in
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * supporting documentation, and that the name of Metro Link
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Incorporated not be used in advertising or publicity pertaining to
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * distribution of the software without specific, written prior
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * permission. Metro Link Incorporated makes no representations
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * about the suitability of this software for any purpose. It is
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * provided "as is" without express or implied warranty.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED BE
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * SOFTWARE.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * This file is derived in part from the original xf86_PCI.h that included
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * following copyright message:
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org>
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * documentation for any purpose is hereby granted without fee, provided that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * the above copyright notice appear in all copies and that both that
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * copyright notice and this permission notice appear in supporting
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * documentation, and that the names of the above listed copyright holder(s)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * not be used in advertising or publicity pertaining to distribution of
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * the software without specific, written prior permission. The above listed
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * copyright holder(s) make(s) no representations about the suitability of this
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * software for any purpose. It is provided "as is" without express or
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * implied warranty.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync *
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * This file has the private Pci definitions. The public ones are imported
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * from xf86Pci.h. Drivers should not use this file.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifndef _PCI_H
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define _PCI_H 1
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#include "Xarch.h"
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#include "Xfuncproto.h"
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#include "xf86Pci.h"
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#include "xf86PciInfo.h"
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Global Definitions
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define MAX_PCI_DEVICES 64 /* Max number of devices accomodated */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync /* by xf86scanpci */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(sun) && defined(SVR4) && defined(sparc)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define MAX_PCI_BUSES 4096 /* Max number of PCI buses */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__alpha__) && defined (linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define MAX_PCI_DOMAINS 512
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define PCI_DOM_MASK 0x01fful
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define MAX_PCI_BUSES (MAX_PCI_DOMAINS*256) /* 256 per domain */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#else
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define MAX_PCI_BUSES 256 /* Max number of PCI buses */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_NOT_FOUND 0xffffffff
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define DEVID(vendor, device) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((CARD32)((PCI_CHIP_##device << 16) | PCI_VENDOR_##vendor))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifndef PCI_DOM_MASK
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define PCI_DOM_MASK 0x0ffu
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_DOMBUS_MASK (((PCI_DOM_MASK) << 8) | 0x0ffu)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * "b" contains an optional domain number.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_MAKE_TAG(b,d,f) ((((b) & (PCI_DOMBUS_MASK)) << 16) | \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync (((d) & 0x00001fu) << 11) | \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync (((f) & 0x000007u) << 8))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_MAKE_BUS(d,b) ((((d) & (PCI_DOM_MASK)) << 8) | ((b) & 0xffu))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_DOM_FROM_TAG(tag) (((tag) >> 24) & (PCI_DOM_MASK))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_BUS_FROM_TAG(tag) (((tag) >> 16) & (PCI_DOMBUS_MASK))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_DEV_FROM_TAG(tag) (((tag) & 0x0000f800u) >> 11)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_FUNC_FROM_TAG(tag) (((tag) & 0x00000700u) >> 8)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_DFN_FROM_TAG(tag) (((tag) & 0x0000ff00u) >> 8)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_BDEV_FROM_TAG(tag) ((tag) & 0x00fff800u)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_DOM_FROM_BUS(bus) (((bus) >> 8) & (PCI_DOM_MASK))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_TAG_NO_DOMAIN(tag) ((tag) & 0x00ffff00u)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Macros for bus numbers found in P2P headers.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_PRIMARY_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((((x) & PCI_PRIMARY_BUS_MASK ) >> 0) | (PCI_DOM_FROM_TAG(tag) << 8))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_SECONDARY_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((((x) & PCI_SECONDARY_BUS_MASK ) >> 8) | (PCI_DOM_FROM_TAG(tag) << 8))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_SUBORDINATE_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((((x) & PCI_SUBORDINATE_BUS_MASK) >> 16) | (PCI_DOM_FROM_TAG(tag) << 8))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_PRIMARY_BUS_INSERT(x, y) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync (((x) & ~PCI_PRIMARY_BUS_MASK ) | (((y) & 0xffu) << 0))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_SECONDARY_BUS_INSERT(x, y) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync (((x) & ~PCI_SECONDARY_BUS_MASK ) | (((y) & 0xffu) << 8))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_SUBORDINATE_BUS_INSERT(x, y) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync (((x) & ~PCI_SUBORDINATE_BUS_MASK) | (((y) & 0xffu) << 16))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* Ditto for CardBus bridges */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_PRIMARY_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_PRIMARY_BUS_EXTRACT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_CARDBUS_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_SECONDARY_BUS_EXTRACT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_SUBORDINATE_BUS_EXTRACT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_SUBORDINATE_BUS_EXTRACT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_PRIMARY_BUS_INSERT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_PRIMARY_BUS_INSERT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_CARDBUS_BUS_INSERT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_SECONDARY_BUS_INSERT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CB_SUBORDINATE_BUS_INSERT(x, tag) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync PCI_SUBORDINATE_BUS_INSERT(x, tag)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if X_BYTE_ORDER == X_BIG_ENDIAN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CPU(val) (((val >> 24) & 0x000000ff) | \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((val >> 8) & 0x0000ff00) | \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((val << 8) & 0x00ff0000) | \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ((val << 24) & 0xff000000))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#else
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CPU(val) (val)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Debug Macros/Definitions
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* #define DEBUGPCI 2 */ /* Disable/enable trace in PCI code */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(DEBUGPCI)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define PCITRACE(lvl,printfargs) \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync if (lvl > xf86Verbose) { \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ErrorF printfargs; \
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync }
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#else /* !defined(DEBUGPCI) */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define PCITRACE(lvl,printfargs)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif /* !defined(DEBUGPCI) */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * PCI Config mechanism definitions
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_EN 0x80000000
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFGMECH1_ADDRESS_REG 0xCF8
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFGMECH1_DATA_REG 0xCFC
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFGMECH1_MAXDEV 32
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Select architecture specific PCI init function
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(__alpha__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT axpPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(__FreeBSD__) || defined(__OpenBSD__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT freebsdPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(__NetBSD__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT netbsdPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__arm__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__hppa__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__ia64__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define XF86SCANPCI_WRAPPER ia64ScanPCIWrapper
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__i386__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT ix86PciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_HOST_BRIDGE ix86PciHostBridge
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_OS_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__mc68000__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__mips__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__powerpc__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN /* Needs kernel work to remove */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(__OpenBSD__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT freebsdPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(__NetBSD__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT netbsdPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(PowerMAX_OS) /* This port is broken */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT ppcPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# else
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT ppcPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__s390__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__sh__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__sparc__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(sun)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT sparcPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# elif defined(__OpenBSD__) && defined(__sparc64__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT freebsdPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#elif defined(__x86_64__)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_INIT ix86PciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_MAP_PCI_MEM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define INCLUDE_XF86_NO_DOMAIN
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# if defined(linux)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# define ARCH_PCI_OS_INIT linuxPciInit
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync# endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifndef ARCH_PCI_INIT
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#error No PCI support available for this architecture/OS combination
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern void ARCH_PCI_INIT(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(ARCH_PCI_OS_INIT)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern void ARCH_PCI_OS_INIT(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(ARCH_PCI_HOST_BRIDGE)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern void ARCH_PCI_HOST_BRIDGE(pciConfigPtr pPCI);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(ARCH_PCI_PCI_BRIDGE)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern void ARCH_PCI_PCI_BRIDGE(pciConfigPtr pPCI);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#if defined(XF86SCANPCI_WRAPPER)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsynctypedef enum {
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync SCANPCI_INIT,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync SCANPCI_TERM
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync} scanpciWrapperOpt;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern void XF86SCANPCI_WRAPPER(scanpciWrapperOpt flags);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * Table of functions used to access a specific PCI bus domain
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * (e.g. a primary PCI bus and all of its secondaries)
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsynctypedef struct pci_bus_funcs {
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync CARD32 (*pciReadLong)(PCITAG, int);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync void (*pciWriteLong)(PCITAG, int, CARD32);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync void (*pciSetBitsLong)(PCITAG, int, CARD32, CARD32);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ADDRESS (*pciAddrHostToBus)(PCITAG, PciAddrType, ADDRESS);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync ADDRESS (*pciAddrBusToHost)(PCITAG, PciAddrType, ADDRESS);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync /*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * The next three are optional. If NULL, the corresponding function is
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * to be performed generically.
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync CARD16 (*pciControlBridge)(int, CARD16, CARD16);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync void (*pciGetBridgeBusses)(int, int *, int *, int *);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync /* Use pointer's to avoid #include recursion */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync void (*pciGetBridgeResources)(int, pointer *, pointer *, pointer *);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync} pciBusFuncs_t, *pciBusFuncs_p;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/*
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync * pciBusInfo_t - One structure per defined PCI bus
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsynctypedef struct pci_bus_info {
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync unsigned char configMech; /* PCI config type to use */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync unsigned char numDevices; /* Range of valid devnums */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync unsigned char secondary; /* Boolean: bus is a secondary */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync int primary_bus; /* Parent bus */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#ifdef PowerMAX_OS
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync unsigned long ppc_io_base; /* PowerPC I/O spc membase */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync unsigned long ppc_io_size; /* PowerPC I/O spc size */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync pciBusFuncs_p funcs; /* PCI access functions */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync void *pciBusPriv; /* Implementation private data */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync pciConfigPtr bridge; /* bridge that opens this bus */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync} pciBusInfo_t;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define HOST_NO_BUS ((pciBusInfo_t *)(-1))
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* configMech values */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFG_MECH_UNKNOWN 0 /* Not yet known */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFG_MECH_1 1 /* Most machines */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFG_MECH_2 2 /* Older PC's */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#define PCI_CFG_MECH_OTHER 3 /* Something else */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync/* Generic PCI service functions and helpers */
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncPCITAG pciGenFindFirst(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncPCITAG pciGenFindNext(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncCARD32 pciCfgMech1Read(PCITAG tag, int offset);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncvoid pciCfgMech1Write(PCITAG tag, int offset, CARD32 val);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncvoid pciCfgMech1SetBits(PCITAG tag, int offset, CARD32 mask,
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync CARD32 val);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncCARD32 pciByteSwap(CARD32);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncBool pciMfDev(int, int);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncADDRESS pciAddrNOOP(PCITAG tag, PciAddrType type, ADDRESS);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern PCITAG (*pciFindFirstFP)(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern PCITAG (*pciFindNextFP)(void);
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern CARD32 pciDevid;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern CARD32 pciDevidMask;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern int pciMaxBusNum;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern int pciBusNum;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern int pciDevNum;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern int pciFuncNum;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern PCITAG pciDeviceTag;
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsyncextern pciBusInfo_t *pciBusInfo[];
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync
a2760a4d593af57a19ec32cdfd1723b68495df8cvboxsync#endif /* _PCI_H */