static void bochs_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl) { struct bochs_bo *bochsbo = bochs_bo(bo); if (!bochs_ttm_bo_is_bochs_bo(bo)) return; bochs_ttm_placement(bochsbo, TTM_PL_FLAG_SYSTEM); *pl = bochsbo->placement; }
int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr) { int i, ret; if (bo->pin_count) { bo->pin_count++; if (gpu_addr) *gpu_addr = bochs_bo_gpu_offset(bo); return 0; } bochs_ttm_placement(bo, pl_flag); for (i = 0; i < bo->placement.num_placement; i++) bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); if (ret) return ret; bo->pin_count = 1; if (gpu_addr) *gpu_addr = bochs_bo_gpu_offset(bo); return 0; }
static int bochs_bo_create(struct drm_device *dev, int size, int align, uint32_t flags, struct bochs_bo **pbochsbo) { struct bochs_device *bochs = dev->dev_private; struct bochs_bo *bochsbo; size_t acc_size; int ret; bochsbo = kzalloc(sizeof(struct bochs_bo), GFP_KERNEL); if (!bochsbo) return -ENOMEM; ret = drm_gem_object_init(dev, &bochsbo->gem, size); if (ret) { kfree(bochsbo); return ret; } bochsbo->bo.bdev = &bochs->ttm.bdev; bochsbo->bo.bdev->dev_mapping = dev->anon_inode->i_mapping; bochs_ttm_placement(bochsbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); acc_size = ttm_bo_dma_acc_size(&bochs->ttm.bdev, size, sizeof(struct bochs_bo)); ret = ttm_bo_init(&bochs->ttm.bdev, &bochsbo->bo, size, ttm_bo_type_device, &bochsbo->placement, align >> PAGE_SHIFT, false, NULL, acc_size, NULL, NULL, bochs_bo_ttm_destroy); if (ret) return ret; *pbochsbo = bochsbo; return 0; }