From 9a426ec53e78d0e91e47b28c9bcf52f3585a7c1d Mon Sep 17 00:00:00 2001 From: Gareth Hughes Date: Thu, 8 Feb 2001 15:57:40 +0000 Subject: [PATCH] Checkpoint commit before I fix IRQ disable/enable. --- linux-core/drmP.h | 10 +- linux-core/drm_agpsupport.c | 4 +- linux-core/drm_auth.c | 4 +- linux-core/drm_bufs.c | 4 +- linux-core/drm_context.c | 4 +- linux-core/drm_dma.c | 4 +- linux-core/drm_drawable.c | 4 +- linux-core/drm_drv.c | 4 +- linux-core/drm_fops.c | 6 +- linux-core/drm_init.c | 4 +- linux-core/drm_ioctl.c | 6 +- linux-core/drm_lock.c | 4 +- linux-core/drm_memory.h | 6 +- linux-core/drm_proc.c | 8 +- linux-core/drm_vm.c | 4 +- linux-core/mga_drv.c | 8 +- linux/drm.h | 13 +- linux/drmP.h | 10 +- linux/drm_agpsupport.h | 4 +- linux/drm_auth.h | 4 +- linux/drm_bufs.h | 4 +- linux/drm_context.h | 4 +- linux/drm_dma.h | 4 +- linux/drm_drawable.h | 4 +- linux/drm_drv.h | 4 +- linux/drm_fops.h | 6 +- linux/drm_init.h | 4 +- linux/drm_ioctl.h | 6 +- linux/drm_lists.h | 4 +- linux/drm_lock.h | 4 +- linux/drm_memory.h | 6 +- linux/drm_proc.h | 8 +- linux/drm_vm.h | 4 +- linux/mga.h | 2 +- linux/mga_dma.c | 165 ++++++++++++------ linux/mga_drm.c | 2 +- linux/mga_drm.h | 23 ++- linux/mga_drv.c | 8 +- linux/mga_drv.h | 97 +++++------ linux/mga_state.c | 336 ++++++++++++++++++------------------ linux/mga_ucode.h | 2 +- linux/mga_warp.c | 12 +- shared-core/drm.h | 13 +- shared/drm.h | 13 +- 44 files changed, 462 insertions(+), 388 deletions(-) diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 0b00628f..3270952e 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -19,14 +19,14 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #ifndef _DRM_P_H_ diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c index da4f343b..1a81211d 100644 --- a/linux-core/drm_agpsupport.c +++ b/linux-core/drm_agpsupport.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Author: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_auth.c b/linux-core/drm_auth.c index e0e52992..2636e617 100644 --- a/linux-core/drm_auth.c +++ b/linux-core/drm_auth.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index 7a1308ed..f8c9aac0 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_context.c b/linux-core/drm_context.c index ca039522..fd2cf94d 100644 --- a/linux-core/drm_context.c +++ b/linux-core/drm_context.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ /* ================================================================ diff --git a/linux-core/drm_dma.c b/linux-core/drm_dma.c index 03f1814d..16126a95 100644 --- a/linux-core/drm_dma.c +++ b/linux-core/drm_dma.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_drawable.c b/linux-core/drm_drawable.c index 9dedfc76..13e46b9f 100644 --- a/linux-core/drm_drawable.c +++ b/linux-core/drm_drawable.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index a6829794..18935309 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ /* diff --git a/linux-core/drm_fops.c b/linux-core/drm_fops.c index 4963af82..d646f318 100644 --- a/linux-core/drm_fops.c +++ b/linux-core/drm_fops.c @@ -25,9 +25,9 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Daryll Strauss - * Gareth Hughes + * Rickard E. (Rik) Faith + * Daryll Strauss + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_init.c b/linux-core/drm_init.c index 1668efa2..9ae98414 100644 --- a/linux-core/drm_init.c +++ b/linux-core/drm_init.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_ioctl.c b/linux-core/drm_ioctl.c index 7e02028f..cb3775a7 100644 --- a/linux-core/drm_ioctl.c +++ b/linux-core/drm_ioctl.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ @@ -143,7 +143,7 @@ int DRM(getclient)( struct inode *inode, struct file *filp, down(&dev->struct_sem); for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) ; - + if (!pt) { up(&dev->struct_sem); return -EINVAL; diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c index 1b23943a..11b4f0f5 100644 --- a/linux-core/drm_lock.c +++ b/linux-core/drm_lock.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/drm_memory.h b/linux-core/drm_memory.h index 672724a6..363d7adf 100644 --- a/linux-core/drm_memory.h +++ b/linux-core/drm_memory.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ @@ -105,7 +105,7 @@ static int DRM(_mem_info)(char *buf, char **start, off_t offset, *eof = 1; return 0; } - + *eof = 0; *start = &buf[offset]; diff --git a/linux-core/drm_proc.c b/linux-core/drm_proc.c index bbd38f76..a3958241 100644 --- a/linux-core/drm_proc.c +++ b/linux-core/drm_proc.c @@ -25,12 +25,12 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes * * Acknowledgements: - * Matthew J Sottek sent in a patch to fix - * the problem with the proc files not outputting all their information. + * Matthew J Sottek sent in a patch to fix + * the problem with the proc files not outputting all their information. */ #define __NO_VERSION__ diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index 3b8b6c75..347816ac 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux-core/mga_drv.c b/linux-core/mga_drv.c index e8921217..3d9a4f45 100644 --- a/linux-core/mga_drv.c +++ b/linux-core/mga_drv.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #include @@ -38,7 +38,7 @@ #define DRIVER_NAME "mga" #define DRIVER_DESC "Matrox G200/G400" -#define DRIVER_DATE "20010110" +#define DRIVER_DATE "20010206" #define DRIVER_MAJOR 3 #define DRIVER_MINOR 0 @@ -100,8 +100,8 @@ static drm_ioctl_desc_t mga_ioctls[] = { [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_dma_swap, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_dma_clear, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_dma_vertex, 1, 0 }, + [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_dma_iload, 1, 0 }, #if 0 - [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_iload, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_indices, 1, 0 }, #endif }; diff --git a/linux/drm.h b/linux/drm.h index f4021620..a3e7875f 100644 --- a/linux/drm.h +++ b/linux/drm.h @@ -19,10 +19,10 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Rickard E. (Rik) Faith @@ -367,10 +367,9 @@ typedef struct drm_agp_info { #define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) #define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) #define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) - -#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x45, drm_mga_iload_t) -#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x46, drm_mga_vertex_t) -#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x47, drm_mga_indices_t) +#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) +#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) +#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) #define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) /* i810 specific ioctls */ diff --git a/linux/drmP.h b/linux/drmP.h index 0b00628f..3270952e 100644 --- a/linux/drmP.h +++ b/linux/drmP.h @@ -19,14 +19,14 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #ifndef _DRM_P_H_ diff --git a/linux/drm_agpsupport.h b/linux/drm_agpsupport.h index da4f343b..1a81211d 100644 --- a/linux/drm_agpsupport.h +++ b/linux/drm_agpsupport.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Author: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_auth.h b/linux/drm_auth.h index e0e52992..2636e617 100644 --- a/linux/drm_auth.h +++ b/linux/drm_auth.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_bufs.h b/linux/drm_bufs.h index 7a1308ed..f8c9aac0 100644 --- a/linux/drm_bufs.h +++ b/linux/drm_bufs.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_context.h b/linux/drm_context.h index ca039522..fd2cf94d 100644 --- a/linux/drm_context.h +++ b/linux/drm_context.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ /* ================================================================ diff --git a/linux/drm_dma.h b/linux/drm_dma.h index 03f1814d..16126a95 100644 --- a/linux/drm_dma.h +++ b/linux/drm_dma.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_drawable.h b/linux/drm_drawable.h index 9dedfc76..13e46b9f 100644 --- a/linux/drm_drawable.h +++ b/linux/drm_drawable.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_drv.h b/linux/drm_drv.h index a6829794..18935309 100644 --- a/linux/drm_drv.h +++ b/linux/drm_drv.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ /* diff --git a/linux/drm_fops.h b/linux/drm_fops.h index 4963af82..d646f318 100644 --- a/linux/drm_fops.h +++ b/linux/drm_fops.h @@ -25,9 +25,9 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Daryll Strauss - * Gareth Hughes + * Rickard E. (Rik) Faith + * Daryll Strauss + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_init.h b/linux/drm_init.h index 1668efa2..9ae98414 100644 --- a/linux/drm_init.h +++ b/linux/drm_init.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_ioctl.h b/linux/drm_ioctl.h index 7e02028f..cb3775a7 100644 --- a/linux/drm_ioctl.h +++ b/linux/drm_ioctl.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ @@ -143,7 +143,7 @@ int DRM(getclient)( struct inode *inode, struct file *filp, down(&dev->struct_sem); for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) ; - + if (!pt) { up(&dev->struct_sem); return -EINVAL; diff --git a/linux/drm_lists.h b/linux/drm_lists.h index ff22bae9..b597ef77 100644 --- a/linux/drm_lists.h +++ b/linux/drm_lists.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_lock.h b/linux/drm_lock.h index 1b23943a..11b4f0f5 100644 --- a/linux/drm_lock.h +++ b/linux/drm_lock.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/drm_memory.h b/linux/drm_memory.h index 672724a6..363d7adf 100644 --- a/linux/drm_memory.h +++ b/linux/drm_memory.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ @@ -105,7 +105,7 @@ static int DRM(_mem_info)(char *buf, char **start, off_t offset, *eof = 1; return 0; } - + *eof = 0; *start = &buf[offset]; diff --git a/linux/drm_proc.h b/linux/drm_proc.h index bbd38f76..a3958241 100644 --- a/linux/drm_proc.h +++ b/linux/drm_proc.h @@ -25,12 +25,12 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes * * Acknowledgements: - * Matthew J Sottek sent in a patch to fix - * the problem with the proc files not outputting all their information. + * Matthew J Sottek sent in a patch to fix + * the problem with the proc files not outputting all their information. */ #define __NO_VERSION__ diff --git a/linux/drm_vm.h b/linux/drm_vm.h index 3b8b6c75..347816ac 100644 --- a/linux/drm_vm.h +++ b/linux/drm_vm.h @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/mga.h b/linux/mga.h index 1118410a..6c0ed961 100644 --- a/linux/mga.h +++ b/linux/mga.h @@ -24,7 +24,7 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Gareth Hughes + * Gareth Hughes */ #ifndef __MGA_H__ diff --git a/linux/mga_dma.c b/linux/mga_dma.c index a4c0f58f..fb054a9c 100644 --- a/linux/mga_dma.c +++ b/linux/mga_dma.c @@ -25,12 +25,12 @@ * DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Jeff Hartmann - * Keith Whitwell + * Rickard E. (Rik) Faith + * Jeff Hartmann + * Keith Whitwell * * Rewritten by: - * Gareth Hughes + * Gareth Hughes */ #define __NO_VERSION__ @@ -1082,6 +1082,7 @@ int mga_do_dma_idle( drm_mga_private_t *dev_priv ) int mga_do_dma_reset( drm_mga_private_t *dev_priv ) { + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; drm_mga_primary_buffer_t *primary = &dev_priv->prim; DRM_DEBUG( "%s\n", __FUNCTION__ ); @@ -1089,10 +1090,11 @@ int mga_do_dma_reset( drm_mga_private_t *dev_priv ) /* The primary DMA stream should look like new right about now. */ primary->tail = 0; - primary->wrap = 0; primary->space = primary->size - MGA_DMA_SOFTRAP_SIZE; primary->last_flush = 0; + sarea_priv->last_wrap = 0; + /* FIXME: Reset counters, buffer ages etc... */ @@ -1182,7 +1184,7 @@ void mga_do_dma_flush( drm_mga_private_t *dev_priv ) } primary->space -= MGA_DMA_SOFTRAP_SIZE; - DRM_DEBUG( " space = 0x%06lx\n", (unsigned long)primary->space ); + DRM_DEBUG( " space = 0x%06x\n", primary->space ); primary->last_flush = primary->tail; @@ -1210,9 +1212,9 @@ void mga_do_dma_wrap( drm_mga_private_t *dev_priv ) mga_flush_write_combine(); MGA_WRITE( MGA_PRIMEND, tail | MGA_PRIMNOSTART | MGA_PAGPXFER ); - spin_lock_irqsave( &primary->lock, flags ); + spin_lock_irqsave( &primary->tail_lock, flags ); primary->tail = 0; - spin_unlock_irqrestore( &primary->lock, flags ); + spin_unlock_irqrestore( &primary->tail_lock, flags ); head = *primary->head; @@ -1243,6 +1245,7 @@ static void mga_dma_service( int irq, void *device, struct pt_regs *regs ) drm_device_t *dev = (drm_device_t *)device; drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; drm_mga_primary_buffer_t *primary = &dev_priv->prim; + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; u32 head = dev_priv->primary->offset; u32 tail; @@ -1256,17 +1259,38 @@ static void mga_dma_service( int irq, void *device, struct pt_regs *regs ) MGA_WRITE( MGA_ICLEAR, MGA_SOFTRAPICLR ); - spin_lock( &primary->lock ); + spin_lock( &primary->tail_lock ); tail = primary->tail + dev_priv->primary->offset; - spin_unlock( &primary->lock ); + sarea_priv->last_wrap++; + spin_unlock( &primary->tail_lock ); DRM_DEBUG( " *** wrap interrupt:\n" ); - DRM_DEBUG( " head = 0x%06lx\n", head - dev_priv->primary->offset); - DRM_DEBUG( " tail = 0x%06lx\n", tail - dev_priv->primary->offset); + DRM_DEBUG( " head = 0x%06lx\n", + head - dev_priv->primary->offset ); + DRM_DEBUG( " tail = 0x%06lx\n", + tail - dev_priv->primary->offset ); + DRM_DEBUG( " wrap = %d\n", sarea_priv->last_wrap ); mga_flush_write_combine(); MGA_WRITE( MGA_PRIMADDRESS, head | MGA_DMA_GENERAL ); MGA_WRITE( MGA_PRIMEND, tail | MGA_PRIMNOSTART | MGA_PAGPXFER ); + +#if 0 + queue_task( &dev->tq, &tq_immediate ); + mark_bh( IMMEDIATE_BH ); +#endif +} + +static int mga_dma_task_queue( void *dev ) +{ + drm_mga_private_t *dev_priv = ((drm_device_t *)dev)->dev_private; + drm_mga_primary_buffer_t *primary = &dev_priv->prim; + + spin_lock( &primary->list_lock ); + mga_do_freelist_wrap( dev ); + spin_unlock( &primary->list_lock ); + + return 0; } @@ -1289,8 +1313,9 @@ static void mga_freelist_print( drm_device_t *dev ) DRM_INFO( "current freelist:\n" ); for ( entry = dev_priv->head->next ; entry ; entry = entry->next ) { - DRM_INFO( " %p idx=%2d age=0x%x\n", - entry, entry->buf->idx, entry->age ); + DRM_INFO( " %p idx=%2d age=0x%x 0x%06lx\n", + entry, entry->buf->idx, entry->age.head, + entry->age.head - dev_priv->primary->offset ); } DRM_INFO( "\n" ); } @@ -1311,7 +1336,7 @@ static int mga_freelist_init( drm_device_t *dev ) return -ENOMEM; memset( dev_priv->head, 0, sizeof(drm_mga_freelist_t) ); - dev_priv->head->age = MGA_BUFFER_USED; + SET_AGE( &dev_priv->head->age, MGA_BUFFER_USED, 0 ); for ( i = 0 ; i < dma->buf_count ; i++ ) { buf = dma->buflist[i]; @@ -1326,7 +1351,7 @@ static int mga_freelist_init( drm_device_t *dev ) entry->next = dev_priv->head->next; entry->prev = dev_priv->head; - entry->age = MGA_BUFFER_FREE; + SET_AGE( &entry->age, MGA_BUFFER_FREE, 0 ); entry->buf = buf; if ( dev_priv->head->next != NULL ) @@ -1364,6 +1389,7 @@ static void mga_freelist_cleanup( drm_device_t *dev ) static void mga_freelist_reset( drm_device_t *dev ) { drm_device_dma_t *dma = dev->dma; + drm_mga_private_t *dev_priv = dev->dev_private; drm_buf_t *buf; drm_mga_buf_priv_t *buf_priv; int i; @@ -1371,7 +1397,8 @@ static void mga_freelist_reset( drm_device_t *dev ) for ( i = 0 ; i < dma->buf_count ; i++ ) { buf = dma->buflist[i]; buf_priv = buf->dev_private; - buf_priv->list_entry->age = MGA_BUFFER_FREE; + SET_AGE( &buf_priv->list_entry->age, + MGA_BUFFER_FREE, 0 ); } } @@ -1380,20 +1407,28 @@ static drm_buf_t *mga_freelist_get( drm_device_t *dev ) drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_freelist_t *next; drm_mga_freelist_t *prev; + drm_mga_freelist_t *tail = dev_priv->tail; + u32 head, wrap; - DRM_DEBUG( "%s: tail=0x%x status=0x%x\n", - __FUNCTION__, dev_priv->tail->age, - dev_priv->prim.status[1] ); -#if 0 - mga_freelist_print( dev ); -#endif - if ( dev_priv->tail->age <= dev_priv->prim.status[1] ) { + head = *dev_priv->prim.head; + wrap = dev_priv->sarea_priv->last_wrap; + + DRM_DEBUG( "%s: tail=0x%06lx %d\n", + __FUNCTION__, + tail->age.head ? + tail->age.head - dev_priv->primary->offset : 0, + tail->age.wrap ); + DRM_DEBUG( "%s: head=0x%06lx %d\n", + __FUNCTION__, + head - dev_priv->primary->offset, wrap ); + + if ( TEST_AGE( &tail->age, wrap, head ) ) { prev = dev_priv->tail->prev; next = dev_priv->tail; prev->next = NULL; next->prev = next->next = NULL; dev_priv->tail = prev; - next->age = MGA_BUFFER_USED; + SET_AGE( &next->age, MGA_BUFFER_USED, 0 ); return next->buf; } @@ -1408,14 +1443,18 @@ static int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf ) drm_mga_freelist_t *head; drm_mga_freelist_t *next; drm_mga_freelist_t *prev; - DRM_DEBUG( "%s: age=0x%x\n", - __FUNCTION__, buf_priv->list_entry->age ); + DRM_DEBUG( "%s: age=0x%06lx wrap=%d\n", + __FUNCTION__, + buf_priv->list_entry->age.head - + dev_priv->primary->offset, + buf_priv->list_entry->age.wrap ); - if ( buf_priv->list_entry->age == MGA_BUFFER_USED ) { + if ( buf_priv->list_entry->age.head == MGA_BUFFER_USED ) { /* Discarded buffer, put it on the tail. */ next = buf_priv->list_entry; - next->age = MGA_BUFFER_FREE; + next->age.head = MGA_BUFFER_FREE; + next->age.wrap = 0; prev = dev_priv->tail; prev->next = next; next->prev = prev; @@ -1437,6 +1476,30 @@ static int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf ) return 0; } +/* The list spinlock must have been acquired before this can be called... + */ +void mga_do_freelist_wrap( drm_device_t *dev ) +{ + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_freelist_t *entry; + u32 head = *dev_priv->prim.head; + + DRM_INFO( "%s:\n", __FUNCTION__ ); +#if 0 + DRM_DEBUG( " before...\n" ); + mga_freelist_print( dev ); +#endif + + for ( entry = dev_priv->head->next ; entry ; entry = entry->next ) { + SET_AGE( &entry->age, MGA_BUFFER_FREE, 0 ); + } + +#if 0 + DRM_DEBUG( " after...\n" ); + mga_freelist_print( dev ); +#endif +} + /* ================================================================ * DMA initialization, cleanup @@ -1449,13 +1512,12 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) DRM_DEBUG( "%s\n", __FUNCTION__ ); dev_priv = DRM(alloc)( sizeof(drm_mga_private_t), DRM_MEM_DRIVER ); - if ( dev_priv == NULL ) + if ( !dev_priv ) return -ENOMEM; dev->dev_private = (void *)dev_priv; memset( dev_priv, 0, sizeof(drm_mga_private_t) ); - dev_priv->chipset = init->chipset; dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; @@ -1477,18 +1539,12 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) dev_priv->depth_offset = init->depth_offset; dev_priv->depth_pitch = init->depth_pitch; - DRM_INFO( " macces = 0x%08x\n", init->maccess ); - DRM_INFO( "front offset = 0x%08x\n", init->front_offset ); - DRM_INFO( "front pitch = 0x%08x\n", init->front_pitch ); - DRM_INFO( " back offset = 0x%08x\n", init->back_offset ); - DRM_INFO( " back pitch = 0x%08x\n", init->back_pitch ); - DRM_INFO( "depth offset = 0x%08x\n", init->depth_offset ); - DRM_INFO( "depth pitch = 0x%08x\n", init->depth_pitch ); - dev_priv->sarea = dev->maplist[0]; DO_FIND_MAP( dev_priv->fb, init->fb_offset ); DO_FIND_MAP( dev_priv->mmio, init->mmio_offset ); + DO_FIND_MAP( dev_priv->status, init->status_offset ); + DO_FIND_MAP( dev_priv->warp, init->warp_offset ); DO_FIND_MAP( dev_priv->primary, init->primary_offset ); DO_FIND_MAP( dev_priv->buffers, init->buffers_offset ); @@ -1515,19 +1571,24 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) return ret; } +#if 0 dev_priv->prim.status_page = mga_alloc_page(); if ( !dev_priv->prim.status_page ) { DRM_ERROR( "failed to allocate status page!\n" ); mga_do_cleanup_dma( dev ); return -ENOMEM; } + dev_priv->prim.status = (u32 *)dev_priv->prim.status_page; - dev_priv->prim.status = ioremap_nocache( virt_to_bus((void *)dev_priv->prim.status_page), PAGE_SIZE ); - if ( dev_priv->prim.status == NULL ) { + if ( !dev_priv->prim.status ) { DRM_ERROR( "failed to remap status page!\n" ); mga_do_cleanup_dma( dev ); return -ENOMEM; } +#endif + dev_priv->sarea_priv->last_wrap = 0; + + dev_priv->prim.status = (u32 *)&dev_priv->status->handle; mga_do_wait_for_idle( dev_priv ); @@ -1537,7 +1598,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) dev_priv->primary->offset | MGA_DMA_GENERAL ); MGA_WRITE( MGA_PRIMPTR, - virt_to_bus((void *)dev_priv->prim.status_page) | + virt_to_bus((void *)dev_priv->prim.status) | MGA_PRIMPTREN0 | /* Soft trap, SECEND, SETUPEND */ MGA_PRIMPTREN1 ); /* DWGSYNC */ @@ -1548,15 +1609,15 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) dev_priv->prim.head = &dev_priv->prim.status[0]; dev_priv->prim.tail = 0; - dev_priv->prim.wrap = 0; dev_priv->prim.space = dev_priv->prim.size - MGA_DMA_SOFTRAP_SIZE; dev_priv->prim.last_flush = 0; dev_priv->prim.high_mark = 0; - spin_lock_init( &dev_priv->prim.lock ); + spin_lock_init( &dev_priv->prim.tail_lock ); + spin_lock_init( &dev_priv->prim.list_lock ); - dev_priv->sarea_priv->last_dispatch = 0; + dev_priv->prim.status[0] = dev_priv->primary->offset; dev_priv->prim.status[1] = 0; if ( mga_freelist_init( dev ) < 0 ) { @@ -1575,12 +1636,11 @@ int mga_do_cleanup_dma( drm_device_t *dev ) if ( dev->dev_private ) { drm_mga_private_t *dev_priv = dev->dev_private; - if ( dev_priv->prim.status ) { - iounmap( (void *)dev_priv->prim.status ); - } +#if 0 if ( dev_priv->prim.status_page ) { mga_free_page( dev_priv->prim.status_page ); } +#endif DO_IOREMAPFREE( dev_priv->warp ); DO_IOREMAPFREE( dev_priv->primary ); @@ -1700,6 +1760,13 @@ int mga_irq_install( drm_device_t *dev, int irq ) dev->dma->next_queue = NULL; dev->dma->this_buffer = NULL; +#if 0 + INIT_LIST_HEAD(&dev->tq.list); + dev->tq.sync = 0; + dev->tq.routine = (void (*)(void *))mga_dma_task_queue; + dev->tq.data = dev; +#endif + /* Before installing handler */ MGA_WRITE( MGA_IEN, 0 ); @@ -1801,7 +1868,7 @@ if ( 0 ) { ADVANCE_DMA(); - FLUSH_DMA(); + mga_do_dma_flush( dev_priv ); udelay( 5 ); diff --git a/linux/mga_drm.c b/linux/mga_drm.c index 4ce2b49e..979d4023 100644 --- a/linux/mga_drm.c +++ b/linux/mga_drm.c @@ -24,7 +24,7 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Gareth Hughes + * Gareth Hughes */ #define __NO_VERSION__ diff --git a/linux/mga_drm.h b/linux/mga_drm.h index a0240f8e..76367840 100644 --- a/linux/mga_drm.h +++ b/linux/mga_drm.h @@ -24,11 +24,12 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * - * Authors: Jeff Hartmann - * Keith Whitwell + * Authors: + * Jeff Hartmann + * Keith Whitwell * * Rewritten by: - * Gareth Hughes + * Gareth Hughes */ #ifndef __MGA_DRM_H__ @@ -158,6 +159,13 @@ typedef struct { unsigned int texorg4; } drm_mga_texture_regs_t; +/* General ageing mechanism + */ +typedef struct { + unsigned int head; /* Position of head pointer */ + unsigned int wrap; /* Primary DMA wrap count */ +} drm_mga_age_t; + typedef struct _drm_mga_sarea { /* The channel for communication of state information to the kernel * on firing a vertex dma buffer. @@ -196,6 +204,10 @@ typedef struct _drm_mga_sarea { /* Counters for aging textures and for client-side throttling. */ + unsigned int status[4]; + unsigned int last_wrap; + + drm_mga_age_t last_frame; unsigned int last_enqueue; /* last time a buffer was enqueued */ unsigned int last_dispatch; /* age of the most recently dispatched buffer */ unsigned int last_quiescent; /* */ @@ -245,6 +257,7 @@ typedef struct drm_mga_init { unsigned int fb_offset; unsigned int mmio_offset; + unsigned int status_offset; unsigned int warp_offset; unsigned int primary_offset; unsigned int buffers_offset; @@ -280,8 +293,8 @@ typedef struct drm_mga_indices { typedef struct drm_mga_iload { int idx; - int length; - unsigned int destOrg; + unsigned int dstorg; + unsigned int length; } drm_mga_iload_t; #endif diff --git a/linux/mga_drv.c b/linux/mga_drv.c index e8921217..3d9a4f45 100644 --- a/linux/mga_drv.c +++ b/linux/mga_drv.c @@ -25,8 +25,8 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Rickard E. (Rik) Faith - * Gareth Hughes + * Rickard E. (Rik) Faith + * Gareth Hughes */ #include @@ -38,7 +38,7 @@ #define DRIVER_NAME "mga" #define DRIVER_DESC "Matrox G200/G400" -#define DRIVER_DATE "20010110" +#define DRIVER_DATE "20010206" #define DRIVER_MAJOR 3 #define DRIVER_MINOR 0 @@ -100,8 +100,8 @@ static drm_ioctl_desc_t mga_ioctls[] = { [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_dma_swap, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_dma_clear, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_dma_vertex, 1, 0 }, + [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_dma_iload, 1, 0 }, #if 0 - [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_iload, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_indices, 1, 0 }, #endif }; diff --git a/linux/mga_drv.h b/linux/mga_drv.h index 97c8faef..510ee05b 100644 --- a/linux/mga_drv.h +++ b/linux/mga_drv.h @@ -25,7 +25,7 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Gareth Hughes + * Gareth Hughes */ #ifndef __MGA_DRV_H__ @@ -62,7 +62,6 @@ typedef struct drm_mga_primary_buffer { volatile u32 *head; u32 tail; - u32 wrap; int space; unsigned long status_page; @@ -71,14 +70,14 @@ typedef struct drm_mga_primary_buffer { u32 last_flush; u32 high_mark; - spinlock_t lock; + spinlock_t tail_lock; + spinlock_t list_lock; } drm_mga_primary_buffer_t; - typedef struct drm_mga_freelist { struct drm_mga_freelist *next; struct drm_mga_freelist *prev; - volatile unsigned int age; + drm_mga_age_t age; drm_buf_t *buf; } drm_mga_freelist_t; @@ -94,52 +93,16 @@ typedef struct { #define MGA_IN_GETBUF 3 typedef struct drm_mga_private { - u32 dispatch_status; - unsigned int next_prim_age; - volatile unsigned int last_prim_age; - int reserved_map_idx; - int buffer_map_idx; - drm_mga_sarea_t *sarea_priv; - int primary_size; - int warp_ucode_size; - int chipset; - unsigned int frontOffset; - unsigned int backOffset; - unsigned int depthOffset; - unsigned int textureOffset; - unsigned int textureSize; - int cpp; - unsigned int stride; - int sgram; - int use_agp; - drm_mga_warp_index_t WarpIndex[MGA_MAX_G400_PIPES]; - unsigned int WarpPipe; - unsigned int vertexsize; - atomic_t pending_bufs; - void *status_page; - unsigned long real_status_page; - u8 *ioremap; - drm_mga_prim_buf_t **prim_bufs; - drm_mga_prim_buf_t *next_prim; - drm_mga_prim_buf_t *last_prim; - drm_mga_prim_buf_t *current_prim; - int current_prim_idx; - wait_queue_head_t flush_queue; /* Processes waiting until flush */ - wait_queue_head_t wait_queue; /* Processes waiting until interrupt */ - wait_queue_head_t buf_queue; /* Processes waiting for a free buf */ - /* Some validated register values: - */ - u32 mAccess; - - drm_mga_primary_buffer_t prim; - - unsigned int warp_pipe; - unsigned long warp_pipe_phys[MGA_MAX_WARP_PIPES]; + drm_mga_sarea_t *sarea_priv; drm_mga_freelist_t *head; drm_mga_freelist_t *tail; + unsigned int warp_pipe; + unsigned long warp_pipe_phys[MGA_MAX_WARP_PIPES]; + + int chipset; int usec_timeout; u32 clear_cmd; @@ -161,6 +124,7 @@ typedef struct drm_mga_private { drm_map_t *sarea; drm_map_t *fb; drm_map_t *mmio; + drm_map_t *status; drm_map_t *warp; drm_map_t *primary; drm_map_t *buffers; @@ -209,6 +173,9 @@ extern int mga_dma_swap( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg ); extern int mga_dma_vertex( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg ); +extern int mga_dma_iload( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); + #if 0 extern int mga_clear_bufs( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg ); @@ -416,18 +383,15 @@ do { \ #define ADVANCE_DMA() \ do { \ dev_priv->prim.space -= (write - dev_priv->prim.tail); \ - spin_lock_irqsave( &dev_priv->prim.lock, flags ); \ + spin_lock_irqsave( &dev_priv->prim.tail_lock, flags ); \ dev_priv->prim.tail = write; \ - spin_unlock_irqrestore( &dev_priv->prim.lock, flags ); \ + spin_unlock_irqrestore( &dev_priv->prim.tail_lock, flags ); \ if ( MGA_VERBOSE ) { \ DRM_INFO( "ADVANCE_DMA() tail=0x%05x sp=0x%x\n", \ write, dev_priv->prim.space ); \ } \ } while (0) -#define FLUSH_DMA() mga_do_dma_flush( dev_priv ); - - /* Never use this, always use DMA_BLOCK(...) for primary DMA output. */ #define DMA_WRITE( offset, val ) \ @@ -453,6 +417,28 @@ do { \ } while (0) +/* Buffer ageing via primary DMA stream head pointer. + */ + +#define SET_AGE( age, h, w ) \ +do { \ + (age)->head = h; \ + (age)->wrap = w; \ +} while (0) + +#define TEST_AGE( age, h, w ) ( (age)->wrap < w || \ + ( (age)->wrap == w && \ + (age)->head <= h ) ) + +#define AGE_BUFFER( buf_priv ) \ +do { \ + drm_mga_freelist_t *entry = (buf_priv)->list_entry; \ + entry->age.head = (dev_priv->prim.tail + \ + dev_priv->primary->offset); \ + entry->age.wrap = dev_priv->sarea_priv->last_wrap; \ +} while (0) + + #define MGA_ENGINE_IDLE_MASK (MGA_SOFTRAPEN | \ MGA_DWGENGSTS | \ MGA_ENDPRDMASTS) @@ -461,9 +447,6 @@ do { \ #define MGA_DMA_SOFTRAP_SIZE 32 * DMA_BLOCK_SIZE -#define MGA_DMA_IS_IDLE( dev_priv ) test_bit( MGA_DMA_IDLE, \ - &dev_priv->prim.state ) - /* A reduced set of the mga registers. @@ -570,6 +553,12 @@ do { \ #define MGA_SETUPEND 0x2cd4 #define MGA_SOFTRAP 0x2c48 #define MGA_SRCORG 0x2cb4 +# define MGA_SRMMAP_MASK (1 << 0) +# define MGA_SRCMAP_FB (0 << 0) +# define MGA_SRCMAP_SYSMEM (1 << 0) +# define MGA_SRCACC_MASK (1 << 1) +# define MGA_SRCACC_PCI (0 << 1) +# define MGA_SRCACC_AGP (1 << 1) #define MGA_STATUS 0x1e14 # define MGA_SOFTRAPEN (1 << 0) # define MGA_DWGENGSTS (1 << 16) diff --git a/linux/mga_state.c b/linux/mga_state.c index 5093d1ed..f1328d9e 100644 --- a/linux/mga_state.c +++ b/linux/mga_state.c @@ -25,11 +25,11 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Jeff Hartmann - * Keith Whitwell + * Jeff Hartmann + * Keith Whitwell * * Rewritten by: - * Gareth Hughes + * Gareth Hughes */ #define __NO_VERSION__ @@ -318,7 +318,8 @@ static inline void mga_g400_emit_pipe( drm_mga_private_t *dev_priv ) MGA_DWGCTL, MGA_DWGCTL_FLUSH ); DMA_BLOCK( MGA_LEN + MGA_EXEC, 0x00000001, - MGA_DWGSYNC, 0x00007000, + /*MGA_DWGSYNC, 0x00007000,*/ + MGA_DMAPAD, 0x00000000, MGA_TEXCTL2, MGA_G400_TC2_MAGIC, MGA_LEN + MGA_EXEC, 0x00000000 ); @@ -488,9 +489,8 @@ static int mga_verify_state( drm_mga_private_t *dev_priv ) return ( ret == 0 ); } -static int mga_verify_tex_blit( drm_mga_private_t *dev_priv, - unsigned long bus_address, - unsigned int dstorg, int length ) +static int mga_verify_iload( drm_mga_private_t *dev_priv, + unsigned int dstorg, unsigned int length ) { if ( dstorg < dev_priv->texture_offset || dstorg + length > (dev_priv->texture_offset + @@ -522,53 +522,72 @@ static void mga_dma_dispatch_clear( drm_device_t *dev, DMA_LOCALS; DRM_DEBUG( "%s\n", __FUNCTION__ ); - for ( i = 0 ; i < nbox ; i++ ) { - unsigned int height = pbox[i].y2 - pbox[i].y1; + if ( clear->flags & MGA_FRONT ) { + BEGIN_DMA( 1 + nbox ); - BEGIN_DMA( 6 ); + DMA_BLOCK( MGA_FCOL, clear->clear_color, + MGA_PLNWT, clear->color_mask, + MGA_DSTORG, dev_priv->front_offset, + MGA_DWGCTL, dev_priv->clear_cmd ); - if ( clear->flags & MGA_FRONT ) { - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_PLNWT, clear->color_mask, - MGA_YDSTLEN, (pbox[i].y1 << 16) | height, - MGA_FXBNDRY, (pbox[i].x2 << 16) | pbox[i].x1 ); + for ( i = 0 ; i < nbox ; i++ ) { + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_FCOL, clear->clear_color, - MGA_DSTORG, dev_priv->front_offset, - MGA_DWGCTL + MGA_EXEC, - dev_priv->clear_cmd ); - } - - if ( clear->flags & MGA_BACK ) { - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_PLNWT, clear->color_mask, - MGA_YDSTLEN, (pbox[i].y1 << 16) | height, - MGA_FXBNDRY, (pbox[i].x2 << 16) | pbox[i].x1 ); - - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_FCOL, clear->clear_color, - MGA_DSTORG, dev_priv->back_offset, - MGA_DWGCTL + MGA_EXEC, - dev_priv->clear_cmd ); - } - - if ( clear->flags & MGA_DEPTH ) { - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_PLNWT, clear->depth_mask, - MGA_YDSTLEN, (pbox[i].y1 << 16) | height, - MGA_FXBNDRY, (pbox[i].x2 << 16) | pbox[i].x1 ); - - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_FCOL, clear->clear_depth, - MGA_DSTORG, dev_priv->depth_offset, - MGA_DWGCTL + MGA_EXEC, - dev_priv->clear_cmd ); + MGA_DMAPAD, 0x00000000, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY + MGA_EXEC, + (box->x2 << 16) | box->x1 ); } ADVANCE_DMA(); } + if ( clear->flags & MGA_BACK ) { + BEGIN_DMA( 1 + nbox ); + + DMA_BLOCK( MGA_FCOL, clear->clear_color, + MGA_PLNWT, clear->color_mask, + MGA_DSTORG, dev_priv->back_offset, + MGA_DWGCTL, dev_priv->clear_cmd ); + + for ( i = 0 ; i < nbox ; i++ ) { + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY + MGA_EXEC, + (box->x2 << 16) | box->x1 ); + } + + ADVANCE_DMA(); + } + + if ( clear->flags & MGA_DEPTH ) { + BEGIN_DMA( 1 + nbox ); + + DMA_BLOCK( MGA_FCOL, clear->clear_depth, + MGA_PLNWT, clear->depth_mask, + MGA_DSTORG, dev_priv->depth_offset, + MGA_DWGCTL, dev_priv->clear_cmd ); + + for ( i = 0 ; i < nbox ; i++ ) { + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY + MGA_EXEC, + (box->x2 << 16) | box->x1 ); + } + + ADVANCE_DMA(); + } +#if 0 BEGIN_DMA( 1 ); DMA_BLOCK( MGA_DMAPAD, 0x00000000, @@ -577,6 +596,7 @@ static void mga_dma_dispatch_clear( drm_device_t *dev, MGA_DWGCTL, ctx->dwgctl ); ADVANCE_DMA(); +#endif mga_do_dma_flush( dev_priv ); } @@ -593,16 +613,11 @@ static void mga_dma_dispatch_swap( drm_device_t *dev ) DMA_LOCALS; DRM_DEBUG( "%s\n", __FUNCTION__ ); - BEGIN_DMA( 4 + nbox ); + BEGIN_DMA( 2 + nbox ); - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_DMAPAD, 0x00000000, - MGA_DWGSYNC, 0x00007100, - MGA_DWGSYNC, 0x00007000 ); - - DMA_BLOCK( MGA_DSTORG, dev_priv->front_offset, - MGA_MACCESS, dev_priv->maccess, + DMA_BLOCK( MGA_MACCESS, dev_priv->maccess, MGA_SRCORG, dev_priv->back_offset, + MGA_DSTORG, dev_priv->front_offset, MGA_AR5, pitch ); DMA_BLOCK( MGA_DMAPAD, 0x00000000, @@ -611,27 +626,28 @@ static void mga_dma_dispatch_swap( drm_device_t *dev ) MGA_DWGCTL, MGA_DWGCTL_COPY ); for ( i = 0 ; i < nbox ; i++ ) { - u32 h = pbox[i].y2 - pbox[i].y1; - u32 start = pbox[i].y1 * pitch; + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; + u32 start = box->y1 * pitch; - DMA_BLOCK( MGA_AR0, start + pbox[i].x2 - 1, - MGA_AR3, start + pbox[i].x1, - MGA_FXBNDRY, ((pbox[i].x2 - 1) << 16) | pbox[i].x1, + DMA_BLOCK( MGA_AR0, start + box->x2 - 1, + MGA_AR3, start + box->x1, + MGA_FXBNDRY, ((box->x2 - 1) << 16) | box->x1, MGA_YDSTLEN + MGA_EXEC, - (pbox[i].y1 << 16) | h ); + (box->y1 << 16) | height ); } - +#if 0 DMA_BLOCK( MGA_DMAPAD, 0x00000000, MGA_PLNWT, ctx->plnwt, MGA_SRCORG, dev_priv->front_offset, MGA_DWGCTL, ctx->dwgctl ); +#endif ADVANCE_DMA(); mga_do_dma_flush( dev_priv ); } - static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf ) { drm_mga_private_t *dev_priv = dev->dev_private; @@ -670,23 +686,8 @@ static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf ) } if ( buf_priv->discard ) { -#if 0 - if ( buf_priv->dispatched == 1 ) { - buf_priv->list_entry->age = sarea_priv->last_dispatch; - - BEGIN_DMA( 1 ); - - DMA_BLOCK( MGA_DMAPAD, 0x00000000, - MGA_DMAPAD, 0x00000000, - MGA_DMAPAD, 0x00000000, - MGA_DWGSYNC, sarea_priv->last_dispatch ); - - ADVANCE_DMA(); - - sarea_priv->last_dispatch += 4; - } -#endif - + if ( buf_priv->dispatched == 1 ) + AGE_BUFFER( buf_priv ); buf->pending = 0; buf->used = 0; buf_priv->dispatched = 0; @@ -702,45 +703,6 @@ static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf ) #if 0 -/* This copies a 64 byte aligned agp region to the frambuffer - * with a standard blit, the ioctl needs to do checking */ - -static void mga_dma_dispatch_tex_blit(drm_device_t * dev, - unsigned long bus_address, - int length, unsigned int destOrg) -{ - drm_mga_private_t *dev_priv = dev->dev_private; - int use_agp = PDEA_pagpxfer_enable | 0x00000001; - u16 y2; - PRIMLOCALS; - - y2 = length / 64; - - PRIM_OVERFLOW(dev, dev_priv, 30); - - PRIMOUTREG(MGAREG_DSTORG, destOrg); - PRIMOUTREG(MGAREG_MACCESS, 0x00000000); - PRIMOUTREG(MGAREG_SRCORG, (u32) bus_address | use_agp); - PRIMOUTREG(MGAREG_AR5, 64); - - PRIMOUTREG(MGAREG_PITCH, 64); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGCTL, MGA_COPY_CMD); - - PRIMOUTREG(MGAREG_AR0, 63); - PRIMOUTREG(MGAREG_AR3, 0); - PRIMOUTREG(MGAREG_FXBNDRY, (63 << 16)); - PRIMOUTREG(MGAREG_YDSTLEN + MGAREG_MGA_EXEC, y2); - - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_SRCORG, 0); - PRIMOUTREG(MGAREG_PITCH, dev_priv->stride / dev_priv->cpp); - PRIMOUTREG(MGAREG_DWGSYNC, 0x7000); - PRIMADVANCE(dev_priv); -} - - static void mga_dma_dispatch_indices(drm_device_t * dev, drm_buf_t * buf, unsigned int start, unsigned int end) @@ -793,6 +755,51 @@ static void mga_dma_dispatch_indices(drm_device_t * dev, #endif +/* This copies a 64 byte aligned agp region to the frambuffer with a + * standard blit, the ioctl needs to do checking. + */ +static void mga_dma_dispatch_iload( drm_device_t *dev, drm_buf_t *buf, + unsigned int dstorg, unsigned int length ) +{ + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_buf_priv_t *buf_priv = buf->dev_private; + u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM; + u32 y2; + DMA_LOCALS; + + y2 = length / 64; + + BEGIN_DMA( 4 ); + + DMA_BLOCK( MGA_DSTORG, dstorg, + MGA_MACCESS, 0x00000000, + MGA_SRCORG, srcorg, + MGA_AR5, 64 ); + + DMA_BLOCK( MGA_PITCH, 64, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DWGCTL, MGA_DWGCTL_COPY ); + + DMA_BLOCK( MGA_AR0, 63, + MGA_AR3, 0, + MGA_FXBNDRY, (63 << 16) | 0, + MGA_YDSTLEN + MGA_EXEC, y2 ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_SRCORG, dev_priv->front_offset, + MGA_PITCH, dev_priv->front_pitch / dev_priv->fb_cpp, + MGA_DWGSYNC, 0x00007000 ); + + ADVANCE_DMA(); + +#if 0 + AGE_BUFFER( buf_priv ); +#endif + buf_priv->discard = 1; + mga_freelist_put( dev, buf ); +} + /* ================================================================ @@ -864,11 +871,12 @@ int mga_dma_vertex( struct inode *inode, struct file *filp, (drm_mga_vertex_t *)arg, sizeof(vertex) ) ) return -EFAULT; - - /* HACK: Force this for now... +#if 0 + /* HACK: oh well... */ if ( mga_do_wait_for_idle( dev_priv ) < 0 ) return -EBUSY; +#endif buf = dma->buflist[vertex.idx]; buf_priv = buf->dev_private; @@ -898,51 +906,6 @@ int mga_dma_vertex( struct inode *inode, struct file *filp, #if 0 -int mga_iload(struct inode *inode, struct file *filp, - unsigned int cmd, unsigned long arg) -{ - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - drm_device_dma_t *dma = dev->dma; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; - drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_buf_t *buf; - drm_mga_buf_priv_t *buf_priv; - drm_mga_iload_t iload; - unsigned long bus_address; - - if (copy_from_user(&iload, (drm_mga_iload_t *) arg, sizeof(iload))) - return -EFAULT; - - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_iload called without lock held\n"); - return -EINVAL; - } - - buf = dma->buflist[iload.idx]; - buf_priv = buf->dev_private; - bus_address = buf->bus_address; - - if (mgaVerifyIload(dev_priv, - bus_address, iload.destOrg, iload.length)) { - mga_freelist_put(dev, buf); - return -EINVAL; - } - - sarea_priv->dirty |= MGA_UPLOAD_CTX; - - mga_dma_dispatch_tex_blit(dev, bus_address, iload.length, - iload.destOrg); - AGEBUF(dev_priv, buf_priv); - buf_priv->discard = 1; - mga_freelist_put(dev, buf); - mga_flush_write_combine(); - mga_dma_schedule(dev, 1); - return 0; -} - - int mga_indices(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { @@ -989,3 +952,48 @@ int mga_indices(struct inode *inode, struct file *filp, #endif + + +int mga_dma_iload( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_device_dma_t *dma = dev->dma; + drm_mga_private_t *dev_priv = dev->dev_private; + drm_buf_t *buf; + drm_mga_buf_priv_t *buf_priv; + drm_mga_iload_t iload; + DRM_INFO( __FUNCTION__ ":\n" ); + + LOCK_TEST_WITH_RETURN( dev ); + + if ( copy_from_user( &iload, (drm_mga_iload_t *)arg, sizeof(iload) ) ) + return -EFAULT; +#if 1 + /* HACK: oh well... + */ + if ( mga_do_wait_for_idle( dev_priv ) < 0 ) + return -EBUSY; +#endif + + buf = dma->buflist[iload.idx]; + buf_priv = buf->dev_private; + +#if 0 + DRM_INFO( " verifying iload...\n" ); + if ( mga_verify_iload( dev_priv, iload.dstorg, iload.length ) ) { + mga_freelist_put( dev, buf ); + return -EINVAL; + } + DRM_INFO( " verifying iload... done.\n" ); +#endif + + mga_dma_dispatch_iload( dev, buf, iload.dstorg, iload.length ); + + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT; + + return 0; +} diff --git a/linux/mga_ucode.h b/linux/mga_ucode.h index 537be2f4..fa0f82ec 100644 --- a/linux/mga_ucode.h +++ b/linux/mga_ucode.h @@ -23,7 +23,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Kernel-based WARP engine management: - * Gareth Hughes + * Gareth Hughes */ /* diff --git a/linux/mga_warp.c b/linux/mga_warp.c index 8dcdb1b9..5994ab0c 100644 --- a/linux/mga_warp.c +++ b/linux/mga_warp.c @@ -24,7 +24,7 @@ * OTHER DEALINGS IN THE SOFTWARE. * * Authors: - * Gareth Hughes + * Gareth Hughes */ #define __NO_VERSION__ @@ -41,7 +41,7 @@ #define WARP_UCODE_INSTALL( which, where ) \ do { \ - DRM_INFO( " pcbase = 0x%08lx vcbase = %p\n", pcbase, vcbase ); \ + DRM_DEBUG( " pcbase = 0x%08lx vcbase = %p\n", pcbase, vcbase );\ dev_priv->warp_pipe_phys[where] = pcbase; \ memcpy( vcbase, which, sizeof(which) ); \ pcbase += WARP_UCODE_SIZE( which ); \ @@ -72,7 +72,7 @@ static unsigned int mga_warp_g400_microcode_size( drm_mga_private_t *dev_priv ) size = PAGE_ALIGN( size ); - DRM_INFO( "G400 ucode size = %d bytes\n", size ); + DRM_DEBUG( "G400 ucode size = %d bytes\n", size ); return size; } @@ -91,7 +91,7 @@ static unsigned int mga_warp_g200_microcode_size( drm_mga_private_t *dev_priv ) size = PAGE_ALIGN( size ); - DRM_INFO( "G200 ucode size = %d bytes\n", size ); + DRM_DEBUG( "G200 ucode size = %d bytes\n", size ); return size; } @@ -163,7 +163,7 @@ static int mga_warp_install_g200_microcode( drm_mga_private_t *dev_priv ) int mga_warp_install_microcode( drm_device_t *dev ) { drm_mga_private_t *dev_priv = dev->dev_private; - DRM_INFO( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "%s\n", __FUNCTION__ ); switch ( dev_priv->chipset ) { case MGA_CARD_TYPE_G400: @@ -181,7 +181,7 @@ int mga_warp_init( drm_device_t *dev ) { drm_mga_private_t *dev_priv = dev->dev_private; u32 wmisc; - DRM_INFO( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "%s\n", __FUNCTION__ ); /* FIXME: Get rid of these damned magic numbers... */ diff --git a/shared-core/drm.h b/shared-core/drm.h index f4021620..a3e7875f 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -19,10 +19,10 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Rickard E. (Rik) Faith @@ -367,10 +367,9 @@ typedef struct drm_agp_info { #define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) #define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) #define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) - -#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x45, drm_mga_iload_t) -#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x46, drm_mga_vertex_t) -#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x47, drm_mga_indices_t) +#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) +#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) +#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) #define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) /* i810 specific ioctls */ diff --git a/shared/drm.h b/shared/drm.h index f4021620..a3e7875f 100644 --- a/shared/drm.h +++ b/shared/drm.h @@ -19,10 +19,10 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Rickard E. (Rik) Faith @@ -367,10 +367,9 @@ typedef struct drm_agp_info { #define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) #define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) #define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) - -#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x45, drm_mga_iload_t) -#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x46, drm_mga_vertex_t) -#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x47, drm_mga_indices_t) +#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) +#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) +#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) #define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) /* i810 specific ioctls */