nouveau: NV04 PFIFO engtab functions
[platform/upstream/libdrm.git] / shared-core / nouveau_drv.h
index 265479f..3e32c2d 100644 (file)
@@ -34,7 +34,7 @@
 
 #define DRIVER_MAJOR           0
 #define DRIVER_MINOR           0
-#define DRIVER_PATCHLEVEL      5
+#define DRIVER_PATCHLEVEL      6
 
 #define NOUVEAU_FAMILY   0x0000FFFF
 #define NOUVEAU_FLAGS    0xFFFF0000
@@ -83,6 +83,7 @@ struct nouveau_fifo
        /* dma object for the command buffer itself */
        struct mem_block      *cmdbuf_mem;
        struct nouveau_object *cmdbuf_obj;
+       uint32_t pushbuf_base;
        /* PGRAPH context, for cards that keep it in RAMIN */
        struct mem_block *ramin_grctx;
        /* objects belonging to this fifo */
@@ -99,6 +100,43 @@ struct nouveau_config {
        } cmdbuf;
 };
 
+typedef struct nouveau_engine_func {
+       struct {
+               int     (*init)(drm_device_t *dev);
+               void    (*takedown)(drm_device_t *dev);
+       } mc;
+
+       struct {
+               int     (*init)(drm_device_t *dev);
+               void    (*takedown)(drm_device_t *dev);
+       } timer;
+
+       struct {
+               int     (*init)(drm_device_t *dev);
+               void    (*takedown)(drm_device_t *dev);
+       } fb;
+
+       struct {
+               int     (*init)(drm_device_t *);
+               void    (*takedown)(drm_device_t *);
+
+               int     (*create_context)(drm_device_t *, int channel);
+               void    (*destroy_context)(drm_device_t *, int channel);
+               int     (*load_context)(drm_device_t *, int channel);
+               int     (*save_context)(drm_device_t *, int channel);
+       } graph;
+
+       struct {
+               int     (*init)(drm_device_t *);
+               void    (*takedown)(drm_device_t *);
+
+               int     (*create_context)(drm_device_t *, int channel);
+               void    (*destroy_context)(drm_device_t *, int channel);
+               int     (*load_context)(drm_device_t *, int channel);
+               int     (*save_context)(drm_device_t *, int channel);
+       } fifo;
+} nouveau_engine_func_t;
+
 typedef struct drm_nouveau_private {
        /* the card type, takes NV_* as values */
        int card_type;
@@ -113,6 +151,8 @@ typedef struct drm_nouveau_private {
        int fifo_alloc_count;
        struct nouveau_fifo fifos[NV_MAX_FIFO_NUMBER];
 
+       struct nouveau_engine_func Engine;
+
        /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */
        uint32_t ramin_size;
        uint32_t ramht_offset;
@@ -154,6 +194,7 @@ extern int nouveau_unload(struct drm_device *dev);
 extern int nouveau_ioctl_getparam(DRM_IOCTL_ARGS);
 extern int nouveau_ioctl_setparam(DRM_IOCTL_ARGS);
 extern void nouveau_wait_for_idle(struct drm_device *dev);
+extern int nouveau_ioctl_card_init(DRM_IOCTL_ARGS);
 
 /* nouveau_mem.c */
 extern uint64_t          nouveau_mem_fb_amount(struct drm_device *dev);
@@ -164,8 +205,7 @@ extern struct mem_block* nouveau_mem_alloc(struct drm_device *dev, int alignment
 extern void              nouveau_mem_free(struct drm_device* dev, struct mem_block*);
 extern int               nouveau_mem_init(struct drm_device *dev);
 extern void              nouveau_mem_close(struct drm_device *dev);
-extern int               nouveau_instmem_init(struct drm_device *dev,
-                                             uint32_t offset);
+extern int               nouveau_instmem_init(struct drm_device *dev);
 extern struct mem_block* nouveau_instmem_alloc(struct drm_device *dev,
                                               uint32_t size, uint32_t align);
 extern void              nouveau_instmem_free(struct drm_device *dev,
@@ -179,6 +219,7 @@ extern void              nouveau_instmem_w32(drm_nouveau_private_t *dev_priv,
 /* nouveau_fifo.c */
 extern int  nouveau_fifo_init(drm_device_t *dev);
 extern int  nouveau_fifo_number(drm_device_t *dev);
+extern int  nouveau_fifo_ctx_size(drm_device_t *dev);
 extern void nouveau_fifo_cleanup(drm_device_t *dev, DRMFILE filp);
 extern int  nouveau_fifo_owner(drm_device_t *dev, DRMFILE filp, int channel);
 extern void nouveau_fifo_free(drm_device_t *dev, int channel);
@@ -202,30 +243,72 @@ extern void        nouveau_irq_preinstall(drm_device_t*);
 extern void        nouveau_irq_postinstall(drm_device_t*);
 extern void        nouveau_irq_uninstall(drm_device_t*);
 
+/* nv04_fb.c */
+extern int  nv04_fb_init(drm_device_t *dev);
+extern void nv04_fb_takedown(drm_device_t *dev);
+
+/* nv10_fb.c */
+extern int  nv10_fb_init(drm_device_t *dev);
+extern void nv10_fb_takedown(drm_device_t *dev);
+
+/* nv40_fb.c */
+extern int  nv40_fb_init(drm_device_t *dev);
+extern void nv40_fb_takedown(drm_device_t *dev);
+
+/* nv04_fifo.c */
+extern int  nv04_fifo_create_context(drm_device_t *dev, int channel);
+extern void nv04_fifo_destroy_context(drm_device_t *dev, int channel);
+extern int  nv04_fifo_load_context(drm_device_t *dev, int channel);
+extern int  nv04_fifo_save_context(drm_device_t *dev, int channel);
+
+/* nv40_fifo.c */
+extern int  nv40_fifo_create_context(drm_device_t *, int channel);
+extern void nv40_fifo_destroy_context(drm_device_t *, int channel);
+extern int  nv40_fifo_load_context(drm_device_t *, int channel);
+extern int  nv40_fifo_save_context(drm_device_t *, int channel);
+
 /* nv04_graph.c */
 extern void nouveau_nv04_context_switch(drm_device_t *dev);
 extern int nv04_graph_init(drm_device_t *dev);
+extern void nv04_graph_takedown(drm_device_t *dev);
 extern int nv04_graph_context_create(drm_device_t *dev, int channel);
 
 /* nv10_graph.c */
 extern void nouveau_nv10_context_switch(drm_device_t *dev);
 extern int nv10_graph_init(drm_device_t *dev);
+extern void nv10_graph_takedown(drm_device_t *dev);
 extern int nv10_graph_context_create(drm_device_t *dev, int channel);
 
 /* nv20_graph.c */
 extern void nouveau_nv20_context_switch(drm_device_t *dev);
 extern int nv20_graph_init(drm_device_t *dev);
+extern void nv20_graph_takedown(drm_device_t *dev);
 extern int nv20_graph_context_create(drm_device_t *dev, int channel);
 
 /* nv30_graph.c */
 extern int nv30_graph_init(drm_device_t *dev);
+extern void nv30_graph_takedown(drm_device_t *dev);
 extern int nv30_graph_context_create(drm_device_t *dev, int channel);
 
 /* nv40_graph.c */
-extern int  nv40_graph_init(drm_device_t *dev);
-extern int  nv40_graph_context_create(drm_device_t *dev, int channel);
-extern void nv40_graph_context_save_current(drm_device_t *dev);
-extern void nv40_graph_context_restore(drm_device_t *dev, int channel);
+extern int  nv40_graph_init(drm_device_t *);
+extern void nv40_graph_takedown(drm_device_t *);
+extern int  nv40_graph_create_context(drm_device_t *, int channel);
+extern void nv40_graph_destroy_context(drm_device_t *, int channel);
+extern int  nv40_graph_load_context(drm_device_t *, int channel);
+extern int  nv40_graph_save_context(drm_device_t *, int channel);
+
+/* nv04_mc.c */
+extern int  nv04_mc_init(drm_device_t *dev);
+extern void nv04_mc_takedown(drm_device_t *dev);
+
+/* nv40_mc.c */
+extern int  nv40_mc_init(drm_device_t *dev);
+extern void nv40_mc_takedown(drm_device_t *dev);
+
+/* nv04_timer.c */
+extern int  nv04_timer_init(drm_device_t *dev);
+extern void nv04_timer_takedown(drm_device_t *dev);
 
 extern long nouveau_compat_ioctl(struct file *filp, unsigned int cmd,
                                unsigned long arg);