Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / char / drm / mga_drv.h
index 1d84a1e..6b0c531 100644 (file)
 
 #define DRIVER_NAME            "mga"
 #define DRIVER_DESC            "Matrox G200/G400"
-#define DRIVER_DATE            "20021029"
+#define DRIVER_DATE            "20051102"
 
 #define DRIVER_MAJOR           3
-#define DRIVER_MINOR           1
-#define DRIVER_PATCHLEVEL      0
+#define DRIVER_MINOR           2
+#define DRIVER_PATCHLEVEL      1
 
 typedef struct drm_mga_primary_buffer {
        u8 *start;
@@ -62,14 +62,14 @@ typedef struct drm_mga_primary_buffer {
 } drm_mga_primary_buffer_t;
 
 typedef struct drm_mga_freelist {
-       struct drm_mga_freelist *next;
-       struct drm_mga_freelist *prev;
+       struct drm_mga_freelist *next;
+       struct drm_mga_freelist *prev;
        drm_mga_age_t age;
-       drm_buf_t *buf;
+       drm_buf_t *buf;
 } drm_mga_freelist_t;
 
 typedef struct {
-       drm_mga_freelist_t *list_entry;
+       drm_mga_freelist_t *list_entry;
        int discard;
        int dispatched;
 } drm_mga_buf_priv_t;
@@ -78,8 +78,8 @@ typedef struct drm_mga_private {
        drm_mga_primary_buffer_t prim;
        drm_mga_sarea_t *sarea_priv;
 
-       drm_mga_freelist_t *head;
-       drm_mga_freelist_t *tail;
+       drm_mga_freelist_t *head;
+       drm_mga_freelist_t *tail;
 
        unsigned int warp_pipe;
        unsigned long warp_pipe_phys[MGA_MAX_WARP_PIPES];
@@ -87,9 +87,43 @@ typedef struct drm_mga_private {
        int chipset;
        int usec_timeout;
 
+       /**
+        * If set, the new DMA initialization sequence was used.  This is
+        * primarilly used to select how the driver should uninitialized its
+        * internal DMA structures.
+        */
+       int used_new_dma_init;
+
+       /**
+        * If AGP memory is used for DMA buffers, this will be the value
+        * \c MGA_PAGPXFER.  Otherwise, it will be zero (for a PCI transfer).
+        */
+       u32 dma_access;
+
+       /**
+        * If AGP memory is used for DMA buffers, this will be the value
+        * \c MGA_WAGP_ENABLE.  Otherwise, it will be zero (for a PCI
+        * transfer).
+        */
+       u32 wagp_enable;
+
+       /**
+        * \name MMIO region parameters.
+        *
+        * \sa drm_mga_private_t::mmio
+        */
+       /*@{ */
+       u32 mmio_base;             /**< Bus address of base of MMIO. */
+       u32 mmio_size;             /**< Size of the MMIO region. */
+       /*@} */
+
        u32 clear_cmd;
        u32 maccess;
 
+       wait_queue_head_t fence_queue;
+       atomic_t last_fence_retired;
+       u32 next_fence_to_post;
+
        unsigned int fb_cpp;
        unsigned int front_offset;
        unsigned int front_pitch;
@@ -108,35 +142,48 @@ typedef struct drm_mga_private {
        drm_local_map_t *status;
        drm_local_map_t *warp;
        drm_local_map_t *primary;
-       drm_local_map_t *buffers;
        drm_local_map_t *agp_textures;
+
+       unsigned long agp_handle;
+       unsigned int agp_size;
 } drm_mga_private_t;
 
+extern drm_ioctl_desc_t mga_ioctls[];
+extern int mga_max_ioctl;
+
                                /* mga_dma.c */
-extern int mga_dma_init( DRM_IOCTL_ARGS );
-extern int mga_dma_flush( DRM_IOCTL_ARGS );
-extern int mga_dma_reset( DRM_IOCTL_ARGS );
-extern int mga_dma_buffers( DRM_IOCTL_ARGS );
-extern void mga_driver_pretakedown(drm_device_t *dev);
-extern int mga_driver_dma_quiescent(drm_device_t *dev);
+extern int mga_dma_bootstrap(DRM_IOCTL_ARGS);
+extern int mga_dma_init(DRM_IOCTL_ARGS);
+extern int mga_dma_flush(DRM_IOCTL_ARGS);
+extern int mga_dma_reset(DRM_IOCTL_ARGS);
+extern int mga_dma_buffers(DRM_IOCTL_ARGS);
+extern int mga_driver_load(drm_device_t *dev, unsigned long flags);
+extern int mga_driver_unload(drm_device_t * dev);
+extern void mga_driver_lastclose(drm_device_t * dev);
+extern int mga_driver_dma_quiescent(drm_device_t * dev);
 
-extern int mga_do_wait_for_idle( drm_mga_private_t *dev_priv );
+extern int mga_do_wait_for_idle(drm_mga_private_t * dev_priv);
 
-extern void mga_do_dma_flush( drm_mga_private_t *dev_priv );
-extern void mga_do_dma_wrap_start( drm_mga_private_t *dev_priv );
-extern void mga_do_dma_wrap_end( drm_mga_private_t *dev_priv );
+extern void mga_do_dma_flush(drm_mga_private_t * dev_priv);
+extern void mga_do_dma_wrap_start(drm_mga_private_t * dev_priv);
+extern void mga_do_dma_wrap_end(drm_mga_private_t * dev_priv);
 
-extern int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf );
+extern int mga_freelist_put(drm_device_t * dev, drm_buf_t * buf);
 
                                /* mga_warp.c */
-extern int mga_warp_install_microcode( drm_mga_private_t *dev_priv );
-extern int mga_warp_init( drm_mga_private_t *dev_priv );
-
-extern int mga_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence);
-extern irqreturn_t mga_driver_irq_handler( DRM_IRQ_ARGS );
-extern void mga_driver_irq_preinstall( drm_device_t *dev );
-extern void mga_driver_irq_postinstall( drm_device_t *dev );
-extern void mga_driver_irq_uninstall( drm_device_t *dev );
+extern unsigned int mga_warp_microcode_size(const drm_mga_private_t * dev_priv);
+extern int mga_warp_install_microcode(drm_mga_private_t * dev_priv);
+extern int mga_warp_init(drm_mga_private_t * dev_priv);
+
+                               /* mga_irq.c */
+extern int mga_driver_fence_wait(drm_device_t * dev, unsigned int *sequence);
+extern int mga_driver_vblank_wait(drm_device_t * dev, unsigned int *sequence);
+extern irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS);
+extern void mga_driver_irq_preinstall(drm_device_t * dev);
+extern void mga_driver_irq_postinstall(drm_device_t * dev);
+extern void mga_driver_irq_uninstall(drm_device_t * dev);
+extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
+                            unsigned long arg);
 
 #define mga_flush_write_combine()      DRM_WRITEMEMORYBARRIER()
 
@@ -152,7 +199,7 @@ extern void mga_driver_irq_uninstall( drm_device_t *dev );
 #define MGA_WRITE( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF( reg ) = val; } while (0)
 #define MGA_WRITE8( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF8( reg ) = val; } while (0)
 
-static inline u32 _MGA_READ(u32 *addr)
+static inline u32 _MGA_READ(u32 * addr)
 {
        DRM_MEMORYBARRIER();
        return *(volatile u32 *)addr;
@@ -174,8 +221,6 @@ static inline u32 _MGA_READ(u32 *addr)
 #define DMAREG1(r)     (u8)(((r - DWGREG1) >> 2) | 0x80)
 #define DMAREG(r)      (ISREG0(r) ? DMAREG0(r) : DMAREG1(r))
 
-
-
 /* ================================================================
  * Helper macross...
  */
@@ -183,7 +228,7 @@ static inline u32 _MGA_READ(u32 *addr)
 #define MGA_EMIT_STATE( dev_priv, dirty )                              \
 do {                                                                   \
        if ( (dirty) & ~MGA_UPLOAD_CLIPRECTS ) {                        \
-               if ( dev_priv->chipset == MGA_CARD_TYPE_G400 ) {        \
+               if ( dev_priv->chipset >= MGA_CARD_TYPE_G400 ) {        \
                        mga_g400_emit_state( dev_priv );                \
                } else {                                                \
                        mga_g200_emit_state( dev_priv );                \
@@ -217,7 +262,6 @@ do {                                                                        \
        }                                                               \
 } while (0)
 
-
 /* ================================================================
  * Primary DMA command stream
  */
@@ -302,7 +346,6 @@ do {                                                                        \
        write += DMA_BLOCK_SIZE;                                        \
 } while (0)
 
-
 /* Buffer aging via primary DMA stream head pointer.
  */
 
@@ -329,7 +372,6 @@ do {                                                                        \
        }                                                               \
 } while (0)
 
-
 #define MGA_ENGINE_IDLE_MASK           (MGA_SOFTRAPEN |                \
                                         MGA_DWGENGSTS |                \
                                         MGA_ENDPRDMASTS)
@@ -338,8 +380,6 @@ do {                                                                        \
 
 #define MGA_DMA_DEBUG                  0
 
-
-
 /* A reduced set of the mga registers.
  */
 #define MGA_CRTC_INDEX                 0x1fd4
@@ -525,6 +565,12 @@ do {                                                                       \
  */
 #define MGA_EXEC                       0x0100
 
+/* AGP PLL encoding (for G200 only).
+ */
+#define MGA_AGP_PLL                    0x1e4c
+#      define MGA_AGP2XPLL_DISABLE             (0 << 0)
+#      define MGA_AGP2XPLL_ENABLE              (1 << 0)
+
 /* Warp registers
  */
 #define MGA_WR0                                0x2d00
@@ -594,7 +640,6 @@ do {                                                                        \
 #      define MGA_G400_WR_MAGIC                (1 << 6)
 #      define MGA_G400_WR56_MAGIC              0x46480000      /* 12800.0f */
 
-
 #define MGA_ILOAD_ALIGN                64
 #define MGA_ILOAD_MASK         (MGA_ILOAD_ALIGN - 1)
 
@@ -629,10 +674,10 @@ do {                                                                      \
 
 /* Simple idle test.
  */
-static __inline__ int mga_is_idle( drm_mga_private_t *dev_priv )
+static __inline__ int mga_is_idle(drm_mga_private_t * dev_priv)
 {
-       u32 status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK;
-       return ( status == MGA_ENDPRDMASTS );
+       u32 status = MGA_READ(MGA_STATUS) & MGA_ENGINE_IDLE_MASK;
+       return (status == MGA_ENDPRDMASTS);
 }
 
 #endif