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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_SH_PCI_H
  2. #define __ASM_SH_PCI_H
  3. #ifdef __KERNEL__
  4. #include <linux/config.h>
  5. /* Can be used to override the logic in pci_scan_bus for skipping
  6.    already-configured bus numbers - to be used for buggy BIOSes
  7.    or architectures with incomplete PCI setup by the loader */
  8. #define pcibios_assign_all_busses() 1
  9. #if defined(CONFIG_CPU_SUBTYPE_ST40STB1)
  10. /* These are currently the correct values for the STM overdrive board. 
  11.  * We need some way of setting this on a board specific way, it will 
  12.  * not be the same on other boards I think
  13.  */
  14. #define PCIBIOS_MIN_IO 0x2000
  15. #define PCIBIOS_MIN_MEM 0x10000000
  16. #elif defined(CONFIG_SH_DREAMCAST)
  17. #define PCIBIOS_MIN_IO 0x2000
  18. #define PCIBIOS_MIN_MEM 0x10000000
  19. #elif defined(CONFIG_SH_BIGSUR) && defined(CONFIG_CPU_SUBTYPE_SH7751)
  20. #define PCIBIOS_MIN_IO 0x2000
  21. #define PCIBIOS_MIN_MEM 0xFD000000
  22. #elif defined(CONFIG_SH_7751_SOLUTION_ENGINE)
  23. #define PCIBIOS_MIN_IO          0x4000
  24. #define PCIBIOS_MIN_MEM         0xFD000000
  25. #endif
  26. struct pci_dev;
  27. extern void pcibios_set_master(struct pci_dev *dev);
  28. static inline void pcibios_penalize_isa_irq(int irq)
  29. {
  30. /* We don't do dynamic PCI IRQ allocation */
  31. }
  32. /* Dynamic DMA mapping stuff.
  33.  * SuperH has everything mapped statically like x86.
  34.  */
  35. #include <linux/types.h>
  36. #include <linux/slab.h>
  37. #include <asm/scatterlist.h>
  38. #include <linux/string.h>
  39. #include <asm/io.h>
  40. /* Allocate and map kernel buffer using consistent mode DMA for a device.
  41.  * hwdev should be valid struct pci_dev pointer for PCI devices,
  42.  * NULL for PCI-like buses (ISA, EISA).
  43.  * Returns non-NULL cpu-view pointer to the buffer if successful and
  44.  * sets *dma_addrp to the pci side dma address as well, else *dma_addrp
  45.  * is undefined.
  46.  */
  47. extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
  48.   dma_addr_t *dma_handle);
  49. /* Free and unmap a consistent DMA buffer.
  50.  * cpu_addr is what was returned from pci_alloc_consistent,
  51.  * size must be the same as what as passed into pci_alloc_consistent,
  52.  * and likewise dma_addr must be the same as what *dma_addrp was set to.
  53.  *
  54.  * References to the memory and mappings associated with cpu_addr/dma_addr
  55.  * past this call are illegal.
  56.  */
  57. extern void pci_free_consistent(struct pci_dev *hwdev, size_t size,
  58. void *vaddr, dma_addr_t dma_handle);
  59. /* Map a single buffer of the indicated size for DMA in streaming mode.
  60.  * The 32-bit bus address to use is returned.
  61.  *
  62.  * Once the device is given the dma address, the device owns this memory
  63.  * until either pci_unmap_single or pci_dma_sync_single is performed.
  64.  */
  65. static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
  66. size_t size, int direction)
  67. {
  68. if (direction == PCI_DMA_NONE)
  69.                 BUG();
  70. #ifdef CONFIG_SH_PCIDMA_NONCOHERENT
  71. dma_cache_wback_inv(ptr, size);
  72. #endif
  73. return virt_to_bus(ptr);
  74. }
  75. /* pci_unmap_{single,page} being a nop depends upon the
  76.  * configuration.
  77.  */
  78. #ifdef CONFIG_SH_PCIDMA_NONCOHERENT
  79. #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
  80. dma_addr_t ADDR_NAME;
  81. #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
  82. __u32 LEN_NAME;
  83. #define pci_unmap_addr(PTR, ADDR_NAME)
  84. ((PTR)->ADDR_NAME)
  85. #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)
  86. (((PTR)->ADDR_NAME) = (VAL))
  87. #define pci_unmap_len(PTR, LEN_NAME)
  88. ((PTR)->LEN_NAME)
  89. #define pci_unmap_len_set(PTR, LEN_NAME, VAL)
  90. (((PTR)->LEN_NAME) = (VAL))
  91. #else
  92. #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
  93. #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
  94. #define pci_unmap_addr(PTR, ADDR_NAME) (0)
  95. #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
  96. #define pci_unmap_len(PTR, LEN_NAME) (0)
  97. #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
  98. #endif
  99. /* Unmap a single streaming mode DMA translation.  The dma_addr and size
  100.  * must match what was provided for in a previous pci_map_single call.  All
  101.  * other usages are undefined.
  102.  *
  103.  * After this call, reads by the cpu to the buffer are guarenteed to see
  104.  * whatever the device wrote there.
  105.  */
  106. static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
  107.     size_t size,int direction)
  108. {
  109. /* Nothing to do */
  110. }
  111. /* Map a set of buffers described by scatterlist in streaming
  112.  * mode for DMA.  This is the scather-gather version of the
  113.  * above pci_map_single interface.  Here the scatter gather list
  114.  * elements are each tagged with the appropriate dma address
  115.  * and length.  They are obtained via sg_dma_{address,length}(SG).
  116.  *
  117.  * NOTE: An implementation may be able to use a smaller number of
  118.  *       DMA address/length pairs than there are SG table elements.
  119.  *       (for example via virtual mapping capabilities)
  120.  *       The routine returns the number of addr/length pairs actually
  121.  *       used, at most nents.
  122.  *
  123.  * Device ownership issues as mentioned above for pci_map_single are
  124.  * the same here.
  125.  */
  126. static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
  127.      int nents, int direction)
  128. {
  129. #ifdef CONFIG_SH_PCIDMA_NONCOHERENT
  130. int i;
  131. for (i=0; i<nents; i++)
  132. dma_cache_wback_inv(sg[i].address, sg[i].length);
  133. #endif
  134. if (direction == PCI_DMA_NONE)
  135.                 BUG();
  136. return nents;
  137. }
  138. /* Unmap a set of streaming mode DMA translations.
  139.  * Again, cpu read rules concerning calls here are the same as for
  140.  * pci_unmap_single() above.
  141.  */
  142. static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
  143. int nents, int direction)
  144. {
  145. /* Nothing to do */
  146. }
  147. /* Make physical memory consistent for a single
  148.  * streaming mode DMA translation after a transfer.
  149.  *
  150.  * If you perform a pci_map_single() but wish to interrogate the
  151.  * buffer using the cpu, yet do not wish to teardown the PCI dma
  152.  * mapping, you must call this function before doing so.  At the
  153.  * next point you give the PCI dma address back to the card, the
  154.  * device again owns the buffer.
  155.  */
  156. static inline void pci_dma_sync_single(struct pci_dev *hwdev,
  157.        dma_addr_t dma_handle,
  158.        size_t size, int direction)
  159. {
  160. if (direction == PCI_DMA_NONE)
  161.                 BUG();
  162. #ifdef CONFIG_SH_PCIDMA_NONCOHERENT
  163. dma_cache_wback_inv(bus_to_virt(dma_handle), size);
  164. #endif
  165. }
  166. /* Make physical memory consistent for a set of streaming
  167.  * mode DMA translations after a transfer.
  168.  *
  169.  * The same as pci_dma_sync_single but for a scatter-gather list,
  170.  * same rules and usage.
  171.  */
  172. static inline void pci_dma_sync_sg(struct pci_dev *hwdev,
  173.    struct scatterlist *sg,
  174.    int nelems, int direction)
  175. {
  176. if (direction == PCI_DMA_NONE)
  177.                 BUG();
  178. #ifdef CONFIG_SH_PCIDMA_NONCOHERENT
  179. int i;
  180. for (i=0; i<nelems; i++)
  181. dma_cache_wback_inv(sg[i].address, sg[i].length);
  182. #endif
  183. }
  184. /* Return whether the given PCI device DMA address mask can
  185.  * be supported properly.  For example, if your device can
  186.  * only drive the low 24-bits during PCI bus mastering, then
  187.  * you would pass 0x00ffffff as the mask to this function.
  188.  */
  189. static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
  190. {
  191. return 1;
  192. }
  193. /* Not supporting more than 32-bit PCI bus addresses now, but
  194.  * must satisfy references to this function.  Change if needed.
  195.  */
  196. #define pci_dac_dma_supported(pci_dev, mask) (0)
  197. /* Return the index of the PCI controller for device PDEV. */
  198. #define pci_controller_num(PDEV) (0)
  199. /* These macros should be used after a pci_map_sg call has been done
  200.  * to get bus addresses of each of the SG entries and their lengths.
  201.  * You should only work with the number of sg entries pci_map_sg
  202.  * returns, or alternatively stop on the first sg_dma_len(sg) which
  203.  * is 0.
  204.  */
  205. #define sg_dma_address(sg) (virt_to_bus((sg)->address))
  206. #define sg_dma_len(sg) ((sg)->length)
  207. #endif /* __KERNEL__ */
  208. #endif /* __ASM_SH_PCI_H */