Advertisement
4da

[wip] set_pte/pde funcs radeon_gart.c

4da
Aug 31st, 2012
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. /**
  2.  * radeon_vm_set_update_pde - update PDE for pfn
  3.  *
  4.  * @rdev: radeon_device pointer
  5.  * @vm: requested vm
  6.  * @bo: radeon buffer object
  7.  * @mem: ttm mem
  8.  *
  9.  * Update page directory and table entries for pfn (cayman+).
  10.  */
  11.  
  12. #define RADEON_FLAG_PDE_VALID 1
  13. int radeon_vm_set_pde(struct radeon_device *rdev, struct radeon_vm *vm,
  14.             unsigned pfn, uint32_t flags)
  15. {
  16.     u64 pde_num, pte_num;
  17.  
  18.     /* DRM_INFO("-->vm_set_pde, pfn = %d, vmid = %d\n", pfn, vm->id); */
  19.  
  20.     pde_num = RADEON_GET_LAST_PDE_FOR_PFN(pfn);
  21.     pte_num = RADEON_GET_PTE_FOR_PFN(pfn);
  22.  
  23.     /* DRM_INFO("t1\n"); */
  24.  
  25.     if (vm->pd == NULL) {
  26.         DRM_ERROR("vm->pd is NULL. This should not happen!\n");
  27.     }
  28.    
  29.     /* should we do this here or at init? */
  30.     vm->pd[pde_num].addr =
  31.         RADEON_BASE_CPU_ADDR(vm) + PDE_OFFSET(rdev, pde_num);
  32.     /* DRM_INFO("t2\n"); */
  33.     vm->pd[pde_num].gpu_addr =
  34.         RADEON_BASE_GPU_ADDR(vm) + PDE_OFFSET(rdev, pde_num);
  35.     /* DRM_INFO("t3\n"); */
  36.  
  37.     rdev->vm_manager.funcs->set_pde(
  38.         vm->pd[pde_num].addr,
  39.         RADEON_BASE_GPU_ADDR(vm) + PTE_OFFSET(rdev, pde_num, 0),
  40.         flags);
  41.     /* DRM_INFO("t4\n"); */
  42.     return 0;
  43. }
  44.  
  45. /**
  46.  * radeon_vm_set_set_pte - update PDE and PTE for pfn
  47.  *
  48.  * @rdev: radeon_device pointer
  49.  * @vm: requested vm
  50.  * @bo: radeon buffer object
  51.  * @mem: ttm mem
  52.  *
  53.  * Update page directory and table entries for pfn (cayman+).
  54.  */
  55.  
  56. int radeon_vm_set_pte(struct radeon_device *rdev, struct radeon_vm *vm,
  57.             unsigned pfn, uint64_t addr, uint32_t flags)
  58. {
  59.     /* u64 __iomem *pde_ptr = (void *)vm->pd; */
  60.     u64 pde_num = RADEON_GET_LAST_PDE_FOR_PFN(pfn), pte_num;
  61.     u64 pt_size = RADEON_PTE_COUNT * sizeof(struct radeon_pte);
  62.  
  63.     /* DRM_INFO("-->update_pte, pfn = %d, vmid = %d\n", pfn, vm->id); */
  64.  
  65.     pde_num = RADEON_GET_LAST_PDE_FOR_PFN(pfn);
  66.     pte_num = RADEON_GET_PTE_FOR_PFN(pfn);
  67.  
  68.     /* DRM_INFO("t1\n"); */
  69.  
  70.     if (vm->pd[pde_num].pt.pte == NULL) {
  71.         /* DRM_INFO("t2\n"); */
  72.         vm->pd[pde_num].pt.pte = vmalloc(pt_size);
  73.  
  74.         if (vm->pd[pde_num].pt.pte == NULL)
  75.             return -ENOMEM;
  76.  
  77.         /* DRM_INFO("t3\n"); */
  78.         memset(vm->pd[pde_num].pt.pte, 0, pt_size);
  79.     }
  80.  
  81.     /* DRM_INFO("t4\n"); */
  82.     vm->pd[pde_num].pt.pte[pte_num].addr =
  83.         RADEON_BASE_CPU_ADDR(vm) + PTE_OFFSET(rdev, pde_num, pte_num);
  84.     /* DRM_INFO("t5\n"); */
  85.     vm->pd[pde_num].pt.pte[pte_num].gpu_addr =
  86.         RADEON_BASE_GPU_ADDR(vm) + PTE_OFFSET(rdev, pde_num, pte_num);
  87.     /* DRM_INFO("t6\n"); */
  88.     rdev->vm_manager.funcs->set_pte(
  89.         vm->pd[pde_num].pt.pte[pte_num].addr,
  90.         addr,
  91.         flags);
  92.     /* DRM_INFO("t7\n"); */
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement