]> git.pld-linux.org Git - packages/X11-driver-nvidia-legacy.git/blob - NVIDIA_kernel-1.0-7174-1258475.diff
- updated for 7182
[packages/X11-driver-nvidia-legacy.git] / NVIDIA_kernel-1.0-7174-1258475.diff
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  }
This page took 0.028622 seconds and 3 git commands to generate.