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

嵌入式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_PCIBR_H
  11. #define _ASM_SN_PCI_PCIBR_H
  12. #if defined(__KERNEL__)
  13. #include <asm/sn/dmamap.h>
  14. #include <asm/sn/iobus.h>
  15. #include <asm/sn/pio.h>
  16. #include <asm/sn/pci/pciio.h>
  17. #include <asm/sn/pci/bridge.h>
  18. /* =====================================================================
  19.  *    symbolic constants used by pcibr's xtalk bus provider
  20.  */
  21. #define PCIBR_PIOMAP_BUSY 0x80000000
  22. #define PCIBR_DMAMAP_BUSY 0x80000000
  23. #define PCIBR_DMAMAP_SSRAM 0x40000000
  24. #define PCIBR_INTR_BLOCKED 0x40000000
  25. #define PCIBR_INTR_BUSY 0x80000000
  26. #if LANGUAGE_C
  27. /* =====================================================================
  28.  *    opaque types used by pcibr's xtalk bus provider
  29.  */
  30. typedef struct pcibr_piomap_s *pcibr_piomap_t;
  31. typedef struct pcibr_dmamap_s *pcibr_dmamap_t;
  32. typedef struct pcibr_intr_s *pcibr_intr_t;
  33. /* =====================================================================
  34.  *    primary entry points: Bridge (pcibr) device driver
  35.  *
  36.  * These functions are normal device driver entry points
  37.  * and are called along with the similar entry points from
  38.  * other device drivers. They are included here as documentation
  39.  * of their existance and purpose.
  40.  *
  41.  * pcibr_init() is called to inform us that there is a pcibr driver
  42.  * configured into the kernel; it is responsible for registering
  43.  * as a crosstalk widget and providing a routine to be called
  44.  * when a widget with the proper part number is observed.
  45.  *
  46.  * pcibr_attach() is called for each vertex in the hardware graph
  47.  * corresponding to a crosstalk widget with the manufacturer
  48.  * code and part number registered by pcibr_init().
  49.  */
  50. extern void pcibr_init(void);
  51. extern int pcibr_attach(devfs_handle_t);
  52. /* =====================================================================
  53.  *    bus provider function table
  54.  *
  55.  * Normally, this table is only handed off explicitly
  56.  * during provider initialization, and the PCI generic
  57.  * layer will stash a pointer to it in the vertex; however,
  58.  * exporting it explicitly enables a performance hack in
  59.  * the generic PCI provider where if we know at compile
  60.  * time that the only possible PCI provider is a
  61.  * pcibr, we can go directly to this ops table.
  62.  */
  63. extern pciio_provider_t pcibr_provider;
  64. /* =====================================================================
  65.  *    secondary entry points: pcibr PCI bus provider
  66.  *
  67.  * These functions are normally exported explicitly by
  68.  * a direct call from the pcibr initialization routine
  69.  * into the generic crosstalk provider; they are included
  70.  * here to enable a more aggressive performance hack in
  71.  * the generic crosstalk layer, where if we know that the
  72.  * only possible crosstalk provider is pcibr, and we can
  73.  * guarantee that all entry points are properly named, and
  74.  * we can deal with the implicit casting properly, then
  75.  * we can turn many of the generic provider routines into
  76.  * plain brances, or even eliminate them (given sufficient
  77.  * smarts on the part of the compilation system).
  78.  */
  79. extern pcibr_piomap_t pcibr_piomap_alloc(devfs_handle_t dev,
  80.    device_desc_t dev_desc,
  81.    pciio_space_t space,
  82.    iopaddr_t pci_addr,
  83.    size_t byte_count,
  84.    size_t byte_count_max,
  85.    unsigned flags);
  86. extern void pcibr_piomap_free(pcibr_piomap_t piomap);
  87. extern caddr_t pcibr_piomap_addr(pcibr_piomap_t piomap,
  88.   iopaddr_t xtalk_addr,
  89.   size_t byte_count);
  90. extern void pcibr_piomap_done(pcibr_piomap_t piomap);
  91. extern caddr_t pcibr_piotrans_addr(devfs_handle_t dev,
  92.     device_desc_t dev_desc,
  93.     pciio_space_t space,
  94.     iopaddr_t pci_addr,
  95.     size_t byte_count,
  96.     unsigned flags);
  97. extern iopaddr_t pcibr_piospace_alloc(devfs_handle_t dev,
  98.      device_desc_t dev_desc,
  99.      pciio_space_t space,
  100.      size_t byte_count,
  101.      size_t alignment);
  102. extern void pcibr_piospace_free(devfs_handle_t dev,
  103.     pciio_space_t space,
  104.     iopaddr_t pciaddr,
  105.     size_t byte_count);
  106. extern pcibr_dmamap_t pcibr_dmamap_alloc(devfs_handle_t dev,
  107.    device_desc_t dev_desc,
  108.    size_t byte_count_max,
  109.    unsigned flags);
  110. extern void pcibr_dmamap_free(pcibr_dmamap_t dmamap);
  111. extern iopaddr_t pcibr_dmamap_addr(pcibr_dmamap_t dmamap,
  112.   paddr_t paddr,
  113.   size_t byte_count);
  114. extern alenlist_t pcibr_dmamap_list(pcibr_dmamap_t dmamap,
  115.   alenlist_t palenlist,
  116.   unsigned flags);
  117. extern void pcibr_dmamap_done(pcibr_dmamap_t dmamap);
  118. /*
  119.  * pcibr_get_dmatrans_node() will return the compact node id to which  
  120.  * all 32-bit Direct Mapping memory accesses will be directed.
  121.  * (This node id can be different for each PCI bus.) 
  122.  */
  123. extern cnodeid_t pcibr_get_dmatrans_node(devfs_handle_t pconn_vhdl);
  124. extern iopaddr_t pcibr_dmatrans_addr(devfs_handle_t dev,
  125.     device_desc_t dev_desc,
  126.     paddr_t paddr,
  127.     size_t byte_count,
  128.     unsigned flags);
  129. extern alenlist_t pcibr_dmatrans_list(devfs_handle_t dev,
  130.     device_desc_t dev_desc,
  131.     alenlist_t palenlist,
  132.     unsigned flags);
  133. extern void pcibr_dmamap_drain(pcibr_dmamap_t map);
  134. extern void pcibr_dmaaddr_drain(devfs_handle_t vhdl,
  135.     paddr_t addr,
  136.     size_t bytes);
  137. extern void pcibr_dmalist_drain(devfs_handle_t vhdl,
  138.     alenlist_t list);
  139. typedef unsigned pcibr_intr_ibit_f(pciio_info_t info,
  140.   pciio_intr_line_t lines);
  141. extern void pcibr_intr_ibit_set(devfs_handle_t, pcibr_intr_ibit_f *);
  142. extern pcibr_intr_t pcibr_intr_alloc(devfs_handle_t dev,
  143.  device_desc_t dev_desc,
  144.  pciio_intr_line_t lines,
  145.  devfs_handle_t owner_dev);
  146. extern void pcibr_intr_free(pcibr_intr_t intr);
  147. extern int pcibr_intr_connect(pcibr_intr_t intr,
  148.    intr_func_t intr_func,
  149.    intr_arg_t intr_arg,
  150.    void *thread);
  151. extern void pcibr_intr_disconnect(pcibr_intr_t intr);
  152. extern devfs_handle_t pcibr_intr_cpu_get(pcibr_intr_t intr);
  153. extern void pcibr_provider_startup(devfs_handle_t pcibr);
  154. extern void pcibr_provider_shutdown(devfs_handle_t pcibr);
  155. extern int pcibr_reset(devfs_handle_t dev);
  156. extern int              pcibr_write_gather_flush(devfs_handle_t dev);
  157. extern pciio_endian_t pcibr_endian_set(devfs_handle_t dev,
  158.  pciio_endian_t device_end,
  159.  pciio_endian_t desired_end);
  160. extern pciio_priority_t pcibr_priority_set(devfs_handle_t dev,
  161.    pciio_priority_t device_prio);
  162. extern uint64_t pcibr_config_get(devfs_handle_t conn,
  163.  unsigned reg,
  164.  unsigned size);
  165. extern void pcibr_config_set(devfs_handle_t conn,
  166.  unsigned reg,
  167.  unsigned size,
  168.  uint64_t value);
  169. extern int pcibr_error_devenable(devfs_handle_t pconn_vhdl,
  170.       int error_code);
  171. extern pciio_slot_t pcibr_error_extract(devfs_handle_t pcibr_vhdl,
  172.     pciio_space_t *spacep,
  173.     iopaddr_t *addrp);
  174. extern int pcibr_wrb_flush(devfs_handle_t pconn_vhdl);
  175. extern int pcibr_rrb_check(devfs_handle_t pconn_vhdl,
  176. int *count_vchan0,
  177. int *count_vchan1,
  178. int *count_reserved,
  179. int *count_pool);
  180. extern int pcibr_alloc_all_rrbs(devfs_handle_t vhdl, int even_odd,
  181.      int dev_1_rrbs, int virt1,
  182.      int dev_2_rrbs, int virt2,
  183.      int dev_3_rrbs, int virt3,
  184.      int dev_4_rrbs, int virt4);
  185. typedef void
  186. rrb_alloc_funct_f (devfs_handle_t xconn_vhdl,
  187.  int *vendor_list);
  188. typedef rrb_alloc_funct_f      *rrb_alloc_funct_t;
  189. void pcibr_set_rrb_callback(devfs_handle_t xconn_vhdl,
  190.        rrb_alloc_funct_f *func);
  191. extern int pcibr_device_unregister(devfs_handle_t);
  192. extern int pcibr_dma_enabled(devfs_handle_t);
  193. /*
  194.  * Bridge-specific flags that can be set via pcibr_device_flags_set
  195.  * and cleared via pcibr_device_flags_clear.  Other flags are
  196.  * more generic and are maniuplated through PCI-generic interfaces.
  197.  *
  198.  * Note that all PCI implementation-specific flags (Bridge flags, in
  199.  * this case) are in bits 15-31.  The lower 15 bits are reserved
  200.  * for PCI-generic flags.
  201.  *
  202.  * Some of these flags have been "promoted" to the
  203.  * generic layer, so they can be used without having
  204.  * to "know" that the PCI bus is hosted by a Bridge.
  205.  *
  206.  * PCIBR_NO_ATE_ROUNDUP: Request that no rounding up be done when 
  207.  * allocating ATE's. ATE count computation will assume that the
  208.  * address to be mapped will start on a page boundary.
  209.  */
  210. #define PCIBR_NO_ATE_ROUNDUP    0x00008000
  211. #define PCIBR_WRITE_GATHER 0x00010000 /* please use PCIIO version */
  212. #define PCIBR_NOWRITE_GATHER 0x00020000 /* please use PCIIO version */
  213. #define PCIBR_PREFETCH 0x00040000 /* please use PCIIO version */
  214. #define PCIBR_NOPREFETCH 0x00080000 /* please use PCIIO version */
  215. #define PCIBR_PRECISE 0x00100000
  216. #define PCIBR_NOPRECISE 0x00200000
  217. #define PCIBR_BARRIER 0x00400000
  218. #define PCIBR_NOBARRIER 0x00800000
  219. #define PCIBR_VCHAN0 0x01000000
  220. #define PCIBR_VCHAN1 0x02000000
  221. #define PCIBR_64BIT 0x04000000
  222. #define PCIBR_NO64BIT 0x08000000
  223. #define PCIBR_SWAP 0x10000000
  224. #define PCIBR_NOSWAP 0x20000000
  225. #define PCIBR_EXTERNAL_ATES 0x40000000 /* uses external ATEs */
  226. #define PCIBR_ACTIVE 0x80000000 /* need a "done" */
  227. /* Flags that have meaning to pcibr_device_flags_{set,clear} */
  228. #define PCIBR_DEVICE_FLAGS (
  229. PCIBR_WRITE_GATHER |
  230. PCIBR_NOWRITE_GATHER |
  231. PCIBR_PREFETCH |
  232. PCIBR_NOPREFETCH |
  233. PCIBR_PRECISE |
  234. PCIBR_NOPRECISE |
  235. PCIBR_BARRIER |
  236. PCIBR_NOBARRIER
  237. )
  238. /* Flags that have meaning to *_dmamap_alloc, *_dmatrans_{addr,list} */
  239. #define PCIBR_DMA_FLAGS (
  240. PCIBR_PREFETCH |
  241. PCIBR_NOPREFETCH |
  242. PCIBR_PRECISE |
  243. PCIBR_NOPRECISE |
  244. PCIBR_BARRIER |
  245. PCIBR_NOBARRIER |
  246. PCIBR_VCHAN0 |
  247. PCIBR_VCHAN1
  248. )
  249. typedef int pcibr_device_flags_t;
  250. /*
  251.  * Set bits in the Bridge Device(x) register for this device.
  252.  * "flags" are defined above. NOTE: this includes turning
  253.  * things *OFF* as well as turning them *ON* ...
  254.  */
  255. extern int pcibr_device_flags_set(devfs_handle_t dev,
  256.      pcibr_device_flags_t flags);
  257. /*
  258.  * Allocate Read Response Buffers for use by the specified device.
  259.  * count_vchan0 is the total number of buffers desired for the
  260.  * "normal" channel.  count_vchan1 is the total number of buffers
  261.  * desired for the "virtual" channel.  Returns 0 on success, or
  262.  * <0 on failure, which occurs when we're unable to allocate any
  263.  * buffers to a channel that desires at least one buffer.
  264.  */
  265. extern int pcibr_rrb_alloc(devfs_handle_t pconn_vhdl,
  266. int *count_vchan0,
  267. int *count_vchan1);
  268. /*
  269.  * Get the starting PCIbus address out of the given DMA map.
  270.  * This function is supposed to be used by a close friend of PCI bridge
  271.  * since it relies on the fact that the starting address of the map is fixed at
  272.  * the allocation time in the current implementation of PCI bridge.
  273.  */
  274. extern iopaddr_t pcibr_dmamap_pciaddr_get(pcibr_dmamap_t);
  275. extern xwidget_intr_preset_f pcibr_xintr_preset;
  276. extern void pcibr_hints_fix_rrbs(devfs_handle_t);
  277. extern void pcibr_hints_dualslot(devfs_handle_t, pciio_slot_t, pciio_slot_t);
  278. extern void pcibr_hints_subdevs(devfs_handle_t, pciio_slot_t, ulong);
  279. extern void pcibr_hints_handsoff(devfs_handle_t);
  280. typedef unsigned pcibr_intr_bits_f(pciio_info_t, pciio_intr_line_t);
  281. extern void pcibr_hints_intr_bits(devfs_handle_t, pcibr_intr_bits_f *);
  282. extern int pcibr_asic_rev(devfs_handle_t);
  283. #endif  /* _LANGUAGE_C */
  284. #endif /* #if defined(__KERNEL__) */
  285. /* 
  286.  * Some useful ioctls into the pcibr driver
  287.  */
  288. #define PCIBR 'p'
  289. #define _PCIBR(x) ((PCIBR << 8) | (x))
  290. #define PCIBR_SLOT_STARTUP _PCIBR(1)
  291. #define PCIBR_SLOT_SHUTDOWN     _PCIBR(2)
  292. #define PCIBR_SLOT_QUERY _PCIBR(3)
  293. /*
  294.  * Bit defintions for variable slot_status in struct
  295.  * pcibr_soft_slot_s.  They are here so that both
  296.  * the pcibr driver and the pciconfig command can
  297.  * reference them.
  298.  */
  299. #define SLOT_STARTUP_CMPLT      0x01
  300. #define SLOT_STARTUP_INCMPLT    0x02
  301. #define SLOT_SHUTDOWN_CMPLT     0x04
  302. #define SLOT_SHUTDOWN_INCMPLT   0x08
  303. #define SLOT_POWER_UP           0x10
  304. #define SLOT_POWER_DOWN         0x20
  305. #define SLOT_IS_SYS_CRITICAL    0x40
  306. #define SLOT_STATUS_MASK        (SLOT_STARTUP_CMPLT | SLOT_STARTUP_INCMPLT | 
  307.                                  SLOT_SHUTDOWN_CMPLT | SLOT_SHUTDOWN_INCMPLT)
  308. #define SLOT_POWER_MASK         (SLOT_POWER_UP | SLOT_POWER_DOWN)
  309. /*
  310.  * Bit definitions for variable resp_f_staus.
  311.  * They are here so that both the pcibr driver
  312.  * and the pciconfig command can reference them.
  313.  */
  314. #define FUNC_IS_VALID           0x01
  315. #define FUNC_IS_SYS_CRITICAL    0x02
  316. /*
  317.  * Structures for requesting PCI bridge information and receiving a response
  318.  */
  319. typedef struct pcibr_slot_info_req_s *pcibr_slot_info_req_t;
  320. typedef struct pcibr_slot_info_resp_s *pcibr_slot_info_resp_t;
  321. typedef struct pcibr_slot_func_info_resp_s *pcibr_slot_func_info_resp_t;
  322. struct pcibr_slot_info_req_s {
  323.    int                      req_slot;
  324.    pcibr_slot_info_resp_t   req_respp;
  325.    int                      req_size;
  326. };
  327. struct pcibr_slot_info_resp_s {
  328.     int                     resp_has_host;
  329.     char                    resp_host_slot;
  330.     devfs_handle_t            resp_slot_conn;
  331.     char                    resp_slot_conn_name[MAXDEVNAME];
  332.     int                     resp_slot_status;
  333.     int                     resp_l1_bus_num;
  334.     int                     resp_bss_ninfo;
  335.     char                    resp_bss_devio_bssd_space[16];
  336.     iopaddr_t               resp_bss_devio_bssd_base; 
  337.     bridgereg_t             resp_bss_device;
  338.     int                     resp_bss_pmu_uctr;
  339.     int                     resp_bss_d32_uctr;
  340.     int                     resp_bss_d64_uctr;
  341.     iopaddr_t               resp_bss_d64_base;
  342.     unsigned                resp_bss_d64_flags;
  343.     iopaddr_t               resp_bss_d32_base;
  344.     unsigned                resp_bss_d32_flags;
  345.     int                     resp_bss_ext_ates_active;
  346.     volatile unsigned      *resp_bss_cmd_pointer;
  347.     unsigned                resp_bss_cmd_shadow;
  348.     int                     resp_bs_rrb_valid;
  349.     int                     resp_bs_rrb_valid_v;
  350.     int                     resp_bs_rrb_res;
  351.     bridgereg_t             resp_b_resp;
  352.     bridgereg_t             resp_b_int_device;
  353.     bridgereg_t             resp_b_int_enable;
  354.     bridgereg_t             resp_b_int_host;
  355.     struct pcibr_slot_func_info_resp_s {
  356.         int                     resp_f_status;
  357.         char                    resp_f_slot_name[MAXDEVNAME];
  358.         char                    resp_f_bus;
  359.         char                    resp_f_slot;
  360.         char                    resp_f_func;
  361.         char                    resp_f_master_name[MAXDEVNAME];
  362.         void                   *resp_f_pops;
  363.         error_handler_f        *resp_f_efunc;
  364.         error_handler_arg_t     resp_f_einfo;
  365.         int                     resp_f_vendor;
  366.         int                     resp_f_device;
  367.         struct {
  368.             char                    resp_w_space[16];
  369.             iopaddr_t               resp_w_base;
  370.             size_t                  resp_w_size;
  371.         } resp_f_window[6];
  372.         unsigned                resp_f_rbase;
  373.         unsigned                resp_f_rsize;
  374.         int                     resp_f_ibit[4];
  375.         int                     resp_f_att_det_error;
  376.     } resp_func[8];
  377. };
  378. #endif /* _ASM_SN_PCI_PCIBR_H */