Back to index

libdrm  2.4.37
Classes | Defines | Functions
nouveau.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 "nouveau_drm.h"

Go to the source code of this file.

Classes

struct  nouveau_bo

Defines

#define HAVE_STDINT_H
#define _FILE_OFFSET_BITS   64

Functions

static int nouveau_get_prop (struct kms_driver *kms, unsigned key, unsigned *out)
static int nouveau_destroy (struct kms_driver *kms)
static int nouveau_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 nouveau_bo_get_prop (struct kms_bo *bo, unsigned key, unsigned *out)
static int nouveau_bo_map (struct kms_bo *_bo, void **out)
static int nouveau_bo_unmap (struct kms_bo *_bo)
static int nouveau_bo_destroy (struct kms_bo *_bo)
int nouveau_create (int fd, struct kms_driver **out)

Class Documentation

struct nouveau_bo

Definition at line 44 of file nouveau.c.

Collaboration diagram for nouveau_bo:
Class Members
struct nouveau_device * device
uint32_t flags
uint32_t handle
void * map
unsigned map_count
uint64_t map_handle
uint64_t offset
uint64_t size

Define Documentation

#define _FILE_OFFSET_BITS   64

Definition at line 30 of file nouveau.c.

#define HAVE_STDINT_H

Definition at line 29 of file nouveau.c.


Function Documentation

static int nouveau_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 72 of file nouveau.c.

{
       struct drm_nouveau_gem_new arg;
       unsigned size, pitch;
       struct nouveau_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;
              }
       }

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

       if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8) {
              pitch = 64 * 4;
              size = 64 * 64 * 4;
       } else if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8) {
              pitch = width * 4;
              pitch = (pitch + 512 - 1) & ~(512 - 1);
              size = pitch * height;
       } else {
              return -EINVAL;
       }

       memset(&arg, 0, sizeof(arg));
       arg.info.size = size;
       arg.info.domain = NOUVEAU_GEM_DOMAIN_MAPPABLE | NOUVEAU_GEM_DOMAIN_VRAM;
       arg.info.tile_mode = 0;
       arg.info.tile_flags = 0;
       arg.align = 512;
       arg.channel_hint = 0;

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

       bo->base.kms = kms;
       bo->base.handle = arg.info.handle;
       bo->base.size = size;
       bo->base.pitch = pitch;
       bo->map_handle = arg.info.map_handle;

       *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 nouveau_bo_destroy ( struct kms_bo _bo) [static]

Definition at line 176 of file nouveau.c.

{
       struct nouveau_bo *bo = (struct nouveau_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 nouveau_bo_get_prop ( struct kms_bo bo,
unsigned  key,
unsigned *  out 
) [static]

Definition at line 136 of file nouveau.c.

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

Here is the caller graph for this function:

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

Definition at line 145 of file nouveau.c.

{
       struct nouveau_bo *bo = (struct nouveau_bo *)_bo;
       void *map = NULL;

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

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

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

       return 0;
}

Here is the caller graph for this function:

static int nouveau_bo_unmap ( struct kms_bo _bo) [static]

Definition at line 168 of file nouveau.c.

{
       struct nouveau_bo *bo = (struct nouveau_bo *)_bo;
       bo->map_count--;
       return 0;
}

Here is the caller graph for this function:

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

Definition at line 200 of file nouveau.c.

{
       struct kms_driver *kms;

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

       kms->fd = fd;

       kms->bo_create = nouveau_bo_create;
       kms->bo_map = nouveau_bo_map;
       kms->bo_unmap = nouveau_bo_unmap;
       kms->bo_get_prop = nouveau_bo_get_prop;
       kms->bo_destroy = nouveau_bo_destroy;
       kms->get_prop = nouveau_get_prop;
       kms->destroy = nouveau_destroy;
       *out = kms;

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int nouveau_destroy ( struct kms_driver kms) [static]

Definition at line 65 of file nouveau.c.

{
       free(kms);
       return 0;
}

Here is the caller graph for this function:

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

Definition at line 52 of file nouveau.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: