mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-28 19:10:14 +01:00
Initial merge with the trunk (XFree 4.2.x, Mesa 4.x)
This commit is contained in:
parent
ab87c5d0d1
commit
9448f35c3b
11 changed files with 1625 additions and 1 deletions
75
linux-core/mach64_drv.c
Normal file
75
linux-core/mach64_drv.c
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/* mach64_drv.c -- mach64 (Rage Pro) driver -*- linux-c -*-
|
||||
* Created: Fri Nov 24 18:34:32 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include "mach64.h"
|
||||
#include "drmP.h"
|
||||
#include "mach64_drv.h"
|
||||
#include "ati_pcigart.h"
|
||||
|
||||
|
||||
#define DRIVER_AUTHOR "Gareth Hughes"
|
||||
|
||||
#define DRIVER_NAME "mach64"
|
||||
#define DRIVER_DESC "DRM module for the ATI Rage Pro"
|
||||
#define DRIVER_DATE "20010107"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_INIT)] = { mach64_dma_init, 1, 1 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_CLEAR)] = { mach64_dma_clear, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_SWAP)] = { mach64_dma_swap, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_IDLE)] = { mach64_dma_idle, 1, 0 },
|
||||
|
||||
#if 0
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mach64_dma, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_VERTEX)] = { mach64_vertex, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_BLIT)] = { mach64_blit, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_FLUSH)] = { mach64_flush, 1, 0 },
|
||||
#endif
|
||||
|
||||
#include "drm_agpsupport.h"
|
||||
#include "drm_auth.h"
|
||||
#include "drm_bufs.h"
|
||||
#include "drm_context.h"
|
||||
#include "drm_dma.h"
|
||||
#include "drm_drawable.h"
|
||||
#include "drm_drv.h"
|
||||
#include "drm_fops.h"
|
||||
#include "drm_init.h"
|
||||
#include "drm_ioctl.h"
|
||||
#include "drm_lock.h"
|
||||
#include "drm_memory.h"
|
||||
#include "drm_proc.h"
|
||||
#include "drm_vm.h"
|
||||
#include "drm_stub.h"
|
||||
#include "drm_scatter.h"
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
# **** End of SMP/MODVERSIONS detection
|
||||
|
||||
MODS = gamma.o tdfx.o r128.o radeon.o
|
||||
MODS = gamma.o tdfx.o r128.o radeon.o mach64.o
|
||||
LIBS =
|
||||
|
||||
DRMTEMPLATES = drm_auth.h drm_bufs.h drm_context.h drm_dma.h drm_drawable.h \
|
||||
|
|
@ -58,6 +58,8 @@ R128HEADERS = r128.h r128_drv.h r128_drm.h $(DRMHEADERS) $(DRMTEMPLATES)
|
|||
RADEONOBJS = radeon_drv.o radeon_cp.o radeon_state.o
|
||||
RADEONHEADERS = radeon.h radeon_drv.h radeon_drm.h $(DRMHEADERS) \
|
||||
$(DRMTEMPLATES)
|
||||
MACH64OBJS= mach64_drv.o mach64_dma.o mach64_state.o
|
||||
MACH64HEADERS= mach64_drv.h mach64_drm.h $(DRMHEADERS) $(DRMTEMPLATES)
|
||||
|
||||
INC = /usr/include
|
||||
|
||||
|
|
@ -221,6 +223,11 @@ radeon_drv.o: radeon_drv.c
|
|||
radeon.o: $(RADEONOBJS) $(LIBS)
|
||||
$(LD) -r $^ -o $@
|
||||
|
||||
mach64_drv.o: mach64_drv.c
|
||||
$(CC) $(MODCFLAGS) -DEXPORT_SYMTAB -I$(TREE) -c $< -o $@
|
||||
mach64.o: $(MACH64OBJS) $(LIBS)
|
||||
$(LD) -r $^ -o $@
|
||||
|
||||
ifeq ($(AGP),1)
|
||||
mga_drv.o: mga_drv.c
|
||||
$(CC) $(MODCFLAGS) -DEXPORT_SYMTAB -I$(TREE) -c $< -o $@
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ typedef struct drm_tex_region {
|
|||
#include "i810_drm.h"
|
||||
#include "r128_drm.h"
|
||||
#include "radeon_drm.h"
|
||||
#include "mach64_drm.h"
|
||||
#include "sis_drm.h"
|
||||
#include "i830_drm.h"
|
||||
#include "gamma_drm.h"
|
||||
|
|
@ -515,5 +516,10 @@ typedef struct drm_scatter_gather {
|
|||
#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46)
|
||||
#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t)
|
||||
#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48)
|
||||
/* Mach64 specific ioctls */
|
||||
#define DRM_IOCTL_MACH64_INIT DRM_IOW( 0x40, drm_mach64_init_t)
|
||||
#define DRM_IOCTL_MACH64_CLEAR DRM_IOW( 0x41, drm_mach64_clear_t)
|
||||
#define DRM_IOCTL_MACH64_SWAP DRM_IO( 0x42)
|
||||
#define DRM_IOCTL_MACH64_IDLE DRM_IO( 0x43)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
57
linux/mach64.h
Normal file
57
linux/mach64.h
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/* mach64.h -- ATI Mach 64 DRM template customization -*- linux-c -*-
|
||||
* Created: Wed Feb 14 16:07:10 2001 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#ifndef __MACH64_H__
|
||||
#define __MACH64_H__
|
||||
|
||||
/* This remains constant for all DRM template files.
|
||||
*/
|
||||
#define DRM(x) mach64_##x
|
||||
|
||||
/* General customization:
|
||||
*/
|
||||
#define __HAVE_AGP 1
|
||||
#define __MUST_HAVE_AGP 1
|
||||
#define __HAVE_MTRR 1
|
||||
#define __HAVE_CTX_BITMAP 1
|
||||
#define __HAVE_SG 1
|
||||
#define __HAVE_PCI_DMA 1
|
||||
|
||||
/* DMA customization:
|
||||
*/
|
||||
#define __HAVE_DMA 1
|
||||
|
||||
/* Buffer customization:
|
||||
*/
|
||||
#define DRIVER_BUF_PRIV_T drm_mach64_buf_priv_t
|
||||
|
||||
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
|
||||
((drm_mach64_private_t *)((dev)->dev_private))->buffers
|
||||
|
||||
#endif
|
||||
442
linux/mach64_dma.c
Normal file
442
linux/mach64_dma.c
Normal file
|
|
@ -0,0 +1,442 @@
|
|||
/* mach64_dma.c -- DMA support for mach64 (Rage Pro) driver -*- linux-c -*-
|
||||
* Created: Sun Dec 03 19:20:26 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#include "mach64.h"
|
||||
#include "drmP.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
#include <linux/interrupt.h> /* For task queue support */
|
||||
#include <linux/delay.h>
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* Engine control
|
||||
*/
|
||||
|
||||
int mach64_do_wait_for_fifo( drm_mach64_private_t *dev_priv, int entries )
|
||||
{
|
||||
int slots = 0, i;
|
||||
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
|
||||
slots = (MACH64_READ( MACH64_FIFO_STAT ) &
|
||||
MACH64_FIFO_SLOT_MASK);
|
||||
if ( slots <= (0x8000 >> entries) ) return 0;
|
||||
udelay( 1 );
|
||||
}
|
||||
|
||||
DRM_INFO( "failed! slots=%d entries=%d\n", slots, entries );
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
int mach64_do_wait_for_idle( drm_mach64_private_t *dev_priv )
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
ret = mach64_do_wait_for_fifo( dev_priv, 16 );
|
||||
if ( ret < 0 ) return ret;
|
||||
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
|
||||
if ( !(MACH64_READ( MACH64_GUI_STAT ) & MACH64_GUI_ACTIVE) ) {
|
||||
return 0;
|
||||
}
|
||||
udelay( 1 );
|
||||
}
|
||||
|
||||
DRM_INFO( "failed! GUI_STAT=0x%08x\n",
|
||||
MACH64_READ( MACH64_GUI_STAT ) );
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static void scratch_reg0_test(drm_mach64_private_t *dev_priv )
|
||||
{
|
||||
u32 scratch_reg0;
|
||||
scratch_reg0=MACH64_READ( MACH64_SCRATCH_REG0 );
|
||||
|
||||
MACH64_WRITE( MACH64_SCRATCH_REG0, 0x55555555 );
|
||||
if ( MACH64_READ( MACH64_SCRATCH_REG0 ) == 0x55555555 ) {
|
||||
MACH64_WRITE( MACH64_SCRATCH_REG0, 0xaaaaaaaa );
|
||||
|
||||
if ( MACH64_READ( MACH64_SCRATCH_REG0 ) != 0xaaaaaaaa ) {
|
||||
DRM_ERROR( "2nd scratch reg failed!\n" );
|
||||
}
|
||||
} else {
|
||||
DRM_ERROR( "1st scratch reg failed!\n" );
|
||||
}
|
||||
MACH64_WRITE( MACH64_SCRATCH_REG0, scratch_reg0 );
|
||||
}
|
||||
|
||||
static void dump_engine_info( drm_mach64_private_t *dev_priv )
|
||||
{
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " AGP_BASE = 0x%08x\n", MACH64_READ( MACH64_AGP_BASE ) );
|
||||
DRM_INFO( " AGP_CNTL = 0x%08x\n", MACH64_READ( MACH64_AGP_CNTL ) );
|
||||
DRM_INFO( " ALPHA_TST_CNTL = 0x%08x\n", MACH64_READ( MACH64_ALPHA_TST_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " BM_COMMAND = 0x%08x\n", MACH64_READ( MACH64_BM_COMMAND ) );
|
||||
DRM_INFO( "BM_FRAME_BUF_OFFSET = 0x%08x\n", MACH64_READ( MACH64_BM_FRAME_BUF_OFFSET ) );
|
||||
DRM_INFO( " BM_GUI_TABLE = 0x%08x\n", MACH64_READ( MACH64_BM_GUI_TABLE ) );
|
||||
DRM_INFO( " BM_STATUS = 0x%08x\n", MACH64_READ( MACH64_BM_STATUS ) );
|
||||
DRM_INFO( " BM_SYSTEM_MEM_ADDR = 0x%08x\n", MACH64_READ( MACH64_BM_SYSTEM_MEM_ADDR ) );
|
||||
DRM_INFO( " BM_SYSTEM_TABLE = 0x%08x\n", MACH64_READ( MACH64_BM_SYSTEM_TABLE ) );
|
||||
DRM_INFO( " BUS_CNTL = 0x%08x\n", MACH64_READ( MACH64_BUS_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
/* DRM_INFO( " CLOCK_CNTL = 0x%08x\n", MACH64_READ( MACH64_CLOCK_CNTL ) ); */
|
||||
DRM_INFO( " CLR_CMP_CLR = 0x%08x\n", MACH64_READ( MACH64_CLR_CMP_CLR ) );
|
||||
DRM_INFO( " CLR_CMP_CNTL = 0x%08x\n", MACH64_READ( MACH64_CLR_CMP_CNTL ) );
|
||||
/* DRM_INFO( " CLR_CMP_MSK = 0x%08x\n", MACH64_READ( MACH64_CLR_CMP_MSK ) ); */
|
||||
DRM_INFO( " CONFIG_CHIP_ID = 0x%08x\n", MACH64_READ( MACH64_CONFIG_CHIP_ID ) );
|
||||
DRM_INFO( " CONFIG_CNTL = 0x%08x\n", MACH64_READ( MACH64_CONFIG_CNTL ) );
|
||||
DRM_INFO( " CONFIG_STAT0 = 0x%08x\n", MACH64_READ( MACH64_CONFIG_STAT0 ) );
|
||||
DRM_INFO( " CONFIG_STAT1 = 0x%08x\n", MACH64_READ( MACH64_CONFIG_STAT1 ) );
|
||||
DRM_INFO( " CONFIG_STAT2 = 0x%08x\n", MACH64_READ( MACH64_CONFIG_STAT2 ) );
|
||||
DRM_INFO( " CRC_SIG = 0x%08x\n", MACH64_READ( MACH64_CRC_SIG ) );
|
||||
DRM_INFO( " CUSTOM_MACRO_CNTL = 0x%08x\n", MACH64_READ( MACH64_CUSTOM_MACRO_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
/* DRM_INFO( " DAC_CNTL = 0x%08x\n", MACH64_READ( MACH64_DAC_CNTL ) ); */
|
||||
/* DRM_INFO( " DAC_REGS = 0x%08x\n", MACH64_READ( MACH64_DAC_REGS ) ); */
|
||||
DRM_INFO( " DP_BKGD_CLR = 0x%08x\n", MACH64_READ( MACH64_DP_BKGD_CLR ) );
|
||||
DRM_INFO( " DP_FRGD_CLR = 0x%08x\n", MACH64_READ( MACH64_DP_FRGD_CLR ) );
|
||||
DRM_INFO( " DP_MIX = 0x%08x\n", MACH64_READ( MACH64_DP_MIX ) );
|
||||
DRM_INFO( " DP_PIX_WIDTH = 0x%08x\n", MACH64_READ( MACH64_DP_PIX_WIDTH ) );
|
||||
DRM_INFO( " DP_SRC = 0x%08x\n", MACH64_READ( MACH64_DP_SRC ) );
|
||||
DRM_INFO( " DP_WRITE_MASK = 0x%08x\n", MACH64_READ( MACH64_DP_WRITE_MASK ) );
|
||||
DRM_INFO( " DSP_CONFIG = 0x%08x\n", MACH64_READ( MACH64_DSP_CONFIG ) );
|
||||
DRM_INFO( " DSP_ON_OFF = 0x%08x\n", MACH64_READ( MACH64_DSP_ON_OFF ) );
|
||||
DRM_INFO( " DST_CNTL = 0x%08x\n", MACH64_READ( MACH64_DST_CNTL ) );
|
||||
DRM_INFO( " DST_OFF_PITCH = 0x%08x\n", MACH64_READ( MACH64_DST_OFF_PITCH ) );
|
||||
DRM_INFO( "\n" );
|
||||
/* DRM_INFO( " EXT_DAC_REGS = 0x%08x\n", MACH64_READ( MACH64_EXT_DAC_REGS ) ); */
|
||||
DRM_INFO( " EXT_MEM_CNTL = 0x%08x\n", MACH64_READ( MACH64_EXT_MEM_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " FIFO_STAT = 0x%08x\n", MACH64_READ( MACH64_FIFO_STAT ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " GEN_TEST_CNTL = 0x%08x\n", MACH64_READ( MACH64_GEN_TEST_CNTL ) );
|
||||
/* DRM_INFO( " GP_IO = 0x%08x\n", MACH64_READ( MACH64_GP_IO ) ); */
|
||||
DRM_INFO( " GUI_CMDFIFO_DATA = 0x%08x\n", MACH64_READ( MACH64_GUI_CMDFIFO_DATA ) );
|
||||
DRM_INFO( " GUI_CMDFIFO_DEBUG = 0x%08x\n", MACH64_READ( MACH64_GUI_CMDFIFO_DEBUG ) );
|
||||
DRM_INFO( " GUI_CNTL = 0x%08x\n", MACH64_READ( MACH64_GUI_CNTL ) );
|
||||
DRM_INFO( " GUI_STAT = 0x%08x\n", MACH64_READ( MACH64_GUI_STAT ) );
|
||||
DRM_INFO( " GUI_TRAJ_CNTL = 0x%08x\n", MACH64_READ( MACH64_GUI_TRAJ_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " HOST_CNTL = 0x%08x\n", MACH64_READ( MACH64_HOST_CNTL ) );
|
||||
DRM_INFO( " HW_DEBUG = 0x%08x\n", MACH64_READ( MACH64_HW_DEBUG ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " MEM_ADDR_CONFIG = 0x%08x\n", MACH64_READ( MACH64_MEM_ADDR_CONFIG ) );
|
||||
DRM_INFO( " MEM_BUF_CNTL = 0x%08x\n", MACH64_READ( MACH64_MEM_BUF_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " SCALE_3D_CNTL = 0x%08x\n", MACH64_READ( MACH64_SCALE_3D_CNTL ) );
|
||||
DRM_INFO( " SCRATCH_REG0 = 0x%08x\n", MACH64_READ( MACH64_SCRATCH_REG0 ) );
|
||||
DRM_INFO( " SCRATCH_REG1 = 0x%08x\n", MACH64_READ( MACH64_SCRATCH_REG1 ) );
|
||||
DRM_INFO( " SETUP_CNTL = 0x%08x\n", MACH64_READ( MACH64_SETUP_CNTL ) );
|
||||
DRM_INFO( " SRC_CNTL = 0x%08x\n", MACH64_READ( MACH64_SRC_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " TEX_CNTL = 0x%08x\n", MACH64_READ( MACH64_TEX_CNTL ) );
|
||||
DRM_INFO( " TEX_SIZE_PITCH = 0x%08x\n", MACH64_READ( MACH64_TEX_SIZE_PITCH ) );
|
||||
DRM_INFO( " TIMER_CONFIG = 0x%08x\n", MACH64_READ( MACH64_TIMER_CONFIG ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( " Z_CNTL = 0x%08x\n", MACH64_READ( MACH64_Z_CNTL ) );
|
||||
DRM_INFO( " Z_OFF_PITCH = 0x%08x\n", MACH64_READ( MACH64_Z_OFF_PITCH ) );
|
||||
DRM_INFO( "\n" );
|
||||
}
|
||||
|
||||
|
||||
static void bm_dma_test(drm_mach64_private_t *dev_priv)
|
||||
{
|
||||
struct pci_pool *pool;
|
||||
dma_addr_t table_handle, data_handle;
|
||||
u32 table_addr, data_addr;
|
||||
u32 *table, *data;
|
||||
|
||||
void *cpu_addr_table, *cpu_addr_data;
|
||||
int i;
|
||||
|
||||
DRM_INFO( "Creating pool ... \n");
|
||||
pool = pci_pool_create( "mach64", NULL, 0x4000,
|
||||
0x4000, 0x4000, SLAB_ATOMIC );
|
||||
|
||||
if (!pool) {
|
||||
DRM_INFO( "pci_pool_create failed!\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
DRM_INFO( "Allocating table memory ...\n" );
|
||||
cpu_addr_table = pci_pool_alloc( pool, SLAB_ATOMIC, &table_handle );
|
||||
if (!cpu_addr_table || !table_handle) {
|
||||
DRM_INFO( "table-memory allocation failed!\n" );
|
||||
return;
|
||||
} else {
|
||||
table = (u32 *) cpu_addr_table;
|
||||
table_addr = (u32) table_handle;
|
||||
memset( cpu_addr_table, 0x0, 0x4000 );
|
||||
}
|
||||
|
||||
DRM_INFO( "Allocating data memory ...\n" );
|
||||
cpu_addr_data = pci_pool_alloc( pool, SLAB_ATOMIC, &data_handle );
|
||||
if (!cpu_addr_data || !data_handle) {
|
||||
DRM_INFO( "data-memory allocation failed!\n" );
|
||||
return;
|
||||
} else {
|
||||
data = (u32 *) cpu_addr_data;
|
||||
data_addr = (u32) data_handle;
|
||||
}
|
||||
|
||||
MACH64_WRITE( MACH64_SRC_CNTL, 0x00000000 );
|
||||
MACH64_WRITE( MACH64_PAT_REG0, 0x11111111 );
|
||||
|
||||
DRM_INFO( "(Before DMA Transfer) PAT_REG0 = 0x%08x\n",
|
||||
MACH64_READ( MACH64_PAT_REG0 ) );
|
||||
|
||||
data[0] = 0x000000a0;
|
||||
data[1] = 0x22222222;
|
||||
data[2] = 0x000000a0;
|
||||
data[3] = 0x22222222;
|
||||
data[4] = 0x000000a0;
|
||||
data[5] = 0x22222222;
|
||||
data[6] = 0x0000006d;
|
||||
data[7] = 0x00000000;
|
||||
|
||||
DRM_INFO( "Preparing table ...\n" );
|
||||
table[0] = MACH64_BM_ADDR + APERTURE_OFFSET;
|
||||
table[1] = data_addr;
|
||||
table[2] = 8 * sizeof( u32 ) | 0x80000000 | 0x40000000;
|
||||
table[3] = 0;
|
||||
|
||||
DRM_INFO( "table[0] = 0x%08x\n", table[0] );
|
||||
DRM_INFO( "table[1] = 0x%08x\n", table[1] );
|
||||
DRM_INFO( "table[2] = 0x%08x\n", table[2] );
|
||||
DRM_INFO( "table[3] = 0x%08x\n", table[3] );
|
||||
|
||||
for ( i = 0 ; i < 8 ; i++) {
|
||||
DRM_INFO( " data[%d] = 0x%08x\n", i, data[i] );
|
||||
}
|
||||
|
||||
mb();
|
||||
|
||||
DRM_INFO( "waiting for idle...\n" );
|
||||
mach64_do_wait_for_idle( dev_priv );
|
||||
DRM_INFO( "waiting for idle... done.\n" );
|
||||
|
||||
DRM_INFO( "BUS_CNTL = 0x%08x\n", MACH64_READ( MACH64_BUS_CNTL ) );
|
||||
DRM_INFO( "SRC_CNTL = 0x%08x\n", MACH64_READ( MACH64_SRC_CNTL ) );
|
||||
DRM_INFO( "\n" );
|
||||
DRM_INFO( "data = 0x%08x\n", data_addr );
|
||||
DRM_INFO( "table = 0x%08x\n", table_addr );
|
||||
|
||||
DRM_INFO( "starting DMA transfer...\n" );
|
||||
MACH64_WRITE( MACH64_BM_GUI_TABLE,
|
||||
table_addr |
|
||||
MACH64_CIRCULAR_BUF_SIZE_16KB );
|
||||
|
||||
MACH64_WRITE( MACH64_SRC_CNTL,
|
||||
MACH64_SRC_BM_ENABLE | MACH64_SRC_BM_SYNC |
|
||||
MACH64_SRC_BM_OP_SYSTEM_TO_REG );
|
||||
|
||||
/* Kick off the transfer */
|
||||
DRM_INFO( "starting DMA transfer... done.\n" );
|
||||
MACH64_WRITE( MACH64_DST_HEIGHT_WIDTH, 0 );
|
||||
MACH64_WRITE( MACH64_SRC_CNTL, 0 );
|
||||
|
||||
DRM_INFO( "waiting for idle [locked_after_dma??]...\n" );
|
||||
if ((i=mach64_do_wait_for_idle( dev_priv ))) {
|
||||
DRM_INFO( "mach64_do_wait_for_idle failed (result=%d)\n", i);
|
||||
DRM_INFO( "resetting engine ...");
|
||||
mach64_do_engine_reset( dev_priv );
|
||||
}
|
||||
|
||||
DRM_INFO( "(After DMA Transfer) PAT_REG0 = 0x%08x\n",
|
||||
MACH64_READ( MACH64_PAT_REG0 ) );
|
||||
|
||||
DRM_INFO( "freeing memory.\n" );
|
||||
pci_pool_free( pool, cpu_addr_table, table_handle );
|
||||
pci_pool_free( pool, cpu_addr_data, data_handle );
|
||||
pci_pool_destroy( pool );
|
||||
DRM_INFO( "returning ...\n" );
|
||||
}
|
||||
|
||||
int mach64_do_engine_reset( drm_mach64_private_t *dev_priv )
|
||||
{
|
||||
u32 bus_cntl, gen_test_cntl;
|
||||
|
||||
/* Kill off any outstanding DMA transfers.
|
||||
*/
|
||||
bus_cntl = MACH64_READ( MACH64_BUS_CNTL );
|
||||
MACH64_WRITE( MACH64_BUS_CNTL,
|
||||
bus_cntl | MACH64_BUS_MASTER_DIS );
|
||||
|
||||
/* Reset the GUI engine (high to low transition).
|
||||
*/
|
||||
gen_test_cntl = MACH64_READ( MACH64_GEN_TEST_CNTL );
|
||||
MACH64_WRITE( MACH64_GEN_TEST_CNTL,
|
||||
gen_test_cntl & ~MACH64_GUI_ENGINE_ENABLE );
|
||||
/* Enable the GUI engine
|
||||
*/
|
||||
gen_test_cntl = MACH64_READ( MACH64_GEN_TEST_CNTL );
|
||||
MACH64_WRITE( MACH64_GEN_TEST_CNTL,
|
||||
gen_test_cntl | MACH64_GUI_ENGINE_ENABLE );
|
||||
|
||||
/* ensure engine is not locked up by clearing any FIFO or HOST errors
|
||||
*/
|
||||
bus_cntl = MACH64_READ( MACH64_BUS_CNTL );
|
||||
MACH64_WRITE( MACH64_BUS_CNTL, bus_cntl | 0x00a00000 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int mach64_do_dma_init( drm_device_t *dev, drm_mach64_init_t *init )
|
||||
{
|
||||
drm_mach64_private_t *dev_priv;
|
||||
struct list_head *list;
|
||||
u32 tmp;
|
||||
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
dev_priv = DRM(alloc)( sizeof(drm_mach64_private_t), DRM_MEM_DRIVER );
|
||||
if ( dev_priv == NULL )
|
||||
return -ENOMEM;
|
||||
dev->dev_private = (void *) dev_priv;
|
||||
|
||||
memset( dev_priv, 0, sizeof(drm_mach64_private_t) );
|
||||
|
||||
dev_priv->fb_bpp = init->fb_bpp;
|
||||
dev_priv->front_offset = init->front_offset;
|
||||
dev_priv->front_pitch = init->front_pitch;
|
||||
dev_priv->back_offset = init->back_offset;
|
||||
dev_priv->back_pitch = init->back_pitch;
|
||||
|
||||
dev_priv->depth_bpp = init->depth_bpp;
|
||||
dev_priv->depth_offset = init->depth_offset;
|
||||
dev_priv->depth_pitch = init->depth_pitch;
|
||||
|
||||
dev_priv->front_offset_pitch = (((dev_priv->front_pitch/8) << 22) |
|
||||
(dev_priv->front_offset >> 3));
|
||||
dev_priv->back_offset_pitch = (((dev_priv->back_pitch/8) << 22) |
|
||||
(dev_priv->back_offset >> 3));
|
||||
dev_priv->depth_offset_pitch = (((dev_priv->depth_pitch/8) << 22) |
|
||||
(dev_priv->depth_offset >> 3));
|
||||
|
||||
dev_priv->usec_timeout = 1000000;
|
||||
|
||||
list_for_each(list, &dev->maplist->head) {
|
||||
drm_map_list_t *r_list = (drm_map_list_t *)list;
|
||||
if( r_list->map &&
|
||||
r_list->map->type == _DRM_SHM &&
|
||||
r_list->map->flags & _DRM_CONTAINS_LOCK ) {
|
||||
dev_priv->sarea = r_list->map;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dev_priv->sarea_priv = (drm_mach64_sarea_t *)
|
||||
((u8 *)dev_priv->sarea->handle +
|
||||
init->sarea_priv_offset);
|
||||
|
||||
DRM_FIND_MAP( dev_priv->fb, init->fb_offset );
|
||||
DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset );
|
||||
DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset );
|
||||
|
||||
DRM_IOREMAP( dev_priv->buffers );
|
||||
|
||||
DRM_INFO( "init->fb = 0x%08x\n", init->fb_offset );
|
||||
DRM_INFO( "init->mmio_offset = 0x%08x\n", init->mmio_offset );
|
||||
DRM_INFO( "mmio->offset=0x%08lx mmio->handle=0x%08lx\n",
|
||||
dev_priv->mmio->offset, (unsigned long) dev_priv->mmio->handle );
|
||||
DRM_INFO( "buffers->offset=0x%08lx buffers->handle=0x%08lx\n",
|
||||
dev_priv->buffers->offset, (unsigned long) dev_priv->buffers->handle );
|
||||
|
||||
|
||||
tmp = MACH64_READ( MACH64_BUS_CNTL );
|
||||
tmp = ( tmp | 0x08000000 ) & ~MACH64_BUS_MASTER_DIS;
|
||||
MACH64_WRITE( MACH64_BUS_CNTL, tmp );
|
||||
|
||||
tmp = MACH64_READ( MACH64_GUI_CNTL );
|
||||
MACH64_WRITE( MACH64_GUI_CNTL, ( ( tmp & ~MACH64_CMDFIFO_SIZE_MASK ) \
|
||||
| MACH64_CMDFIFO_SIZE_128 ) );
|
||||
DRM_INFO( "GUI_STAT=0x%08x\n", MACH64_READ( MACH64_GUI_STAT ) );
|
||||
DRM_INFO( "GUI_CNTL=0x%08x\n", MACH64_READ( MACH64_GUI_CNTL ) );
|
||||
|
||||
bm_dma_test( dev_priv );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mach64_do_dma_cleanup( drm_device_t *dev )
|
||||
{
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
dump_engine_info( dev->dev_private );
|
||||
|
||||
if ( dev->dev_private ) {
|
||||
drm_mach64_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
DRM_IOREMAPFREE( dev_priv->buffers );
|
||||
|
||||
DRM(free)( dev_priv, sizeof(drm_mach64_private_t),
|
||||
DRM_MEM_DRIVER );
|
||||
dev->dev_private = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mach64_dma_init( 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_mach64_init_t init;
|
||||
|
||||
if ( copy_from_user( &init, (drm_mach64_init_t *)arg, sizeof(init) ) )
|
||||
return -EFAULT;
|
||||
|
||||
switch ( init.func ) {
|
||||
case MACH64_INIT_DMA:
|
||||
return mach64_do_dma_init( dev, &init );
|
||||
case MACH64_CLEANUP_DMA:
|
||||
return mach64_do_dma_cleanup( dev );
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int mach64_dma_idle( 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_mach64_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||
|
||||
dev->lock.pid != current->pid ) {
|
||||
DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return mach64_do_wait_for_idle( dev_priv );
|
||||
}
|
||||
|
||||
172
linux/mach64_drm.h
Normal file
172
linux/mach64_drm.h
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
/* mach64_drm.h -- Public header for the mach64 driver -*- linux-c -*-
|
||||
* Created: Thu Nov 30 20:04:32 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#ifndef __MACH64_DRM_H__
|
||||
#define __MACH64_DRM_H__
|
||||
|
||||
|
||||
/* WARNING: If you change any of these defines, make sure to change the
|
||||
* defines in the Xserver file (xf86drmMach64.h)
|
||||
*/
|
||||
#ifndef __MACH64_DEFINES__
|
||||
#define __MACH64_DEFINES__
|
||||
|
||||
/* What needs to be changed for the current vertex buffer?
|
||||
* GH: We're going to be pedantic about this. We want the card to do as
|
||||
* little as possible, so let's avoid having it fetch a whole bunch of
|
||||
* register values that don't change all that often, if at all.
|
||||
*/
|
||||
#define MACH64_UPLOAD_DST_OFF_PITCH 0x0001
|
||||
#define MACH64_UPLOAD_Z_OFF_PITCH 0x0002
|
||||
#define MACH64_UPLOAD_Z_ALPHA_CNTL 0x0004
|
||||
#define MACH64_UPLOAD_SCALE_3D_CNTL 0x0008
|
||||
#define MACH64_UPLOAD_DP_FOG_CLR 0x0010
|
||||
#define MACH64_UPLOAD_DP_WRITE_MASK 0x0020
|
||||
#define MACH64_UPLOAD_DP_PIX_WIDTH 0x0040
|
||||
#define MACH64_UPLOAD_SETUP_CNTL 0x0080
|
||||
#define MACH64_UPLOAD_TEXTURE 0x0100
|
||||
#define MACH64_UPLOAD_MISC 0x0200
|
||||
#define MACH64_UPLOAD_TEX0IMAGE 0x0400
|
||||
#define MACH64_UPLOAD_TEX1IMAGE 0x0800
|
||||
#define MACH64_UPLOAD_CLIPRECTS 0x1000 /* handled client-side */
|
||||
#define MACH64_UPLOAD_CONTEXT 0x00ff
|
||||
#define MACH64_UPLOAD_ALL 0x1fff
|
||||
|
||||
#define MACH64_FRONT 0x1
|
||||
#define MACH64_BACK 0x2
|
||||
#define MACH64_DEPTH 0x4
|
||||
|
||||
/* Keep these small for testing.
|
||||
*/
|
||||
#define MACH64_NR_SAREA_CLIPRECTS 8
|
||||
|
||||
/* WARNING: If you change any of these defines, make sure to change the
|
||||
* defines in the Xserver file (mach64_sarea.h)
|
||||
*/
|
||||
#define MACH64_CARD_HEAP 0
|
||||
#define MACH64_AGP_HEAP 1
|
||||
#define MACH64_NR_TEX_HEAPS 2
|
||||
#define MACH64_NR_TEX_REGIONS 64
|
||||
#define MACH64_LOG_TEX_GRANULARITY 16
|
||||
|
||||
#define MACH64_TEX_MAXLEVELS 0
|
||||
|
||||
#endif /* __MACH64_SAREA_DEFINES__ */
|
||||
|
||||
typedef struct {
|
||||
unsigned int dst_off_pitch;
|
||||
|
||||
unsigned int z_off_pitch;
|
||||
unsigned int z_cntl;
|
||||
unsigned int alpha_tst_cntl;
|
||||
|
||||
unsigned int scale_3d_cntl;
|
||||
|
||||
unsigned int sc_left_right;
|
||||
unsigned int sc_top_bottom;
|
||||
|
||||
unsigned int dp_fog_clr;
|
||||
unsigned int dp_write_mask;
|
||||
unsigned int dp_pix_width;
|
||||
unsigned int dp_mix;
|
||||
unsigned int dp_src;
|
||||
|
||||
unsigned int clr_cmp_cntl;
|
||||
unsigned int gui_traj_cntl;
|
||||
|
||||
unsigned int setup_cntl;
|
||||
|
||||
unsigned int tex_size_pitch;
|
||||
unsigned int tex_cntl;
|
||||
unsigned int secondary_tex_off;
|
||||
unsigned int tex_offset;
|
||||
} drm_mach64_context_regs_t;
|
||||
|
||||
typedef struct drm_mach64_tex_region {
|
||||
unsigned char next, prev;
|
||||
unsigned char in_use;
|
||||
int age;
|
||||
} drm_mach64_tex_region_t;
|
||||
|
||||
typedef struct drm_mach64_sarea {
|
||||
/* The channel for communication of state information to the kernel
|
||||
* on firing a vertex dma buffer.
|
||||
*/
|
||||
drm_mach64_context_regs_t context_state;
|
||||
unsigned int dirty;
|
||||
unsigned int vertsize;
|
||||
|
||||
/* The current cliprects, or a subset thereof.
|
||||
*/
|
||||
drm_clip_rect_t boxes[MACH64_NR_SAREA_CLIPRECTS];
|
||||
unsigned int nbox;
|
||||
|
||||
/* Counters for client-side throttling of rendering clients.
|
||||
*/
|
||||
unsigned int last_frame;
|
||||
unsigned int last_dispatch;
|
||||
|
||||
/* Texture memory LRU.
|
||||
*/
|
||||
drm_mach64_tex_region_t tex_list[MACH64_NR_TEX_HEAPS]
|
||||
[MACH64_NR_TEX_REGIONS+1];
|
||||
int tex_age[MACH64_NR_TEX_HEAPS];
|
||||
int ctx_owner;
|
||||
} drm_mach64_sarea_t;
|
||||
|
||||
|
||||
|
||||
typedef struct drm_mach64_init {
|
||||
enum {
|
||||
MACH64_INIT_DMA = 0x01,
|
||||
MACH64_CLEANUP_DMA = 0x02
|
||||
} func;
|
||||
|
||||
unsigned int sarea_priv_offset;
|
||||
|
||||
unsigned int fb_bpp;
|
||||
unsigned int front_offset, front_pitch;
|
||||
unsigned int back_offset, back_pitch;
|
||||
|
||||
unsigned int depth_bpp;
|
||||
unsigned int depth_offset, depth_pitch;
|
||||
unsigned int span_offset;
|
||||
|
||||
unsigned int fb_offset;
|
||||
unsigned int mmio_offset;
|
||||
unsigned int buffers_offset;
|
||||
} drm_mach64_init_t;
|
||||
|
||||
typedef struct drm_mach64_clear {
|
||||
unsigned int flags;
|
||||
int x, y, w, h;
|
||||
unsigned int clear_color;
|
||||
unsigned int clear_depth;
|
||||
} drm_mach64_clear_t;
|
||||
|
||||
#endif
|
||||
75
linux/mach64_drv.c
Normal file
75
linux/mach64_drv.c
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/* mach64_drv.c -- mach64 (Rage Pro) driver -*- linux-c -*-
|
||||
* Created: Fri Nov 24 18:34:32 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include "mach64.h"
|
||||
#include "drmP.h"
|
||||
#include "mach64_drv.h"
|
||||
#include "ati_pcigart.h"
|
||||
|
||||
|
||||
#define DRIVER_AUTHOR "Gareth Hughes"
|
||||
|
||||
#define DRIVER_NAME "mach64"
|
||||
#define DRIVER_DESC "DRM module for the ATI Rage Pro"
|
||||
#define DRIVER_DATE "20010107"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_INIT)] = { mach64_dma_init, 1, 1 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_CLEAR)] = { mach64_dma_clear, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_SWAP)] = { mach64_dma_swap, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_IDLE)] = { mach64_dma_idle, 1, 0 },
|
||||
|
||||
#if 0
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mach64_dma, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_VERTEX)] = { mach64_vertex, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_BLIT)] = { mach64_blit, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_MACH64_FLUSH)] = { mach64_flush, 1, 0 },
|
||||
#endif
|
||||
|
||||
#include "drm_agpsupport.h"
|
||||
#include "drm_auth.h"
|
||||
#include "drm_bufs.h"
|
||||
#include "drm_context.h"
|
||||
#include "drm_dma.h"
|
||||
#include "drm_drawable.h"
|
||||
#include "drm_drv.h"
|
||||
#include "drm_fops.h"
|
||||
#include "drm_init.h"
|
||||
#include "drm_ioctl.h"
|
||||
#include "drm_lock.h"
|
||||
#include "drm_memory.h"
|
||||
#include "drm_proc.h"
|
||||
#include "drm_vm.h"
|
||||
#include "drm_stub.h"
|
||||
#include "drm_scatter.h"
|
||||
436
linux/mach64_drv.h
Normal file
436
linux/mach64_drv.h
Normal file
|
|
@ -0,0 +1,436 @@
|
|||
/* mach64_drv.h -- Private header for mach64 driver -*- linux-c -*-
|
||||
* Created: Fri Nov 24 22:07:58 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#ifndef __MACH64_DRV_H__
|
||||
#define __MACH64_DRV_H__
|
||||
|
||||
typedef struct drm_mach64_private {
|
||||
drm_mach64_sarea_t *sarea_priv;
|
||||
|
||||
unsigned int fb_bpp;
|
||||
unsigned int front_offset, front_pitch;
|
||||
unsigned int back_offset, back_pitch;
|
||||
|
||||
unsigned int depth_bpp;
|
||||
unsigned int depth_offset, depth_pitch;
|
||||
|
||||
u32 front_offset_pitch;
|
||||
u32 back_offset_pitch;
|
||||
u32 depth_offset_pitch;
|
||||
|
||||
int usec_timeout;
|
||||
|
||||
drm_map_t *sarea;
|
||||
drm_map_t *fb;
|
||||
drm_map_t *mmio;
|
||||
drm_map_t *buffers;
|
||||
} drm_mach64_private_t;
|
||||
|
||||
typedef struct drm_mach64_buf_priv {
|
||||
int age;
|
||||
} drm_mach64_buf_priv_t;
|
||||
|
||||
|
||||
/* mach64_drv.c */
|
||||
extern int mach64_version( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_open( struct inode *inode, struct file *filp );
|
||||
extern int mach64_release( struct inode *inode, struct file *filp );
|
||||
extern int mach64_ioctl( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_lock( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_unlock( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
/* mach64_bufs.c */
|
||||
extern int mach64_addbufs( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_mapbufs( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
/* mach64_context.c */
|
||||
extern int mach64_resctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_addctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_modctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_getctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_switchctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_newctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_rmctx( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
extern int mach64_context_switch( drm_device_t *dev, int old, int new );
|
||||
extern int mach64_context_switch_complete( drm_device_t *dev, int new );
|
||||
|
||||
/* mach64_dma.c */
|
||||
extern int mach64_dma_init( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_dma_idle( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
extern int mach64_do_wait_for_fifo( drm_mach64_private_t *dev_priv,
|
||||
int entries );
|
||||
extern int mach64_do_wait_for_idle( drm_mach64_private_t *dev_priv );
|
||||
extern int mach64_do_engine_reset( drm_mach64_private_t *dev_priv );
|
||||
|
||||
/* r128_state.c */
|
||||
extern int mach64_dma_clear( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int mach64_dma_swap( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* Registers
|
||||
*/
|
||||
|
||||
#define MACH64_AGP_BASE 0x0148
|
||||
#define MACH64_AGP_CNTL 0x014c
|
||||
#define MACH64_ALPHA_TST_CNTL 0x0550
|
||||
|
||||
|
||||
#define MACH64_DSP_CONFIG 0x0420
|
||||
#define MACH64_DSP_ON_OFF 0x0424
|
||||
#define MACH64_EXT_MEM_CNTL 0x04ac
|
||||
#define MACH64_GEN_TEST_CNTL 0x04d0
|
||||
#define MACH64_HW_DEBUG 0x047c
|
||||
#define MACH64_MEM_ADDR_CONFIG 0x0434
|
||||
#define MACH64_MEM_BUF_CNTL 0x042c
|
||||
#define MACH64_MEM_CNTL 0x04b0
|
||||
|
||||
|
||||
#define MACH64_BM_ADDR 0x0648
|
||||
#define MACH64_BM_COMMAND 0x0188
|
||||
#define MACH64_BM_DATA 0x0648
|
||||
#define MACH64_BM_FRAME_BUF_OFFSET 0x0180
|
||||
#define MACH64_BM_GUI_TABLE 0x01b8
|
||||
#define MACH64_BM_GUI_TABLE_CMD 0x064c
|
||||
# define MACH64_CIRCULAR_BUF_SIZE_16KB (0 << 0)
|
||||
# define MACH64_CIRCULAR_BUF_SIZE_32KB (1 << 0)
|
||||
# define MACH64_CIRCULAR_BUF_SIZE_64KB (2 << 0)
|
||||
# define MACH64_CIRCULAR_BUF_SIZE_128KB (3 << 0)
|
||||
# define MACH64_LAST_DESCRIPTOR (1 << 31)
|
||||
#define MACH64_BM_HOSTDATA 0x0644
|
||||
#define MACH64_BM_STATUS 0x018c
|
||||
#define MACH64_BM_SYSTEM_MEM_ADDR 0x0184
|
||||
#define MACH64_BM_SYSTEM_TABLE 0x01bc
|
||||
#define MACH64_BUS_CNTL 0x04a0
|
||||
# define MACH64_BUS_MSTR_RESET (1 << 1)
|
||||
# define MACH64_BUS_APER_REG_DIS (1 << 4)
|
||||
# define MACH64_BUS_FLUSH_BUF (1 << 2)
|
||||
# define MACH64_BUS_MASTER_DIS (1 << 6)
|
||||
# define MACH64_BUS_EXT_REG_EN (1 << 27)
|
||||
|
||||
#define MACH64_CLR_CMP_CLR 0x0700
|
||||
#define MACH64_CLR_CMP_CNTL 0x0708
|
||||
#define MACH64_CLR_CMP_MASK 0x0704
|
||||
#define MACH64_CONFIG_CHIP_ID 0x04e0
|
||||
#define MACH64_CONFIG_CNTL 0x04dc
|
||||
#define MACH64_CONFIG_STAT0 0x04e4
|
||||
#define MACH64_CONFIG_STAT1 0x0494
|
||||
#define MACH64_CONFIG_STAT2 0x0498
|
||||
#define MACH64_CONTEXT_LOAD_CNTL 0x072c
|
||||
#define MACH64_CONTEXT_MASK 0x0720
|
||||
#define MACH64_COMPOSITE_SHADOW_ID 0x0798
|
||||
#define MACH64_CRC_SIG 0x04e8
|
||||
#define MACH64_CUSTOM_MACRO_CNTL 0x04d4
|
||||
|
||||
#define MACH64_DP_BKGD_CLR 0x06c0
|
||||
#define MACH64_DP_FOG_CLR 0x06c4
|
||||
#define MACH64_DP_FGRD_BKGD_CLR 0x06e0
|
||||
#define MACH64_DP_FRGD_CLR 0x06c4
|
||||
#define MACH64_DP_FGRD_CLR_MIX 0x06dc
|
||||
|
||||
#define MACH64_DP_MIX 0x06d4
|
||||
# define BKGD_MIX_NOT_D (0 << 0)
|
||||
# define BKGD_MIX_ZERO (1 << 0)
|
||||
# define BKGD_MIX_ONE (2 << 0)
|
||||
# define MACH64_BKGD_MIX_D (3 << 0)
|
||||
# define BKGD_MIX_NOT_S (4 << 0)
|
||||
# define BKGD_MIX_D_XOR_S (5 << 0)
|
||||
# define BKGD_MIX_NOT_D_XOR_S (6 << 0)
|
||||
# define MACH64_BKGD_MIX_S (7 << 0)
|
||||
# define BKGD_MIX_NOT_D_OR_NOT_S (8 << 0)
|
||||
# define BKGD_MIX_D_OR_NOT_S (9 << 0)
|
||||
# define BKGD_MIX_NOT_D_OR_S (10 << 0)
|
||||
# define BKGD_MIX_D_OR_S (11 << 0)
|
||||
# define BKGD_MIX_D_AND_S (12 << 0)
|
||||
# define BKGD_MIX_NOT_D_AND_S (13 << 0)
|
||||
# define BKGD_MIX_D_AND_NOT_S (14 << 0)
|
||||
# define BKGD_MIX_NOT_D_AND_NOT_S (15 << 0)
|
||||
# define BKGD_MIX_D_PLUS_S_DIV2 (23 << 0)
|
||||
# define FRGD_MIX_NOT_D (0 << 16)
|
||||
# define FRGD_MIX_ZERO (1 << 16)
|
||||
# define FRGD_MIX_ONE (2 << 16)
|
||||
# define FRGD_MIX_D (3 << 16)
|
||||
# define FRGD_MIX_NOT_S (4 << 16)
|
||||
# define FRGD_MIX_D_XOR_S (5 << 16)
|
||||
# define FRGD_MIX_NOT_D_XOR_S (6 << 16)
|
||||
# define MACH64_FRGD_MIX_S (7 << 16)
|
||||
# define FRGD_MIX_NOT_D_OR_NOT_S (8 << 16)
|
||||
# define FRGD_MIX_D_OR_NOT_S (9 << 16)
|
||||
# define FRGD_MIX_NOT_D_OR_S (10 << 16)
|
||||
# define FRGD_MIX_D_OR_S (11 << 16)
|
||||
# define FRGD_MIX_D_AND_S (12 << 16)
|
||||
# define FRGD_MIX_NOT_D_AND_S (13 << 16)
|
||||
# define FRGD_MIX_D_AND_NOT_S (14 << 16)
|
||||
# define FRGD_MIX_NOT_D_AND_NOT_S (15 << 16)
|
||||
# define FRGD_MIX_D_PLUS_S_DIV2 (23 << 16)
|
||||
|
||||
#define MACH64_DP_PIX_WIDTH 0x06d0
|
||||
# define MACH64_HOST_TRIPLE_ENABLE (1 << 13)
|
||||
# define MACH64_BYTE_ORDER_MSB_TO_LSB (0 << 24)
|
||||
# define MACH64_BYTE_ORDER_LSB_TO_MSB (1 << 24)
|
||||
|
||||
#define MACH64_DP_SRC 0x06d8
|
||||
# define MACH64_BKGD_SRC_BKGD_CLR (0 << 0)
|
||||
# define MACH64_BKGD_SRC_FRGD_CLR (1 << 0)
|
||||
# define MACH64_BKGD_SRC_HOST (2 << 0)
|
||||
# define MACH64_BKGD_SRC_BLIT (3 << 0)
|
||||
# define MACH64_BKGD_SRC_PATTERN (4 << 0)
|
||||
# define MACH64_BKGD_SRC_3D (5 << 0)
|
||||
# define MACH64_FRGD_SRC_BKGD_CLR (0 << 8)
|
||||
# define MACH64_FRGD_SRC_FRGD_CLR (1 << 8)
|
||||
# define MACH64_FRGD_SRC_HOST (2 << 8)
|
||||
# define MACH64_FRGD_SRC_BLIT (3 << 8)
|
||||
# define MACH64_FRGD_SRC_PATTERN (4 << 8)
|
||||
# define MACH64_FRGD_SRC_3D (5 << 8)
|
||||
# define MACH64_MONO_SRC_ONE (0 << 16)
|
||||
# define MACH64_MONO_SRC_PATTERN (1 << 16)
|
||||
# define MACH64_MONO_SRC_HOST (2 << 16)
|
||||
# define MACH64_MONO_SRC_BLIT (3 << 16)
|
||||
|
||||
#define MACH64_DP_WRITE_MASK 0x06c8
|
||||
|
||||
#define MACH64_DST_CNTL 0x0530
|
||||
# define MACH64_DST_X_RIGHT_TO_LEFT (0 << 0)
|
||||
# define MACH64_DST_X_LEFT_TO_RIGHT (1 << 0)
|
||||
# define MACH64_DST_Y_BOTTOM_TO_TOP (0 << 1)
|
||||
# define MACH64_DST_Y_TOP_TO_BOTTOM (1 << 1)
|
||||
# define MACH64_DST_X_MAJOR (0 << 2)
|
||||
# define MACH64_DST_Y_MAJOR (1 << 2)
|
||||
# define MACH64_DST_X_TILE (1 << 3)
|
||||
# define MACH64_DST_Y_TILE (1 << 4)
|
||||
# define MACH64_DST_LAST_PEL (1 << 5)
|
||||
# define MACH64_DST_POLYGON_ENABLE (1 << 6)
|
||||
# define MACH64_DST_24_ROTATION_ENABLE (1 << 7)
|
||||
|
||||
#define MACH64_DST_HEIGHT_WIDTH 0x0518
|
||||
#define MACH64_DST_OFF_PITCH 0x0500
|
||||
#define MACH64_DST_WIDTH_HEIGHT 0x06ec
|
||||
#define MACH64_DST_X_Y 0x06e8
|
||||
#define MACH64_DST_Y_X 0x050c
|
||||
|
||||
#define MACH64_FIFO_STAT 0x0710
|
||||
# define MACH64_FIFO_SLOT_MASK 0x0000ffff
|
||||
# define MACH64_FIFO_ERR (1 << 31)
|
||||
|
||||
#define MACH64_GEN_TEST_CNTL 0x04d0
|
||||
# define MACH64_GUI_ENGINE_ENABLE (1 << 8)
|
||||
#define MACH64_GUI_CMDFIFO_DEBUG 0x0170
|
||||
#define MACH64_GUI_CMDFIFO_DATA 0x0174
|
||||
#define MACH64_GUI_CNTL 0x0178
|
||||
# define MACH64_CMDFIFO_SIZE_MASK 0x00000003ul
|
||||
# define MACH64_CMDFIFO_SIZE_192 0x00000000ul
|
||||
# define MACH64_CMDFIFO_SIZE_128 0x00000001ul
|
||||
# define MACH64_CMDFIFO_SIZE_64 0x00000002ul
|
||||
#define MACH64_GUI_STAT 0x0738
|
||||
# define MACH64_GUI_ACTIVE (1 << 0)
|
||||
#define MACH64_GUI_TRAJ_CNTL 0x0730
|
||||
|
||||
#define MACH64_HOST_CNTL 0x0640
|
||||
#define MACH64_HOST_DATA0 0x0600
|
||||
|
||||
#define MACH64_ONE_OVER_AREA 0x029c
|
||||
#define MACH64_ONE_OVER_AREA_UC 0x0300
|
||||
|
||||
#define MACH64_PAT_REG0 0x0680
|
||||
|
||||
#define MACH64_SCALE_3D_CNTL 0x05fc
|
||||
#define MACH64_SCRATCH_REG0 0x0480
|
||||
#define MACH64_SCRATCH_REG1 0x0484
|
||||
#define MACH64_SETUP_CNTL 0x0304
|
||||
#define MACH64_SRC_CNTL 0x05b4
|
||||
# define MACH64_SRC_BM_ENABLE (1 << 8)
|
||||
# define MACH64_SRC_BM_SYNC (1 << 9)
|
||||
# define MACH64_SRC_BM_OP_FRAME_TO_SYSTEM (0 << 10)
|
||||
# define MACH64_SRC_BM_OP_SYSTEM_TO_FRAME (1 << 10)
|
||||
# define MACH64_SRC_BM_OP_REG_TO_SYSTEM (2 << 10)
|
||||
# define MACH64_SRC_BM_OP_SYSTEM_TO_REG (3 << 10)
|
||||
#define MACH64_SRC_HEIGHT1 0x0594
|
||||
#define MACH64_SRC_HEIGHT2 0x05ac
|
||||
#define MACH64_SRC_HEIGHT1_WIDTH1 0x0598
|
||||
#define MACH64_SRC_HEIGHT2_WIDTH2 0x05b0
|
||||
#define MACH64_SRC_OFF_PITCH 0x0580
|
||||
#define MACH64_SRC_WIDTH1 0x0590
|
||||
#define MACH64_SRC_Y_X 0x058c
|
||||
|
||||
#define MACH64_TEX_CNTL 0x0774
|
||||
#define MACH64_TEX_SIZE_PITCH 0x0770
|
||||
#define MACH64_TIMER_CONFIG 0x0428
|
||||
|
||||
#define MACH64_VERTEX_1_ARGB 0x0254
|
||||
#define MACH64_VERTEX_1_S 0x0240
|
||||
#define MACH64_VERTEX_1_SECONDARY_S 0x0328
|
||||
#define MACH64_VERTEX_1_SECONDARY_T 0x032c
|
||||
#define MACH64_VERTEX_1_SECONDARY_W 0x0330
|
||||
#define MACH64_VERTEX_1_SPEC_ARGB 0x024c
|
||||
#define MACH64_VERTEX_1_T 0x0244
|
||||
#define MACH64_VERTEX_1_W 0x0248
|
||||
#define MACH64_VERTEX_1_X_Y 0x0258
|
||||
#define MACH64_VERTEX_1_Z 0x0250
|
||||
#define MACH64_VERTEX_2_ARGB 0x0274
|
||||
#define MACH64_VERTEX_2_S 0x0260
|
||||
#define MACH64_VERTEX_2_SECONDARY_S 0x0334
|
||||
#define MACH64_VERTEX_2_SECONDARY_T 0x0338
|
||||
#define MACH64_VERTEX_2_SECONDARY_W 0x033c
|
||||
#define MACH64_VERTEX_2_SPEC_ARGB 0x026c
|
||||
#define MACH64_VERTEX_2_T 0x0264
|
||||
#define MACH64_VERTEX_2_W 0x0268
|
||||
#define MACH64_VERTEX_2_X_Y 0x0278
|
||||
#define MACH64_VERTEX_2_Z 0x0270
|
||||
#define MACH64_VERTEX_3_ARGB 0x0294
|
||||
#define MACH64_VERTEX_3_S 0x0280
|
||||
#define MACH64_VERTEX_3_SECONDARY_S 0x02a0
|
||||
#define MACH64_VERTEX_3_SECONDARY_T 0x02a4
|
||||
#define MACH64_VERTEX_3_SECONDARY_W 0x02a8
|
||||
#define MACH64_VERTEX_3_SPEC_ARGB 0x028c
|
||||
#define MACH64_VERTEX_3_T 0x0284
|
||||
#define MACH64_VERTEX_3_W 0x0288
|
||||
#define MACH64_VERTEX_3_X_Y 0x0298
|
||||
#define MACH64_VERTEX_3_Z 0x0290
|
||||
|
||||
#define MACH64_Z_CNTL 0x054c
|
||||
#define MACH64_Z_OFF_PITCH 0x0548
|
||||
|
||||
|
||||
|
||||
#define MACH64_DATATYPE_CI8 2
|
||||
#define MACH64_DATATYPE_ARGB1555 3
|
||||
#define MACH64_DATATYPE_RGB565 4
|
||||
#define MACH64_DATATYPE_ARGB8888 6
|
||||
#define MACH64_DATATYPE_RGB332 7
|
||||
#define MACH64_DATATYPE_RGB8 9
|
||||
#define MACH64_DATATYPE_ARGB4444 15
|
||||
|
||||
#define MACH64_CRTC_INT_CNTL 0x0418
|
||||
|
||||
|
||||
|
||||
#define MACH64_BASE(reg) ((u32)(dev_priv->mmio->handle))
|
||||
|
||||
#define MACH64_ADDR(reg) (MACH64_BASE(reg) + reg)
|
||||
|
||||
#define MACH64_DEREF(reg) *(__volatile__ u32 *)MACH64_ADDR(reg)
|
||||
#define MACH64_READ(reg) MACH64_DEREF(reg)
|
||||
#define MACH64_WRITE(reg,val) do { MACH64_DEREF(reg) = val; } while (0)
|
||||
|
||||
|
||||
|
||||
|
||||
#define DWMREG0 0x0400
|
||||
#define DWMREG0_END 0x07ff
|
||||
#define DWMREG1 0x0000
|
||||
#define DWMREG1_END 0x03ff
|
||||
|
||||
#define ISREG0(r) (((r) >= DWMREG0) && ((r) <= DWMREG0_END))
|
||||
#define DMAREG0(r) (((r) - DWMREG0) >> 2)
|
||||
#define DMAREG1(r) ((((r) - DWMREG1) >> 2 ) | 0x0100)
|
||||
#define DMAREG(r) (ISREG0(r) ? DMAREG0(r) : DMAREG1(r))
|
||||
|
||||
#define MMREG0 0x0000
|
||||
#define MMREG0_END 0x00ff
|
||||
|
||||
#define ISMMREG0(r) (((r) >= MMREG0) && ((r) <= MMREG0_END))
|
||||
#define MMSELECT0(r) (((r) << 2) + DWMREG0)
|
||||
#define MMSELECT1(r) (((((r) & 0xff) << 2) + DWMREG1))
|
||||
#define MMSELECT(r) (ISMMREG0(r) ? MMSELECT0(r) : MMSELECT1(r))
|
||||
|
||||
/* ================================================================
|
||||
* Misc helper macros
|
||||
*/
|
||||
|
||||
#define LOCK_TEST_WITH_RETURN( dev ) \
|
||||
do { \
|
||||
if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \
|
||||
dev->lock.pid != current->pid ) { \
|
||||
DRM_ERROR( "%s called without lock held\n", \
|
||||
__FUNCTION__ ); \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* ================================================================
|
||||
* DMA macros
|
||||
*/
|
||||
|
||||
#define DMA_FRAME_BUF_OFFSET 0
|
||||
#define DMA_SYS_MEM_ADDR 1
|
||||
#define DMA_COMMAND 2
|
||||
#define DMA_RESERVED 3
|
||||
|
||||
#define DMA_CHUNKSIZE 0x1000
|
||||
#define APERTURE_OFFSET 0x7ff800
|
||||
|
||||
|
||||
#define MACH64_VERBOSE 0
|
||||
|
||||
#define DMALOCALS
|
||||
|
||||
#define DMAGETPTR( dev_priv, n ) \
|
||||
do { \
|
||||
if ( MACH64_VERBOSE ) { \
|
||||
DRM_INFO( "DMAGETPTR( %d ) in %s\n", \
|
||||
n, __FUNCTION__ ); \
|
||||
} \
|
||||
mach64_do_wait_for_fifo( dev_priv, n ); \
|
||||
} while (0)
|
||||
|
||||
#define DMAOUTREG( reg, val ) \
|
||||
do { \
|
||||
if ( MACH64_VERBOSE ) { \
|
||||
DRM_INFO( " DMAOUTREG( 0x%x = 0x%08x )\n", \
|
||||
reg, val ); \
|
||||
} \
|
||||
MACH64_WRITE( reg, val ); \
|
||||
} while (0)
|
||||
|
||||
#define DMAADVANCE( dev_priv ) \
|
||||
do { \
|
||||
if ( MACH64_VERBOSE ) { \
|
||||
DRM_INFO( "DMAADVANCE() in %s\n", __FUNCTION__ ); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
342
linux/mach64_state.c
Normal file
342
linux/mach64_state.c
Normal file
|
|
@ -0,0 +1,342 @@
|
|||
/* mach64_dma.c -- DMA support for mach64 (Rage Pro) driver -*- linux-c -*-
|
||||
* Created: Sun Dec 03 19:20:26 2000 by gareth@valinux.com
|
||||
*
|
||||
* Copyright 2000 Gareth Hughes
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* 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
|
||||
* GARETH HUGHES 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.
|
||||
*
|
||||
* Authors:
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
|
||||
#define __NO_VERSION__
|
||||
#include "mach64.h"
|
||||
#include "drmP.h"
|
||||
#include "mach64_drv.h"
|
||||
#include "drm.h"
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* CCE command dispatch functions
|
||||
*/
|
||||
|
||||
static void mach64_print_dirty( const char *msg, unsigned int flags )
|
||||
{
|
||||
#if 0
|
||||
DRM_INFO( "%s: (0x%x) %s%s%s%s%s%s%s%s%s\n",
|
||||
msg,
|
||||
flags,
|
||||
(flags & MACH64_UPLOAD_CORE) ? "core, " : "",
|
||||
(flags & MACH64_UPLOAD_CONTEXT) ? "context, " : "",
|
||||
(flags & MACH64_UPLOAD_SETUP) ? "setup, " : "",
|
||||
(flags & MACH64_UPLOAD_TEX0) ? "tex0, " : "",
|
||||
(flags & MACH64_UPLOAD_TEX1) ? "tex1, " : "",
|
||||
(flags & MACH64_UPLOAD_MASKS) ? "masks, " : "",
|
||||
(flags & MACH64_UPLOAD_WINDOW) ? "window, " : "",
|
||||
(flags & MACH64_UPLOAD_CLIPRECTS) ? "cliprects, " : "",
|
||||
(flags & MACH64_REQUIRE_QUIESCENCE) ? "quiescence, " : "" );
|
||||
#endif
|
||||
}
|
||||
|
||||
static void mach64_dma_dispatch_clear( drm_device_t *dev,
|
||||
unsigned int flags,
|
||||
int cx, int cy, int cw, int ch,
|
||||
unsigned int clear_color,
|
||||
unsigned int clear_depth )
|
||||
{
|
||||
drm_mach64_private_t *dev_priv = dev->dev_private;
|
||||
drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
||||
int nbox = sarea_priv->nbox;
|
||||
drm_clip_rect_t *pbox = sarea_priv->boxes;
|
||||
u32 fb_bpp, depth_bpp;
|
||||
int i;
|
||||
DMALOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
switch ( dev_priv->fb_bpp ) {
|
||||
case 16:
|
||||
fb_bpp = MACH64_DATATYPE_RGB565;
|
||||
break;
|
||||
case 32:
|
||||
fb_bpp = MACH64_DATATYPE_ARGB8888;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
switch ( dev_priv->depth_bpp ) {
|
||||
case 16:
|
||||
depth_bpp = MACH64_DATATYPE_RGB565;
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
depth_bpp = MACH64_DATATYPE_ARGB8888;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
for ( i = 0 ; i < nbox ; i++ ) {
|
||||
int x = pbox[i].x1;
|
||||
int y = pbox[i].y1;
|
||||
int w = pbox[i].x2 - x;
|
||||
int h = pbox[i].y2 - y;
|
||||
|
||||
DRM_DEBUG( "dispatch clear %d,%d-%d,%d flags 0x%x\n",
|
||||
pbox[i].x1, pbox[i].y1,
|
||||
pbox[i].x2, pbox[i].y2, flags );
|
||||
|
||||
if ( flags & (MACH64_FRONT | MACH64_BACK) ) {
|
||||
/* Setup for color buffer clears
|
||||
*/
|
||||
DMAGETPTR( dev_priv, 14 );
|
||||
|
||||
DMAOUTREG( MACH64_Z_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_SCALE_3D_CNTL, 0 );
|
||||
|
||||
DMAOUTREG( MACH64_CLR_CMP_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_GUI_TRAJ_CNTL,
|
||||
(MACH64_DST_X_LEFT_TO_RIGHT |
|
||||
MACH64_DST_Y_TOP_TO_BOTTOM) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_PIX_WIDTH, ((fb_bpp << 0) |
|
||||
(fb_bpp << 4) |
|
||||
(fb_bpp << 8) |
|
||||
(fb_bpp << 16) |
|
||||
(fb_bpp << 28)) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_FRGD_CLR, clear_color );
|
||||
/* FIXME: Use color mask from state info */
|
||||
DMAOUTREG( MACH64_DP_WRITE_MASK, 0xffffffff );
|
||||
DMAOUTREG( MACH64_DP_MIX, (MACH64_BKGD_MIX_D |
|
||||
MACH64_FRGD_MIX_S) );
|
||||
DMAOUTREG( MACH64_DP_SRC, (MACH64_BKGD_SRC_FRGD_CLR |
|
||||
MACH64_FRGD_SRC_FRGD_CLR |
|
||||
MACH64_MONO_SRC_ONE) );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
|
||||
}
|
||||
|
||||
if ( flags & MACH64_FRONT ) {
|
||||
DMAGETPTR( dev_priv, 3 );
|
||||
|
||||
DMAOUTREG( MACH64_DST_OFF_PITCH,
|
||||
dev_priv->front_offset_pitch );
|
||||
DMAOUTREG( MACH64_DST_X_Y,
|
||||
(y << 16) | x );
|
||||
DMAOUTREG( MACH64_DST_WIDTH_HEIGHT,
|
||||
(h << 16) | w );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
}
|
||||
|
||||
if ( flags & MACH64_BACK ) {
|
||||
DMAGETPTR( dev_priv, 3 );
|
||||
|
||||
DMAOUTREG( MACH64_DST_OFF_PITCH,
|
||||
dev_priv->back_offset_pitch );
|
||||
DMAOUTREG( MACH64_DST_X_Y,
|
||||
(y << 16) | x );
|
||||
DMAOUTREG( MACH64_DST_WIDTH_HEIGHT,
|
||||
(h << 16) | w );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
}
|
||||
|
||||
if ( flags & MACH64_DEPTH ) {
|
||||
/* Setup for depth buffer clear
|
||||
*/
|
||||
DMAGETPTR( dev_priv, 12 );
|
||||
|
||||
DMAOUTREG( MACH64_Z_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_SCALE_3D_CNTL, 0 );
|
||||
|
||||
DMAOUTREG( MACH64_CLR_CMP_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_GUI_TRAJ_CNTL,
|
||||
(MACH64_DST_X_LEFT_TO_RIGHT |
|
||||
MACH64_DST_Y_TOP_TO_BOTTOM) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_PIX_WIDTH, ((depth_bpp << 0) |
|
||||
(depth_bpp << 4) |
|
||||
(depth_bpp << 8) |
|
||||
(depth_bpp << 16) |
|
||||
(depth_bpp << 28)) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_FRGD_CLR, clear_depth );
|
||||
DMAOUTREG( MACH64_DP_WRITE_MASK, 0xffffffff );
|
||||
DMAOUTREG( MACH64_DP_MIX, (MACH64_BKGD_MIX_D |
|
||||
MACH64_FRGD_MIX_S) );
|
||||
DMAOUTREG( MACH64_DP_SRC, (MACH64_BKGD_SRC_FRGD_CLR |
|
||||
MACH64_FRGD_SRC_FRGD_CLR |
|
||||
MACH64_MONO_SRC_ONE) );
|
||||
|
||||
DMAOUTREG( MACH64_DST_OFF_PITCH,
|
||||
dev_priv->depth_offset_pitch );
|
||||
DMAOUTREG( MACH64_DST_X_Y,
|
||||
(y << 16) | x );
|
||||
DMAOUTREG( MACH64_DST_WIDTH_HEIGHT,
|
||||
(h << 16) | w );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void mach64_dma_dispatch_swap( drm_device_t *dev )
|
||||
{
|
||||
drm_mach64_private_t *dev_priv = dev->dev_private;
|
||||
drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
||||
int nbox = sarea_priv->nbox;
|
||||
drm_clip_rect_t *pbox = sarea_priv->boxes;
|
||||
u32 fb_bpp;
|
||||
int i;
|
||||
DMALOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
switch ( dev_priv->fb_bpp ) {
|
||||
case 16:
|
||||
fb_bpp = MACH64_DATATYPE_RGB565;
|
||||
break;
|
||||
case 32:
|
||||
default:
|
||||
fb_bpp = MACH64_DATATYPE_ARGB8888;
|
||||
break;
|
||||
}
|
||||
|
||||
DMAGETPTR( dev_priv, 10 );
|
||||
|
||||
DMAOUTREG( MACH64_Z_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_SCALE_3D_CNTL, 0 );
|
||||
|
||||
DMAOUTREG( MACH64_CLR_CMP_CNTL, 0 );
|
||||
DMAOUTREG( MACH64_GUI_TRAJ_CNTL, (MACH64_DST_X_LEFT_TO_RIGHT |
|
||||
MACH64_DST_Y_TOP_TO_BOTTOM) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_PIX_WIDTH, ((fb_bpp << 0) |
|
||||
(fb_bpp << 4) |
|
||||
(fb_bpp << 8) |
|
||||
(fb_bpp << 16) |
|
||||
(fb_bpp << 28)) );
|
||||
|
||||
DMAOUTREG( MACH64_DP_WRITE_MASK, 0xffffffff );
|
||||
DMAOUTREG( MACH64_DP_MIX, (MACH64_BKGD_MIX_D |
|
||||
MACH64_FRGD_MIX_S) );
|
||||
DMAOUTREG( MACH64_DP_SRC, (MACH64_BKGD_SRC_BKGD_CLR |
|
||||
MACH64_FRGD_SRC_BLIT |
|
||||
MACH64_MONO_SRC_ONE) );
|
||||
|
||||
DMAOUTREG( MACH64_SRC_OFF_PITCH, dev_priv->back_offset_pitch );
|
||||
DMAOUTREG( MACH64_DST_OFF_PITCH, dev_priv->front_offset_pitch );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
|
||||
for ( i = 0 ; i < nbox ; i++ ) {
|
||||
int x = pbox[i].x1;
|
||||
int y = pbox[i].y1;
|
||||
int w = pbox[i].x2 - x;
|
||||
int h = pbox[i].y2 - y;
|
||||
|
||||
DRM_DEBUG( "dispatch swap %d,%d-%d,%d\n",
|
||||
pbox[i].x1, pbox[i].y1,
|
||||
pbox[i].x2, pbox[i].y2 );
|
||||
|
||||
DMAGETPTR( dev_priv, 4 );
|
||||
|
||||
DMAOUTREG( MACH64_SRC_WIDTH1, w );
|
||||
DMAOUTREG( MACH64_SRC_Y_X, (x << 16) | y );
|
||||
DMAOUTREG( MACH64_DST_Y_X, (x << 16) | y );
|
||||
DMAOUTREG( MACH64_DST_WIDTH_HEIGHT, (h << 16) | w );
|
||||
|
||||
DMAADVANCE( dev_priv );
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Increment the frame counter. The client-side 3D driver must
|
||||
* throttle the framerate by waiting for this value before
|
||||
* performing the swapbuffer ioctl.
|
||||
*/
|
||||
dev_priv->sarea_priv->last_frame++;
|
||||
|
||||
BEGIN_RING( 2 );
|
||||
|
||||
OUT_RING( CCE_PACKET0( MACH64_LAST_FRAME_REG, 0 ) );
|
||||
OUT_RING( dev_priv->sarea_priv->last_frame );
|
||||
|
||||
ADVANCE_RING();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* IOCTL functions
|
||||
*/
|
||||
|
||||
int mach64_dma_clear( 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_mach64_private_t *dev_priv = dev->dev_private;
|
||||
drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
||||
drm_mach64_clear_t clear;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
LOCK_TEST_WITH_RETURN( dev );
|
||||
|
||||
if ( copy_from_user( &clear, (drm_mach64_clear_t *) arg,
|
||||
sizeof(clear) ) )
|
||||
return -EFAULT;
|
||||
|
||||
if ( sarea_priv->nbox > MACH64_NR_SAREA_CLIPRECTS )
|
||||
sarea_priv->nbox = MACH64_NR_SAREA_CLIPRECTS;
|
||||
|
||||
mach64_dma_dispatch_clear( dev, clear.flags,
|
||||
clear.x, clear.y, clear.w, clear.h,
|
||||
clear.clear_color, clear.clear_depth );
|
||||
|
||||
/* Make sure we restore the 3D state next time.
|
||||
*/
|
||||
dev_priv->sarea_priv->dirty |= (MACH64_UPLOAD_CONTEXT |
|
||||
MACH64_UPLOAD_MISC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mach64_dma_swap( 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_mach64_private_t *dev_priv = dev->dev_private;
|
||||
drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
LOCK_TEST_WITH_RETURN( dev );
|
||||
|
||||
if ( sarea_priv->nbox > MACH64_NR_SAREA_CLIPRECTS )
|
||||
sarea_priv->nbox = MACH64_NR_SAREA_CLIPRECTS;
|
||||
|
||||
mach64_dma_dispatch_swap( dev );
|
||||
|
||||
/* Make sure we restore the 3D state next time.
|
||||
*/
|
||||
dev_priv->sarea_priv->dirty |= (MACH64_UPLOAD_CONTEXT |
|
||||
MACH64_UPLOAD_MISC);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -104,6 +104,7 @@ typedef struct drm_tex_region {
|
|||
#include "i810_drm.h"
|
||||
#include "r128_drm.h"
|
||||
#include "radeon_drm.h"
|
||||
#include "mach64_drm.h"
|
||||
#include "sis_drm.h"
|
||||
#include "i830_drm.h"
|
||||
#include "gamma_drm.h"
|
||||
|
|
@ -515,5 +516,10 @@ typedef struct drm_scatter_gather {
|
|||
#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46)
|
||||
#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t)
|
||||
#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48)
|
||||
/* Mach64 specific ioctls */
|
||||
#define DRM_IOCTL_MACH64_INIT DRM_IOW( 0x40, drm_mach64_init_t)
|
||||
#define DRM_IOCTL_MACH64_CLEAR DRM_IOW( 0x41, drm_mach64_clear_t)
|
||||
#define DRM_IOCTL_MACH64_SWAP DRM_IO( 0x42)
|
||||
#define DRM_IOCTL_MACH64_IDLE DRM_IO( 0x43)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ typedef struct drm_tex_region {
|
|||
#include "i810_drm.h"
|
||||
#include "r128_drm.h"
|
||||
#include "radeon_drm.h"
|
||||
#include "mach64_drm.h"
|
||||
#include "sis_drm.h"
|
||||
#include "i830_drm.h"
|
||||
#include "gamma_drm.h"
|
||||
|
|
@ -515,5 +516,10 @@ typedef struct drm_scatter_gather {
|
|||
#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46)
|
||||
#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t)
|
||||
#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48)
|
||||
/* Mach64 specific ioctls */
|
||||
#define DRM_IOCTL_MACH64_INIT DRM_IOW( 0x40, drm_mach64_init_t)
|
||||
#define DRM_IOCTL_MACH64_CLEAR DRM_IOW( 0x41, drm_mach64_clear_t)
|
||||
#define DRM_IOCTL_MACH64_SWAP DRM_IO( 0x42)
|
||||
#define DRM_IOCTL_MACH64_IDLE DRM_IO( 0x43)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue