pciio.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:25k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id$
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1992 - 1997, 2000-2002 Silicon Graphics, Inc. All rights reserved.
  8.  */
  9. #ifndef _ASM_SN_PCI_PCIIO_H
  10. #define _ASM_SN_PCI_PCIIO_H
  11. /*
  12.  * pciio.h -- platform-independent PCI interface
  13.  */
  14. #include <asm/sn/ioerror.h>
  15. #include <asm/sn/driver.h>
  16. #include <asm/sn/hcl.h>
  17. #ifndef __ASSEMBLY__
  18. #include <asm/sn/dmamap.h>
  19. #include <asm/sn/alenlist.h>
  20. typedef int pciio_vendor_id_t;
  21. #define PCIIO_VENDOR_ID_NONE (-1)
  22. typedef int pciio_device_id_t;
  23. #define PCIIO_DEVICE_ID_NONE (-1)
  24. typedef uint8_t pciio_bus_t;       /* PCI bus number (0..255) */
  25. typedef uint8_t pciio_slot_t;      /* PCI slot number (0..31, 255) */
  26. typedef uint8_t pciio_function_t;  /* PCI func number (0..7, 255) */
  27. #define PCIIO_SLOTS ((pciio_slot_t)32)
  28. #define PCIIO_FUNCS ((pciio_function_t)8)
  29. #define PCIIO_SLOT_NONE ((pciio_slot_t)255)
  30. #define PCIIO_FUNC_NONE ((pciio_function_t)255)
  31. typedef int pciio_intr_line_t; /* PCI interrupt line(s) */
  32. #define PCIIO_INTR_LINE(n)      (0x1 << (n))
  33. #define PCIIO_INTR_LINE_A (0x1)
  34. #define PCIIO_INTR_LINE_B (0x2)
  35. #define PCIIO_INTR_LINE_C (0x4)
  36. #define PCIIO_INTR_LINE_D (0x8)
  37. typedef int pciio_space_t; /* PCI address space designation */
  38. #define PCIIO_SPACE_NONE (0)
  39. #define PCIIO_SPACE_ROM (1)
  40. #define PCIIO_SPACE_IO (2)
  41. /* PCIIO_SPACE_ (3) */
  42. #define PCIIO_SPACE_MEM (4)
  43. #define PCIIO_SPACE_MEM32 (5)
  44. #define PCIIO_SPACE_MEM64 (6)
  45. #define PCIIO_SPACE_CFG (7)
  46. #define PCIIO_SPACE_WIN0 (8)
  47. #define PCIIO_SPACE_WIN(n) (PCIIO_SPACE_WIN0+(n)) /* 8..13 */
  48. /* PCIIO_SPACE_ (14) */
  49. #define PCIIO_SPACE_BAD (15)
  50. #if 1 /* does anyone really use these? */
  51. #define PCIIO_SPACE_USER0 (20)
  52. #define PCIIO_SPACE_USER(n) (PCIIO_SPACE_USER0+(n)) /* 20 .. ? */
  53. #endif
  54. /*
  55.  * PCI_NOWHERE is the error value returned in
  56.  * place of a PCI address when there is no
  57.  * corresponding address.
  58.  */
  59. #define PCI_NOWHERE (0)
  60. /*
  61.  *    Acceptable flag bits for pciio service calls
  62.  *
  63.  * PCIIO_FIXED: require that mappings be established
  64.  * using fixed sharable resources; address
  65.  * translation results will be permanently
  66.  * available. (PIOMAP_FIXED and DMAMAP_FIXED are
  67.  * the same numeric value and are acceptable).
  68.  * PCIIO_NOSLEEP: if any part of the operation would
  69.  * sleep waiting for resoruces, return an error
  70.  * instead. (PIOMAP_NOSLEEP and DMAMAP_NOSLEEP are
  71.  * the same numeric value and are acceptable).
  72.  * PCIIO_INPLACE: when operating on alenlist structures,
  73.  * reuse the source alenlist rather than creating a
  74.  * new one. (PIOMAP_INPLACE and DMAMAP_INPLACE are
  75.  * the same numeric value and are acceptable).
  76.  *
  77.  * PCIIO_DMA_CMD: configure this stream as a
  78.  * generic "command" stream. Generally this
  79.  * means turn off prefetchers and write
  80.  * gatherers, and whatever else might be
  81.  * necessary to make command ring DMAs
  82.  * work as expected.
  83.  * PCIIO_DMA_DATA: configure this stream as a
  84.  * generic "data" stream. Generally, this
  85.  * means turning on prefetchers and write
  86.  * gatherers, and anything else that might
  87.  * increase the DMA throughput (short of
  88.  * using "high priority" or "real time"
  89.  * resources that may lower overall system
  90.  * performance).
  91.  * PCIIO_DMA_A64: this device is capable of
  92.  * using 64-bit DMA addresses. Unless this
  93.  * flag is specified, it is assumed that
  94.  * the DMA address must be in the low 4G
  95.  * of PCI space.
  96.  * PCIIO_PREFETCH: if there are prefetchers
  97.  * available, they can be turned on.
  98.  * PCIIO_NOPREFETCH: any prefetchers along
  99.  * the dma path should be turned off.
  100.  * PCIIO_WRITE_GATHER: if there are write gatherers
  101.  * available, they can be turned on.
  102.  * PCIIO_NOWRITE_GATHER: any write gatherers along
  103.  * the dma path should be turned off.
  104.  *
  105.  * PCIIO_BYTE_STREAM: the DMA stream represents a group
  106.  * of ordered bytes. Arrange all byte swapping
  107.  * hardware so that the bytes land in the correct
  108.  * order. This is a common setting for data
  109.  * channels, but is NOT implied by PCIIO_DMA_DATA.
  110.  * PCIIO_WORD_VALUES: the DMA stream is used to
  111.  * communicate quantities stored in multiple bytes,
  112.  * and the device doing the DMA is little-endian;
  113.  * arrange any swapping hardware so that
  114.  * 32-bit-wide values are maintained. This is a
  115.  * common setting for command rings that contain
  116.  * DMA addresses and counts, but is NOT implied by
  117.  * PCIIO_DMA_CMD. CPU Accesses to 16-bit fields
  118.  * must have their address xor-ed with 2, and
  119.  * accesses to individual bytes must have their
  120.  * addresses xor-ed with 3 relative to what the
  121.  * device expects.
  122.  *
  123.  * NOTE: any "provider specific" flags that
  124.  * conflict with the generic flags will
  125.  * override the generic flags, locally
  126.  * at that provider.
  127.  *
  128.  * Also, note that PCI-generic flags (PCIIO_) are
  129.  * in bits 0-14. The upper bits, 15-31, are reserved
  130.  * for PCI implementation-specific flags.
  131.  */
  132. #define PCIIO_FIXED DMAMAP_FIXED
  133. #define PCIIO_NOSLEEP DMAMAP_NOSLEEP
  134. #define PCIIO_INPLACE DMAMAP_INPLACE
  135. #define PCIIO_DMA_CMD 0x0010
  136. #define PCIIO_DMA_DATA 0x0020
  137. #define PCIIO_DMA_A64 0x0040
  138. #define PCIIO_WRITE_GATHER 0x0100
  139. #define PCIIO_NOWRITE_GATHER 0x0200
  140. #define PCIIO_PREFETCH 0x0400
  141. #define PCIIO_NOPREFETCH 0x0800
  142. /* Requesting an endianness setting that the
  143.  * underlieing hardware can not support
  144.  * WILL result in a failure to allocate
  145.  * dmamaps or complete a dmatrans.
  146.  */
  147. #define PCIIO_BYTE_STREAM 0x1000 /* set BYTE SWAP for "byte stream" */
  148. #define PCIIO_WORD_VALUES 0x2000 /* set BYTE SWAP for "word values" */
  149. /*
  150.  * Interface to deal with PCI endianness.
  151.  * The driver calls pciio_endian_set once, supplying the actual endianness of
  152.  * the device and the desired endianness.  On SGI systems, only use LITTLE if
  153.  * dealing with a driver that does software swizzling.  Most of the time,
  154.  * it's preferable to request BIG.  The return value indicates the endianness
  155.  * that is actually achieved.  On systems that support hardware swizzling,
  156.  * the achieved endianness will be the desired endianness.  On systems without
  157.  * swizzle hardware, the achieved endianness will be the device's endianness.
  158.  */
  159. typedef enum pciio_endian_e {
  160.     PCIDMA_ENDIAN_BIG,
  161.     PCIDMA_ENDIAN_LITTLE
  162. } pciio_endian_t;
  163. /*
  164.  * Interface to set PCI arbitration priority for devices that require
  165.  * realtime characteristics.  pciio_priority_set is used to switch a
  166.  * device between the PCI high-priority arbitration ring and the low
  167.  * priority arbitration ring.
  168.  *
  169.  * (Note: this is strictly for the PCI arbitrary priority.  It has
  170.  * no direct relationship to GBR.)
  171.  */
  172. typedef enum pciio_priority_e {
  173.     PCI_PRIO_LOW,
  174.     PCI_PRIO_HIGH
  175. } pciio_priority_t;
  176. /*
  177.  * handles of various sorts
  178.  */
  179. typedef struct pciio_piomap_s *pciio_piomap_t;
  180. typedef struct pciio_dmamap_s *pciio_dmamap_t;
  181. typedef struct pciio_intr_s *pciio_intr_t;
  182. typedef struct pciio_info_s *pciio_info_t;
  183. typedef struct pciio_piospace_s *pciio_piospace_t;
  184. /* PIO MANAGEMENT */
  185. /*
  186.  *    A NOTE ON PCI PIO ADDRESSES
  187.  *
  188.  *      PCI supports three different address spaces: CFG
  189.  *      space, MEM space and I/O space. Further, each
  190.  *      card always accepts CFG accesses at an address
  191.  *      based on which slot it is attached to, but can
  192.  *      decode up to six address ranges.
  193.  *
  194.  *      Assignment of the base address registers for all
  195.  *      PCI devices is handled centrally; most commonly,
  196.  *      device drivers will want to talk to offsets
  197.  *      within one or another of the address ranges. In
  198.  *      order to do this, which of these "address
  199.  *      spaces" the PIO is directed into must be encoded
  200.  *      in the flag word.
  201.  *
  202.  *      We reserve the right to defer allocation of PCI
  203.  *      address space for a device window until the
  204.  *      driver makes a piomap_alloc or piotrans_addr
  205.  *      request.
  206.  *
  207.  *      If a device driver mucks with its device's base
  208.  *      registers through a PIO mapping to CFG space,
  209.  *      results of further PIO through the corresponding
  210.  *      window are UNDEFINED.
  211.  *
  212.  *      Windows are named by the index in the base
  213.  *      address register set for the device of the
  214.  *      desired register; IN THE CASE OF 64 BIT base
  215.  *      registers, the index should be to the word of
  216.  *      the register that contains the mapping type
  217.  *      bits; since the PCI CFG space is natively
  218.  *      organized little-endian fashion, this is the
  219.  *      first of the two words.
  220.  *
  221.  *      AT THE MOMENT, any required corrections for
  222.  *      endianness are the responsibility of the device
  223.  *      driver; not all platforms support control in
  224.  *      hardware of byteswapping hardware. We anticipate
  225.  *      providing flag bits to the PIO and DMA
  226.  *      management interfaces to request different
  227.  *      configurations of byteswapping hardware.
  228.  *
  229.  *      PIO Accesses to CFG space via the "Bridge" ASIC
  230.  *      used in IP30 platforms preserve the native byte
  231.  *      significance within the 32-bit word; byte
  232.  *      addresses for single byte accesses need to be
  233.  *      XORed with 3, and addresses for 16-bit accesses
  234.  *      need to be XORed with 2.
  235.  *
  236.  *      The IOC3 used on IP30, and other SGI PCI devices
  237.  *      as well, require use of 32-bit accesses to their
  238.  *      configuration space registers. Any potential PCI
  239.  *      bus providers need to be aware of this requirement.
  240.  */
  241. #define PCIIO_PIOMAP_CFG (0x1)
  242. #define PCIIO_PIOMAP_MEM (0x2)
  243. #define PCIIO_PIOMAP_IO (0x4)
  244. #define PCIIO_PIOMAP_WIN(n) (0x8+(n))
  245. typedef pciio_piomap_t
  246. pciio_piomap_alloc_f    (devfs_handle_t dev, /* set up mapping for this device */
  247.  device_desc_t dev_desc, /* device descriptor */
  248.  pciio_space_t space, /* which address space */
  249.  iopaddr_t pcipio_addr, /* starting address */
  250.  size_t byte_count,
  251.  size_t byte_count_max, /* maximum size of a mapping */
  252.  unsigned flags); /* defined in sys/pio.h */
  253. typedef void
  254. pciio_piomap_free_f     (pciio_piomap_t pciio_piomap);
  255. typedef caddr_t
  256. pciio_piomap_addr_f     (pciio_piomap_t pciio_piomap, /* mapping resources */
  257.  iopaddr_t pciio_addr, /* map for this pcipio address */
  258.  size_t byte_count); /* map this many bytes */
  259. typedef void
  260. pciio_piomap_done_f     (pciio_piomap_t pciio_piomap);
  261. typedef caddr_t
  262. pciio_piotrans_addr_f   (devfs_handle_t dev, /* translate for this device */
  263.  device_desc_t dev_desc, /* device descriptor */
  264.  pciio_space_t space, /* which address space */
  265.  iopaddr_t pciio_addr, /* starting address */
  266.  size_t byte_count, /* map this many bytes */
  267.  unsigned flags);
  268. typedef caddr_t
  269. pciio_pio_addr_f        (devfs_handle_t dev, /* translate for this device */
  270.  device_desc_t dev_desc, /* device descriptor */
  271.  pciio_space_t space, /* which address space */
  272.  iopaddr_t pciio_addr, /* starting address */
  273.  size_t byte_count, /* map this many bytes */
  274.  pciio_piomap_t *mapp, /* in case a piomap was needed */
  275.  unsigned flags);
  276. typedef iopaddr_t
  277. pciio_piospace_alloc_f  (devfs_handle_t dev, /* PIO space for this device */
  278.  device_desc_t dev_desc, /* Device descriptor   */
  279.  pciio_space_t space, /* which address space  */
  280.  size_t byte_count, /* Number of bytes of space */
  281.  size_t alignment); /* Alignment of allocation  */
  282. typedef void
  283. pciio_piospace_free_f   (devfs_handle_t dev, /* Device freeing space */
  284.  pciio_space_t space, /* Which space is freed */
  285.  iopaddr_t pci_addr, /* Address being freed */
  286.  size_t size); /* Size freed           */
  287. /* DMA MANAGEMENT */
  288. typedef pciio_dmamap_t
  289. pciio_dmamap_alloc_f    (devfs_handle_t dev, /* set up mappings for this device */
  290.  device_desc_t dev_desc, /* device descriptor */
  291.  size_t byte_count_max, /* max size of a mapping */
  292.  unsigned flags); /* defined in dma.h */
  293. typedef void
  294. pciio_dmamap_free_f     (pciio_dmamap_t dmamap);
  295. typedef iopaddr_t
  296. pciio_dmamap_addr_f     (pciio_dmamap_t dmamap, /* use these mapping resources */
  297.  paddr_t paddr, /* map for this address */
  298.  size_t byte_count); /* map this many bytes */
  299. typedef alenlist_t
  300. pciio_dmamap_list_f     (pciio_dmamap_t dmamap, /* use these mapping resources */
  301.  alenlist_t alenlist, /* map this address/length list */
  302.  unsigned flags);
  303. typedef void
  304. pciio_dmamap_done_f     (pciio_dmamap_t dmamap);
  305. typedef iopaddr_t
  306. pciio_dmatrans_addr_f   (devfs_handle_t dev, /* translate for this device */
  307.  device_desc_t dev_desc, /* device descriptor */
  308.  paddr_t paddr, /* system physical address */
  309.  size_t byte_count, /* length */
  310.  unsigned flags); /* defined in dma.h */
  311. typedef alenlist_t
  312. pciio_dmatrans_list_f   (devfs_handle_t dev, /* translate for this device */
  313.  device_desc_t dev_desc, /* device descriptor */
  314.  alenlist_t palenlist, /* system address/length list */
  315.  unsigned flags); /* defined in dma.h */
  316. typedef void
  317. pciio_dmamap_drain_f (pciio_dmamap_t map);
  318. typedef void
  319. pciio_dmaaddr_drain_f (devfs_handle_t vhdl,
  320.  paddr_t addr,
  321.  size_t bytes);
  322. typedef void
  323. pciio_dmalist_drain_f (devfs_handle_t vhdl,
  324.  alenlist_t list);
  325. /* INTERRUPT MANAGEMENT */
  326. typedef pciio_intr_t
  327. pciio_intr_alloc_f      (devfs_handle_t dev, /* which PCI device */
  328.  device_desc_t dev_desc, /* device descriptor */
  329.  pciio_intr_line_t lines, /* which line(s) will be used */
  330.  devfs_handle_t owner_dev); /* owner of this intr */
  331. typedef void
  332. pciio_intr_free_f       (pciio_intr_t intr_hdl);
  333. typedef int
  334. pciio_intr_connect_f    (pciio_intr_t intr_hdl); /* pciio intr resource handle */
  335. typedef void
  336. pciio_intr_disconnect_f (pciio_intr_t intr_hdl);
  337. typedef devfs_handle_t
  338. pciio_intr_cpu_get_f    (pciio_intr_t intr_hdl); /* pciio intr resource handle */
  339. /* CONFIGURATION MANAGEMENT */
  340. typedef void
  341. pciio_provider_startup_f (devfs_handle_t pciio_provider);
  342. typedef void
  343. pciio_provider_shutdown_f (devfs_handle_t pciio_provider);
  344. typedef int
  345. pciio_reset_f (devfs_handle_t conn); /* pci connection point */
  346. typedef int
  347. pciio_write_gather_flush_f (devfs_handle_t dev);    /* Device flushing buffers */
  348. typedef pciio_endian_t /* actual endianness */
  349. pciio_endian_set_f      (devfs_handle_t dev, /* specify endianness for this device */
  350.  pciio_endian_t device_end, /* endianness of device */
  351.  pciio_endian_t desired_end); /* desired endianness */
  352. typedef pciio_priority_t
  353. pciio_priority_set_f    (devfs_handle_t pcicard,
  354.  pciio_priority_t device_prio);
  355. typedef uint64_t
  356. pciio_config_get_f (devfs_handle_t conn, /* pci connection point */
  357.  unsigned reg, /* register byte offset */
  358.  unsigned size); /* width in bytes (1..4) */
  359. typedef void
  360. pciio_config_set_f (devfs_handle_t conn, /* pci connection point */
  361.  unsigned reg, /* register byte offset */
  362.  unsigned size, /* width in bytes (1..4) */
  363.  uint64_t value); /* value to store */
  364. typedef int
  365. pciio_error_devenable_f (devfs_handle_t pconn_vhdl, int error_code);
  366. typedef pciio_slot_t
  367. pciio_error_extract_f (devfs_handle_t vhdl,
  368.  pciio_space_t *spacep,
  369.  iopaddr_t *addrp);
  370. typedef void
  371. pciio_driver_reg_callback_f (devfs_handle_t conn,
  372. int key1,
  373. int key2,
  374. int error);
  375. typedef void
  376. pciio_driver_unreg_callback_f (devfs_handle_t conn, /* pci connection point */
  377.  int key1,
  378.  int key2,
  379.  int error);
  380. typedef int
  381. pciio_device_unregister_f (devfs_handle_t conn);
  382. typedef int
  383. pciio_dma_enabled_f (devfs_handle_t conn);
  384. /*
  385.  * Adapters that provide a PCI interface adhere to this software interface.
  386.  */
  387. typedef struct pciio_provider_s {
  388.     /* PIO MANAGEMENT */
  389.     pciio_piomap_alloc_f   *piomap_alloc;
  390.     pciio_piomap_free_f    *piomap_free;
  391.     pciio_piomap_addr_f    *piomap_addr;
  392.     pciio_piomap_done_f    *piomap_done;
  393.     pciio_piotrans_addr_f  *piotrans_addr;
  394.     pciio_piospace_alloc_f *piospace_alloc;
  395.     pciio_piospace_free_f  *piospace_free;
  396.     /* DMA MANAGEMENT */
  397.     pciio_dmamap_alloc_f   *dmamap_alloc;
  398.     pciio_dmamap_free_f    *dmamap_free;
  399.     pciio_dmamap_addr_f    *dmamap_addr;
  400.     pciio_dmamap_list_f    *dmamap_list;
  401.     pciio_dmamap_done_f    *dmamap_done;
  402.     pciio_dmatrans_addr_f  *dmatrans_addr;
  403.     pciio_dmatrans_list_f  *dmatrans_list;
  404.     pciio_dmamap_drain_f   *dmamap_drain;
  405.     pciio_dmaaddr_drain_f  *dmaaddr_drain;
  406.     pciio_dmalist_drain_f  *dmalist_drain;
  407.     /* INTERRUPT MANAGEMENT */
  408.     pciio_intr_alloc_f     *intr_alloc;
  409.     pciio_intr_free_f      *intr_free;
  410.     pciio_intr_connect_f   *intr_connect;
  411.     pciio_intr_disconnect_f *intr_disconnect;
  412.     pciio_intr_cpu_get_f   *intr_cpu_get;
  413.     /* CONFIGURATION MANAGEMENT */
  414.     pciio_provider_startup_f *provider_startup;
  415.     pciio_provider_shutdown_f *provider_shutdown;
  416.     pciio_reset_f    *reset;
  417.     pciio_write_gather_flush_f *write_gather_flush;
  418.     pciio_endian_set_f     *endian_set;
  419.     pciio_priority_set_f   *priority_set;
  420.     pciio_config_get_f    *config_get;
  421.     pciio_config_set_f    *config_set;
  422.     /* Error handling interface */
  423.     pciio_error_devenable_f *error_devenable;
  424.     pciio_error_extract_f *error_extract;
  425.     /* Callback support */
  426.     pciio_driver_reg_callback_f *driver_reg_callback;
  427.     pciio_driver_unreg_callback_f *driver_unreg_callback;
  428.     pciio_device_unregister_f  *device_unregister;
  429.     pciio_dma_enabled_f *dma_enabled;
  430. } pciio_provider_t;
  431. /* PCI devices use these standard PCI provider interfaces */
  432. extern pciio_piomap_alloc_f pciio_piomap_alloc;
  433. extern pciio_piomap_free_f pciio_piomap_free;
  434. extern pciio_piomap_addr_f pciio_piomap_addr;
  435. extern pciio_piomap_done_f pciio_piomap_done;
  436. extern pciio_piotrans_addr_f pciio_piotrans_addr;
  437. extern pciio_pio_addr_f pciio_pio_addr;
  438. extern pciio_piospace_alloc_f pciio_piospace_alloc;
  439. extern pciio_piospace_free_f pciio_piospace_free;
  440. extern pciio_dmamap_alloc_f pciio_dmamap_alloc;
  441. extern pciio_dmamap_free_f pciio_dmamap_free;
  442. extern pciio_dmamap_addr_f pciio_dmamap_addr;
  443. extern pciio_dmamap_list_f pciio_dmamap_list;
  444. extern pciio_dmamap_done_f pciio_dmamap_done;
  445. extern pciio_dmatrans_addr_f pciio_dmatrans_addr;
  446. extern pciio_dmatrans_list_f pciio_dmatrans_list;
  447. extern pciio_dmamap_drain_f pciio_dmamap_drain;
  448. extern pciio_dmaaddr_drain_f pciio_dmaaddr_drain;
  449. extern pciio_dmalist_drain_f pciio_dmalist_drain;
  450. extern pciio_intr_alloc_f pciio_intr_alloc;
  451. extern pciio_intr_free_f pciio_intr_free;
  452. extern pciio_intr_connect_f pciio_intr_connect;
  453. extern pciio_intr_disconnect_f pciio_intr_disconnect;
  454. extern pciio_intr_cpu_get_f pciio_intr_cpu_get;
  455. extern pciio_provider_startup_f pciio_provider_startup;
  456. extern pciio_provider_shutdown_f pciio_provider_shutdown;
  457. extern pciio_reset_f pciio_reset;
  458. extern pciio_write_gather_flush_f pciio_write_gather_flush;
  459. extern pciio_endian_set_f pciio_endian_set;
  460. extern pciio_priority_set_f pciio_priority_set;
  461. extern pciio_config_get_f pciio_config_get;
  462. extern pciio_config_set_f pciio_config_set;
  463. extern pciio_error_devenable_f pciio_error_devenable;
  464. extern pciio_error_extract_f pciio_error_extract;
  465. /* Widgetdev in the IOERROR structure is encoded as follows.
  466.  * +---------------------------+
  467.  * | slot (7:3) | function(2:0)|
  468.  * +---------------------------+
  469.  * Following are the convenience interfaces to get at form
  470.  * a widgetdev or to break it into its constituents.
  471.  */
  472. #define PCIIO_WIDGETDEV_SLOT_SHFT 3
  473. #define PCIIO_WIDGETDEV_SLOT_MASK 0x1f
  474. #define PCIIO_WIDGETDEV_FUNC_MASK 0x7
  475. #define pciio_widgetdev_create(slot,func)       
  476.         (((slot) << PCIIO_WIDGETDEV_SLOT_SHFT) + (func))
  477. #define pciio_widgetdev_slot_get(wdev)
  478. (((wdev) >> PCIIO_WIDGETDEV_SLOT_SHFT) & PCIIO_WIDGETDEV_SLOT_MASK)
  479. #define pciio_widgetdev_func_get(wdev)
  480. ((wdev) & PCIIO_WIDGETDEV_FUNC_MASK)
  481. /* Generic PCI card initialization interface
  482.  */
  483. extern int
  484. pciio_driver_register  (pciio_vendor_id_t vendor_id, /* card's vendor number */
  485. pciio_device_id_t device_id, /* card's device number */
  486. char *driver_prefix, /* driver prefix */
  487. unsigned flags);
  488. extern void
  489. pciio_error_register   (devfs_handle_t pconn, /* which slot */
  490. error_handler_f *efunc, /* function to call */
  491. error_handler_arg_t einfo); /* first parameter */
  492. extern void             pciio_driver_unregister(char *driver_prefix);
  493. typedef void pciio_iter_f(devfs_handle_t pconn); /* a connect point */
  494. extern void             pciio_iterate(char *driver_prefix,
  495.       pciio_iter_f *func);
  496. /* Interfaces used by PCI Bus Providers to talk to
  497.  * the Generic PCI layer.
  498.  */
  499. extern devfs_handle_t
  500. pciio_device_register  (devfs_handle_t connectpt, /* vertex at center of bus */
  501. devfs_handle_t master, /* card's master ASIC (pci provider) */
  502. pciio_slot_t slot, /* card's slot (0..?) */
  503. pciio_function_t func, /* card's func (0..?) */
  504. pciio_vendor_id_t vendor, /* card's vendor number */
  505. pciio_device_id_t device); /* card's device number */
  506. extern void
  507. pciio_device_unregister(devfs_handle_t connectpt);
  508. extern pciio_info_t
  509. pciio_device_info_new  (pciio_info_t pciio_info, /* preallocated info struct */
  510. devfs_handle_t master, /* card's master ASIC (pci provider) */
  511. pciio_slot_t slot, /* card's slot (0..?) */
  512. pciio_function_t func, /* card's func (0..?) */
  513. pciio_vendor_id_t vendor, /* card's vendor number */
  514. pciio_device_id_t device); /* card's device number */
  515. extern void
  516. pciio_device_info_free(pciio_info_t pciio_info);
  517. extern devfs_handle_t
  518. pciio_device_info_register(
  519. devfs_handle_t connectpt, /* vertex at center of bus */
  520. pciio_info_t pciio_info); /* details about conn point */
  521. extern void
  522. pciio_device_info_unregister(
  523. devfs_handle_t connectpt, /* vertex at center of bus */
  524. pciio_info_t pciio_info); /* details about conn point */
  525. extern int              
  526. pciio_device_attach(
  527. devfs_handle_t pcicard,   /* vertex created by pciio_device_register */
  528. int drv_flags);
  529. extern int
  530. pciio_device_detach(
  531. devfs_handle_t pcicard,   /* vertex created by pciio_device_register */
  532.                         int drv_flags);
  533. /*
  534.  * Generic PCI interface, for use with all PCI providers
  535.  * and all PCI devices.
  536.  */
  537. /* Generic PCI interrupt interfaces */
  538. extern devfs_handle_t     pciio_intr_dev_get(pciio_intr_t pciio_intr);
  539. extern devfs_handle_t     pciio_intr_cpu_get(pciio_intr_t pciio_intr);
  540. /* Generic PCI pio interfaces */
  541. extern devfs_handle_t     pciio_pio_dev_get(pciio_piomap_t pciio_piomap);
  542. extern pciio_slot_t     pciio_pio_slot_get(pciio_piomap_t pciio_piomap);
  543. extern pciio_space_t    pciio_pio_space_get(pciio_piomap_t pciio_piomap);
  544. extern iopaddr_t        pciio_pio_pciaddr_get(pciio_piomap_t pciio_piomap);
  545. extern ulong            pciio_pio_mapsz_get(pciio_piomap_t pciio_piomap);
  546. extern caddr_t          pciio_pio_kvaddr_get(pciio_piomap_t pciio_piomap);
  547. #ifdef LATER
  548. #ifdef USE_PCI_PIO
  549. extern uint8_t  pciio_pio_read8(volatile uint8_t *addr);
  550. extern uint16_t  pciio_pio_read16(volatile uint16_t *addr);
  551. extern uint32_t  pciio_pio_read32(volatile uint32_t *addr);
  552. extern uint64_t  pciio_pio_read64(volatile uint64_t *addr);
  553. extern void  pciio_pio_write8(uint8_t val, volatile uint8_t *addr);
  554. extern void  pciio_pio_write16(uint16_t val, volatile uint16_t *addr);
  555. extern void  pciio_pio_write32(uint32_t val, volatile uint32_t *addr);
  556. extern void  pciio_pio_write64(uint64_t val, volatile uint64_t *addr);
  557. #else /* !USE_PCI_PIO */
  558. __inline uint8_t pciio_pio_read8(volatile uint8_t *addr)
  559. return *addr; 
  560. }
  561. __inline uint16_t pciio_pio_read16(volatile uint16_t *addr)
  562. {
  563. return *addr; 
  564. }
  565. __inline uint32_t pciio_pio_read32(volatile uint32_t *addr)
  566. {
  567. return *addr; 
  568. }
  569. __inline uint64_t pciio_pio_read64(volatile uint64_t *addr)
  570. {
  571. return *addr;
  572. }
  573. __inline void pciio_pio_write8(uint8_t val, volatile uint8_t *addr)
  574. {
  575. *addr = val;
  576. }
  577. __inline void pciio_pio_write16(uint16_t val, volatile uint16_t *addr)
  578. {
  579. *addr = val;
  580. }
  581. __inline void pciio_pio_write32(uint32_t val, volatile uint32_t *addr)
  582. {
  583. *addr = val;
  584. }
  585. __inline void pciio_pio_write64(uint64_t val, volatile uint64_t *addr)
  586. {
  587. *addr = val;
  588. }
  589. #endif /* USE_PCI_PIO */
  590. #endif /* LATER */
  591. /* Generic PCI dma interfaces */
  592. extern devfs_handle_t     pciio_dma_dev_get(pciio_dmamap_t pciio_dmamap);
  593. /* Register/unregister PCI providers and get implementation handle */
  594. extern void             pciio_provider_register(devfs_handle_t provider, pciio_provider_t *pciio_fns);
  595. extern void             pciio_provider_unregister(devfs_handle_t provider);
  596. extern pciio_provider_t *pciio_provider_fns_get(devfs_handle_t provider);
  597. /* Generic pci slot information access interface */
  598. extern pciio_info_t     pciio_info_chk(devfs_handle_t vhdl);
  599. extern pciio_info_t     pciio_info_get(devfs_handle_t vhdl);
  600. extern void             pciio_info_set(devfs_handle_t vhdl, pciio_info_t widget_info);
  601. extern devfs_handle_t     pciio_info_dev_get(pciio_info_t pciio_info);
  602. extern pciio_bus_t pciio_info_bus_get(pciio_info_t pciio_info);
  603. extern pciio_slot_t     pciio_info_slot_get(pciio_info_t pciio_info);
  604. extern pciio_function_t pciio_info_function_get(pciio_info_t pciio_info);
  605. extern pciio_vendor_id_t pciio_info_vendor_id_get(pciio_info_t pciio_info);
  606. extern pciio_device_id_t pciio_info_device_id_get(pciio_info_t pciio_info);
  607. extern devfs_handle_t     pciio_info_master_get(pciio_info_t pciio_info);
  608. extern arbitrary_info_t pciio_info_mfast_get(pciio_info_t pciio_info);
  609. extern pciio_provider_t *pciio_info_pops_get(pciio_info_t pciio_info);
  610. extern error_handler_f *pciio_info_efunc_get(pciio_info_t);
  611. extern error_handler_arg_t *pciio_info_einfo_get(pciio_info_t);
  612. extern pciio_space_t pciio_info_bar_space_get(pciio_info_t, int);
  613. extern iopaddr_t pciio_info_bar_base_get(pciio_info_t, int);
  614. extern size_t pciio_info_bar_size_get(pciio_info_t, int);
  615. extern iopaddr_t pciio_info_rom_base_get(pciio_info_t);
  616. extern size_t pciio_info_rom_size_get(pciio_info_t);
  617. extern int              pciio_error_handler(devfs_handle_t, int, ioerror_mode_t, ioerror_t *);
  618. extern int pciio_dma_enabled(devfs_handle_t);
  619. #endif /* C or C++ */
  620. #endif /* _ASM_SN_PCI_PCIIO_H */