int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, unsigned long size, bool kernel, bool pinned, struct virtio_gpu_object **bo_ptr) { struct virtio_gpu_object *bo; enum ttm_bo_type type; size_t acc_size; int ret; if (kernel) type = ttm_bo_type_kernel; else type = ttm_bo_type_device; *bo_ptr = NULL; acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, size, sizeof(struct virtio_gpu_object)); bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); if (bo == NULL) return -ENOMEM; size = roundup(size, PAGE_SIZE); ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); if (ret != 0) goto err_gem_init; bo->dumb = false; virtio_gpu_init_ttm_placement(bo, pinned); ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, size, type, &bo->placement, 0, !kernel, NULL, acc_size, NULL, NULL, &virtio_gpu_ttm_bo_destroy); if (ret != 0) goto err_ttm_init; *bo_ptr = bo; return 0; err_ttm_init: drm_gem_object_release(&bo->gem_base); err_gem_init: kfree(bo); return ret; }
int hibmc_bo_create(struct drm_device *dev, int size, int align, u32 flags, struct hibmc_bo **phibmcbo) { struct hibmc_drm_private *hibmc = dev->dev_private; struct hibmc_bo *hibmcbo; size_t acc_size; int ret; hibmcbo = kzalloc(sizeof(*hibmcbo), GFP_KERNEL); if (!hibmcbo) { DRM_ERROR("failed to allocate hibmcbo\n"); return -ENOMEM; } ret = drm_gem_object_init(dev, &hibmcbo->gem, size); if (ret) { DRM_ERROR("failed to initialize drm gem object: %d\n", ret); kfree(hibmcbo); return ret; } hibmcbo->bo.bdev = &hibmc->bdev; hibmc_ttm_placement(hibmcbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); acc_size = ttm_bo_dma_acc_size(&hibmc->bdev, size, sizeof(struct hibmc_bo)); ret = ttm_bo_init(&hibmc->bdev, &hibmcbo->bo, size, ttm_bo_type_device, &hibmcbo->placement, align >> PAGE_SHIFT, false, NULL, acc_size, NULL, NULL, hibmc_bo_ttm_destroy); if (ret) { hibmc_bo_unref(&hibmcbo); DRM_ERROR("failed to initialize ttm_bo: %d\n", ret); return ret; } *phibmcbo = hibmcbo; 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; }