Back to index

libdrm  2.4.37
nouveau.h
Go to the documentation of this file.
00001 #ifndef __NOUVEAU_H__
00002 #define __NOUVEAU_H__
00003 
00004 #include <stdint.h>
00005 #include <stdbool.h>
00006 
00007 #define NOUVEAU_DEVICE_CLASS       0x80000000
00008 #define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001
00009 #define NOUVEAU_NOTIFIER_CLASS     0x80000002
00010 #define NOUVEAU_PARENT_CLASS       0xffffffff
00011 
00012 struct nouveau_list {
00013        struct nouveau_list *prev;
00014        struct nouveau_list *next;
00015 };
00016 
00017 struct nouveau_object {
00018        struct nouveau_object *parent;
00019        uint64_t handle;
00020        uint32_t oclass;
00021        uint32_t length;
00022        void *data;
00023 };
00024 
00025 struct nouveau_fifo {
00026        struct nouveau_object *object;
00027        uint32_t channel;
00028        uint32_t pushbuf;
00029        uint64_t unused1[3];
00030 };
00031 
00032 struct nv04_fifo {
00033        struct nouveau_fifo base;
00034        uint32_t vram;
00035        uint32_t gart;
00036        uint32_t notify;
00037 };
00038 
00039 struct nvc0_fifo {
00040        struct nouveau_fifo base;
00041        uint32_t notify;
00042 };
00043 
00044 struct nv04_notify {
00045        struct nouveau_object *object;
00046        uint32_t offset;
00047        uint32_t length;
00048 };
00049 
00050 int  nouveau_object_new(struct nouveau_object *parent, uint64_t handle,
00051                      uint32_t oclass, void *data, uint32_t length,
00052                      struct nouveau_object **);
00053 void nouveau_object_del(struct nouveau_object **);
00054 void *nouveau_object_find(struct nouveau_object *, uint32_t parent_class);
00055 
00056 struct nouveau_device {
00057        struct nouveau_object object;
00058        int fd;
00059        uint32_t lib_version;
00060        uint32_t drm_version;
00061        uint32_t chipset;
00062        uint64_t vram_size;
00063        uint64_t gart_size;
00064        uint64_t vram_limit;
00065        uint64_t gart_limit;
00066 };
00067 
00068 int  nouveau_device_wrap(int fd, int close, struct nouveau_device **);
00069 int  nouveau_device_open(const char *busid, struct nouveau_device **);
00070 void nouveau_device_del(struct nouveau_device **);
00071 int  nouveau_getparam(struct nouveau_device *, uint64_t param, uint64_t *value);
00072 int  nouveau_setparam(struct nouveau_device *, uint64_t param, uint64_t value);
00073 
00074 struct nouveau_client {
00075        struct nouveau_device *device;
00076        int id;
00077 };
00078 
00079 int  nouveau_client_new(struct nouveau_device *, struct nouveau_client **);
00080 void nouveau_client_del(struct nouveau_client **);
00081 
00082 union nouveau_bo_config {
00083        struct {
00084 #define NV04_BO_16BPP 0x00000001
00085 #define NV04_BO_32BPP 0x00000002
00086 #define NV04_BO_ZETA  0x00000004
00087               uint32_t surf_flags;
00088               uint32_t surf_pitch;
00089        } nv04;
00090        struct {
00091               uint32_t memtype;
00092               uint32_t tile_mode;
00093        } nv50;
00094        struct {
00095               uint32_t memtype;
00096               uint32_t tile_mode;
00097        } nvc0;
00098        uint32_t data[8];
00099 };
00100 
00101 #define NOUVEAU_BO_VRAM    0x00000001
00102 #define NOUVEAU_BO_GART    0x00000002
00103 #define NOUVEAU_BO_APER   (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)
00104 #define NOUVEAU_BO_RD      0x00000100
00105 #define NOUVEAU_BO_WR      0x00000200
00106 #define NOUVEAU_BO_RDWR   (NOUVEAU_BO_RD | NOUVEAU_BO_WR)
00107 #define NOUVEAU_BO_NOBLOCK 0x00000400
00108 #define NOUVEAU_BO_LOW     0x00001000
00109 #define NOUVEAU_BO_HIGH    0x00002000
00110 #define NOUVEAU_BO_OR      0x00004000
00111 #define NOUVEAU_BO_MAP     0x80000000
00112 #define NOUVEAU_BO_CONTIG  0x40000000
00113 #define NOUVEAU_BO_NOSNOOP 0x20000000
00114 
00115 struct nouveau_bo {
00116        struct nouveau_device *device;
00117        uint32_t handle;
00118        uint64_t size;
00119        uint32_t flags;
00120        uint64_t offset;
00121        void *map;
00122        union nouveau_bo_config config;
00123 };
00124 
00125 int  nouveau_bo_new(struct nouveau_device *, uint32_t flags, uint32_t align,
00126                   uint64_t size, union nouveau_bo_config *,
00127                   struct nouveau_bo **);
00128 int  nouveau_bo_wrap(struct nouveau_device *, uint32_t handle,
00129                    struct nouveau_bo **);
00130 int  nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name,
00131                       struct nouveau_bo **);
00132 int  nouveau_bo_name_get(struct nouveau_bo *, uint32_t *name);
00133 void nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **);
00134 int  nouveau_bo_map(struct nouveau_bo *, uint32_t access,
00135                   struct nouveau_client *);
00136 int  nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
00137                    struct nouveau_client *);
00138 
00139 struct nouveau_bufref {
00140        struct nouveau_list thead;
00141        struct nouveau_bo *bo;
00142        uint32_t packet;
00143        uint32_t flags;
00144        uint32_t data;
00145        uint32_t vor;
00146        uint32_t tor;
00147        uint32_t priv_data;
00148        void *priv;
00149 };
00150 
00151 struct nouveau_bufctx {
00152        struct nouveau_client *client;
00153        struct nouveau_list head;
00154        struct nouveau_list pending;
00155        struct nouveau_list current;
00156        int relocs;
00157 };
00158 
00159 int  nouveau_bufctx_new(struct nouveau_client *, int bins,
00160                      struct nouveau_bufctx **);
00161 void nouveau_bufctx_del(struct nouveau_bufctx **);
00162 struct nouveau_bufref *
00163 nouveau_bufctx_refn(struct nouveau_bufctx *, int bin,
00164                   struct nouveau_bo *, uint32_t flags);
00165 struct nouveau_bufref *
00166 nouveau_bufctx_mthd(struct nouveau_bufctx *, int bin,  uint32_t packet,
00167                   struct nouveau_bo *, uint64_t data, uint32_t flags,
00168                   uint32_t vor, uint32_t tor);
00169 void nouveau_bufctx_reset(struct nouveau_bufctx *, int bin);
00170 
00171 struct nouveau_pushbuf_krec;
00172 struct nouveau_pushbuf {
00173        struct nouveau_client *client;
00174        struct nouveau_object *channel;
00175        struct nouveau_bufctx *bufctx;
00176        void (*kick_notify)(struct nouveau_pushbuf *);
00177        void *user_priv;
00178        uint32_t rsvd_kick;
00179        uint32_t flags;
00180        uint32_t *cur;
00181        uint32_t *end;
00182 };
00183 
00184 struct nouveau_pushbuf_refn {
00185        struct nouveau_bo *bo;
00186        uint32_t flags;
00187 };
00188 
00189 int  nouveau_pushbuf_new(struct nouveau_client *, struct nouveau_object *channel,
00190                       int nr, uint32_t size, bool immediate,
00191                       struct nouveau_pushbuf **);
00192 void nouveau_pushbuf_del(struct nouveau_pushbuf **);
00193 int  nouveau_pushbuf_space(struct nouveau_pushbuf *, uint32_t dwords,
00194                         uint32_t relocs, uint32_t pushes);
00195 void nouveau_pushbuf_data(struct nouveau_pushbuf *, struct nouveau_bo *,
00196                        uint64_t offset, uint64_t length);
00197 int  nouveau_pushbuf_refn(struct nouveau_pushbuf *,
00198                        struct nouveau_pushbuf_refn *, int nr);
00199 /* Emits a reloc into the push buffer at the current position, you *must*
00200  * have previously added the referenced buffer to a buffer context, and
00201  * validated it against the current push buffer.
00202  */
00203 void nouveau_pushbuf_reloc(struct nouveau_pushbuf *, struct nouveau_bo *,
00204                         uint32_t data, uint32_t flags,
00205                         uint32_t vor, uint32_t tor);
00206 int  nouveau_pushbuf_validate(struct nouveau_pushbuf *);
00207 uint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf *, struct nouveau_bo *);
00208 int  nouveau_pushbuf_kick(struct nouveau_pushbuf *, struct nouveau_object *channel);
00209 struct nouveau_bufctx *
00210 nouveau_pushbuf_bufctx(struct nouveau_pushbuf *, struct nouveau_bufctx *);
00211 
00212 #endif