1f64122c1SDave Airlie /* 2f64122c1SDave Airlie * Copyright 2013 Red Hat Inc. 3f64122c1SDave Airlie * 4f64122c1SDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 5f64122c1SDave Airlie * copy of this software and associated documentation files (the "Software"), 6f64122c1SDave Airlie * to deal in the Software without restriction, including without limitation 7f64122c1SDave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f64122c1SDave Airlie * and/or sell copies of the Software, and to permit persons to whom the 9f64122c1SDave Airlie * Software is furnished to do so, subject to the following conditions: 10f64122c1SDave Airlie * 11f64122c1SDave Airlie * The above copyright notice and this permission notice shall be included in 12f64122c1SDave Airlie * all copies or substantial portions of the Software. 13f64122c1SDave Airlie * 14f64122c1SDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f64122c1SDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f64122c1SDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f64122c1SDave Airlie * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18f64122c1SDave Airlie * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19f64122c1SDave Airlie * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20f64122c1SDave Airlie * OTHER DEALINGS IN THE SOFTWARE. 21f64122c1SDave Airlie * 22f64122c1SDave Airlie * Authors: Dave Airlie 23f64122c1SDave Airlie * Alon Levy 24f64122c1SDave Airlie */ 25f64122c1SDave Airlie #ifndef QXL_OBJECT_H 26f64122c1SDave Airlie #define QXL_OBJECT_H 27f64122c1SDave Airlie 28f64122c1SDave Airlie #include "qxl_drv.h" 29f64122c1SDave Airlie 30f64122c1SDave Airlie static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait) 31f64122c1SDave Airlie { 32f64122c1SDave Airlie int r; 33f64122c1SDave Airlie 34f64122c1SDave Airlie r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 35f64122c1SDave Airlie if (unlikely(r != 0)) { 36f64122c1SDave Airlie if (r != -ERESTARTSYS) { 37f64122c1SDave Airlie struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; 38f64122c1SDave Airlie dev_err(qdev->dev, "%p reserve failed\n", bo); 39f64122c1SDave Airlie } 40f64122c1SDave Airlie return r; 41f64122c1SDave Airlie } 42f64122c1SDave Airlie return 0; 43f64122c1SDave Airlie } 44f64122c1SDave Airlie 45f64122c1SDave Airlie static inline void qxl_bo_unreserve(struct qxl_bo *bo) 46f64122c1SDave Airlie { 47f64122c1SDave Airlie ttm_bo_unreserve(&bo->tbo); 48f64122c1SDave Airlie } 49f64122c1SDave Airlie 50f64122c1SDave Airlie static inline u64 qxl_bo_gpu_offset(struct qxl_bo *bo) 51f64122c1SDave Airlie { 52f64122c1SDave Airlie return bo->tbo.offset; 53f64122c1SDave Airlie } 54f64122c1SDave Airlie 55f64122c1SDave Airlie static inline unsigned long qxl_bo_size(struct qxl_bo *bo) 56f64122c1SDave Airlie { 57f64122c1SDave Airlie return bo->tbo.num_pages << PAGE_SHIFT; 58f64122c1SDave Airlie } 59f64122c1SDave Airlie 60f64122c1SDave Airlie static inline bool qxl_bo_is_reserved(struct qxl_bo *bo) 61f64122c1SDave Airlie { 62f64122c1SDave Airlie return !!atomic_read(&bo->tbo.reserved); 63f64122c1SDave Airlie } 64f64122c1SDave Airlie 65f64122c1SDave Airlie static inline u64 qxl_bo_mmap_offset(struct qxl_bo *bo) 66f64122c1SDave Airlie { 67f64122c1SDave Airlie return bo->tbo.addr_space_offset; 68f64122c1SDave Airlie } 69f64122c1SDave Airlie 70f64122c1SDave Airlie static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type, 71f64122c1SDave Airlie bool no_wait) 72f64122c1SDave Airlie { 73f64122c1SDave Airlie int r; 74f64122c1SDave Airlie 75f64122c1SDave Airlie r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 76f64122c1SDave Airlie if (unlikely(r != 0)) { 77f64122c1SDave Airlie if (r != -ERESTARTSYS) { 78f64122c1SDave Airlie struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; 79f64122c1SDave Airlie dev_err(qdev->dev, "%p reserve failed for wait\n", 80f64122c1SDave Airlie bo); 81f64122c1SDave Airlie } 82f64122c1SDave Airlie return r; 83f64122c1SDave Airlie } 84f64122c1SDave Airlie spin_lock(&bo->tbo.bdev->fence_lock); 85f64122c1SDave Airlie if (mem_type) 86f64122c1SDave Airlie *mem_type = bo->tbo.mem.mem_type; 87f64122c1SDave Airlie if (bo->tbo.sync_obj) 88f64122c1SDave Airlie r = ttm_bo_wait(&bo->tbo, true, true, no_wait); 89f64122c1SDave Airlie spin_unlock(&bo->tbo.bdev->fence_lock); 90f64122c1SDave Airlie ttm_bo_unreserve(&bo->tbo); 91f64122c1SDave Airlie return r; 92f64122c1SDave Airlie } 93f64122c1SDave Airlie 94f64122c1SDave Airlie extern int qxl_bo_create(struct qxl_device *qdev, 95f64122c1SDave Airlie unsigned long size, 96f64122c1SDave Airlie bool kernel, u32 domain, 97f64122c1SDave Airlie struct qxl_surface *surf, 98f64122c1SDave Airlie struct qxl_bo **bo_ptr); 99f64122c1SDave Airlie extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); 100f64122c1SDave Airlie extern void qxl_bo_kunmap(struct qxl_bo *bo); 101f64122c1SDave Airlie void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, int page_offset); 102f64122c1SDave Airlie void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map); 103f64122c1SDave Airlie extern struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo); 104f64122c1SDave Airlie extern void qxl_bo_unref(struct qxl_bo **bo); 105f64122c1SDave Airlie extern int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr); 106f64122c1SDave Airlie extern int qxl_bo_unpin(struct qxl_bo *bo); 107f64122c1SDave Airlie extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain); 108f64122c1SDave Airlie extern bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo); 109f64122c1SDave Airlie 110f64122c1SDave Airlie extern int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo); 111f64122c1SDave Airlie extern void qxl_bo_list_unreserve(struct qxl_reloc_list *reloc_list, bool failed); 112f64122c1SDave Airlie #endif 113