[pkg-nvidia-devel] r422 - in /packages/nvidia-graphics-drivers-legacy-96xx/trunk: debian.binary/changelog patches/ patches/NVIDIA_kernel-96.43.05-2290218.diff patches/xen.96.43.05.diff

rdonald at users.alioth.debian.org rdonald at users.alioth.debian.org
Tue Jul 8 23:42:09 UTC 2008


Author: rdonald
Date: Tue Jul  8 23:42:08 2008
New Revision: 422

URL: http://svn.debian.org/wsvn/pkg-nvidia/?sc=1&rev=422
Log:
add patches

Added:
    packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/
    packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/NVIDIA_kernel-96.43.05-2290218.diff
    packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/xen.96.43.05.diff
Modified:
    packages/nvidia-graphics-drivers-legacy-96xx/trunk/debian.binary/changelog

Modified: packages/nvidia-graphics-drivers-legacy-96xx/trunk/debian.binary/changelog
URL: http://svn.debian.org/wsvn/pkg-nvidia/packages/nvidia-graphics-drivers-legacy-96xx/trunk/debian.binary/changelog?rev=422&op=diff
==============================================================================
--- packages/nvidia-graphics-drivers-legacy-96xx/trunk/debian.binary/changelog (original)
+++ packages/nvidia-graphics-drivers-legacy-96xx/trunk/debian.binary/changelog Tue Jul  8 23:42:08 2008
@@ -1,3 +1,17 @@
+nvidia-kernel-legacy-96xx (96.43.05-1) unstable; urgency=low
+
+  * New upstream (closes: #473114)
+  * added uploaders (closes: #472443) 
+  * removed xserver-xorg-core depend.
+
+ -- Randall Donald <rdonald at debian.org>  Fri, 28 Mar 2008 13:40:25 -0700
+
+nvidia-kernel-legacy-96xx (96.43.01-2) unstable; urgency=low
+
+  * Fix typo in Depends in control.in
+
+ -- Randall Donald <rdonald at debian.org>  Fri, 05 Oct 2007 11:52:34 -0700
+
 nvidia-kernel-legacy-96xx (96.43.01-1) unstable; urgency=low
 
   * New upstream

Added: packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/NVIDIA_kernel-96.43.05-2290218.diff
URL: http://svn.debian.org/wsvn/pkg-nvidia/packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/NVIDIA_kernel-96.43.05-2290218.diff?rev=422&op=file
==============================================================================
--- packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/NVIDIA_kernel-96.43.05-2290218.diff (added)
+++ packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/NVIDIA_kernel-96.43.05-2290218.diff Tue Jul  8 23:42:08 2008
@@ -1,0 +1,619 @@
+diff -ru usr/src/nv/Makefile.kbuild usr/src/nv.2290218/Makefile.kbuild
+--- usr/src/nv/Makefile.kbuild	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/Makefile.kbuild	2008-03-18 13:15:30.394522179 -0700
+@@ -177,6 +177,7 @@
+ 	vmap \
+ 	signal_struct \
+ 	agp_backend_acquire \
++	set_pages_uc \
+ 	change_page_attr \
+ 	pci_get_class \
+ 	sysctl_max_map_count \
+diff -ru usr/src/nv/conftest.sh usr/src/nv.2290218/conftest.sh
+--- usr/src/nv/conftest.sh	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/conftest.sh	2008-03-18 13:15:32.710654166 -0700
+@@ -100,6 +100,32 @@
+             fi
+         ;;
+ 
++        set_pages_uc)
++            #
++            # Determine if the set_pages_uc() function is present.
++            #
++            echo "#include <linux/autoconf.h>
++            #include <asm/cacheflush.h>
++            void conftest_set_pages_uc(void) {
++                set_pages_uc();
++            }" > conftest$$.c
++
++            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
++            rm -f conftest$$.c
++
++            if [ -f conftest$$.o ]; then
++                rm -f conftest$$.o
++                echo "#undef NV_SET_PAGES_UC_PRESENT" >> conftest.h
++                return
++            else
++                echo "#ifdef NV_CHANGE_PAGE_ATTR_PRESENT" >> conftest.h
++                echo "#undef NV_CHANGE_PAGE_ATTR_PRESENT" >> conftest.h
++                echo "#endif"                             >> conftest.h
++                echo "#define NV_SET_PAGES_UC_PRESENT"    >> conftest.h
++                return
++            fi
++        ;;
++
+         change_page_attr)
+             #
+             # Determine if the change_page_attr() function is
+@@ -124,7 +150,9 @@
+                 rm -f conftest$$.o
+                 return
+             else
++                echo "#ifndef NV_SET_PAGES_UC_PRESENT"     >> conftest.h
+                 echo "#define NV_CHANGE_PAGE_ATTR_PRESENT" >> conftest.h
++                echo "#endif"                              >> conftest.h
+                 return
+             fi
+         ;;
+@@ -501,6 +529,8 @@
+                 return
+             fi
+ 
++            rm -f conftest$$.o
++
+             echo "#include <linux/autoconf.h>
+             #include <linux/interrupt.h>
+             irq_handler_t conftest_isr;
+diff -ru usr/src/nv/nv-linux.h usr/src/nv.2290218/nv-linux.h
+--- usr/src/nv/nv-linux.h	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/nv-linux.h	2008-03-18 13:15:26.674310174 -0700
+@@ -808,9 +808,10 @@
+ 
+ #define NV_PGD_OFFSET(address, kernel, mm)              \
+    ({                                                   \
++        struct mm_struct *__mm = (mm);                  \
+         pgd_t *__pgd;                                   \
+         if (!kernel)                                    \
+-            __pgd = pgd_offset(mm, address);            \
++            __pgd = pgd_offset(__mm, address);          \
+         else                                            \
+             __pgd = pgd_offset_k(address);              \
+         __pgd;                                          \
+@@ -1097,21 +1098,24 @@
+ #define NV_ATOMIC_DEC_AND_TEST(data)    atomic_dec_and_test(&(data))
+ #define NV_ATOMIC_READ(data)            atomic_read(&(data))
+ 
++extern int nv_update_memory_types;
++
+ /*
+- * a BUG() is triggered on early 2.6 x86_64 kernels. the underlying
+- * problem actually exists on many architectures and kernels, but
+- * these are the only kernels that check the condition and trigger
+- * a BUG(). note that this is a problem of the core kernel, not an
+- * nvidia bug (and can still be triggered by agpgart). let's avoid
+- * change_page_attr on those kernels.
++ * Using change_page_attr() on early Linux/x86-64 2.6 kernels may
++ * result in a BUG() being triggered. The underlying problem
++ * actually exists on multiple architectures and kernels, but only
++ * the above check for the condition and trigger a BUG().
++ *
++ * Note that this is a due to a bug in the Linux kernel, not an
++ * NVIDIA driver bug (it can also be triggered by AGPGART).
++ *
++ * We therefore need to determine at runtime if change_page_attr()
++ * can be used safely on these kernels.
+  */
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-extern int nv_use_cpa;
+-
+-#if defined(NVCPU_X86_64) && !defined(KERNEL_2_4) && \
+-         (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11))
+-#define NV_CHANGE_PAGE_ATTR_BUG_PRESENT 1
+-#endif
++#if defined(NV_CHANGE_PAGE_ATTR_PRESENT) && defined(NVCPU_X86_64) && \
++  !defined(KERNEL_2_4) && \
++  (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11))
++#define NV_CHANGE_PAGE_ATTR_BUG_PRESENT
+ #endif
+ 
+ #if defined(NVCPU_X86) || defined(NVCPU_X86_64)
+@@ -1123,7 +1127,7 @@
+  *
+  * We need to be careful to mask out _PAGE_NX when the host system
+  * doesn't support this feature or when it's disabled: the kernel
+- * may not do this in its implementation of the  change_page_attr()
++ * may not do this in its implementation of the change_page_attr()
+  * interface.
+  */
+ #ifndef X86_FEATURE_NX
+diff -ru usr/src/nv/nv-vm.c usr/src/nv.2290218/nv-vm.c
+--- usr/src/nv/nv-vm.c	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/nv-vm.c	2008-03-18 13:15:34.806773619 -0700
+@@ -43,42 +43,40 @@
+ }
+ #endif
+ 
+-/*
+- * AMD Athlon processors expose a subtle bug in the Linux
+- * kernel, that may lead to AGP memory corruption. Recent
+- * kernel versions had a workaround for this problem, but
+- * 2.4.20 is the first kernel to address it properly. The
+- * page_attr API provides the means to solve the problem. 
+- */
+-
+ static inline void nv_set_page_attrib_uncached(nv_pte_t *page_ptr)
+ {
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-    if (nv_use_cpa)
++    if (nv_update_memory_types)
+     {
+-        struct page *page = virt_to_page(__va(page_ptr->phys_addr));
++#if defined(NV_SET_PAGES_UC_PRESENT)
++        struct page *page = NV_GET_PAGE_STRUCT(page_ptr->phys_addr);
++        set_pages_uc(page, 1);
++#elif defined(NV_CHANGE_PAGE_ATTR_PRESENT)
++        struct page *page = NV_GET_PAGE_STRUCT(page_ptr->phys_addr);
+         pgprot_t prot = PAGE_KERNEL_NOCACHE;
+ #if defined(NVCPU_X86) || defined(NVCPU_X86_64)
+         pgprot_val(prot) &= __nv_supported_pte_mask;
+ #endif
+         change_page_attr(page, 1, prot);
+-    }
+ #endif
++    }
+ }
+ 
+ static inline void nv_set_page_attrib_cached(nv_pte_t *page_ptr)
+ {
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-    if (nv_use_cpa)
++    if (nv_update_memory_types)
+     {
+-        struct page *page = virt_to_page(__va(page_ptr->phys_addr));
++#if defined(NV_SET_PAGES_UC_PRESENT)
++        struct page *page = NV_GET_PAGE_STRUCT(page_ptr->phys_addr);
++        set_pages_wb(page, 1);
++#elif defined(NV_CHANGE_PAGE_ATTR_PRESENT)
++        struct page *page = NV_GET_PAGE_STRUCT(page_ptr->phys_addr);
+         pgprot_t prot = PAGE_KERNEL;
+ #if defined(NVCPU_X86) || defined(NVCPU_X86_64)
+         pgprot_val(prot) &= __nv_supported_pte_mask;
+ #endif
+         change_page_attr(page, 1, prot);
++#endif
+     }
+-#endif /* NV_CHANGE_PAGE_ATTR_PRESENT */
+ }
+ 
+ static inline void nv_lock_page(nv_pte_t *page_ptr)
+@@ -360,8 +358,11 @@
+ #if defined(NV_CPA_NEEDS_FLUSHING)
+     nv_execute_on_all_cpus(cache_flush, NULL);
+ #endif
++#if (defined(NVCPU_X86) || defined(NVCPU_X86_64)) && \
++  defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+     global_flush_tlb();
+ #endif
++#endif
+ }
+ 
+ /*
+@@ -656,7 +657,7 @@
+ 
+         address = (unsigned long)virt_addr + i * PAGE_SIZE; 
+ 
+-        pgd = NV_PGD_OFFSET(address, 1, &init_mm);
++        pgd = NV_PGD_OFFSET(address, 1, NULL);
+         if (!NV_PGD_PRESENT(pgd))
+             goto failed;
+ 
+diff -ru usr/src/nv/nv.c usr/src/nv.2290218/nv.c
+--- usr/src/nv/nv.c	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/nv.c	2008-03-18 13:15:35.950838813 -0700
+@@ -112,10 +112,7 @@
+ unsigned int nv_remap_limit;
+ #endif
+ 
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-int nv_use_cpa = 1;
+-#endif
+-
++int nv_update_memory_types = 1;
+ static int nv_mmconfig_failure_detected = 0;
+ 
+ static void *nv_pte_t_cache = NULL;
+@@ -919,30 +916,26 @@
+ #endif /* defined(NV_BUILD_NV_PAT_SUPPORT) */
+ }
+ 
+-
+ #if defined(NV_CHANGE_PAGE_ATTR_BUG_PRESENT)
+-
+-/* nv_verify_cpa_interface - determine if the change_page_attr bug is fixed
+- * in this kernel.
++/*
++ * nv_verify_cpa_interface() - determine if the change_page_attr() large page
++ * management accounting bug known to exist in early Linux/x86-64 kernels
++ * is present in this kernel.
+  *
+- * there's really not a good way to determine if change_page_attr is fixed.
+- * we can't really use cpa on 2.6 x86_64 kernels < 2.6.11, as if we run into
+- * the accounting bug, the kernel will throw a BUG. this isn't 100% accurate,
+- * as it doesn't throw a bug until we try to restore the caching attributes
+- * of the page. so if we can track down a 4M allocation, we can mark it
+- * uncached and see if the accounting was done correctly.
+- * 
+- * this is a little ugly, but the most accurate approach to determining if
+- * this kernel is good.
++ * There's really no good way to determine if change_page_attr() is working
++ * correctly. We can't reliably use change_page_attr() on Linux/x86-64 2.6
++ * kernels < 2.6.11: if we run into the accounting bug, the Linux kernel will
++ * trigger a BUG() if we attempt to restore the WB memory type of a page
++ * originally part of a large page.
+  *
+- * why do we even bother? some distributions have back-ported the cpa fix to
+- * kernels < 2.6.11. we want to use change_page_attr to avoid random corruption
+- * and hangs, but need to make sure it's safe to do so.
++ * So if we can successfully allocate such a page, change its memory type to
++ * UC and check if the accounting was done correctly, we can determine if
++ * the change_page_attr() interface can be used safely.
+  *
+- * return values:
+- *    0 - test passed, interface works
+- *    1 - test failed, status unclear
+- *   -1 - test failed, interface broken
++ * Return values:
++ *    0 - test passed, the change_page_attr() interface works
++ *    1 - test failed, the status is unclear
++ *   -1 - test failed, the change_page_attr() interface is broken
+  */
+ 
+ static inline pte_t *check_large_page(unsigned long vaddr)
+@@ -950,7 +943,7 @@
+     pgd_t *pgd = NULL;
+     pmd_t *pmd = NULL;
+ 
+-    pgd = NV_PGD_OFFSET(vaddr, 1, &init_mm);
++    pgd = NV_PGD_OFFSET(vaddr, 1, NULL);
+     if (!NV_PGD_PRESENT(pgd))
+         return NULL;
+ 
+@@ -1060,35 +1053,42 @@
+ 
+     return 1;
+ }
+-
+ #endif /* defined(NV_CHANGE_PAGE_ATTR_BUG_PRESENT) */
+ 
+-
+-// verify that the kernel's mapping matches the requested type 
+-// this is to protect against accidental cache aliasing problems
++/*
++ * nv_verify_page_mappings() - verify that the kernel mapping of the specified
++ * page matches the specified type. This is to help detect bugs in the Linux
++ * kernel's change_page_attr() interface, early.
++ *
++ * This function relies on the ability to perform kernel virtul address to PFN
++ * translations and therefore on 'init_mm'. Unfortunately, the latter is no
++ * longer exported in recent Linux/x86 2.6 kernels. The export was removed at
++ * roughtly the same time as the set_pages_{uc,wb}() change_page_attr()
++ * replacement interfaces were introduced; hopefully, it will be sufficient to
++ * check for their presence.
++ */
+ int nv_verify_page_mappings(
+     nv_pte_t *page_ptr,
+     unsigned int cachetype
+ )
+ {
+-    struct mm_struct *mm;
++#if defined(NV_CHANGE_PAGE_ATTR_PRESENT) || \
++    (defined(NV_SET_PAGES_UC_PRESENT) && !defined(NVCPU_X86))
++    unsigned long retval = -1;
++#if defined(NVCPU_X86) || defined(NVCPU_X86_64)
+     pgd_t *pgd = NULL;
+     pmd_t *pmd = NULL;
+     pte_t *pte = NULL;
+-    unsigned long retval = -1;
+     unsigned int flags, expected;
+     unsigned long address;
+     static int count = 0;
+ 
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-    if (!nv_use_cpa)
++    if (!nv_update_memory_types)
+         return 0;
+-#endif
+ 
+     address = (unsigned long)__va(page_ptr->phys_addr);
+-    mm = &init_mm; // always a kernel page
+ 
+-    pgd = NV_PGD_OFFSET(address, 1, mm);
++    pgd = NV_PGD_OFFSET(address, 1, NULL);
+     if (!NV_PGD_PRESENT(pgd))
+     {
+         nv_printf(NV_DBG_ERRORS, "NVRM: pgd not present for addr 0x%lx\n", address);
+@@ -1154,7 +1154,11 @@
+     }
+ 
+ failed:
++#endif /* defined(NVCPU_X86) || defined(NVCPU_X86_64) */
+     return retval;
++#else
++    return 0;
++#endif
+ }
+ 
+ #if defined(NV_BUILD_NV_PAT_SUPPORT) && defined(CONFIG_HOTPLUG_CPU)
+@@ -1200,7 +1204,8 @@
+ static int __init nvidia_init_module(void)
+ {
+     int rc;
+-    U032 i, count;
++    U032 i, count, data;
++    nv_state_t *nv = NV_STATE_PTR(&nv_ctl_device);
+ 
+ #if defined(VM_CHECKER)
+     nv_init_lock(vm_lock);
+@@ -1359,43 +1364,41 @@
+     /* create /proc/driver/nvidia */
+     nvos_proc_create();
+ 
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
++    /*
++     * Give users an opportunity to disable the driver's use of
++     * the change_page_attr() and set_pages_{uc,wb}() kernel
++     * interfaces.
++     */
++    rc = rm_read_registry_dword(nv, "NVreg", "UpdateMemoryTypes", &data);
++    if ((rc == 0) && ((int)data != ~0))
+     {
+-        int data;
+-
+-        // allow the user to override us with a registry key
+-        rc = rm_read_registry_dword(NV_STATE_PTR(&nv_ctl_device), "NVreg", "UseCPA",  &data);
+-        if ((rc == 0) && (data != -1))
+-        {
+-            nv_use_cpa = data;
+-        }
++        nv_update_memory_types = data;
++    }
+ #if defined(NV_CHANGE_PAGE_ATTR_BUG_PRESENT)
+-        else
++    /*
++     * Unless we explicitely detect that the change_page_attr()
++     * inteface is fixed, disable usage of the interface on
++     * this kernel. Notify the user of this problem using the
++     * driver's /proc warnings interface (read by the installer
++     * and the bug report script).
++     */
++    else
++    {
++        rc = nv_verify_cpa_interface();
++        if (rc < 0)
+         {
+-            /*
+-             * Unless we explicitely detect that the change_page_attr()
+-             * inteface is fixed, disable usage of the interface on
+-             * this kernel. Notify the user of this problem using the
+-             * driver's /proc warnings interface (read by the installer
+-             * and the bug report script).
+-             */
+-            rc = nv_verify_cpa_interface();
+-            if (rc < 0)
+-            {
+-                nv_prints(NV_DBG_ERRORS, __cpgattr_warning);
+-                nvos_proc_add_warning_file("change_page_attr", __cpgattr_warning);
+-                nv_use_cpa = 0;
+-            }
+-            else if (rc != 0)
+-            {
+-                nv_prints(NV_DBG_ERRORS, __cpgattr_warning_2);
+-                nvos_proc_add_warning_file("change_page_attr", __cpgattr_warning_2);
+-                nv_use_cpa = 0;
+-            }
++            nv_prints(NV_DBG_ERRORS, __cpgattr_warning);
++            nvos_proc_add_warning_file("change_page_attr", __cpgattr_warning);
++            nv_update_memory_types = 0;
++        }
++        else if (rc != 0)
++        {
++            nv_prints(NV_DBG_ERRORS, __cpgattr_warning_2);
++            nvos_proc_add_warning_file("change_page_attr", __cpgattr_warning_2);
++            nv_update_memory_types = 0;
+         }
+-#endif
+     }
+-#endif
++#endif /* defined(NV_CHANGE_PAGE_ATTR_BUG_PRESENT) */
+ 
+ #if defined(NVCPU_X86_64) && defined(CONFIG_IA32_EMULATION) && !defined(HAVE_COMPAT_IOCTL)
+     /* Register ioctl conversions for 32 bit clients */
+@@ -3230,8 +3233,21 @@
+     pte_t *pte = NULL;
+     NvU64 retval;
+ 
+-    mm = (kern) ? &init_mm : current->mm;
+-    if (!kern) down_read(&current->mm->mmap_sem);
++    if (!kern)
++    {
++        mm = current->mm;
++        down_read(&mm->mmap_sem);
++    }
++    else
++    {
++#if defined(NV_SET_PAGES_UC_PRESENT) && defined(NVCPU_X86)
++        /* nv_printf(NV_DBG_ERRORS,
++            "NVRM: can't translate KVA in nv_get_phys_address()!\n"); */
++        return 0;
++#else
++        mm = NULL;
++#endif
++    }
+ 
+     pgd = NV_PGD_OFFSET(address, kern, mm);
+     if (!NV_PGD_PRESENT(pgd))
+@@ -3252,22 +3268,24 @@
+     retval &= ~_PAGE_NX;
+ #endif
+ 
+-    if (!kern) up_read(&current->mm->mmap_sem);
++    if (!kern)
++        up_read(&mm->mmap_sem);
+     return retval;
+ 
+ failed:
+-    if (!kern) up_read(&current->mm->mmap_sem);
++    if (!kern)
++        up_read(&mm->mmap_sem);
+     return 0;
+ }
+ 
+ NvU64 NV_API_CALL nv_get_kern_phys_address(NvU64 address)
+ {
+-    // make sure this address is a kernel pointer
++    /* make sure this address is a kernel virtual address */
+ #if defined(DEBUG) && !defined(CONFIG_X86_4G)
+     if (address < PAGE_OFFSET)
+     {
+         nv_printf(NV_DBG_WARNINGS,
+-            "NVRM: user address passed to get_kern_phys_address: 0x%lx\n",
++            "NVRM: user address passed to get_kern_phys_address: 0x%llx!\n",
+             address);
+         return 0;
+     }
+@@ -3282,12 +3300,12 @@
+ 
+ NvU64 NV_API_CALL nv_get_kern_user_address(NvU64 address)
+ {
+-    // make sure this address is not a kernel pointer
++    /* make sure this address is not a kernel virtual address */
+ #if defined(DEBUG) && !defined(CONFIG_X86_4G)
+     if (address >= PAGE_OFFSET)
+     {
+         nv_printf(NV_DBG_WARNINGS,
+-            "NVRM: kernel address passed to get_user_phys_address: 0x%lx\n",
++            "NVRM: kernel address passed to get_user_phys_address: 0x%llx!\n",
+             address);
+         return 0;
+     }
+@@ -3989,13 +4007,10 @@
+     return -1;
+ }
+ 
+-int NV_API_CALL nv_no_incoherent_mappings
+-(
+-    void
+-)
++int NV_API_CALL nv_no_incoherent_mappings(void)
+ {
+-#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
+-    return 1;
++#if defined(NV_CHANGE_PAGE_ATTR_PRESENT) || defined(NV_SET_PAGES_UC_PRESENT)
++    return (nv_update_memory_types);
+ #else
+     return 0;
+ #endif
+diff -ru usr/src/nv/os-interface.c usr/src/nv.2290218/os-interface.c
+--- usr/src/nv/os-interface.c	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/os-interface.c	2008-03-18 13:15:38.098961229 -0700
+@@ -1130,6 +1130,18 @@
+ {
+     void *vaddr;
+ 
++    if (start == 0)
++    {
++        if (mode != NV_MEMORY_CACHED)
++        {
++            nv_printf(NV_DBG_ERRORS,
++                "NVRM: os_map_kernel_space: won't map address 0x%0llx UC!\n", start);
++            return NULL;
++        }
++        else
++            return (void *)PAGE_OFFSET;
++    }
++
+     if (!NV_MAY_SLEEP())
+     {
+         nv_printf(NV_DBG_ERRORS,
+@@ -1162,6 +1174,9 @@
+     NvU64 size_bytes
+ )
+ {
++    if (addr == (void *)PAGE_OFFSET)
++        return;
++
+     NV_IOUNMAP(addr, size_bytes);
+ }
+ 
+diff -ru usr/src/nv/os-registry.c usr/src/nv.2290218/os-registry.c
+--- usr/src/nv/os-registry.c	2008-01-22 20:12:23.000000000 -0800
++++ usr/src/nv.2290218/os-registry.c	2008-03-18 13:15:40.631105529 -0700
+@@ -381,34 +381,36 @@
+ NV_MODULE_PARAMETER(NVreg_RemapLimit);
+ 
+ /*
+- * Option: UseCPA
++ * Option: UpdateMemoryTypes
+  *
+  * Description:
+  *
+- * Many kernels have a broken implementation of change_page_attr that leads
+- * to cache aliasing problems. x86_64 kernels between 2.6.0 and 2.6.10 will
+- * force a kernel BUG_ON() when this condition is encountered. For this
+- * reason, the NVIDIA driver is very careful about not using the CPA kernel
+- * interface on these kernels.
+- *
+- * Some distributions have backported this fix to kernel versions that fall
+- * within this version range. The NVIDIA driver attempts to automatically
+- * detect these fixes and reenable usage of the change_page_attr interface.
+- *
+- * Due to the serious nature of the problems that can arise from this, the
+- * NVIDIA driver implements a manual registry key to force usage of this API
+- * to be enabled or disabled. This registry key can be used to force usage
+- * of the API on a known fixed kernel if the NVIDIA driver fails to detect
+- * the kernel as fixed. This registry key can also be used to disable usage
+- * of the API on a bad kernel that is misdetected as a fixed kernel.
+- *
+- * The default value is '-1' (use NVIDIA driver default logic)
+- * A value of '0' will forcibly disable change_page_attr calls.
+- * A value of '1' will forcibly enable change_page_attr calls.
++ * Many kernels have broken implementations of the change_page_attr()
++ * kernel interface that may cause cache aliasing problems. Linux/x86-64
++ * kernels between 2.6.0 and 2.6.10 may prompt kernel BUG()s due to
++ * improper accounting in the interface's large page management code, for
++ * example. For this reason, the NVIDIA Linux driver is very careful about
++ * not using the change_page_attr() kernel interface on these kernels.
++ *
++ * Due to the serious nature of the problems that can arise from bugs in
++ * the change_page_attr(), set_pages_{uc,wb}() and other kernel interfaces
++ * used to modify memory types, the NVIDIA driver implements a manual
++ * registry key override to allow forcibly enabling or disabling use of
++ * these APIs.
++ *
++ * Possible values:
++ *
++ * ~0 = use the NVIDIA driver's default logic (default)
++ *  0 = enable use of change_page_attr(), etc.
++ *  1 = disable use of change_page_attr(), etc.
++ *
++ * By default, the NVIDIA driver will attempt to auto-detect if it can
++ * safely use the change_page_attr() and other kernel interfaces to modify
++ * the memory types of kernel mappings.
+  */
+ 
+-static int NVreg_UseCPA = -1;
+-NV_MODULE_PARAMETER(NVreg_UseCPA);
++static int NVreg_UpdateMemoryTypes = ~0;
++NV_MODULE_PARAMETER(NVreg_UpdateMemoryTypes);
+ 
+ /*
+  * Option: DetectPrimaryVga
+@@ -511,7 +513,7 @@
+     { "NVreg",  "DeviceFileGID",            &NVreg_DeviceFileGID,            1 },
+     { "NVreg",  "DeviceFileMode",           &NVreg_DeviceFileMode,           1 },
+     { "NVreg",  "RemapLimit",               &NVreg_RemapLimit,               1 },
+-    { "NVreg",  "UseCPA",                   &NVreg_UseCPA,                   1 },
++    { "NVreg",  "UpdateMemoryTypes",        &NVreg_UpdateMemoryTypes,        1 },
+     { "NVreg",  "DetectPrimaryVga",         &NVreg_DetectPrimaryVga,         1 },
+     { "NVreg",  "EnableBrightnessControl",  &NVreg_EnableBrightnessControl,  1 },
+     { "NVreg",  "PanelPWMFrequency",        &NVreg_PanelPWMFrequency,        1 },

Added: packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/xen.96.43.05.diff
URL: http://svn.debian.org/wsvn/pkg-nvidia/packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/xen.96.43.05.diff?rev=422&op=file
==============================================================================
--- packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/xen.96.43.05.diff (added)
+++ packages/nvidia-graphics-drivers-legacy-96xx/trunk/patches/xen.96.43.05.diff Tue Jul  8 23:42:08 2008
@@ -1,0 +1,67 @@
+diff -ruN usr/src/nv/conftest.sh usr/src/nv/conftest.sh
+--- usr/src/nv/conftest.sh	2008-06-07 11:00:05.000000000 -0400
++++ usr/src/nv/conftest.sh	2008-06-07 11:02:31.000000000 -0400
+@@ -1140,62 +1140,7 @@
+     ;;
+ 
+     xen_sanity_check)
+-        #
+-        # Check if the target kernel is a Xen kernel. If so, then exit, since
+-        # the driver doesn't currently work with Xen.
+-        #
+-        RET=1
+-        VERBOSE=$6
+-        FILE="linux/autoconf.h"
+-
+-        if [ -n "$IGNORE_XEN_PRESENCE" ]; then
+-            exit 0
+-        fi
+-
+-        if [ -f $HEADERS/$FILE -o -f $OUTPUT/include/$FILE ]; then
+-            #
+-            # We are looking at a configured source tree; verify
+-            # that it's not a Xen kernel.
+-            #
+-            echo "#include <linux/autoconf.h>
+-            #ifdef CONFIG_XEN
+-            #error CONFIG_XEN defined!!
+-            #endif
+-            " > conftest$$.c
+-
+-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+-            rm -f conftest$$.c
+-
+-            if [ -f conftest$$.o ]; then
+-                rm -f conftest$$.o
+-                RET=0
+-            fi
+-        else
+-            CONFIG=$HEADERS/../.config
+-            if [ -f $CONFIG ]; then
+-                if [ -z "$(grep "^CONFIG_XEN=y" $CONFIG)" ]; then
+-                    RET=0
+-                fi
+-            fi
+-        fi
+-
+-        if [ "$RET" != "0" ]; then
+-            echo "The kernel you are installing for is a Xen kernel!";
+-            echo "";
+-            echo "The NVIDIA driver does not currently work on Xen kernels. If ";
+-            echo "you are using a stock distribution kernel, please install ";
+-            echo "a variant of this kernel without Xen support; if this is a ";
+-            echo "custom kernel, please install a standard Linux kernel.  Then ";
+-            echo "try installing the NVIDIA kernel module again.";
+-            echo "";
+-            if [ "$VERBOSE" = "full_output" ]; then
+-                echo "*** Failed Xen sanity check. Bailing out! ***";
+-                echo "";
+-            fi
+-            exit 1
+-        else
+-            exit 0
+-        fi
++        exit 0
+     ;;
+ 
+     compile_tests)




More information about the Pkg-nvidia-devel mailing list