Checkpoint commit before I fix IRQ disable/enable.

This commit is contained in:
Gareth Hughes 2001-02-08 15:57:40 +00:00
parent 3239b80b18
commit 9a426ec53e
44 changed files with 462 additions and 388 deletions

View file

@ -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 <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#ifndef _DRM_P_H_

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
/* ================================================================

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
/*

View file

@ -25,9 +25,9 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Daryll Strauss <daryll@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Daryll Strauss <daryll@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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;

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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];

View file

@ -25,12 +25,12 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*
* Acknowledgements:
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#include <linux/config.h>
@ -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
};

View file

@ -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 <faith@valinux.com>
@ -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 */

View file

@ -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 <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#ifndef _DRM_P_H_

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
/* ================================================================

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
/*

View file

@ -25,9 +25,9 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Daryll Strauss <daryll@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Daryll Strauss <daryll@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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;

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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];

View file

@ -25,12 +25,12 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*
* Acknowledgements:
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
*/
#define __NO_VERSION__

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -24,7 +24,7 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#ifndef __MGA_H__

View file

@ -25,12 +25,12 @@
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Jeff Hartmann <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Jeff Hartmann <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
*
* Rewritten by:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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 );

View file

@ -24,7 +24,7 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#define __NO_VERSION__

View file

@ -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 <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
* Authors:
* Jeff Hartmann <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
*
* Rewritten by:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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

View file

@ -25,8 +25,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#include <linux/config.h>
@ -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
};

View file

@ -25,7 +25,7 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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)

View file

@ -25,11 +25,11 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Jeff Hartmann <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
* Jeff Hartmann <jhartmann@valinux.com>
* Keith Whitwell <keithw@valinux.com>
*
* Rewritten by:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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;
}

View file

@ -23,7 +23,7 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Kernel-based WARP engine management:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
/*

View file

@ -24,7 +24,7 @@
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*/
#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...
*/

View file

@ -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 <faith@valinux.com>
@ -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 */

View file

@ -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 <faith@valinux.com>
@ -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 */