Back to index

libdrm  2.4.37
Classes | Defines | Functions
radeon.c File Reference
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "internal.h"
#include <sys/mman.h>
#include <sys/ioctl.h>
#include "xf86drm.h"
#include "radeon_drm.h"

Go to the source code of this file.

Classes

struct  radeon_bo

Defines

#define HAVE_STDINT_H
#define _FILE_OFFSET_BITS   64
#define ALIGNMENT   512

Functions

static int radeon_get_prop (struct kms_driver *kms, unsigned key, unsigned *out)
static int radeon_destroy (struct kms_driver *kms)
static int radeon_bo_create (struct kms_driver *kms, const unsigned width, const unsigned height, const enum kms_bo_type type, const unsigned *attr, struct kms_bo **out)
static int radeon_bo_get_prop (struct kms_bo *bo, unsigned key, unsigned *out)
static int radeon_bo_map (struct kms_bo *_bo, void **out)
static int radeon_bo_unmap (struct kms_bo *_bo)
static int radeon_bo_destroy (struct kms_bo *_bo)
int radeon_create (int fd, struct kms_driver **out)

Class Documentation

struct radeon_bo

Definition at line 47 of file radeon.c.

Class Members
uint32_t flags
uint32_t handle
unsigned map_count
void * ptr
uint32_t size

Define Documentation

#define _FILE_OFFSET_BITS   64

Definition at line 30 of file radeon.c.

#define ALIGNMENT   512

Definition at line 45 of file radeon.c.

#define HAVE_STDINT_H

Definition at line 29 of file radeon.c.


Function Documentation

static int radeon_bo_create ( struct kms_driver kms,
const unsigned  width,
const unsigned  height,
const enum kms_bo_type  type,
const unsigned *  attr,
struct kms_bo **  out 
) [static]

Definition at line 74 of file radeon.c.

{
       struct drm_radeon_gem_create arg;
       unsigned size, pitch;
       struct radeon_bo *bo;
       int i, ret;

       for (i = 0; attr[i]; i += 2) {
              switch (attr[i]) {
              case KMS_WIDTH:
              case KMS_HEIGHT:
              case KMS_BO_TYPE:
                     break;
              default:
                     return -EINVAL;
              }
       }

       switch (type) {
       case KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8:
              pitch = 4 * 64;
              size  = 4 * 64 * 64;
              break;
       case KMS_BO_TYPE_SCANOUT_X8R8G8B8:
              pitch = width * 4;
              pitch = (pitch + ALIGNMENT - 1) & ~(ALIGNMENT - 1);
              size  = pitch * height;
              break;
       default:
              return -EINVAL;
       }

       bo = calloc(1, sizeof(*bo));
       if (!bo)
              return -ENOMEM;

       memset(&arg, 0, sizeof(arg));
       arg.size = size;
       arg.alignment = ALIGNMENT;
       arg.initial_domain = RADEON_GEM_DOMAIN_CPU;
       arg.flags = 0;
       arg.handle = 0;

       ret = drmCommandWriteRead(kms->fd, DRM_RADEON_GEM_CREATE,
                                 &arg, sizeof(arg));
       if (ret)
              goto err_free;

       bo->base.kms = kms;
       bo->base.handle = arg.handle;
       bo->base.size = size;
       bo->base.pitch = pitch;
       bo->base.offset = 0;
       bo->map_count = 0;

       *out = &bo->base;

       return 0;

err_free:
       free(bo);
       return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int radeon_bo_destroy ( struct kms_bo _bo) [static]

Definition at line 198 of file radeon.c.

{
       struct radeon_bo *bo = (struct radeon_bo *)_bo;
       struct drm_gem_close arg;
       int ret;

       if (bo->base.ptr) {
              /* XXX Sanity check map_count */
              munmap(bo->base.ptr, bo->base.size);
              bo->base.ptr = NULL;
       }

       memset(&arg, 0, sizeof(arg));
       arg.handle = bo->base.handle;

       ret = drmIoctl(bo->base.kms->fd, DRM_IOCTL_GEM_CLOSE, &arg);
       if (ret)
              return -errno;

       free(bo);
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int radeon_bo_get_prop ( struct kms_bo bo,
unsigned  key,
unsigned *  out 
) [static]

Definition at line 142 of file radeon.c.

{
       switch (key) {
       default:
              return -EINVAL;
       }
}

Here is the caller graph for this function:

static int radeon_bo_map ( struct kms_bo _bo,
void **  out 
) [static]

Definition at line 151 of file radeon.c.

{
       struct radeon_bo *bo = (struct radeon_bo *)_bo;
       struct drm_radeon_gem_mmap arg;
       void *map = NULL;
       int ret;

       if (bo->base.ptr) {
              bo->map_count++;
              *out = bo->base.ptr;
              return 0;
       }

       memset(&arg, 0, sizeof(arg));
       arg.handle = bo->base.handle;
       arg.offset = bo->base.offset;
       arg.size = (uint64_t)bo->base.size;

       ret = drmCommandWriteRead(bo->base.kms->fd, DRM_RADEON_GEM_MMAP,
                               &arg, sizeof(arg));
       if (ret)
              return -errno;

       map = mmap(0, arg.size, PROT_READ | PROT_WRITE, MAP_SHARED,
                  bo->base.kms->fd, arg.addr_ptr);
       if (map == MAP_FAILED)
              return -errno;

       bo->base.ptr = map;
       bo->map_count++;
       *out = bo->base.ptr;

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int radeon_bo_unmap ( struct kms_bo _bo) [static]

Definition at line 187 of file radeon.c.

{
       struct radeon_bo *bo = (struct radeon_bo *)_bo;
       if (--bo->map_count == 0) {
              munmap(bo->base.ptr, bo->base.size);
              bo->base.ptr = NULL;
       }
       return 0;
}

Here is the caller graph for this function:

int radeon_create ( int  fd,
struct kms_driver **  out 
)

Definition at line 222 of file radeon.c.

{
       struct kms_driver *kms;

       kms = calloc(1, sizeof(*kms));
       if (!kms)
              return -ENOMEM;

       kms->fd = fd;

       kms->bo_create = radeon_bo_create;
       kms->bo_map = radeon_bo_map;
       kms->bo_unmap = radeon_bo_unmap;
       kms->bo_get_prop = radeon_bo_get_prop;
       kms->bo_destroy = radeon_bo_destroy;
       kms->get_prop = radeon_get_prop;
       kms->destroy = radeon_destroy;
       *out = kms;

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int radeon_destroy ( struct kms_driver kms) [static]

Definition at line 67 of file radeon.c.

{
       free(kms);
       return 0;
}

Here is the caller graph for this function:

static int radeon_get_prop ( struct kms_driver kms,
unsigned  key,
unsigned *  out 
) [static]

Definition at line 54 of file radeon.c.

{
       switch (key) {
       case KMS_BO_TYPE:
              *out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
              break;
       default:
              return -EINVAL;
       }
       return 0;
}

Here is the caller graph for this function: