root/dev/pci/pcivar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: pcivar.h,v 1.54 2007/08/01 21:43:03 deraadt Exp $     */
    2 /*      $NetBSD: pcivar.h,v 1.23 1997/06/06 23:48:05 thorpej Exp $      */
    3 
    4 /*
    5  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
    6  * Copyright (c) 1994 Charles Hannum.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. All advertising materials mentioning features or use of this software
   17  *    must display the following acknowledgement:
   18  *      This product includes software developed by Charles Hannum.
   19  * 4. The name of the author may not be used to endorse or promote products
   20  *    derived from this software without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 #ifndef _DEV_PCI_PCIVAR_H_
   35 #define _DEV_PCI_PCIVAR_H_
   36 
   37 /*
   38  * Definitions for PCI autoconfiguration.
   39  *
   40  * This file describes types and functions which are used for PCI
   41  * configuration.  Some of this information is machine-specific, and is
   42  * provided by pci_machdep.h.
   43  */
   44 
   45 #include <sys/device.h>
   46 #include <machine/bus.h>
   47 #include <dev/pci/pcireg.h>
   48 
   49 /*
   50  * Structures and definitions needed by the machine-dependent header.
   51  */
   52 typedef u_int32_t pcireg_t;             /* configuration space register XXX */
   53 
   54 /*
   55  * Power Management (PCI 2.2)
   56  */
   57 #define PCI_PWR_D0      0
   58 #define PCI_PWR_D1      1
   59 #define PCI_PWR_D2      2
   60 #define PCI_PWR_D3      3
   61 
   62 #ifdef _KERNEL
   63 
   64 struct pcibus_attach_args;
   65 struct pci_softc;
   66 
   67 /*
   68  * Machine-dependent definitions.
   69  */
   70 #if defined(__alpha__)
   71 #include <alpha/pci/pci_machdep.h>
   72 #elif defined(__i386__)
   73 #include <i386/pci/pci_machdep.h>
   74 #elif defined(__powerpc__)
   75 #include <powerpc/pci/pci_machdep.h>
   76 #elif defined(__sgi__)
   77 #include <sgi/pci/pci_machdep.h>
   78 #else
   79 #include <machine/pci_machdep.h>
   80 #endif
   81 
   82 /*
   83  * PCI bus attach arguments.
   84  */
   85 struct pcibus_attach_args {
   86         char    *pba_busname;           /* XXX should be common */
   87         bus_space_tag_t pba_iot;        /* pci i/o space tag */
   88         bus_space_tag_t pba_memt;       /* pci mem space tag */
   89         bus_dma_tag_t pba_dmat;         /* DMA tag */
   90         pci_chipset_tag_t pba_pc;
   91 
   92         int             pba_domain;     /* PCI domain */
   93         int             pba_bus;        /* PCI bus number */
   94 
   95         /*
   96          * Pointer to the pcitag of our parent bridge.  If there is no
   97          * parent bridge, then we assume we are a root bus.
   98          */
   99         pcitag_t        *pba_bridgetag;
  100         pci_intr_handle_t *pba_bridgeih;
  101 
  102         /*
  103          * Interrupt swizzling information.  These fields
  104          * are only used by secondary busses.
  105          */
  106         u_int           pba_intrswiz;   /* how to swizzle pins */
  107         pcitag_t        pba_intrtag;    /* intr. appears to come from here */
  108 };
  109 
  110 /*
  111  * PCI device attach arguments.
  112  */
  113 struct pci_attach_args {
  114         bus_space_tag_t pa_iot;         /* pci i/o space tag */
  115         bus_space_tag_t pa_memt;        /* pci mem space tag */
  116         bus_dma_tag_t pa_dmat;          /* DMA tag */
  117         pci_chipset_tag_t pa_pc;
  118         int             pa_flags;       /* flags; see below */
  119 
  120         u_int           pa_domain;
  121         u_int           pa_bus;
  122         u_int           pa_device;
  123         u_int           pa_function;
  124         pcitag_t        pa_tag;
  125         pcireg_t        pa_id, pa_class;
  126 
  127         pcitag_t        *pa_bridgetag;
  128         pci_intr_handle_t *pa_bridgeih;
  129 
  130         /*
  131          * Interrupt information.
  132          *
  133          * "Intrline" is used on systems whose firmware puts
  134          * the right routing data into the line register in
  135          * configuration space.  The rest are used on systems
  136          * that do not.
  137          */
  138         u_int           pa_intrswiz;    /* how to swizzle pins if ppb */
  139         pcitag_t        pa_intrtag;     /* intr. appears to come from here */
  140         pci_intr_pin_t  pa_intrpin;     /* intr. appears on this pin */
  141         pci_intr_line_t pa_intrline;    /* intr. routing information */
  142         pci_intr_pin_t  pa_rawintrpin;  /* unswizzled pin */
  143 };
  144 
  145 /*
  146  * Flags given in the bus and device attachment args.
  147  *
  148  * OpenBSD doesn't actually use them yet -- csapuntz@cvs.openbsd.org
  149  */
  150 #define PCI_FLAGS_IO_ENABLED    0x01            /* I/O space is enabled */
  151 #define PCI_FLAGS_MEM_ENABLED   0x02            /* memory space is enabled */
  152 #define PCI_FLAGS_MRL_OKAY      0x04            /* Memory Read Line okay */
  153 #define PCI_FLAGS_MRM_OKAY      0x08            /* Memory Read Multiple okay */
  154 #define PCI_FLAGS_MWI_OKAY      0x10            /* Memory Write and Invalidate
  155                                                    okay */
  156 
  157 /*
  158  *
  159  */
  160 struct pci_quirkdata {
  161         pci_vendor_id_t         vendor;         /* Vendor ID */
  162         pci_product_id_t        product;        /* Product ID */
  163         int                     quirks;         /* quirks; see below */
  164 };
  165 #define PCI_QUIRK_MULTIFUNCTION         1
  166 #define PCI_QUIRK_MONOFUNCTION          2
  167 
  168 struct pci_softc {
  169         struct device sc_dev;
  170         bus_space_tag_t sc_iot, sc_memt;
  171         bus_dma_tag_t sc_dmat;
  172         pci_chipset_tag_t sc_pc;
  173         void *sc_powerhook;
  174         LIST_HEAD(, pci_dev) sc_devs;
  175         int sc_domain, sc_bus, sc_maxndevs;
  176         pcitag_t *sc_bridgetag;
  177         pci_intr_handle_t *sc_bridgeih;
  178         u_int sc_intrswiz;
  179         pcitag_t sc_intrtag;
  180 };
  181 
  182 extern int pci_ndomains;
  183 
  184 /*
  185  * Locators devices that attach to 'pcibus', as specified to config.
  186  */
  187 #define pcibuscf_bus            cf_loc[0]
  188 #define PCIBUS_UNK_BUS          -1              /* wildcarded 'bus' */
  189 
  190 /*
  191  * Locators for PCI devices, as specified to config.
  192  */
  193 #define pcicf_dev               cf_loc[0]
  194 #define PCI_UNK_DEV             -1              /* wildcarded 'dev' */
  195 
  196 #define pcicf_function          cf_loc[1]
  197 #define PCI_UNK_FUNCTION        -1              /* wildcarded 'function' */
  198 
  199 /*
  200  * Configuration space access and utility functions.  (Note that most,
  201  * e.g. make_tag, conf_read, conf_write are declared by pci_machdep.h.)
  202  */
  203 int     pci_mapreg_probe(pci_chipset_tag_t, pcitag_t, int, pcireg_t *);
  204 pcireg_t pci_mapreg_type(pci_chipset_tag_t, pcitag_t, int);
  205 int     pci_mapreg_info(pci_chipset_tag_t, pcitag_t, int, pcireg_t,
  206             bus_addr_t *, bus_size_t *, int *);
  207 int     pci_mapreg_map(struct pci_attach_args *, int, pcireg_t, int,
  208             bus_space_tag_t *, bus_space_handle_t *, bus_addr_t *,
  209             bus_size_t *, bus_size_t);
  210 
  211 
  212 int     pci_io_find(pci_chipset_tag_t, pcitag_t, int, bus_addr_t *,
  213             bus_size_t *);
  214 int     pci_mem_find(pci_chipset_tag_t, pcitag_t, int, bus_addr_t *,
  215             bus_size_t *, int *);
  216 
  217 int pci_get_capability(pci_chipset_tag_t, pcitag_t, int,
  218                             int *, pcireg_t *);
  219 
  220 struct pci_matchid {
  221         pci_vendor_id_t         pm_vid;
  222         pci_product_id_t        pm_pid;
  223 };
  224 
  225 int pci_matchbyid(struct pci_attach_args *, const struct pci_matchid *, int);
  226 
  227 /*
  228  * Helper functions for autoconfiguration.
  229  */
  230 const char *pci_findvendor(pcireg_t);
  231 const char *pci_findproduct(pcireg_t);
  232 int     pci_find_device(struct pci_attach_args *pa,
  233                         int (*match)(struct pci_attach_args *));
  234 int     pci_probe_device(struct pci_softc *, pcitag_t tag,
  235             int (*)(struct pci_attach_args *), struct pci_attach_args *);
  236 void    pci_devinfo(pcireg_t, pcireg_t, int, char *, size_t);
  237 const struct pci_quirkdata *
  238         pci_lookup_quirkdata(pci_vendor_id_t, pci_product_id_t);
  239 void    pciagp_set_pchb(struct pci_attach_args *);
  240 
  241 #endif /* _KERNEL */
  242 #endif /* _DEV_PCI_PCIVAR_H_ */

/* [<][>][^][v][top][bottom][index][help] */