diff options
author | Jordan Crouse <jordan.crouse@amd.com> | 2006-07-07 13:05:19 -0600 |
---|---|---|
committer | Jordan Crouse <jordan.crouse@amd.com> | 2006-07-07 13:35:53 -0600 |
commit | 726d46c8da96b2a0168b39d36be32467d54a9de3 (patch) | |
tree | c1bdf5bff463b5f6f56a732cd4e663fa6750fef5 /src/gfx | |
parent | c3ab9f1a60afe1f5e86db1cf2635acda14fae2f5 (diff) |
Update with cleanup and other fixes
Final commit of cleanup fixes prior to pushing
Diffstat (limited to 'src/gfx')
-rw-r--r-- | src/gfx/disp_gu3.c | 2603 | ||||
-rw-r--r-- | src/gfx/durango.c | 4 | ||||
-rw-r--r-- | src/gfx/gfx_disp.c | 332 | ||||
-rw-r--r-- | src/gfx/gfx_init.c | 134 | ||||
-rw-r--r-- | src/gfx/gfx_regs.h | 378 | ||||
-rw-r--r-- | src/gfx/gfx_rtns.h | 3 | ||||
-rw-r--r-- | src/gfx/gfx_type.h | 2 | ||||
-rw-r--r-- | src/gfx/gfx_vid.c | 216 | ||||
-rw-r--r-- | src/gfx/init_gu3.c | 159 | ||||
-rw-r--r-- | src/gfx/vid_cstl.c | 2571 |
10 files changed, 6 insertions, 6396 deletions
diff --git a/src/gfx/disp_gu3.c b/src/gfx/disp_gu3.c deleted file mode 100644 index 8fdbb27..0000000 --- a/src/gfx/disp_gu3.c +++ /dev/null @@ -1,2603 +0,0 @@ -/* Copyright (c) 2005 Advanced Micro Devices, Inc. - * - * 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 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - */ - -/* - * This file contains routines for the second generation display controller. - * */ - -void gu3_enable_compression(void); /* private routine definition */ -void gu3_disable_compression(void); /* private routine definition */ -int gfx_set_display_control(int sync_polarities); /* private routine definition */ -void gfx_reset_video(void); -int gu3_set_specified_mode(DISPLAYMODE * pMode, int bpp); - - /*--------------------------------------------------------------------------- - * WARNING!!!! INACCURATE DELAY MECHANISM - * - * In an effort to keep the code self contained and operating system - * independent, the delay loop just performs reads of a display controller - * register. This time will vary for faster processors. The delay can always - * be longer than intended, only effecting the time of the mode switch - * (obviously want it to still be under a second). Problems with the hardware - * only arise if the delay is not long enough. - *---------------------------------------------------------------------------- - */ - -#define CSTL_READS_PER_MILLISECOND 15000L - -#if GFX_DISPLAY_DYNAMIC -void -gu3_delay_milliseconds(unsigned long milliseconds) -#else -void -gfx_delay_milliseconds(unsigned long milliseconds) -#endif -{ - /* ASSUME 300 MHZ 20 CLOCKS PER READ */ - - unsigned long loop; - - loop = milliseconds * CSTL_READS_PER_MILLISECOND; - while (loop-- > 0) { - READ_REG32(DC3_UNLOCK); - } -} - -#if GFX_DISPLAY_DYNAMIC -void -gu3_delay_microseconds(unsigned long microseconds) -#else -void -gfx_delay_microseconds(unsigned long microseconds) -#endif -{ - /* ASSUME 300 MHz, 2 CLOCKS PER INCREMENT */ - - unsigned long loop_count = microseconds * 15; - - while (loop_count-- > 0) { - READ_REG32(DC3_UNLOCK); - } -} - -/*---------------------------------------------------------------------------- - * GFX_SET_DISPLAY_BPP - * - * This routine programs the bpp in the display controller. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_display_bpp(unsigned short bpp) -#else -int -gfx_set_display_bpp(unsigned short bpp) -#endif -{ - unsigned long dcfg, lock; - - dcfg = - READ_REG32(DC3_DISPLAY_CFG) & ~(DC3_DCFG_DISP_MODE_MASK | - DC3_DCFG_16BPP_MODE_MASK); - lock = READ_REG32(DC3_UNLOCK); - - switch (bpp) { - case 12: - dcfg |= (DC3_DCFG_DISP_MODE_16BPP | DC3_DCFG_12BPP); - break; - case 15: - dcfg |= (DC3_DCFG_DISP_MODE_16BPP | DC3_DCFG_15BPP); - break; - case 16: - dcfg |= (DC3_DCFG_DISP_MODE_16BPP | DC3_DCFG_16BPP); - break; - case 32: - dcfg |= (DC3_DCFG_DISP_MODE_24BPP); - break; - case 8: - dcfg |= (DC3_DCFG_DISP_MODE_8BPP); - break; - default: - return GFX_STATUS_BAD_PARAMETER; - } - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_DISPLAY_CFG, dcfg); - WRITE_REG32(DC3_UNLOCK, lock); - - /* SET BPP IN GRAPHICS PIPELINE */ - - gfx_set_bpp(bpp); - - return 0; -} - -/*---------------------------------------------------------------------------- - * gu3_set_specified_mode (private routine) - * This routine uses the parameters in the specified display mode structure - * to program the display controller hardware. - *---------------------------------------------------------------------------- - */ -int -gu3_set_specified_mode(DISPLAYMODE * pMode, int bpp) -{ - Q_WORD msr_value; - unsigned long unlock, value; - unsigned long acfg, gcfg, dcfg; - unsigned long size, pitch; - unsigned long bpp_mask, temp, dv_size; - - /* CHECK WHETHER TIMING CHANGE IS ALLOWED */ - /* Flag used for locking also overrides timing change restriction */ - - if (gfx_timing_lock && !(pMode->flags & GFX_MODE_LOCK_TIMING)) - return GFX_STATUS_ERROR; - - /* CLEAR PANNING OFFSETS */ - - DeltaX = 0; - DeltaY = 0; - panelLeft = 0; - panelTop = 0; - - /* SET GLOBAL FLAG */ - - if (pMode->flags & GFX_MODE_LOCK_TIMING) - gfx_timing_lock = 1; - - /* CHECK FOR VALID BPP */ - /* As this function can be called directly from */ - /* gfx_set_display_timings, we must correct any */ - /* invalid bpp settings. */ - - switch (bpp) { - case 12: - bpp_mask = 0x00000900; - break; - case 15: - bpp_mask = 0x00000500; - break; - case 16: - bpp_mask = 0x00000100; - break; - case 32: - bpp_mask = 0x00000200; - break; - default: - bpp_mask = 0x00000000; - bpp = 8; - break; - } - - gbpp = bpp; - - /* DISABLE COMPRESSION */ - - gu3_disable_compression(); - - /* ALSO DISABLE VIDEO */ - /* Use private "reset video" routine to do all that is needed. */ - /* SC1200, for example, also disables the alpha blending regions. */ - - gfx_reset_video(); - - /* UNLOCK THE DISPLAY CONTROLLER REGISTERS */ - - unlock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - - /* READ THE CURRENT REGISTER VALUES */ - - gcfg = READ_REG32(DC3_GENERAL_CFG); - dcfg = READ_REG32(DC3_DISPLAY_CFG); - - /* BLANK THE DISPLAY IN THE DISPLAY FILTER */ - - gfx_set_crt_enable(0); - - /* DISABLE THE TIMING GENERATOR */ - - dcfg &= ~(unsigned long)DC3_DCFG_TGEN; - WRITE_REG32(DC3_DISPLAY_CFG, dcfg); - - /* DELAY: WAIT FOR PENDING MEMORY REQUESTS */ - /* This delay is used to make sure that all pending requests to the */ - /* memory controller have completed before disabling the FIFO load. */ - - gfx_delay_milliseconds(1); - - /* DISABLE DISPLAY FIFO LOAD */ - - gcfg &= ~(unsigned long)DC3_GCFG_DFLE; - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - - /* PRESERVE VIDEO INFORMATION */ - - gcfg &= (unsigned long)(DC3_GCFG_YUVM | DC3_GCFG_VDSE); - dcfg = 0; - - /* DISABLE VGA */ - /* VGA *MUST* be turned off before TGEN is enabled. If not, a condition - * will result where VGA Enable is waiting for a VSync to be latched but - * a VSync will not be generated until VGA is disabled. - * */ - - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - - /* SET THE DOT CLOCK FREQUENCY */ - /* Mask off the divide by two bit (bit 31) */ - - gfx_set_clock_frequency(pMode->frequency & 0x7FFFFFFF); - - /* DELAY: WAIT FOR THE PLL TO SETTLE */ - /* This allows the dot clock frequency that was just set to settle. */ - - gfx_delay_milliseconds(1); - - /* SET THE GX DISPLAY CONTROLLER PARAMETERS */ - - WRITE_REG32(DC3_FB_ST_OFFSET, 0); - WRITE_REG32(DC3_CB_ST_OFFSET, 0); - WRITE_REG32(DC3_CURS_ST_OFFSET, 0); - - /* SET LINE SIZE AND PITCH */ - /* 1. Flat Panels must use the mode width and not */ - /* the timing width to set the pitch. */ - /* 2. Mode sets will use a pitch that is aligned */ - /* on a 1K boundary to preserve legacy. The */ - /* pitch can be overridden by a subsequent call */ - /* to gfx_set_display_pitch. */ - - if (PanelEnable) - size = ModeWidth; - else - size = pMode->hactive; - - if (bpp > 8) - size <<= 1; - if (bpp > 16) - size <<= 1; - - pitch = 1024; - dv_size = DC3_DV_LINE_SIZE_1024; - - if (size > 1024) { - pitch = 2048; - dv_size = DC3_DV_LINE_SIZE_2048; - } - - if (size > 2048) { - pitch = 4096; - dv_size = DC3_DV_LINE_SIZE_4096; - } - - if (size > 4096) { - pitch = 8192; - dv_size = DC3_DV_LINE_SIZE_8192; - } - - WRITE_REG32(DC3_GFX_PITCH, pitch >> 3); - - /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ - - temp = READ_REG32(DC3_DV_CTL); - WRITE_REG32(DC3_DV_CTL, (temp & ~DC3_DV_LINE_SIZE_MASK) | dv_size); - - if (PanelEnable) { - size = pMode->hactive; - if (bpp > 8) - size <<= 1; - if (bpp > 16) - size <<= 1; - } - - WRITE_REG32(DC3_LINE_SIZE, ((size >> 3))); - - /* ALWAYS ENABLE VIDEO AND GRAPHICS DATA */ - /* These bits are relics from a previous design and */ - /* should always be enabled. */ - - dcfg |= (unsigned long)(DC3_DCFG_VDEN | DC3_DCFG_GDEN); - - /* SET PIXEL FORMAT */ - - dcfg |= bpp_mask; - - /* ENABLE TIMING GENERATOR, TIM. REG. UPDATES, PALETTE BYPASS */ - /* AND VERT. INT. SELECT */ - - dcfg |= - (unsigned long)(DC3_DCFG_TGEN | DC3_DCFG_TRUP | DC3_DCFG_PALB | - DC3_DCFG_VISL); - - /* SET FIFO PRIORITIES AND DISPLAY FIFO LOAD ENABLE */ - - gcfg |= 0x0000BA01; - dcfg |= 0x000EA000; - acfg = 0x001A0000; - - /* SET THE DISPLAY CHARACTERISTICS FOR HIGH BANDWIDTH CASES */ - - gfx_msr_read(RC_ID_VG, DC3_VG_SPARE_MSR, &msr_value); - msr_value.low &= - ~(VG_SPARE_DISABLE_CFIFO_HGO | VG_SPARE_VFIFO_ARB_SELECT | - VG_SPARE_LOAD_WM_LPEN_MASK | VG_SPARE_WM_LPEN_OVRD | - VG_SPARE_DISABLE_INIT_VID_PRI | VG_SPARE_DISABLE_VFIFO_WM); - msr_value.low |= VG_SPARE_DISABLE_CFIFO_HGO | VG_SPARE_VFIFO_ARB_SELECT; - gfx_msr_write(RC_ID_VG, DC3_VG_SPARE_MSR, &msr_value); - WRITE_REG32(DC3_ARB_CFG, acfg); - - /* ENABLE FLAT PANEL CENTERING */ - /* For panel modes having a resolution smaller than the */ - /* panel resolution, turn on data centering. */ - - if (PanelEnable && ModeWidth < PanelWidth) - dcfg |= DC3_DCFG_DCEN; - - /* SET THE GRAPHICS SCALE */ - /* We do not support graphics scaling, but we need to ensure that the */ - /* scale is set correctly none the less. */ - - WRITE_REG32(DC3_GFX_SCALE, 0x40004000); - WRITE_REG32(DC3_IRQ_CTL, 0); - - /* COMBINE AND SET TIMING VALUES */ - - value = (unsigned long)(pMode->hactive - 1) | - (((unsigned long)(pMode->htotal - 1)) << 16); - WRITE_REG32(DC3_H_ACTIVE_TIMING, value); - value = (unsigned long)(pMode->hblankstart - 1) | - (((unsigned long)(pMode->hblankend - 1)) << 16); - WRITE_REG32(DC3_H_BLANK_TIMING, value); - value = (unsigned long)(pMode->hsyncstart - 1) | - (((unsigned long)(pMode->hsyncend - 1)) << 16); - WRITE_REG32(DC3_H_SYNC_TIMING, value); - value = (unsigned long)(pMode->vactive - 1) | - (((unsigned long)(pMode->vtotal - 1)) << 16); - WRITE_REG32(DC3_V_ACTIVE_TIMING, value); - value = (unsigned long)(pMode->vblankstart - 1) | - (((unsigned long)(pMode->vblankend - 1)) << 16); - WRITE_REG32(DC3_V_BLANK_TIMING, value); - value = (unsigned long)(pMode->vsyncstart - 1) | - (((unsigned long)(pMode->vsyncend - 1)) << 16); - WRITE_REG32(DC3_V_SYNC_TIMING, value); - - WRITE_REG32(DC3_DISPLAY_CFG, dcfg); - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - - /* CONFIGURE DISPLAY OUTPUT FROM VIDEO PROCESSOR */ - - gfx_set_display_control(((pMode->flags & GFX_MODE_NEG_HSYNC) ? 1 : 0) | - ((pMode->flags & GFX_MODE_NEG_VSYNC) ? 2 : 0)); - - /* RESTORE VALUE OF DC3_UNLOCK */ - - WRITE_REG32(DC3_UNLOCK, unlock); - - /* RESET THE PITCH VALUES IN THE GP */ - - gfx_reset_pitch((unsigned short)pitch); - - gfx_set_bpp((unsigned short)bpp); - - return GFX_STATUS_OK; -} - - /*--------------------------------------------------------------------------- - * GFX_IS_DISPLAY_MODE_SUPPORTED - * - * This routine sets the specified display mode. - * - * Returns 1 if successful, 0 if mode could not be set. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_is_display_mode_supported(int xres, int yres, int bpp, int hz) -#else -int -gfx_is_display_mode_supported(int xres, int yres, int bpp, int hz) -#endif -{ - unsigned int mode; - unsigned long hz_flag = 0, bpp_flag = 0; - - /* SET FLAGS TO MATCH REFRESH RATE */ - gfx_mode_hz_conversion - /* SET BPP FLAGS TO LIMIT MODE SELECTION */ - gfx_mode_bpp_conversion - /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ - for (mode = 0; mode < NUM_RC_DISPLAY_MODES; mode++) { - if ((DisplayParams[mode].hactive == (unsigned short)xres) && - (DisplayParams[mode].vactive == (unsigned short)yres) && - (DisplayParams[mode].flags & hz_flag) && - (DisplayParams[mode].flags & bpp_flag)) { - - /* CASTLE DOES NOT SUPPORT EMULATED VGA MODES */ - - if ((DisplayParams[mode].flags & GFX_MODE_PIXEL_DOUBLE) || - (DisplayParams[mode].flags & GFX_MODE_LINE_DOUBLE)) - continue; - - /* SET THE DISPLAY CONTROLLER FOR THE SELECTED MODE */ - - return (mode); - } - } - return (-1); -} - -/*---------------------------------------------------------------------------- - * gfx_set_display_mode - * - * This routine sets the specified display mode. - * - * Returns 1 if successful, 0 if mode could not be set. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_display_mode(int xres, int yres, int bpp, int hz) -#else -int -gfx_set_display_mode(int xres, int yres, int bpp, int hz) -#endif -{ - int mode; - - /* DISABLE FLAT PANEL */ - /* Flat Panel settings are enabled by the function gfx_set_fixed_timings - * and disabled by gfx_set_display_mode. - * */ - - PanelEnable = 0; - - mode = gfx_is_display_mode_supported(xres, yres, bpp, hz); - if (mode >= 0) { - if (gu3_set_specified_mode(&DisplayParams[mode], - bpp) == GFX_STATUS_OK) - return (1); - } - return (0); -} - -/*---------------------------------------------------------------------------- - * GFX_SET_DISPLAY_TIMINGS - * - * This routine sets the display controller mode using the specified timing - * values (as opposed to using the tables internal to Durango). - * - * Returns GFX_STATUS_OK ON SUCCESS, GFX_STATUS_ERROR otherwise. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_display_timings(unsigned short bpp, unsigned short flags, - unsigned short hactive, unsigned short hblankstart, - unsigned short hsyncstart, unsigned short hsyncend, - unsigned short hblankend, unsigned short htotal, - unsigned short vactive, unsigned short vblankstart, - unsigned short vsyncstart, unsigned short vsyncend, - unsigned short vblankend, unsigned short vtotal, unsigned long frequency) -#else -int -gfx_set_display_timings(unsigned short bpp, unsigned short flags, - unsigned short hactive, unsigned short hblankstart, - unsigned short hsyncstart, unsigned short hsyncend, - unsigned short hblankend, unsigned short htotal, - unsigned short vactive, unsigned short vblankstart, - unsigned short vsyncstart, unsigned short vsyncend, - unsigned short vblankend, unsigned short vtotal, unsigned long frequency) -#endif -{ - /* SET MODE STRUCTURE WITH SPECIFIED VALUES */ - - gfx_display_mode.flags = 0; - if (flags & 1) - gfx_display_mode.flags |= GFX_MODE_NEG_HSYNC; - if (flags & 2) - gfx_display_mode.flags |= GFX_MODE_NEG_VSYNC; - if (flags & 0x1000) - gfx_display_mode.flags |= GFX_MODE_LOCK_TIMING; - gfx_display_mode.hactive = hactive; - gfx_display_mode.hblankstart = hblankstart; - gfx_display_mode.hsyncstart = hsyncstart; - gfx_display_mode.hsyncend = hsyncend; - gfx_display_mode.hblankend = hblankend; - gfx_display_mode.htotal = htotal; - gfx_display_mode.vactive = vactive; - gfx_display_mode.vblankstart = vblankstart; - gfx_display_mode.vsyncstart = vsyncstart; - gfx_display_mode.vsyncend = vsyncend; - gfx_display_mode.vblankend = vblankend; - gfx_display_mode.vtotal = vtotal; - gfx_display_mode.frequency = frequency; - - /* CALL ROUTINE TO SET MODE */ - - return (gu3_set_specified_mode(&gfx_display_mode, bpp)); -} - -/*---------------------------------------------------------------------------- - * GFX_SET_VTOTAL - * - * This routine sets the display controller vertical total to - * "vtotal". As a side effect it also sets vertical blank end. - * It should be used when only this value needs to be changed, - * due to speed considerations. - * - * Note: it is the caller's responsibility to make sure that - * a legal vtotal is used, i.e. that "vtotal" is greater than or - * equal to vsync end. - * - * Always returns 0. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_vtotal(unsigned short vtotal) -#else -int -gfx_set_vtotal(unsigned short vtotal) -#endif -{ - unsigned long unlock, dcfg, vactive, vblank; - - /* UNLOCK THE DISPLAY CONTROLLER REGISTERS */ - - unlock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - - /* READ THE CURRENT RC VALUES */ - - dcfg = READ_REG32(DC3_DISPLAY_CFG); - vactive = READ_REG32(DC3_V_ACTIVE_TIMING); - vblank = READ_REG32(DC3_V_BLANK_TIMING); - - /* DISABLE TIMING REGISTER UPDATES */ - - WRITE_REG32(DC3_DISPLAY_CFG, dcfg & ~(unsigned long)DC3_DCFG_TRUP); - - /* WRITE NEW TIMING VALUES */ - - WRITE_REG32(DC3_V_ACTIVE_TIMING, - (vactive & DC3_VAT_VA_MASK) | (unsigned long)(vtotal - 1) << 16); - WRITE_REG32(DC3_V_BLANK_TIMING, - (vblank & DC3_VBT_VBS_MASK) | (unsigned long)(vtotal - 1) << 16); - - /* RESTORE OLD RC VALUES */ - - WRITE_REG32(DC3_DISPLAY_CFG, dcfg); - WRITE_REG32(DC3_UNLOCK, unlock); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_pitch - * - * This routine sets the pitch of the frame buffer to the specified value. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_pitch(unsigned short pitch) -#else -void -gfx_set_display_pitch(unsigned short pitch) -#endif -{ - unsigned long value = 0; - unsigned long lock = READ_REG32(DC3_UNLOCK); - - value = READ_REG32(DC3_GFX_PITCH) & 0xFFFF0000; - value |= (pitch >> 3); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GFX_PITCH, value); - - /* SET RENDERING PITCHES TO MATCH */ - - gfx_reset_pitch(pitch); - - /* SET THE FRAME DIRTY MODE */ - /* Non-standard pitches, i.e. pitches that */ - /* are not 1K, 2K or 4K must mark the entire */ - /* frame as dirty when writing to the frame */ - /* buffer. */ - - value = READ_REG32(DC3_GENERAL_CFG); - - if (pitch == 1024 || pitch == 2048 || pitch == 4096 || pitch == 8192) - value &= ~(unsigned long)(DC3_GCFG_FDTY); - else - value |= (unsigned long)(DC3_GCFG_FDTY); - - WRITE_REG32(DC3_GENERAL_CFG, value); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_offset - * - * This routine sets the start address of the frame buffer. It is - * typically used to pan across a virtual desktop (frame buffer larger than - * the displayed screen) or to flip the display between multiple buffers. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_offset(unsigned long offset) -#else -void -gfx_set_display_offset(unsigned long offset) -#endif -{ - /* UPDATE FRAME BUFFER OFFSET */ - unsigned long lock; - - lock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - - /* START ADDRESS EFFECTS DISPLAY COMPRESSION */ - /* Disable compression for non-zero start addresss values. */ - /* Enable compression if offset is zero and comression is intended to */ - /* be enabled from a previous call to "gfx_set_compression_enable". */ - /* Compression should be disabled BEFORE the offset is changed */ - /* and enabled AFTER the offset is changed. */ - - if (offset == 0) { - WRITE_REG32(DC3_FB_ST_OFFSET, offset); - if (gfx_compression_enabled) { - /* WAIT FOR THE OFFSET TO BE LATCHED */ - gfx_wait_vertical_blank(); - gu3_enable_compression(); - } - } else { - /* ONLY DISABLE COMPRESSION ONCE */ - - if (gfx_compression_active) - gu3_disable_compression(); - - WRITE_REG32(DC3_FB_ST_OFFSET, offset); - } - - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_palette_entry - * - * This routine sets an palette entry in the display controller. - * A 32-bit X:R:G:B value. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_display_palette_entry(unsigned long index, unsigned long palette) -#else -int -gfx_set_display_palette_entry(unsigned long index, unsigned long palette) -#endif -{ - if (index > 0xFF) - return GFX_STATUS_BAD_PARAMETER; - - WRITE_REG32(DC3_PAL_ADDRESS, index); - WRITE_REG32(DC3_PAL_DATA, palette); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_palette - * - * This routine sets the entire palette in the display controller. - * A pointer is provided to a 256 entry table of 32-bit X:R:G:B values. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_display_palette(unsigned long *palette) -#else -int -gfx_set_display_palette(unsigned long *palette) -#endif -{ - unsigned long i; - - WRITE_REG32(DC3_PAL_ADDRESS, 0); - - if (palette) { - for (i = 0; i < 256; i++) { - WRITE_REG32(DC3_PAL_DATA, palette[i]); - } - } - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_cursor_enable - * - * This routine enables or disables the hardware cursor. - * - * WARNING: The cursor start offset must be set by setting the cursor - * position before calling this routine to assure that memory reads do not - * go past the end of graphics memory (this can hang GXm). - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_cursor_enable(int enable) -#else -void -gfx_set_cursor_enable(int enable) -#endif -{ - unsigned long unlock, gcfg; - - /* SET OR CLEAR CURSOR ENABLE BIT */ - - unlock = READ_REG32(DC3_UNLOCK); - gcfg = READ_REG32(DC3_GENERAL_CFG); - if (enable) - gcfg |= DC3_GCFG_CURE; - else - gcfg &= ~(DC3_GCFG_CURE); - - /* WRITE NEW REGISTER VALUE */ - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - WRITE_REG32(DC3_UNLOCK, unlock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_cursor_colors - * - * This routine sets the colors of the hardware cursor. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor) -#else -void -gfx_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor) -#endif -{ - /* SET CURSOR COLORS */ - - WRITE_REG32(DC3_PAL_ADDRESS, 0x100); - WRITE_REG32(DC3_PAL_DATA, bkcolor); - WRITE_REG32(DC3_PAL_DATA, fgcolor); -} - -/*--------------------------------------------------------------------------- - * gfx_set_cursor_position - * - * This routine sets the position of the hardware cusror. The starting - * offset of the cursor buffer must be specified so that the routine can - * properly clip scanlines if the cursor is off the top of the screen. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_cursor_position(unsigned long memoffset, - unsigned short xpos, unsigned short ypos, - unsigned short xhotspot, unsigned short yhotspot) -#else -void -gfx_set_cursor_position(unsigned long memoffset, - unsigned short xpos, unsigned short ypos, - unsigned short xhotspot, unsigned short yhotspot) -#endif -{ - unsigned long unlock; - - short x = (short)xpos - (short)xhotspot; - short y = (short)ypos - (short)yhotspot; - short xoffset = 0; - short yoffset = 0; - - if (x < -63) - return; - if (y < -63) - return; - - if (PanelEnable) { - if ((ModeWidth > PanelWidth) || (ModeHeight > PanelHeight)) { - gfx_enable_panning(xpos, ypos); - x = x - (unsigned short)panelLeft; - y = y - (unsigned short)panelTop; - } - } - - /* ADJUST OFFSETS */ - /* Cursor movement and panning work as follows: The cursor position */ - /* refers to where the hotspot of the cursor is located. However, for */ - /* non-zero hotspots, the cursor buffer actually begins before the */ - /* specified position. */ - - if (x < 0) { - xoffset = -x; - x = 0; - } - if (y < 0) { - yoffset = -y; - y = 0; - } - memoffset += (unsigned long)yoffset << 4; - - /* SET CURSOR POSITION */ - - unlock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_CURS_ST_OFFSET, memoffset); - WRITE_REG32(DC3_CURSOR_X, (unsigned long)x | - (((unsigned long)xoffset) << 11)); - WRITE_REG32(DC3_CURSOR_Y, (unsigned long)y | - (((unsigned long)yoffset) << 11)); - WRITE_REG32(DC3_UNLOCK, unlock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_cursor_shape32 - * - * This routine loads 32x32 cursor data into the cursor buffer in graphics - * memory. - * As the Castle cursor is actually 64x64, we must pad the outside of the - * cursor data with transparent pixels. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_cursor_shape32(unsigned long memoffset, - unsigned long *andmask, unsigned long *xormask) -#else -void -gfx_set_cursor_shape32(unsigned long memoffset, - unsigned long *andmask, unsigned long *xormask) -#endif -{ - int i; - - for (i = 0; i < 32; i++) { - /* EVEN QWORDS CONTAIN THE AND MASK */ - - WRITE_FB32(memoffset, 0xFFFFFFFF); - WRITE_FB32(memoffset + 4, andmask[i]); - - /* ODD QWORDS CONTAIN THE XOR MASK */ - - WRITE_FB32(memoffset + 8, 0x00000000); - WRITE_FB32(memoffset + 12, xormask[i]); - - memoffset += 16; - } - - /* FILL THE LOWER HALF OF THE BUFFER WITH TRANSPARENT PIXELS */ - - for (i = 0; i < 32; i++) { - WRITE_FB32(memoffset, 0xFFFFFFFF); - WRITE_FB32(memoffset + 4, 0xFFFFFFFF); - WRITE_FB32(memoffset + 8, 0x00000000); - WRITE_FB32(memoffset + 12, 0x00000000); - - memoffset += 16; - } -} - -/*--------------------------------------------------------------------------- - * gfx_set_cursor_shape64 - * - * This routine loads 64x64 cursor data into the cursor buffer in graphics - * memory. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_cursor_shape64(unsigned long memoffset, - unsigned long *andmask, unsigned long *xormask) -#else -void -gfx_set_cursor_shape64(unsigned long memoffset, - unsigned long *andmask, unsigned long *xormask) -#endif -{ - int i; - - for (i = 0; i < 128; i += 2) { - /* EVEN QWORDS CONTAIN THE AND MASK */ - /* We invert the dwords to prevent the calling */ - /* application from having to think in terms of Qwords. */ - /* The hardware data order is actually 63:0, or 31:0 of */ - /* the second dword followed by 31:0 of the first dword. */ - - WRITE_FB32(memoffset, andmask[i + 1]); - WRITE_FB32(memoffset + 4, andmask[i]); - - /* ODD QWORDS CONTAIN THE XOR MASK */ - - WRITE_FB32(memoffset + 8, xormask[i + 1]); - WRITE_FB32(memoffset + 12, xormask[i]); - - memoffset += 16; - } -} - -/*--------------------------------------------------------------------------- - * gu3_enable_compression - * - * This is a private routine to this module (not exposed in the Durango API). - * It enables display compression. - *--------------------------------------------------------------------------- - */ -void -gu3_enable_compression(void) -{ - unsigned long unlock, gcfg, temp; - - /* DO NOT ENABLE IF START ADDRESS IS NOT ZERO */ - - if (READ_REG32(DC3_FB_ST_OFFSET) & 0x0FFFFFFF) - return; - - /* SET GLOBAL INDICATOR */ - - gfx_compression_active = 1; - - /* CLEAR DIRTY/VALID BITS IN MEMORY CONTROLLER */ - /* Software is required to do this before enabling compression. */ - /* Don't want controller to think that old lines are still valid. */ - /* Writing a 1 to bit 0 of the DV Control register will force the */ - /* hardware to clear all the valid bits. */ - - unlock = READ_REG32(DC3_UNLOCK); - temp = READ_REG32(DC3_DV_CTL); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_DV_CTL, temp | 0x00000001); - - /* TURN ON COMPRESSION CONTROL BITS */ - - gcfg = READ_REG32(DC3_GENERAL_CFG); - gcfg |= DC3_GCFG_CMPE | DC3_GCFG_DECE; - - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - WRITE_REG32(DC3_UNLOCK, unlock); -} - -/*--------------------------------------------------------------------------- - * gu3_disable_compression - * - * This is a private routine to this module (not exposed in the Durango API). - * It disables display compression. - *--------------------------------------------------------------------------- - */ -void -gu3_disable_compression(void) -{ - unsigned long unlock, gcfg; - - /* SET GLOBAL INDICATOR */ - - gfx_compression_active = 0; - - /* TURN OFF COMPRESSION CONTROL BITS */ - - unlock = READ_REG32(DC3_UNLOCK); - gcfg = READ_REG32(DC3_GENERAL_CFG); - gcfg &= ~(DC3_GCFG_CMPE | DC3_GCFG_DECE); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - WRITE_REG32(DC3_UNLOCK, unlock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_compression_enable - * - * This routine enables or disables display compression. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_compression_enable(int enable) -#else -int -gfx_set_compression_enable(int enable) -#endif -{ - /* SET GLOBAL VARIABLE FOR INDENDED STATE */ - /* Compression can only be enabled for non-zero start address values. */ - /* Keep state to enable compression on start address changes. */ - - gfx_compression_enabled = enable; - if (enable) - gu3_enable_compression(); - else - gu3_disable_compression(); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_compression_offset - * - * This routine sets the base offset for the compression buffer. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_compression_offset(unsigned long offset) -#else -int -gfx_set_compression_offset(unsigned long offset) -#endif -{ - unsigned long lock; - - /* MUST BE 16-BYTE ALIGNED FOR CASTLE */ - - if (offset & 0x0F) - return (1); - - /* SET REGISTER VALUE */ - - lock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_CB_ST_OFFSET, offset & 0x0FFFFFFF); - WRITE_REG32(DC3_UNLOCK, lock); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_compression_pitch - * - * This routine sets the pitch, in bytes, of the compression buffer. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_compression_pitch(unsigned short pitch) -#else -int -gfx_set_compression_pitch(unsigned short pitch) -#endif -{ - unsigned long lock, line_delta; - - lock = READ_REG32(DC3_UNLOCK); - - /* SET REGISTER VALUE */ - - line_delta = READ_REG32(DC3_GFX_PITCH) & 0x0000FFFF; - line_delta |= (((unsigned long)pitch << 13) & 0xFFFF0000); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GFX_PITCH, line_delta); - WRITE_REG32(DC3_UNLOCK, lock); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_compression_size - * - * This routine sets the line size of the compression buffer, which is the - * maximum number of bytes allowed to store a compressed line. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_compression_size(unsigned short size) -#else -int -gfx_set_compression_size(unsigned short size) -#endif -{ - unsigned long lock, buf_size; - - /* SUBTRACT 32 FROM SIZE */ - /* The display controller will actually write */ - /* 4 extra QWords. So, if we assume that "size" */ - /* refers to the allocated size, we must subtract */ - /* 32 bytes. */ - - size -= 32; - - /* SET REGISTER VALUE */ - - lock = READ_REG32(DC3_UNLOCK); - buf_size = READ_REG32(DC3_LINE_SIZE) & ~DC3_LINE_SIZE_CBLS_MASK; - buf_size |= - ((((unsigned long)size >> 3) + 1) & 0x7F) << DC3_LINE_SIZE_CB_SHIFT; - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_LINE_SIZE, buf_size); - WRITE_REG32(DC3_UNLOCK, lock); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_color_key (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_color_key". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_color_key(unsigned long key, unsigned long mask, - int enable) -#else -void -gfx_set_display_video_color_key(unsigned long key, unsigned long mask, - int enable) -#endif -{ - unsigned long colorkey = 0; - unsigned long lock; - - if (enable) - colorkey = (key & 0xFFFFFF) | DC3_CLR_KEY_ENABLE; - - lock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - - WRITE_REG32(DC3_COLOR_KEY, colorkey); - WRITE_REG32(DC3_COLOR_MASK, (mask & 0xFFFFFF)); - - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_format (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_format". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_format(unsigned long format) -#else -void -gfx_set_display_video_format(unsigned long format) -#endif -{ - unsigned long gcfg, lock; - - lock = READ_REG32(DC3_UNLOCK); - gcfg = READ_REG32(DC3_GENERAL_CFG); - - switch (format) { - case VIDEO_FORMAT_Y0Y1Y2Y3: - case VIDEO_FORMAT_Y3Y2Y1Y0: - case VIDEO_FORMAT_Y1Y0Y3Y2: - case VIDEO_FORMAT_Y1Y2Y3Y0: - gcfg |= DC3_GCFG_YUVM; - break; - - default: - gcfg &= ~DC3_GCFG_YUVM; - break; - } - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_enable (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_enable". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_enable(int enable) -#else -void -gfx_set_display_video_enable(int enable) -#endif -{ - unsigned long lock, gcfg, dcfg; - - /* READ CURRENT VALUES */ - - lock = READ_REG32(DC3_UNLOCK); - gcfg = READ_REG32(DC3_GENERAL_CFG); - dcfg = READ_REG32(DC3_DISPLAY_CFG); - - /* SET OR CLEAR VIDEO ENABLE IN GENERAL_CFG */ - - if (enable) - gcfg |= DC3_GCFG_VIDE; - else - gcfg &= ~DC3_GCFG_VIDE; - - /* WRITE REGISTER */ - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_GENERAL_CFG, gcfg); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_size (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_size". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_size(unsigned short width, unsigned short height) -#else -void -gfx_set_display_video_size(unsigned short width, unsigned short height) -#endif -{ - unsigned long lock, value, yuv_420; - - /* READ CURRENT VALUES */ - - lock = READ_REG32(DC3_UNLOCK); - value = READ_REG32(DC3_LINE_SIZE) & ~DC3_LINE_SIZE_VLS_MASK; - yuv_420 = READ_REG32(DC3_GENERAL_CFG) & DC3_GCFG_YUVM; - - /* LINE WIDTH IS 1/4 FOR 4:2:0 VIDEO */ - /* All data must be 32-byte aligned. */ - - if (yuv_420) { - width >>= 1; - width = (width + 7) & 0xFFF8; - } else { - width <<= 1; - width = (width + 31) & 0xFFE0; - } - - /* ONLY THE LINE SIZE IS PROGRAMMED IN THE DISPLAY CONTROLLER */ - /* Shift by three less than the bit position to effect a divide by 8 */ - - value |= - ((unsigned long)width << (DC3_LINE_SIZE_VB_SHIFT - - 3)) & DC3_LINE_SIZE_VLS_MASK; - - /* WRITE THE REGISTER */ - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_LINE_SIZE, value); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_offset (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_offset". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_offset(unsigned long offset) -#else -void -gfx_set_display_video_offset(unsigned long offset) -#endif -{ - unsigned long lock; - - lock = READ_REG32(DC3_UNLOCK); - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - offset &= 0x0FFFFFF0; - WRITE_REG32(DC3_VID_Y_ST_OFFSET, offset); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_yuv_offsets (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by gfx_set_video_yuv_offsets. It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_yuv_offsets(unsigned long yoffset, - unsigned long uoffset, unsigned long voffset) -#else -void -gfx_set_display_video_yuv_offsets(unsigned long yoffset, - unsigned long uoffset, unsigned long voffset) -#endif -{ - unsigned long lock; - - lock = READ_REG32(DC3_UNLOCK); - - yoffset &= 0x0FFFFFF0; - uoffset &= 0x0FFFFFF8; - voffset &= 0x0FFFFFF8; - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_VID_Y_ST_OFFSET, yoffset); - WRITE_REG32(DC3_VID_U_ST_OFFSET, uoffset); - WRITE_REG32(DC3_VID_V_ST_OFFSET, voffset); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_yuv_pitch (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by gfx_set_video_yuv_pitch. It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_set_display_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) -#else -void -gfx_set_display_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) -#endif -{ - unsigned long lock, pitch; - - lock = READ_REG32(DC3_UNLOCK); - - pitch = ((uvpitch << 13) & 0xFFFF0000) | ((ypitch >> 3) & 0xFFFF); - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_VID_YUV_PITCH, pitch); - WRITE_REG32(DC3_UNLOCK, lock); -} - -/*--------------------------------------------------------------------------- - * gfx_test_timing_active - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_test_timing_active(void) -#else -int -gfx_test_timing_active(void) -#endif -{ - if (READ_REG32(DC3_DISPLAY_CFG) & DC3_DCFG_TGEN) - return (1); - else - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_test_vertical_active - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_test_vertical_active(void) -#else -int -gfx_test_vertical_active(void) -#endif -{ - if (READ_REG32(DC3_LINE_CNT_STATUS) & DC3_LNCNT_VNA) - return (0); - - return (1); -} - -/*--------------------------------------------------------------------------- - * gfx_wait_vertical_blank - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_wait_vertical_blank(void) -#else -int -gfx_wait_vertical_blank(void) -#endif -{ - if (gfx_test_timing_active()) { - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - } - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_enable_panning - * - * This routine enables the panning when the Mode is bigger than the panel - * size. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_enable_panning(int x, int y) -#else -void -gfx_enable_panning(int x, int y) -#endif -{ - unsigned long modeBytesPerPixel; - unsigned long modeBytesPerScanline = 0; - unsigned long startAddress = 0; - - modeBytesPerPixel = (gbpp + 7) / 8; - modeBytesPerScanline = (READ_REG32(DC3_GFX_PITCH) & 0x0000FFFF) << 3; - - /* TEST FOR NO-WORK */ - - if (x >= DeltaX && x < ((int)PanelWidth + DeltaX) && - y >= DeltaY && y < ((int)PanelHeight + DeltaY)) - return; - - /* ADJUST PANNING VARIABLES WHEN CURSOR EXCEEDS BOUNDARY */ - /* Test the boundary conditions for each coordinate and update */ - /* all variables and the starting offset accordingly. */ - - if (x < DeltaX) - DeltaX = x; - - else if (x >= (DeltaX + (int)PanelWidth)) - DeltaX = x - (int)PanelWidth + 1; - - if (y < DeltaY) - DeltaY = y; - - else if (y >= (DeltaY + (int)PanelHeight)) - DeltaY = y - (int)PanelHeight + 1; - - /* CALCULATE THE START OFFSET */ - - startAddress = - (DeltaX * modeBytesPerPixel) + (DeltaY * modeBytesPerScanline); - - gfx_set_display_offset(startAddress); - - /* SET PANEL COORDINATES */ - /* Panel's x position must be DWORD aligned */ - - panelTop = DeltaY; - panelLeft = DeltaX * modeBytesPerPixel; - - if (panelLeft & 3) - panelLeft = (panelLeft & 0xFFFFFFFC) + 4; - - panelLeft /= modeBytesPerPixel; -} - -/*--------------------------------------------------------------------------- - * gfx_set_fixed_timings - *--------------------------------------------------------------------------- - */ - -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_fixed_timings(int panelResX, int panelResY, unsigned short width, - unsigned short height, unsigned short bpp) -#else -int -gfx_set_fixed_timings(int panelResX, int panelResY, unsigned short width, - unsigned short height, unsigned short bpp) -#endif -{ - unsigned int mode; - - ModeWidth = width; - ModeHeight = height; - PanelWidth = (unsigned short)panelResX; - PanelHeight = (unsigned short)panelResY; - PanelEnable = 1; - - /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ - for (mode = 0; mode < NUM_FIXED_TIMINGS_MODES; mode++) { - if ((FixedParams[mode].xres == width) && - (FixedParams[mode].yres == height) && - (FixedParams[mode].panelresx == panelResX) && - (FixedParams[mode].panelresy == panelResY)) { - - /* SET THE 92xx FOR THE SELECTED MODE */ - FIXEDTIMINGS *fmode = &FixedParams[mode]; - - gfx_set_display_timings(bpp, 3, fmode->hactive, - fmode->hblankstart, fmode->hsyncstart, fmode->hsyncend, - fmode->hblankend, fmode->htotal, fmode->vactive, - fmode->vblankstart, fmode->vsyncstart, fmode->vsyncend, - fmode->vblankend, fmode->vtotal, fmode->frequency); - - return (1); - } /* end if() */ - } /* end for() */ - - return (-1); -} - -/*--------------------------------------------------------------------------- - * gfx_set_panel_present - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_set_panel_present(int panelResX, int panelResY, unsigned short width, - unsigned short height, unsigned short bpp) -#else -int -gfx_set_panel_present(int panelResX, int panelResY, unsigned short width, - unsigned short height, unsigned short bpp) -#endif -{ - /* SET VALID BPP */ - /* 16BPP is the default. */ - - if (bpp != 8 && bpp != 12 && bpp != 15 && bpp != 16 && bpp != 32) - bpp = 16; - - /* RECORD PANEL PARAMETERS */ - /* This routine does not touch any panel timings. It is used when custom - * panel settings are set up in advance by the BIOS or an application, - * but the application still requires access to other panel functionality - * provided by Durango (i.e. panning). - * */ - ModeWidth = width; - ModeHeight = height; - PanelWidth = (unsigned short)panelResX; - PanelHeight = (unsigned short)panelResY; - PanelEnable = 1; - gbpp = bpp; - - /* PROGRAM THE BPP IN THE DISPLAY CONTROLLER */ - - gfx_set_display_bpp(bpp); - - return (GFX_STATUS_OK); -} - -/* THE FOLLOWING READ ROUTINES ARE ALWAYS INCLUDED: */ - -/*--------------------------------------------------------------------------- - * gfx_get_display_pitch - * - * This routine returns the current pitch of the frame buffer, in bytes. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_display_pitch(void) -#else -unsigned short -gfx_get_display_pitch(void) -#endif -{ - return ((unsigned short)(READ_REG32(DC3_GFX_PITCH) & 0x0000FFFF) << 3); -} - -/*---------------------------------------------------------------------------- - * gfx_mode_frequency_supported - * - * This routine examines if the requested mode with pixel frequency is - * supported. - * - * Returns >0 if successful , <0 if freq. could not be found and matched. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_mode_frequency_supported(int xres, int yres, int bpp, - unsigned long frequency) -#else -int -gfx_mode_frequency_supported(int xres, int yres, int bpp, - unsigned long frequency) -#endif -{ - unsigned int index; - unsigned long value; - unsigned long bpp_flag = 0; - - gfx_mode_bpp_conversion_def(bpp) - - for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { - if ((DisplayParams[index].hactive == (unsigned int)xres) && - (DisplayParams[index].vactive == (unsigned int)yres) && - (DisplayParams[index].flags & bpp_flag) && - (DisplayParams[index].frequency == frequency)) { - int hz = 0; - - value = DisplayParams[index].flags; - - if (value & GFX_MODE_56HZ) - hz = 56; - else if (value & GFX_MODE_60HZ) - hz = 60; - else if (value & GFX_MODE_70HZ) - hz = 70; - else if (value & GFX_MODE_72HZ) - hz = 72; - else if (value & GFX_MODE_75HZ) - hz = 75; - else if (value & GFX_MODE_85HZ) - hz = 85; - else if (value & GFX_MODE_90HZ) - hz = 90; - else if (value & GFX_MODE_100HZ) - hz = 100; - return (hz); - } - } - - return (-1); -} - -/*---------------------------------------------------------------------------- - * gfx_refreshrate_from_frequency - * - * This routine maps the frequency to close match refresh rate - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, - unsigned long frequency) -#else -int -gfx_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, - unsigned long frequency) -#endif -{ - unsigned int index, closematch = 0; - unsigned long value; - unsigned long bpp_flag = 0; - long min, diff; - - *hz = 60; - - gfx_mode_bpp_conversion_def(bpp) - - /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ - /* Search the table for the closest frequency (16.16 format). */ - min = 0x7fffffff; - for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { - if ((DisplayParams[index].htotal == (unsigned int)xres) && - (DisplayParams[index].vtotal == (unsigned int)yres) && - (DisplayParams[index].flags & bpp_flag)) { - diff = (long)frequency - (long)DisplayParams[index].frequency; - if (diff < 0) - diff = -diff; - - if (diff < min) { - min = diff; - closematch = index; - } - } - } - - value = DisplayParams[closematch].flags; - - if (value & GFX_MODE_56HZ) - *hz = 56; - else if (value & GFX_MODE_60HZ) - *hz = 60; - else if (value & GFX_MODE_70HZ) - *hz = 70; - else if (value & GFX_MODE_72HZ) - *hz = 72; - else if (value & GFX_MODE_75HZ) - *hz = 75; - else if (value & GFX_MODE_85HZ) - *hz = 85; - else if (value & GFX_MODE_90HZ) - *hz = 90; - else if (value & GFX_MODE_100HZ) - *hz = 100; - - return (1); -} - -/*---------------------------------------------------------------------------- - * gfx_refreshrate_from_mode - * - * This routine is identical to the gfx_get_refreshrate_from_frequency, - * except that the active timing values are compared instead of the total - * values. Some modes (such as 70Hz and 72Hz) may be confused in this routine - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, - unsigned long frequency) -#else -int -gfx_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, - unsigned long frequency) -#endif -{ - unsigned int index, closematch = 0; - unsigned long value; - unsigned long bpp_flag = 0; - long min, diff; - - *hz = 60; - - gfx_mode_bpp_conversion_def(bpp) - - /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ - /* Search the table for the closest frequency (16.16 format). */ - min = 0x7fffffff; - for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { - if ((DisplayParams[index].hactive == (unsigned int)xres) && - (DisplayParams[index].vactive == (unsigned int)yres) && - (DisplayParams[index].flags & bpp_flag)) { - diff = (long)frequency - (long)DisplayParams[index].frequency; - if (diff < 0) - diff = -diff; - - if (diff < min) { - min = diff; - closematch = index; - } - } - } - - value = DisplayParams[closematch].flags; - - if (value & GFX_MODE_56HZ) - *hz = 56; - else if (value & GFX_MODE_60HZ) - *hz = 60; - else if (value & GFX_MODE_70HZ) - *hz = 70; - else if (value & GFX_MODE_72HZ) - *hz = 72; - else if (value & GFX_MODE_75HZ) - *hz = 75; - else if (value & GFX_MODE_85HZ) - *hz = 85; - else if (value & GFX_MODE_90HZ) - *hz = 90; - else if (value & GFX_MODE_100HZ) - *hz = 100; - - return (1); -} - -/*---------------------------------------------------------------------------- - * gfx_get_frequency_from_refreshrate - * - * This routine maps the refresh rate to the closest matching PLL frequency. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, - int *frequency) -#else -int -gfx_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, - int *frequency) -#endif -{ - unsigned int index; - int retval = -1; - unsigned long hz_flag = 0; - unsigned long bpp_flag = 0; - - *frequency = 0; - - gfx_mode_hz_conversion gfx_mode_bpp_conversion_def(bpp) - - /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ - /* Search the table for the closest frequency (16.16 format). */ - for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { - if ((DisplayParams[index].hactive == (unsigned short)xres) && - (DisplayParams[index].vactive == (unsigned short)yres) && - (DisplayParams[index].flags & bpp_flag) && - (DisplayParams[index].flags & hz_flag)) { - *frequency = (int)DisplayParams[index].frequency; - retval = 1; - } - } - return retval; -} - -/*--------------------------------------------------------------------------- - * gfx_get_max_supported_pixel_clock - * - * This routine returns the maximum recommended speed for the pixel clock. The - * return value is an integer of the format xxxyyy, where xxx.yyy is the - * maximum floating point pixel clock speed. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_max_supported_pixel_clock(void) -#else -unsigned long -gfx_get_max_supported_pixel_clock(void) -#endif -{ - return 229500; -} - -/*---------------------------------------------------------------------------- - * gfx_get_display_mode - * - * This routine gets the specified display mode. - * - * Returns >0 if successful and mode returned, <0 if mode could not be found. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_display_mode(int *xres, int *yres, int *bpp, int *hz) -#else -int -gfx_get_display_mode(int *xres, int *yres, int *bpp, int *hz) -#endif -{ - unsigned int mode = 0; - unsigned long pll_freq = 0, bpp_flag = 0; - - *xres = gfx_get_hactive(); - *yres = gfx_get_vactive(); - *bpp = gfx_get_display_bpp(); - pll_freq = gfx_get_clock_frequency(); - - /* SET BPP FLAGS TO LIMIT MODE SELECTION */ - gfx_mode_bpp_conversion_def(bpp) - - for (mode = 0; mode < NUM_RC_DISPLAY_MODES; mode++) { - if ((DisplayParams[mode].hactive == (unsigned int)*xres) && - (DisplayParams[mode].vactive == (unsigned int)*yres) && - (DisplayParams[mode].frequency == pll_freq) && - (DisplayParams[mode].flags & bpp_flag)) { - - pll_freq = DisplayParams[mode].flags; - - if (pll_freq & GFX_MODE_56HZ) - *hz = 56; - else if (pll_freq & GFX_MODE_60HZ) - *hz = 60; - else if (pll_freq & GFX_MODE_70HZ) - *hz = 70; - else if (pll_freq & GFX_MODE_72HZ) - *hz = 72; - else if (pll_freq & GFX_MODE_75HZ) - *hz = 75; - else if (pll_freq & GFX_MODE_85HZ) - *hz = 85; - else if (pll_freq & GFX_MODE_90HZ) - *hz = 90; - else if (pll_freq & GFX_MODE_100HZ) - *hz = 100; - - return (1); - } - } - return (-1); -} - -/*---------------------------------------------------------------------------- - * GFX_GET_DISPLAY_DETAILS - * - * This routine gets the specified display mode. - * - * Returns 1 if successful, 0 if mode could not be get. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_display_details(unsigned int mode, int *xres, int *yres, int *hz) -#else -int -gfx_get_display_details(unsigned int mode, int *xres, int *yres, int *hz) -#endif -{ - if (mode < NUM_RC_DISPLAY_MODES) { - if (DisplayParams[mode].flags & GFX_MODE_56HZ) - *hz = 56; - else if (DisplayParams[mode].flags & GFX_MODE_60HZ) - *hz = 60; - else if (DisplayParams[mode].flags & GFX_MODE_70HZ) - *hz = 70; - else if (DisplayParams[mode].flags & GFX_MODE_72HZ) - *hz = 72; - else if (DisplayParams[mode].flags & GFX_MODE_75HZ) - *hz = 75; - else if (DisplayParams[mode].flags & GFX_MODE_85HZ) - *hz = 85; - else if (DisplayParams[mode].flags & GFX_MODE_90HZ) - *hz = 90; - else if (DisplayParams[mode].flags & GFX_MODE_100HZ) - *hz = 100; - - *xres = DisplayParams[mode].hactive; - *yres = DisplayParams[mode].vactive; - - if (DisplayParams[mode].flags & GFX_MODE_PIXEL_DOUBLE) - *xres >>= 1; - if (DisplayParams[mode].flags & GFX_MODE_LINE_DOUBLE) - *yres >>= 1; - - return (1); - } - return (0); -} - -/*---------------------------------------------------------------------------- - * GFX_GET_DISPLAY_MODE_COUNT - * - * This routine gets the number of available display modes. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_display_mode_count(void) -#else -int -gfx_get_display_mode_count(void) -#endif -{ - return (NUM_RC_DISPLAY_MODES); -} - -/*---------------------------------------------------------------------------- - * gfx_get_frame_buffer_line_size - * - * Returns the current frame buffer line size, in bytes - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_frame_buffer_line_size(void) -#else -unsigned long -gfx_get_frame_buffer_line_size(void) -#endif -{ - return ((READ_REG32(DC3_LINE_SIZE) & 0x3FF) << 3); -} - -/*--------------------------------------------------------------------------- - * gfx_get_hactive - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_hactive(void) -#else -unsigned short -gfx_get_hactive(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_H_ACTIVE_TIMING) & 0x0FF8) + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_hsync_start - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_hsync_start(void) -#else -unsigned short -gfx_get_hsync_start(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_H_SYNC_TIMING) & 0x0FF8) + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_hsync_end - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_hsync_end(void) -#else -unsigned short -gfx_get_hsync_end(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_H_SYNC_TIMING) >> 16) & 0x0FF8) - + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_htotal - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_htotal(void) -#else -unsigned short -gfx_get_htotal(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_H_ACTIVE_TIMING) >> 16) & - 0x0FF8) + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vactive - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vactive(void) -#else -unsigned short -gfx_get_vactive(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_V_ACTIVE_TIMING) & 0x07FF) + 1)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vsync_end - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vsync_end(void) -#else -unsigned short -gfx_get_vsync_end(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_V_SYNC_TIMING) >> 16) & 0x07FF) - + 1)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vtotal - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vtotal(void) -#else -unsigned short -gfx_get_vtotal(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_V_ACTIVE_TIMING) >> 16) & - 0x07FF) + 1)); -} - -/*---------------------------------------------------------------------------- - * gfx_get_display_bpp - * - * This routine returns the current color depth of the active display. - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_display_bpp(void) -#else -unsigned short -gfx_get_display_bpp(void) -#endif -{ - unsigned long dcfg = READ_REG32(DC3_DISPLAY_CFG); - - switch ((dcfg & DC3_DCFG_DISP_MODE_MASK) >> 8) { - case 0: - return (8); - case 2: - return (32); - - case 1: - - switch ((dcfg & DC3_DCFG_16BPP_MODE_MASK) >> 10) { - case 0: - return (16); - case 1: - return (15); - case 2: - return (12); - default: - return (0); - } - } - - /* INVALID SETTING */ - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vline - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vline(void) -#else -unsigned short -gfx_get_vline(void) -#endif -{ - unsigned long current_scan_line; - - /* Read similar value twice to ensure that the value is not transitioning - * */ - - do - current_scan_line = - (READ_REG32(DC3_LINE_CNT_STATUS) & DC3_LNCNT_V_LINE_CNT); - while (current_scan_line != - (READ_REG32(DC3_LINE_CNT_STATUS) & DC3_LNCNT_V_LINE_CNT)); - - return ((unsigned short)(current_scan_line >> 16)); -} - -/*---------------------------------------------------------------------------- - * gfx_get_display_offset - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_display_offset(void) -#else -unsigned long -gfx_get_display_offset(void) -#endif -{ - return (READ_REG32(DC3_FB_ST_OFFSET) & 0x0FFFFFFF); -} - -/*---------------------------------------------------------------------------- - * gfx_get_cursor_offset - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_cursor_offset(void) -#else -unsigned long -gfx_get_cursor_offset(void) -#endif -{ - return (READ_REG32(DC3_CURS_ST_OFFSET) & 0x0FFFFFFF); -} - -#if GFX_READ_ROUTINES - -/*************************************************************/ -/* READ ROUTINES | INCLUDED FOR DIAGNOSTIC PURPOSES ONLY */ -/*************************************************************/ - -/*--------------------------------------------------------------------------- - * gfx_get_hblank_start - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_hblank_start(void) -#else -unsigned short -gfx_get_hblank_start(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_H_BLANK_TIMING) & 0x0FF8) + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_hblank_end - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_hblank_end(void) -#else -unsigned short -gfx_get_hblank_end(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_H_BLANK_TIMING) >> 16) & 0x0FF8) - + 8)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vblank_start - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vblank_start(void) -#else -unsigned short -gfx_get_vblank_start(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_V_BLANK_TIMING) & 0x07FF) + 1)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vsync_start - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vsync_start(void) -#else -unsigned short -gfx_get_vsync_start(void) -#endif -{ - return ((unsigned short)((READ_REG32(DC3_V_SYNC_TIMING) & 0x07FF) + 1)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_vblank_end - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_vblank_end(void) -#else -unsigned short -gfx_get_vblank_end(void) -#endif -{ - return ((unsigned short)(((READ_REG32(DC3_V_BLANK_TIMING) >> 16) & 0x07FF) - + 1)); -} - -/*---------------------------------------------------------------------------- - * gfx_get_display_palette_entry - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_display_palette_entry(unsigned long index, unsigned long *palette) -#else -int -gfx_get_display_palette_entry(unsigned long index, unsigned long *palette) -#endif -{ - if (index > 0xFF) - return GFX_STATUS_BAD_PARAMETER; - - WRITE_REG32(DC3_PAL_ADDRESS, index); - *palette = READ_REG32(DC3_PAL_DATA); - - return 0; -} - -/*---------------------------------------------------------------------------- - * gfx_get_display_palette - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_get_display_palette(unsigned long *palette) -#else -void -gfx_get_display_palette(unsigned long *palette) -#endif -{ - unsigned long i; - - WRITE_REG32(DC3_PAL_ADDRESS, 0); - for (i = 0; i < 256; i++) { - palette[i] = READ_REG32(DC3_PAL_DATA); - } -} - -/*---------------------------------------------------------------------------- - * gfx_get_cursor_enable - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_cursor_enable(void) -#else -unsigned long -gfx_get_cursor_enable(void) -#endif -{ - return (READ_REG32(DC3_GENERAL_CFG) & DC3_GCFG_CURE); -} - -/*---------------------------------------------------------------------------- - * gfx_get_cursor_position - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_cursor_position(void) -#else -unsigned long -gfx_get_cursor_position(void) -#endif -{ - return ((READ_REG32(DC3_CURSOR_X) & 0x07FF) | - ((READ_REG32(DC3_CURSOR_Y) << 16) & 0x07FF0000)); -} - -/*---------------------------------------------------------------------------- - * gfx_get_cursor_offset - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_cursor_clip(void) -#else -unsigned long -gfx_get_cursor_clip(void) -#endif -{ - return (((READ_REG32(DC3_CURSOR_X) >> 11) & 0x03F) | - ((READ_REG32(DC3_CURSOR_Y) << 5) & 0x3F0000)); -} - -/*---------------------------------------------------------------------------- - * gfx_get_cursor_color - *---------------------------------------------------------------------------- */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_cursor_color(int color) -#else -unsigned long -gfx_get_cursor_color(int color) -#endif -{ - if (color) { - WRITE_REG32(DC3_PAL_ADDRESS, 0x101); - } else { - WRITE_REG32(DC3_PAL_ADDRESS, 0x100); - } - return READ_REG32(DC3_PAL_DATA); -} - -/*---------------------------------------------------------------------------- - * gfx_get_compression_enable - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_compression_enable(void) -#else -int -gfx_get_compression_enable(void) -#endif -{ - if (READ_REG32(DC3_GENERAL_CFG) & DC3_GCFG_CMPE) - return (1); - - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_get_compression_offset - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_compression_offset(void) -#else -unsigned long -gfx_get_compression_offset(void) -#endif -{ - return (READ_REG32(DC3_CB_ST_OFFSET) & 0x007FFFFF); -} - -/*---------------------------------------------------------------------------- - * gfx_get_compression_pitch - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_compression_pitch(void) -#else -unsigned short -gfx_get_compression_pitch(void) -#endif -{ - unsigned short pitch; - - pitch = (unsigned short)(READ_REG32(DC3_GFX_PITCH) >> 16); - return (pitch << 3); -} - -/*---------------------------------------------------------------------------- - * gfx_get_compression_size - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned short -gu3_get_compression_size(void) -#else -unsigned short -gfx_get_compression_size(void) -#endif -{ - unsigned short size; - - size = - (unsigned short)((READ_REG32(DC3_LINE_SIZE) >> DC3_LINE_SIZE_CB_SHIFT) - & 0x7F) - 1; - return ((size << 3) + 32); -} - -/*---------------------------------------------------------------------------- - * gfx_get_valid_bit - *---------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -int -gu3_get_valid_bit(int line) -#else -int -gfx_get_valid_bit(int line) -#endif -{ - unsigned long lock; - unsigned long offset; - int valid; - - lock = READ_REG32(DC3_UNLOCK); - offset = READ_REG32(DC3_PHY_MEM_OFFSET) & 0xFF000000; - offset |= line; - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_PHY_MEM_OFFSET, offset); - WRITE_REG32(DC3_UNLOCK, lock); - valid = (int)READ_REG32(DC3_DV_ACC) & 2; - - if (valid) - return 1; - return 0; -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_offset (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_offset". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_display_video_offset(void) -#else -unsigned long -gfx_get_display_video_offset(void) -#endif -{ - return (READ_REG32(DC3_VID_Y_ST_OFFSET) & 0x0FFFFFFF); -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_yuv_offsets (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_yuv_offsets". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_get_display_video_yuv_offsets(unsigned long *yoffset, - unsigned long *uoffset, unsigned long *voffset) -#else -void -gfx_get_display_video_yuv_offsets(unsigned long *yoffset, - unsigned long *uoffset, unsigned long *voffset) -#endif -{ - *yoffset = (READ_REG32(DC3_VID_Y_ST_OFFSET) & 0x0FFFFFFF); - *uoffset = (READ_REG32(DC3_VID_U_ST_OFFSET) & 0x0FFFFFFF); - *voffset = (READ_REG32(DC3_VID_V_ST_OFFSET) & 0x0FFFFFFF); -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_yuv_pitch (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_yuv_pitch". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -void -gu3_get_display_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) -#else -void -gfx_get_display_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) -#endif -{ - unsigned long pitch = READ_REG32(DC3_VID_YUV_PITCH); - - *ypitch = ((pitch & 0xFFFF) << 3); - *uvpitch = (pitch >> 13) & 0x7FFF8; -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_size (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_size". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_display_video_size(void) -#else -unsigned long -gfx_get_display_video_size(void) -#endif -{ - /* RETURN THE LINE SIZE, AS THIS IS ALL THAT IS AVAILABLE */ - /* Shift by three less to effect a multiply by 8. */ - - return ((READ_REG32(DC3_LINE_SIZE) & DC3_LINE_SIZE_VLS_MASK) >> - (DC3_LINE_SIZE_VB_SHIFT - 3)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_color_key (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_color_key". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_display_video_color_key(void) -#else -unsigned long -gfx_get_display_video_color_key(void) -#endif -{ - return (READ_REG32(DC3_COLOR_KEY) & 0xFFFFFF); -} - -/*--------------------------------------------------------------------------- - * gfx_get_display_video_color_key_mask (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_get_video_color_key_mask". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -#if GFX_DISPLAY_DYNAMIC -unsigned long -gu3_get_display_video_color_key_mask(void) -#else -unsigned long -gfx_get_display_video_color_key_mask(void) -#endif -{ - return (READ_REG32(DC3_COLOR_MASK) & 0xFFFFFF); -} - -#endif /* GFX_READ_ROUTINES */ - -/* END OF FILE */ diff --git a/src/gfx/durango.c b/src/gfx/durango.c index 47c72d8..5f96ff1 100644 --- a/src/gfx/durango.c +++ b/src/gfx/durango.c @@ -51,13 +51,10 @@ #define GFX_DISPLAY_DYNAMIC 1 /* runtime selection */ #define GFX_DISPLAY_GU1 1 /* 1st generation display controller */ #define GFX_DISPLAY_GU2 1 /* 2nd generation display controller */ -#define GFX_DISPLAY_GU3 1 /* 3rd generation display controller */ #define GFX_INIT_DYNAMIC 1 /* runtime selection */ #define GFX_INIT_GU1 1 /* Geode family */ #define GFX_INIT_GU2 1 /* Redcloud */ -#define GFX_INIT_GU3 1 /* Castle */ - #define GFX_MSR_DYNAMIC 1 /* runtime selection */ #define GFX_MSR_REDCLOUD 1 /* Redcloud */ @@ -69,7 +66,6 @@ #define GFX_VIDEO_CS5530 1 /* support for CS5530 */ #define GFX_VIDEO_SC1200 1 /* support for SC1200 */ #define GFX_VIDEO_REDCLOUD 1 /* support for Redcloud */ -#define GFX_VIDEO_CASTLE 1 /* support for Castle */ #define GFX_VIP_DYNAMIC 1 /* runtime selection */ #define GFX_VIP_SC1200 1 /* support for SC1200 */ diff --git a/src/gfx/gfx_disp.c b/src/gfx/gfx_disp.c index 035cbab..6d32a35 100644 --- a/src/gfx/gfx_disp.c +++ b/src/gfx/gfx_disp.c @@ -856,10 +856,6 @@ FIXEDTIMINGS FixedParams[] = { #include "disp_gu2.c" #endif -#if GFX_DISPLAY_GU3 -#include "disp_gu3.c" -#endif - /*--------------------------------------------------------------------------- * gfx_reset_timing_lock * @@ -895,10 +891,6 @@ gfx_set_display_bpp(unsigned short bpp) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_set_display_bpp(bpp); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_set_display_bpp(bpp); -#endif return (retval); } @@ -921,10 +913,6 @@ gfx_is_display_mode_supported(int xres, int yres, int bpp, int hz) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_is_display_mode_supported(xres, yres, bpp, hz); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_is_display_mode_supported(xres, yres, bpp, hz); -#endif return (retval); } @@ -945,10 +933,6 @@ gfx_set_display_mode(int xres, int yres, int bpp, int hz) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_set_display_mode(xres, yres, bpp, hz); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_set_display_mode(xres, yres, bpp, hz); -#endif return (retval); } @@ -981,13 +965,6 @@ gfx_set_display_timings(unsigned short bpp, unsigned short flags, vactive, vblankstart, vsyncstart, vsyncend, vblankend, vtotal, frequency); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_set_display_timings(bpp, flags, - hactive, hblankstart, hsyncstart, hsyncend, hblankend, htotal, - vactive, vblankstart, vsyncstart, vsyncend, vblankend, vtotal, - frequency); -#endif return (retval); } @@ -1006,10 +983,6 @@ gfx_set_display_pitch(unsigned short pitch) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_pitch(pitch); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_pitch(pitch); -#endif } /*--------------------------------------------------------------------------- @@ -1027,10 +1000,6 @@ gfx_set_display_offset(unsigned long offset) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_offset(offset); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_offset(offset); -#endif } /*--------------------------------------------------------------------------- @@ -1050,10 +1019,6 @@ gfx_set_display_palette_entry(unsigned long index, unsigned long palette) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_display_palette_entry(index, palette); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_display_palette_entry(index, palette); -#endif return (status); } @@ -1074,10 +1039,6 @@ gfx_set_display_palette(unsigned long *palette) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_display_palette(palette); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_display_palette(palette); -#endif return (status); } @@ -1096,10 +1057,6 @@ gfx_set_cursor_enable(int enable) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_cursor_enable(enable); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_cursor_enable(enable); -#endif } /*--------------------------------------------------------------------------- @@ -1117,10 +1074,6 @@ gfx_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_cursor_colors(bkcolor, fgcolor); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_cursor_colors(bkcolor, fgcolor); -#endif } /*--------------------------------------------------------------------------- @@ -1140,10 +1093,6 @@ gfx_set_cursor_position(unsigned long memoffset, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_cursor_position(memoffset, xpos, ypos, xhotspot, yhotspot); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_cursor_position(memoffset, xpos, ypos, xhotspot, yhotspot); -#endif } /*--------------------------------------------------------------------------- @@ -1162,10 +1111,6 @@ gfx_set_cursor_shape32(unsigned long memoffset, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_cursor_shape32(memoffset, andmask, xormask); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_cursor_shape32(memoffset, andmask, xormask); -#endif } /*--------------------------------------------------------------------------- @@ -1180,10 +1125,6 @@ gfx_set_cursor_shape64(unsigned long memoffset, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_cursor_shape64(memoffset, andmask, xormask); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_cursor_shape64(memoffset, andmask, xormask); -#endif } /*--------------------------------------------------------------------------- @@ -1257,10 +1198,6 @@ gfx_set_compression_enable(int enable) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_compression_enable(enable); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_compression_enable(enable); -#endif return (status); } @@ -1281,10 +1218,6 @@ gfx_set_compression_offset(unsigned long offset) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_compression_offset(offset); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_compression_offset(offset); -#endif return (status); } @@ -1305,10 +1238,6 @@ gfx_set_compression_pitch(unsigned short pitch) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_compression_pitch(pitch); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_compression_pitch(pitch); -#endif return (status); } @@ -1329,10 +1258,6 @@ gfx_set_compression_size(unsigned short size) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_set_compression_size(size); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_set_compression_size(size); -#endif return (status); } @@ -1363,27 +1288,6 @@ gfx_set_display_video_format(unsigned long format) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_format(format); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_format(format); -#endif -} - -/*--------------------------------------------------------------------------- - * gfx_set_display_video_color_key (PRIVATE ROUTINE - NOT PART OF API) - * - * This routine is called by "gfx_set_video_color_key". It abstracts the - * version of the display controller from the video overlay routines. - *--------------------------------------------------------------------------- - */ -void -gfx_set_display_video_color_key(unsigned long key, unsigned long mask, - int enable) -{ -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_color_key(key, mask, enable); -#endif } /*--------------------------------------------------------------------------- @@ -1404,10 +1308,6 @@ gfx_set_display_video_enable(int enable) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_enable(enable); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_enable(enable); -#endif return; } @@ -1429,10 +1329,6 @@ gfx_set_display_video_size(unsigned short width, unsigned short height) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_size(width, height); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_size(width, height); -#endif } /*--------------------------------------------------------------------------- @@ -1453,10 +1349,6 @@ gfx_set_display_video_offset(unsigned long offset) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_offset(offset); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_offset(offset); -#endif } /*--------------------------------------------------------------------------- @@ -1474,10 +1366,6 @@ gfx_set_display_video_yuv_offsets(unsigned long yoffset, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_yuv_offsets(yoffset, uoffset, voffset); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_yuv_offsets(yoffset, uoffset, voffset); -#endif } /*--------------------------------------------------------------------------- @@ -1494,10 +1382,6 @@ gfx_set_display_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_set_display_video_yuv_pitch(ypitch, uvpitch); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_set_display_video_yuv_pitch(ypitch, uvpitch); -#endif } /*--------------------------------------------------------------------------- @@ -1549,10 +1433,6 @@ gfx_test_timing_active(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_test_timing_active(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_test_timing_active(); -#endif return (status); } @@ -1573,10 +1453,6 @@ gfx_test_vertical_active(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_test_vertical_active(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_test_vertical_active(); -#endif return (status); } @@ -1597,10 +1473,6 @@ gfx_wait_vertical_blank(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_wait_vertical_blank(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_wait_vertical_blank(); -#endif return (status); } @@ -1619,10 +1491,6 @@ gfx_delay_milliseconds(unsigned long milliseconds) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_delay_milliseconds(milliseconds); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_delay_milliseconds(milliseconds); -#endif } /*--------------------------------------------------------------------------- @@ -1640,10 +1508,6 @@ gfx_delay_microseconds(unsigned long microseconds) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_delay_microseconds(microseconds); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_delay_microseconds(microseconds); -#endif } /*--------------------------------------------------------------------------- @@ -1664,10 +1528,6 @@ gfx_enable_panning(int x, int y) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_enable_panning(x, y); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_enable_panning(x, y); -#endif } /*--------------------------------------------------------------------------- @@ -1710,11 +1570,6 @@ gfx_set_fixed_timings(int panelResX, int panelResY, unsigned short width, status = gu2_set_fixed_timings(panelResX, panelResY, width, height, bpp); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = - gu3_set_fixed_timings(panelResX, panelResY, width, height, bpp); -#endif return (status); } @@ -1738,11 +1593,6 @@ gfx_set_panel_present(int panelResX, int panelResY, unsigned short width, status = gu2_set_panel_present(panelResX, panelResY, width, height, bpp); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = - gu3_set_panel_present(panelResX, panelResY, width, height, bpp); -#endif return (status); } @@ -1763,10 +1613,6 @@ gfx_set_vtotal(unsigned short vtotal) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_set_vtotal(vtotal); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_set_vtotal(vtotal); -#endif return (retval); } @@ -1799,10 +1645,6 @@ gfx_mode_frequency_supported(int xres, int yres, int bpp, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) freq = gu2_mode_frequency_supported(xres, yres, bpp, frequency); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - freq = gu3_mode_frequency_supported(xres, yres, bpp, frequency); -#endif return (freq); } @@ -1822,10 +1664,6 @@ gfx_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_get_refreshrate_from_frequency(xres, yres, bpp, hz, frequency); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_get_refreshrate_from_frequency(xres, yres, bpp, hz, frequency); -#endif return (1); } @@ -1846,10 +1684,6 @@ gfx_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_get_refreshrate_from_mode(xres, yres, bpp, hz, frequency); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_get_refreshrate_from_mode(xres, yres, bpp, hz, frequency); -#endif return (1); } @@ -1876,12 +1710,6 @@ gfx_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, gu2_get_frequency_from_refreshrate(xres, yres, bpp, hz, frequency); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = - gu3_get_frequency_from_refreshrate(xres, yres, bpp, hz, - frequency); -#endif return retval; } @@ -1903,10 +1731,6 @@ gfx_get_max_supported_pixel_clock(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_get_max_supported_pixel_clock(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_get_max_supported_pixel_clock(); -#endif return (status); } @@ -1927,10 +1751,6 @@ gfx_get_display_pitch(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) pitch = gu2_get_display_pitch(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - pitch = gu3_get_display_pitch(); -#endif return (pitch); } @@ -1952,10 +1772,6 @@ gfx_get_display_mode_count(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_get_display_mode_count(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_get_display_mode_count(); -#endif return (retval); } @@ -1976,10 +1792,6 @@ gfx_get_frame_buffer_line_size(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_get_frame_buffer_line_size(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_get_frame_buffer_line_size(); -#endif return (retval); } @@ -2002,10 +1814,6 @@ gfx_get_display_mode(int *xres, int *yres, int *bpp, int *hz) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_get_display_mode(xres, yres, bpp, hz); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_get_display_mode(xres, yres, bpp, hz); -#endif return (retval); } @@ -2027,10 +1835,6 @@ gfx_get_display_details(unsigned int mode, int *xres, int *yres, int *hz) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) retval = gu2_get_display_details(mode, xres, yres, hz); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - retval = gu3_get_display_details(mode, xres, yres, hz); -#endif return (retval); } @@ -2051,10 +1855,6 @@ gfx_get_hactive(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) hactive = gu2_get_hactive(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - hactive = gu3_get_hactive(); -#endif return (hactive); } @@ -2075,10 +1875,6 @@ gfx_get_hsync_start(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) hsync_start = gu2_get_hsync_start(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - hsync_start = gu3_get_hsync_start(); -#endif return (hsync_start); } @@ -2099,10 +1895,6 @@ gfx_get_hsync_end(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) hsync_end = gu2_get_hsync_end(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - hsync_end = gu3_get_hsync_end(); -#endif return (hsync_end); } @@ -2123,10 +1915,6 @@ gfx_get_htotal(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) htotal = gu2_get_htotal(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - htotal = gu3_get_htotal(); -#endif return (htotal); } @@ -2147,10 +1935,6 @@ gfx_get_vactive(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vactive = gu2_get_vactive(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vactive = gu3_get_vactive(); -#endif return (vactive); } @@ -2171,10 +1955,6 @@ gfx_get_vsync_end(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vsync_end = gu2_get_vsync_end(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vsync_end = gu3_get_vsync_end(); -#endif return (vsync_end); } @@ -2195,10 +1975,6 @@ gfx_get_vtotal(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vtotal = gu2_get_vtotal(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vtotal = gu3_get_vtotal(); -#endif return (vtotal); } @@ -2219,10 +1995,6 @@ gfx_get_display_bpp(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) bpp = gu2_get_display_bpp(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - bpp = gu3_get_display_bpp(); -#endif return (bpp); } @@ -2243,10 +2015,6 @@ gfx_get_vline(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vline = gu2_get_vline(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vline = gu3_get_vline(); -#endif return (vline); } @@ -2267,10 +2035,6 @@ gfx_get_display_offset(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) offset = gu2_get_display_offset(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - offset = gu3_get_display_offset(); -#endif return (offset); } @@ -2291,10 +2055,6 @@ gfx_get_cursor_offset(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) base = gu2_get_cursor_offset(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - base = gu3_get_cursor_offset(); -#endif return (base); } @@ -2321,10 +2081,6 @@ gfx_get_hblank_start(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) hblank_start = gu2_get_hblank_start(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - hblank_start = gu3_get_hblank_start(); -#endif return (hblank_start); } @@ -2345,10 +2101,6 @@ gfx_get_hblank_end(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) hblank_end = gu2_get_hblank_end(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - hblank_end = gu3_get_hblank_end(); -#endif return (hblank_end); } @@ -2369,10 +2121,6 @@ gfx_get_vblank_start(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vblank_start = gu2_get_vblank_start(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vblank_start = gu3_get_vblank_start(); -#endif return (vblank_start); } @@ -2393,10 +2141,6 @@ gfx_get_vsync_start(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vsync_start = gu2_get_vsync_start(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vsync_start = gu3_get_vsync_start(); -#endif return (vsync_start); } @@ -2417,10 +2161,6 @@ gfx_get_vblank_end(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) vblank_end = gu2_get_vblank_end(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - vblank_end = gu3_get_vblank_end(); -#endif return (vblank_end); } @@ -2441,10 +2181,6 @@ gfx_get_display_palette_entry(unsigned long index, unsigned long *palette) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) status = gu2_get_display_palette_entry(index, palette); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - status = gu3_get_display_palette_entry(index, palette); -#endif return status; } @@ -2464,10 +2200,6 @@ gfx_get_display_palette(unsigned long *palette) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_get_display_palette(palette); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_get_display_palette(palette); -#endif } /*--------------------------------------------------------------------------- @@ -2487,10 +2219,6 @@ gfx_get_cursor_enable(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) enable = gu2_get_cursor_enable(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - enable = gu3_get_cursor_enable(); -#endif return (enable); } @@ -2511,10 +2239,6 @@ gfx_get_cursor_position(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) position = gu2_get_cursor_position(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - position = gu3_get_cursor_position(); -#endif return (position); } @@ -2535,10 +2259,6 @@ gfx_get_cursor_clip(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) offset = gu2_get_cursor_clip(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - offset = gu3_get_cursor_clip(); -#endif return (offset); } @@ -2559,10 +2279,6 @@ gfx_get_cursor_color(int index) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) color = gu2_get_cursor_color(index); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - color = gu3_get_cursor_color(index); -#endif return (color); } @@ -2650,10 +2366,6 @@ gfx_get_compression_enable(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) enable = gu2_get_compression_enable(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - enable = gu3_get_compression_enable(); -#endif return (enable); } @@ -2674,10 +2386,6 @@ gfx_get_compression_offset(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) offset = gu2_get_compression_offset(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - offset = gu3_get_compression_offset(); -#endif return (offset); } @@ -2698,10 +2406,6 @@ gfx_get_compression_pitch(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) pitch = gu2_get_compression_pitch(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - pitch = gu3_get_compression_pitch(); -#endif return (pitch); } @@ -2722,10 +2426,6 @@ gfx_get_compression_size(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) size = gu2_get_compression_size(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - size = gu3_get_compression_size(); -#endif return (size); } @@ -2762,10 +2462,6 @@ gfx_get_valid_bit(int line) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) valid = gu2_get_valid_bit(line); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - valid = gu3_get_valid_bit(line); -#endif return (valid); } @@ -2777,11 +2473,6 @@ unsigned long gfx_get_display_video_color_key(void) { unsigned long value = 0; - -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - value = gu3_get_display_video_color_key(); -#endif return (value); } @@ -2802,10 +2493,6 @@ gfx_get_display_video_offset(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) offset = gu2_get_display_video_offset(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - offset = gu3_get_display_video_offset(); -#endif return (offset); } @@ -2821,10 +2508,6 @@ gfx_get_display_video_yuv_offsets(unsigned long *yoffset, if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_get_display_video_yuv_offsets(yoffset, uoffset, voffset); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_get_display_video_yuv_offsets(yoffset, uoffset, voffset); -#endif } /*--------------------------------------------------------------------------- @@ -2838,10 +2521,6 @@ gfx_get_display_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) gu2_get_display_video_yuv_pitch(ypitch, uvpitch); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - gu3_get_display_video_yuv_pitch(ypitch, uvpitch); -#endif } /*--------------------------------------------------------------------------- @@ -2895,10 +2574,6 @@ gfx_get_display_video_size(void) if (gfx_display_type & GFX_DISPLAY_TYPE_GU2) size = gu2_get_display_video_size(); #endif -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - size = gu3_get_display_video_size(); -#endif return (size); } @@ -2910,16 +2585,9 @@ unsigned long gfx_get_display_video_color_key_mask(void) { unsigned long mask = 0; - -#if GFX_DISPLAY_GU3 - if (gfx_display_type & GFX_DISPLAY_TYPE_GU3) - mask = gu3_get_display_video_color_key_mask(); -#endif return (mask); } #endif /* GFX_READ_ROUTINES */ #endif /* GFX_DISPLAY_DYNAMIC */ - -/* END OF FILE */ diff --git a/src/gfx/gfx_init.c b/src/gfx/gfx_init.c index 73a8c80..469c70f 100644 --- a/src/gfx/gfx_init.c +++ b/src/gfx/gfx_init.c @@ -46,8 +46,6 @@ #define PCI_VENDOR_DEVICE_GXM 0x00011078 #define PCI_VENDOR_DEVICE_REDCLOUD 0x0028100B #define REDCLOUD_VIDEO_PCI_VENDOR_DEVICE 0x0030100B -#define PCI_VENDOR_DEVICE_CASTLE 0x20801022 -#define CASTLE_VIDEO_PCI_VENDOR_DEVICE 0x20811022 #define GXM_CONFIG_GCR 0xB8 #define GXM_CONFIG_CCR3 0xC3 @@ -78,12 +76,6 @@ ChipType gfx_detect_chip(void); #include "init_gu2.c" #endif -/* INCLUDE SUPPORT FOR THIRD GENERATION, IF SPECIFIED. */ - -#if GFX_INIT_GU3 -#include "init_gu3.c" -#endif - /* THE FOLLOWING ROUTINES ARE NEVER DYNAMIC */ /* They are used to set the variables for future dynamic */ /* function calls. */ @@ -364,8 +356,12 @@ gfx_detect_cpu(void) ((msr_value.low & 0x0F) << 16); /* MINOR */ /* READ THE CORE FREQUENCY */ + /* I can't find GX implementations that need + * this - we're trying to avoid virtual reads + * anyway, so bail on it + */ - gfx_cpu_frequency = gfx_get_core_freq(); + /* gfx_cpu_frequency = gfx_get_core_freq(); */ /* SET THE GP SCRATCH AREA */ /* Color bitmap BLTs use the last 16K of frame buffer space */ @@ -374,100 +370,7 @@ gfx_detect_cpu(void) } } } -#endif - -#if GFX_INIT_GU3 - - value = gfx_pci_config_read(0x80000800); - - if (value == PCI_VENDOR_DEVICE_CASTLE) { - Q_WORD msr_value; - int valid, i; - - /* CHECK FOR SOFT VG */ - /* If SoftVG is not present, the base addresses for all devices */ - - /* will not be allocated. Essentially, it is as if no Redcloud */ - /* video hardware is present. */ - - value = gfx_pci_config_read(0x80000900); - - if (value == CASTLE_VIDEO_PCI_VENDOR_DEVICE) { - valid = 1; - - /* BAR0 - BAR3 HOLD THE PERIPHERAL BASE ADDRESSES */ - - for (i = 0; i < 4; i++) { - value = gfx_pci_config_read(0x80000910 + (i << 2)); - if (value == 0x00000000 || value == 0xFFFFFFFF) { - valid = 0; - break; - } - } - - if (valid) { - /* REDCLOUD INTEGRATED VIDEO */ - -#if GFX_VIDEO_DYNAMIC - gfx_video_type = GFX_VIDEO_TYPE_CASTLE; -#endif - - /* CURRENTLY, ALWAYS GPIO FOR I2C ACCESS */ - -#if GFX_I2C_DYNAMIC - gfx_i2c_type = GFX_I2C_TYPE_GPIO; -#endif - - /* THIRD-GENERATION DISPLAY CONTROLLER */ - -#if GFX_DISPLAY_DYNAMIC - gfx_display_type = GFX_DISPLAY_TYPE_GU3; -#endif - - /* SECOND-GENERATION GRAPHICS UNIT */ - -#if GFX_2DACCEL_DYNAMIC - gfx_2daccel_type = GFX_2DACCEL_TYPE_GU2; -#endif - - /* THIRD-GENERATION INITIALIZATION */ -#if GFX_INIT_DYNAMIC - gfx_init_type = GFX_INIT_TYPE_GU3; -#endif - - /* MBUS MSR ACCESSES */ - -#if GFX_MSR_DYNAMIC - gfx_msr_type = GFX_MSR_TYPE_REDCLOUD; -#endif - - /* READ VERSION */ - - gfx_msr_init(); - - gfx_msr_read(RC_ID_MCP, MCP_RC_REVID, &msr_value); - - version = GFX_CPU_CASTLE | ((msr_value.low & 0xF0) << 4) | /* MAJOR */ - ((msr_value.low & 0x0F) << 16); /* MINOR */ - - /* READ THE CORE FREQUENCY */ - - gfx_cpu_frequency = gfx_get_core_freq(); - - /* SET THE GP SCRATCH AREA */ - /* Color bitmap BLTs use the last 16K of frame buffer space */ - - gfx_gx2_scratch_base = gfx_get_frame_buffer_size() - 0x4000; - - /* CAP AT 16MB */ - - if (gfx_gx2_scratch_base > 0xFFC000) - gfx_gx2_scratch_base = 0xFFC000; - } - - } - } #endif if (!version) { @@ -521,8 +424,6 @@ gfx_detect_video(void) version = GFX_VID_SC1200; else if ((gfx_cpu_version & 0xFF) == GFX_CPU_REDCLOUD) version = GFX_VID_REDCLOUD; - else if ((gfx_cpu_version & 0xFF) == GFX_CPU_CASTLE) - version = GFX_VID_CASTLE; gfx_vid_version = version; return (version); } @@ -581,10 +482,7 @@ gfx_get_core_freq(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) freq = gu2_get_core_freq(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - freq = gu3_get_core_freq(); -#endif + return freq; } @@ -605,10 +503,6 @@ gfx_get_cpu_register_base(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) base = gu2_get_cpu_register_base(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - base = gu3_get_cpu_register_base(); -#endif return (base); } @@ -626,10 +520,6 @@ gfx_get_graphics_register_base(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) base = gu2_get_graphics_register_base(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - base = gu3_get_graphics_register_base(); -#endif return (base); } @@ -651,10 +541,6 @@ gfx_get_frame_buffer_base(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) base = gu2_get_frame_buffer_base(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - base = gu3_get_frame_buffer_base(); -#endif return (base); } @@ -676,10 +562,6 @@ gfx_get_frame_buffer_size(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) size = gu2_get_frame_buffer_size(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - size = gu3_get_frame_buffer_size(); -#endif return size; } @@ -701,10 +583,6 @@ gfx_get_vid_register_base(void) if (gfx_init_type & GFX_INIT_TYPE_GU2) base = gu2_get_vid_register_base(); #endif -#if GFX_INIT_GU3 - if (gfx_init_type & GFX_INIT_TYPE_GU3) - base = gu3_get_vid_register_base(); -#endif return (base); } diff --git a/src/gfx/gfx_regs.h b/src/gfx/gfx_regs.h index 8d062f7..2326f61 100644 --- a/src/gfx/gfx_regs.h +++ b/src/gfx/gfx_regs.h @@ -1274,381 +1274,3 @@ #define MCP_DOTPLL_M 0x00001E00 #define MCP_DOTPLL_LOCK 0x02000000 #define MCP_DOTPLL_BYPASS 0x00008000 - -/*---------------------------------------------------*/ -/* THIRD GENERATION DISPLAY CONTROLLER (CASTLE) */ -/*---------------------------------------------------*/ - -#define DC3_VG_SPARE_MSR 0x2011 - -#define DC3_UNLOCK 0x00000000 /* Unlock register */ -#define DC3_GENERAL_CFG 0x00000004 /* Config registers */ -#define DC3_DISPLAY_CFG 0x00000008 -#define DC3_ARB_CFG 0x0000000C - -#define DC3_FB_ST_OFFSET 0x00000010 /* Frame buffer start offset */ -#define DC3_CB_ST_OFFSET 0x00000014 /* Compression start offset */ -#define DC3_CURS_ST_OFFSET 0x00000018 /* Cursor buffer start - * offset */ -#define DC3_VID_Y_ST_OFFSET 0x00000020 /* Video Y Buffer start - * offset */ -#define DC3_VID_U_ST_OFFSET 0x00000024 /* Video U Buffer start - * offset */ -#define DC3_VID_V_ST_OFFSET 0x00000028 /* Video V Buffer start - * offset */ -#define DC3_LINE_SIZE 0x00000030 /* Video, CB, and FB line - * sizes */ -#define DC3_GFX_PITCH 0x00000034 /* FB and DB skip counts */ -#define DC3_VID_YUV_PITCH 0x00000038 /* Y, U and V buffer skip - * counts */ - -#define DC3_H_ACTIVE_TIMING 0x00000040 /* Horizontal timings */ -#define DC3_H_BLANK_TIMING 0x00000044 -#define DC3_H_SYNC_TIMING 0x00000048 -#define DC3_V_ACTIVE_TIMING 0x00000050 /* Vertical Timings */ -#define DC3_V_BLANK_TIMING 0x00000054 -#define DC3_V_SYNC_TIMING 0x00000058 - -#define DC3_CURSOR_X 0x00000060 /* Cursor X position */ -#define DC3_CURSOR_Y 0x00000064 /* Cursor Y Position */ -#define DC3_LINE_CNT_STATUS 0x0000006C /* Icon Y Position */ - -#define DC3_PAL_ADDRESS 0x00000070 /* Palette Address */ -#define DC3_PAL_DATA 0x00000074 /* Palette Data */ -#define DC3_DFIFO_DIAG 0x00000078 /* Display FIFO diagnostic */ -#define DC3_CFIFO_DIAG 0x0000007C /* Compression FIFO - * diagnostic */ - -#define DC3_VID_DS_DELTA 0x00000080 /* Vertical Downscaling - * fraction */ - -#define DC3_PHY_MEM_OFFSET 0x00000084 /* VG Base Address Register */ -#define DC3_DV_CTL 0x00000088 /* Dirty-Valid Control - * Register */ -#define DC3_DV_ACC 0x0000008C /* Dirty-Valid RAM Access */ - -#define DC3_GFX_SCALE 0x00000090 -#define DC3_IRQ_CTL 0x00000094 - -#define DC3_COLOR_KEY 0x000000B8 /* Graphics color key */ -#define DC3_COLOR_MASK 0x000000BC /* Graphics color key mask */ -#define DC3_COLOR_KEY_X 0x000000C0 /* Color Key X Region */ -#define DC3_COLOR_KEY_Y 0x000000C4 /* Color Key Y Region */ - -/* UNLOCK VALUE */ - -#define DC3_UNLOCK_VALUE 0x00004758 /* used to unlock DC regs */ - -/* VG SPARE MSR FIELDS */ - -#define VG_SPARE_DISABLE_CFIFO_HGO 0x00000800 -#define VG_SPARE_VFIFO_ARB_SELECT 0x00000400 -#define VG_SPARE_WM_LPEN_OVRD 0x00000200 -#define VG_SPARE_LOAD_WM_LPEN_MASK 0x00000100 -#define VG_SPARE_DISABLE_INIT_VID_PRI 0x00000080 -#define VG_SPARE_DISABLE_VFIFO_WM 0x00000040 -#define VG_SPARE_DISABLE_CWD_CHECK 0x00000020 -#define VG_SPARE_PIX8_PAN_FIX 0x00000010 -#define VG_SPARE_FIRST_REQ_MASK 0x00000020 - -/* VG MBUS DEVICE SMI MSR FIELDS */ - -#define DC3_VG_BL_MASK 0x00000001 -#define DC3_MISC_MASK 0x00000002 -#define DC3_ISR0_MASK 0x00000004 -#define DC3_VGA_BL_MASK 0x00000008 -#define DC3_CRTCIO_MSK 0x00000010 -#define DC3_VG_BLANK_SMI 0x00000001 -#define DC3_MISC_SMI 0x00000002 -#define DC3_ISR0_SMI 0x00000004 -#define DC3_VGA_BLANK_SMI 0x00000008 -#define DC3_CRTCIO_SMI 0x00000010 - -/* DC3_GENERAL_CFG BIT FIELDS */ - -#define DC3_GCFG_DBUG 0x80000000 -#define DC3_GCFG_DBSL 0x40000000 -#define DC3_GCFG_CFRW 0x20000000 -#define DC3_GCFG_DIAG 0x10000000 -#define DC3_GCFG_SGFR 0x04000000 -#define DC3_GCFG_SGRE 0x02000000 -#define DC3_GCFG_SIGE 0x01000000 -#define DC3_GCFG_YUVM 0x00100000 -#define DC3_GCFG_VDSE 0x00080000 -#define DC3_GCFG_VGAFT 0x00040000 -#define DC3_GCFG_FDTY 0x00020000 -#define DC3_GCFG_STFM 0x00010000 -#define DC3_GCFG_DFHPEL_MASK 0x0000F000 -#define DC3_GCFG_DFHPSL_MASK 0x00000F00 -#define DC3_GCFG_VGAE 0x00000080 -#define DC3_GCFG_DECE 0x00000040 -#define DC3_GCFG_CMPE 0x00000020 -#define DC3_GCFG_VIDE 0x00000008 -#define DC3_GCFG_CURE 0x00000002 -#define DC3_GCFG_DFLE 0x00000001 - -/* DC3_DISPLAY_CFG BIT FIELDS */ - -#define DC3_DCFG_VISL 0x08000000 -#define DC3_DCFG_FRLK 0x04000000 -#define DC3_DCFG_PALB 0x02000000 -#define DC3_DCFG_PIX_PAN_MASK 0x00F00000 -#define DC3_DCFG_DCEN 0x00080000 -#define DC3_DCFG_16BPP_MODE_MASK 0x00000C00 -#define DC3_DCFG_16BPP 0x00000000 -#define DC3_DCFG_15BPP 0x00000400 -#define DC3_DCFG_12BPP 0x00000800 -#define DC3_DCFG_DISP_MODE_MASK 0x00000300 -#define DC3_DCFG_DISP_MODE_8BPP 0x00000000 -#define DC3_DCFG_DISP_MODE_16BPP 0x00000100 -#define DC3_DCFG_DISP_MODE_24BPP 0x00000200 -#define DC3_DCFG_SCLE 0x00000080 -#define DC3_DCFG_TRUP 0x00000040 -#define DC3_DCFG_VIEN 0x00000020 -#define DC3_DCFG_VDEN 0x00000010 -#define DC3_DCFG_GDEN 0x00000008 -#define DC3_DCFG_VCKE 0x00000004 -#define DC3_DCFG_PCKE 0x00000002 -#define DC3_DCFG_TGEN 0x00000001 - -/* DC3_LINE_CNT BIT FIELDS */ - -#define DC3_LNCNT_DNA 0x80000000 -#define DC3_LNCNT_VNA 0x40000000 -#define DC3_LNCNT_VSA 0x20000000 -#define DC3_LNCNT_VINT 0x10000000 -#define DC3_LNCNT_FLIP 0x08000000 -#define DC3_LNCNT_V_LINE_CNT 0x07FF0000 -#define DC3_LNCNT_VFLIP 0x00008000 -#define DC3_LNCNT_SIGC 0x00004000 -#define DC3_LNCNT_SS_LINE_CMP 0x000007FF - -/* DC3_FB_ST_OFFSET BIT FIELDS */ - -#define DC3_FB_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_CB_ST_OFFSET BIT FIELDS */ - -#define DC3_CB_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_CURS_ST_OFFSET BIT FIELDS */ - -#define DC3_CURS_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_ICON_ST_OFFSET BIT FIELDS */ - -#define DC3_ICON_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_VID_Y_ST_OFFSET BIT FIELDS */ - -#define DC3_VID_Y_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_VID_U_ST_OFFSET BIT FIELDS */ - -#define DC3_VID_U_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_VID_V_ST_OFFSET BIT FIELDS */ - -#define DC3_VID_V_ST_OFFSET_MASK 0x0FFFFFFF - -/* DC3_LINE_SIZE BIT FIELDS */ - -#define DC3_LINE_SIZE_VLS_MASK 0x3FF00000 -#define DC3_LINE_SIZE_CBLS_MASK 0x0007F000 -#define DC3_LINE_SIZE_FBLS_MASK 0x000003FF -#define DC3_LINE_SIZE_CB_SHIFT 12 -#define DC3_LINE_SIZE_VB_SHIFT 20 - -/* DC3_GFX_PITCH BIT FIELDS */ - -#define DC3_GFX_PITCH_CBP_MASK 0xFFFF0000 -#define DC3_GFX_PITCH_FBP_MASK 0x0000FFFF - -/* DC3_VID_YUV_PITCH BIT FIELDS */ - -#define DC3_YUV_PITCH_UVP_MASK 0xFFFF0000 -#define DC3_YUV_PITCH_YBP_MASK 0x0000FFFF - -/* DC3_H_ACTIVE_TIMING BIT FIELDS */ - -#define DC3_HAT_HT_MASK 0x0FF80000 -#define DC3_HAT_HA_MASK 0x00000FF8 - -/* DC3_H_BLANK_TIMING BIT FIELDS */ - -#define DC3_HBT_HBE_MASK 0x0FF80000 -#define DC3_HBT_HBS_MASK 0x00000FF8 - -/* DC3_H_SYNC_TIMING BIT FIELDS */ - -#define DC3_HST_HSE_MASK 0x0FF80000 -#define DC3_HST_HSS_MASK 0x00000FF8 - -/* DC3_V_ACTIVE_TIMING BIT FIELDS */ - -#define DC3_VAT_VT_MASK 0x07FF0000 -#define DC3_VAT_VA_MASK 0x000007FF - -/* DC3_V_BLANK_TIMING BIT FIELDS */ - -#define DC3_VBT_VBE_MASK 0x07FF0000 -#define DC3_VBT_VBS_MASK 0x000007FF - -/* DC3_V_SYNC_TIMING BIT FIELDS */ - -#define DC3_VST_VSE_MASK 0x07FF0000 -#define DC3_VST_VSS_MASK 0x000007FF - -/* DC3_DV_CTL BIT DEFINITIONS */ - -#define DC3_DV_LINE_SIZE_MASK 0x00000C00 -#define DC3_DV_LINE_SIZE_1024 0x00000000 -#define DC3_DV_LINE_SIZE_2048 0x00000400 -#define DC3_DV_LINE_SIZE_4096 0x00000800 -#define DC3_DV_LINE_SIZE_8192 0x00000C00 - -#define DC3_CLR_KEY_DATA_MASK 0x00FFFFFF -#define DC3_CLR_KEY_ENABLE 0x01000000 -#define DC3_CLR_KEY_INVERT 0x02000000 - -/* VGA DEFINITIONS */ - -#define DC3_SEQUENCER_INDEX 0x03C4 -#define DC3_SEQUENCER_DATA 0x03C5 -#define DC3_SEQUENCER_RESET 0x00 -#define DC3_SEQUENCER_CLK_MODE 0x01 - -#define DC3_RESET_VGA_DISP_ENABLE 0x03 -#define DC3_CLK_MODE_SCREEN_OFF 0x20 - -/*---------------------------------------------------*/ -/* CASTLE DISPLAY FILTER */ -/*---------------------------------------------------*/ - -/* CASTLE VIDEO REGISTER DEFINITIONS */ - -#define CASTLE_VIDEO_CONFIG 0x000 -#define CASTLE_DISPLAY_CONFIG 0x008 -#define CASTLE_VIDEO_X_POS 0x010 -#define CASTLE_VIDEO_Y_POS 0x018 -#define CASTLE_VIDEO_SCALER 0x020 -#define CASTLE_VIDEO_COLOR_KEY 0x028 -#define CASTLE_VIDEO_COLOR_MASK 0x030 -#define CASTLE_PALETTE_ADDRESS 0x038 -#define CASTLE_PALETTE_DATA 0x040 -#define CASTLE_VID_MISC 0x050 -#define CASTLE_VIDEO_YSCALE 0x060 -#define CASTLE_VIDEO_XSCALE 0x068 -#define CASTLE_VIDEO_DOWNSCALER_CONTROL 0x078 -#define CASTLE_VID_CRC 0x088 -#define CASTLE_VID_CRC32 0x090 -#define CASTLE_VID_ALPHA_CONTROL 0x098 -#define CASTLE_CURSOR_COLOR_KEY 0x0A0 -#define CASTLE_CURSOR_COLOR_MASK 0x0A8 -#define CASTLE_CURSOR_COLOR_1 0x0B0 -#define CASTLE_CURSOR_COLOR_2 0x0B8 -#define CASTLE_ALPHA_XPOS_1 0x0C0 -#define CASTLE_ALPHA_YPOS_1 0x0C8 -#define CASTLE_ALPHA_COLOR_1 0x0D0 -#define CASTLE_ALPHA_CONTROL_1 0x0D8 -#define CASTLE_ALPHA_XPOS_2 0x0E0 -#define CASTLE_ALPHA_YPOS_2 0x0E8 -#define CASTLE_ALPHA_COLOR_2 0x0F0 -#define CASTLE_ALPHA_CONTROL_2 0x0F8 -#define CASTLE_ALPHA_XPOS_3 0x100 -#define CASTLE_ALPHA_YPOS_3 0x108 -#define CASTLE_ALPHA_COLOR_3 0x110 -#define CASTLE_ALPHA_CONTROL_3 0x118 -#define CASTLE_VIDEO_REQUEST 0x120 -#define CASTLE_ALPHA_WATCH 0x128 -#define CASTLE_VIDEO_TEST_MODE 0x210 -#define CASTLE_POWER_MANAGEMENT 0x410 -#define CASTLE_COEFFICIENT_BASE 0x1000 - -/* DISPLAY FILTER POWER MANAGEMENT DEFINITIONS */ - -#define CASTLE_PM_PANEL_POWER_ON 0x01000000 - -/* DISPLAY FILTER MSRS */ - -#define CASTLE_MBD_MSR_DIAG_DF 0x2010 -#define CASTLE_DIAG_32BIT_CRC 0x80000000 - -/* "CASTLE_VIDEO_CONFIG" BIT DEFINITIONS */ - -#define CASTLE_VCFG_VID_EN 0x00000001 -#define CASTLE_VCFG_VID_INP_FORMAT 0x0000000C -#define CASTLE_VCFG_SC_BYP 0x00000020 -#define CASTLE_VCFG_LINE_SIZE_LOWER_MASK 0x0000FF00 -#define CASTLE_VCFG_INIT_READ_MASK 0x01FF0000 -#define CASTLE_VCFG_LINE_SIZE_BIT9 0x04000000 -#define CASTLE_VCFG_LINE_SIZE_UPPER 0x08000000 -#define CASTLE_VCFG_4_2_0_MODE 0x10000000 -#define CASTLE_VCFG_UYVY_FORMAT 0x00000000 -#define CASTLE_VCFG_Y2YU_FORMAT 0x00000004 -#define CASTLE_VCFG_YUYV_FORMAT 0x00000008 -#define CASTLE_VCFG_YVYU_FORMAT 0x0000000C - -/* "CASTLE_DISPLAY_CONFIG" BIT DEFINITIONS */ - -#define CASTLE_DCFG_DIS_EN 0x00000001 -#define CASTLE_DCFG_HSYNC_EN 0x00000002 -#define CASTLE_DCFG_VSYNC_EN 0x00000004 -#define CASTLE_DCFG_DAC_BL_EN 0x00000008 -#define CASTLE_DCFG_CRT_HSYNC_POL 0x00000100 -#define CASTLE_DCFG_CRT_VSYNC_POL 0x00000200 -#define CASTLE_DCFG_CRT_SYNC_SKW_MASK 0x0001C000 -#define CASTLE_DCFG_CRT_SYNC_SKW_INIT 0x00010000 -#define CASTLE_DCFG_PWR_SEQ_DLY_MASK 0x000E0000 -#define CASTLE_DCFG_PWR_SEQ_DLY_INIT 0x00080000 -#define CASTLE_DCFG_VG_CK 0x00100000 -#define CASTLE_DCFG_GV_PAL_BYP 0x00200000 -#define CASTLE_DAC_VREF 0x04000000 - -/* "CASTLE_VID_MISC" BIT DEFINITIONS */ - -#define CASTLE_GAMMA_BYPASS_BOTH 0x00000001 -#define CASTLE_DAC_POWER_DOWN 0x00000400 -#define CASTLE_ANALOG_POWER_DOWN 0x00000800 - -/* VIDEO DE-INTERLACING AND ALPHA CONTROL */ - -#define CASTLE_NO_CK_OUTSIDE_ALPHA 0x00000100 -#define CASTLE_CSC_VIDEO_YUV_TO_RGB 0x00000400 -#define CASTLE_CSC_GRAPHICS_RGB_TO_YUV 0x00000800 -#define CASTLE_VIDEO_INPUT_IS_RGB 0x00002000 -#define CASTLE_ALPHA1_PRIORITY_POS 16 -#define CASTLE_ALPHA1_PRIORITY_MASK 0x00030000 -#define CASTLE_ALPHA2_PRIORITY_POS 18 -#define CASTLE_ALPHA2_PRIORITY_MASK 0x000C0000 -#define CASTLE_ALPHA3_PRIORITY_POS 20 -#define CASTLE_ALPHA3_PRIORITY_MASK 0x00300000 - -/* VIDEO CURSOR COLOR KEY DEFINITIONS */ - -#define CASTLE_CURSOR_COLOR_KEY_ENABLE 0x20000000 -#define CASTLE_CURSOR_COLOR_KEY_OFFSET_POS 24 -#define CASTLE_CURSOR_COLOR_BITS 23 -#define CASTLE_COLOR_MASK 0x00FFFFFF /* 24 significant - * bits */ - -/* ALPHA COLOR BIT DEFINITION (REGISTERS 0x68, 0x78, AND 0x88) */ - -#define CASTLE_ALPHA_COLOR_ENABLE 0x01000000 - -/* ALPHA CONTROL BIT DEFINITIONS (REGISTERS 0x6C, 0x7C, AND 0x8C) */ - -#define CASTLE_ACTRL_WIN_ENABLE 0x00010000 -#define CASTLE_ACTRL_LOAD_ALPHA 0x00020000 - -/* CASTLE_VIDEO_SCALER DEFINITIONS */ - -#define CASTLE_SCALE_128_PHASES 0x00002000 - -/* VIDEO REQUEST DEFINITIONS (REGISTER 0x90) */ - -#define CASTLE_VIDEO_Y_REQUEST_POS 0 -#define CASTLE_VIDEO_X_REQUEST_POS 16 -#define CASTLE_VIDEO_REQUEST_MASK 0x000007FF - -/* END OF FILE */ diff --git a/src/gfx/gfx_rtns.h b/src/gfx/gfx_rtns.h index ad759f4..d7e001e 100644 --- a/src/gfx/gfx_rtns.h +++ b/src/gfx/gfx_rtns.h @@ -69,12 +69,10 @@ extern "C" extern int gfx_display_type; #define GFX_DISPLAY_TYPE_GU1 0x0001 #define GFX_DISPLAY_TYPE_GU2 0x0002 -#define GFX_DISPLAY_TYPE_GU3 0x0004 extern int gfx_init_type; #define GFX_INIT_TYPE_GU1 0x0001 #define GFX_INIT_TYPE_GU2 0x0002 -#define GFX_INIT_TYPE_GU3 0x0004 extern int gfx_msr_type; #define GFX_MSR_TYPE_REDCLOUD 0x0001 @@ -87,7 +85,6 @@ extern "C" #define GFX_VIDEO_TYPE_CS5530 0x0001 #define GFX_VIDEO_TYPE_SC1200 0x0002 #define GFX_VIDEO_TYPE_REDCLOUD 0x0004 -#define GFX_VIDEO_TYPE_CASTLE 0x0008 extern int gfx_vip_type; #define GFX_VIP_TYPE_SC1200 0x0001 diff --git a/src/gfx/gfx_type.h b/src/gfx/gfx_type.h index fbedd62..33b6cab 100644 --- a/src/gfx/gfx_type.h +++ b/src/gfx/gfx_type.h @@ -304,13 +304,11 @@ typedef struct #define GFX_CPU_GXLV 1 #define GFX_CPU_SC1200 2 #define GFX_CPU_REDCLOUD 3 -#define GFX_CPU_CASTLE 4 #define GFX_CPU_PYRAMID 0x20801 #define GFX_VID_CS5530 1 #define GFX_VID_SC1200 2 #define GFX_VID_REDCLOUD 3 -#define GFX_VID_CASTLE 4 /* CHIP NAME AND REVISION */ diff --git a/src/gfx/gfx_vid.c b/src/gfx/gfx_vid.c index ec1acbc..41fef74 100644 --- a/src/gfx/gfx_vid.c +++ b/src/gfx/gfx_vid.c @@ -165,12 +165,6 @@ int gfx_set_screen_enable(int enable); /* forward declaration #include "vid_rdcl.c" #endif -/* INLUDE SUPPORT FOR CASTLE, IF SPECIFIED. */ - -#if GFX_VIDEO_CASTLE -#include "vid_cstl.c" -#endif - /*--------------------------------------------------------------------------- * gfx_select_alpha_region * @@ -216,10 +210,6 @@ gfx_reset_video(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_reset_video(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_reset_video(); -#endif } /*--------------------------------------------------------------------------- @@ -245,10 +235,6 @@ gfx_set_display_control(int sync_polarities) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_display_control(sync_polarities); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_display_control(sync_polarities); -#endif return (status); } @@ -271,10 +257,6 @@ gfx_set_clock_frequency(unsigned long frequency) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_set_clock_frequency(frequency); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_set_clock_frequency(frequency); -#endif } /*---------------------------------------------------------------------------- @@ -298,10 +280,6 @@ gfx_set_crt_enable(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_crt_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_crt_enable(enable); -#endif return (status); } @@ -326,10 +304,6 @@ gfx_set_video_enable(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_enable(enable); -#endif return (status); } @@ -373,10 +347,6 @@ gfx_set_video_format(unsigned long format) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_format(format); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_format(format); -#endif return (status); } @@ -401,10 +371,6 @@ gfx_set_video_size(unsigned short width, unsigned short height) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_size(width, height); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_size(width, height); -#endif return (status); } @@ -421,10 +387,6 @@ gfx_set_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_yuv_pitch(ypitch, uvpitch); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_yuv_pitch(ypitch, uvpitch); -#endif return (status); } @@ -449,10 +411,6 @@ gfx_set_video_offset(unsigned long offset) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_offset(offset); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_offset(offset); -#endif return (status); } @@ -470,10 +428,6 @@ gfx_set_video_yuv_offsets(unsigned long yoffset, unsigned long uoffset, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_yuv_offsets(yoffset, uoffset, voffset); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_yuv_offsets(yoffset, uoffset, voffset); -#endif return (status); } @@ -499,10 +453,6 @@ gfx_set_video_scale(unsigned short srcw, unsigned short srch, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_scale(srcw, srch, dstw, dsth); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_scale(srcw, srch, dstw, dsth); -#endif return (status); } @@ -638,10 +588,6 @@ gfx_set_video_window(short x, short y, unsigned short w, unsigned short h) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_window(x, y, w, h); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_window(x, y, w, h); -#endif return (status); } @@ -666,10 +612,6 @@ gfx_set_video_left_crop(unsigned short x) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_left_crop(x); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_left_crop(x); -#endif return (status); } @@ -694,10 +636,6 @@ gfx_set_video_color_key(unsigned long key, unsigned long mask, int graphics) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_color_key(key, mask, graphics); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_color_key(key, mask, graphics); -#endif return (status); } @@ -746,10 +684,6 @@ gfx_set_video_palette(unsigned long *palette) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_palette(palette); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_palette(palette); -#endif return (status); } @@ -791,10 +725,6 @@ gfx_set_video_palette_entry(unsigned long index, unsigned long palette) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_palette_entry(index, palette); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_palette_entry(index, palette); -#endif return (status); } @@ -852,10 +782,6 @@ gfx_set_video_request(short x, short y) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_request(x, y); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_request(x, y); -#endif return (status); } @@ -1040,11 +966,6 @@ gfx_set_video_cursor(unsigned long key, unsigned long mask, redcloud_set_video_cursor(key, mask, select_color2, color1, color2); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = - castle_set_video_cursor(key, mask, select_color2, color1, color2); -#endif return (status); } @@ -1061,10 +982,6 @@ gfx_set_video_cursor_enable(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_video_cursor_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_video_cursor_enable(enable); -#endif return (status); } @@ -1085,10 +1002,6 @@ gfx_set_alpha_enable(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_enable(enable); -#endif return (status); } @@ -1110,10 +1023,6 @@ gfx_set_alpha_window(short x, short y, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_window(x, y, width, height); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_window(x, y, width, height); -#endif return (status); } @@ -1134,10 +1043,6 @@ gfx_set_alpha_value(unsigned char alpha, char delta) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_value(alpha, delta); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_value(alpha, delta); -#endif return (status); } @@ -1158,10 +1063,6 @@ gfx_set_alpha_priority(int priority) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_priority(priority); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_priority(priority); -#endif return (status); } @@ -1182,10 +1083,6 @@ gfx_set_alpha_color(unsigned long color) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_color(color); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_color(color); -#endif return (status); } @@ -1206,10 +1103,6 @@ gfx_set_alpha_color_enable(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_alpha_color_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_alpha_color_enable(enable); -#endif return (status); } @@ -1230,10 +1123,6 @@ gfx_set_no_ck_outside_alpha(int enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_set_no_ck_outside_alpha(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_set_no_ck_outside_alpha(enable); -#endif return (status); } @@ -1314,10 +1203,6 @@ gfx_get_clock_frequency(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) frequency = redcloud_get_clock_frequency(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - frequency = castle_get_clock_frequency(); -#endif return (frequency); } @@ -1389,10 +1274,6 @@ gfx_get_sync_polarities(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) polarities = redcloud_get_sync_polarities(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - polarities = castle_get_sync_polarities(); -#endif return (polarities); } @@ -1417,10 +1298,6 @@ gfx_get_video_palette_entry(unsigned long index, unsigned long *palette) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_get_video_palette_entry(index, palette); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_get_video_palette_entry(index, palette); -#endif return (status); } @@ -1445,10 +1322,6 @@ gfx_get_video_enable(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) enable = redcloud_get_video_enable(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - enable = castle_get_video_enable(); -#endif return (enable); } @@ -1473,10 +1346,6 @@ gfx_get_video_format(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) format = redcloud_get_video_format(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - format = castle_get_video_format(); -#endif return (format); } @@ -1501,10 +1370,6 @@ gfx_get_video_src_size(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) size = redcloud_get_video_src_size(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - size = castle_get_video_src_size(); -#endif return (size); } @@ -1529,10 +1394,6 @@ gfx_get_video_line_size(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) size = redcloud_get_video_line_size(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - size = castle_get_video_line_size(); -#endif return (size); } @@ -1557,10 +1418,6 @@ gfx_get_video_xclip(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) size = redcloud_get_video_xclip(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - size = castle_get_video_xclip(); -#endif return (size); } @@ -1585,10 +1442,6 @@ gfx_get_video_offset(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) offset = redcloud_get_video_offset(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - offset = castle_get_video_offset(); -#endif return (offset); } @@ -1604,10 +1457,6 @@ gfx_get_video_yuv_offsets(unsigned long *yoffset, unsigned long *uoffset, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_video_yuv_offsets(yoffset, uoffset, voffset); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_video_yuv_offsets(yoffset, uoffset, voffset); -#endif } /*---------------------------------------------------------------------------- @@ -1621,10 +1470,6 @@ gfx_get_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_video_yuv_pitch(ypitch, uvpitch); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_video_yuv_pitch(ypitch, uvpitch); -#endif } /*--------------------------------------------------------------------------- @@ -1775,10 +1620,6 @@ gfx_get_video_dst_size(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) size = redcloud_get_video_dst_size(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - size = castle_get_video_dst_size(); -#endif return (size); } @@ -1803,10 +1644,6 @@ gfx_get_video_position(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) position = redcloud_get_video_position(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - position = castle_get_video_position(); -#endif return (position); } @@ -1831,10 +1668,6 @@ gfx_get_video_color_key(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) key = redcloud_get_video_color_key(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - key = castle_get_video_color_key(); -#endif return (key); } @@ -1859,10 +1692,6 @@ gfx_get_video_color_key_mask(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) mask = redcloud_get_video_color_key_mask(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - mask = castle_get_video_color_key_mask(); -#endif return (mask); } @@ -1887,10 +1716,6 @@ gfx_get_video_color_key_src(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) src = redcloud_get_video_color_key_src(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - src = castle_get_video_color_key_src(); -#endif return (src); } @@ -1935,10 +1760,6 @@ gfx_get_video_request(short *x, short *y) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) status = redcloud_get_video_request(x, y); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - status = castle_get_video_request(x, y); -#endif return (status); } @@ -2108,11 +1929,6 @@ gfx_get_video_cursor(unsigned long *key, unsigned long *mask, redcloud_get_video_cursor(key, mask, select_color2, color1, color2); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - enable = - castle_get_video_cursor(key, mask, select_color2, color1, color2); -#endif return (enable); } @@ -2137,10 +1953,6 @@ gfx_read_crc(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) crc = redcloud_read_crc(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - crc = castle_read_crc(); -#endif return (crc); } @@ -2157,10 +1969,6 @@ gfx_read_crc32(void) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) crc = redcloud_read_crc32(); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - crc = castle_read_crc32(); -#endif return (crc); } @@ -2178,10 +1986,6 @@ gfx_read_window_crc(int source, unsigned short x, unsigned short y, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) crc = redcloud_read_window_crc(source, x, y, width, height, crc32); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - crc = castle_read_window_crc(source, x, y, width, height, crc32); -#endif return (crc); } @@ -2216,10 +2020,6 @@ gfx_get_alpha_enable(int *enable) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_alpha_enable(enable); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_alpha_enable(enable); -#endif return; } @@ -2239,10 +2039,6 @@ gfx_get_alpha_size(unsigned short *x, unsigned short *y, if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_alpha_size(x, y, width, height); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_alpha_size(x, y, width, height); -#endif return; } @@ -2261,10 +2057,6 @@ gfx_get_alpha_value(unsigned char *alpha, char *delta) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_alpha_value(alpha, delta); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_alpha_value(alpha, delta); -#endif return; } @@ -2283,10 +2075,6 @@ gfx_get_alpha_priority(int *priority) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_alpha_priority(priority); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_alpha_priority(priority); -#endif return; } @@ -2305,10 +2093,6 @@ gfx_get_alpha_color(unsigned long *color) if (gfx_video_type == GFX_VIDEO_TYPE_REDCLOUD) redcloud_get_alpha_color(color); #endif -#if GFX_VIDEO_CASTLE - if (gfx_video_type == GFX_VIDEO_TYPE_CASTLE) - castle_get_alpha_color(color); -#endif return; } diff --git a/src/gfx/init_gu3.c b/src/gfx/init_gu3.c deleted file mode 100644 index daf1513..0000000 --- a/src/gfx/init_gu3.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Copyright (c) 2005 Advanced Micro Devices, Inc. - * - * 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 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * */ - -/* - * This file contains routines used in Redcloud initialization. - * */ - -/*---------------------------------------------------------------------------- - * gfx_get_core_freq - * - * Returns the core clock frequency of a GX3. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_core_freq(void) -#else -unsigned long -gfx_get_core_freq(void) -#endif -{ - unsigned long value; - - /* CPU SPEED IS REPORTED BY A VSM IN VSA II */ - /* Virtual Register Class = 0x12 (Sysinfo) */ - /* CPU Speed Register = 0x01 */ - - OUTW(0xAC1C, 0xFC53); - OUTW(0xAC1C, 0x1201); - - value = (unsigned long)(INW(0xAC1E)); - - return (value); -} - -/*---------------------------------------------------------------------------- - * gfx_get_cpu_register_base - * - * This routine returns the base address for display controller registers. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_cpu_register_base(void) -#else -unsigned long -gfx_get_cpu_register_base(void) -#endif -{ - return gfx_pci_config_read(0x80000918); -} - -/*---------------------------------------------------------------------------- - * gfx_get_graphics_register_base - * - * This routine returns the base address for the graphics acceleration. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_graphics_register_base(void) -#else -unsigned long -gfx_get_graphics_register_base(void) -#endif -{ - return gfx_pci_config_read(0x80000914); -} - -/*---------------------------------------------------------------------------- - * gfx_get_frame_buffer_base - * - * This routine returns the base address for graphics memory. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_frame_buffer_base(void) -#else -unsigned long -gfx_get_frame_buffer_base(void) -#endif -{ - return gfx_pci_config_read(0x80000910); -} - -/*---------------------------------------------------------------------------- - * gfx_get_frame_buffer_size - * - * This routine returns the total size of graphics memory, in bytes. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_frame_buffer_size(void) -#else -unsigned long -gfx_get_frame_buffer_size(void) -#endif -{ - unsigned long value; - - /* FRAME BUFFER SIZE IS REPORTED BY A VSM IN VSA II */ - /* Virtual Register Class = 0x02 */ - /* VG_MEM_SIZE (1MB units) = 0x00 */ - - OUTW(0xAC1C, 0xFC53); - OUTW(0xAC1C, 0x0200); - - value = (unsigned long)(INW(0xAC1E)) & 0xFEl; - - /* LIMIT FRAME BUFFER SIZE TO 16MB TO MATCH LEGACY */ - - if ((value << 20) > 0x1000000) - return 0x1000000; - - return (value << 20); -} - -/*---------------------------------------------------------------------------- - * gfx_get_vid_register_base - * - * This routine returns the base address for the video hardware. - *---------------------------------------------------------------------------- - */ -#if GFX_INIT_DYNAMIC -unsigned long -gu3_get_vid_register_base(void) -#else -unsigned long -gfx_get_vid_register_base(void) -#endif -{ - return gfx_pci_config_read(0x8000091C); -} - -/* END OF FILE */ diff --git a/src/gfx/vid_cstl.c b/src/gfx/vid_cstl.c deleted file mode 100644 index 5b642cc..0000000 --- a/src/gfx/vid_cstl.c +++ /dev/null @@ -1,2571 +0,0 @@ -/* Copyright (c) 2005 Advanced Micro Devices, Inc. - * - * 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 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * */ - -/* DEFAULT FILTER COEFFICIENTS */ - -long DurangoVideoFilter[][2] = { - {0x10000000, 0x00000000}, /* 0, 4096, 0, 0 */ - {0x10008008, 0x00000008}, /* -8, 4096, 8, 0 */ - {0x10008010, 0x80010011}, /* -16, 4096, 17, -1 */ - {0x10008019, 0x8001001A}, /* -25, 4096, 26, -1 */ - {0x10008021, 0x80020023}, /* -33, 4096, 35, -2 */ - {0x0FFF8029, 0x8003002D}, /* -41, 4095, 45, -3 */ - {0x0FFE8031, 0x80030036}, /* -49, 4094, 54, -3 */ - {0x0FFC8038, 0x80040040}, /* -56, 4092, 64, -4 */ - {0x0FFB8040, 0x8005004A}, /* -64, 4091, 74, -5 */ - {0x0FF88047, 0x80050054}, /* -71, 4088, 84, -5 */ - {0x0FF6804E, 0x8006005E}, /* -78, 4086, 94, -6 */ - {0x0FF48055, 0x80070068}, /* -85, 4084, 104, -7 */ - {0x0FF0805C, 0x80070073}, /* -92, 4080, 115, -7 */ - {0x0FEE8063, 0x8008007D}, /* -99, 4078, 125, -8 */ - {0x0FEA8069, 0x80090088}, /* -105, 4074, 136, -9 */ - {0x0FE78070, 0x800A0093}, /* -112, 4071, 147, -10 */ - {0x0FE28076, 0x800A009E}, /* -118, 4066, 158, -10 */ - {0x0FDD807C, 0x800B00AA}, /* -124, 4061, 170, -11 */ - {0x0FD98082, 0x800C00B5}, /* -130, 4057, 181, -12 */ - {0x0FD48088, 0x800D00C1}, /* -136, 4052, 193, -13 */ - {0x0FCE808E, 0x800D00CD}, /* -142, 4046, 205, -13 */ - {0x0FC88093, 0x800E00D9}, /* -147, 4040, 217, -14 */ - {0x0FC38099, 0x800F00E5}, /* -153, 4035, 229, -15 */ - {0x0FBD809E, 0x801000F1}, /* -158, 4029, 241, -16 */ - {0x0FB680A3, 0x801000FD}, /* -163, 4022, 253, -16 */ - {0x0FAF80A8, 0x8011010A}, /* -168, 4015, 266, -17 */ - {0x0FA880AD, 0x80120117}, /* -173, 4008, 279, -18 */ - {0x0FA180B2, 0x80130124}, /* -178, 4001, 292, -19 */ - {0x0F9980B6, 0x80140131}, /* -182, 3993, 305, -20 */ - {0x0F9280BB, 0x8015013E}, /* -187, 3986, 318, -21 */ - {0x0F8880BF, 0x8015014C}, /* -191, 3976, 332, -21 */ - {0x0F8080C3, 0x80160159}, /* -195, 3968, 345, -22 */ - {0x0F7880C8, 0x80170167}, /* -200, 3960, 359, -23 */ - {0x0F6E80CB, 0x80180175}, /* -203, 3950, 373, -24 */ - {0x0F6580CF, 0x80190183}, /* -207, 3941, 387, -25 */ - {0x0F5C80D3, 0x801A0191}, /* -211, 3932, 401, -26 */ - {0x0F5280D7, 0x801B01A0}, /* -215, 3922, 416, -27 */ - {0x0F4880DA, 0x801C01AE}, /* -218, 3912, 430, -28 */ - {0x0F3D80DD, 0x801D01BD}, /* -221, 3901, 445, -29 */ - {0x0F3280E0, 0x801E01CC}, /* -224, 3890, 460, -30 */ - {0x0F2880E4, 0x801F01DB}, /* -228, 3880, 475, -31 */ - {0x0F1C80E6, 0x802001EA}, /* -230, 3868, 490, -32 */ - {0x0F1180E9, 0x802101F9}, /* -233, 3857, 505, -33 */ - {0x0F0480EB, 0x80210208}, /* -235, 3844, 520, -33 */ - {0x0EFA80EF, 0x80230218}, /* -239, 3834, 536, -35 */ - {0x0EEC80F0, 0x80230227}, /* -240, 3820, 551, -35 */ - {0x0EE080F3, 0x80240237}, /* -243, 3808, 567, -36 */ - {0x0ED380F5, 0x80250247}, /* -245, 3795, 583, -37 */ - {0x0EC780F7, 0x80270257}, /* -247, 3783, 599, -39 */ - {0x0EB980F9, 0x80280268}, /* -249, 3769, 616, -40 */ - {0x0EAC80FB, 0x80290278}, /* -251, 3756, 632, -41 */ - {0x0E9E80FD, 0x802A0289}, /* -253, 3742, 649, -42 */ - {0x0E9080FE, 0x802B0299}, /* -254, 3728, 665, -43 */ - {0x0E838100, 0x802D02AA}, /* -256, 3715, 682, -45 */ - {0x0E758102, 0x802E02BB}, /* -258, 3701, 699, -46 */ - {0x0E668103, 0x802F02CC}, /* -259, 3686, 716, -47 */ - {0x0E568104, 0x803002DE}, /* -260, 3670, 734, -48 */ - {0x0E498106, 0x803202EF}, /* -262, 3657, 751, -50 */ - {0x0E398107, 0x80330301}, /* -263, 3641, 769, -51 */ - {0x0E298108, 0x80340313}, /* -264, 3625, 787, -52 */ - {0x0E1A8109, 0x80360325}, /* -265, 3610, 805, -54 */ - {0x0E0B810A, 0x80370336}, /* -266, 3595, 822, -55 */ - {0x0DFA810A, 0x80380348}, /* -266, 3578, 840, -56 */ - {0x0DEA810B, 0x803A035B}, /* -267, 3562, 859, -58 */ - {0x0DDA810C, 0x803B036D}, /* -268, 3546, 877, -59 */ - {0x0DCA810C, 0x803D037F}, /* -268, 3530, 895, -61 */ - {0x0DB7810B, 0x803E0392}, /* -267, 3511, 914, -62 */ - {0x0DA7810C, 0x804003A5}, /* -268, 3495, 933, -64 */ - {0x0D95810C, 0x804103B8}, /* -268, 3477, 952, -65 */ - {0x0D85810C, 0x804303CA}, /* -268, 3461, 970, -67 */ - {0x0D73810C, 0x804403DD}, /* -268, 3443, 989, -68 */ - {0x0D61810C, 0x804603F1}, /* -268, 3425, 1009, -70 */ - {0x0D50810C, 0x80480404}, /* -268, 3408, 1028, -72 */ - {0x0D3E810C, 0x80490417}, /* -268, 3390, 1047, -73 */ - {0x0D2C810C, 0x804B042B}, /* -268, 3372, 1067, -75 */ - {0x0D1B810C, 0x804D043E}, /* -268, 3355, 1086, -77 */ - {0x0D07810B, 0x804E0452}, /* -267, 3335, 1106, -78 */ - {0x0CF5810B, 0x80500466}, /* -267, 3317, 1126, -80 */ - {0x0CE2810A, 0x8052047A}, /* -266, 3298, 1146, -82 */ - {0x0CCF810A, 0x8053048E}, /* -266, 3279, 1166, -83 */ - {0x0CBC8109, 0x805504A2}, /* -265, 3260, 1186, -85 */ - {0x0CA98108, 0x805704B6}, /* -264, 3241, 1206, -87 */ - {0x0C968108, 0x805904CB}, /* -264, 3222, 1227, -89 */ - {0x0C838107, 0x805B04DF}, /* -263, 3203, 1247, -91 */ - {0x0C6F8106, 0x805C04F3}, /* -262, 3183, 1267, -92 */ - {0x0C5B8105, 0x805E0508}, /* -261, 3163, 1288, -94 */ - {0x0C478104, 0x8060051D}, /* -260, 3143, 1309, -96 */ - {0x0C348103, 0x80620531}, /* -259, 3124, 1329, -98 */ - {0x0C1F8102, 0x80640547}, /* -258, 3103, 1351, -100 */ - {0x0C0C8101, 0x8066055B}, /* -257, 3084, 1371, -102 */ - {0x0BF88100, 0x80680570}, /* -256, 3064, 1392, -104 */ - {0x0BE380FE, 0x806A0585}, /* -254, 3043, 1413, -106 */ - {0x0BCF80FD, 0x806C059A}, /* -253, 3023, 1434, -108 */ - {0x0BBA80FC, 0x806E05B0}, /* -252, 3002, 1456, -110 */ - {0x0BA480F9, 0x807005C5}, /* -249, 2980, 1477, -112 */ - {0x0B8F80F8, 0x807205DB}, /* -248, 2959, 1499, -114 */ - {0x0B7A80F6, 0x807405F0}, /* -246, 2938, 1520, -116 */ - {0x0B6580F5, 0x80760606}, /* -245, 2917, 1542, -118 */ - {0x0B4F80F3, 0x8077061B}, /* -243, 2895, 1563, -119 */ - {0x0B3A80F2, 0x80790631}, /* -242, 2874, 1585, -121 */ - {0x0B2480F0, 0x807B0647}, /* -240, 2852, 1607, -123 */ - {0x0B0F80EE, 0x807D065C}, /* -238, 2831, 1628, -125 */ - {0x0AF980ED, 0x807F0673}, /* -237, 2809, 1651, -127 */ - {0x0AE480EB, 0x80810688}, /* -235, 2788, 1672, -129 */ - {0x0ACE80E9, 0x8084069F}, /* -233, 2766, 1695, -132 */ - {0x0AB980E7, 0x808606B4}, /* -231, 2745, 1716, -134 */ - {0x0AA380E6, 0x808806CB}, /* -230, 2723, 1739, -136 */ - {0x0A8D80E4, 0x808A06E1}, /* -228, 2701, 1761, -138 */ - {0x0A7780E2, 0x808C06F7}, /* -226, 2679, 1783, -140 */ - {0x0A6180E0, 0x808E070D}, /* -224, 2657, 1805, -142 */ - {0x0A4B80DE, 0x80910724}, /* -222, 2635, 1828, -145 */ - {0x0A3580DC, 0x8093073A}, /* -220, 2613, 1850, -147 */ - {0x0A1F80DA, 0x80950750}, /* -218, 2591, 1872, -149 */ - {0x0A0880D8, 0x80970767}, /* -216, 2568, 1895, -151 */ - {0x09F280D6, 0x8099077D}, /* -214, 2546, 1917, -153 */ - {0x09DD80D4, 0x809C0793}, /* -212, 2525, 1939, -156 */ - {0x09C680D2, 0x809E07AA}, /* -210, 2502, 1962, -158 */ - {0x09B080D0, 0x80A007C0}, /* -208, 2480, 1984, -160 */ - {0x099980CE, 0x80A207D7}, /* -206, 2457, 2007, -162 */ - {0x098380CB, 0x80A507ED}, /* -203, 2435, 2029, -165 */ - {0x096C80C9, 0x80A70804}, /* -201, 2412, 2052, -167 */ - {0x095680C7, 0x80A9081A}, /* -199, 2390, 2074, -169 */ - {0x094080C5, 0x80AB0830}, /* -197, 2368, 2096, -171 */ - {0x092980C3, 0x80AE0848}, /* -195, 2345, 2120, -174 */ - {0x091380C1, 0x80B0085E}, /* -193, 2323, 2142, -176 */ - {0x08FC80BE, 0x80B20874}, /* -190, 2300, 2164, -178 */ - {0x08E580BC, 0x80B4088B}, /* -188, 2277, 2187, -180 */ - {0x08D080BB, 0x80B708A2}, /* -187, 2256, 2210, -183 */ - {0x08B980B9, 0x80B908B9}, /* -185, 2233, 2233, -185 */ - {0x08A380B7, 0x80BB08CF}, /* -183, 2211, 2255, -187 */ - {0x088B80B4, 0x80BC08E5}, /* -180, 2187, 2277, -188 */ - {0x087480B2, 0x80BE08FC}, /* -178, 2164, 2300, -190 */ - {0x085E80B0, 0x80C10913}, /* -176, 2142, 2323, -193 */ - {0x084880AE, 0x80C30929}, /* -174, 2120, 2345, -195 */ - {0x083080AB, 0x80C50940}, /* -171, 2096, 2368, -197 */ - {0x081A80A9, 0x80C70956}, /* -169, 2074, 2390, -199 */ - {0x080480A7, 0x80C9096C}, /* -167, 2052, 2412, -201 */ - {0x07ED80A5, 0x80CB0983}, /* -165, 2029, 2435, -203 */ - {0x07D780A2, 0x80CE0999}, /* -162, 2007, 2457, -206 */ - {0x07C080A0, 0x80D009B0}, /* -160, 1984, 2480, -208 */ - {0x07AA809E, 0x80D209C6}, /* -158, 1962, 2502, -210 */ - {0x0793809C, 0x80D409DD}, /* -156, 1939, 2525, -212 */ - {0x077D8099, 0x80D609F2}, /* -153, 1917, 2546, -214 */ - {0x07668097, 0x80D80A09}, /* -151, 1894, 2569, -216 */ - {0x074F8095, 0x80DA0A20}, /* -149, 1871, 2592, -218 */ - {0x073A8093, 0x80DC0A35}, /* -147, 1850, 2613, -220 */ - {0x07238091, 0x80DE0A4C}, /* -145, 1827, 2636, -222 */ - {0x070C808E, 0x80E00A62}, /* -142, 1804, 2658, -224 */ - {0x06F7808C, 0x80E20A77}, /* -140, 1783, 2679, -226 */ - {0x06E0808A, 0x80E40A8E}, /* -138, 1760, 2702, -228 */ - {0x06CA8088, 0x80E60AA4}, /* -136, 1738, 2724, -230 */ - {0x06B48086, 0x80E70AB9}, /* -134, 1716, 2745, -231 */ - {0x069E8084, 0x80E90ACF}, /* -132, 1694, 2767, -233 */ - {0x06878081, 0x80EB0AE5}, /* -129, 1671, 2789, -235 */ - {0x0672807F, 0x80ED0AFA}, /* -127, 1650, 2810, -237 */ - {0x065C807D, 0x80EE0B0F}, /* -125, 1628, 2831, -238 */ - {0x0646807B, 0x80F00B25}, /* -123, 1606, 2853, -240 */ - {0x06308079, 0x80F20B3B}, /* -121, 1584, 2875, -242 */ - {0x061A8077, 0x80F30B50}, /* -119, 1562, 2896, -243 */ - {0x06068076, 0x80F50B65}, /* -118, 1542, 2917, -245 */ - {0x05F08074, 0x80F60B7A}, /* -116, 1520, 2938, -246 */ - {0x05DB8072, 0x80F80B8F}, /* -114, 1499, 2959, -248 */ - {0x05C58070, 0x80F90BA4}, /* -112, 1477, 2980, -249 */ - {0x05B1806E, 0x80FC0BB9}, /* -110, 1457, 3001, -252 */ - {0x059B806C, 0x80FD0BCE}, /* -108, 1435, 3022, -253 */ - {0x0586806A, 0x80FE0BE2}, /* -106, 1414, 3042, -254 */ - {0x05718068, 0x81000BF7}, /* -104, 1393, 3063, -256 */ - {0x055C8066, 0x81010C0B}, /* -102, 1372, 3083, -257 */ - {0x05478064, 0x81020C1F}, /* -100, 1351, 3103, -258 */ - {0x05328062, 0x81030C33}, /* -98, 1330, 3123, -259 */ - {0x051D8060, 0x81040C47}, /* -96, 1309, 3143, -260 */ - {0x0508805E, 0x81050C5B}, /* -94, 1288, 3163, -261 */ - {0x04F3805C, 0x81060C6F}, /* -92, 1267, 3183, -262 */ - {0x04E0805B, 0x81070C82}, /* -91, 1248, 3202, -263 */ - {0x04CB8059, 0x81080C96}, /* -89, 1227, 3222, -264 */ - {0x04B68057, 0x81080CA9}, /* -87, 1206, 3241, -264 */ - {0x04A28055, 0x81090CBC}, /* -85, 1186, 3260, -265 */ - {0x048E8053, 0x810A0CCF}, /* -83, 1166, 3279, -266 */ - {0x047A8052, 0x810A0CE2}, /* -82, 1146, 3298, -266 */ - {0x04668050, 0x810B0CF5}, /* -80, 1126, 3317, -267 */ - {0x0451804E, 0x810B0D08}, /* -78, 1105, 3336, -267 */ - {0x043E804D, 0x810C0D1B}, /* -77, 1086, 3355, -268 */ - {0x042B804B, 0x810C0D2C}, /* -75, 1067, 3372, -268 */ - {0x04178049, 0x810C0D3E}, /* -73, 1047, 3390, -268 */ - {0x04038048, 0x810C0D51}, /* -72, 1027, 3409, -268 */ - {0x03F08046, 0x810C0D62}, /* -70, 1008, 3426, -268 */ - {0x03DD8044, 0x810C0D73}, /* -68, 989, 3443, -268 */ - {0x03CA8043, 0x810C0D85}, /* -67, 970, 3461, -268 */ - {0x03B78041, 0x810C0D96}, /* -65, 951, 3478, -268 */ - {0x03A48040, 0x810C0DA8}, /* -64, 932, 3496, -268 */ - {0x0391803E, 0x810B0DB8}, /* -62, 913, 3512, -267 */ - {0x0380803D, 0x810C0DC9}, /* -61, 896, 3529, -268 */ - {0x036D803B, 0x810C0DDA}, /* -59, 877, 3546, -268 */ - {0x035B803A, 0x810B0DEA}, /* -58, 859, 3562, -267 */ - {0x03488038, 0x810A0DFA}, /* -56, 840, 3578, -266 */ - {0x03368037, 0x810A0E0B}, /* -55, 822, 3595, -266 */ - {0x03248036, 0x81090E1B}, /* -54, 804, 3611, -265 */ - {0x03128034, 0x81080E2A}, /* -52, 786, 3626, -264 */ - {0x03018033, 0x81070E39}, /* -51, 769, 3641, -263 */ - {0x02EF8032, 0x81060E49}, /* -50, 751, 3657, -262 */ - {0x02DE8030, 0x81040E56}, /* -48, 734, 3670, -260 */ - {0x02CC802F, 0x81030E66}, /* -47, 716, 3686, -259 */ - {0x02BB802E, 0x81020E75}, /* -46, 699, 3701, -258 */ - {0x02AA802D, 0x81000E83}, /* -45, 682, 3715, -256 */ - {0x0299802B, 0x80FE0E90}, /* -43, 665, 3728, -254 */ - {0x0288802A, 0x80FD0E9F}, /* -42, 648, 3743, -253 */ - {0x02778029, 0x80FB0EAD}, /* -41, 631, 3757, -251 */ - {0x02678028, 0x80F90EBA}, /* -40, 615, 3770, -249 */ - {0x02568027, 0x80F70EC8}, /* -39, 598, 3784, -247 */ - {0x02468025, 0x80F50ED4}, /* -37, 582, 3796, -245 */ - {0x02368024, 0x80F30EE1}, /* -36, 566, 3809, -243 */ - {0x02268023, 0x80F00EED}, /* -35, 550, 3821, -240 */ - {0x02188023, 0x80EF0EFA}, /* -35, 536, 3834, -239 */ - {0x02078021, 0x80EB0F05}, /* -33, 519, 3845, -235 */ - {0x01F98021, 0x80E90F11}, /* -33, 505, 3857, -233 */ - {0x01EA8020, 0x80E60F1C}, /* -32, 490, 3868, -230 */ - {0x01DC801F, 0x80E40F27}, /* -31, 476, 3879, -228 */ - {0x01CD801E, 0x80E00F31}, /* -30, 461, 3889, -224 */ - {0x01BE801D, 0x80DD0F3C}, /* -29, 446, 3900, -221 */ - {0x01AF801C, 0x80DA0F47}, /* -28, 431, 3911, -218 */ - {0x01A1801B, 0x80D70F51}, /* -27, 417, 3921, -215 */ - {0x0192801A, 0x80D30F5B}, /* -26, 402, 3931, -211 */ - {0x01848019, 0x80CF0F64}, /* -25, 388, 3940, -207 */ - {0x01768018, 0x80CB0F6D}, /* -24, 374, 3949, -203 */ - {0x01688017, 0x80C80F77}, /* -23, 360, 3959, -200 */ - {0x015A8016, 0x80C30F7F}, /* -22, 346, 3967, -195 */ - {0x014D8015, 0x80BF0F87}, /* -21, 333, 3975, -191 */ - {0x013F8015, 0x80BB0F91}, /* -21, 319, 3985, -187 */ - {0x01328014, 0x80B60F98}, /* -20, 306, 3992, -182 */ - {0x01258013, 0x80B20FA0}, /* -19, 293, 4000, -178 */ - {0x01188012, 0x80AD0FA7}, /* -18, 280, 4007, -173 */ - {0x010B8011, 0x80A80FAE}, /* -17, 267, 4014, -168 */ - {0x00FE8010, 0x80A30FB5}, /* -16, 254, 4021, -163 */ - {0x00F28010, 0x809E0FBC}, /* -16, 242, 4028, -158 */ - {0x00E6800F, 0x80990FC2}, /* -15, 230, 4034, -153 */ - {0x00DA800E, 0x80930FC7}, /* -14, 218, 4039, -147 */ - {0x00CE800D, 0x808E0FCD}, /* -13, 206, 4045, -142 */ - {0x00C2800D, 0x80880FD3}, /* -13, 194, 4051, -136 */ - {0x00B6800C, 0x80820FD8}, /* -12, 182, 4056, -130 */ - {0x00AB800B, 0x807C0FDC}, /* -11, 171, 4060, -124 */ - {0x009F800A, 0x80760FE1}, /* -10, 159, 4065, -118 */ - {0x0094800A, 0x80700FE6}, /* -10, 148, 4070, -112 */ - {0x00898009, 0x80690FE9}, /* -9, 137, 4073, -105 */ - {0x007E8008, 0x80630FED}, /* -8, 126, 4077, -99 */ - {0x00748007, 0x805C0FEF}, /* -7, 116, 4079, -92 */ - {0x00698007, 0x80550FF3}, /* -7, 105, 4083, -85 */ - {0x005F8006, 0x804E0FF5}, /* -6, 95, 4085, -78 */ - {0x00558005, 0x80470FF7}, /* -5, 85, 4087, -71 */ - {0x004B8005, 0x80400FFA}, /* -5, 75, 4090, -64 */ - {0x00418004, 0x80380FFB}, /* -4, 65, 4091, -56 */ - {0x00378003, 0x80310FFD}, /* -3, 55, 4093, -49 */ - {0x002E8003, 0x80290FFE}, /* -3, 46, 4094, -41 */ - {0x00238002, 0x80211000}, /* -2, 35, 4096, -33 */ - {0x001A8001, 0x80191000}, /* -1, 26, 4096, -25 */ - {0x00118001, 0x80101000}, /* -1, 17, 4096, -16 */ - {0x00080000, 0x80081000}, /* 0, 8, 4096, -8 */ -}; - -/* CASTLE PLL TABLE */ - -typedef struct tagCASTLEPLL -{ - long frequency; /* 16.16 fixed point frequency */ - unsigned long pll_value; /* MCP DotPLL Register Upper 32(0x0015) */ -} CASTLEPLLENTRY; - -CASTLEPLLENTRY CASTLE_PLLtable[] = { - {0x00192CCC, 0x0000215D}, /* 25.1750 */ - {0x001C526E, 0x0000216C}, /* 28.3220 */ - {0x001C8F5C, 0x0000218D}, /* 28.5600 */ - {0x001F8000, 0x00003147}, /* 31.5000 */ - {0x00240000, 0x00000057}, /* 36.0000 */ - {0x0025E395, 0x0000219A}, /* 37.8890 */ - {0x00280000, 0x00000045}, /* 40.0000 */ - {0x002B29BA, 0x00000089}, /* 43.1630 */ - {0x002CE666, 0x000010E7}, /* 44.9000 */ - {0x002DB851, 0x00002136}, /* 45.7200 */ - {0x00318000, 0x00003207}, /* 49.5000 */ - {0x00320000, 0x00002187}, /* 50.0000 */ - {0x00384000, 0x00004286}, /* 56.2500 */ - {0x003C10A3, 0x000010E5}, /* 60.0650 */ - {0x00410000, 0x00004214}, /* 65.0000 */ - {0x00442DD2, 0x00001105}, /* 68.1790 */ - {0x004B0000, 0x00003183}, /* 75.0000 */ - {0x004EC000, 0x00004284}, /* 78.7500 */ - {0x00519999, 0x00001104}, /* 81.6000 */ - {0x005E8000, 0x00006363}, /* 94.5000 */ - {0x00618560, 0x00005303}, /* 97.5200 */ - {0x00630000, 0x00002523}, /* 99.0000 */ - {0x00640000, 0x000000D1}, /* 100.0000 */ - {0x00642FDF, 0x00002183}, /* 100.1870 */ - {0x00656B85, 0x00002122}, /* 101.4200 */ - {0x006C0000, 0x00001081}, /* 108.0000 */ - {0x00708000, 0x000013E3}, /* 112.5000 */ - {0x00714F1A, 0x00006201}, /* 113.3090 */ - {0x0077A666, 0x00000041}, /* 119.6500 */ - {0x00806666, 0x00000072}, /* 128.4000 */ - {0x00821999, 0x00006382}, /* 130.1000 */ - {0x00858000, 0x00002182}, /* 133.5000 */ - {0x00870000, 0x000041B1}, /* 135.0000 */ - {0x00906147, 0x00000051}, /* 144.3800 */ - {0x009D8000, 0x000062D1}, /* 157.5000 */ - {0x00A20000, 0x000031A1}, /* 162.0000 */ - {0x00A933F7, 0x00000061}, /* 169.2030 */ - {0x00AF8000, 0x00002151}, /* 175.5000 */ - {0x00BD0000, 0x000052E1}, /* 189.0000 */ - {0x00BEF5C2, 0x00000071}, /* 190.9600 */ - {0x00C60000, 0x00003201}, /* 198.0000 */ - {0x00CA8000, 0x00004291}, /* 202.5000 */ - {0x00E58000, 0x00004170}, /* 229.5000 */ -}; - -#define NUM_CASTLE_FREQUENCIES sizeof(CASTLE_PLLtable)/sizeof(CASTLEPLLENTRY) - -/*--------------------------------------------------------------------------- - * gfx_reset_video (PRIVATE ROUTINE: NOT PART OF DURANGO API) - * - * This routine is used to disable all components of video overlay before - * performing a mode switch. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_reset_video(void) -#else -void -gfx_reset_video(void) -#endif -{ - gfx_set_video_enable(0); - gfx_select_alpha_region(1); - gfx_set_alpha_enable(0); - gfx_select_alpha_region(2); - gfx_set_alpha_enable(0); - - /* SET REGION 0 AFTER RESET */ - - gfx_select_alpha_region(0); - gfx_set_alpha_enable(0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_display_control (PRIVATE ROUTINE: NOT PART OF DURANGO API) - * - * This routine configures the display output. - * - * "sync_polarities" is used to set the polarities of the sync pulses - * according to the following mask: - * - * Bit 0: If set to 1, negative horizontal polarity is programmed, - * otherwise positive horizontal polarity is programmed. - * Bit 1: If set to 1, negative vertical polarity is programmed, - * otherwise positive vertical polarity is programmed. - * - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_display_control(int sync_polarities) -#else -int -gfx_set_display_control(int sync_polarities) -#endif -{ - unsigned long power; - unsigned long dcfg; - - /* CONFIGURE DISPLAY OUTPUT FROM VIDEO PROCESSOR */ - - dcfg = READ_VID32(CASTLE_DISPLAY_CONFIG); - dcfg &= ~(CASTLE_DCFG_CRT_SYNC_SKW_MASK | CASTLE_DCFG_PWR_SEQ_DLY_MASK | - CASTLE_DCFG_CRT_HSYNC_POL | CASTLE_DCFG_CRT_VSYNC_POL); - - dcfg |= (CASTLE_DCFG_CRT_SYNC_SKW_INIT | - CASTLE_DCFG_PWR_SEQ_DLY_INIT | CASTLE_DCFG_GV_PAL_BYP); - - if (PanelEnable) { - power = READ_VID32(CASTLE_POWER_MANAGEMENT); - power |= CASTLE_PM_PANEL_POWER_ON; - WRITE_VID32(CASTLE_POWER_MANAGEMENT, power); - } - - /* SET APPROPRIATE SYNC POLARITIES */ - - if (sync_polarities & 0x1) - dcfg |= CASTLE_DCFG_CRT_HSYNC_POL; - if (sync_polarities & 0x2) - dcfg |= CASTLE_DCFG_CRT_VSYNC_POL; - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, dcfg); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_clock_frequency - * - * This routine sets the clock frequency, specified as a 16.16 fixed point - * value (0x00318000 = 49.5 MHz). It will set the closest frequency found - * in the lookup table. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_set_clock_frequency(unsigned long frequency) -#else -void -gfx_set_clock_frequency(unsigned long frequency) -#endif -{ - Q_WORD msr_value; - unsigned int i, index = 0; - unsigned long value; - unsigned long unlock; - long timeout; - long min, diff; - - /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ - /* Search the table for the closest frequency (16.16 format). */ - - value = CASTLE_PLLtable[0].pll_value; - min = (long)CASTLE_PLLtable[0].frequency - frequency; - if (min < 0L) - min = -min; - for (i = 1; i < NUM_CASTLE_FREQUENCIES; i++) { - diff = (long)CASTLE_PLLtable[i].frequency - frequency; - if (diff < 0L) - diff = -diff; - if (diff < min) { - min = diff; - index = i; - } - } - - /* VERIFY THAT WE ARE NOT WRITING WHAT IS ALREADY IN THE REGISTERS */ - /* The Dot PLL reset bit is tied to VDD for flat panels. This can */ - /* cause a brief drop in flat panel power, which can cause serious */ - /* glitches on some panels. */ - - gfx_msr_read(RC_ID_MCP, MCP_DOTPLL, &msr_value); - - if ((msr_value.low & MCP_DOTPLL_LOCK) && - ((msr_value.low & MCP_DOTPLL_HALFPIX) == 0) && - (msr_value.high == CASTLE_PLLtable[index].pll_value)) { - return; - } - - /* PROGRAM THE SETTINGS WITH THE RESET BIT SET */ - /* Clear the bypass bit to ensure that the programmed */ - /* M, N and P values are being used. */ - - msr_value.high = CASTLE_PLLtable[index].pll_value; - msr_value.low |= 0x00000001; - msr_value.low &= ~MCP_DOTPLL_BYPASS; - gfx_msr_write(RC_ID_MCP, MCP_DOTPLL, &msr_value); - - /* WAIT FOR THE LOCK BIT */ - /* The official word from LEDA is that the PLL may take up to 100 */ - /* us to lock and the lock bit is unreliable. We thus add a long */ - /* delay followed by a timed-out poll */ - - unlock = READ_REG32(DC3_UNLOCK); - for (timeout = 0; timeout < 1280; timeout++) - WRITE_REG32(DC3_UNLOCK, unlock); - - for (timeout = 0; timeout < 1000; timeout++) { - gfx_msr_read(RC_ID_MCP, MCP_DOTPLL, &msr_value); - if (msr_value.low & MCP_DOTPLL_LOCK) - break; - } - - /* CLEAR THE RESET BIT */ - - msr_value.low &= 0xFFFFFFFE; - gfx_msr_write(RC_ID_MCP, MCP_DOTPLL, &msr_value); -} - -/*--------------------------------------------------------------------------- - * gfx_set_crt_enable - * - * This routine enables or disables the CRT output from the video processor. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_crt_enable(int enable) -#else -int -gfx_set_crt_enable(int enable) -#endif -{ - unsigned long config, misc; - - config = READ_VID32(CASTLE_DISPLAY_CONFIG); - misc = READ_VID32(CASTLE_VID_MISC); - - switch (enable) { - case CRT_DISABLE: /* DISABLE EVERYTHING */ - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, - config & ~(CASTLE_DCFG_DIS_EN | CASTLE_DCFG_HSYNC_EN | - CASTLE_DCFG_VSYNC_EN | CASTLE_DCFG_DAC_BL_EN)); - WRITE_VID32(CASTLE_VID_MISC, misc | CASTLE_DAC_POWER_DOWN); - break; - - case CRT_ENABLE: /* ENABLE CRT DISPLAY, INCLUDING DISPLAY LOGIC */ - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, - config | CASTLE_DCFG_DIS_EN | CASTLE_DCFG_HSYNC_EN | - CASTLE_DCFG_VSYNC_EN | CASTLE_DCFG_DAC_BL_EN); - WRITE_VID32(CASTLE_VID_MISC, - misc & ~CASTLE_DAC_POWER_DOWN & ~CASTLE_ANALOG_POWER_DOWN); - break; - - case CRT_STANDBY: /* HSYNC:OFF VSYNC:ON */ - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, - (config & ~(CASTLE_DCFG_DIS_EN | CASTLE_DCFG_HSYNC_EN | - CASTLE_DCFG_DAC_BL_EN)) | CASTLE_DCFG_VSYNC_EN); - WRITE_VID32(CASTLE_VID_MISC, misc | CASTLE_DAC_POWER_DOWN); - break; - - case CRT_SUSPEND: /* HSYNC:ON VSYNC:OFF */ - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, - (config & ~(CASTLE_DCFG_DIS_EN | CASTLE_DCFG_VSYNC_EN | - CASTLE_DCFG_DAC_BL_EN)) | CASTLE_DCFG_HSYNC_EN); - WRITE_VID32(CASTLE_VID_MISC, misc | CASTLE_DAC_POWER_DOWN); - break; - - default: - return (GFX_STATUS_BAD_PARAMETER); - } - return (GFX_STATUS_OK); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_enable - * - * This routine enables or disables the video overlay functionality. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_enable(int enable) -#else -int -gfx_set_video_enable(int enable) -#endif -{ - unsigned long vcfg; - - /* WAIT FOR VERTICAL BLANK TO START */ - /* Otherwise a glitch can be observed. */ - - if (gfx_test_timing_active()) { - if (!gfx_test_vertical_active()) { - while (!gfx_test_vertical_active()) ; - } - while (gfx_test_vertical_active()) ; - } - - vcfg = READ_VID32(CASTLE_VIDEO_CONFIG); - if (enable) { - /* ENABLE VIDEO OVERLAY FROM DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_enable(1); - - /* ENABLE DISPLAY FILTER VIDEO OVERLAY */ - - vcfg |= CASTLE_VCFG_VID_EN; - WRITE_VID32(CASTLE_VIDEO_CONFIG, vcfg); - } else { - /* DISABLE DISPLAY FILTER VIDEO OVERLAY */ - - vcfg &= ~CASTLE_VCFG_VID_EN; - WRITE_VID32(CASTLE_VIDEO_CONFIG, vcfg); - - /* DISABLE VIDEO OVERLAY FROM DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_enable(0); - } - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_format - * - * Sets input video format type, to one of the YUV formats or to RGB. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_format(unsigned long format) -#else -int -gfx_set_video_format(unsigned long format) -#endif -{ - unsigned long ctrl, vcfg = 0; - - /* SET THE DISPLAY FILTER VIDEO INPUT FORMAT */ - - vcfg = READ_VID32(CASTLE_VIDEO_CONFIG); - ctrl = READ_VID32(CASTLE_VID_ALPHA_CONTROL); - ctrl &= - ~(CASTLE_VIDEO_INPUT_IS_RGB | CASTLE_CSC_VIDEO_YUV_TO_RGB | - CASTLE_CSC_GRAPHICS_RGB_TO_YUV); - vcfg &= ~(CASTLE_VCFG_VID_INP_FORMAT | CASTLE_VCFG_4_2_0_MODE); - switch (format) { - case VIDEO_FORMAT_UYVY: - vcfg |= CASTLE_VCFG_UYVY_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - break; - case VIDEO_FORMAT_YUYV: - vcfg |= CASTLE_VCFG_YUYV_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - break; - case VIDEO_FORMAT_Y2YU: - vcfg |= CASTLE_VCFG_Y2YU_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - break; - case VIDEO_FORMAT_YVYU: - vcfg |= CASTLE_VCFG_YVYU_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - break; - case VIDEO_FORMAT_Y0Y1Y2Y3: - vcfg |= CASTLE_VCFG_UYVY_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - vcfg |= CASTLE_VCFG_4_2_0_MODE; - break; - case VIDEO_FORMAT_Y3Y2Y1Y0: - vcfg |= CASTLE_VCFG_Y2YU_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - vcfg |= CASTLE_VCFG_4_2_0_MODE; - break; - case VIDEO_FORMAT_Y1Y0Y3Y2: - vcfg |= CASTLE_VCFG_YUYV_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - vcfg |= CASTLE_VCFG_4_2_0_MODE; - break; - case VIDEO_FORMAT_Y1Y2Y3Y0: - vcfg |= CASTLE_VCFG_YVYU_FORMAT; - ctrl |= CASTLE_CSC_VIDEO_YUV_TO_RGB; - vcfg |= CASTLE_VCFG_4_2_0_MODE; - break; - case VIDEO_FORMAT_RGB: - ctrl |= CASTLE_VIDEO_INPUT_IS_RGB; - vcfg |= CASTLE_VCFG_UYVY_FORMAT; - break; - case VIDEO_FORMAT_P2M_P2L_P1M_P1L: - ctrl |= CASTLE_VIDEO_INPUT_IS_RGB; - vcfg |= CASTLE_VCFG_Y2YU_FORMAT; - break; - case VIDEO_FORMAT_P1M_P1L_P2M_P2L: - ctrl |= CASTLE_VIDEO_INPUT_IS_RGB; - vcfg |= CASTLE_VCFG_YUYV_FORMAT; - break; - case VIDEO_FORMAT_P1M_P2L_P2M_P1L: - ctrl |= CASTLE_VIDEO_INPUT_IS_RGB; - vcfg |= CASTLE_VCFG_YVYU_FORMAT; - break; - default: - return GFX_STATUS_BAD_PARAMETER; - } - WRITE_VID32(CASTLE_VIDEO_CONFIG, vcfg); - WRITE_VID32(CASTLE_VID_ALPHA_CONTROL, ctrl); - - /* SET THE VIDEO FORMAT IN THE DISPLAY CONTROLLER */ - /* Use private routine to abstract display controller. */ - - gfx_set_display_video_format(format); - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_size - * - * This routine specifies the size of the source data. It is used only - * to determine how much data to transfer per frame, and is not used to - * calculate the scaling value (that is handled by a separate routine). - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_size(unsigned short width, unsigned short height) -#else -int -gfx_set_video_size(unsigned short width, unsigned short height) -#endif -{ - unsigned long size, vcfg, vid_420, pitch, scale; - - /* SET THE DISPLAY FILTER VIDEO LINE SIZE */ - /* Match the DC hardware alignment requirement. The line size must */ - /* always be 32-byte aligned. However, we can manage smaller */ - /* alignments by decreasing the pitch and clipping the video window. */ - /* The VG will fetch extra data for each line, but the decreased */ - /* pitch will ensure that it always begins fetching at the start of */ - /* the video line. */ - - vcfg = READ_VID32(CASTLE_VIDEO_CONFIG); - - vid_420 = vcfg & CASTLE_VCFG_4_2_0_MODE; - - vcfg &= - ~(CASTLE_VCFG_LINE_SIZE_LOWER_MASK | CASTLE_VCFG_LINE_SIZE_UPPER | - CASTLE_VCFG_LINE_SIZE_BIT9); - - size = ((width >> 1) + 7) & 0xFFF8; - pitch = ((width << 1) + 7) & 0xFFF8; - - vcfg |= (size & 0x00FF) << 8; - if (size & 0x0100) - vcfg |= CASTLE_VCFG_LINE_SIZE_UPPER; - if (size & 0x0200) - vcfg |= CASTLE_VCFG_LINE_SIZE_BIT9; - WRITE_VID32(CASTLE_VIDEO_CONFIG, vcfg); - - /* WRITE THE VIDEO HEIGHT */ - - scale = READ_VID32(CASTLE_VIDEO_SCALER); - scale = (scale & ~0x7FF) | height; - WRITE_VID32(CASTLE_VIDEO_SCALER, scale); - - /* SET VIDEO BUFFER LINE SIZE IN DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_size(width, height); - - /* SET VIDEO PITCH */ - /* We are only maintaining legacy for 4:2:2 video formats. */ - /* 4:2:0 video in previous chips was inadequate for most */ - /* common video formats. */ - - if (!vid_420) - gfx_set_video_yuv_pitch(pitch, pitch << 1); - - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_offset - * - * This routine sets the starting offset for the video buffer when only - * one offset needs to be specified. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_offset(unsigned long offset) -#else -int -gfx_set_video_offset(unsigned long offset) -#endif -{ - /* SAVE VALUE FOR FUTURE CLIPPING OF THE TOP OF THE VIDEO WINDOW */ - - gfx_vid_offset = offset; - - /* SET VIDEO BUFFER OFFSET IN DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_offset(offset); - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_yuv_offsets - * - * This routine sets the starting offset for the video buffer when displaying - * 4:2:0 video. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_yuv_offsets(unsigned long yoffset, unsigned long uoffset, - unsigned long voffset) -#else -int -gfx_set_video_yuv_offsets(unsigned long yoffset, unsigned long uoffset, - unsigned long voffset) -#endif -{ - /* SAVE VALUE FOR FUTURE CLIPPING OF THE TOP OF THE VIDEO WINDOW */ - - gfx_vid_offset = yoffset; - gfx_vid_uoffset = uoffset; - gfx_vid_voffset = voffset; - - /* SET VIDEO BUFFER OFFSET IN DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_yuv_offsets(yoffset, uoffset, voffset); - - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_set_video_yuv_pitch - * - * This routine sets the byte offset between consecutive scanlines of YUV video data - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) -#else -int -gfx_set_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) -#endif -{ - /* SET VIDEO PITCH IN DISPLAY CONTROLLER */ - /* Use private routine to abstract the display controller. */ - - gfx_set_display_video_yuv_pitch(ypitch, uvpitch); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_scale - * - * This routine sets the scale factor for the video overlay window. The - * size of the source and destination regions are specified in pixels. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_scale(unsigned short srcw, unsigned short srch, - unsigned short dstw, unsigned short dsth) -#else -int -gfx_set_video_scale(unsigned short srcw, unsigned short srch, - unsigned short dstw, unsigned short dsth) -#endif -{ - unsigned long xscale, yscale, i; - unsigned long scale; - unsigned long temp; - - /* SAVE PARAMETERS */ - /* These are needed for clipping the video window later. Zero */ - /* values indicate that the corresponding scale value should */ - /* not be changed. */ - - if (dstw != 0) { - gfx_vid_srcw = srcw; - gfx_vid_dstw = dstw; - } - if (dsth != 0) { - gfx_vid_srch = srch; - gfx_vid_dsth = dsth; - } - - /* CALCULATE DISPLAY FILTER SCALE FACTORS */ - /* Zero width and height indicate don't care conditions */ - - if (dstw != 0) { - if (dstw <= srcw) - xscale = 0x10000; - else - xscale = (0x10000 * (unsigned long)srcw) / (unsigned long)dstw; - - WRITE_VID32(CASTLE_VIDEO_XSCALE, xscale); - } - if (dsth != 0) { - if (dsth <= srch) - yscale = 0x10000; - else - yscale = (0x10000 * (unsigned long)srch) / (unsigned long)dsth; - - WRITE_VID32(CASTLE_VIDEO_YSCALE, yscale); - } - - /* ENABLE OR DISABLE FILTERING */ - - temp = READ_VID32(CASTLE_VIDEO_CONFIG); - if (READ_VID32(CASTLE_VIDEO_XSCALE) == 0x10000 && - READ_VID32(CASTLE_VIDEO_YSCALE) == 0x10000) { - WRITE_VID32(CASTLE_VIDEO_CONFIG, (temp | CASTLE_VCFG_SC_BYP)); - } else { - scale = READ_VID32(CASTLE_VIDEO_SCALER); - - WRITE_VID32(CASTLE_VIDEO_SCALER, scale & ~CASTLE_SCALE_128_PHASES); - WRITE_VID32(CASTLE_VIDEO_CONFIG, (temp & ~CASTLE_VCFG_SC_BYP)); - - /* PROGRAM THE COEFFICIENTS */ - - for (i = 0; i < 256; i++) { - WRITE_VID32((CASTLE_COEFFICIENT_BASE + (i << 3)), - DurangoVideoFilter[i][0]); - WRITE_VID32((CASTLE_COEFFICIENT_BASE + (i << 3) + 4), - DurangoVideoFilter[i][1]); - } - } - /* CALL ROUTINE TO UPDATE WINDOW POSITION */ - /* This is required because the scale values affect the number of */ - /* source data pixels that need to be clipped, as well as the */ - /* amount of data that needs to be transferred. */ - - gfx_set_video_window(gfx_vid_xpos, gfx_vid_ypos, gfx_vid_width, - gfx_vid_height); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_window - * - * This routine sets the position and size of the video overlay window. The - * x and y positions are specified in screen relative coordinates, and may be - * negative. - * The size of destination region is specified in pixels. The line size - * indicates the number of bytes of source data per scanline. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_window(short x, short y, unsigned short w, unsigned short h) -#else -int -gfx_set_video_window(short x, short y, unsigned short w, unsigned short h) -#endif -{ - unsigned long hadjust, vadjust; - unsigned long xstart, ystart, xend, yend; - unsigned long lock; - - lock = READ_REG32(DC3_UNLOCK); - - /* SAVE PARAMETERS */ - /* These are needed to call this routine if the scale value changes. */ - - gfx_vid_xpos = x; - gfx_vid_ypos = y; - gfx_vid_width = w; - gfx_vid_height = h; - - /* GET ADJUSTMENT VALUES */ - /* Use routines to abstract version of display controller. */ - - hadjust = gfx_get_htotal() - gfx_get_hsync_end() - 14l; - vadjust = gfx_get_vtotal() - gfx_get_vsync_end() + 1l; - - /* LEFT CLIPPING */ - - if (x < 0) { - gfx_set_video_left_crop((unsigned short)(-x)); - xstart = hadjust; - } else { - gfx_set_video_left_crop(0); - xstart = (unsigned long)x + hadjust; - } - - /* HORIZONTAL END */ - /* End positions in register are non-inclusive (one more than the actual - * end) */ - - if ((x + w) < gfx_get_hactive()) - xend = (unsigned long)x + (unsigned long)w + hadjust; - - /* RIGHT-CLIPPING */ - else - xend = (unsigned long)gfx_get_hactive() + hadjust; - - /* VERTICAL START */ - - ystart = (unsigned long)y + vadjust; - - /* VERTICAL END */ - - if ((y + h) < gfx_get_vactive()) - yend = (unsigned long)y + (unsigned long)h + vadjust; - - /* BOTTOM-CLIPPING */ - else - yend = (unsigned long)gfx_get_vactive() + vadjust; - - /* SET VIDEO POSITION */ - - WRITE_VID32(CASTLE_VIDEO_X_POS, (xend << 16) | xstart); - WRITE_VID32(CASTLE_VIDEO_Y_POS, (yend << 16) | ystart); - - /* SET COLOR KEY REGION */ - - WRITE_REG32(DC3_UNLOCK, DC3_UNLOCK_VALUE); - WRITE_REG32(DC3_COLOR_KEY_X, - ((xend - hadjust) << 16) | (xstart - hadjust)); - WRITE_REG32(DC3_COLOR_KEY_Y, - ((yend - vadjust) << 16) | (ystart - vadjust)); - WRITE_REG32(DC3_UNLOCK, lock); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_left_crop - * - * This routine sets the number of pixels which will be cropped from the - * beginning of each video line. The video window will begin to display only - * from the pixel following the cropped pixels, and the cropped pixels - * will be ignored. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_left_crop(unsigned short x) -#else -int -gfx_set_video_left_crop(unsigned short x) -#endif -{ - unsigned long vcfg, initread; - - vcfg = READ_VID32(CASTLE_VIDEO_CONFIG) & ~CASTLE_VCFG_INIT_READ_MASK; - - /* CLIPPING ON LEFT */ - /* Adjust initial read for scale, checking for divide by zero. All video */ - /* formats must be clipped on a 4-pixel boundary */ - - if (gfx_vid_dstw) { - initread = (unsigned long)x *gfx_vid_srcw / gfx_vid_dstw; - } else - initread = 0; - - /* SET INITIAL READ ADDRESS */ - - vcfg = vcfg | ((initread << 14) & CASTLE_VCFG_INIT_READ_MASK); - WRITE_VID32(CASTLE_VIDEO_CONFIG, vcfg); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_color_key - * - * This routine specifies the color key value and mask for the video overlay - * hardware. To disable color key, the color and mask should both be set to - * zero. The hardware uses the color key in the following equation: - * - * ((source data) & (color key mask)) == ((color key) & (color key mask)) - * - * If "graphics" is set to TRUE, the source data is graphics, and color key - * is an RGB value. If "graphics" is set to FALSE, the source data is video, - * and the color key is an RGB value that is compared to the video data after - * it has gone through color space conversion (CSC). - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_color_key(unsigned long key, unsigned long mask, - int graphics) -#else -int -gfx_set_video_color_key(unsigned long key, unsigned long mask, int graphics) -#endif -{ - unsigned long dcfg; - - /* ENABLE OR DISABLE COLOR KEY LOGIC IN THE DISPLAY CONTROLLER */ - /* When chroma key is enabled, the color key logic should be */ - /* disabled in the VG to allow for per-pixel alpha blending. */ - - gfx_set_display_video_color_key(key, mask, graphics); - - dcfg = READ_VID32(CASTLE_DISPLAY_CONFIG); - - if (graphics) - dcfg &= ~CASTLE_DCFG_VG_CK; - else - dcfg |= CASTLE_DCFG_VG_CK; - - WRITE_VID32(CASTLE_DISPLAY_CONFIG, dcfg); - WRITE_VID32(CASTLE_VIDEO_COLOR_KEY, key & 0xFFFFFF); - WRITE_VID32(CASTLE_VIDEO_COLOR_MASK, mask & 0xFFFFFF); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_palette - * - * This routine loads the video hardware palette. If a NULL pointer is - * specified, the palette is bypassed (for Castle, this means loading the - * palette with identity values). - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_palette(unsigned long *palette) -#else -int -gfx_set_video_palette(unsigned long *palette) -#endif -{ - unsigned long i, entry; - - /* LOAD CASTLE VIDEO PALETTE */ - - WRITE_VID32(CASTLE_PALETTE_ADDRESS, 0); - for (i = 0; i < 256; i++) { - if (palette) - entry = palette[i]; - else - entry = i | (i << 8) | (i << 16); - WRITE_VID32(CASTLE_PALETTE_DATA, entry); - } - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_palette_entry - * - * This routine loads a single entry of the video hardware palette. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_palette_entry(unsigned long index, unsigned long palette) -#else -int -gfx_set_video_palette_entry(unsigned long index, unsigned long palette) -#endif -{ - if (index > 0xFF) - return GFX_STATUS_BAD_PARAMETER; - - /* SET A SINGLE ENTRY */ - - WRITE_VID32(CASTLE_PALETTE_ADDRESS, index); - WRITE_VID32(CASTLE_PALETTE_DATA, palette); - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_request() - * - * This routine sets the horizontal (pixel) and vertical (line) video request - * values. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_request(short x, short y) -#else -int -gfx_set_video_request(short x, short y) -#endif -{ - /* SET DISPLAY FILTER VIDEO REQUEST */ - - x += gfx_get_htotal() - gfx_get_hsync_end() - 2; - y += gfx_get_vtotal() - gfx_get_vsync_end() + 1; - - if ((x < 0) || (x > CASTLE_VIDEO_REQUEST_MASK) || - (y < 0) || (y > CASTLE_VIDEO_REQUEST_MASK)) - return GFX_STATUS_BAD_PARAMETER; - - WRITE_VID32(CASTLE_VIDEO_REQUEST, - ((unsigned long)x << CASTLE_VIDEO_X_REQUEST_POS) | ((unsigned long)y - << CASTLE_VIDEO_Y_REQUEST_POS)); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_cursor() - * - * This routine configures the video hardware cursor. - * If the "mask"ed bits in the graphics pixel match "key", then either - * "color1"or "color2" will be used for this pixel, according to the value of - * bit number "select_color2" of the graphics pixel. - * - * key - 24 bit RGB value - * mask - 24 bit mask - * color1, color2 - RGB or YUV, depending on the current color space - * conversion select_color2 - value between 0 to 23 - * - * To disable match, a "mask" and "key" value of 0xffffff should be set, - * because the graphics pixels incoming to the video processor have maximum 16 - * bits set (0xF8FCF8). - * - * This feature is useful for disabling alpha blending of the cursor. - * Otherwise cursor image would be blurred (or completely invisible if video - * alpha is maximum value). - * Note: the cursor pixel replacements take place both inside and outside the - * video overlay window. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_cursor(unsigned long key, unsigned long mask, - unsigned short select_color2, unsigned long color1, unsigned long color2) -#else -int -gfx_set_video_cursor(unsigned long key, unsigned long mask, - unsigned short select_color2, unsigned long color1, unsigned long color2) -#endif -{ - if (select_color2 > CASTLE_CURSOR_COLOR_BITS) - return GFX_STATUS_BAD_PARAMETER; - key = - (key & CASTLE_COLOR_MASK) | ((unsigned long)select_color2 << - CASTLE_CURSOR_COLOR_KEY_OFFSET_POS); - WRITE_VID32(CASTLE_CURSOR_COLOR_KEY, key); - WRITE_VID32(CASTLE_CURSOR_COLOR_MASK, mask); - WRITE_VID32(CASTLE_CURSOR_COLOR_1, color1); - WRITE_VID32(CASTLE_CURSOR_COLOR_2, color2); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_video_cursor_enable() - * - * This routine enables or disables the cursor color key mechanism. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_video_cursor_enable(int enable) -#else -int -gfx_set_video_cursor_enable(int enable) -#endif -{ - unsigned long temp = READ_VID32(CASTLE_CURSOR_COLOR_KEY); - - if (enable) - temp |= CASTLE_CURSOR_COLOR_KEY_ENABLE; - else - temp &= ~CASTLE_CURSOR_COLOR_KEY_ENABLE; - - WRITE_VID32(CASTLE_CURSOR_COLOR_KEY, temp); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_enable - * - * This routine enables or disables the currently selected alpha region. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_enable(int enable) -#else -int -gfx_set_alpha_enable(int enable) -#endif -{ - unsigned long address = 0, value = 0; - - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - address = CASTLE_ALPHA_CONTROL_1 + ((unsigned long)gfx_alpha_select << 5); - value = READ_VID32(address); - if (enable) - value |= CASTLE_ACTRL_WIN_ENABLE; - else - value &= ~(CASTLE_ACTRL_WIN_ENABLE); - WRITE_VID32(address, value); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_window - * - * This routine sets the size of the currently selected alpha region. - * Note: "x" and "y" are signed to enable using negative values needed for - * implementing workarounds of hardware issues. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_window(short x, short y, - unsigned short width, unsigned short height) -#else -int -gfx_set_alpha_window(short x, short y, - unsigned short width, unsigned short height) -#endif -{ - unsigned long address = 0; - - /* CHECK FOR CLIPPING */ - - if ((x + width) > gfx_get_hactive()) - width = gfx_get_hactive() - x; - if ((y + height) > gfx_get_vactive()) - height = gfx_get_vactive() - y; - - /* ADJUST POSITIONS */ - - x += gfx_get_htotal() - gfx_get_hsync_end() - 2; - y += gfx_get_vtotal() - gfx_get_vsync_end() + 1; - - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - address = CASTLE_ALPHA_XPOS_1 + ((unsigned long)gfx_alpha_select << 5); - - /* END POSITIONS IN REGISTERS ARE NON-INCLUSIVE (ONE MORE THAN ACTUAL END) - * */ - - WRITE_VID32(address, (unsigned long)x | - ((unsigned long)(x + width) << 16)); - WRITE_VID32(address + 8, (unsigned long)y | - ((unsigned long)(y + height) << 16)); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_value - * - * This routine sets the alpha value for the currently selected alpha - * region. It also specifies an increment/decrement value for fading. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_value(unsigned char alpha, char delta) -#else -int -gfx_set_alpha_value(unsigned char alpha, char delta) -#endif -{ - unsigned long address = 0, value = 0; - - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - address = CASTLE_ALPHA_CONTROL_1 + ((unsigned long)gfx_alpha_select << 5); - value = READ_VID32(address); - value &= CASTLE_ACTRL_WIN_ENABLE; /* keep only enable bit */ - value |= (unsigned long)alpha; - value |= (((unsigned long)delta) & 0xff) << 8; - value |= CASTLE_ACTRL_LOAD_ALPHA; - WRITE_VID32(address, value); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_priority - * - * This routine sets the priority of the currently selected alpha region. - * A higher value indicates a higher priority. - * Note: Priority of enabled alpha windows must be different. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_priority(int priority) -#else -int -gfx_set_alpha_priority(int priority) -#endif -{ - unsigned long pos = 0, value = 0; - - if (priority > 3) - return (GFX_STATUS_BAD_PARAMETER); - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - value = READ_VID32(CASTLE_VID_ALPHA_CONTROL); - pos = 16 + (gfx_alpha_select << 1); - value &= ~(0x03l << pos); - value |= (unsigned long)priority << pos; - WRITE_VID32(CASTLE_VID_ALPHA_CONTROL, value); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_color - * - * This routine sets the color to be displayed inside the currently selected - * alpha window when there is a color key match (when the alpha color - * mechanism is enabled). - * "color" is an RGB value (for RGB blending) or a YUV value (for YUV - * blending). - * In Interlaced YUV blending mode, Y/2 value should be used. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_color(unsigned long color) -#else -int -gfx_set_alpha_color(unsigned long color) -#endif -{ - unsigned long address = 0; - - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - address = CASTLE_ALPHA_COLOR_1 + ((unsigned long)gfx_alpha_select << 5); - WRITE_VID32(address, color); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_alpha_color_enable - * - * Enable or disable the color mechanism in the alpha window. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_alpha_color_enable(int enable) -#else -int -gfx_set_alpha_color_enable(int enable) -#endif -{ - unsigned long color; - unsigned long address = 0; - - if (gfx_alpha_select > 2) - return (GFX_STATUS_UNSUPPORTED); - address = CASTLE_ALPHA_COLOR_1 + ((unsigned long)gfx_alpha_select << 5); - color = READ_VID32(address); - if (enable) - color |= CASTLE_ALPHA_COLOR_ENABLE; - else - color &= ~CASTLE_ALPHA_COLOR_ENABLE; - WRITE_VID32(address, color); - return (GFX_STATUS_OK); -} - -/*--------------------------------------------------------------------------- - * gfx_set_no_ck_outside_alpha - * - * This function affects where inside the video window color key or chroma - * key comparison is done: - * If enable is TRUE, color/chroma key comparison is performed only inside - * the enabled alpha windows. Outside the (enabled) alpha windows, only video - * is displayed if color key is used, and only graphics is displayed if chroma - * key is used. - * If enable is FALSE, color/chroma key comparison is performed in all the - * video window area. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_set_no_ck_outside_alpha(int enable) -#else -int -gfx_set_no_ck_outside_alpha(int enable) -#endif -{ - unsigned long value; - - value = READ_VID32(CASTLE_VID_ALPHA_CONTROL); - if (enable) - WRITE_VID32(CASTLE_VID_ALPHA_CONTROL, - value | CASTLE_NO_CK_OUTSIDE_ALPHA); - else - WRITE_VID32(CASTLE_VID_ALPHA_CONTROL, - value & ~CASTLE_NO_CK_OUTSIDE_ALPHA); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_get_clock_frequency - * - * This routine returns the current clock frequency in 16.16 format. - * It reads the current register value and finds the match in the table. - * If no match is found, this routine returns 0. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_clock_frequency(void) -#else -unsigned long -gfx_get_clock_frequency(void) -#endif -{ - Q_WORD msr_value; - unsigned int index; - unsigned long value, mask = 0x00001FFF; - - /* READ PLL SETTING */ - - gfx_msr_read(RC_ID_MCP, MCP_DOTPLL, &msr_value); - value = msr_value.high & mask; - - /* SEARCH FOR A MATCH */ - - for (index = 0; index < NUM_CASTLE_FREQUENCIES; index++) { - if ((CASTLE_PLLtable[index].pll_value & mask) == value) - return (CASTLE_PLLtable[index].frequency); - } - return (0); -} - -/*************************************************************/ -/* READ ROUTINES | INCLUDED FOR DIAGNOSTIC PURPOSES ONLY */ -/*************************************************************/ - -#if GFX_READ_ROUTINES - -/*--------------------------------------------------------------------------- - * gfx_get_sync_polarities - * - * This routine returns the polarities of the sync pulses: - * Bit 0: Set if negative horizontal polarity. - * Bit 1: Set if negative vertical polarity. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_sync_polarities(void) -#else -int -gfx_get_sync_polarities(void) -#endif -{ - int polarities = 0; - - if (READ_VID32(CASTLE_DISPLAY_CONFIG) & CASTLE_DCFG_CRT_HSYNC_POL) - polarities |= 1; - if (READ_VID32(CASTLE_DISPLAY_CONFIG) & CASTLE_DCFG_CRT_VSYNC_POL) - polarities |= 2; - return (polarities); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_palette_entry - * - * This routine returns a single palette entry. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_palette_entry(unsigned long index, unsigned long *palette) -#else -int -gfx_get_video_palette_entry(unsigned long index, unsigned long *palette) -#endif -{ - if (index > 0xFF) - return GFX_STATUS_BAD_PARAMETER; - - /* READ A SINGLE ENTRY */ - - WRITE_VID32(CASTLE_PALETTE_ADDRESS, index); - *palette = READ_VID32(CASTLE_PALETTE_DATA); - - return (GFX_STATUS_OK); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_enable - * - * This routine returns the value "one" if video overlay is currently enabled, - * otherwise it returns the value "zero". - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_enable(void) -#else -int -gfx_get_video_enable(void) -#endif -{ - if (READ_VID32(CASTLE_VIDEO_CONFIG) & CASTLE_VCFG_VID_EN) - return (1); - return (0); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_format - * - * This routine returns the current video overlay format. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_format(void) -#else -int -gfx_get_video_format(void) -#endif -{ - unsigned long ctrl, vcfg; - - ctrl = READ_VID32(CASTLE_VID_ALPHA_CONTROL); - vcfg = READ_VID32(CASTLE_VIDEO_CONFIG); - - if (ctrl & CASTLE_VIDEO_INPUT_IS_RGB) { - switch (vcfg & CASTLE_VCFG_VID_INP_FORMAT) { - case CASTLE_VCFG_UYVY_FORMAT: - return VIDEO_FORMAT_RGB; - case CASTLE_VCFG_Y2YU_FORMAT: - return VIDEO_FORMAT_P2M_P2L_P1M_P1L; - case CASTLE_VCFG_YUYV_FORMAT: - return VIDEO_FORMAT_P1M_P1L_P2M_P2L; - case CASTLE_VCFG_YVYU_FORMAT: - return VIDEO_FORMAT_P1M_P2L_P2M_P1L; - } - } - - if (vcfg & CASTLE_VCFG_4_2_0_MODE) { - switch (vcfg & CASTLE_VCFG_VID_INP_FORMAT) { - case CASTLE_VCFG_UYVY_FORMAT: - return VIDEO_FORMAT_Y0Y1Y2Y3; - case CASTLE_VCFG_Y2YU_FORMAT: - return VIDEO_FORMAT_Y3Y2Y1Y0; - case CASTLE_VCFG_YUYV_FORMAT: - return VIDEO_FORMAT_Y1Y0Y3Y2; - case CASTLE_VCFG_YVYU_FORMAT: - return VIDEO_FORMAT_Y1Y2Y3Y0; - } - } else { - switch (vcfg & CASTLE_VCFG_VID_INP_FORMAT) { - case CASTLE_VCFG_UYVY_FORMAT: - return VIDEO_FORMAT_UYVY; - case CASTLE_VCFG_Y2YU_FORMAT: - return VIDEO_FORMAT_Y2YU; - case CASTLE_VCFG_YUYV_FORMAT: - return VIDEO_FORMAT_YUYV; - case CASTLE_VCFG_YVYU_FORMAT: - return VIDEO_FORMAT_YVYU; - } - } - return (GFX_STATUS_ERROR); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_src_size - * - * This routine returns the size of the source video overlay buffer. The - * return value is (height << 16) | width. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_src_size(void) -#else -unsigned long -gfx_get_video_src_size(void) -#endif -{ - unsigned long width, height; - - /* DETERMINE SOURCE WIDTH FROM THE DISPLAY FILTER VIDEO LINE SIZE */ - - width = (READ_VID32(CASTLE_VIDEO_CONFIG) >> 7) & 0x000001FE; - if (READ_VID32(CASTLE_VIDEO_CONFIG) & CASTLE_VCFG_LINE_SIZE_UPPER) - width += 512l; - if (READ_VID32(CASTLE_VIDEO_CONFIG) & CASTLE_VCFG_LINE_SIZE_BIT9) - width += 1024l; - - /* DETERMINE SOURCE HEIGHT FROM THE DISPLAY FILTER SCALE REGISTER */ - - height = READ_VID32(CASTLE_VIDEO_SCALER) & 0x7FF; - - return ((height << 16) | width); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_line_size - * - * This routine returns the line size of the source video overlay buffer, in - * pixels. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_line_size(void) -#else -unsigned long -gfx_get_video_line_size(void) -#endif -{ - unsigned long width = 0; - - /* DETERMINE SOURCE WIDTH FROM THE CASTLE VIDEO LINE SIZE */ - - width = (READ_VID32(CASTLE_VIDEO_CONFIG) >> 7) & 0x000001FE; - if (READ_VID32(CASTLE_VIDEO_CONFIG) & CASTLE_VCFG_LINE_SIZE_UPPER) - width += 512l; - return (width); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_xclip - * - * This routine returns the number of bytes clipped on the left side of a - * video overlay line (skipped at beginning). - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_xclip(void) -#else -unsigned long -gfx_get_video_xclip(void) -#endif -{ - unsigned long clip = 0; - - /* DETERMINE SOURCE WIDTH FROM THE CASTLE VIDEO LINE SIZE */ - - clip = ((READ_VID32(CASTLE_VIDEO_CONFIG) >> 16) & 0x001FF) << 3; - return (clip); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_offset - * - * This routine returns the current offset for the video overlay buffer. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_offset(void) -#else -unsigned long -gfx_get_video_offset(void) -#endif -{ - return (gfx_get_display_video_offset()); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_yuv_offsets - * - * This routine returns the current offsets for the video overlay buffer when in 4:2:0. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_video_yuv_offsets(unsigned long *yoffset, unsigned long *uoffset, - unsigned long *voffset) -#else -void -gfx_get_video_yuv_offsets(unsigned long *yoffset, unsigned long *uoffset, - unsigned long *voffset) -#endif -{ - gfx_get_display_video_yuv_offsets(yoffset, uoffset, voffset); -} - -/*---------------------------------------------------------------------------- - * gfx_get_video_yuv_pitch - * - * This routine returns the current pitch values for the video overlay buffer. - *---------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) -#else -void -gfx_get_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) -#endif -{ - gfx_get_display_video_yuv_pitch(ypitch, uvpitch); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_dst_size - * - * This routine returns the size of the displayed video overlay window. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_dst_size(void) -#else -unsigned long -gfx_get_video_dst_size(void) -#endif -{ - unsigned long xsize, ysize; - - xsize = READ_VID32(CASTLE_VIDEO_X_POS); - xsize = ((xsize >> 16) & 0x7FF) - (xsize & 0x7FF); - ysize = READ_VID32(CASTLE_VIDEO_Y_POS); - ysize = ((ysize >> 16) & 0x7FF) - (ysize & 0x7FF); - return ((ysize << 16) | xsize); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_position - * - * This routine returns the position of the video overlay window. The - * return value is (ypos << 16) | xpos. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_position(void) -#else -unsigned long -gfx_get_video_position(void) -#endif -{ - unsigned long hadjust, vadjust; - unsigned long xpos, ypos; - - /* READ HARDWARE POSITION */ - - xpos = READ_VID32(CASTLE_VIDEO_X_POS) & 0x000007FF; - ypos = READ_VID32(CASTLE_VIDEO_Y_POS) & 0x000007FF; - - /* GET ADJUSTMENT VALUES */ - /* Use routines to abstract version of display controller. */ - - hadjust = - (unsigned long)gfx_get_htotal() - (unsigned long)gfx_get_hsync_end() - - 14l; - vadjust = - (unsigned long)gfx_get_vtotal() - (unsigned long)gfx_get_vsync_end() + - 1l; - xpos -= hadjust; - ypos -= vadjust; - return ((ypos << 16) | (xpos & 0x0000FFFF)); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_color_key - * - * This routine returns the current video color key value. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_color_key(void) -#else -unsigned long -gfx_get_video_color_key(void) -#endif -{ - if (READ_VID32(CASTLE_DISPLAY_CONFIG) & CASTLE_DCFG_VG_CK) - return (READ_VID32(CASTLE_VIDEO_COLOR_KEY)); - else - return (gfx_get_display_video_color_key()); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_color_key_mask - * - * This routine returns the current video color mask value. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_get_video_color_key_mask(void) -#else -unsigned long -gfx_get_video_color_key_mask(void) -#endif -{ - if (READ_VID32(CASTLE_DISPLAY_CONFIG) & CASTLE_DCFG_VG_CK) - return (READ_VID32(CASTLE_VIDEO_COLOR_MASK)); - else - return (gfx_get_display_video_color_key_mask()); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_color_key_src - * - * This routine returns 0 for video data compare, 1 for graphics data. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_color_key_src(void) -#else -int -gfx_get_video_color_key_src(void) -#endif -{ - if (READ_VID32(CASTLE_DISPLAY_CONFIG) & CASTLE_DCFG_VG_CK) - return (0); - return (1); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_request - * - * This routine returns the horizontal (pixel) and vertical (lines) video - * request values. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_request(short *x, short *y) -#else -int -gfx_get_video_request(short *x, short *y) -#endif -{ - unsigned long request = 0; - - request = (READ_VID32(CASTLE_VIDEO_REQUEST)); - *x = (short)((request >> CASTLE_VIDEO_X_REQUEST_POS) & - CASTLE_VIDEO_REQUEST_MASK); - *y = (short)((request >> CASTLE_VIDEO_Y_REQUEST_POS) & - CASTLE_VIDEO_REQUEST_MASK); - - *x -= gfx_get_htotal() - gfx_get_hsync_end() - 2; - *y -= gfx_get_vtotal() - gfx_get_vsync_end() + 1; - - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_get_video_cursor() - * - * This routine configures the video hardware cursor. - * If the "mask"ed bits in the graphics pixel match "key", then either - * "color1" or "color2" will be used for this pixel, according to the value of - * the bit in offset "select_color2". - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -int -castle_get_video_cursor(unsigned long *key, unsigned long *mask, - unsigned short *select_color2, unsigned long *color1, - unsigned short *color2) -#else -int -gfx_get_video_cursor(unsigned long *key, unsigned long *mask, - unsigned short *select_color2, unsigned long *color1, - unsigned short *color2) -#endif -{ - *select_color2 = - (unsigned short)(READ_VID32(CASTLE_CURSOR_COLOR_KEY) >> - CASTLE_CURSOR_COLOR_KEY_OFFSET_POS); - *key = READ_VID32(CASTLE_CURSOR_COLOR_KEY) & CASTLE_COLOR_MASK; - *mask = READ_VID32(CASTLE_CURSOR_COLOR_MASK) & CASTLE_COLOR_MASK; - *color1 = READ_VID32(CASTLE_CURSOR_COLOR_1) & CASTLE_COLOR_MASK; - *color2 = - (unsigned short)(READ_VID32(CASTLE_CURSOR_COLOR_2) & - CASTLE_COLOR_MASK); - return (0); -} - -/*--------------------------------------------------------------------------- - * gfx_read_crc - * - * This routine returns the hardware CRC value, which is used for automated - * testing. The value is like a checksum, but will change if pixels move - * locations. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_read_crc(void) -#else -unsigned long -gfx_read_crc(void) -#endif -{ - Q_WORD msr_value; - unsigned long crc = 0xFFFFFFFF; - - /* DISABLE 32-BIT CRCS */ - /* For GX1.x, this is a reserved bit, and is assumed to be a benign - * access */ - - gfx_msr_read(RC_ID_DF, CASTLE_MBD_MSR_DIAG_DF, &msr_value); - msr_value.low &= ~CASTLE_DIAG_32BIT_CRC; - gfx_msr_write(RC_ID_DF, CASTLE_MBD_MSR_DIAG_DF, &msr_value); - - if (gfx_test_timing_active()) { - /* WAIT UNTIL ACTIVE DISPLAY */ - - while (!gfx_test_vertical_active()) ; - - /* RESET CRC DURING ACTIVE DISPLAY */ - - WRITE_VID32(CASTLE_VID_CRC, 0); - WRITE_VID32(CASTLE_VID_CRC, 1); - - /* WAIT UNTIL NOT ACTIVE, THEN ACTIVE, NOT ACTIVE, THEN ACTIVE */ - - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - crc = READ_VID32(CASTLE_VID_CRC) >> 8; - } - return (crc); -} - -/*--------------------------------------------------------------------------- - * gfx_read_crc32 - * - * This routine returns the 32-bit hardware CRC value, which is used for - * automated testing. The value is like a checksum, but will change if pixels - * move - * locations. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_read_crc32(void) -#else -unsigned long -gfx_read_crc32(void) -#endif -{ - Q_WORD msr_value; - unsigned long crc = 0xFFFFFFFF; - - /* ENABLE 32-BIT CRCS */ - /* For GX1.x, this is a reserved bit, and is assumed to be a benign - * access */ - - gfx_msr_read(RC_ID_DF, CASTLE_MBD_MSR_DIAG_DF, &msr_value); - msr_value.low |= CASTLE_DIAG_32BIT_CRC; - gfx_msr_write(RC_ID_DF, CASTLE_MBD_MSR_DIAG_DF, &msr_value); - - if (gfx_test_timing_active()) { - /* WAIT UNTIL ACTIVE DISPLAY */ - - while (!gfx_test_vertical_active()) ; - - /* RESET CRC DURING ACTIVE DISPLAY */ - - WRITE_VID32(CASTLE_VID_CRC, 0); - WRITE_VID32(CASTLE_VID_CRC, 1); - - /* WAIT UNTIL NOT ACTIVE, THEN ACTIVE, NOT ACTIVE, THEN ACTIVE */ - - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - crc = READ_VID32(CASTLE_VID_CRC32); - } - return (crc); -} - -/*--------------------------------------------------------------------------- - * gfx_read_window_crc - * - * This routine returns the hardware CRC value for a subsection of the display - * This value is used to debug whole-screen CRC failures. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -unsigned long -castle_read_window_crc(int source, unsigned short x, unsigned short y, - unsigned short width, unsigned short height, int crc32) -#else -unsigned long -gfx_read_window_crc(int source, unsigned short x, unsigned short y, - unsigned short width, unsigned short height, int crc32) -#endif -{ - Q_WORD msr_value; - unsigned long xpos, ypos, crc = 0; - unsigned long old_fmt = 0; - unsigned int vsync_active_base, vsync_inactive_base, hsync_active_base; - unsigned int vsync_active_shift, vsync_inactive_shift, hsync_active_shift; - unsigned int vsync_bit, hsync_bit, sync_polarities = 0; - - /* CONFIGURE DISPLAY FILTER TO LOAD DATA ONTO LOWER 32-BITS */ - - msr_value.high = 0; - msr_value.low = - (source == CRC_SOURCE_GFX_DATA) ? (RCDF_MBD_DIAG_EN0 | 0x0000000F) - : (RCDF_MBD_DIAG_EN0 | 0x0000000B); - gfx_msr_write(RC_ID_DF, MBD_MSR_DIAG, &msr_value); - - /* CONFIGURE DISPLAY FILTER FOR APPROPRIATE OUTPUT */ - - if (source != CRC_SOURCE_GFX_DATA) { - gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msr_value); - old_fmt = msr_value.low; - msr_value.low &= ~(RCDF_CONFIG_FMT_MASK); - msr_value.low |= - ((source == - CRC_SOURCE_FP_DATA) ? RCDF_CONFIG_FMT_FP : - RCDF_CONFIG_FMT_CRT); - gfx_msr_write(RC_ID_DF, MBD_MSR_CONFIG, &msr_value); - } - - /* CONFIGURE MCP TO LOAD REGB DATA ONTO UPPER 32-BITS */ - - msr_value.low = MCP_MBD_DIAG_EN1 | 0x00050000; - gfx_msr_write(RC_ID_MCP, MBD_MSR_DIAG, &msr_value); - - /* ENABLE HW CLOCK GATING AND SET MCP CLOCK TO DOT CLOCK */ - - msr_value.low = 1l; - gfx_msr_write(RC_ID_MCP, MBD_MSR_PM, &msr_value); - msr_value.low = 0; - gfx_msr_write(RC_ID_MCP, MCP_DBGCLKCTL, &msr_value); - msr_value.low = 3; - gfx_msr_write(RC_ID_MCP, MCP_DBGCLKCTL, &msr_value); - - /* DISABLE MCP ACTIONS */ - - msr_value.high = 0x00000000; - msr_value.low = 0x00000000; - gfx_msr_write(RC_ID_MCP, MCP_DIAGCTL, &msr_value); - - /* SET APPROPRIATE BASE ADDRESS */ - /* M-Sets use normal diag bits, while N-Sets use inverted diag bits */ - /* We thus use the M-sets when polling for a high signal and the N */ - /* sets when polling for a low signal. */ - - if (source != CRC_SOURCE_GFX_DATA) { - sync_polarities = gfx_get_sync_polarities(); - vsync_bit = 29; - hsync_bit = 30; - } else { - vsync_bit = 25; - hsync_bit = 26; - } - - if (sync_polarities & 1) { - hsync_active_base = MCP_SETM0CTL; - hsync_active_shift = 2; - } else { - hsync_active_base = MCP_SETN0CTL; - hsync_active_shift = 1; - } - if (sync_polarities & 2) { - vsync_active_base = MCP_SETM0CTL; - vsync_inactive_base = MCP_SETN0CTL; - vsync_active_shift = 2; - vsync_inactive_shift = 1; - } else { - vsync_active_base = MCP_SETN0CTL; - vsync_inactive_base = MCP_SETM0CTL; - vsync_active_shift = 1; - vsync_inactive_shift = 2; - } - - /* SET STATE TRANSITIONS */ - - /* STATE 0-1 TRANSITION (SET 0) */ - /* XState = 00 and VSync Inactive */ - /* Note: DF VSync = Diag Bus Bit 29 */ - /* VG VSync = Diag Bus Bit 25 */ - - msr_value.low = 0x000000A0; - msr_value.high = 0x00008000 | ((unsigned long)vsync_bit << 16) | - ((unsigned long)vsync_bit << 21) | ((unsigned long)vsync_bit << 26); - gfx_msr_write(RC_ID_MCP, vsync_inactive_base, &msr_value); - - /* STATE 1-2 TRANSITION (SET 4) */ - /* XState = 01 and VSync Active */ - - msr_value.low = 0x000000C0; - gfx_msr_write(RC_ID_MCP, vsync_active_base + 4, &msr_value); - - /* STATE 2-3 TRANSITION (SET 1) */ - /* XState = 10 and VSync Inactive */ - - msr_value.low = 0x00000120; - gfx_msr_write(RC_ID_MCP, vsync_inactive_base + 1, &msr_value); - - /* HORIZONTAL COUNTER (SET 5) */ - /* XState = 10 and HSync Active */ - /* Notes: DF HSync = Diag Bus Bit 30 */ - /* VG HSync = Diag Bus Bit 26 */ - - msr_value.high = 0x00008000 | ((unsigned long)hsync_bit << 16) | - ((unsigned long)hsync_bit << 21) | ((unsigned long)hsync_bit << 26); - msr_value.low = 0x00000120; - gfx_msr_write(RC_ID_MCP, hsync_active_base + 5, &msr_value); - - /* HORIZONTAL COUNTER RESET (SET 4) */ - /* XState = 10 and H. Counter = limit */ - /* Note: H. Counter is lower 16-bits of */ - /* RegB. */ - - msr_value.high = 0x00000000; - msr_value.low = 0x00000128; - gfx_msr_write(RC_ID_MCP, vsync_inactive_base + 4, &msr_value); - - /* CRC TRIGGER (SET 0) */ - /* Cmp0 <= xpos < Cmp1 */ - /* Cmp2 <= ypos < Cmp2 */ - - msr_value.high = 0x00000000; - msr_value.low = 0x10C20120; - gfx_msr_write(RC_ID_MCP, vsync_active_base, &msr_value); - - /* SET COMPARATOR VALUES */ - /* Note: The VG data outputs from the DF are delayed by one pixel clock. */ - /* In this mode, we thus add one to horizontal comparator limits. */ - - /* COMPARATOR 0 */ - /* Lower limit = xpos + (h_blank_pixels - 1) - 3 */ - /* Notes: */ - /* 1. 3 is the pipeline delay for MCP register */ - /* data to access the diag bus */ - /* 2. h_blank_pixels = HTOTAL - HSYNC_END */ - - xpos = (unsigned long)x + ((unsigned long)gfx_get_htotal() - - (unsigned long)gfx_get_hsync_end() - 1l) - 3l; - if (source == CRC_SOURCE_GFX_DATA) - xpos++; - msr_value.high = 0x00000000; - msr_value.low = xpos; - gfx_msr_write(RC_ID_MCP, MCP_CMPVAL0, &msr_value); - - /* COMPARATOR 1 */ - /* Upper limit = xpos + width + (h_blank_pixels - 1) - 3 */ - - msr_value.low = xpos + (unsigned long)width; - gfx_msr_write(RC_ID_MCP, MCP_CMPVAL0 + 2, &msr_value); - - /* COMPARATOR 2 */ - /* Lower limit = ypos + v_blank_pixels */ - /* Notes: */ - /* 1. v_blank_pixels = VTOTAL - VSYNC_END */ - - ypos = - (unsigned long)y + (unsigned long)gfx_get_vtotal() - - (unsigned long)gfx_get_vsync_end(); - msr_value.low = ypos << 16; - gfx_msr_write(RC_ID_MCP, MCP_CMPVAL0 + 4, &msr_value); - - /* COMPARATOR 3 */ - /* Upper limit = ypos + height + v_blank_pixels */ - - msr_value.low = (ypos + (unsigned long)height) << 16; - gfx_msr_write(RC_ID_MCP, MCP_CMPVAL0 + 6, &msr_value); - - /* SET COMPARATOR MASKS */ - - /* COMPARATORS 0 AND 1 REFER TO LOWER 16 BITS OF REGB */ - - msr_value.high = 0x00000000; - msr_value.low = 0x0000FFFF; - gfx_msr_write(RC_ID_MCP, MCP_CMPMASK0, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_CMPMASK0 + 2, &msr_value); - - /* COMPARATORS 2 AND 3 REFER TO UPPER 16 BITS OF REGB */ - - msr_value.low = 0xFFFF0000; - gfx_msr_write(RC_ID_MCP, MCP_CMPMASK0 + 4, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_CMPMASK0 + 6, &msr_value); - - /* SET REGA MASK TO CRC ONLY 24 BITS OF DATA */ - - msr_value.high = 0x00000000; - msr_value.low = 0x00FFFFFF; - gfx_msr_write(RC_ID_MCP, MCP_REGAMASK, &msr_value); - - /* SET REGB VALUE */ - /* Lower 16 bits use HTOTAL - SYNC TIME - 1 to set the counter rollover - * limit. */ - /* Upper 16 bits use 0xFFFF to remove auto-clear behavior. */ - - msr_value.high = 0x00000000; - msr_value.low = 0xFFFF0000 | - ((gfx_get_htotal() - (gfx_get_hsync_end() - gfx_get_hsync_start()) - - 1) & 0xFFFF); - gfx_msr_write(RC_ID_MCP, MCP_REGBVAL, &msr_value); - - /* PROGRAM ACTIONS */ - - /* GOTO STATE 01 */ - - msr_value.high = 0x00000000; - msr_value.low = 0x00000008 | (1l << vsync_inactive_shift); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 14, &msr_value); - - /* GOTO STATE 10 */ - - msr_value.low = 0x00080000 | (1l << (vsync_active_shift + 16)); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 15, &msr_value); - - /* GOTO STATE 11 */ - - msr_value.low = 0x00000080 | (1l << (vsync_inactive_shift + 4)); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 16, &msr_value); - - /* CLEAR REGB (COUNTERS) */ - /* RegB is cleared upon transitioning to state 10 */ - /* RegA is not cleared as the initial value must be 0x00000001 */ - - msr_value.low = 0x00080000 | (1l << (vsync_active_shift + 16)); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0, &msr_value); - - /* CRC INTO REGA */ - /* INCREMENT H. COUNTER */ - /* cmp0 <= xpos < cmp1 */ - /* cmp2 <= ypos < cmp3 */ - /* XState = 10 */ - - msr_value.low = 0x00000008 | (1l << vsync_active_shift) | - 0x00800000 | (1l << (hsync_active_shift + 20)); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 1, &msr_value); - - /* INCREMENT V. COUNTER */ - /* V. Counter is incremented when the H. Counter */ - /* rolls over. */ - - msr_value.low = 0x00080000 | (1l << (vsync_inactive_shift + 16)); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 2, &msr_value); - - /* CLEAR ALL OTHER ACTIONS */ - /* This prevents side-effects from previous accesses to the MCP */ - /* debug logic. */ - msr_value.low = 0x00000000; - msr_value.high = 0x00000000; - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 3, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 4, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 5, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 6, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 7, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 8, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 9, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 10, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 11, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 12, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 13, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 17, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 18, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 19, &msr_value); - gfx_msr_write(RC_ID_MCP, MCP_ACTION0 + 20, &msr_value); - - /* SET REGA CRC VALUE TO 1 OR 0 */ - - if (!crc32) - msr_value.low = 0x00000001; - gfx_msr_write(RC_ID_MCP, MCP_REGA, &msr_value); - - /* SET XSTATE TO 0 */ - - msr_value.low = 0; - msr_value.high = 0; - gfx_msr_write(RC_ID_MCP, MCP_XSTATE, &msr_value); - - /* CONFIGURE DIAG CONTROL */ - /* Set all four comparators to watch the upper diag bus. */ - /* Set REGA action1 to legacy CRC or 32-bit CRC. */ - /* Set REGB action1 to increment lower 16 bits and clear at limit. */ - /* Set REGB action2 to increment upper 16 bits. */ - /* Enable all actions. */ - - if (crc32) - msr_value.low = 0x9A820055; - else - msr_value.low = 0x9A840055; - msr_value.high = 0x00000000; - gfx_msr_write(RC_ID_MCP, MCP_DIAGCTL, &msr_value); - - /* DELAY TWO FRAMES */ - - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - while (gfx_test_vertical_active()) ; - while (!gfx_test_vertical_active()) ; - - /* VERIFY THAT XSTATE = 11 */ - - gfx_msr_read(RC_ID_MCP, MCP_XSTATE, &msr_value); - if ((msr_value.low & 3) == 3) { - gfx_msr_read(RC_ID_MCP, MCP_REGA, &msr_value); - - crc = msr_value.low; - if (!crc32) - crc &= 0xFFFFFF; - } - - /* DISABLE MCP AND DF DIAG BUS OUTPUTS */ - - msr_value.low = 0x00000000; - msr_value.high = 0x00000000; - gfx_msr_write(RC_ID_DF, MBD_MSR_DIAG, &msr_value); - gfx_msr_write(RC_ID_MCP, MBD_MSR_DIAG, &msr_value); - - /* DISABLE MCP ACTIONS */ - - msr_value.high = 0x00000000; - msr_value.low = 0x00000000; - gfx_msr_write(RC_ID_MCP, MCP_DIAGCTL, &msr_value); - - /* RESTORE PREVIOUS OUTPUT FORMAT */ - - if (source != CRC_SOURCE_GFX_DATA) { - gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msr_value); - msr_value.low = old_fmt; - gfx_msr_write(RC_ID_DF, MBD_MSR_CONFIG, &msr_value); - } - return crc; -} - -/*--------------------------------------------------------------------------- - * gfx_get_alpha_enable - * - * This routine returns 1 if the selected alpha window is currently - * enabled, or 0 if it is currently disabled. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_alpha_enable(int *enable) -#else -void -gfx_get_alpha_enable(int *enable) -#endif -{ - unsigned long value = 0; - - *enable = 0; - if (gfx_alpha_select <= 2) { - value = - READ_VID32(CASTLE_ALPHA_CONTROL_1 + - ((unsigned long)gfx_alpha_select << 5)); - if (value & CASTLE_ACTRL_WIN_ENABLE) - *enable = 1; - } - return; -} - -/*--------------------------------------------------------------------------- - * gfx_get_alpha_size - * - * This routine returns the size of the currently selected alpha region. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_alpha_size(unsigned short *x, unsigned short *y, - unsigned short *width, unsigned short *height) -#else -void -gfx_get_alpha_size(unsigned short *x, unsigned short *y, - unsigned short *width, unsigned short *height) -#endif -{ - unsigned long value = 0; - - *x = 0; - *y = 0; - *width = 0; - *height = 0; - if (gfx_alpha_select <= 2) { - value = - READ_VID32(CASTLE_ALPHA_XPOS_1 + - ((unsigned long)gfx_alpha_select << 5)); - *x = (unsigned short)(value & 0x000007FF); - *width = (unsigned short)((value >> 16) & 0x000007FF) - *x; - value = - READ_VID32(CASTLE_ALPHA_YPOS_1 + - ((unsigned long)gfx_alpha_select << 5)); - *y = (unsigned short)(value & 0x000007FF); - *height = (unsigned short)((value >> 16) & 0x000007FF) - *y; - } - *x -= gfx_get_htotal() - gfx_get_hsync_end() - 2; - *y -= gfx_get_vtotal() - gfx_get_vsync_end() + 1; - return; -} - -/*--------------------------------------------------------------------------- - * gfx_get_alpha_value - * - * This routine returns the alpha value and increment/decrement value of - * the currently selected alpha region. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_alpha_value(unsigned char *alpha, char *delta) -#else -void -gfx_get_alpha_value(unsigned char *alpha, char *delta) -#endif -{ - unsigned long value = 0; - - *alpha = 0; - *delta = 0; - if (gfx_alpha_select <= 2) { - value = - READ_VID32(CASTLE_ALPHA_CONTROL_1 + - ((unsigned long)gfx_alpha_select << 5)); - *alpha = (unsigned char)(value & 0x00FF); - *delta = (char)((value >> 8) & 0x00FF); - } - return; -} - -/*--------------------------------------------------------------------------- - * gfx_get_alpha_priority - * - * This routine returns the priority of the currently selected alpha region. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_alpha_priority(int *priority) -#else -void -gfx_get_alpha_priority(int *priority) -#endif -{ - unsigned long pos = 0, value = 0; - - *priority = 0; - if (gfx_alpha_select <= 2) { - value = READ_VID32(CASTLE_VID_ALPHA_CONTROL); - pos = 16 + (gfx_alpha_select << 1); - *priority = (int)((value >> pos) & 3); - } - return; -} - -/*--------------------------------------------------------------------------- - * gfx_get_alpha_color - * - * This routine returns the color register value for the currently selected - * alpha region. Bit 24 is set if the color register is enabled. - *--------------------------------------------------------------------------- - */ -#if GFX_VIDEO_DYNAMIC -void -castle_get_alpha_color(unsigned long *color) -#else -void -gfx_get_alpha_color(unsigned long *color) -#endif -{ - *color = 0; - if (gfx_alpha_select <= 2) { - *color = - READ_VID32(CASTLE_ALPHA_COLOR_1 + - ((unsigned long)gfx_alpha_select << 5)); - } - return; -} - -#endif /* GFX_READ_ROUTINES */ - -/* END OF FILE */ |