linux-2.6.16.X a nvidia-drivers

Miroslav Lednicky lednicky na avonet.cz
Neděle Duben 9 10:57:08 CEST 2006


Dobry den,

	hledejte:

NVIDIA_kernel-1.0-8178-U012206.diff.txt

Zkousim to prilozit k tomuto mailu, ale nevim, jestli to projde
az do konference. ;-)

Ondřej Tůma wrote:

> tak tohle jsem právě teď celkem usilovně zkoumal. Situace je taková že prostě na starý karty z vysoka :(
> Sám mám problém rozběhat kartu GeForce 256 i na 2.6.10ce - netuším proč, prostě mě Xka tvrdí že modul není zaveden v jádře (samo že je :S) // ještě že sem si tu kartu jen půjčil ...
>> máte někdo zkušenosti s ovladači Nvidia pod linuxem řadou
>>2.6.16? Jelikož mám kartu GeForce2 Ti a tato GPU je podporována
>>pouze do verze ovladačů NVIDIA-Linux-x86-1.0-7174 zajímalo by mne
>>zda jste někdo řešil podobnou situaci "Jak rozběhnout starší ovladače pod
>>novým kernelem". Tyto ovladače pod linuxem 2.6.16 nejsem schopen přeložit.
>>Pod linux-2.6.15.X nebyl žádný problém.
>>
>> Nevíte někdo jestli se v rámci jiného projektu stále vyvíjí ovladače pro 
>>GPU, které nvidia přestala sama podporovat?

Preji hezky den.

-- 
Miroslav Lednicky, AVONET, s.r.o.


------------- další část ---------------
diff -ru usr/src/nv/Makefile.kbuild usr/src/nv.U012206/Makefile.kbuild
--- usr/src/nv/Makefile.kbuild	2005-12-15 01:57:35.000000000 +0100
+++ usr/src/nv.U012206/Makefile.kbuild	2006-01-22 15:32:35.775636750 +0100
@@ -186,6 +186,18 @@
   ifeq ($(shell $(CONFTEST) sysctl_max_map_count), 1)
     EXTRA_CFLAGS += -DNV_SYSCTL_MAX_MAP_COUNT_PRESENT
   endif
+
+  ifeq ($(shell $(CONFTEST) pm_message_t), 1)
+    EXTRA_CFLAGS += -DNV_PM_MESSAGE_T_PRESENT
+  endif
+
+  ifeq ($(shell $(CONFTEST) pci_choose_state), 1)
+    EXTRA_CFLAGS += -DNV_PCI_CHOOSE_STATE_PRESENT
+  endif
+
+  ifeq ($(shell $(CONFTEST) vm_insert_page), 1)
+	EXTRA_CFLAGS += -DNV_VM_INSERT_PAGE_PRESENT
+  endif
 endif
 
 ifeq ($(shell $(CONFTEST) remap_pfn_range), 1)
diff -ru usr/src/nv/conftest.sh usr/src/nv.U012206/conftest.sh
--- usr/src/nv/conftest.sh	2005-12-15 01:57:35.000000000 +0100
+++ usr/src/nv.U012206/conftest.sh	2006-01-22 15:32:06.353798000 +0100
@@ -22,8 +22,8 @@
 OUTPUT=$4
 
 CFLAGS="-D__KERNEL__ \
--nostdinc -isystem $ISYSTEM \
--Werror -Wimplicit-function-declaration"
+-DKBUILD_BASENAME=\"#conftest$$\" -DKBUILD_MODNAME=\"#conftest$$\" \
+-nostdinc -isystem $ISYSTEM"
 
 if [ "$OUTPUT" != "$SOURCES" ]; then
     ARCH=`uname -m | sed -e 's/i.86/i386/'`
@@ -40,9 +40,22 @@
         #
 
         echo "#include <linux/mm.h>
-        int nv_remap_page_range(void) {
+        void conftest_remap_page_range(void) {
+           remap_page_range();
+        }" > conftest$$.c
+
+        $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+        rm -f conftest$$.c
+
+        if [ -f conftest$$.o ]; then
+          rm -f conftest$$.o
+          exit 1
+        fi
+
+        echo "#include <linux/mm.h>
+        int conftest_remap_page_range(void) {
            pgprot_t pgprot = __pgprot(0);
-           remap_page_range(NULL, 0L, 0L, 0L, pgprot);
+           return remap_page_range(NULL, 0L, 0L, 0L, pgprot);
         }" > conftest$$.c
 
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
@@ -55,9 +68,9 @@
         fi
 
         echo "#include <linux/mm.h>
-        int nv_remap_page_range(void) {
+        int conftest_remap_page_range(void) {
            pgprot_t pgprot = __pgprot(0);
-           remap_page_range(0L, 0L, 0L, pgprot);
+           return remap_page_range(0L, 0L, 0L, pgprot);
         }" > conftest$$.c
 
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
@@ -330,7 +343,7 @@
                 return 0;
             }" > conftest$$.c
 
-            $HOSTCC $CFLAGS -Wno-error -o conftest$$ conftest$$.c > /dev/null 2>&1
+            $HOSTCC $CFLAGS -o conftest$$ conftest$$.c > /dev/null 2>&1
             rm -f conftest$$.c
 
             if [ -f conftest$$ ]; then
@@ -483,8 +496,8 @@
         #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
           #include <asm/cacheflush.h>
         #endif
-        int nv_change_page_attr(struct page *pp, int i, pgprot_t prot) {
-            return change_page_attr(pp, i, prot);
+        void conftest_change_page_attr() {
+            change_page_attr();
         }" > conftest$$.c
 
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
@@ -492,9 +505,9 @@
 
         if [ -f conftest$$.o ]; then
             rm -f conftest$$.o
-            echo 1
-        else
             echo 0
+        else
+            echo 1
         fi
     ;;
 
@@ -504,9 +517,8 @@
         #
 
         echo "#include <linux/pci.h>
-        struct pci_dev*
-        nv_pci_get_class(unsigned int class, struct pci_dev *from) {
-            return pci_get_class(class, from);
+        void conftest_pci_get_class(void) {
+            pci_get_class();
         }" > conftest$$.c
 
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
@@ -514,9 +526,9 @@
 
         if [ -f conftest$$.o ]; then
             rm -f conftest$$.o
-            echo 1
-        else
             echo 0
+        else
+            echo 1
         fi
     ;;
 
@@ -526,9 +538,8 @@
         #
 
         echo "#include <linux/mm.h>
-        int nv_remap_pfn_range(void) {
-            pgprot_t pgprot = __pgprot(0);
-            remap_pfn_range(NULL, 0L, 0L, 0L, pgprot);
+        void conftest_remap_pfn_range(void) {
+            remap_pfn_range();
         }" > conftest$$.c
 
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
@@ -536,9 +547,9 @@
 
         if [ -f conftest$$.o ]; then
             rm -f conftest$$.o
-            echo 1
-        else
             echo 0
+        else
+            echo 1
         fi
     ;;
 
@@ -548,11 +559,11 @@
         #
 
         echo "#include <linux/sched.h>
-        struct rlimit *nv_signal_struct_rlim(void) {
+        struct rlimit *conftest_signal_struct_rlim(void) {
             return current->signal->rlim;
         }" > conftest$$.c
 
-        $CC $CFLAGS -Wno-error -c conftest$$.c > /dev/null 2>&1
+        $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
         rm -f conftest$$.c
 
         if [ -f conftest$$.o ]; then
@@ -572,7 +583,7 @@
         echo "#include <linux/types.h>
         #include <linux/agp_backend.h>
         typedef struct agp_bridge_data agp_bridge_data;
-        agp_bridge_data *nv_agp_backend_acquire(struct pci_dev *dev) {
+        agp_bridge_data *conftest_agp_backend_acquire(struct pci_dev *dev) {
             return agp_backend_acquire(dev);
         }" > conftest$$.c
 
@@ -594,9 +605,23 @@
         #
 
         echo "#include <linux/vmalloc.h>
-        void *nv_vmap(struct page **pg, int cnt) {
+        void conftest_vmap(void) {
+            vmap();
+        }" > conftest$$.c
+
+        $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+        rm -f conftest$$.c
+
+        if [ -f conftest$$.o ]; then
+            rm -f conftest$$.o
+            exit 1
+        fi
+
+        echo "#include <linux/vmalloc.h>
+        void *conftest_vmap(struct page **pg, int cnt) {
             return vmap(pg, cnt);
         }" > conftest$$.c
+
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
         rm -f conftest$$.c
 
@@ -608,9 +633,10 @@
 
         echo "#include <linux/vmalloc.h>
         #include <linux/mm.h>
-        void *nv_vmap(struct page **pg, int cnt) {
+        void *conftest_vmap(struct page **pg, int cnt) {
             return vmap(pg, cnt, 0, PAGE_KERNEL);
         }" > conftest$$.c
+
         $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
         rm -f conftest$$.c
 
@@ -618,7 +644,11 @@
             rm -f conftest$$.o
             echo 4
         else
-            exit 1  # there ain't no vmap()
+            #
+            # We couldn't determine the number of arguments expected by the
+            # vmap() function.
+            #
+            exit 1
         fi
     ;;
 
@@ -629,7 +659,7 @@
         #
 
         echo "#include <linux/sched.h>
-        int nv_test_sysctl_max_map_count(void) {
+        int conftest_sysctl_max_map_count(void) {
             return sysctl_max_map_count;
         }" > conftest$$.c
 
@@ -644,4 +674,67 @@
         fi
     ;;
 
+    pm_message_t)
+        #
+        # Does linux/pm.h declare the pm_message_t type?
+        #
+
+        echo "#include <linux/pm.h>
+        void conftest_pm_message_t(pm_message_t state) {
+            pm_message_t *p = &state;
+        }" > 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 1
+        else
+            echo 0
+        fi
+    ;;
+
+    pci_choose_state)
+        #
+        # Determine if pci_choose_state() is present.
+        #
+
+        echo "#include <linux/pci.h>
+        void conftest_pci_choose_state(void) {
+            pci_choose_state();
+        }" > 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 0
+        else
+            echo 1
+        fi
+    ;;
+
+    vm_insert_page)
+        #
+        # Determine if vm_insert_page() is present.
+        #
+
+        echo "#include <linux/mm.h>
+        void conftest_vm_insert_page(void) {
+            vm_insert_page();
+        }" > 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 0
+        else
+            echo 1
+        fi
+    ;;
+
 esac
diff -ru usr/src/nv/nv-linux.h usr/src/nv.U012206/nv-linux.h
--- usr/src/nv/nv-linux.h	2005-12-15 01:57:35.000000000 +0100
+++ usr/src/nv.U012206/nv-linux.h	2006-01-22 15:32:35.775636750 +0100
@@ -642,15 +642,49 @@
 #define NV_PRINT_AT(at)
 #endif
 
-// acpi support has been back-ported to the 2.4 kernel, but the 2.4 driver
-// model is not sufficient for full acpi support. it may work in some cases,
-// but not enough for us to officially support this configuration.
-#if defined(CONFIG_ACPI) && defined(KERNEL_2_6)
-#define NV_PM_SUPPORT_ACPI
+/*
+ * On Linux 2.6, we support both APM and ACPI power management. On Linux
+ * 2.4, we support APM, only. ACPI support has been back-ported to the
+ * Linux 2.4 kernel, but the Linux 2.4 driver model is not sufficient for
+ * full ACPI support: it may work with some systems, but not reliably
+ * enough for us to officially support this configuration.
+ *
+ * We support two Linux kernel power managment interfaces: the original
+ * pm_register()/pm_unregister() on Linux 2.4 and the device driver model
+ * backed PCI driver power management callbacks introduced with Linux
+ * 2.6.
+ *
+ * The code below determines which interface to support on this kernel
+ * version, if any; if built for Linux 2.6, it will also determine if the
+ * kernel comes with ACPI or APM power management support.
+ */
+#if defined(KERNEL_2_6) && (defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) || defined(CONFIG_ACPI))
+#define NV_PM_SUPPORT_DEVICE_DRIVER_MODEL
+#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
+#define NV_PM_SUPPORT_NEW_STYLE_APM
+#endif
 #endif
 
-#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
-#define NV_PM_SUPPORT_APM
+/*
+ * On Linux 2.6 kernels >= 2.6.11, the PCI subsystem provides a new 
+ * interface that allows PCI drivers to determine the correct power state
+ * for a given system power state; our suspend/resume callbacks now use
+ * this interface and operate on PCI power state defines.
+ *
+ * Define these new PCI power state #define's here for compatibility with
+ * older Linux 2.6 kernels.
+ */
+#if defined(KERNEL_2_6) && !defined(PCI_D0)
+#define PCI_D0 PM_SUSPEND_ON
+#define PCI_D3hot PM_SUSPEND_MEM
+#endif
+
+#if defined(KERNEL_2_6) && !defined(NV_PM_MESSAGE_T_PRESENT)
+typedef u32 pm_message_t;
+#endif
+
+#if defined(KERNEL_2_4) && (defined(CONFIG_APM) || defined(CONFIG_APM_MODULE))
+#define NV_PM_SUPPORT_OLD_STYLE_APM
 #endif
 
 #ifndef minor
@@ -666,9 +700,13 @@
 #define PCI_CAP_ID_EXP 0x10
 #endif
 
+#if defined(NV_VM_INSERT_PAGE_PRESENT)
+#define NV_VM_INSERT_PAGE(vma, addr, page) \
+    vm_insert_page(vma, addr, page)
+#endif
 #if defined(NV_REMAP_PFN_RANGE_PRESENT)
 #define NV_REMAP_PAGE_RANGE(from, offset, x...) \
-     remap_pfn_range(vma, from, ((offset) >> PAGE_SHIFT), x)
+    remap_pfn_range(vma, from, ((offset) >> PAGE_SHIFT), x)
 #elif defined(NV_REMAP_PAGE_RANGE_5_PRESENT)
 #define NV_REMAP_PAGE_RANGE(x...) remap_page_range(vma, x)
 #elif defined(NV_REMAP_PAGE_RANGE_4_PRESENT)
@@ -840,11 +878,7 @@
     }
 #endif
 
-#if !defined(page_to_pfn)
-#define page_to_pfn(page)  ((page) - mem_map)
-#endif
-
-#if !defined(pfn_to_page)
+#if defined(KERNEL_2_4) && defined(NVCPU_X86) && !defined(pfn_to_page)
 #define pfn_to_page(pfn) (mem_map + (pfn))
 #endif
 
diff -ru usr/src/nv/nv-vm.c usr/src/nv.U012206/nv-vm.c
--- usr/src/nv/nv-vm.c	2005-12-15 01:57:35.000000000 +0100
+++ usr/src/nv.U012206/nv-vm.c	2006-01-22 15:32:35.775636750 +0100
@@ -105,6 +105,15 @@
 #endif
 }
 
+static inline BOOL nv_page_locked(nv_pte_t *page_ptr)
+{
+    BOOL locked = FALSE; 
+#if defined(PageReserved)
+    locked = PageReserved(NV_GET_PAGE_STRUCT(page_ptr->phys_addr));
+#endif 
+    return locked;
+}
+
 #if defined(NV_SG_MAP_BUFFERS)
 
 /* track how much memory has been remapped through the iommu/swiotlb */
@@ -704,7 +713,7 @@
         if (!NV_ALLOC_MAPPING_CONTIG(at->flags))
             nv_sg_unmap_buffer(dev, &page_ptr->sg_list, page_ptr);
 #endif
-        if (!NV_ALLOC_MAPPING_CONTIG(at->flags) && !NV_ALLOC_MAPPING_VMALLOC(at->flags))
+        if (!NV_ALLOC_MAPPING_CONTIG(at->flags) && !NV_ALLOC_MAPPING_VMALLOC(at->flags) && !nv_page_locked(page_ptr))
             NV_FREE_PAGES(page_ptr->virt_addr, 0);
     }
     nv_flush_caches();
diff -ru usr/src/nv/nv.c usr/src/nv.U012206/nv.c
--- usr/src/nv/nv.c	2005-12-15 01:57:35.000000000 +0100
+++ usr/src/nv.U012206/nv.c	2006-01-22 15:32:35.775636750 +0100
@@ -29,7 +29,7 @@
 
 static nv_linux_state_t nv_linux_devices[NV_MAX_DEVICES];
 
-#if defined(NV_PM_SUPPORT_APM)
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
 static struct pm_dev *apm_nv_dev[NV_MAX_DEVICES] = { 0 };
 #endif
 
@@ -244,8 +244,8 @@
 void          nv_kern_isr_bh(unsigned long);
 irqreturn_t   nv_kern_isr(int, void *, struct pt_regs *);
 void          nv_kern_rc_timer(unsigned long);
-#if defined(NV_PM_SUPPORT_APM)
-int           nv_kern_apm_event(struct pm_dev *dev, pm_request_t rqst, void *data);
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
+static int    nv_kern_apm_event(struct pm_dev *, pm_request_t, void *);
 #endif
 
 static int    nv_kern_read_cardinfo(char *, char **, off_t off, int, int *, void *);
@@ -265,9 +265,10 @@
 unsigned int  nv_kern_ctl_poll(struct file *, poll_table *);
 
 int nv_kern_probe(struct pci_dev *, const struct pci_device_id *);
-#if defined(NV_PM_SUPPORT_ACPI)
-int nv_kern_acpi_standby(struct pci_dev *, u32);
-int nv_kern_acpi_resume(struct pci_dev *);
+
+#if defined(NV_PM_SUPPORT_DEVICE_DRIVER_MODEL)
+static int    nv_kern_suspend(struct pci_dev *, pm_message_t);
+static int    nv_kern_resume(struct pci_dev *);
 #endif
 
 /***
@@ -292,9 +293,9 @@
     .name     = "nvidia",
     .id_table = nv_pci_table,
     .probe    = nv_kern_probe,
-#if defined(NV_PM_SUPPORT_ACPI)
-    .suspend  = nv_kern_acpi_standby,
-    .resume   = nv_kern_acpi_resume,
+#if defined(NV_PM_SUPPORT_DEVICE_DRIVER_MODEL)
+    .suspend  = nv_kern_suspend,
+    .resume   = nv_kern_resume,
 #endif
 };
 
@@ -852,7 +853,8 @@
 
     if (!test_bit(X86_FEATURE_PAT, (volatile unsigned long *)&boot_cpu_data.x86_capability))
     {
-        nv_printf(NV_DBG_ERRORS, "NVRM: cpu does not support PAT, aborting..\n");
+        nv_printf(NV_DBG_ERRORS,
+            "NVRM: CPU does not support the PAT, falling back to MTRRs.\n");
         return 0;
     }
 
@@ -1084,9 +1086,12 @@
 
         // broken kernels may get confused after splitting the page and
         // restore the page before returning to us. detect that case.
-        if ( (pte_val(*kpte) == kpte_val) &&
-             (pte_val(*kpte) & _PAGE_PSE))
+        if (((pte_val(*kpte) & ~_PAGE_NX) == kpte_val) &&
+            (pte_val(*kpte) & _PAGE_PSE))
         {
+            if ((pte_val(*kpte) & _PAGE_NX) &&
+                    (__nv_supported_pte_mask & _PAGE_NX) == 0)
+                clear_bit(_PAGE_BIT_NX, kpte);
             spin_unlock(&init_mm.page_table_lock);
             // don't change the page back, as it's already been reverted
             put_page(kpte_page);
@@ -1299,7 +1304,7 @@
         nv_lock_init_locks(nv_ctl);
     }
 
-#if defined(NV_PM_SUPPORT_APM)
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
     for (i = 0; i < num_nv_devices; i++)
     {
         apm_nv_dev[i] = pm_register(PM_PCI_DEV, PM_SYS_VGA, nv_kern_apm_event);
@@ -1407,8 +1412,11 @@
 
 #if defined(NV_BUILD_NV_PAT_SUPPORT)
     if (!nv_disable_pat)
-    {
         __nv_enable_pat_support();
+    else
+    {
+        nv_printf(NV_DBG_ERRORS,
+            "NVRM: builtin PAT support disabled, falling back to MTRRs.\n");
     }
 #endif
 
@@ -1418,7 +1426,7 @@
     if (nv_pte_t_cache != NULL)
         NV_KMEM_CACHE_DESTROY(nv_pte_t_cache);
 
-#if defined(NV_PM_SUPPORT_APM)
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
     for (i = 0; i < num_nv_devices; i++)
         if (apm_nv_dev[i] != NULL) pm_unregister(apm_nv_dev[i]);
 #endif
@@ -1473,10 +1481,10 @@
     inter_module_unregister("nv_linux_devices");
 #endif
 
-#if defined(NV_PM_SUPPORT_APM)
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
     for (i = 0; i < num_nv_devices; i++)
     {
-        pm_unregister(apm_nv_dev[i]);
+        if (apm_nv_dev[i] != NULL) pm_unregister(apm_nv_dev[i]);
     }
 #endif
 
@@ -1889,9 +1897,6 @@
     // allow setting or refusal of specific caching types
     switch (cache_type)
     {
-        case NV_MEMORY_CACHED:
-        //case NV_MEMORY_WRITEBACK:
-            break;
         case NV_MEMORY_UNCACHED_WEAK:
             *prot = pgprot_noncached_weak(*prot);
             break;
@@ -1899,19 +1904,53 @@
             *prot = pgprot_noncached(*prot);
             break;
         case NV_MEMORY_WRITECOMBINED:
-            if (nv_pat_enabled)
+            if (nv_pat_enabled &&
+                (memory_type != NV_MEMORY_TYPE_REGISTERS))
             {
                 *prot = pgprot_writecombined(*prot);
                 break;
             }
-            /* agp allocations should be covered by an mtrr if pat isn't enabled */
+            /*
+             * If PAT support is unavailable and the memory space isn't
+             * NV_MEMORY_TYPE_AGP, we need to return an error code to
+             * the caller, but do not print a warning message.
+             *
+             * In the case of AGP memory, we will have attempted to add
+             * a WC MTRR for the AGP aperture and aborted the AGP
+             * initialization if this failed, so we can safely return
+             * success here.
+             *
+             * For frame buffer memory, callers are expected to use the
+             * UC- memory type if we report WC as unsupported, which
+             * translates to the effective memory type WC if a WC MTRR
+             * exists or else UC.
+             */
             if (memory_type == NV_MEMORY_TYPE_AGP)
                 break;
+            return 1;
+        case NV_MEMORY_CACHED:
+        //case NV_MEMORY_WRITEBACK:
+            /*
+             * RAM is cached on Linux by default, we can assume there's
+             * nothing to be done here. This is not the case for the
+             * other memory spaces: as commented on above, we will have
+             * added a WC MTRR for the AGP aperture (or else aborted
+             * AGP initialization), and we will have made an attempt to
+             * add a WC MTRR for the frame buffer.
+             *
+             * If a WC MTRR is present, we can't satisfy the WB mapping
+             * attempt here, since the achievable effective memory
+             * types in that case are WC and UC, if not it's typically
+             * UC (MTRRdefType is UC); we could only satisfy WB mapping
+             * requests with a WB MTRR.
+             */
+            if (memory_type == NV_MEMORY_TYPE_SYSTEM)
+                break;
         //case NV_MEMORY_WRITETHRU:
         //case NV_MEMORY_WRITEPROTECT:
         default:
             nv_printf(NV_DBG_ERRORS,
-                "NVRM: memory caching type 0x%x not supported for memory space %d!\n",
+                "NVRM: VM: memory type %d not supported for memory space %d!\n",
                 cache_type, memory_type);
             return 1;
     }
@@ -2118,8 +2157,13 @@
         for (j = i; j < (i + pages); j++)
         {
             nv_verify_page_mappings(at->page_table[j], NV_ALLOC_MAPPING(at->flags));
+#if defined(NV_VM_INSERT_PAGE_PRESENT)
+            if (NV_VM_INSERT_PAGE(vma, start,
+                    NV_GET_PAGE_STRUCT(at->page_table[j]->phys_addr)))
+#else
             if (NV_REMAP_PAGE_RANGE(start, at->page_table[j]->phys_addr,
                     PAGE_SIZE, vma->vm_page_prot))
+#endif
             {
                 NV_ATOMIC_DEC(at->usage_count);
                 return -EAGAIN;
@@ -2429,9 +2473,9 @@
     mod_timer(&nvl->rc_timer, jiffies + HZ);  /* set another timeout in 1 second */
 }
 
-#if defined(NV_PM_SUPPORT_APM)
+#if defined(NV_PM_SUPPORT_OLD_STYLE_APM)
 /* kernel calls us with a power management event */
-int
+static int
 nv_kern_apm_event(
     struct pm_dev *dev,
     pm_request_t rqst,
@@ -2466,7 +2510,6 @@
 
     switch (rqst)
     {
-#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
         case PM_RESUME:
             nv_printf(NV_DBG_INFO, "NVRM: APM: received resume event\n");
             status = rm_power_management(nv, 0, NV_PM_APM_RESUME);
@@ -2476,15 +2519,12 @@
             nv_printf(NV_DBG_INFO, "NVRM: APM: received suspend event\n");
             status = rm_power_management(nv, 0, NV_PM_APM_SUSPEND);
             break;
-#endif
 
-#if defined(KERNEL_2_4)
         // 2.4 kernels sent a PM_SAVE_STATE request when powering down via
         // ACPI. just ignore it and return success so the power down works
         case PM_SAVE_STATE:
             status = RM_OK;
             break;
-#endif
 
         default:
             nv_printf(NV_DBG_WARNINGS, "NVRM: APM: unsupported event: %d\n", rqst);
@@ -2496,7 +2536,7 @@
 
     return status;
 }
-#endif
+#endif /* defined(NV_PM_SUPPORT_OLD_STYLE_APM) */
 
 /*
 ** nv_kern_ctl_open
@@ -3739,6 +3779,7 @@
     nvl = &nv_linux_devices[num_nv_devices];
     nv  = NV_STATE_PTR(nvl);
 
+    pci_set_drvdata(dev, (void *)nvl);
     nvl->dev          = dev;
     nv->vendor_id     = dev->vendor;
     nv->device_id     = dev->device;
@@ -3816,11 +3857,10 @@
 #endif
 }
 
-#if defined(NV_PM_SUPPORT_ACPI)
+#if defined(NV_PM_SUPPORT_DEVICE_DRIVER_MODEL)
 
-int
-nv_acpi_event
-(
+static int
+nv_power_management(
     struct pci_dev *dev, 
     u32 state
 )
@@ -3828,70 +3868,77 @@
     nv_state_t *nv;
     nv_linux_state_t *lnv = NULL;
     int status = RM_OK;
-    U032 i;
 
-    nv_printf(NV_DBG_INFO, "NVRM: nv_acpi_event: %d\n", state);
-
-    for (i = 0; i < num_nv_devices; i++)
-    {
-        if (nv_linux_devices[i].dev == dev)
-        {
-            lnv = &nv_linux_devices[i];
-            break;
-        }
-    }
+    nv_printf(NV_DBG_INFO, "NVRM: nv_power_management: %d\n", state);
+    lnv = pci_get_drvdata(dev);
 
     if ((!lnv) || (lnv->dev != dev))
     {
-        nv_printf(NV_DBG_WARNINGS, "NVRM: ACPI: invalid device!\n");
+        nv_printf(NV_DBG_WARNINGS, "NVRM: PM: invalid device!\n");
         return -1;
     }
 
     nv = NV_STATE_PTR(lnv);
+    nv_verify_pci_config(NV_STATE_PTR(lnv), TRUE);
 
     switch (state)
     {
-        case PM_SUSPEND_MEM:
+#if defined(NV_PM_SUPPORT_NEW_STYLE_APM)
+        case PCI_D3hot:
+            nv_printf(NV_DBG_INFO, "NVRM: APM: received suspend event\n");
+            status = rm_power_management(nv, 0, NV_PM_APM_SUSPEND);
+            break;
+
+        case PCI_D0:
+            nv_printf(NV_DBG_INFO, "NVRM: APM: received resume event\n");
+            status = rm_power_management(nv, 0, NV_PM_APM_RESUME);
+            break;
+#else
+        case PCI_D3hot:
             nv_printf(NV_DBG_INFO, "NVRM: ACPI: received suspend event\n");
             status = rm_power_management(nv, 0, NV_PM_ACPI_STANDBY);
             break;
 
-        case PM_SUSPEND_ON:
+        case PCI_D0:
             nv_printf(NV_DBG_INFO, "NVRM: ACPI: received resume event\n");
             status = rm_power_management(nv, 0, NV_PM_ACPI_RESUME);
             break;
-
+#endif
         default:
-            nv_printf(NV_DBG_WARNINGS, "NVRM: ACPI: unsupported event: %d\n", state);
+            nv_printf(NV_DBG_WARNINGS, "NVRM: PM: unsupported event: %d\n", state);
             return -1;
     }
 
     if (status != RM_OK)
-        nv_printf(NV_DBG_ERRORS, "NVRM: ACPI: failed event: %d\n", state);
+        nv_printf(NV_DBG_ERRORS, "NVRM: PM: failed event: %d\n", state);
 
     return status;
 }
 
-int
-nv_kern_acpi_standby
-(
-    struct pci_dev *dev, 
-    u32 state
+static int nv_kern_suspend(
+    struct pci_dev *dev,
+    pm_message_t state
 )
 {
-    return nv_acpi_event(dev, state);
+    int power_state = -1;
+
+#if !defined(NV_PM_MESSAGE_T_PRESENT)
+    power_state = state;
+#elif defined(NV_PCI_CHOOSE_STATE_PRESENT)
+    power_state = pci_choose_state(dev, state);
+#endif
+
+    return nv_power_management(dev, power_state);
 }
 
-int
-nv_kern_acpi_resume
-(
+static int nv_kern_resume(
     struct pci_dev *dev
 )
 {
-    return nv_acpi_event(dev, PM_SUSPEND_ON);
+    return nv_power_management(dev, PCI_D0);
 }
 
-#endif
+#endif /* defined(NV_PM_SUPPORT_DEVICE_DRIVER_MODEL) */
 
 void* NV_API_CALL nv_get_adapter_state(
     U016 bus,



Další informace o konferenci Linux