X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fpci.h;h=b031f53b705c371b57cb58780d554d7db08b3662;hb=9f4903821feed39afc9955c45b4329814ac8dc45;hp=560e720749cc273a2e1f45e2e44a8841bd408ad6;hpb=70abb40c1da87102bcae6202b166fbdd8bd32a31;p=pciutils.git diff --git a/lib/pci.h b/lib/pci.h index 560e720..b031f53 100644 --- a/lib/pci.h +++ b/lib/pci.h @@ -1,9 +1,7 @@ /* - * $Id: pci.h,v 1.11 2002/12/26 20:24:32 mj Exp $ - * * The PCI Library * - * Copyright (c) 1997--2002 Martin Mares + * Copyright (c) 1997--2003 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -15,20 +13,9 @@ #include "header.h" /* - * Types + * Types and format strings */ -#ifdef OS_LINUX -#include - -typedef __u8 byte; -typedef __u8 u8; -typedef __u16 word; -typedef __u16 u16; -typedef __u32 u32; -#endif - -#ifdef OS_FREEBSD #include typedef u_int8_t byte; @@ -36,32 +23,32 @@ typedef u_int8_t u8; typedef u_int16_t word; typedef u_int16_t u16; typedef u_int32_t u32; -#endif -#ifdef OS_NETBSD -#include - -typedef u_int8_t byte; -typedef u_int8_t u8; -typedef u_int16_t word; -typedef u_int16_t u16; -typedef u_int32_t u32; +#ifdef HAVE_64BIT_ADDRESS +#include +#if ULONG_MAX > 0xffffffff +typedef unsigned long u64; +#define PCIADDR_T_FMT "%016lx" +#define PCIADDR_PORT_FMT "%04lx" +#else +typedef unsigned long long u64; +#define PCIADDR_T_FMT "%016llx" +#define PCIADDR_PORT_FMT "%04llx" #endif - -#ifdef OS_AIX -#include - -typedef u_int8_t byte; -typedef u_int8_t u8; -typedef u_int16_t word; -typedef u_int16_t u16; -typedef u_int32_t u32; +typedef u64 pciaddr_t; +#else +typedef u32 pciaddr_t; +#define PCIADDR_T_FMT "%08x" +#define PCIADDR_PORT_FMT "%04x" #endif -#ifdef HAVE_LONG_ADDRESS -typedef unsigned long long pciaddr_t; +#ifdef ARCH_SPARC64 +/* On sparc64 Linux the kernel reports remapped port addresses and IRQ numbers */ +#undef PCIADDR_PORT_FMT +#define PCIADDR_PORT_FMT PCIADDR_T_FMT +#define PCIIRQ_FMT "%08x" #else -typedef unsigned long pciaddr_t; +#define PCIIRQ_FMT "%d" #endif /* @@ -71,16 +58,19 @@ typedef unsigned long pciaddr_t; struct pci_methods; struct nl_entry; -#define PCI_ACCESS_AUTO 0 /* Autodetection (params: none) */ -#define PCI_ACCESS_PROC_BUS_PCI 1 /* Linux /proc/bus/pci (params: path) */ -#define PCI_ACCESS_SYSCALLS 2 /* pciconfig_read() syscalls (params: none) */ -#define PCI_ACCESS_I386_TYPE1 3 /* i386 ports, type 1 (params: none) */ -#define PCI_ACCESS_I386_TYPE2 4 /* i386 ports, type 2 (params: none) */ -#define PCI_ACCESS_FBSD_DEVICE 5 /* FreeBSD /dev/pci (params: path) */ -#define PCI_ACCESS_AIX_DEVICE 6 /* /dev/pci0, /dev/bus0, etc. */ -#define PCI_ACCESS_NBSD_LIBPCI 7 -#define PCI_ACCESS_DUMP 8 /* Dump file (params: filename) */ -#define PCI_ACCESS_MAX 9 +enum pci_access_type { + /* Known access methods, remember to update access.c as well */ + PCI_ACCESS_AUTO, /* Autodetection (params: none) */ + PCI_ACCESS_SYS_BUS_PCI, /* Linux /sys/bus/pci (params: path) */ + PCI_ACCESS_PROC_BUS_PCI, /* Linux /proc/bus/pci (params: path) */ + PCI_ACCESS_I386_TYPE1, /* i386 ports, type 1 (params: none) */ + PCI_ACCESS_I386_TYPE2, /* i386 ports, type 2 (params: none) */ + PCI_ACCESS_FBSD_DEVICE, /* FreeBSD /dev/pci (params: path) */ + PCI_ACCESS_AIX_DEVICE, /* /dev/pci0, /dev/bus0, etc. */ + PCI_ACCESS_NBSD_LIBPCI, /* NetBSD libpci */ + PCI_ACCESS_DUMP, /* Dump file (params: filename) */ + PCI_ACCESS_MAX +}; struct pci_access { /* Options you can change: */ @@ -116,7 +106,7 @@ void pci_cleanup(struct pci_access *); /* Scanning of devices */ void pci_scan_bus(struct pci_access *acc); -struct pci_dev *pci_get_dev(struct pci_access *acc, int bus, int dev, int func); /* Raw access to specified device */ +struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func); /* Raw access to specified device */ void pci_free_dev(struct pci_dev *); /* @@ -125,8 +115,8 @@ void pci_free_dev(struct pci_dev *); struct pci_dev { struct pci_dev *next; /* Next device in the chain */ - word bus; /* Higher byte can select host bridges */ - byte dev, func; /* Device and function */ + u16 domain; /* PCI domain (host bridge) */ + byte bus, dev, func; /* Bus inside domain, device and function */ /* These fields are set by pci_fill_info() */ int known_fields; /* Set of info fields already known */ @@ -140,9 +130,9 @@ struct pci_dev { /* Fields used internally: */ struct pci_access *access; struct pci_methods *methods; - byte *cache; /* Cached information */ + byte *cache; /* Cached config registers */ int cache_len; - int hdrtype; /* Direct methods: header type */ + int hdrtype; /* Cached header type, -1 if unknown */ void *aux; /* Auxillary data */ }; @@ -174,7 +164,7 @@ void pci_setup_cache(struct pci_dev *, byte *cache, int len); */ struct pci_filter { - int bus, slot, func; /* -1 = ANY */ + int domain, bus, slot, func; /* -1 = ANY */ int vendor, device; };