diff options
| author | Dave Airlie <airlied@redhat.com> | 2013-07-23 00:06:07 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-07-23 21:58:10 -0400 |
| commit | 4f49ec92be64ad1d96cf5d26fc8276f9849202a3 (patch) | |
| tree | e295739f2bfaf65a1b88447383d7316c9f3d7af2 | |
| parent | 0665f9f852b4ac05f2f62046a169f0f5b9212317 (diff) | |
qxl: allow creation of pre-pinned objects and use for releases.
In order to fix an issue with reservations we need to create the releases
as pre-pinned objects, this changes the placement interface and bo creation
interface to allow creating pinned objects to save nested reservations later.
This is just a stepping stone to main fix which follows to actually fix how
qxl deals with reservations.
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_gem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_object.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_object.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ttm.c | 2 |
7 files changed, 20 insertions, 24 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 93c2f2cceb51..4e6a62716618 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c | |||
| @@ -266,7 +266,7 @@ int qxl_alloc_bo_reserved(struct qxl_device *qdev, unsigned long size, | |||
| 266 | int ret; | 266 | int ret; |
| 267 | 267 | ||
| 268 | ret = qxl_bo_create(qdev, size, false /* not kernel - device */, | 268 | ret = qxl_bo_create(qdev, size, false /* not kernel - device */, |
| 269 | QXL_GEM_DOMAIN_VRAM, NULL, &bo); | 269 | false, QXL_GEM_DOMAIN_VRAM, NULL, &bo); |
| 270 | if (ret) { | 270 | if (ret) { |
| 271 | DRM_ERROR("failed to allocate VRAM BO\n"); | 271 | DRM_ERROR("failed to allocate VRAM BO\n"); |
| 272 | return ret; | 272 | return ret; |
diff --git a/drivers/gpu/drm/qxl/qxl_gem.c b/drivers/gpu/drm/qxl/qxl_gem.c index a235693aabba..25e1777fb0a2 100644 --- a/drivers/gpu/drm/qxl/qxl_gem.c +++ b/drivers/gpu/drm/qxl/qxl_gem.c | |||
| @@ -55,7 +55,7 @@ int qxl_gem_object_create(struct qxl_device *qdev, int size, | |||
| 55 | /* At least align on page size */ | 55 | /* At least align on page size */ |
| 56 | if (alignment < PAGE_SIZE) | 56 | if (alignment < PAGE_SIZE) |
| 57 | alignment = PAGE_SIZE; | 57 | alignment = PAGE_SIZE; |
| 58 | r = qxl_bo_create(qdev, size, kernel, initial_domain, surf, &qbo); | 58 | r = qxl_bo_create(qdev, size, kernel, false, initial_domain, surf, &qbo); |
| 59 | if (r) { | 59 | if (r) { |
| 60 | if (r != -ERESTARTSYS) | 60 | if (r != -ERESTARTSYS) |
| 61 | DRM_ERROR( | 61 | DRM_ERROR( |
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 27f45e49250d..7448c5ea92e6 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c | |||
| @@ -305,7 +305,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data, | |||
| 305 | goto out; | 305 | goto out; |
| 306 | 306 | ||
| 307 | if (!qobj->pin_count) { | 307 | if (!qobj->pin_count) { |
| 308 | qxl_ttm_placement_from_domain(qobj, qobj->type); | 308 | qxl_ttm_placement_from_domain(qobj, qobj->type, false); |
| 309 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, | 309 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, |
| 310 | true, false); | 310 | true, false); |
| 311 | if (unlikely(ret)) | 311 | if (unlikely(ret)) |
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c index 1191fe7788c9..50e7a6177167 100644 --- a/drivers/gpu/drm/qxl/qxl_object.c +++ b/drivers/gpu/drm/qxl/qxl_object.c | |||
| @@ -51,20 +51,21 @@ bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo) | |||
| 51 | return false; | 51 | return false; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain) | 54 | void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned) |
| 55 | { | 55 | { |
| 56 | u32 c = 0; | 56 | u32 c = 0; |
| 57 | u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0; | ||
| 57 | 58 | ||
| 58 | qbo->placement.fpfn = 0; | 59 | qbo->placement.fpfn = 0; |
| 59 | qbo->placement.lpfn = 0; | 60 | qbo->placement.lpfn = 0; |
| 60 | qbo->placement.placement = qbo->placements; | 61 | qbo->placement.placement = qbo->placements; |
| 61 | qbo->placement.busy_placement = qbo->placements; | 62 | qbo->placement.busy_placement = qbo->placements; |
| 62 | if (domain == QXL_GEM_DOMAIN_VRAM) | 63 | if (domain == QXL_GEM_DOMAIN_VRAM) |
| 63 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM; | 64 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag; |
| 64 | if (domain == QXL_GEM_DOMAIN_SURFACE) | 65 | if (domain == QXL_GEM_DOMAIN_SURFACE) |
| 65 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0; | 66 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag; |
| 66 | if (domain == QXL_GEM_DOMAIN_CPU) | 67 | if (domain == QXL_GEM_DOMAIN_CPU) |
| 67 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; | 68 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag; |
| 68 | if (!c) | 69 | if (!c) |
| 69 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; | 70 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; |
| 70 | qbo->placement.num_placement = c; | 71 | qbo->placement.num_placement = c; |
| @@ -73,7 +74,7 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain) | |||
| 73 | 74 | ||
| 74 | 75 | ||
| 75 | int qxl_bo_create(struct qxl_device *qdev, | 76 | int qxl_bo_create(struct qxl_device *qdev, |
| 76 | unsigned long size, bool kernel, u32 domain, | 77 | unsigned long size, bool kernel, bool pinned, u32 domain, |
| 77 | struct qxl_surface *surf, | 78 | struct qxl_surface *surf, |
| 78 | struct qxl_bo **bo_ptr) | 79 | struct qxl_bo **bo_ptr) |
| 79 | { | 80 | { |
| @@ -99,7 +100,7 @@ int qxl_bo_create(struct qxl_device *qdev, | |||
| 99 | } | 100 | } |
| 100 | bo->gem_base.driver_private = NULL; | 101 | bo->gem_base.driver_private = NULL; |
| 101 | bo->type = domain; | 102 | bo->type = domain; |
| 102 | bo->pin_count = 0; | 103 | bo->pin_count = pinned ? 1 : 0; |
| 103 | bo->surface_id = 0; | 104 | bo->surface_id = 0; |
| 104 | qxl_fence_init(qdev, &bo->fence); | 105 | qxl_fence_init(qdev, &bo->fence); |
| 105 | INIT_LIST_HEAD(&bo->list); | 106 | INIT_LIST_HEAD(&bo->list); |
| @@ -107,7 +108,7 @@ int qxl_bo_create(struct qxl_device *qdev, | |||
| 107 | if (surf) | 108 | if (surf) |
| 108 | bo->surf = *surf; | 109 | bo->surf = *surf; |
| 109 | 110 | ||
| 110 | qxl_ttm_placement_from_domain(bo, domain); | 111 | qxl_ttm_placement_from_domain(bo, domain, pinned); |
| 111 | 112 | ||
| 112 | r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type, | 113 | r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type, |
| 113 | &bo->placement, 0, !kernel, NULL, size, | 114 | &bo->placement, 0, !kernel, NULL, size, |
| @@ -228,7 +229,7 @@ struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo) | |||
| 228 | int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) | 229 | int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) |
| 229 | { | 230 | { |
| 230 | struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; | 231 | struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; |
| 231 | int r, i; | 232 | int r; |
| 232 | 233 | ||
| 233 | if (bo->pin_count) { | 234 | if (bo->pin_count) { |
| 234 | bo->pin_count++; | 235 | bo->pin_count++; |
| @@ -236,9 +237,7 @@ int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) | |||
| 236 | *gpu_addr = qxl_bo_gpu_offset(bo); | 237 | *gpu_addr = qxl_bo_gpu_offset(bo); |
| 237 | return 0; | 238 | return 0; |
| 238 | } | 239 | } |
| 239 | qxl_ttm_placement_from_domain(bo, domain); | 240 | qxl_ttm_placement_from_domain(bo, domain, true); |
| 240 | for (i = 0; i < bo->placement.num_placement; i++) | ||
| 241 | bo->placements[i] |= TTM_PL_FLAG_NO_EVICT; | ||
| 242 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); | 241 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); |
| 243 | if (likely(r == 0)) { | 242 | if (likely(r == 0)) { |
| 244 | bo->pin_count = 1; | 243 | bo->pin_count = 1; |
| @@ -350,7 +349,7 @@ int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo) | |||
| 350 | return ret; | 349 | return ret; |
| 351 | 350 | ||
| 352 | if (!bo->pin_count) { | 351 | if (!bo->pin_count) { |
| 353 | qxl_ttm_placement_from_domain(bo, bo->type); | 352 | qxl_ttm_placement_from_domain(bo, bo->type, false); |
| 354 | ret = ttm_bo_validate(&bo->tbo, &bo->placement, | 353 | ret = ttm_bo_validate(&bo->tbo, &bo->placement, |
| 355 | true, false); | 354 | true, false); |
| 356 | if (ret) | 355 | if (ret) |
diff --git a/drivers/gpu/drm/qxl/qxl_object.h b/drivers/gpu/drm/qxl/qxl_object.h index ee7ad79ce781..116637f09347 100644 --- a/drivers/gpu/drm/qxl/qxl_object.h +++ b/drivers/gpu/drm/qxl/qxl_object.h | |||
| @@ -88,7 +88,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type, | |||
| 88 | 88 | ||
| 89 | extern int qxl_bo_create(struct qxl_device *qdev, | 89 | extern int qxl_bo_create(struct qxl_device *qdev, |
| 90 | unsigned long size, | 90 | unsigned long size, |
| 91 | bool kernel, u32 domain, | 91 | bool kernel, bool pinned, u32 domain, |
| 92 | struct qxl_surface *surf, | 92 | struct qxl_surface *surf, |
| 93 | struct qxl_bo **bo_ptr); | 93 | struct qxl_bo **bo_ptr); |
| 94 | extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); | 94 | extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); |
| @@ -99,7 +99,7 @@ extern struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo); | |||
| 99 | extern void qxl_bo_unref(struct qxl_bo **bo); | 99 | extern void qxl_bo_unref(struct qxl_bo **bo); |
| 100 | extern int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr); | 100 | extern int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr); |
| 101 | extern int qxl_bo_unpin(struct qxl_bo *bo); | 101 | extern int qxl_bo_unpin(struct qxl_bo *bo); |
| 102 | extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain); | 102 | extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned); |
| 103 | extern bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo); | 103 | extern bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo); |
| 104 | 104 | ||
| 105 | extern int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo); | 105 | extern int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo); |
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index b443d6751d5f..b7f1271c6014 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c | |||
| @@ -118,7 +118,9 @@ static int qxl_release_bo_alloc(struct qxl_device *qdev, | |||
| 118 | struct qxl_bo **bo) | 118 | struct qxl_bo **bo) |
| 119 | { | ||
