Common subdirectories: a/2.6.x and b/2.6.x diff -u common/lib/modules/fglrx/build_mod/firegl_public.c common.new/lib/modules/fglrx/build_mod//firegl_public.c --- common/lib/modules/fglrx/build_mod//firegl_public.c 2008-08-07 14:52:00.000000000 -0400 +++ common.new/lib/modules/fglrx/build_mod//firegl_public.c 2008-08-07 14:52:58.000000000 -0400 @@ -62,10 +62,10 @@ * distribution would even include such a kernel patch. */ #ifdef CONFIG_MEM_MIRROR /* Prevent asm/mm_track.h from being included in subsequent - * kernel headers as that would redefine CONFIG_MEM_MIRROR. */ + * kernel headers as that would redefine CONFIG_MEM_MIRROR. */ #ifndef CONFIG_X86_64 #define __I386_MMTRACK_H__ -#define mm_track(ptep) +#define mm_track(ptep) #else #define __X86_64_MMTRACK_H__ #define mm_track_pte(ptep) @@ -93,7 +93,7 @@ #include #include #include -#include +//#include #include #include #include @@ -151,8 +151,8 @@ #include "linux/freezer.h" #endif -// For 2.6.18 or higher, the UTS_RELEASE is defined in the linux/utsrelease.h. -#ifndef UTS_RELEASE +// For 2.6.18 or higher, the UTS_RELEASE is defined in the linux/utsrelease.h. +#ifndef UTS_RELEASE #include #endif @@ -215,7 +215,7 @@ static void ATI_API_CALL __ke_printstr(const char *str); -static struct pci_device_id fglrx_pci_table[] = +static struct pci_device_id fglrx_pci_table[] = { #define FGL_ASIC_ID(x) \ { \ @@ -283,7 +283,7 @@ static int firegl_pat_enabled = 0; static unsigned long KCL_pat[2]; -static unsigned long KCL_orig_pat[2]; +static unsigned long KCL_orig_pat[2]; static int ATI_API_CALL KCL_enable_pat(void); static void ATI_API_CALL KCL_disable_pat(void); @@ -322,7 +322,7 @@ #endif __ke_ssize_t ip_firegl_read( struct file *filp, - char *buf, + char *buf, __ke_size_t size, __ke_loff_t *off_ptr) { @@ -334,7 +334,7 @@ } __ke_ssize_t ip_firegl_write( struct file *filp, - const char *buf, + const char *buf, __ke_size_t size, __ke_loff_t *off_ptr) { @@ -477,34 +477,34 @@ return firegl_debug_proc_write(file, buffer, count, data); } -static int +static int firegl_interrupt_open_wrap( - struct inode *inode, - struct file *file) + struct inode *inode, + struct file *file) { return firegl_interrupt_open(inode, file); } -static int +static int firegl_interrupt_release_wrap( - struct inode *inode, - struct file *file) + struct inode *inode, + struct file *file) { return firegl_interrupt_release(inode, file); } -static ssize_t +static ssize_t firegl_interrupt_read_wrap( - struct file *user_file, - char __user *user_buf, - size_t user_buf_size, + struct file *user_file, + char __user *user_buf, + size_t user_buf_size, loff_t *user_file_pos) { return (ssize_t) firegl_interrupt_read(user_file, user_buf, user_buf_size, user_file_pos); } -static unsigned int -firegl_interrupt_poll_wrap(struct file *user_file, poll_table *pt) +static unsigned int +firegl_interrupt_poll_wrap(struct file *user_file, poll_table *pt) { if(firegl_interrupt_poll(user_file, (__ke_poll_table*)pt)) { @@ -516,11 +516,11 @@ } } -static ssize_t +static ssize_t firegl_interrupt_write_wrap( - struct file *user_file, - const char __user *user_buf, - size_t user_buf_size, + struct file *user_file, + const char __user *user_buf, + size_t user_buf_size, loff_t *user_file_pos) { return (ssize_t) firegl_interrupt_write(user_file, user_buf, user_buf_size, user_file_pos); @@ -530,7 +530,7 @@ * \param func function to be wrapped * \return None */ -static void +static void firegl_smp_func_parameter_wrap( void *func) { @@ -545,7 +545,7 @@ .write = firegl_interrupt_write_wrap }; -__ke_proc_list_t firegl_proc_list[] = +__ke_proc_list_t firegl_proc_list[] = { { "name", drm_name_info_wrap, NULL}, { "mem", drm_mem_info_wrap, NULL}, @@ -613,11 +613,11 @@ { ent->proc_fops = (struct file_operations*)list->fops; } - + { ent->data = (dev->pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev); } - + list++; } @@ -663,7 +663,7 @@ { remove_proc_entry("dri", NULL); __KE_DEBUG("remove proc dri. \n"); - } + } return 0; } @@ -701,12 +701,12 @@ { int i; int count = 0; - + __KE_DEBUG("firegl_stub_getminor: name=\"%s\"\n", name); - for( i = 0; i < FIREGL_STUB_MAXCARDS; i++ ) + for( i = 0; i < FIREGL_STUB_MAXCARDS; i++ ) { - if( !firegl_stub_list[i].fops ) + if( !firegl_stub_list[i].fops ) { firegl_stub_list[i].name = name; firegl_stub_list[i].fops = fops; @@ -733,16 +733,16 @@ if (minor < 0 || minor >= FIREGL_STUB_MAXCARDS) { return -1; - } + } firegl_proc_cleanup(minor, firegl_stub_root, firegl_stub_list[minor].dev_root, firegl_stub_list[minor].proclist); firegl_stub_list[minor].name = NULL; firegl_stub_list[minor].fops = NULL; firegl_stub_list[minor].proclist = NULL; - if( minor == (firegl_minors-1) ) + if( minor == (firegl_minors-1) ) { unregister_chrdev(DRM_MAJOR, "drm"); - } + } return 0; } @@ -766,7 +766,7 @@ return -1; } else if(err == -EBUSY) { - // the registering of the module's device has failed + // the registering of the module's device has failed // because there was already some other drm module loaded. __KE_DEBUG("register_chrdev() failed with -EBUSY\n"); return -1; @@ -798,7 +798,7 @@ /* Starting from 2.6.14, kernel has new struct defined for pm_message_t, we have to handle this case separately. 2.6.11/12/13 kernels have pm_message_t defined as int and older kernels - don't have pm_message_t defined. + don't have pm_message_t defined. */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) static int fglrx_pci_suspend(struct pci_dev *pdev, pm_message_t pm_event) @@ -834,9 +834,9 @@ if (!ret) { - - // since privdev->pcidev is acquired in X server, use pdev - // directly here to allow suspend/resume without X server start. + + // since privdev->pcidev is acquired in X server, use pdev + // directly here to allow suspend/resume without X server start. firegl_pci_save_state((__ke_pci_dev_t*)pdev, privdev); pci_disable_device(pdev); PMSG_EVENT(pdev->dev.power.power_state) = state; @@ -888,13 +888,13 @@ // before pci_set_master! firegl_pci_restore_state((__ke_pci_dev_t*)pdev, privdev); - if (pci_enable_device(pdev)) + if (pci_enable_device(pdev)) { __KE_ERROR("Cannot enable PCI device.\n"); - } + } pci_set_master(pdev); - + firegl_cail_powerup(privdev); if (PMSG_EVENT(pdev->dev.power.power_state) == PM_EVENT_SUSPEND) @@ -905,7 +905,7 @@ return 0; } -static struct pci_driver fglrx_pci_driver = +static struct pci_driver fglrx_pci_driver = { .name = "fglrx_pci", .id_table = fglrx_pci_table, @@ -961,10 +961,10 @@ { pid = (struct pci_device_id *) &fglrx_pci_table[i]; pdev = NULL; - while (( pdev = pci_get_subsys(pid->vendor, - pid->device, - PCI_ANY_ID, - PCI_ANY_ID, + while (( pdev = pci_get_subsys(pid->vendor, + pid->device, + PCI_ANY_ID, + PCI_ANY_ID, pdev)) != NULL) { num_of_devices++; @@ -974,7 +974,7 @@ if (firegl_init_device_heads(num_of_devices)) { - return -ENOMEM; + return -ENOMEM; } for (i=0; fglrx_pci_table[i].vendor != 0; i++) @@ -982,15 +982,15 @@ pid = (struct pci_device_id *) &fglrx_pci_table[i]; pdev = NULL; - while (( pdev = pci_get_subsys(pid->vendor, - pid->device, - PCI_ANY_ID, - PCI_ANY_ID, + while (( pdev = pci_get_subsys(pid->vendor, + pid->device, + PCI_ANY_ID, + PCI_ANY_ID, pdev)) != NULL) { if ((ret_code = firegl_get_dev(pubdev, pdev))) { - return ret_code; + return ret_code; } j++; @@ -1023,7 +1023,7 @@ // init global vars that are in fact constants __ke_HZ = HZ; -#ifdef _KE_SERIAL_DEBUG +#ifdef _KE_SERIAL_DEBUG __ke_SetSerialPort(); #endif @@ -1035,11 +1035,11 @@ return retcode; } -#ifdef FIREGL_CF_SUPPORT +#ifdef FIREGL_CF_SUPPORT adapter_chain_init(); cf_object_init(); -#endif - +#endif + // init DRM proc list drm_proclist = kmalloc((DRM_PROC_ENTRIES + 1) * sizeof(__ke_proc_list_t), GFP_KERNEL); if ( drm_proclist == NULL ) @@ -1127,7 +1127,7 @@ dev->pubdev.date, firegl_minors); - + #ifdef FIREGL_POWER_MANAGEMENT if (pci_register_driver (&fglrx_pci_driver) < 0) { @@ -1157,12 +1157,12 @@ { KCL_disable_pat(); __KE_INFO("Disable PAT\n"); - } + } #endif // FIREGL_USWC_SUPPORT for (i = 0; i < count; i++) { - if ( firegl_stub_unregister(i) ) + if ( firegl_stub_unregister(i) ) { __KE_ERROR("Cannot unload module on minor: %d\n", i); } @@ -1184,10 +1184,10 @@ dev->pubdev.patchlevel, dev->pubdev.date); -#ifdef FIREGL_CF_SUPPORT +#ifdef FIREGL_CF_SUPPORT cf_object_cleanup(); - adapter_chain_cleanup(); -#endif // FIREGL_CF_SUPPORT + adapter_chain_cleanup(); +#endif // FIREGL_CF_SUPPORT firegl_private_cleanup (&dev->pubdev); @@ -1265,18 +1265,18 @@ void ATI_API_CALL __ke_remove_wait_queue(__ke_wait_queue_head_t* queue_head, __ke_wait_queue_t* entry) { // current->state = TASK_RUNNING; - remove_wait_queue((wait_queue_head_t*)(void *)queue_head, + remove_wait_queue((wait_queue_head_t*)(void *)queue_head, (wait_queue_t*)(void *)entry); } void ATI_API_CALL __ke_init_waitqueue_head(__ke_wait_queue_head_t* queue_head) { - init_waitqueue_head((wait_queue_head_t*)(void *)queue_head); + init_waitqueue_head((wait_queue_head_t*)(void *)queue_head); } void ATI_API_CALL __ke_wait_event_interruptible(__ke_wait_queue_head_t* queue_head, int condition) { - wait_event_interruptible(*((wait_queue_head_t*)(void *)queue_head), condition); + wait_event_interruptible(*((wait_queue_head_t*)(void *)queue_head), condition); } void ATI_API_CALL __ke_poll_wait(struct file* filp, __ke_wait_queue_head_t* queue_head, __ke_poll_table* pt) @@ -1287,13 +1287,13 @@ void ATI_API_CALL *__ke_asyncio_alloc_sema() { int i; - + for(i=0; i= KERNEL_VERSION(2,6,17) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) rcu_read_lock(); -#else +#else read_lock(&tasklist_lock); -#endif - p = find_task_by_pid( pid ); - if (p) +#endif + p = find_task_by_vpid( pid ); + if (p) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) - if (p->exit_state != EXIT_ZOMBIE && p->exit_state != EXIT_DEAD) + if (p->exit_state != EXIT_ZOMBIE && p->exit_state != EXIT_DEAD) #else - if (!(p->flags & PF_EXITING)) + if (!(p->flags & PF_EXITING)) #endif { process_terminated = 0; } - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) + } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17) rcu_read_unlock(); -#else +#else read_unlock(&tasklist_lock); -#endif +#endif return process_terminated; } -/** /brief Call global OS kernel task/thread scheduler +/** /brief Call global OS kernel task/thread scheduler * /return Nonzero if a system call was awakened by a signal */ int ATI_API_CALL KCL_GetSignalStatus(void) @@ -1483,15 +1483,15 @@ unblock_all_signals(); } -#if defined(__i386__) +#if defined(__i386__) #ifndef __HAVE_ARCH_CMPXCHG -static inline -unsigned long __fgl_cmpxchg(volatile void *ptr, unsigned long old, - unsigned long new, int size) -{ - unsigned long prev; - switch (size) { - case 1: +static inline +unsigned long __fgl_cmpxchg(volatile void *ptr, unsigned long old, + unsigned long new, int size) +{ + unsigned long prev; + switch (size) { + case 1: __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) @@ -1602,7 +1602,7 @@ */ KCL_TYPE_Pid ATI_API_CALL KCL_GetPid(void) { - return current->pid; + return current->pid; } /** /brief Return the current Thread Group ID @@ -1610,7 +1610,7 @@ */ KCL_TYPE_Pid ATI_API_CALL KCL_GetTgid(void) { - return current->tgid; + return current->tgid; } /** /brief Return the effective user ID @@ -1706,7 +1706,7 @@ 1 #else 0 -#endif +#endif }; /** /brief Check whether a kernel configuration parameter is defined @@ -1792,13 +1792,13 @@ #if defined(__x86_64__) || defined(__ia64__) void* ATI_API_CALL __ke_pci_alloc_consistent(__ke_pci_dev_t* dev, int size, void *dma_handle) { - return (pci_alloc_consistent( (struct pci_dev*)(void *)dev, size, dma_handle)); + return (pci_alloc_consistent( (struct pci_dev*)(void *)dev, size, dma_handle)); } void ATI_API_CALL __ke_pci_free_consistent(__ke_pci_dev_t* dev, int size, unsigned long cpu_addr, unsigned int dma_handle) { - pci_free_consistent( (struct pci_dev*)(void *)dev, size, (void *)cpu_addr, + pci_free_consistent( (struct pci_dev*)(void *)dev, size, (void *)cpu_addr, (unsigned long)dma_handle); } #endif // __ia64__ @@ -1822,7 +1822,7 @@ /** \brief This function maps OS independent error conditions to OS defined error codes * \param errcode OS independent error condition code - * \return OS kernel defined error code corresponding to the requested error condition + * \return OS kernel defined error code corresponding to the requested error condition */ int ATI_API_CALL KCL_GetErrorCode(KCL_ENUM_ErrorCode errcode) { @@ -1840,7 +1840,7 @@ int ATI_API_CALL firegl_get_user_ptr(u32 *src, void **dst) { unsigned long temp; - int err = get_user(temp, src); + int err = get_user(temp, src); *dst = (void*) temp; return err; } @@ -2019,7 +2019,7 @@ */ int ATI_API_CALL KCL_AtomicDecAndTest(KCL_TYPE_Atomic* v) { - return atomic_dec_and_test((atomic_t*)v); + return atomic_dec_and_test((atomic_t*)v); } /*****************************************************************************/ @@ -2394,7 +2394,7 @@ struct page *page = NULL; page = vmalloc_to_page(vmalloc_addr); - if(page == NULL) + if(page == NULL) { __KE_ERROR("__ke_vmalloc_to_addr: invalid page!"); return NULL; @@ -2436,7 +2436,7 @@ retcode = do_munmap(current->mm, addr, len); -#endif +#endif up_write(¤t->mm->mmap_sem); return retcode; } @@ -2480,10 +2480,10 @@ minus = !minus; } else - { + { ubase = base; } - + do_div(un, ubase); return (minus? -un : un); } @@ -2513,7 +2513,7 @@ else { ubase = base; - } + } rem = do_div(un, ubase); return (minus? -rem : rem); @@ -2544,7 +2544,7 @@ vaddr = (void *) vmap(pages, count); #else #ifdef VM_MAP - vaddr = (void *) vmap(pages, count, VM_MAP, PAGE_KERNEL); + vaddr = (void *) vmap(pages, count, VM_MAP, PAGE_KERNEL); #else vaddr = (void *) vmap(pages, count, 0, PAGE_KERNEL); #endif @@ -2600,7 +2600,7 @@ } #endif // defined(VM_MAP) || defined(vunmap) -/** \brief Reserve a memory page +/** \brief Reserve a memory page * * \param pt Kernel logical address of the page * @@ -2612,7 +2612,7 @@ SetPageReserved(virt_to_page((unsigned long)pt)); } -/** \brief Unreserve a memory page +/** \brief Unreserve a memory page * * \param pt Kernel logical address of the page * @@ -2624,7 +2624,7 @@ ClearPageReserved(virt_to_page((unsigned long)pt)); } -/** \brief Lock a memory page +/** \brief Lock a memory page * * \param pt Kernel logical address of the page * @@ -2633,14 +2633,14 @@ */ void ATI_API_CALL KCL_LockMemPage(void* pt) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) SetPageReserved(virt_to_page((unsigned long)pt)); #else lock_page(virt_to_page((unsigned long)pt)); #endif } -/** \brief Unlock a memory page +/** \brief Unlock a memory page * * \param pt Kernel logical address of the page * @@ -2649,7 +2649,7 @@ */ void ATI_API_CALL KCL_UnlockMemPage(void* pt) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ClearPageReserved(virt_to_page((unsigned long)pt)); #else unlock_page(virt_to_page((unsigned long)pt)); @@ -2674,7 +2674,7 @@ return memory->vmptr; } #endif - + void* ATI_API_CALL __ke_ioremap(unsigned long offset, unsigned long size) { return ioremap(offset, size); @@ -3235,7 +3235,7 @@ { #ifdef __SMP__ /* write back invalidate all other CPUs (exported by kernel) */ - if (smp_call_function(deferred_flush, NULL, 1, 0) != 0) + if (smp_call_function(deferred_flush, NULL, 0) != 0) panic("timed out waiting for the other CPUs!\n"); /* invalidate this CPU */ @@ -3279,7 +3279,7 @@ return 0; #else return 1; -#endif +#endif #else /* !CONFIG_MTRR */ return 0; #endif /* !CONFIG_MTRR */ @@ -3305,7 +3305,7 @@ int ATI_API_CALL __ke_has_vmap(void) { -// We disable vmap for 2.4.x kernel to work around the big memory( > 4GB ) issue. +// We disable vmap for 2.4.x kernel to work around the big memory( > 4GB ) issue. #if defined(VM_MAP) || defined(vunmap) return 1; #else @@ -3372,7 +3372,7 @@ { struct pci_dev* dev = (struct pci_dev*)pcidev; return PCI_FUNC(dev->devfn); -} +} __ke_dma_addr_t ATI_API_CALL __ke_pci_map_single (__ke_pci_dev_t *pdev, void *buffer, __ke_size_t size, int direction) { @@ -3525,12 +3525,12 @@ return (int)(agpmem->page_count); } -void ATI_API_CALL __ke_agp_memory_get_memory(struct _agp_memory* agpmem, +void ATI_API_CALL __ke_agp_memory_get_memory(struct _agp_memory* agpmem, unsigned long **memory_ptr) { __KE_DEBUG("[%s] agpmem=0x%016lx agpmem->memory=0x%016lx [0]=0x%016x", - __FUNCTION__, - (unsigned long)agpmem, + __FUNCTION__, + (unsigned long)agpmem, (unsigned long)agpmem->memory, (agpmem->memory)[0]); @@ -3539,18 +3539,9 @@ /*****************************************************************************/ -#ifndef NOPAGE_SIGBUS -#define NOPAGE_SIGBUS 0 -#endif /* !NOPAGE_SIGBUS */ - typedef struct page mem_map_t; typedef mem_map_t *vm_nopage_ret_t; -static __inline__ vm_nopage_ret_t do_vm_nopage(struct vm_area_struct* vma, - unsigned long address) -{ - return 0; /* Disallow mremap */ -} #ifdef __AGP__BUILTIN__ #ifdef __ia64__ @@ -3575,19 +3566,20 @@ return page; } } - return NOPAGE_SIGBUS; /* Disallow mremap */ + return VM_FAULT_SIGBUS; /* Disallow mremap */ } #endif /* __ia64__ */ #endif /* __AGP__BUILTIN__ */ -static __inline__ vm_nopage_ret_t do_vm_shm_nopage(struct vm_area_struct* vma, - unsigned long address) +static __inline__ int do_vm_shm_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf) { pgd_t* pgd_p; pmd_t* pmd_p; pte_t pte; + unsigned long address = (unsigned long)vmf->virtual_address; unsigned long vma_offset; unsigned long pte_linear; mem_map_t* pMmPage; @@ -3616,7 +3608,7 @@ (unsigned long)__ke_vm_offset(vma)); if (address > vma->vm_end) - return NOPAGE_SIGBUS; /* address is out of range */ + return VM_FAULT_SIGBUS; /* address is out of range */ /* Calculate offset into VMA */ vma_offset = address - vma->vm_start; @@ -3628,7 +3620,7 @@ pte_linear = firegl_get_addr_from_vm(vma); if (!pte_linear) { - return NOPAGE_SIGBUS; /* bad address */ + return VM_FAULT_SIGBUS; /* bad address */ } pte_linear += vma_offset; @@ -3656,7 +3648,9 @@ // __KE_DEBUG3("vm-address 0x%08lx => kernel-page-address 0x%p\n", // address, page_address(pMmPage)); - return pMmPage; + vmf->page = pMmPage; + + return 0; } /* @@ -3665,8 +3659,10 @@ (which is one ore more pages in size) */ -static __inline__ vm_nopage_ret_t do_vm_dma_nopage(struct vm_area_struct* vma, unsigned long address) +static __inline__ int do_vm_dma_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf) { + unsigned long address = (unsigned long) vmf->virtual_address; unsigned long kaddr; mem_map_t* pMmPage; @@ -3682,7 +3678,7 @@ kaddr = firegl_get_addr_from_vm(vma); if (!kaddr) { - return NOPAGE_SIGBUS; /* bad address */ + return VM_FAULT_SIGBUS; /* bad address */ } kaddr += (address - vma->vm_start); @@ -3694,19 +3690,23 @@ // with drm_alloc_pages, which marks all pages as reserved. Reserved // pages' usage count is not decremented by the kernel during unmap!!! // - // For kernel >= 2.6.15, We should reenable this, because the VM sub-system - // will decrement the pages' usage count even for the pages marked as reserved + // For kernel >= 2.6.15, We should reenable this, because the VM sub-system + // will decrement the pages' usage count even for the pages marked as reserved // - MC. get_page(pMmPage); /* inc usage count of page */ #endif __KE_DEBUG3("vm-address 0x%08lx => kernel-page-address 0x%p\n", address, page_address(pMmPage)); - return pMmPage; + vmf->page = pMmPage; + + return 0; } -static __inline__ vm_nopage_ret_t do_vm_kmap_nopage(struct vm_area_struct* vma, unsigned long address) +static __inline__ int do_vm_kmap_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf) { + unsigned long address = (unsigned long) vmf->virtual_address; unsigned long kaddr; mem_map_t* pMmPage; @@ -3716,13 +3716,14 @@ if ((pMmPage = (mem_map_t*) firegl_get_pagetable_page_from_vm(vma))) { get_page(pMmPage); - return pMmPage; + vmf->page = pMmPage; + return 0; } kaddr = firegl_get_addr_from_vm(vma); if (!kaddr) { - return NOPAGE_SIGBUS; /* bad address */ + return VM_FAULT_SIGBUS; /* bad address */ } kaddr += (address - vma->vm_start); @@ -3735,50 +3736,52 @@ __KE_DEBUG3("vm-address 0x%08lx => kernel-page-address 0x%p\n", address, page_address(pMmPage)); - return pMmPage; + vmf->page = pMmPage; + return 0; } -/** +/** ** - ** This routine is intented to locate the page table through the + ** This routine is intented to locate the page table through the ** pagelist table created earlier in dev-> pcie **/ -static __inline__ vm_nopage_ret_t do_vm_pcie_nopage(struct vm_area_struct* vma, - unsigned long address) +static __inline__ int do_vm_pcie_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf) { + unsigned long address = (unsigned long)vmf->virtual_address; unsigned long vma_offset; - unsigned long i; + unsigned long i; mem_map_t* pMmPage; struct firegl_pcie_mem* pciemem; unsigned long* pagelist; - + drm_device_t *dev = (drm_device_t *)firegl_get_dev_from_vm(vma); if (dev == NULL) { __KE_ERROR("dev is NULL\n"); - return NOPAGE_SIGBUS; + return VM_FAULT_SIGBUS; } if (address > vma->vm_end) { __KE_ERROR("address out of range\n"); - return NOPAGE_SIGBUS; /* address is out of range */ + return VM_FAULT_SIGBUS; /* address is out of range */ } pciemem = firegl_get_pciemem_from_addr ( vma, address); if (pciemem == NULL) { __KE_ERROR("No pciemem found! \n"); - return NOPAGE_SIGBUS; - } + return VM_FAULT_SIGBUS; + } pagelist = firegl_get_pagelist_from_vm(vma); - if (pagelist == NULL) + if (pagelist == NULL) { __KE_ERROR("No pagelist! \n"); - return NOPAGE_SIGBUS; + return VM_FAULT_SIGBUS; } - + /** Find offset in vma */ vma_offset = address - vma->vm_start; /** Which entry in the pagelist */ @@ -3790,15 +3793,17 @@ if (page_address(pMmPage) == 0x0) { __KE_ERROR("Invalid page address\n"); - return NOPAGE_SIGBUS; + return VM_FAULT_SIGBUS; } - return pMmPage; + + vmf->page = pMmPage; + return 0; } -static __inline__ vm_nopage_ret_t do_vm_gart_nopage(struct vm_area_struct* vma, - unsigned long address) +static __inline__ int do_vm_gart_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf) { - + unsigned long address = (unsigned long) vmf->virtual_address; unsigned long page_addr; unsigned long offset; struct page *page; @@ -3806,36 +3811,31 @@ if (address > vma->vm_end) { __KE_ERROR("Invalid virtual address\n"); - return NOPAGE_SIGBUS; /* Disallow mremap */ - } + return VM_FAULT_SIGBUS; /* Disallow mremap */ + } offset = address - vma->vm_start; -#ifdef FIREGL_CF_SUPPORT +#ifdef FIREGL_CF_SUPPORT page_addr = mc_heap_get_page_addr(vma, offset); #else page_addr = firegl_cmmqs_get_pageaddr_from_vm(vma, offset); -#endif +#endif if( !page_addr) { __KE_ERROR("Invalid page address\n"); - return NOPAGE_SIGBUS; /* Disallow mremap */ + return VM_FAULT_SIGBUS; /* Disallow mremap */ } page = virt_to_page(page_addr); get_page(page); - return page; + vmf->page = page; + return 0; } - - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - -static vm_nopage_ret_t vm_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) +static int vm_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - if (type) *type = VM_FAULT_MINOR; - return do_vm_nopage(vma, address); + return VM_FAULT_SIGBUS; } #ifdef __AGP__BUILTIN__ @@ -3867,91 +3867,10 @@ (which is one or more pages in size) */ -static vm_nopage_ret_t vm_shm_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) -{ - if (type) *type = VM_FAULT_MINOR; - return do_vm_shm_nopage(vma, address); -} - -/* - - This routine is intended to remap addresses of a OpenGL context - (which is one ore more pages in size) - -*/ -static vm_nopage_ret_t vm_dma_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) -{ - if (type) *type = VM_FAULT_MINOR; - return do_vm_dma_nopage(vma, address); -} - -static vm_nopage_ret_t vm_kmap_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) -{ - if (type) *type = VM_FAULT_MINOR; - return do_vm_kmap_nopage(vma, address); -} - -static vm_nopage_ret_t vm_pcie_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) -{ - return do_vm_pcie_nopage(vma, address); -} - -static vm_nopage_ret_t vm_gart_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) -{ - return do_vm_gart_nopage(vma, address); -} - -#else /* LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0) */ - -static vm_nopage_ret_t vm_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) -{ - return do_vm_nopage(vma, address); -} - -#ifdef __AGP__BUILTIN__ -#ifdef __ia64__ - - -static vm_nopage_ret_t vm_cant_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) -{ - return do_vm_cant_nopage(vma, address); -} -#endif /* __ia64__ */ -#endif /* __AGP__BUILTIN__ */ - -/* - - This function is called when a page of a mmap()'ed area is not currently - visible in the specified VMA. - Return value is the associated physical address for the requested page. - (If not implemented, then the kernel default routine would allocate a new, - zeroed page for servicing us) - - Possible errors: SIGBUS, OutOfMem - - This routine is intended to remap addresses of SHM SAREA - (which is one or more pages in size) - - */ -static vm_nopage_ret_t vm_shm_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) +static int vm_shm_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - return do_vm_shm_nopage(vma, address); + return do_vm_shm_nopage(vma, vmf); } /* @@ -3960,37 +3879,30 @@ (which is one ore more pages in size) */ -static vm_nopage_ret_t vm_dma_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) +static int vm_dma_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - return do_vm_dma_nopage(vma, address); + return do_vm_dma_nopage(vma, vmf); } -static vm_nopage_ret_t vm_kmap_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) +static int vm_kmap_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - return do_vm_kmap_nopage(vma, address); + return do_vm_kmap_nopage(vma, vmf); } -static vm_nopage_ret_t vm_pcie_nopage(struct vm_area_struct* vma, - unsigned long address, - int write_access) +static int vm_pcie_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - return do_vm_pcie_nopage(vma, address); + return do_vm_pcie_nopage(vma, vmf); } -static vm_nopage_ret_t vm_gart_nopage(struct vm_area_struct* vma, - unsigned long address, - int *type) +static int vm_gart_nopage(struct vm_area_struct* vma, + struct vm_fault *vmf, int type) { - return do_vm_gart_nopage(vma, address); + return do_vm_gart_nopage(vma, vmf); } - -#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) */ - void* ATI_API_CALL __ke_vma_file_priv(struct vm_area_struct* vma) { return vma->vm_file->private_data; @@ -4040,7 +3952,7 @@ *(buf + i++) = pgprot & _PAGE_DIRTY ? 'd' : '-'; *(buf + i++) = pgprot & _PAGE_PSE ? 'm' : 'k'; *(buf + i++) = pgprot & _PAGE_GLOBAL ? 'g' : 'l'; -#endif /* __i386__ */ +#endif /* __i386__ */ *(buf + i++) = 0; return buf; @@ -4069,9 +3981,9 @@ return buf; } -char* ATI_API_CALL __ke_vm_phys_addr_str(struct vm_area_struct* vma, - char* buf, - unsigned long virtual_addr, +char* ATI_API_CALL __ke_vm_phys_addr_str(struct vm_area_struct* vma, + char* buf, + unsigned long virtual_addr, __ke_dma_addr_t* phys_address) { pgd_t* pgd_p; @@ -4174,7 +4086,7 @@ static struct vm_operations_struct vm_ops = { - nopage: ip_vm_nopage, + fault: ip_vm_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; @@ -4183,7 +4095,7 @@ #ifdef __ia64__ static struct vm_operations_struct vm_cant_ops = { - nopage: ip_vm_cant_nopage, + fault: ip_vm_cant_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; @@ -4192,42 +4104,42 @@ static struct vm_operations_struct vm_shm_ops = { - nopage: ip_vm_shm_nopage, + fault: ip_vm_shm_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; static struct vm_operations_struct vm_pci_bq_ops = { - nopage: ip_vm_dma_nopage, + fault: ip_vm_dma_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; static struct vm_operations_struct vm_ctx_ops = { - nopage: ip_vm_dma_nopage, + fault: ip_vm_dma_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; static struct vm_operations_struct vm_pcie_ops = { - nopage: ip_vm_pcie_nopage, + fault: ip_vm_pcie_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; static struct vm_operations_struct vm_kmap_ops = { - nopage: ip_vm_kmap_nopage, + fault: ip_vm_kmap_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; static struct vm_operations_struct vm_gart_ops = { - nopage: ip_vm_gart_nopage, + fault: ip_vm_gart_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; @@ -4236,14 +4148,14 @@ #ifndef __ia64__ static struct vm_operations_struct vm_agp_bq_ops = { - nopage: ip_vm_nopage, + fault: ip_vm_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; #else static struct vm_operations_struct vm_cant_agp_bq_ops = { - nopage: ip_vm_cant_nopage, + fault: ip_vm_cant_nopage, open: ip_drm_vm_open, close: ip_drm_vm_close, }; @@ -4298,7 +4210,7 @@ vma->vm_ops = &vm_ops; break; -#ifdef FIREGL_USWC_SUPPORT +#ifdef FIREGL_USWC_SUPPORT case __KE_ADPT_REG: { #ifdef __ia64__ @@ -4318,7 +4230,7 @@ } else { - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); } } #endif /* __i386__ */ @@ -4337,7 +4249,7 @@ vma->vm_ops = &vm_ops; } break; -#endif +#endif case __KE_SHM: vma->vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */ @@ -4371,7 +4283,7 @@ #ifdef __AGP__BUILTIN__ case __KE_AGP: - // if(dev->agp->cant_use_aperture == 1) + // if(dev->agp->cant_use_aperture == 1) #ifdef __ia64__ { /* @@ -4395,9 +4307,9 @@ if( firegl_pat_enabled ) { vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - } + } } -#endif +#endif if (REMAP_PAGE_RANGE(vma,offset)) { @@ -4414,8 +4326,8 @@ #endif break; case __KE_AGP_BQS: - // if(dev->agp->cant_use_aperture == 1) -#ifdef __ia64__ + // if(dev->agp->cant_use_aperture == 1) +#ifdef __ia64__ { /* * On some systems we can't talk to bus dma address from @@ -4438,9 +4350,9 @@ if( firegl_pat_enabled ) { vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - } + } } -#endif +#endif if (REMAP_PAGE_RANGE(vma,offset)) { @@ -4469,15 +4381,15 @@ break; case __KE_GART_USWC: -#ifdef FIREGL_USWC_SUPPORT +#ifdef FIREGL_USWC_SUPPORT if (boot_cpu_data.x86 > 3) { if( firegl_pat_enabled ) { vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - } + } } -#endif +#endif // fall through case __KE_GART_CACHEABLE: vma->vm_flags |= VM_RESERVED; @@ -4527,7 +4439,7 @@ #define FIREGL_agp_backend_release _X(agp_backend_release) #define FIREGL_agp_memory _X(agp_memory) -unsigned int __ke_firegl_agpgart_inuse = AGPGART_INUSE_NONE; +unsigned int __ke_firegl_agpgart_inuse = AGPGART_INUSE_NONE; #if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) /*****************************************************************************/ @@ -4642,7 +4554,7 @@ int ATI_API_CALL __ke_agpgart_available(__ke_pci_dev_t *pcidev) { drm_agp_module_stub = &drm_agp; - __ke_firegl_agpgart_inuse = KERNEL26_AGPGART_INUSE; + __ke_firegl_agpgart_inuse = KERNEL26_AGPGART_INUSE; { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) firegl_pci_device = (struct pci_dev*)(void*)pcidev; @@ -4778,7 +4690,7 @@ if (AGP_AVAILABLE(copy_info)) { - struct agp_kern_info kern; + struct agp_kern_info kern; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) if (firegl_agp_bridge == NULL) @@ -4876,7 +4788,7 @@ int ATI_API_CALL __ke_read_agp_caps_registers(__ke_pci_dev_t* dev, unsigned int *caps) { - return -EINVAL; + return -EINVAL; } int ATI_API_CALL __ke_agp_acquire(__ke_pci_dev_t* dev) @@ -4913,12 +4825,12 @@ /** \brief Runs a function on all other CPUs * \param func_to_call function to be called on all other cpus - * \return None + * \return None */ -void ATI_API_CALL KCL_CallFuncOnOtherCpus(firegl_void_routine_t func_to_call) +void ATI_API_CALL KCL_CallFuncOnOtherCpus(firegl_void_routine_t func_to_call) { #ifdef CONFIG_SMP - smp_call_function( firegl_smp_func_parameter_wrap, (void*)func_to_call, 0, 1 ); + smp_call_function( firegl_smp_func_parameter_wrap, (void*)func_to_call, 1 ); #endif } @@ -4926,7 +4838,7 @@ int ATI_API_CALL KCL_is_pat_enabled(void) { - return firegl_pat_enabled; + return firegl_pat_enabled; } static int ATI_API_CALL KCL_has_pat(void) @@ -4942,7 +4854,7 @@ { unsigned long cr0=0, cr4=0; unsigned long flags; - + local_irq_save(flags); cr0 = read_cr0() | 0x40000000; write_cr0(cr0); @@ -4973,7 +4885,7 @@ { unsigned long cr0 = 0, cr4 = 0; unsigned long flags; - + local_irq_save(flags); cr0 = read_cr0() | 0x40000000; write_cr0(cr0); @@ -4985,7 +4897,7 @@ write_cr4(cr4 & ~X86_CR4_PGE); } __flush_tlb(); - + wrmsr(MSR_IA32_CR_PAT, KCL_orig_pat[0], KCL_orig_pat[1]); cr0 = read_cr0(); @@ -5008,7 +4920,7 @@ __KE_INFO("USWC is disabled in module parameters\n"); return 0; } - + if (!KCL_has_pat()) { return 0; @@ -5018,18 +4930,18 @@ for ( i = 0; i < 2; i++ ) { - for (j = 0; j < 4; j ++) + for (j = 0; j < 4; j ++) { if (((KCL_orig_pat[i] >> (j * 8)) & 0xFF) == 1) - { + { __KE_ERROR("Pat entry %d is already configured\n", (i+1)*(j+1)); return 0; - } + } } } #ifdef CONFIG_SMP - if (smp_call_function(KCL_setup_pat, NULL, 0, 1) != 0) + if (smp_call_function(KCL_setup_pat, NULL, 1) != 0) return 0; #endif KCL_setup_pat(NULL); @@ -5047,7 +4959,7 @@ } #ifdef CONFIG_SMP - if (smp_call_function(KCL_restore_pat, NULL, 0, 1) != 0) + if (smp_call_function(KCL_restore_pat, NULL, 1) != 0) return; #endif KCL_restore_pat(NULL); @@ -5096,7 +5008,7 @@ } kasContext_t; /** \brief KAS context */ -static kasContext_t kasContext; +static kasContext_t kasContext; /** \brief Kernel support required to enable KAS */ #if defined(cmpxchg) && \ @@ -5398,7 +5310,7 @@ DBG_TRACE("Interrupt handler returned 0x%08X", ret); kasSetExecutionLevel(orig_level); - spin_unlock(&kasContext.lock_ih); + spin_unlock(&kasContext.lock_ih); DBG_LEAVE("%d", ret); return ret; @@ -5673,7 +5585,7 @@ #endif spinlock_t lock; /* OS spinlock object protecting the cache */ unsigned int routine_type; /* Type of routine the cache might be accessed from */ - char name[14]; /* Cache object name (kernel 2.4 restricts its length to 19 chars) */ + char name[24]; /* Cache object name (kernel 2.4 restricts its length to 19 chars) */ } kasSlabCache_t; /** \brief Return Slab Cache object size @@ -5711,7 +5623,8 @@ slabcache_obj->routine_type = access_type; spin_lock_init(&(slabcache_obj->lock)); - sprintf(slabcache_obj->name, "kas(%08lX)",(unsigned long)slabcache_obj); + snprintf(slabcache_obj->name, sizeof(slabcache_obj->name), + "kas(%p)", slabcache_obj); DBG_TRACE("creating slab object '%s'", slabcache_obj->name); @@ -6627,7 +6540,7 @@ kas_xadd(puiDestination, iAdd, ret, "l"); - return ret + iAdd; + return ret + iAdd; #else return 0xDEADC0DE; /* To make compiler happy */ #endif @@ -6710,7 +6623,7 @@ #ifdef FIREGL_CF_SUPPORT void *ATI_API_CALL KCL_lock_init() -{ +{ spinlock_t *lock; lock = kmalloc(sizeof(*lock), GFP_KERNEL); @@ -6722,7 +6635,7 @@ } void ATI_API_CALL KCL_lock_deinit(void *plock) -{ +{ if (plock == NULL) { __KE_ERROR("plock is NULL\n"); diff -u common/lib/modules/fglrx/build_mod/firegl_public.h common.new/lib/modules/fglrx/build_mod//firegl_public.h --- common/lib/modules/fglrx/build_mod//firegl_public.h 2008-08-07 14:52:00.000000000 -0400 +++ common.new/lib/modules/fglrx/build_mod//firegl_public.h 2008-08-07 14:52:58.000000000 -0400 @@ -78,7 +78,7 @@ if (!pgd_present(*(pgd_p))) \ { \ __KE_ERROR("FATAL ERROR: User queue buffer not present! (pgd)\n"); \ - return (unsigned long)NOPAGE_SIGBUS; /* Something bad happened; generate SIGBUS */ \ + return VM_FAULT_SIGBUS; /* Something bad happened; generate SIGBUS */ \ /* alternatively we could generate a NOPAGE_OOM "out of memory" */ \ } \ } while(0) @@ -91,7 +91,7 @@ if (!pud_present(*(pud_p))) \ { \ __KE_ERROR("FATAL ERROR: User queue buffer not present! (pud)\n"); \ - return (unsigned long)NOPAGE_SIGBUS; /* Something bad happened; generate SIGBUS */ \ + return VM_FAULT_SIGBUS; /* Something bad happened; generate SIGBUS */ \ /* alternatively we could generate a NOPAGE_OOM "out of memory" */ \ } \ pmd_p = pmd_offset(pud_p, pte_linear); \ @@ -111,7 +111,7 @@ if (!pmd_present(*(pmd_p))) \ { \ __KE_ERROR("FATAL ERROR: User queue buffer not present! (pmd)\n"); \ - return (unsigned long)NOPAGE_SIGBUS; /* Something bad happened; generate SIGBUS */ \ + return VM_FAULT_SIGBUS; /* Something bad happened; generate SIGBUS */ \ /* alternatively we could generate a NOPAGE_OOM "out of memory" */ \ } \ } while(0) @@ -157,7 +157,7 @@ if (!pte_present(pte)) \ { \ __KE_ERROR("FATAL ERROR: User queue buffer not present! (pte)\n"); \ - return (unsigned long)NOPAGE_SIGBUS; /* Something bad happened; generate SIGBUS */ \ + return VM_FAULT_SIGBUS; /* Something bad happened; generate SIGBUS */ \ /* alternatively we could generate a NOPAGE_OOM "out of memory" */ \ } \ } while(0)