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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 2000 Silicon Graphics, Inc.
  7.  * Copyright (C) 2000 by Leo Dagum
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/types.h>
  11. #include <linux/mm.h>
  12. #include <linux/string.h>
  13. #include <linux/pci.h>
  14. #include <linux/slab.h>
  15. #include <linux/devfs_fs_kernel.h>
  16. #ifndef LANGUAGE_C 
  17. #define LANGUAGE_C 99
  18. #endif
  19. #ifndef _LANGUAGE_C
  20. #define _LANGUAGE_C 99
  21. #endif
  22. #include <asm/io.h>
  23. #include <asm/sn/sgi.h>
  24. #include <asm/sn/invent.h>
  25. #include <asm/sn/hcl.h>
  26. #include <asm/sn/pci/pcibr.h>
  27. #include <asm/sn/pci/pcibr_private.h>
  28. #include <asm/sn/iobus.h>
  29. #include <asm/sn/types.h>
  30. #include <asm/sn/alenlist.h>
  31. #include <asm/sn/pci/pci_bus_cvlink.h>
  32. /*
  33.  * this is REALLY ugly, blame it on gcc's lame inlining that we
  34.  * have to put procedures in header files
  35.  */
  36. #if LANGUAGE_C == 99
  37. #undef LANGUAGE_C
  38. #endif
  39. #if CONFIG_IA64_SGI_IO == 99
  40. #undef CONFIG_IA64_SGI_IO
  41. #endif
  42. pciio_dmamap_t get_free_pciio_dmamap(devfs_handle_t);
  43. struct sn1_dma_maps_s *find_sn1_dma_map(dma_addr_t, unsigned char);
  44. extern devfs_handle_t busnum_to_pcibr_vhdl[];
  45. extern nasid_t busnum_to_nid[];
  46. extern void * busnum_to_atedmamaps[];
  47. /*
  48.  * Get a free pciio_dmamap_t entry.
  49.  */
  50. pciio_dmamap_t
  51. get_free_pciio_dmamap(devfs_handle_t pci_bus)
  52. {
  53. int i;
  54. struct sn1_dma_maps_s *sn1_dma_map = NULL;
  55. /*
  56.  * Darn, we need to get the maps allocated for this bus.
  57.  */
  58. for (i=0; i<512; i++) {
  59. if (busnum_to_pcibr_vhdl[i] == pci_bus) {
  60. sn1_dma_map = busnum_to_atedmamaps[i];
  61. }
  62. }
  63. /*
  64.  * Now get a free dmamap entry from this list.
  65.  */
  66. for (i=0; i<512; i++, sn1_dma_map++) {
  67. if (!sn1_dma_map->dma_addr) {
  68. sn1_dma_map->dma_addr = -1;
  69. return( (pciio_dmamap_t) sn1_dma_map );
  70. }
  71. }
  72. printk("get_pciio_dmamap: Unable to find a free dmamapn");
  73. return(NULL);
  74. }
  75. struct sn1_dma_maps_s *
  76. find_sn1_dma_map(dma_addr_t dma_addr, unsigned char busnum)
  77. {
  78. struct sn1_dma_maps_s *sn1_dma_map = NULL;
  79. int i;
  80. sn1_dma_map = busnum_to_atedmamaps[busnum];
  81. for (i=0; i<512; i++, sn1_dma_map++) {
  82. if (sn1_dma_map->dma_addr == dma_addr) {
  83. return( sn1_dma_map );
  84. }
  85. }
  86. printk("find_pciio_dmamap: Unable find the corresponding dma mapn");
  87. return(NULL);
  88. }
  89. /*
  90.  * sn1 platform specific pci_alloc_consistent()
  91.  *
  92.  * this interface is meant for "command" streams, i.e. called only
  93.  * once for initializing a device, so we don't want prefetching or
  94.  * write gathering turned on, hence the PCIIO_DMA_CMD flag
  95.  */
  96. void *
  97. sn1_pci_alloc_consistent (struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)
  98. {
  99.         void *ret;
  100.         int gfp = GFP_ATOMIC;
  101. devfs_handle_t    vhdl;
  102. struct sn1_device_sysdata *device_sysdata;
  103. paddr_t temp_ptr;
  104. *dma_handle = (dma_addr_t) NULL;
  105. /*
  106.  * get vertex for the device
  107.  */
  108. device_sysdata = (struct sn1_device_sysdata *) hwdev->sysdata;
  109. vhdl = device_sysdata->vhdl;
  110.         if ( (ret = (void *)__get_free_pages(gfp, get_order(size))) ) {
  111. memset(ret, 0, size);
  112. } else {
  113. return(NULL);
  114. }
  115. temp_ptr = (paddr_t) __pa(ret);
  116. if (IS_PCIA64(hwdev)) {
  117. /*
  118.  * This device supports 64bits DMA addresses.
  119.  */
  120. *dma_handle = pciio_dmatrans_addr(vhdl, NULL, temp_ptr, size,
  121. PCIBR_BARRIER | PCIIO_BYTE_STREAM | PCIIO_DMA_CMD
  122. | PCIIO_DMA_A64 );
  123. return (ret);
  124. }
  125. /*
  126.  * Devices that supports 32 Bits upto 63 Bits DMA Address gets
  127.  * 32 Bits DMA addresses.
  128.  *
  129.  * First try to get 32 Bit Direct Map Support.
  130.  */
  131. if (IS_PCI32G(hwdev)) {
  132. *dma_handle = pciio_dmatrans_addr(vhdl, NULL, temp_ptr, size,
  133. PCIBR_BARRIER | PCIIO_BYTE_STREAM | PCIIO_DMA_CMD);
  134. if (dma_handle) {
  135. return (ret);
  136. } else {
  137. /*
  138.  * We need to map this request by using ATEs.
  139.  */
  140. printk("sn1_pci_alloc_consistent: 32Bits DMA Page Map support not available yet!");
  141. BUG();
  142. }
  143. }
  144. if (IS_PCI32L(hwdev)) {
  145. /*
  146.  * SNIA64 cannot support DMA Addresses smaller than 32 bits.
  147.  */
  148. return (NULL);
  149. }
  150.         return NULL;
  151. }
  152. void
  153. sn1_pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
  154. {
  155. free_pages((unsigned long) vaddr, get_order(size));
  156. }
  157. /*
  158.  * On sn1 we use the orig_address entry of the scatterlist to store
  159.  * the physical address corresponding to the given virtual address
  160.  */
  161. int
  162. sn1_pci_map_sg (struct pci_dev *hwdev,
  163.                         struct scatterlist *sg, int nents, int direction)
  164. {
  165. int i;
  166. devfs_handle_t vhdl;
  167. dma_addr_t dma_addr;
  168. paddr_t temp_ptr;
  169. struct sn1_device_sysdata *device_sysdata;
  170. pciio_dmamap_t dma_map;
  171. if (direction == PCI_DMA_NONE)
  172. BUG();
  173. /*
  174.  * Handle 64 bit cards.
  175.  */
  176. device_sysdata = (struct sn1_device_sysdata *) hwdev->sysdata;
  177. vhdl = device_sysdata->vhdl;
  178. for (i = 0; i < nents; i++, sg++) {
  179. sg->orig_address = (char *)NULL;
  180. dma_addr = 0;
  181. temp_ptr = (paddr_t) __pa(sg->address);
  182. /*
  183.  * Handle the most common case 64Bit cards.
  184.  */
  185. if (IS_PCIA64(hwdev)) {
  186. dma_addr = (dma_addr_t) pciio_dmatrans_addr(vhdl, NULL,
  187. temp_ptr, sg->length,
  188. PCIBR_BARRIER | PCIIO_BYTE_STREAM |
  189. PCIIO_DMA_CMD | PCIIO_DMA_A64 );
  190. sg->address = (char *)dma_addr;
  191. continue;
  192. }
  193. /*
  194.  * Handle 32Bits and greater cards.
  195.  */
  196. if (IS_PCI32G(hwdev)) {
  197. dma_addr = (dma_addr_t) pciio_dmatrans_addr(vhdl, NULL,
  198. temp_ptr, sg->length,
  199. PCIBR_BARRIER | PCIIO_BYTE_STREAM |
  200. PCIIO_DMA_CMD);
  201. if (dma_addr) {
  202. sg->address = (char *)dma_addr;
  203. continue;
  204. }
  205. }
  206. /*
  207.  * It is a 32bit card and we cannot do Direct mapping.
  208.  * Let's 32Bit Page map the request.
  209.  */
  210. dma_map = NULL;
  211. dma_map = pciio_dmamap_alloc(vhdl, NULL, sg->length, 
  212. PCIBR_BARRIER | PCIIO_BYTE_STREAM |
  213. PCIIO_DMA_CMD);
  214. if (!dma_map) {
  215. printk("pci_map_sg: Unable to allocate anymore 32Bits Page Map entries.n");
  216. BUG();
  217. }
  218. dma_addr = (dma_addr_t)pciio_dmamap_addr(dma_map, temp_ptr, sg->length);
  219. /* printk("pci_map_sg: dma_map 0x%p Phys Addr 0x%p dma_addr 0x%pn", dma_map, temp_ptr, dma_addr); */
  220. sg->address = (char *)dma_addr;
  221. sg->orig_address = (char *)dma_map;
  222. }
  223. return nents;
  224. }
  225. /*
  226.  * Unmap a set of streaming mode DMA translations.
  227.  * Again, cpu read rules concerning calls here are the same as for
  228.  * pci_unmap_single() above.
  229.  */
  230. void
  231. sn1_pci_unmap_sg (struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction)
  232. {
  233. int i;
  234. struct sn1_dma_maps_s *sn1_dma_map;
  235. if (direction == PCI_DMA_NONE)
  236. BUG();
  237. for (i = 0; i < nelems; i++, sg++)
  238. if (sg->orig_address) {
  239. /*
  240.  * We maintain the DMA Map pointer in sg->orig_address if 
  241.  * it is ever allocated.
  242.  */
  243. /* phys_to_virt((dma_addr_t)sg->address | ~0x80000000); */
  244. /* sg->address = sg->orig_address; */
  245. sg->address = (char *)-1;
  246. sn1_dma_map = (struct sn1_dma_maps_s *)sg->orig_address;
  247. pciio_dmamap_done((pciio_dmamap_t)sn1_dma_map);
  248. pciio_dmamap_free((pciio_dmamap_t)sn1_dma_map);
  249. sn1_dma_map->dma_addr = 0;
  250. sg->orig_address = 0;
  251. }
  252. }
  253. /*
  254.  * We map this to the one step pciio_dmamap_trans interface rather than
  255.  * the two step pciio_dmamap_alloc/pciio_dmamap_addr because we have
  256.  * no way of saving the dmamap handle from the alloc to later free
  257.  * (which is pretty much unacceptable).
  258.  *
  259.  * TODO: simplify our interface;
  260.  *       get rid of dev_desc and vhdl (seems redundant given a pci_dev);
  261.  *       figure out how to save dmamap handle so can use two step.
  262.  */
  263. dma_addr_t sn1_pci_map_single (struct pci_dev *hwdev,
  264. void *ptr, size_t size, int direction)
  265. {
  266. devfs_handle_t vhdl;
  267. dma_addr_t dma_addr;
  268. paddr_t temp_ptr;
  269. struct sn1_device_sysdata *device_sysdata;
  270. pciio_dmamap_t dma_map = NULL;
  271. struct sn1_dma_maps_s *sn1_dma_map;
  272. if (direction == PCI_DMA_NONE)
  273. BUG();
  274. /*
  275.  * find vertex for the device
  276.  */
  277. device_sysdata = (struct sn1_device_sysdata *)hwdev->sysdata;
  278. vhdl = device_sysdata->vhdl;
  279. /*
  280.  * Call our dmamap interface
  281.  */
  282. dma_addr = 0;
  283. temp_ptr = (paddr_t) __pa(ptr);
  284. if (IS_PCIA64(hwdev)) {
  285. /*
  286.  * This device supports 64bits DMA addresses.
  287.  */
  288. dma_addr = (dma_addr_t) pciio_dmatrans_addr(vhdl, NULL,
  289. temp_ptr, size,
  290. PCIBR_BARRIER | PCIIO_BYTE_STREAM | PCIIO_DMA_CMD
  291. | PCIIO_DMA_A64 );
  292. return (dma_addr);
  293. }
  294. /*
  295.  * Devices that supports 32 Bits upto 63 Bits DMA Address gets
  296.  * 32 Bits DMA addresses.
  297.  *
  298.  * First try to get 32 Bit Direct Map Support.
  299.  */
  300. if (IS_PCI32G(hwdev)) {
  301. dma_addr = (dma_addr_t) pciio_dmatrans_addr(vhdl, NULL,
  302. temp_ptr, size,
  303. PCIBR_BARRIER | PCIIO_BYTE_STREAM | PCIIO_DMA_CMD);
  304. if (dma_addr) {
  305. return (dma_addr);
  306. }
  307. }
  308. if (IS_PCI32L(hwdev)) {
  309. /*
  310.  * SNIA64 cannot support DMA Addresses smaller than 32 bits.
  311.  */
  312. return ((dma_addr_t) NULL);
  313.         }
  314. /*
  315.  * It is a 32bit card and we cannot do Direct mapping.
  316.  * Let's 32Bit Page map the request.
  317.  */
  318. dma_map = NULL;
  319. dma_map = pciio_dmamap_alloc(vhdl, NULL, size, PCIBR_BARRIER | 
  320. PCIIO_BYTE_STREAM | PCIIO_DMA_CMD);
  321. if (!dma_map) {
  322. printk("pci_map_single: Unable to allocate anymore 32Bits Page Map entries.n");
  323. BUG();
  324. }
  325. dma_addr = (dma_addr_t) pciio_dmamap_addr(dma_map, temp_ptr, size);
  326. /* printk("pci_map_single: dma_map 0x%p Phys Addr 0x%p dma_addr 0x%pn", dma_map, 
  327. temp_ptr, dma_addr); */
  328. sn1_dma_map = (struct sn1_dma_maps_s *)dma_map;
  329. sn1_dma_map->dma_addr = dma_addr;
  330. return ((dma_addr_t)dma_addr);
  331. }
  332. void
  333. sn1_pci_unmap_single (struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction)
  334. {
  335. struct sn1_dma_maps_s *sn1_dma_map = NULL;
  336.         if (direction == PCI_DMA_NONE)
  337. BUG();
  338. /*
  339.  * Get the sn1_dma_map entry.
  340.  */
  341. if (IS_PCI32_MAPPED(dma_addr))
  342. sn1_dma_map = find_sn1_dma_map(dma_addr, hwdev->bus->number);
  343. if (sn1_dma_map) {
  344. pciio_dmamap_done((pciio_dmamap_t)sn1_dma_map);
  345. pciio_dmamap_free((pciio_dmamap_t)sn1_dma_map);
  346. sn1_dma_map->dma_addr = (dma_addr_t)NULL;
  347. }
  348. }
  349. void
  350. sn1_pci_dma_sync_single (struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction)
  351. {
  352.         if (direction == PCI_DMA_NONE)
  353.                 BUG();
  354.         /* Nothing to do */
  355. }
  356. void
  357. sn1_pci_dma_sync_sg (struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction)
  358. {
  359.         if (direction == PCI_DMA_NONE)
  360.                 BUG();
  361.         /* Nothing to do */
  362. }
  363. unsigned long
  364. sn1_dma_address (struct scatterlist *sg)
  365. {
  366. return ((unsigned long)sg->address);
  367. }