| .. | .. |
|---|
| 19 | 19 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|---|
| 20 | 20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|---|
| 21 | 21 | */ |
|---|
| 22 | + |
|---|
| 23 | +#include <linux/delay.h> |
|---|
| 24 | + |
|---|
| 25 | +#include <trace/events/dma_fence.h> |
|---|
| 26 | + |
|---|
| 22 | 27 | #include "qxl_drv.h" |
|---|
| 23 | 28 | #include "qxl_object.h" |
|---|
| 24 | | -#include <trace/events/dma_fence.h> |
|---|
| 25 | 29 | |
|---|
| 26 | 30 | /* |
|---|
| 27 | 31 | * drawable cmd cache - allocate a bunch of VRAM pages, suballocate |
|---|
| .. | .. |
|---|
| 195 | 199 | } |
|---|
| 196 | 200 | |
|---|
| 197 | 201 | static int qxl_release_bo_alloc(struct qxl_device *qdev, |
|---|
| 198 | | - struct qxl_bo **bo) |
|---|
| 202 | + struct qxl_bo **bo, |
|---|
| 203 | + u32 priority) |
|---|
| 199 | 204 | { |
|---|
| 200 | 205 | /* pin releases bo's they are too messy to evict */ |
|---|
| 201 | 206 | return qxl_bo_create(qdev, PAGE_SIZE, false, true, |
|---|
| 202 | | - QXL_GEM_DOMAIN_VRAM, NULL, bo); |
|---|
| 207 | + QXL_GEM_DOMAIN_VRAM, priority, NULL, bo); |
|---|
| 203 | 208 | } |
|---|
| 204 | 209 | |
|---|
| 205 | 210 | int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo) |
|---|
| .. | .. |
|---|
| 217 | 222 | |
|---|
| 218 | 223 | qxl_bo_ref(bo); |
|---|
| 219 | 224 | entry->tv.bo = &bo->tbo; |
|---|
| 220 | | - entry->tv.shared = false; |
|---|
| 225 | + entry->tv.num_shared = 0; |
|---|
| 221 | 226 | list_add_tail(&entry->tv.head, &release->bos); |
|---|
| 222 | 227 | return 0; |
|---|
| 223 | 228 | } |
|---|
| .. | .. |
|---|
| 234 | 239 | return ret; |
|---|
| 235 | 240 | } |
|---|
| 236 | 241 | |
|---|
| 237 | | - ret = reservation_object_reserve_shared(bo->tbo.resv); |
|---|
| 242 | + ret = dma_resv_reserve_shared(bo->tbo.base.resv, 1); |
|---|
| 238 | 243 | if (ret) |
|---|
| 239 | 244 | return ret; |
|---|
| 240 | 245 | |
|---|
| 241 | 246 | /* allocate a surface for reserved + validated buffers */ |
|---|
| 242 | | - ret = qxl_bo_check_id(bo->gem_base.dev->dev_private, bo); |
|---|
| 247 | + ret = qxl_bo_check_id(to_qxl(bo->tbo.base.dev), bo); |
|---|
| 243 | 248 | if (ret) |
|---|
| 244 | 249 | return ret; |
|---|
| 245 | 250 | return 0; |
|---|
| .. | .. |
|---|
| 282 | 287 | ttm_eu_backoff_reservation(&release->ticket, &release->bos); |
|---|
| 283 | 288 | } |
|---|
| 284 | 289 | |
|---|
| 285 | | - |
|---|
| 286 | 290 | int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, |
|---|
| 287 | 291 | enum qxl_surface_cmd_type surface_cmd_type, |
|---|
| 288 | 292 | struct qxl_release *create_rel, |
|---|
| .. | .. |
|---|
| 323 | 327 | int ret = 0; |
|---|
| 324 | 328 | union qxl_release_info *info; |
|---|
| 325 | 329 | int cur_idx; |
|---|
| 330 | + u32 priority; |
|---|
| 326 | 331 | |
|---|
| 327 | | - if (type == QXL_RELEASE_DRAWABLE) |
|---|
| 332 | + if (type == QXL_RELEASE_DRAWABLE) { |
|---|
| 328 | 333 | cur_idx = 0; |
|---|
| 329 | | - else if (type == QXL_RELEASE_SURFACE_CMD) |
|---|
| 334 | + priority = 0; |
|---|
| 335 | + } else if (type == QXL_RELEASE_SURFACE_CMD) { |
|---|
| 330 | 336 | cur_idx = 1; |
|---|
| 331 | | - else if (type == QXL_RELEASE_CURSOR_CMD) |
|---|
| 337 | + priority = 1; |
|---|
| 338 | + } else if (type == QXL_RELEASE_CURSOR_CMD) { |
|---|
| 332 | 339 | cur_idx = 2; |
|---|
| 340 | + priority = 1; |
|---|
| 341 | + } |
|---|
| 333 | 342 | else { |
|---|
| 334 | 343 | DRM_ERROR("got illegal type: %d\n", type); |
|---|
| 335 | 344 | return -EINVAL; |
|---|
| .. | .. |
|---|
| 349 | 358 | qdev->current_release_bo[cur_idx] = NULL; |
|---|
| 350 | 359 | } |
|---|
| 351 | 360 | if (!qdev->current_release_bo[cur_idx]) { |
|---|
| 352 | | - ret = qxl_release_bo_alloc(qdev, &qdev->current_release_bo[cur_idx]); |
|---|
| 361 | + ret = qxl_release_bo_alloc(qdev, &qdev->current_release_bo[cur_idx], priority); |
|---|
| 353 | 362 | if (ret) { |
|---|
| 354 | 363 | mutex_unlock(&qdev->release_mutex); |
|---|
| 355 | 364 | qxl_release_free(qdev, *release); |
|---|
| .. | .. |
|---|
| 426 | 435 | void qxl_release_fence_buffer_objects(struct qxl_release *release) |
|---|
| 427 | 436 | { |
|---|
| 428 | 437 | struct ttm_buffer_object *bo; |
|---|
| 429 | | - struct ttm_bo_global *glob; |
|---|
| 430 | 438 | struct ttm_bo_device *bdev; |
|---|
| 431 | | - struct ttm_bo_driver *driver; |
|---|
| 432 | | - struct qxl_bo *qbo; |
|---|
| 433 | 439 | struct ttm_validate_buffer *entry; |
|---|
| 434 | 440 | struct qxl_device *qdev; |
|---|
| 435 | 441 | |
|---|
| .. | .. |
|---|
| 450 | 456 | release->id | 0xf0000000, release->base.seqno); |
|---|
| 451 | 457 | trace_dma_fence_emit(&release->base); |
|---|
| 452 | 458 | |
|---|
| 453 | | - driver = bdev->driver; |
|---|
| 454 | | - glob = bdev->glob; |
|---|
| 455 | | - |
|---|
| 456 | | - spin_lock(&glob->lru_lock); |
|---|
| 459 | + spin_lock(&ttm_bo_glob.lru_lock); |
|---|
| 457 | 460 | |
|---|
| 458 | 461 | list_for_each_entry(entry, &release->bos, head) { |
|---|
| 459 | 462 | bo = entry->bo; |
|---|
| 460 | | - qbo = to_qxl_bo(bo); |
|---|
| 461 | 463 | |
|---|
| 462 | | - reservation_object_add_shared_fence(bo->resv, &release->base); |
|---|
| 463 | | - ttm_bo_add_to_lru(bo); |
|---|
| 464 | | - reservation_object_unlock(bo->resv); |
|---|
| 464 | + dma_resv_add_shared_fence(bo->base.resv, &release->base); |
|---|
| 465 | + ttm_bo_move_to_lru_tail(bo, NULL); |
|---|
| 466 | + dma_resv_unlock(bo->base.resv); |
|---|
| 465 | 467 | } |
|---|
| 466 | | - spin_unlock(&glob->lru_lock); |
|---|
| 468 | + spin_unlock(&ttm_bo_glob.lru_lock); |
|---|
| 467 | 469 | ww_acquire_fini(&release->ticket); |
|---|
| 468 | 470 | } |
|---|
| 469 | 471 | |
|---|