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 /drivers | |
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>
Diffstat (limited to 'drivers')
-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 | { | 119 | { |
120 | int ret; | 120 | int ret; |
121 | ret = qxl_bo_create(qdev, PAGE_SIZE, false, QXL_GEM_DOMAIN_VRAM, NULL, | 121 | /* pin releases bo's they are too messy to evict */ |
122 | ret = qxl_bo_create(qdev, PAGE_SIZE, false, true, | ||
123 | QXL_GEM_DOMAIN_VRAM, NULL, | ||
122 | bo); | 124 | bo); |
123 | return ret; | 125 | return ret; |
124 | } | 126 | } |
@@ -216,11 +218,6 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | |||
216 | mutex_unlock(&qdev->release_mutex); | 218 | mutex_unlock(&qdev->release_mutex); |
217 | return ret; | 219 | return ret; |
218 | } | 220 | } |
219 | |||
220 | /* pin releases bo's they are too messy to evict */ | ||
221 | ret = qxl_bo_reserve(qdev->current_release_bo[cur_idx], false); | ||
222 | qxl_bo_pin(qdev->current_release_bo[cur_idx], QXL_GEM_DOMAIN_VRAM, NULL); | ||
223 | qxl_bo_unreserve(qdev->current_release_bo[cur_idx]); | ||
224 | } | 221 | } |
225 | 222 | ||
226 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); | 223 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); |
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 489cb8cece4d..1dfd84cda2a1 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c | |||
@@ -206,7 +206,7 @@ static void qxl_evict_flags(struct ttm_buffer_object *bo, | |||
206 | return; | 206 | return; |
207 | } | 207 | } |
208 | qbo = container_of(bo, struct qxl_bo, tbo); | 208 | qbo = container_of(bo, struct qxl_bo, tbo); |
209 | qxl_ttm_placement_from_domain(qbo, QXL_GEM_DOMAIN_CPU); | 209 | qxl_ttm_placement_from_domain(qbo, QXL_GEM_DOMAIN_CPU, false); |
210 | *placement = qbo->placement; | 210 | *placement = qbo->placement; |
211 | } | 211 | } |
212 | 212 | ||