[ltp] fglrx + 2.6.11-rc2
Thomas Hartwig
linux-thinkpad@linux-thinkpad.org
Thu, 03 Feb 2005 10:07:41 +0100
This is a multi-part message in MIME format.
--------------070702070206020405060606
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Attached is a patch which compiles (with some warnings) fglrx
6.8.8-8.8.25-1 with 2.6.11-rc2. (I collected this from
http://www.rage3d.com/board/showthread.php?t=33798874&page=2&pp=30&highlight=drm_agp_t)
However I can't not use this because rewake from suspend does not work
any more on a FC3 T40p, despite the radeon from xorg 6.8 works well.
The only reason I tried this, was the "rumor" of less power consumption
by the ati drivers against unpatched radeon drivers, see here for examples:
http://www.sas.upenn.edu/~vbraun/computing/T41/power.html
I made some short tests, but can't see a significant difference, so I
will step back to radeon. What do you think, do you have expiriences
with newest drivers?
Greetings
Thomas
--------------070702070206020405060606
Content-Type: text/plain;
name="fglrx-2.6.11-rc2.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="fglrx-2.6.11-rc2.patch"
diff -Nur build_mod.6.8.8-8.8.25-1/agpgart_be.c build_mod/agpgart_be.c
--- build_mod.6.8.8-8.8.25-1/agpgart_be.c 2004-12-14 18:55:47.000000000 +0100
+++ build_mod/agpgart_be.c 2005-02-02 20:42:27.000000000 +0100
@@ -255,6 +255,12 @@
}
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+#define firegl_pci_find_class(class,from) pci_get_class(class,from)
+#else
+#define firegl_pci_find_class(class,from) pci_find_class(class,from)
+#endif
+
int agp_backend_acquire(void)
{
if (agp_bridge.type == NOT_SUPPORTED) {
@@ -718,7 +724,7 @@
* AGP devices and collect their data.
*/
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
+ while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
device)) != NULL) {
pci_read_config_dword(device, 0x04, &scratch);
@@ -794,6 +800,13 @@
command &= ~0x00000001;
}
}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
/*
* PASS2: Figure out the 4X/2X/1X setting and enable the
* target (our motherboard chipset).
@@ -839,8 +852,9 @@
* command registers.
*/
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
+ while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
device)) != NULL) {
+
pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000))
@@ -871,6 +885,12 @@
}
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
return 0; /* success */
}
@@ -5119,8 +5139,9 @@
* AGP devices and collect their data.
*/
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
+ while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
device)) != NULL) {
+
pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000))
@@ -5187,6 +5208,13 @@
command &= ~0x00000001;
}
}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
/*
* PASS2: Figure out the 4X/2X/1X setting and enable the
* target (our motherboard chipset).
@@ -5217,8 +5245,9 @@
* command registers.
*/
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
+ while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8,
device)) != NULL) {
+
pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000))
@@ -5249,6 +5278,12 @@
}
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
return(0); /* success */
}
@@ -6494,10 +6529,10 @@
// locate host bridge device
#ifdef __x86_64__
do {
- dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev);
+ dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev);
} while((dev) && !agp_check_supported_device(dev));
#else
- if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL)
+ if ((dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL)
return -ENODEV;
#endif
@@ -7040,8 +7075,12 @@
&agp_bridge.mode);
return hp_zx1_setup(dev);
}
- dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev);
+ dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev);
} while (dev);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ if(dev) pci_dev_put(dev);
+#endif
return -ENODEV;
}
#endif /* __ia64__ */
@@ -7462,6 +7501,11 @@
agp_bridge.free_gatt_table();
vfree(agp_bridge.key_list);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ // decrease the reference count.
+ pci_dev_put(agp_bridge.dev);
+#endif
+
if (agp_bridge.needs_scratch_page == TRUE) {
agp_bridge.scratch_page &= ~(0x00000fff);
agp_bridge.agp_destroy_page((unsigned long)
diff -Nur build_mod.6.8.8-8.8.25-1/firegl_public.c build_mod/firegl_public.c
--- build_mod.6.8.8-8.8.25-1/firegl_public.c 2005-01-05 02:05:05.000000000 +0100
+++ build_mod/firegl_public.c 2005-02-02 20:53:18.000000000 +0100
@@ -88,6 +88,7 @@
#include <linux/smp_lock.h>
// newer SuSE kernels need this
#include <linux/highmem.h>
+#include <linux/pagemap.h> // for lock_page and unlock_page
#if defined(__ia64__)
#include <linux/vmalloc.h>
@@ -1569,13 +1570,22 @@
{
unsigned long pte_linear;
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;
pte_linear = VMALLOC_VMADDR(virtual_addr); // convert to pte linear address (x86 => nop)
pgd_p = pgd_offset(mm, pte_linear);
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
+
#ifndef FGL_ATOMIC_PTE
#if LINUX_VERSION_CODE > 0x020500
pte_p = pte_offset_kernel(pmd_p, pte_linear);
@@ -1983,6 +1993,9 @@
unsigned long address)
{
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;
@@ -2070,7 +2083,12 @@
/* alternatively we could generate a NOPAGE_OOM "out of memory" */
}
/* locate medium level page table (x86 => nop) */
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
if (!pmd_present(*pmd_p))
{
__KE_ERROR("FATAL ERROR: User queue buffer not present! (pmd)\n");
@@ -2435,13 +2453,21 @@
{
unsigned long pte_linear;
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;
pte_linear = VMALLOC_VMADDR(virtual_addr); // convert to pte linear address (x86 => nop)
pgd_p = pgd_offset(vma->vm_mm, pte_linear);
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,10) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
#ifndef FGL_ATOMIC_PTE
#if LINUX_VERSION_CODE > 0x020500
pte_p = pte_offset_kernel(pmd_p, pte_linear);
@@ -2590,13 +2616,13 @@
#endif /* __ia64__ */
vma->vm_flags |= VM_IO; /* not in core dump */
}
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
vma->vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
@@ -2657,13 +2683,13 @@
{
if (__ke_vm_offset(vma) >= __pa(high_memory))
vma->vm_flags |= VM_IO; /* not in core dump */
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
#ifdef __x86_64__
@@ -2694,13 +2720,13 @@
{
if (__ke_vm_offset(vma) >= __pa(high_memory))
vma->vm_flags |= VM_IO; /* not in core dump */
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
#ifdef __x86_64__
@@ -2744,6 +2770,37 @@
#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= 0x02060b
+
+typedef struct {
+ void (*free_memory)(struct agp_memory *);
+ struct agp_memory * (*allocate_memory)(size_t, u32);
+ int (*bind_memory)(struct agp_memory *, off_t);
+ int (*unbind_memory)(struct agp_memory *);
+ void (*enable)(u32);
+ int (*acquire)(void);
+ void (*release)(void);
+ int (*copy_info)(struct agp_kern_info *);
+} drm_agp_t;
+
+static const drm_agp_t drm_agp = {
+ &agp_free_memory,
+ &agp_allocate_memory,
+ &agp_bind_memory,
+ &agp_unbind_memory,
+ &agp_enable,
+ &agp_backend_acquire,
+ &agp_backend_release,
+ &agp_copy_info
+};
+#undef DRM_AGP_MODULE_GET
+#undef DRM_AGP_MODULE_PUT
+
+#define DRM_AGP_MODULE_GET &drm_agp
+#define DRM_AGP_MODULE_PUT
+
+#endif
+
static const drm_agp_t *drm_agp_module_stub = NULL;
#define AGP_FUNCTIONS 8
--------------070702070206020405060606--