nouveau.h revision e88f27b3
1e88f27b3Smrg#ifndef __NOUVEAU_H__ 2e88f27b3Smrg#define __NOUVEAU_H__ 3e88f27b3Smrg 4e88f27b3Smrg#include <stdint.h> 5e88f27b3Smrg#include <stdbool.h> 6e88f27b3Smrg 7e88f27b3Smrg#define NOUVEAU_DEVICE_CLASS 0x80000000 8e88f27b3Smrg#define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001 9e88f27b3Smrg#define NOUVEAU_NOTIFIER_CLASS 0x80000002 10e88f27b3Smrg#define NOUVEAU_PARENT_CLASS 0xffffffff 11e88f27b3Smrg 12e88f27b3Smrgstruct nouveau_list { 13e88f27b3Smrg struct nouveau_list *prev; 14e88f27b3Smrg struct nouveau_list *next; 15e88f27b3Smrg}; 16e88f27b3Smrg 17e88f27b3Smrgstruct nouveau_object { 18e88f27b3Smrg struct nouveau_object *parent; 19e88f27b3Smrg uint64_t handle; 20e88f27b3Smrg uint32_t oclass; 21e88f27b3Smrg uint32_t length; 22e88f27b3Smrg void *data; 23e88f27b3Smrg}; 24e88f27b3Smrg 25e88f27b3Smrgstruct nouveau_fifo { 26e88f27b3Smrg struct nouveau_object *object; 27e88f27b3Smrg uint32_t channel; 28e88f27b3Smrg uint32_t pushbuf; 29e88f27b3Smrg uint64_t unused1[3]; 30e88f27b3Smrg}; 31e88f27b3Smrg 32e88f27b3Smrgstruct nv04_fifo { 33e88f27b3Smrg struct nouveau_fifo base; 34e88f27b3Smrg uint32_t vram; 35e88f27b3Smrg uint32_t gart; 36e88f27b3Smrg uint32_t notify; 37e88f27b3Smrg}; 38e88f27b3Smrg 39e88f27b3Smrgstruct nvc0_fifo { 40e88f27b3Smrg struct nouveau_fifo base; 41e88f27b3Smrg uint32_t notify; 42e88f27b3Smrg}; 43e88f27b3Smrg 44e88f27b3Smrg#define NVE0_FIFO_ENGINE_GR 0x00000001 45e88f27b3Smrg#define NVE0_FIFO_ENGINE_VP 0x00000002 46e88f27b3Smrg#define NVE0_FIFO_ENGINE_PPP 0x00000004 47e88f27b3Smrg#define NVE0_FIFO_ENGINE_BSP 0x00000008 48e88f27b3Smrg#define NVE0_FIFO_ENGINE_CE0 0x00000010 49e88f27b3Smrg#define NVE0_FIFO_ENGINE_CE1 0x00000020 50e88f27b3Smrg#define NVE0_FIFO_ENGINE_ENC 0x00000040 51e88f27b3Smrg 52e88f27b3Smrgstruct nve0_fifo { 53e88f27b3Smrg struct { 54e88f27b3Smrg struct nouveau_fifo base; 55e88f27b3Smrg uint32_t notify; 56e88f27b3Smrg }; 57e88f27b3Smrg uint32_t engine; 58e88f27b3Smrg}; 59e88f27b3Smrg 60e88f27b3Smrgstruct nv04_notify { 61e88f27b3Smrg struct nouveau_object *object; 62e88f27b3Smrg uint32_t offset; 63e88f27b3Smrg uint32_t length; 64e88f27b3Smrg}; 65e88f27b3Smrg 66e88f27b3Smrgint nouveau_object_new(struct nouveau_object *parent, uint64_t handle, 67e88f27b3Smrg uint32_t oclass, void *data, uint32_t length, 68e88f27b3Smrg struct nouveau_object **); 69e88f27b3Smrgvoid nouveau_object_del(struct nouveau_object **); 70e88f27b3Smrgvoid *nouveau_object_find(struct nouveau_object *, uint32_t parent_class); 71e88f27b3Smrg 72e88f27b3Smrgstruct nouveau_device { 73e88f27b3Smrg struct nouveau_object object; 74e88f27b3Smrg int fd; 75e88f27b3Smrg uint32_t lib_version; 76e88f27b3Smrg uint32_t drm_version; 77e88f27b3Smrg uint32_t chipset; 78e88f27b3Smrg uint64_t vram_size; 79e88f27b3Smrg uint64_t gart_size; 80e88f27b3Smrg uint64_t vram_limit; 81e88f27b3Smrg uint64_t gart_limit; 82e88f27b3Smrg}; 83e88f27b3Smrg 84e88f27b3Smrgint nouveau_device_wrap(int fd, int close, struct nouveau_device **); 85e88f27b3Smrgint nouveau_device_open(const char *busid, struct nouveau_device **); 86e88f27b3Smrgvoid nouveau_device_del(struct nouveau_device **); 87e88f27b3Smrgint nouveau_getparam(struct nouveau_device *, uint64_t param, uint64_t *value); 88e88f27b3Smrgint nouveau_setparam(struct nouveau_device *, uint64_t param, uint64_t value); 89e88f27b3Smrg 90e88f27b3Smrgstruct nouveau_client { 91e88f27b3Smrg struct nouveau_device *device; 92e88f27b3Smrg int id; 93e88f27b3Smrg}; 94e88f27b3Smrg 95e88f27b3Smrgint nouveau_client_new(struct nouveau_device *, struct nouveau_client **); 96e88f27b3Smrgvoid nouveau_client_del(struct nouveau_client **); 97e88f27b3Smrg 98e88f27b3Smrgunion nouveau_bo_config { 99e88f27b3Smrg struct { 100e88f27b3Smrg#define NV04_BO_16BPP 0x00000001 101e88f27b3Smrg#define NV04_BO_32BPP 0x00000002 102e88f27b3Smrg#define NV04_BO_ZETA 0x00000004 103e88f27b3Smrg uint32_t surf_flags; 104e88f27b3Smrg uint32_t surf_pitch; 105e88f27b3Smrg } nv04; 106e88f27b3Smrg struct { 107e88f27b3Smrg uint32_t memtype; 108e88f27b3Smrg uint32_t tile_mode; 109e88f27b3Smrg } nv50; 110e88f27b3Smrg struct { 111e88f27b3Smrg uint32_t memtype; 112e88f27b3Smrg uint32_t tile_mode; 113e88f27b3Smrg } nvc0; 114e88f27b3Smrg uint32_t data[8]; 115e88f27b3Smrg}; 116e88f27b3Smrg 117e88f27b3Smrg#define NOUVEAU_BO_VRAM 0x00000001 118e88f27b3Smrg#define NOUVEAU_BO_GART 0x00000002 119e88f27b3Smrg#define NOUVEAU_BO_APER (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART) 120e88f27b3Smrg#define NOUVEAU_BO_RD 0x00000100 121e88f27b3Smrg#define NOUVEAU_BO_WR 0x00000200 122e88f27b3Smrg#define NOUVEAU_BO_RDWR (NOUVEAU_BO_RD | NOUVEAU_BO_WR) 123e88f27b3Smrg#define NOUVEAU_BO_NOBLOCK 0x00000400 124e88f27b3Smrg#define NOUVEAU_BO_LOW 0x00001000 125e88f27b3Smrg#define NOUVEAU_BO_HIGH 0x00002000 126e88f27b3Smrg#define NOUVEAU_BO_OR 0x00004000 127e88f27b3Smrg#define NOUVEAU_BO_MAP 0x80000000 128e88f27b3Smrg#define NOUVEAU_BO_CONTIG 0x40000000 129e88f27b3Smrg#define NOUVEAU_BO_NOSNOOP 0x20000000 130e88f27b3Smrg 131e88f27b3Smrgstruct nouveau_bo { 132e88f27b3Smrg struct nouveau_device *device; 133e88f27b3Smrg uint32_t handle; 134e88f27b3Smrg uint64_t size; 135e88f27b3Smrg uint32_t flags; 136e88f27b3Smrg uint64_t offset; 137e88f27b3Smrg void *map; 138e88f27b3Smrg union nouveau_bo_config config; 139e88f27b3Smrg}; 140e88f27b3Smrg 141e88f27b3Smrgint nouveau_bo_new(struct nouveau_device *, uint32_t flags, uint32_t align, 142e88f27b3Smrg uint64_t size, union nouveau_bo_config *, 143e88f27b3Smrg struct nouveau_bo **); 144e88f27b3Smrgint nouveau_bo_wrap(struct nouveau_device *, uint32_t handle, 145e88f27b3Smrg struct nouveau_bo **); 146e88f27b3Smrgint nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name, 147e88f27b3Smrg struct nouveau_bo **); 148e88f27b3Smrgint nouveau_bo_name_get(struct nouveau_bo *, uint32_t *name); 149e88f27b3Smrgvoid nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **); 150e88f27b3Smrgint nouveau_bo_map(struct nouveau_bo *, uint32_t access, 151e88f27b3Smrg struct nouveau_client *); 152e88f27b3Smrgint nouveau_bo_wait(struct nouveau_bo *, uint32_t access, 153e88f27b3Smrg struct nouveau_client *); 154e88f27b3Smrgint nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd, 155e88f27b3Smrg struct nouveau_bo **); 156e88f27b3Smrgint nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd); 157e88f27b3Smrg 158e88f27b3Smrgstruct nouveau_bufref { 159e88f27b3Smrg struct nouveau_list thead; 160e88f27b3Smrg struct nouveau_bo *bo; 161e88f27b3Smrg uint32_t packet; 162e88f27b3Smrg uint32_t flags; 163e88f27b3Smrg uint32_t data; 164e88f27b3Smrg uint32_t vor; 165e88f27b3Smrg uint32_t tor; 166e88f27b3Smrg uint32_t priv_data; 167e88f27b3Smrg void *priv; 168e88f27b3Smrg}; 169e88f27b3Smrg 170e88f27b3Smrgstruct nouveau_bufctx { 171e88f27b3Smrg struct nouveau_client *client; 172e88f27b3Smrg struct nouveau_list head; 173e88f27b3Smrg struct nouveau_list pending; 174e88f27b3Smrg struct nouveau_list current; 175e88f27b3Smrg int relocs; 176e88f27b3Smrg}; 177e88f27b3Smrg 178e88f27b3Smrgint nouveau_bufctx_new(struct nouveau_client *, int bins, 179e88f27b3Smrg struct nouveau_bufctx **); 180e88f27b3Smrgvoid nouveau_bufctx_del(struct nouveau_bufctx **); 181e88f27b3Smrgstruct nouveau_bufref * 182e88f27b3Smrgnouveau_bufctx_refn(struct nouveau_bufctx *, int bin, 183e88f27b3Smrg struct nouveau_bo *, uint32_t flags); 184e88f27b3Smrgstruct nouveau_bufref * 185e88f27b3Smrgnouveau_bufctx_mthd(struct nouveau_bufctx *, int bin, uint32_t packet, 186e88f27b3Smrg struct nouveau_bo *, uint64_t data, uint32_t flags, 187e88f27b3Smrg uint32_t vor, uint32_t tor); 188e88f27b3Smrgvoid nouveau_bufctx_reset(struct nouveau_bufctx *, int bin); 189e88f27b3Smrg 190e88f27b3Smrgstruct nouveau_pushbuf_krec; 191e88f27b3Smrgstruct nouveau_pushbuf { 192e88f27b3Smrg struct nouveau_client *client; 193e88f27b3Smrg struct nouveau_object *channel; 194e88f27b3Smrg struct nouveau_bufctx *bufctx; 195e88f27b3Smrg void (*kick_notify)(struct nouveau_pushbuf *); 196e88f27b3Smrg void *user_priv; 197e88f27b3Smrg uint32_t rsvd_kick; 198e88f27b3Smrg uint32_t flags; 199e88f27b3Smrg uint32_t *cur; 200e88f27b3Smrg uint32_t *end; 201e88f27b3Smrg}; 202e88f27b3Smrg 203e88f27b3Smrgstruct nouveau_pushbuf_refn { 204e88f27b3Smrg struct nouveau_bo *bo; 205e88f27b3Smrg uint32_t flags; 206e88f27b3Smrg}; 207e88f27b3Smrg 208e88f27b3Smrgint nouveau_pushbuf_new(struct nouveau_client *, struct nouveau_object *channel, 209e88f27b3Smrg int nr, uint32_t size, bool immediate, 210e88f27b3Smrg struct nouveau_pushbuf **); 211e88f27b3Smrgvoid nouveau_pushbuf_del(struct nouveau_pushbuf **); 212e88f27b3Smrgint nouveau_pushbuf_space(struct nouveau_pushbuf *, uint32_t dwords, 213e88f27b3Smrg uint32_t relocs, uint32_t pushes); 214e88f27b3Smrgvoid nouveau_pushbuf_data(struct nouveau_pushbuf *, struct nouveau_bo *, 215e88f27b3Smrg uint64_t offset, uint64_t length); 216e88f27b3Smrgint nouveau_pushbuf_refn(struct nouveau_pushbuf *, 217e88f27b3Smrg struct nouveau_pushbuf_refn *, int nr); 218e88f27b3Smrg/* Emits a reloc into the push buffer at the current position, you *must* 219e88f27b3Smrg * have previously added the referenced buffer to a buffer context, and 220e88f27b3Smrg * validated it against the current push buffer. 221e88f27b3Smrg */ 222e88f27b3Smrgvoid nouveau_pushbuf_reloc(struct nouveau_pushbuf *, struct nouveau_bo *, 223e88f27b3Smrg uint32_t data, uint32_t flags, 224e88f27b3Smrg uint32_t vor, uint32_t tor); 225e88f27b3Smrgint nouveau_pushbuf_validate(struct nouveau_pushbuf *); 226e88f27b3Smrguint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf *, struct nouveau_bo *); 227e88f27b3Smrgint nouveau_pushbuf_kick(struct nouveau_pushbuf *, struct nouveau_object *channel); 228e88f27b3Smrgstruct nouveau_bufctx * 229e88f27b3Smrgnouveau_pushbuf_bufctx(struct nouveau_pushbuf *, struct nouveau_bufctx *); 230e88f27b3Smrg 231e88f27b3Smrg#endif 232