Back to index

libdrm  2.4.37
Classes | Functions | Variables
radeon_bo_gem.c File Reference
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>
#include "xf86drm.h"
#include "xf86atomic.h"
#include "drm.h"
#include "radeon_drm.h"
#include "radeon_bo.h"
#include "radeon_bo_int.h"
#include "radeon_bo_gem.h"

Go to the source code of this file.

Classes

struct  radeon_bo_gem
struct  bo_manager_gem

Functions

static int bo_wait (struct radeon_bo_int *boi)
static struct radeon_bobo_open (struct radeon_bo_manager *bom, uint32_t handle, uint32_t size, uint32_t alignment, uint32_t domains, uint32_t flags)
static void bo_ref (struct radeon_bo_int *boi)
static struct radeon_bobo_unref (struct radeon_bo_int *boi)
static int bo_map (struct radeon_bo_int *boi, int write)
static int bo_unmap (struct radeon_bo_int *boi)
static int bo_is_busy (struct radeon_bo_int *boi, uint32_t *domain)
static int bo_set_tiling (struct radeon_bo_int *boi, uint32_t tiling_flags, uint32_t pitch)
static int bo_get_tiling (struct radeon_bo_int *boi, uint32_t *tiling_flags, uint32_t *pitch)
struct radeon_bo_managerradeon_bo_manager_gem_ctor (int fd)
void radeon_bo_manager_gem_dtor (struct radeon_bo_manager *bom)
uint32_t radeon_gem_name_bo (struct radeon_bo *bo)
void * radeon_gem_get_reloc_in_cs (struct radeon_bo *bo)
int radeon_gem_get_kernel_name (struct radeon_bo *bo, uint32_t *name)
int radeon_gem_set_domain (struct radeon_bo *bo, uint32_t read_domains, uint32_t write_domain)

Variables

static struct radeon_bo_funcs

Class Documentation

struct radeon_bo_gem

Definition at line 49 of file radeon_bo_gem.c.

Class Members
int map_count
uint32_t name
void * priv_ptr
atomic_t reloc_in_cs
struct bo_manager_gem

Definition at line 57 of file radeon_bo_gem.c.


Function Documentation

static int bo_get_tiling ( struct radeon_bo_int boi,
uint32_t *  tiling_flags,
uint32_t *  pitch 
) [static]

Definition at line 252 of file radeon_bo_gem.c.

{
    struct drm_radeon_gem_set_tiling args = {};
    int r;

    args.handle = boi->handle;

    r = drmCommandWriteRead(boi->bom->fd,
                            DRM_RADEON_GEM_GET_TILING,
                            &args,
                            sizeof(args));

    if (r)
        return r;

    *tiling_flags = args.tiling_flags;
    *pitch = args.pitch;
    return r;
}

Here is the call graph for this function:

static int bo_is_busy ( struct radeon_bo_int boi,
uint32_t *  domain 
) [static]

Definition at line 220 of file radeon_bo_gem.c.

{
    struct drm_radeon_gem_busy args;
    int ret;

    args.handle = boi->handle;
    args.domain = 0;

    ret = drmCommandWriteRead(boi->bom->fd, DRM_RADEON_GEM_BUSY,
                              &args, sizeof(args));

    *domain = args.domain;
    return ret;
}

Here is the call graph for this function:

static int bo_map ( struct radeon_bo_int boi,
int  write 
) [static]

Definition at line 151 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi;
    struct drm_radeon_gem_mmap args;
    int r;
    void *ptr;

    if (bo_gem->map_count++ != 0) {
        return 0;
    }
    if (bo_gem->priv_ptr) {
        goto wait;
    }

    boi->ptr = NULL;

    /* Zero out args to make valgrind happy */
    memset(&args, 0, sizeof(args));
    args.handle = boi->handle;
    args.offset = 0;
    args.size = (uint64_t)boi->size;
    r = drmCommandWriteRead(boi->bom->fd,
                            DRM_RADEON_GEM_MMAP,
                            &args,
                            sizeof(args));
    if (r) {
        fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n",
                boi, boi->handle, r);
        return r;
    }
    ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, boi->bom->fd, args.addr_ptr);
    if (ptr == MAP_FAILED)
        return -errno;
    bo_gem->priv_ptr = ptr;
wait:
    boi->ptr = bo_gem->priv_ptr;
    r = bo_wait(boi);
    if (r)
        return r;
    return 0;
}

Here is the call graph for this function:

static struct radeon_bo* bo_open ( struct radeon_bo_manager bom,
uint32_t  handle,
uint32_t  size,
uint32_t  alignment,
uint32_t  domains,
uint32_t  flags 
) [static, read]

Definition at line 63 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo;
    int r;

    bo = (struct radeon_bo_gem*)calloc(1, sizeof(struct radeon_bo_gem));
    if (bo == NULL) {
        return NULL;
    }

    bo->base.bom = bom;
    bo->base.handle = 0;
    bo->base.size = size;
    bo->base.alignment = alignment;
    bo->base.domains = domains;
    bo->base.flags = flags;
    bo->base.ptr = NULL;
    atomic_set(&bo->reloc_in_cs, 0);
    bo->map_count = 0;
    if (handle) {
        struct drm_gem_open open_arg;

        memset(&open_arg, 0, sizeof(open_arg));
        open_arg.name = handle;
        r = drmIoctl(bom->fd, DRM_IOCTL_GEM_OPEN, &open_arg);
        if (r != 0) {
            free(bo);
            return NULL;
        }
        bo->base.handle = open_arg.handle;
        bo->base.size = open_arg.size;
        bo->name = handle;
    } else {
        struct drm_radeon_gem_create args;

        args.size = size;
        args.alignment = alignment;
        args.initial_domain = bo->base.domains;
        args.flags = 0;
        args.handle = 0;
        r = drmCommandWriteRead(bom->fd, DRM_RADEON_GEM_CREATE,
                                &args, sizeof(args));
        bo->base.handle = args.handle;
        if (r) {
            fprintf(stderr, "Failed to allocate :\n");
            fprintf(stderr, "   size      : %d bytes\n", size);
            fprintf(stderr, "   alignment : %d bytes\n", alignment);
            fprintf(stderr, "   domains   : %d\n", bo->base.domains);
            free(bo);
            return NULL;
        }
    }
    radeon_bo_ref((struct radeon_bo*)bo);
    return (struct radeon_bo*)bo;
}

Here is the call graph for this function:

static void bo_ref ( struct radeon_bo_int boi) [static]

Definition at line 124 of file radeon_bo_gem.c.

{
}
static int bo_set_tiling ( struct radeon_bo_int boi,
uint32_t  tiling_flags,
uint32_t  pitch 
) [static]

Definition at line 235 of file radeon_bo_gem.c.

{
    struct drm_radeon_gem_set_tiling args;
    int r;

    args.handle = boi->handle;
    args.tiling_flags = tiling_flags;
    args.pitch = pitch;

    r = drmCommandWriteRead(boi->bom->fd,
                            DRM_RADEON_GEM_SET_TILING,
                            &args,
                            sizeof(args));
    return r;
}

Here is the call graph for this function:

static int bo_unmap ( struct radeon_bo_int boi) [static]

Definition at line 193 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi;

    if (--bo_gem->map_count > 0) {
        return 0;
    }
    //munmap(bo->ptr, bo->size);
    boi->ptr = NULL;
    return 0;
}
static struct radeon_bo* bo_unref ( struct radeon_bo_int boi) [static, read]

Definition at line 128 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi;
    struct drm_gem_close args;

    if (boi->cref) {
        return (struct radeon_bo *)boi;
    }
    if (bo_gem->priv_ptr) {
        munmap(bo_gem->priv_ptr, boi->size);
    }

    /* Zero out args to make valgrind happy */
    memset(&args, 0, sizeof(args));

    /* close object */
    args.handle = boi->handle;
    drmIoctl(boi->bom->fd, DRM_IOCTL_GEM_CLOSE, &args);
    memset(bo_gem, 0, sizeof(struct radeon_bo_gem));
    free(bo_gem);
    return NULL;
}

Here is the call graph for this function:

static int bo_wait ( struct radeon_bo_int boi) [static]

Definition at line 205 of file radeon_bo_gem.c.

{
    struct drm_radeon_gem_wait_idle args;
    int ret;

    /* Zero out args to make valgrind happy */
    memset(&args, 0, sizeof(args));
    args.handle = boi->handle;
    do {
        ret = drmCommandWriteRead(boi->bom->fd, DRM_RADEON_GEM_WAIT_IDLE,
                                  &args, sizeof(args));
    } while (ret == -EBUSY);
    return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

struct radeon_bo_manager* radeon_bo_manager_gem_ctor ( int  fd) [read]

Definition at line 286 of file radeon_bo_gem.c.

{
    struct bo_manager_gem *bomg;

    bomg = (struct bo_manager_gem*)calloc(1, sizeof(struct bo_manager_gem));
    if (bomg == NULL) {
        return NULL;
    }
    bomg->base.funcs = &bo_gem_funcs;
    bomg->base.fd = fd;
    return (struct radeon_bo_manager*)bomg;
}

Definition at line 299 of file radeon_bo_gem.c.

{
    struct bo_manager_gem *bomg = (struct bo_manager_gem*)bom;

    if (bom == NULL) {
        return;
    }
    free(bomg);
}
int radeon_gem_get_kernel_name ( struct radeon_bo bo,
uint32_t *  name 
)

Definition at line 321 of file radeon_bo_gem.c.

{
    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
    struct drm_gem_flink flink;
    int r;

    flink.handle = bo->handle;
    r = drmIoctl(boi->bom->fd, DRM_IOCTL_GEM_FLINK, &flink);
    if (r) {
        return r;
    }
    *name = flink.name;
    return 0;
}

Here is the call graph for this function:

void* radeon_gem_get_reloc_in_cs ( struct radeon_bo bo)

Definition at line 315 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo;
    return &bo_gem->reloc_in_cs;
}

Here is the caller graph for this function:

uint32_t radeon_gem_name_bo ( struct radeon_bo bo)

Definition at line 309 of file radeon_bo_gem.c.

{
    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo;
    return bo_gem->name;
}
int radeon_gem_set_domain ( struct radeon_bo bo,
uint32_t  read_domains,
uint32_t  write_domain 
)

Definition at line 336 of file radeon_bo_gem.c.

{
    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
    struct drm_radeon_gem_set_domain args;
    int r;

    args.handle = bo->handle;
    args.read_domains = read_domains;
    args.write_domain = write_domain;

    r = drmCommandWriteRead(boi->bom->fd,
                            DRM_RADEON_GEM_SET_DOMAIN,
                            &args,
                            sizeof(args));
    return r;
}

Here is the call graph for this function:


Variable Documentation

struct radeon_bo_funcs [static]
Initial value:

Definition at line 273 of file radeon_bo_gem.c.