pciio.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:25k
源码类别:

嵌入式Linux

开发平台:

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