static int ttm_agp_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem) { struct ttm_agp_backend *agp_be = container_of(ttm, struct ttm_agp_backend, ttm); struct drm_mm_node *node = bo_mem->mm_node; struct agp_memory *mem; int ret, cached = (bo_mem->placement & TTM_PL_FLAG_CACHED); unsigned i; mem = agp_alloc_memory(agp_be->bridge, AGP_USER_MEMORY, ttm->num_pages); if (unlikely(mem == NULL)) return -ENOMEM; mem->page_count = 0; for (i = 0; i < ttm->num_pages; i++) { vm_page_t page = ttm->pages[i]; if (!page) page = ttm->dummy_read_page; mem->pages[mem->page_count++] = page; } agp_be->mem = mem; mem->is_flushed = 1; mem->type = (cached) ? AGP_USER_CACHED_MEMORY : AGP_USER_MEMORY; ret = agp_bind_memory(mem, node->start); if (ret) pr_err("AGP Bind memory failed\n"); return ret; }
int drm_agp_bind_memory(void *handle, off_t start) { device_t agpdev; agpdev = DRM_AGP_FIND_DEVICE(); if (!agpdev || !handle) return EINVAL; return agp_bind_memory(agpdev, handle, start * PAGE_SIZE); }
static int agpioc_bind_wrap(agp_file_private * priv, unsigned long arg) { agp_bind bind_info; agp_memory *memory; if (copy_from_user(&bind_info, (void *) arg, sizeof(agp_bind))) { return -EFAULT; } memory = agp_find_mem_by_key(bind_info.key); if (memory == NULL) { return -EINVAL; } return agp_bind_memory(memory, bind_info.pg_start); }
static int compat_agpioc_bind_wrap(struct agp_file_private *priv, void __user *arg) { struct agp_bind32 bind_info; struct agp_memory *memory; DBG(""); if (copy_from_user(&bind_info, arg, sizeof(bind_info))) return -EFAULT; memory = agp_find_mem_by_key(bind_info.key); if (memory == NULL) return -EINVAL; return agp_bind_memory(memory, bind_info.pg_start); }
/** Wrapper around agp_bind_memory() */ int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start) { return agp_bind_memory(handle, start); }
/** Calls agp_bind_memory() */ int drm_agp_bind_memory(DRM_AGP_MEM *handle, off_t start) { if (!handle) return -EINVAL; return agp_bind_memory(handle, start); }