1d722e3fbSopenharmony_ci/* 2d722e3fbSopenharmony_ci * Copyright © 2008 Dave Airlie 3d722e3fbSopenharmony_ci * Copyright © 2008 Jérôme Glisse 4d722e3fbSopenharmony_ci * All Rights Reserved. 5d722e3fbSopenharmony_ci * 6d722e3fbSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining 7d722e3fbSopenharmony_ci * a copy of this software and associated documentation files (the 8d722e3fbSopenharmony_ci * "Software"), to deal in the Software without restriction, including 9d722e3fbSopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 10d722e3fbSopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to 11d722e3fbSopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 12d722e3fbSopenharmony_ci * the following conditions: 13d722e3fbSopenharmony_ci * 14d722e3fbSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15d722e3fbSopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 16d722e3fbSopenharmony_ci * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17d722e3fbSopenharmony_ci * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS 18d722e3fbSopenharmony_ci * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19d722e3fbSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20d722e3fbSopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21d722e3fbSopenharmony_ci * USE OR OTHER DEALINGS IN THE SOFTWARE. 22d722e3fbSopenharmony_ci * 23d722e3fbSopenharmony_ci * The above copyright notice and this permission notice (including the 24d722e3fbSopenharmony_ci * next paragraph) shall be included in all copies or substantial portions 25d722e3fbSopenharmony_ci * of the Software. 26d722e3fbSopenharmony_ci */ 27d722e3fbSopenharmony_ci/* 28d722e3fbSopenharmony_ci * Authors: 29d722e3fbSopenharmony_ci * Dave Airlie 30d722e3fbSopenharmony_ci * Jérôme Glisse <glisse@freedesktop.org> 31d722e3fbSopenharmony_ci */ 32d722e3fbSopenharmony_ci#include <stdio.h> 33d722e3fbSopenharmony_ci#include <stdint.h> 34d722e3fbSopenharmony_ci#include <stdlib.h> 35d722e3fbSopenharmony_ci#include <string.h> 36d722e3fbSopenharmony_ci#include <errno.h> 37d722e3fbSopenharmony_ci#include "libdrm_macros.h" 38d722e3fbSopenharmony_ci#include "xf86drm.h" 39d722e3fbSopenharmony_ci#include "xf86atomic.h" 40d722e3fbSopenharmony_ci#include "drm.h" 41d722e3fbSopenharmony_ci#include "radeon_drm.h" 42d722e3fbSopenharmony_ci#include "radeon_bo.h" 43d722e3fbSopenharmony_ci#include "radeon_bo_int.h" 44d722e3fbSopenharmony_ci#include "radeon_bo_gem.h" 45d722e3fbSopenharmony_ci#include <fcntl.h> 46d722e3fbSopenharmony_cistruct radeon_bo_gem { 47d722e3fbSopenharmony_ci struct radeon_bo_int base; 48d722e3fbSopenharmony_ci uint32_t name; 49d722e3fbSopenharmony_ci int map_count; 50d722e3fbSopenharmony_ci atomic_t reloc_in_cs; 51d722e3fbSopenharmony_ci void *priv_ptr; 52d722e3fbSopenharmony_ci}; 53d722e3fbSopenharmony_ci 54d722e3fbSopenharmony_cistruct bo_manager_gem { 55d722e3fbSopenharmony_ci struct radeon_bo_manager base; 56d722e3fbSopenharmony_ci}; 57d722e3fbSopenharmony_ci 58d722e3fbSopenharmony_cistatic int bo_wait(struct radeon_bo_int *boi); 59d722e3fbSopenharmony_ci 60d722e3fbSopenharmony_cistatic struct radeon_bo *bo_open(struct radeon_bo_manager *bom, 61d722e3fbSopenharmony_ci uint32_t handle, 62d722e3fbSopenharmony_ci uint32_t size, 63d722e3fbSopenharmony_ci uint32_t alignment, 64d722e3fbSopenharmony_ci uint32_t domains, 65d722e3fbSopenharmony_ci uint32_t flags) 66d722e3fbSopenharmony_ci{ 67d722e3fbSopenharmony_ci struct radeon_bo_gem *bo; 68d722e3fbSopenharmony_ci int r; 69d722e3fbSopenharmony_ci 70d722e3fbSopenharmony_ci bo = (struct radeon_bo_gem*)calloc(1, sizeof(struct radeon_bo_gem)); 71d722e3fbSopenharmony_ci if (bo == NULL) { 72d722e3fbSopenharmony_ci return NULL; 73d722e3fbSopenharmony_ci } 74d722e3fbSopenharmony_ci 75d722e3fbSopenharmony_ci bo->base.bom = bom; 76d722e3fbSopenharmony_ci bo->base.handle = 0; 77d722e3fbSopenharmony_ci bo->base.size = size; 78d722e3fbSopenharmony_ci bo->base.alignment = alignment; 79d722e3fbSopenharmony_ci bo->base.domains = domains; 80d722e3fbSopenharmony_ci bo->base.flags = flags; 81d722e3fbSopenharmony_ci bo->base.ptr = NULL; 82d722e3fbSopenharmony_ci atomic_set(&bo->reloc_in_cs, 0); 83d722e3fbSopenharmony_ci bo->map_count = 0; 84d722e3fbSopenharmony_ci if (handle) { 85d722e3fbSopenharmony_ci struct drm_gem_open open_arg; 86d722e3fbSopenharmony_ci 87d722e3fbSopenharmony_ci memset(&open_arg, 0, sizeof(open_arg)); 88d722e3fbSopenharmony_ci open_arg.name = handle; 89d722e3fbSopenharmony_ci r = drmIoctl(bom->fd, DRM_IOCTL_GEM_OPEN, &open_arg); 90d722e3fbSopenharmony_ci if (r != 0) { 91d722e3fbSopenharmony_ci free(bo); 92d722e3fbSopenharmony_ci return NULL; 93d722e3fbSopenharmony_ci } 94d722e3fbSopenharmony_ci bo->base.handle = open_arg.handle; 95d722e3fbSopenharmony_ci bo->base.size = open_arg.size; 96d722e3fbSopenharmony_ci bo->name = handle; 97d722e3fbSopenharmony_ci } else { 98d722e3fbSopenharmony_ci struct drm_radeon_gem_create args; 99d722e3fbSopenharmony_ci 100d722e3fbSopenharmony_ci args.size = size; 101d722e3fbSopenharmony_ci args.alignment = alignment; 102d722e3fbSopenharmony_ci args.initial_domain = bo->base.domains; 103d722e3fbSopenharmony_ci args.flags = flags; 104d722e3fbSopenharmony_ci args.handle = 0; 105d722e3fbSopenharmony_ci r = drmCommandWriteRead(bom->fd, DRM_RADEON_GEM_CREATE, 106d722e3fbSopenharmony_ci &args, sizeof(args)); 107d722e3fbSopenharmony_ci bo->base.handle = args.handle; 108d722e3fbSopenharmony_ci if (r) { 109d722e3fbSopenharmony_ci fprintf(stderr, "Failed to allocate :\n"); 110d722e3fbSopenharmony_ci fprintf(stderr, " size : %d bytes\n", size); 111d722e3fbSopenharmony_ci fprintf(stderr, " alignment : %d bytes\n", alignment); 112d722e3fbSopenharmony_ci fprintf(stderr, " domains : %d\n", bo->base.domains); 113d722e3fbSopenharmony_ci free(bo); 114d722e3fbSopenharmony_ci return NULL; 115d722e3fbSopenharmony_ci } 116d722e3fbSopenharmony_ci } 117d722e3fbSopenharmony_ci radeon_bo_ref((struct radeon_bo*)bo); 118d722e3fbSopenharmony_ci return (struct radeon_bo*)bo; 119d722e3fbSopenharmony_ci} 120d722e3fbSopenharmony_ci 121d722e3fbSopenharmony_cistatic void bo_ref(struct radeon_bo_int *boi) 122d722e3fbSopenharmony_ci{ 123d722e3fbSopenharmony_ci} 124d722e3fbSopenharmony_ci 125d722e3fbSopenharmony_cistatic struct radeon_bo *bo_unref(struct radeon_bo_int *boi) 126d722e3fbSopenharmony_ci{ 127d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi; 128d722e3fbSopenharmony_ci 129d722e3fbSopenharmony_ci if (boi->cref) { 130d722e3fbSopenharmony_ci return (struct radeon_bo *)boi; 131d722e3fbSopenharmony_ci } 132d722e3fbSopenharmony_ci if (bo_gem->priv_ptr) { 133d722e3fbSopenharmony_ci drm_munmap(bo_gem->priv_ptr, boi->size); 134d722e3fbSopenharmony_ci } 135d722e3fbSopenharmony_ci 136d722e3fbSopenharmony_ci /* close object */ 137d722e3fbSopenharmony_ci drmCloseBufferHandle(boi->bom->fd, boi->handle); 138d722e3fbSopenharmony_ci memset(bo_gem, 0, sizeof(struct radeon_bo_gem)); 139d722e3fbSopenharmony_ci free(bo_gem); 140d722e3fbSopenharmony_ci return NULL; 141d722e3fbSopenharmony_ci} 142d722e3fbSopenharmony_ci 143d722e3fbSopenharmony_cistatic int bo_map(struct radeon_bo_int *boi, int write) 144d722e3fbSopenharmony_ci{ 145d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi; 146d722e3fbSopenharmony_ci struct drm_radeon_gem_mmap args; 147d722e3fbSopenharmony_ci int r; 148d722e3fbSopenharmony_ci void *ptr; 149d722e3fbSopenharmony_ci 150d722e3fbSopenharmony_ci if (bo_gem->map_count++ != 0) { 151d722e3fbSopenharmony_ci return 0; 152d722e3fbSopenharmony_ci } 153d722e3fbSopenharmony_ci if (bo_gem->priv_ptr) { 154d722e3fbSopenharmony_ci goto wait; 155d722e3fbSopenharmony_ci } 156d722e3fbSopenharmony_ci 157d722e3fbSopenharmony_ci boi->ptr = NULL; 158d722e3fbSopenharmony_ci 159d722e3fbSopenharmony_ci /* Zero out args to make valgrind happy */ 160d722e3fbSopenharmony_ci memset(&args, 0, sizeof(args)); 161d722e3fbSopenharmony_ci args.handle = boi->handle; 162d722e3fbSopenharmony_ci args.offset = 0; 163d722e3fbSopenharmony_ci args.size = (uint64_t)boi->size; 164d722e3fbSopenharmony_ci r = drmCommandWriteRead(boi->bom->fd, 165d722e3fbSopenharmony_ci DRM_RADEON_GEM_MMAP, 166d722e3fbSopenharmony_ci &args, 167d722e3fbSopenharmony_ci sizeof(args)); 168d722e3fbSopenharmony_ci if (r) { 169d722e3fbSopenharmony_ci fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n", 170d722e3fbSopenharmony_ci boi, boi->handle, r); 171d722e3fbSopenharmony_ci return r; 172d722e3fbSopenharmony_ci } 173d722e3fbSopenharmony_ci ptr = drm_mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, boi->bom->fd, args.addr_ptr); 174d722e3fbSopenharmony_ci if (ptr == MAP_FAILED) 175d722e3fbSopenharmony_ci return -errno; 176d722e3fbSopenharmony_ci bo_gem->priv_ptr = ptr; 177d722e3fbSopenharmony_ciwait: 178d722e3fbSopenharmony_ci boi->ptr = bo_gem->priv_ptr; 179d722e3fbSopenharmony_ci r = bo_wait(boi); 180d722e3fbSopenharmony_ci if (r) 181d722e3fbSopenharmony_ci return r; 182d722e3fbSopenharmony_ci return 0; 183d722e3fbSopenharmony_ci} 184d722e3fbSopenharmony_ci 185d722e3fbSopenharmony_cistatic int bo_unmap(struct radeon_bo_int *boi) 186d722e3fbSopenharmony_ci{ 187d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi; 188d722e3fbSopenharmony_ci 189d722e3fbSopenharmony_ci if (--bo_gem->map_count > 0) { 190d722e3fbSopenharmony_ci return 0; 191d722e3fbSopenharmony_ci } 192d722e3fbSopenharmony_ci //drm_munmap(bo->ptr, bo->size); 193d722e3fbSopenharmony_ci boi->ptr = NULL; 194d722e3fbSopenharmony_ci return 0; 195d722e3fbSopenharmony_ci} 196d722e3fbSopenharmony_ci 197d722e3fbSopenharmony_cistatic int bo_wait(struct radeon_bo_int *boi) 198d722e3fbSopenharmony_ci{ 199d722e3fbSopenharmony_ci struct drm_radeon_gem_wait_idle args; 200d722e3fbSopenharmony_ci int ret; 201d722e3fbSopenharmony_ci 202d722e3fbSopenharmony_ci /* Zero out args to make valgrind happy */ 203d722e3fbSopenharmony_ci memset(&args, 0, sizeof(args)); 204d722e3fbSopenharmony_ci args.handle = boi->handle; 205d722e3fbSopenharmony_ci do { 206d722e3fbSopenharmony_ci ret = drmCommandWrite(boi->bom->fd, DRM_RADEON_GEM_WAIT_IDLE, 207d722e3fbSopenharmony_ci &args, sizeof(args)); 208d722e3fbSopenharmony_ci } while (ret == -EBUSY); 209d722e3fbSopenharmony_ci return ret; 210d722e3fbSopenharmony_ci} 211d722e3fbSopenharmony_ci 212d722e3fbSopenharmony_cistatic int bo_is_busy(struct radeon_bo_int *boi, uint32_t *domain) 213d722e3fbSopenharmony_ci{ 214d722e3fbSopenharmony_ci struct drm_radeon_gem_busy args; 215d722e3fbSopenharmony_ci int ret; 216d722e3fbSopenharmony_ci 217d722e3fbSopenharmony_ci args.handle = boi->handle; 218d722e3fbSopenharmony_ci args.domain = 0; 219d722e3fbSopenharmony_ci 220d722e3fbSopenharmony_ci ret = drmCommandWriteRead(boi->bom->fd, DRM_RADEON_GEM_BUSY, 221d722e3fbSopenharmony_ci &args, sizeof(args)); 222d722e3fbSopenharmony_ci 223d722e3fbSopenharmony_ci *domain = args.domain; 224d722e3fbSopenharmony_ci return ret; 225d722e3fbSopenharmony_ci} 226d722e3fbSopenharmony_ci 227d722e3fbSopenharmony_cistatic int bo_set_tiling(struct radeon_bo_int *boi, uint32_t tiling_flags, 228d722e3fbSopenharmony_ci uint32_t pitch) 229d722e3fbSopenharmony_ci{ 230d722e3fbSopenharmony_ci struct drm_radeon_gem_set_tiling args; 231d722e3fbSopenharmony_ci int r; 232d722e3fbSopenharmony_ci 233d722e3fbSopenharmony_ci args.handle = boi->handle; 234d722e3fbSopenharmony_ci args.tiling_flags = tiling_flags; 235d722e3fbSopenharmony_ci args.pitch = pitch; 236d722e3fbSopenharmony_ci 237d722e3fbSopenharmony_ci r = drmCommandWriteRead(boi->bom->fd, 238d722e3fbSopenharmony_ci DRM_RADEON_GEM_SET_TILING, 239d722e3fbSopenharmony_ci &args, 240d722e3fbSopenharmony_ci sizeof(args)); 241d722e3fbSopenharmony_ci return r; 242d722e3fbSopenharmony_ci} 243d722e3fbSopenharmony_ci 244d722e3fbSopenharmony_cistatic int bo_get_tiling(struct radeon_bo_int *boi, uint32_t *tiling_flags, 245d722e3fbSopenharmony_ci uint32_t *pitch) 246d722e3fbSopenharmony_ci{ 247d722e3fbSopenharmony_ci struct drm_radeon_gem_set_tiling args = {}; 248d722e3fbSopenharmony_ci int r; 249d722e3fbSopenharmony_ci 250d722e3fbSopenharmony_ci args.handle = boi->handle; 251d722e3fbSopenharmony_ci 252d722e3fbSopenharmony_ci r = drmCommandWriteRead(boi->bom->fd, 253d722e3fbSopenharmony_ci DRM_RADEON_GEM_GET_TILING, 254d722e3fbSopenharmony_ci &args, 255d722e3fbSopenharmony_ci sizeof(args)); 256d722e3fbSopenharmony_ci 257d722e3fbSopenharmony_ci if (r) 258d722e3fbSopenharmony_ci return r; 259d722e3fbSopenharmony_ci 260d722e3fbSopenharmony_ci *tiling_flags = args.tiling_flags; 261d722e3fbSopenharmony_ci *pitch = args.pitch; 262d722e3fbSopenharmony_ci return r; 263d722e3fbSopenharmony_ci} 264d722e3fbSopenharmony_ci 265d722e3fbSopenharmony_cistatic const struct radeon_bo_funcs bo_gem_funcs = { 266d722e3fbSopenharmony_ci .bo_open = bo_open, 267d722e3fbSopenharmony_ci .bo_ref = bo_ref, 268d722e3fbSopenharmony_ci .bo_unref = bo_unref, 269d722e3fbSopenharmony_ci .bo_map = bo_map, 270d722e3fbSopenharmony_ci .bo_unmap = bo_unmap, 271d722e3fbSopenharmony_ci .bo_wait = bo_wait, 272d722e3fbSopenharmony_ci .bo_is_static = NULL, 273d722e3fbSopenharmony_ci .bo_set_tiling = bo_set_tiling, 274d722e3fbSopenharmony_ci .bo_get_tiling = bo_get_tiling, 275d722e3fbSopenharmony_ci .bo_is_busy = bo_is_busy, 276d722e3fbSopenharmony_ci .bo_is_referenced_by_cs = NULL, 277d722e3fbSopenharmony_ci}; 278d722e3fbSopenharmony_ci 279d722e3fbSopenharmony_cidrm_public struct radeon_bo_manager *radeon_bo_manager_gem_ctor(int fd) 280d722e3fbSopenharmony_ci{ 281d722e3fbSopenharmony_ci struct bo_manager_gem *bomg; 282d722e3fbSopenharmony_ci 283d722e3fbSopenharmony_ci bomg = (struct bo_manager_gem*)calloc(1, sizeof(struct bo_manager_gem)); 284d722e3fbSopenharmony_ci if (bomg == NULL) { 285d722e3fbSopenharmony_ci return NULL; 286d722e3fbSopenharmony_ci } 287d722e3fbSopenharmony_ci bomg->base.funcs = &bo_gem_funcs; 288d722e3fbSopenharmony_ci bomg->base.fd = fd; 289d722e3fbSopenharmony_ci return (struct radeon_bo_manager*)bomg; 290d722e3fbSopenharmony_ci} 291d722e3fbSopenharmony_ci 292d722e3fbSopenharmony_cidrm_public void radeon_bo_manager_gem_dtor(struct radeon_bo_manager *bom) 293d722e3fbSopenharmony_ci{ 294d722e3fbSopenharmony_ci struct bo_manager_gem *bomg = (struct bo_manager_gem*)bom; 295d722e3fbSopenharmony_ci 296d722e3fbSopenharmony_ci if (bom == NULL) { 297d722e3fbSopenharmony_ci return; 298d722e3fbSopenharmony_ci } 299d722e3fbSopenharmony_ci free(bomg); 300d722e3fbSopenharmony_ci} 301d722e3fbSopenharmony_ci 302d722e3fbSopenharmony_cidrm_public uint32_t 303d722e3fbSopenharmony_ciradeon_gem_name_bo(struct radeon_bo *bo) 304d722e3fbSopenharmony_ci{ 305d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; 306d722e3fbSopenharmony_ci return bo_gem->name; 307d722e3fbSopenharmony_ci} 308d722e3fbSopenharmony_ci 309d722e3fbSopenharmony_cidrm_public void * 310d722e3fbSopenharmony_ciradeon_gem_get_reloc_in_cs(struct radeon_bo *bo) 311d722e3fbSopenharmony_ci{ 312d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; 313d722e3fbSopenharmony_ci return &bo_gem->reloc_in_cs; 314d722e3fbSopenharmony_ci} 315d722e3fbSopenharmony_ci 316d722e3fbSopenharmony_cidrm_public int 317d722e3fbSopenharmony_ciradeon_gem_get_kernel_name(struct radeon_bo *bo, uint32_t *name) 318d722e3fbSopenharmony_ci{ 319d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; 320d722e3fbSopenharmony_ci struct radeon_bo_int *boi = (struct radeon_bo_int *)bo; 321d722e3fbSopenharmony_ci struct drm_gem_flink flink; 322d722e3fbSopenharmony_ci int r; 323d722e3fbSopenharmony_ci 324d722e3fbSopenharmony_ci if (bo_gem->name) { 325d722e3fbSopenharmony_ci *name = bo_gem->name; 326d722e3fbSopenharmony_ci return 0; 327d722e3fbSopenharmony_ci } 328d722e3fbSopenharmony_ci flink.handle = bo->handle; 329d722e3fbSopenharmony_ci r = drmIoctl(boi->bom->fd, DRM_IOCTL_GEM_FLINK, &flink); 330d722e3fbSopenharmony_ci if (r) { 331d722e3fbSopenharmony_ci return r; 332d722e3fbSopenharmony_ci } 333d722e3fbSopenharmony_ci bo_gem->name = flink.name; 334d722e3fbSopenharmony_ci *name = flink.name; 335d722e3fbSopenharmony_ci return 0; 336d722e3fbSopenharmony_ci} 337d722e3fbSopenharmony_ci 338d722e3fbSopenharmony_cidrm_public int 339d722e3fbSopenharmony_ciradeon_gem_set_domain(struct radeon_bo *bo, uint32_t read_domains, uint32_t write_domain) 340d722e3fbSopenharmony_ci{ 341d722e3fbSopenharmony_ci struct radeon_bo_int *boi = (struct radeon_bo_int *)bo; 342d722e3fbSopenharmony_ci struct drm_radeon_gem_set_domain args; 343d722e3fbSopenharmony_ci int r; 344d722e3fbSopenharmony_ci 345d722e3fbSopenharmony_ci args.handle = bo->handle; 346d722e3fbSopenharmony_ci args.read_domains = read_domains; 347d722e3fbSopenharmony_ci args.write_domain = write_domain; 348d722e3fbSopenharmony_ci 349d722e3fbSopenharmony_ci r = drmCommandWriteRead(boi->bom->fd, 350d722e3fbSopenharmony_ci DRM_RADEON_GEM_SET_DOMAIN, 351d722e3fbSopenharmony_ci &args, 352d722e3fbSopenharmony_ci sizeof(args)); 353d722e3fbSopenharmony_ci return r; 354d722e3fbSopenharmony_ci} 355d722e3fbSopenharmony_ci 356d722e3fbSopenharmony_cidrm_public int radeon_gem_prime_share_bo(struct radeon_bo *bo, int *handle) 357d722e3fbSopenharmony_ci{ 358d722e3fbSopenharmony_ci struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; 359d722e3fbSopenharmony_ci int ret; 360d722e3fbSopenharmony_ci 361d722e3fbSopenharmony_ci ret = drmPrimeHandleToFD(bo_gem->base.bom->fd, bo->handle, DRM_CLOEXEC, handle); 362d722e3fbSopenharmony_ci return ret; 363d722e3fbSopenharmony_ci} 364d722e3fbSopenharmony_ci 365d722e3fbSopenharmony_cidrm_public struct radeon_bo * 366d722e3fbSopenharmony_ciradeon_gem_bo_open_prime(struct radeon_bo_manager *bom, int fd_handle, uint32_t size) 367d722e3fbSopenharmony_ci{ 368d722e3fbSopenharmony_ci struct radeon_bo_gem *bo; 369d722e3fbSopenharmony_ci int r; 370d722e3fbSopenharmony_ci uint32_t handle; 371d722e3fbSopenharmony_ci 372d722e3fbSopenharmony_ci bo = (struct radeon_bo_gem*)calloc(1, sizeof(struct radeon_bo_gem)); 373d722e3fbSopenharmony_ci if (bo == NULL) { 374d722e3fbSopenharmony_ci return NULL; 375d722e3fbSopenharmony_ci } 376d722e3fbSopenharmony_ci 377d722e3fbSopenharmony_ci bo->base.bom = bom; 378d722e3fbSopenharmony_ci bo->base.handle = 0; 379d722e3fbSopenharmony_ci bo->base.size = size; 380d722e3fbSopenharmony_ci bo->base.alignment = 0; 381d722e3fbSopenharmony_ci bo->base.domains = RADEON_GEM_DOMAIN_GTT; 382d722e3fbSopenharmony_ci bo->base.flags = 0; 383d722e3fbSopenharmony_ci bo->base.ptr = NULL; 384d722e3fbSopenharmony_ci atomic_set(&bo->reloc_in_cs, 0); 385d722e3fbSopenharmony_ci bo->map_count = 0; 386d722e3fbSopenharmony_ci 387d722e3fbSopenharmony_ci r = drmPrimeFDToHandle(bom->fd, fd_handle, &handle); 388d722e3fbSopenharmony_ci if (r != 0) { 389d722e3fbSopenharmony_ci free(bo); 390d722e3fbSopenharmony_ci return NULL; 391d722e3fbSopenharmony_ci } 392d722e3fbSopenharmony_ci 393d722e3fbSopenharmony_ci bo->base.handle = handle; 394d722e3fbSopenharmony_ci bo->name = handle; 395d722e3fbSopenharmony_ci 396d722e3fbSopenharmony_ci radeon_bo_ref((struct radeon_bo *)bo); 397d722e3fbSopenharmony_ci return (struct radeon_bo *)bo; 398d722e3fbSopenharmony_ci 399d722e3fbSopenharmony_ci} 400