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

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