📄 radeon_cp.c
字号:
/* radeon_cp.c -- CP support for Radeon -*- linux-c -*- * * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 VA Linux Systems, Inc., Fremont, 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 * PRECISION INSIGHT 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: * Kevin E. Martin <martin@valinux.com> * Gareth Hughes <gareth@valinux.com> */#define __NO_VERSION__#include "radeon.h"#include "drmP.h"#include "radeon_drv.h"#include <linux/interrupt.h> /* For task queue support */#include <linux/delay.h>#define RADEON_FIFO_DEBUG 0#if defined(__alpha__)# define PCIGART_ENABLED#else# undef PCIGART_ENABLED#endif/* CP microcode (from ATI) */static u32 radeon_cp_microcode[][2] = { { 0x21007000, 0000000000 }, { 0x20007000, 0000000000 }, { 0x000000b4, 0x00000004 }, { 0x000000b8, 0x00000004 }, { 0x6f5b4d4c, 0000000000 }, { 0x4c4c427f, 0000000000 }, { 0x5b568a92, 0000000000 }, { 0x4ca09c6d, 0000000000 }, { 0xad4c4c4c, 0000000000 }, { 0x4ce1af3d, 0000000000 }, { 0xd8afafaf, 0000000000 }, { 0xd64c4cdc, 0000000000 }, { 0x4cd10d10, 0000000000 }, { 0x000f0000, 0x00000016 }, { 0x362f242d, 0000000000 }, { 0x00000012, 0x00000004 }, { 0x000f0000, 0x00000016 }, { 0x362f282d, 0000000000 }, { 0x000380e7, 0x00000002 }, { 0x04002c97, 0x00000002 }, { 0x000f0001, 0x00000016 }, { 0x333a3730, 0000000000 }, { 0x000077ef, 0x00000002 }, { 0x00061000, 0x00000002 }, { 0x00000021, 0x0000001a }, { 0x00004000, 0x0000001e }, { 0x00061000, 0x00000002 }, { 0x00000021, 0x0000001a }, { 0x00004000, 0x0000001e }, { 0x00061000, 0x00000002 }, { 0x00000021, 0x0000001a }, { 0x00004000, 0x0000001e }, { 0x00000017, 0x00000004 }, { 0x0003802b, 0x00000002 }, { 0x040067e0, 0x00000002 }, { 0x00000017, 0x00000004 }, { 0x000077e0, 0x00000002 }, { 0x00065000, 0x00000002 }, { 0x000037e1, 0x00000002 }, { 0x040067e1, 0x00000006 }, { 0x000077e0, 0x00000002 }, { 0x000077e1, 0x00000002 }, { 0x000077e1, 0x00000006 }, { 0xffffffff, 0000000000 }, { 0x10000000, 0000000000 }, { 0x0003802b, 0x00000002 }, { 0x040067e0, 0x00000006 }, { 0x00007675, 0x00000002 }, { 0x00007676, 0x00000002 }, { 0x00007677, 0x00000002 }, { 0x00007678, 0x00000006 }, { 0x0003802c, 0x00000002 }, { 0x04002676, 0x00000002 }, { 0x00007677, 0x00000002 }, { 0x00007678, 0x00000006 }, { 0x0000002f, 0x00000018 }, { 0x0000002f, 0x00000018 }, { 0000000000, 0x00000006 }, { 0x00000030, 0x00000018 }, { 0x00000030, 0x00000018 }, { 0000000000, 0x00000006 }, { 0x01605000, 0x00000002 }, { 0x00065000, 0x00000002 }, { 0x00098000, 0x00000002 }, { 0x00061000, 0x00000002 }, { 0x64c0603e, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00080000, 0x00000016 }, { 0000000000, 0000000000 }, { 0x0400251d, 0x00000002 }, { 0x00007580, 0x00000002 }, { 0x00067581, 0x00000002 }, { 0x04002580, 0x00000002 }, { 0x00067581, 0x00000002 }, { 0x00000049, 0x00000004 }, { 0x00005000, 0000000000 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00061000, 0x00000002 }, { 0x0000750e, 0x00000002 }, { 0x00019000, 0x00000002 }, { 0x00011055, 0x00000014 }, { 0x00000055, 0x00000012 }, { 0x0400250f, 0x00000002 }, { 0x0000504f, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00007565, 0x00000002 }, { 0x00007566, 0x00000002 }, { 0x00000058, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x01e655b4, 0x00000002 }, { 0x4401b0e4, 0x00000002 }, { 0x01c110e4, 0x00000002 }, { 0x26667066, 0x00000018 }, { 0x040c2565, 0x00000002 }, { 0x00000066, 0x00000018 }, { 0x04002564, 0x00000002 }, { 0x00007566, 0x00000002 }, { 0x0000005d, 0x00000004 }, { 0x00401069, 0x00000008 }, { 0x00101000, 0x00000002 }, { 0x000d80ff, 0x00000002 }, { 0x0080006c, 0x00000008 }, { 0x000f9000, 0x00000002 }, { 0x000e00ff, 0x00000002 }, { 0000000000, 0x00000006 }, { 0x0000008f, 0x00000018 }, { 0x0000005b, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00007576, 0x00000002 }, { 0x00065000, 0x00000002 }, { 0x00009000, 0x00000002 }, { 0x00041000, 0x00000002 }, { 0x0c00350e, 0x00000002 }, { 0x00049000, 0x00000002 }, { 0x00051000, 0x00000002 }, { 0x01e785f8, 0x00000002 }, { 0x00200000, 0x00000002 }, { 0x0060007e, 0x0000000c }, { 0x00007563, 0x00000002 }, { 0x006075f0, 0x00000021 }, { 0x20007073, 0x00000004 }, { 0x00005073, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00007576, 0x00000002 }, { 0x00007577, 0x00000002 }, { 0x0000750e, 0x00000002 }, { 0x0000750f, 0x00000002 }, { 0x00a05000, 0x00000002 }, { 0x00600083, 0x0000000c }, { 0x006075f0, 0x00000021 }, { 0x000075f8, 0x00000002 }, { 0x00000083, 0x00000004 }, { 0x000a750e, 0x00000002 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x0020750f, 0x00000002 }, { 0x00600086, 0x00000004 }, { 0x00007570, 0x00000002 }, { 0x00007571, 0x00000002 }, { 0x00007572, 0x00000006 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00005000, 0x00000002 }, { 0x00a05000, 0x00000002 }, { 0x00007568, 0x00000002 }, { 0x00061000, 0x00000002 }, { 0x00000095, 0x0000000c }, { 0x00058000, 0x00000002 }, { 0x0c607562, 0x00000002 }, { 0x00000097, 0x00000004 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x00600096, 0x00000004 }, { 0x400070e5, 0000000000 }, { 0x000380e6, 0x00000002 }, { 0x040025c5, 0x00000002 }, { 0x000380e5, 0x00000002 }, { 0x000000a8, 0x0000001c }, { 0x000650aa, 0x00000018 }, { 0x040025bb, 0x00000002 }, { 0x000610ab, 0x00000018 }, { 0x040075bc, 0000000000 }, { 0x000075bb, 0x00000002 }, { 0x000075bc, 0000000000 }, { 0x00090000, 0x00000006 }, { 0x00090000, 0x00000002 }, { 0x000d8002, 0x00000006 }, { 0x00007832, 0x00000002 }, { 0x00005000, 0x00000002 }, { 0x000380e7, 0x00000002 }, { 0x04002c97, 0x00000002 }, { 0x00007820, 0x00000002 }, { 0x00007821, 0x00000002 }, { 0x00007800, 0000000000 }, { 0x01200000, 0x00000002 }, { 0x20077000, 0x00000002 }, { 0x01200000, 0x00000002 }, { 0x20007000, 0x00000002 }, { 0x00061000, 0x00000002 }, { 0x0120751b, 0x00000002 }, { 0x8040750a, 0x00000002 }, { 0x8040750b, 0x00000002 }, { 0x00110000, 0x00000002 }, { 0x000380e5, 0x00000002 }, { 0x000000c6, 0x0000001c }, { 0x000610ab, 0x00000018 }, { 0x844075bd, 0x00000002 }, { 0x000610aa, 0x00000018 }, { 0x840075bb, 0x00000002 }, { 0x000610ab, 0x00000018 }, { 0x844075bc, 0x00000002 }, { 0x000000c9, 0x00000004 }, { 0x804075bd, 0x00000002 }, { 0x800075bb, 0x00000002 }, { 0x804075bc, 0x00000002 }, { 0x00108000, 0x00000002 }, { 0x01400000, 0x00000002 }, { 0x006000cd, 0x0000000c }, { 0x20c07000, 0x00000020 }, { 0x000000cf, 0x00000012 }, { 0x00800000, 0x00000006 }, { 0x0080751d, 0x00000006 }, { 0000000000, 0000000000 }, { 0x0000775c, 0x00000002 }, { 0x00a05000, 0x00000002 }, { 0x00661000, 0x00000002 }, { 0x0460275d, 0x00000020 }, { 0x00004000, 0000000000 }, { 0x01e00830, 0x00000002 }, { 0x21007000, 0000000000 }, { 0x6464614d, 0000000000 }, { 0x69687420, 0000000000 }, { 0x00000073, 0000000000 }, { 0000000000, 0000000000 }, { 0x00005000, 0x00000002 }, { 0x000380d0, 0x00000002 }, { 0x040025e0, 0x00000002 }, { 0x000075e1, 0000000000 }, { 0x00000001, 0000000000 }, { 0x000380e0, 0x00000002 }, { 0x04002394, 0x00000002 }, { 0x00005000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0x00000008, 0000000000 }, { 0x00000004, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 }, { 0000000000, 0000000000 },};int RADEON_READ_PLL(drm_device_t *dev, int addr){ drm_radeon_private_t *dev_priv = dev->dev_private; RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f); return RADEON_READ(RADEON_CLOCK_CNTL_DATA);}#if RADEON_FIFO_DEBUGstatic void radeon_status( drm_radeon_private_t *dev_priv ){ printk( "%s:\n", __FUNCTION__ ); printk( "RBBM_STATUS = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_RBBM_STATUS ) ); printk( "CP_RB_RTPR = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_CP_RB_RPTR ) ); printk( "CP_RB_WTPR = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_CP_RB_WPTR ) ); printk( "AIC_CNTL = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_AIC_CNTL ) ); printk( "AIC_STAT = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_AIC_STAT ) ); printk( "AIC_PT_BASE = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_AIC_PT_BASE ) ); printk( "TLB_ADDR = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_AIC_TLB_ADDR ) ); printk( "TLB_DATA = 0x%08x\n", (unsigned int)RADEON_READ( RADEON_AIC_TLB_DATA ) );}#endif/* ================================================================ * Engine, FIFO control */static int radeon_do_pixcache_flush( drm_radeon_private_t *dev_priv ){ u32 tmp; int i; tmp = RADEON_READ( RADEON_RB2D_DSTCACHE_CTLSTAT ); tmp |= RADEON_RB2D_DC_FLUSH_ALL; RADEON_WRITE( RADEON_RB2D_DSTCACHE_CTLSTAT, tmp ); for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { if ( !(RADEON_READ( RADEON_RB2D_DSTCACHE_CTLSTAT ) & RADEON_RB2D_DC_BUSY) ) { return 0; } udelay( 1 ); }#if RADEON_FIFO_DEBUG DRM_ERROR( "failed!\n" ); radeon_status( dev_priv );#endif return -EBUSY;}static int radeon_do_wait_for_fifo( drm_radeon_private_t *dev_priv, int entries ){ int i; for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { int slots = ( RADEON_READ( RADEON_RBBM_STATUS ) & RADEON_RBBM_FIFOCNT_MASK ); if ( slots >= entries ) return 0; udelay( 1 ); }#if RADEON_FIFO_DEBUG DRM_ERROR( "failed!\n" ); radeon_status( dev_priv );#endif return -EBUSY;}static int radeon_do_wait_for_idle( drm_radeon_private_t *dev_priv ){ int i, ret; ret = radeon_do_wait_for_fifo( dev_priv, 64 ); if ( ret < 0 ) return ret; for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { if ( !(RADEON_READ( RADEON_RBBM_STATUS ) & RADEON_RBBM_ACTIVE) ) { radeon_do_pixcache_flush( dev_priv ); return 0; } udelay( 1 ); }#if RADEON_FIFO_DEBUG DRM_ERROR( "failed!\n" ); radeon_status( dev_priv );#endif return -EBUSY;}/* ================================================================ * CP control, initialization *//* Load the microcode for the CP */static void radeon_cp_load_microcode( drm_radeon_private_t *dev_priv ){ int i; DRM_DEBUG( "%s\n", __FUNCTION__ ); radeon_do_wait_for_idle( dev_priv ); RADEON_WRITE( RADEON_CP_ME_RAM_ADDR, 0 ); for ( i = 0 ; i < 256 ; i++ ) { RADEON_WRITE( RADEON_CP_ME_RAM_DATAH, radeon_cp_microcode[i][1] ); RADEON_WRITE( RADEON_CP_ME_RAM_DATAL, radeon_cp_microcode[i][0] ); }}/* Flush any pending commands to the CP. This should only be used just * prior to a wait for idle, as it informs the engine that the command * stream is ending. */static void radeon_do_cp_flush( drm_radeon_private_t *dev_priv ){ DRM_DEBUG( "%s\n", __FUNCTION__ );#if 0 u32 tmp; tmp = RADEON_READ( RADEON_CP_RB_WPTR ) | (1 << 31); RADEON_WRITE( RADEON_CP_RB_WPTR, tmp );#endif}/* Wait for the CP to go idle. */int radeon_do_cp_idle( drm_radeon_private_t *dev_priv ){ RING_LOCALS; DRM_DEBUG( "%s\n", __FUNCTION__ ); BEGIN_RING( 6 ); RADEON_PURGE_CACHE(); RADEON_PURGE_ZCACHE(); RADEON_WAIT_UNTIL_IDLE(); ADVANCE_RING(); return radeon_do_wait_for_idle( dev_priv );}/* Start the Command Processor. */static void radeon_do_cp_start( drm_radeon_private_t *dev_priv ){ RING_LOCALS; DRM_DEBUG( "%s\n", __FUNCTION__ ); radeon_do_wait_for_idle( dev_priv ); RADEON_WRITE( RADEON_CP_CSQ_CNTL, dev_priv->cp_mode ); dev_priv->cp_running = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -