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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/alpha/kernel/pci_impl.h
  3.  *
  4.  * This file contains declarations and inline functions for interfacing
  5.  * with the PCI initialization routines.
  6.  */
  7. struct pci_dev;
  8. struct pci_controller;
  9. struct pci_iommu_arena;
  10. /*
  11.  * We can't just blindly use 64K for machines with EISA busses; they
  12.  * may also have PCI-PCI bridges present, and then we'd configure the
  13.  * bridge incorrectly.
  14.  *
  15.  * Also, we start at 0x8000 or 0x9000, in hopes to get all devices'
  16.  * IO space areas allocated *before* 0xC000; this is because certain
  17.  * BIOSes (Millennium for one) use PCI Config space "mechanism #2"
  18.  * accesses to probe the bus. If a device's registers appear at 0xC000,
  19.  * it may see an INx/OUTx at that address during BIOS emulation of the
  20.  * VGA BIOS, and some cards, notably Adaptec 2940UW, take mortal offense.
  21.  */
  22. #define EISA_DEFAULT_IO_BASE 0x9000 /* start above 8th slot */
  23. #define DEFAULT_IO_BASE 0x8000 /* start at 8th slot */
  24. /*
  25.  * We try to make the DEFAULT_MEM_BASE addresses *always* have more than
  26.  * a single bit set. This is so that devices like the broken Myrinet card
  27.  * will always have a PCI memory address that will never match a IDSEL
  28.  * address in PCI Config space, which can cause problems with early rev cards.
  29.  */
  30. /*
  31.  * An XL is AVANTI (APECS) family, *but* it has only 27 bits of ISA address
  32.  * that get passed through the PCI<->ISA bridge chip. Although this causes
  33.  * us to set the PCI->Mem window bases lower than normal, we still allocate
  34.  * PCI bus devices' memory addresses *below* the low DMA mapping window,
  35.  * and hope they fit below 64Mb (to avoid conflicts), and so that they can
  36.  * be accessed via SPARSE space.
  37.  *
  38.  * We accept the risk that a broken Myrinet card will be put into a true XL
  39.  * and thus can more easily run into the problem described below.
  40.  */
  41. #define XL_DEFAULT_MEM_BASE ((16+2)*1024*1024) /* 16M to 64M-1 is avail */
  42. /*
  43.  * APECS and LCA have only 34 bits for physical addresses, thus limiting PCI
  44.  * bus memory addresses for SPARSE access to be less than 128Mb.
  45.  */
  46. #define APECS_AND_LCA_DEFAULT_MEM_BASE ((16+2)*1024*1024)
  47. /*
  48.  * Because the MCPCIA core logic supports more bits for physical addresses,
  49.  * it should allow an expanded range of SPARSE memory addresses.
  50.  * However, we do not use them all, in order to avoid the HAE manipulation
  51.  * that would be needed.
  52.  */
  53. #define MCPCIA_DEFAULT_MEM_BASE ((32+2)*1024*1024)
  54. /*
  55.  * Because CIA and PYXIS and T2 have more bits for physical addresses,
  56.  * they support an expanded range of SPARSE memory addresses.
  57.  */
  58. #define DEFAULT_MEM_BASE ((128+16)*1024*1024)
  59. /* ??? Experimenting with no HAE for CIA.  */
  60. #define CIA_DEFAULT_MEM_BASE ((32+2)*1024*1024)
  61. #define IRONGATE_DEFAULT_MEM_BASE ((256*8-16)*1024*1024)
  62. /* 
  63.  * A small note about bridges and interrupts.  The DECchip 21050 (and
  64.  * later) adheres to the PCI-PCI bridge specification.  This says that
  65.  * the interrupts on the other side of a bridge are swizzled in the
  66.  * following manner:
  67.  *
  68.  * Dev    Interrupt   Interrupt 
  69.  *        Pin on      Pin on 
  70.  *        Device      Connector
  71.  *
  72.  *   4    A           A
  73.  *        B           B
  74.  *        C           C
  75.  *        D           D
  76.  * 
  77.  *   5    A           B
  78.  *        B           C
  79.  *        C           D
  80.  *        D           A
  81.  *
  82.  *   6    A           C
  83.  *        B           D
  84.  *        C           A
  85.  *        D           B
  86.  *
  87.  *   7    A           D
  88.  *        B           A
  89.  *        C           B
  90.  *        D           C
  91.  *
  92.  *   Where A = pin 1, B = pin 2 and so on and pin=0 = default = A.
  93.  *   Thus, each swizzle is ((pin-1) + (device#-4)) % 4
  94.  *
  95.  *   The following code swizzles for exactly one bridge.  The routine
  96.  *   common_swizzle below handles multiple bridges.  But there are a
  97.  *   couple boards that do strange things, so we define this here.
  98.  */
  99. static inline u8 bridge_swizzle(u8 pin, u8 slot) 
  100. {
  101. return (((pin-1) + slot) % 4) + 1;
  102. }
  103. /* The following macro is used to implement the table-based irq mapping
  104.    function for all single-bus Alphas.  */
  105. #define COMMON_TABLE_LOOKUP
  106. ({ long _ctl_ = -1; 
  107.    if (slot >= min_idsel && slot <= max_idsel && pin < irqs_per_slot)
  108.      _ctl_ = irq_tab[slot - min_idsel][pin];
  109.    _ctl_; })
  110. /* A PCI IOMMU allocation arena.  There are typically two of these
  111.    regions per bus.  */
  112. /* ??? The 8400 has a 32-byte pte entry, and the entire table apparently
  113.    lives directly on the host bridge (no tlb?).  We don't support this
  114.    machine, but if we ever did, we'd need to parameterize all this quite
  115.    a bit further.  Probably with per-bus operation tables.  */
  116. struct pci_iommu_arena
  117. {
  118. spinlock_t lock;
  119. struct pci_controller *hose;
  120. #define IOMMU_INVALID_PTE 0x2 /* 32:63 bits MBZ */
  121. #define IOMMU_RESERVED_PTE 0xface
  122. unsigned long *ptes;
  123. dma_addr_t dma_base;
  124. unsigned int size;
  125. unsigned int next_entry;
  126. unsigned int align_entry;
  127. };
  128. /* The hose list.  */
  129. extern struct pci_controller *hose_head, **hose_tail;
  130. extern struct pci_controller *pci_isa_hose;
  131. extern void common_init_pci(void);
  132. extern u8 common_swizzle(struct pci_dev *, u8 *);
  133. extern struct pci_controller *alloc_pci_controller(void);
  134. extern struct resource *alloc_resource(void);
  135. extern struct pci_iommu_arena *iommu_arena_new(struct pci_controller *,
  136.        dma_addr_t, unsigned long,
  137.        unsigned long);
  138. extern long iommu_arena_alloc(struct pci_iommu_arena *arena, long n);
  139. extern const char *const pci_io_names[];
  140. extern const char *const pci_mem_names[];
  141. extern const char pci_hae0_name[];
  142. extern unsigned long size_for_memory(unsigned long max);
  143. extern int iommu_reserve(struct pci_iommu_arena *, long, long);
  144. extern int iommu_release(struct pci_iommu_arena *, long, long);
  145. extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *);
  146. extern int iommu_unbind(struct pci_iommu_arena *, long, long);