]> git.pld-linux.org Git - packages/X11-driver-nvidia-legacy.git/commitdiff
- patch that addresses an X startup problem on Linux/x86-64 em64t systems
authorhawk <hawk@pld-linux.org>
Fri, 3 Mar 2006 17:16:34 +0000 (17:16 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
  with 4GB of RAM

Changed files:
    NVIDIA_kernel-1.0-7174-1258475.diff -> 1.1

NVIDIA_kernel-1.0-7174-1258475.diff [new file with mode: 0644]

diff --git a/NVIDIA_kernel-1.0-7174-1258475.diff b/NVIDIA_kernel-1.0-7174-1258475.diff
new file mode 100644 (file)
index 0000000..a646809
--- /dev/null
@@ -0,0 +1,121 @@
+diff -ru usr/src/nv/nv-linux.h usr/src/nv.1258475/nv-linux.h
+--- usr/src/nv/nv-linux.h      2005-03-22 16:19:09.000000000 +0100
++++ usr/src/nv.1258475/nv-linux.h      2005-05-05 19:06:45.237118320 +0200
+@@ -200,7 +200,6 @@
+  */
+ #if defined(CONFIG_SWIOTLB)
+ #define NV_SWIOTLB 1
+-#define NV_SWIOTLB_MAX_RETRIES 16
+ extern int nv_swiotlb;
+ #endif
+@@ -1053,6 +1052,31 @@
+     }
+ #if defined(NV_SG_MAP_BUFFERS)
++
++static inline int nv_map_sg(struct pci_dev *dev, struct scatterlist *sg)
++    {
++        int ret;
++#if defined(KERNEL_2_6) && defined(CONFIG_SWIOTLB)
++        if (swiotlb)
++            ret = swiotlb_map_sg(&dev->dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++        else
++#endif
++            ret = pci_map_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++        return ret;
++    }
++
++static inline void nv_unmap_sg(struct pci_dev *dev, struct scatterlist *sg)
++    {
++#if defined(KERNEL_2_6) && defined(CONFIG_SWIOTLB)
++        if (swiotlb)
++            swiotlb_unmap_sg(&dev->dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++        else
++#endif
++            pci_unmap_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++    }
++
++#define NV_MAP_SG_MAX_RETRIES 16
++
+ static inline int nv_sg_map_buffer(
+     struct pci_dev     *dev,
+     nv_pte_t          **page_list,
+@@ -1067,50 +1091,42 @@
+     sg_ptr->offset = (unsigned long)base & ~PAGE_MASK;
+     sg_ptr->length  = num_pages * PAGE_SIZE;
+-#if defined(NV_SWIOTLB)
+-    i = NV_SWIOTLB_MAX_RETRIES;
++    i = NV_MAP_SG_MAX_RETRIES;
+     do {
+-        if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0)
++        if (nv_map_sg(dev, sg_ptr) == 0)
+             return 1;
+         if (sg_ptr->dma_address & ~PAGE_MASK)
+         {
+             struct scatterlist sg_tmp;
+-            pci_unmap_sg(dev, sg_ptr, num_pages, PCI_DMA_BIDIRECTIONAL);
++            nv_unmap_sg(dev, sg_ptr);
+             memset(&sg_tmp, 0, sizeof(struct scatterlist));
+             sg_tmp.page = sg_ptr->page;
+             sg_tmp.offset = sg_ptr->offset;
+             sg_tmp.length = 2048;
+-            if (pci_map_sg(dev, &sg_tmp, 1, PCI_DMA_BIDIRECTIONAL) == 0)
++            if (nv_map_sg(dev, &sg_tmp) == 0)
+                 return 1;
+-            if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0)
++            if (nv_map_sg(dev, sg_ptr) == 0)
+             {
+-                pci_unmap_sg(dev, &sg_tmp, num_pages, PCI_DMA_BIDIRECTIONAL);
++                nv_unmap_sg(dev, &sg_tmp);
+                 return 1;
+             }
+-            pci_unmap_sg(dev, &sg_tmp, num_pages, PCI_DMA_BIDIRECTIONAL);
++            nv_unmap_sg(dev, &sg_tmp);
+         }
+     } while (i-- && sg_ptr->dma_address & ~PAGE_MASK);
+-#else
+-    if (pci_map_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL) == 0)
+-    {
+-        return 1;
+-    }
+-#endif
+     if (sg_ptr->dma_address & ~PAGE_MASK)
+     {
+         nv_printf(NV_DBG_ERRORS,
+             "NVRM: VM: nv_sg_map_buffer: failed to obtain aligned mapping\n");
+-        pci_unmap_sg(dev, sg_ptr, num_pages, PCI_DMA_BIDIRECTIONAL);
++        nv_unmap_sg(dev, sg_ptr);
+         return 1;
+     }
+-    NV_FIXUP_SWIOTLB_VIRT_ADDR_BUG(sg_ptr->dma_address);
+     // this is a bit of a hack to make contiguous allocations easier to handle
+     // nv_sg_load below relies on the page_ptr addresses being filed in, as 
+@@ -1139,6 +1155,9 @@
+     // wire in the new page's addresses, but save the original off to free later
+     if (nv_swiotlb)
+     {
++        // note that we modify our local version, not the sg_ptr version that
++        // will be returned to the swiotlb pool
++        NV_FIXUP_SWIOTLB_VIRT_ADDR_BUG(page_ptr->dma_addr);
+         page_ptr->orig_phys_addr = page_ptr->phys_addr;
+         page_ptr->phys_addr      = page_ptr->dma_addr;
+         page_ptr->orig_virt_addr = page_ptr->virt_addr;
+@@ -1171,7 +1190,7 @@
+     if (page_ptr->dma_addr != page_ptr->phys_addr)
+     {
+-        pci_unmap_sg(dev, sg_ptr, 1, PCI_DMA_BIDIRECTIONAL);
++        nv_unmap_sg(dev, sg_ptr);
+         page_ptr->dma_addr = 0;
+     }
+ }
This page took 0.046375 seconds and 4 git commands to generate.