]>
Commit | Line | Data |
---|---|---|
de9630f1 | 1 | diff -ru usr/src/nv/nv-linux.h usr/src/nv.1258475/nv-linux.h |
2 | --- usr/src/nv/nv-linux.h 2005-03-22 16:19:09.000000000 +0100 | |
3 | +++ usr/src/nv.1258475/nv-linux.h 2005-05-05 19:06:45.237118320 +0200 | |
4 | @@ -200,7 +200,6 @@ | |
5 | */ | |
6 | #if defined(CONFIG_SWIOTLB) | |
7 | #define NV_SWIOTLB 1 | |
8 | -#define NV_SWIOTLB_MAX_RETRIES 16 | |
9 | extern int nv_swiotlb; | |
10 | #endif | |
11 | ||
12 | @@ -1053,6 +1052,31 @@ | |
13 | } | |
14 | ||
15 | #if defined(NV_SG_MAP_BUFFERS) | |
16 | + | |
17 | +static inline int nv_map_sg(struct pci_dev *dev, struct scatterlist *sg) | |
18 | + { | |
19 | + int ret; | |
20 | +#if defined(KERNEL_2_6) && defined(CONFIG_SWIOTLB) | |
21 | + if (swiotlb) | |
22 | + ret = swiotlb_map_sg(&dev->dev, sg, 1, PCI_DMA_BIDIRECTIONAL); | |
23 | + else | |
24 | +#endif | |
25 | + ret = pci_map_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL); | |
26 | + return ret; | |
27 | + } | |
28 | + | |
29 | +static inline void nv_unmap_sg(struct pci_dev *dev, struct scatterlist *sg) | |
30 | + { | |
31 | +#if defined(KERNEL_2_6) && defined(CONFIG_SWIOTLB) | |
32 | + if (swiotlb) | |
33 | + swiotlb_unmap_sg(&dev->dev, sg, 1, PCI_DMA_BIDIRECTIONAL); | |
34 | + else | |
35 | +#endif | |
36 | + pci_unmap_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL); | |
37 | + } | |
38 | + | |
39 | +#define NV_MAP_SG_MAX_RETRIES 16 | |
40 | + | |
41 | static inline int nv_sg_map_buffer( | |
42 | struct pci_dev *dev, | |
43 | nv_pte_t **page_list, | |
44 | @@ -1067,50 +1091,42 @@ | |
45 | sg_ptr->offset = (unsigned long)base & ~PAGE_MASK; | |
46 | sg_ptr->length = num_pages * PAGE_SIZE; | |
47 | ||
48 | -#if defined(NV_SWIOTLB) | |
49 | - i = NV_SWIOTLB_MAX_RETRIES; | |
50 | + i = NV_MAP_SG_MAX_RETRIES; | |
51 | do { | |
52 | - if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0) | |
53 | + if (nv_map_sg(dev, sg_ptr) == 0) | |
54 | return 1; | |
55 | ||
56 | if (sg_ptr->dma_address & ~PAGE_MASK) | |
57 | { | |
58 | struct scatterlist sg_tmp; | |
59 | - pci_unmap_sg(dev, sg_ptr, num_pages, PCI_DMA_BIDIRECTIONAL); | |
60 | + nv_unmap_sg(dev, sg_ptr); | |
61 | ||
62 | memset(&sg_tmp, 0, sizeof(struct scatterlist)); | |
63 | sg_tmp.page = sg_ptr->page; | |
64 | sg_tmp.offset = sg_ptr->offset; | |
65 | sg_tmp.length = 2048; | |
66 | ||
67 | - if (pci_map_sg(dev, &sg_tmp, 1, PCI_DMA_BIDIRECTIONAL) == 0) | |
68 | + if (nv_map_sg(dev, &sg_tmp) == 0) | |
69 | return 1; | |
70 | ||
71 | - if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0) | |
72 | + if (nv_map_sg(dev, sg_ptr) == 0) | |
73 | { | |
74 | - pci_unmap_sg(dev, &sg_tmp, num_pages, PCI_DMA_BIDIRECTIONAL); | |
75 | + nv_unmap_sg(dev, &sg_tmp); | |
76 | return 1; | |
77 | } | |
78 | ||
79 | - pci_unmap_sg(dev, &sg_tmp, num_pages, PCI_DMA_BIDIRECTIONAL); | |
80 | + nv_unmap_sg(dev, &sg_tmp); | |
81 | } | |
82 | } while (i-- && sg_ptr->dma_address & ~PAGE_MASK); | |
83 | -#else | |
84 | - if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0) | |
85 | - { | |
86 | - return 1; | |
87 | - } | |
88 | -#endif | |
89 | ||
90 | if (sg_ptr->dma_address & ~PAGE_MASK) | |
91 | { | |
92 | nv_printf(NV_DBG_ERRORS, | |
93 | "NVRM: VM: nv_sg_map_buffer: failed to obtain aligned mapping\n"); | |
94 | - pci_unmap_sg(dev, sg_ptr, num_pages, PCI_DMA_BIDIRECTIONAL); | |
95 | + nv_unmap_sg(dev, sg_ptr); | |
96 | return 1; | |
97 | } | |
98 | ||
99 | - NV_FIXUP_SWIOTLB_VIRT_ADDR_BUG(sg_ptr->dma_address); | |
100 | ||
101 | // this is a bit of a hack to make contiguous allocations easier to handle | |
102 | // nv_sg_load below relies on the page_ptr addresses being filed in, as | |
103 | @@ -1139,6 +1155,9 @@ | |
104 | // wire in the new page's addresses, but save the original off to free later | |
105 | if (nv_swiotlb) | |
106 | { | |
107 | + // note that we modify our local version, not the sg_ptr version that | |
108 | + // will be returned to the swiotlb pool | |
109 | + NV_FIXUP_SWIOTLB_VIRT_ADDR_BUG(page_ptr->dma_addr); | |
110 | page_ptr->orig_phys_addr = page_ptr->phys_addr; | |
111 | page_ptr->phys_addr = page_ptr->dma_addr; | |
112 | page_ptr->orig_virt_addr = page_ptr->virt_addr; | |
113 | @@ -1171,7 +1190,7 @@ | |
114 | ||
115 | if (page_ptr->dma_addr != page_ptr->phys_addr) | |
116 | { | |
117 | - pci_unmap_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL); | |
118 | + nv_unmap_sg(dev, sg_ptr); | |
119 | page_ptr->dma_addr = 0; | |
120 | } | |
121 | } |