171d7fec4Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nsc/gfx/disp_gu2.c,v 1.4 2003/02/06 17:46:02 alanh Exp $ */ 271d7fec4Smrg/* 371d7fec4Smrg * $Workfile: disp_gu2.c $ 471d7fec4Smrg * 571d7fec4Smrg * This file contains routines for the second generation display controller. 671d7fec4Smrg * 771d7fec4Smrg * NSC_LIC_ALTERNATIVE_PREAMBLE 871d7fec4Smrg * 971d7fec4Smrg * Revision 1.0 1071d7fec4Smrg * 1171d7fec4Smrg * National Semiconductor Alternative GPL-BSD License 1271d7fec4Smrg * 1371d7fec4Smrg * National Semiconductor Corporation licenses this software 1471d7fec4Smrg * ("Software"): 1571d7fec4Smrg * 1671d7fec4Smrg * Durango 1771d7fec4Smrg * 1871d7fec4Smrg * under one of the two following licenses, depending on how the 1971d7fec4Smrg * Software is received by the Licensee. 2071d7fec4Smrg * 2171d7fec4Smrg * If this Software is received as part of the Linux Framebuffer or 2271d7fec4Smrg * other GPL licensed software, then the GPL license designated 2371d7fec4Smrg * NSC_LIC_GPL applies to this Software; in all other circumstances 2471d7fec4Smrg * then the BSD-style license designated NSC_LIC_BSD shall apply. 2571d7fec4Smrg * 2671d7fec4Smrg * END_NSC_LIC_ALTERNATIVE_PREAMBLE */ 2771d7fec4Smrg 2871d7fec4Smrg/* NSC_LIC_BSD 2971d7fec4Smrg * 3071d7fec4Smrg * National Semiconductor Corporation Open Source License for Durango 3171d7fec4Smrg * 3271d7fec4Smrg * (BSD License with Export Notice) 3371d7fec4Smrg * 3471d7fec4Smrg * Copyright (c) 1999-2001 3571d7fec4Smrg * National Semiconductor Corporation. 3671d7fec4Smrg * All rights reserved. 3771d7fec4Smrg * 3871d7fec4Smrg * Redistribution and use in source and binary forms, with or without 3971d7fec4Smrg * modification, are permitted provided that the following conditions 4071d7fec4Smrg * are met: 4171d7fec4Smrg * 4271d7fec4Smrg * * Redistributions of source code must retain the above copyright 4371d7fec4Smrg * notice, this list of conditions and the following disclaimer. 4471d7fec4Smrg * 4571d7fec4Smrg * * Redistributions in binary form must reproduce the above 4671d7fec4Smrg * copyright notice, this list of conditions and the following 4771d7fec4Smrg * disclaimer in the documentation and/or other materials provided 4871d7fec4Smrg * with the distribution. 4971d7fec4Smrg * 5071d7fec4Smrg * * Neither the name of the National Semiconductor Corporation nor 5171d7fec4Smrg * the names of its contributors may be used to endorse or promote 5271d7fec4Smrg * products derived from this software without specific prior 5371d7fec4Smrg * written permission. 5471d7fec4Smrg * 5571d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 5671d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 5771d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 5871d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 5971d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 6071d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 6171d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 6271d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 6371d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 6471d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 6571d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 6671d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 6771d7fec4Smrg * OF SUCH DAMAGE. 6871d7fec4Smrg * 6971d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 7071d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 7171d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 7271d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 7371d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 7471d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 7571d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 7671d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 7771d7fec4Smrg * has embargoed goods and services. 7871d7fec4Smrg * 7971d7fec4Smrg * END_NSC_LIC_BSD */ 8071d7fec4Smrg 8171d7fec4Smrg/* NSC_LIC_GPL 8271d7fec4Smrg * 8371d7fec4Smrg * National Semiconductor Corporation Gnu General Public License for Durango 8471d7fec4Smrg * 8571d7fec4Smrg * (GPL License with Export Notice) 8671d7fec4Smrg * 8771d7fec4Smrg * Copyright (c) 1999-2001 8871d7fec4Smrg * National Semiconductor Corporation. 8971d7fec4Smrg * All rights reserved. 9071d7fec4Smrg * 9171d7fec4Smrg * Redistribution and use in source and binary forms, with or without 9271d7fec4Smrg * modification, are permitted under the terms of the GNU General 9371d7fec4Smrg * Public License as published by the Free Software Foundation; either 9471d7fec4Smrg * version 2 of the License, or (at your option) any later version 9571d7fec4Smrg * 9671d7fec4Smrg * In addition to the terms of the GNU General Public License, neither 9771d7fec4Smrg * the name of the National Semiconductor Corporation nor the names of 9871d7fec4Smrg * its contributors may be used to endorse or promote products derived 9971d7fec4Smrg * from this software without specific prior written permission. 10071d7fec4Smrg * 10171d7fec4Smrg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 10271d7fec4Smrg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10371d7fec4Smrg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 10471d7fec4Smrg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 10571d7fec4Smrg * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 10671d7fec4Smrg * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 10771d7fec4Smrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 10871d7fec4Smrg * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 10971d7fec4Smrg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 11071d7fec4Smrg * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE, 11171d7fec4Smrg * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY 11271d7fec4Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 11371d7fec4Smrg * OF SUCH DAMAGE. See the GNU General Public License for more details. 11471d7fec4Smrg * 11571d7fec4Smrg * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF 11671d7fec4Smrg * YOUR JURISDICTION. It is licensee's responsibility to comply with 11771d7fec4Smrg * any export regulations applicable in licensee's jurisdiction. Under 11871d7fec4Smrg * CURRENT (2001) U.S. export regulations this software 11971d7fec4Smrg * is eligible for export from the U.S. and can be downloaded by or 12071d7fec4Smrg * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed 12171d7fec4Smrg * destinations which include Cuba, Iraq, Libya, North Korea, Iran, 12271d7fec4Smrg * Syria, Sudan, Afghanistan and any other country to which the U.S. 12371d7fec4Smrg * has embargoed goods and services. 12471d7fec4Smrg * 12571d7fec4Smrg * You should have received a copy of the GNU General Public License 12671d7fec4Smrg * along with this file; if not, write to the Free Software Foundation, 12771d7fec4Smrg * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 12871d7fec4Smrg * 12971d7fec4Smrg * END_NSC_LIC_GPL */ 13071d7fec4Smrg 13171d7fec4Smrgvoid gu2_enable_compression(void); /* private routine definition */ 13271d7fec4Smrgvoid gu2_disable_compression(void); /* private routine definition */ 13371d7fec4Smrgint gu2_set_display_bpp(unsigned short bpp); 13471d7fec4Smrgint gu2_is_display_mode_supported(int xres, int yres, int bpp, int hz); 13571d7fec4Smrgint gu2_set_display_mode(int xres, int yres, int bpp, int hz); 13671d7fec4Smrgint gu2_set_display_timings(unsigned short bpp, unsigned short flags, 13771d7fec4Smrg unsigned short hactive, 13871d7fec4Smrg unsigned short hblank_start, 13971d7fec4Smrg unsigned short hsync_start, 14071d7fec4Smrg unsigned short hsync_end, 14171d7fec4Smrg unsigned short hblank_end, unsigned short htotal, 14271d7fec4Smrg unsigned short vactive, 14371d7fec4Smrg unsigned short vblank_start, 14471d7fec4Smrg unsigned short vsync_start, 14571d7fec4Smrg unsigned short vsync_end, 14671d7fec4Smrg unsigned short vblank_end, unsigned short vtotal, 14771d7fec4Smrg unsigned long frequency); 14871d7fec4Smrgint gu2_set_vtotal(unsigned short vtotal); 14971d7fec4Smrgvoid gu2_set_display_pitch(unsigned short pitch); 15071d7fec4Smrgvoid gu2_set_display_offset(unsigned long offset); 15171d7fec4Smrgint gu2_set_display_palette_entry(unsigned long index, unsigned long palette); 15271d7fec4Smrgint gu2_set_display_palette(unsigned long *palette); 15371d7fec4Smrgvoid gu2_video_shutdown(void); 15471d7fec4Smrgvoid gu2_set_clock_frequency(unsigned long frequency); 15571d7fec4Smrgint gu2_set_crt_enable(int enable); 15671d7fec4Smrgvoid gu2_set_cursor_enable(int enable); 15771d7fec4Smrgvoid gu2_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor); 15871d7fec4Smrgvoid gu2_set_cursor_position(unsigned long memoffset, 15971d7fec4Smrg unsigned short xpos, unsigned short ypos, 16071d7fec4Smrg unsigned short xhotspot, 16171d7fec4Smrg unsigned short yhotspot); 16271d7fec4Smrgvoid gu2_set_cursor_shape32(unsigned long memoffset, unsigned long *andmask, 16371d7fec4Smrg unsigned long *xormask); 16471d7fec4Smrgvoid gu2_set_cursor_shape64(unsigned long memoffset, unsigned long *andmask, 16571d7fec4Smrg unsigned long *xormask); 16671d7fec4Smrgvoid gu2_set_icon_enable(int enable); 16771d7fec4Smrgvoid gu2_set_icon_colors(unsigned long color0, unsigned long color1, 16871d7fec4Smrg unsigned long color2); 16971d7fec4Smrgvoid gu2_set_icon_position(unsigned long memoffset, unsigned short xpos); 17071d7fec4Smrgvoid gu2_set_icon_shape64(unsigned long memoffset, unsigned long *andmask, 17171d7fec4Smrg unsigned long *xormask, unsigned int lines); 17271d7fec4Smrg 17371d7fec4Smrgint gu2_set_compression_enable(int enable); 17471d7fec4Smrgint gu2_set_compression_offset(unsigned long offset); 17571d7fec4Smrgint gu2_set_compression_pitch(unsigned short pitch); 17671d7fec4Smrgint gu2_set_compression_size(unsigned short size); 17771d7fec4Smrgvoid gu2_set_display_priority_high(int enable); 17871d7fec4Smrgint gu2_test_timing_active(void); 17971d7fec4Smrgint gu2_test_vertical_active(void); 18071d7fec4Smrgint gu2_wait_vertical_blank(void); 18171d7fec4Smrgvoid gu2_delay_milliseconds(unsigned long milliseconds); 18271d7fec4Smrgvoid gu2_delay_microseconds(unsigned long microseconds); 18371d7fec4Smrgvoid gu2_enable_panning(int x, int y); 18471d7fec4Smrgint gu2_set_fixed_timings(int panelResX, int panelResY, unsigned short width, 18571d7fec4Smrg unsigned short height, unsigned short bpp); 18671d7fec4Smrgint gu2_set_panel_present(int panelResX, int panelResY, unsigned short width, 18771d7fec4Smrg unsigned short height, unsigned short bpp); 18871d7fec4Smrgvoid gu2_reset_timing_lock(void); 18971d7fec4Smrg 19071d7fec4Smrgint gu2_get_display_details(unsigned int mode, int *xres, int *yres, int *hz); 19171d7fec4Smrgunsigned short gu2_get_display_pitch(void); 19271d7fec4Smrgint gu2_get_vsa2_softvga_enable(void); 19371d7fec4Smrgint gu2_get_sync_polarities(void); 19471d7fec4Smrgunsigned long gu2_get_clock_frequency(void); 19571d7fec4Smrgunsigned long gu2_get_max_supported_pixel_clock(void); 19671d7fec4Smrgint gu2_mode_frequency_supported(int xres, int yres, int bpp, 19771d7fec4Smrg unsigned long frequency); 19871d7fec4Smrgint gu2_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, 19971d7fec4Smrg unsigned long frequency); 20071d7fec4Smrgint gu2_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, 20171d7fec4Smrg unsigned long frequency); 20271d7fec4Smrgint gu2_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, 20371d7fec4Smrg int *frequency); 20471d7fec4Smrgint gu2_get_display_mode_count(void); 20571d7fec4Smrgint gu2_get_display_mode(int *xres, int *yres, int *bpp, int *hz); 20671d7fec4Smrgunsigned long gu2_get_frame_buffer_line_size(void); 20771d7fec4Smrgunsigned short gu2_get_hactive(void); 20871d7fec4Smrgunsigned short gu2_get_hblank_start(void); 20971d7fec4Smrgunsigned short gu2_get_hsync_start(void); 21071d7fec4Smrgunsigned short gu2_get_hsync_end(void); 21171d7fec4Smrgunsigned short gu2_get_hblank_end(void); 21271d7fec4Smrgunsigned short gu2_get_htotal(void); 21371d7fec4Smrgunsigned short gu2_get_vactive(void); 21471d7fec4Smrgunsigned short gu2_get_vline(void); 21571d7fec4Smrgunsigned short gu2_get_vblank_start(void); 21671d7fec4Smrgunsigned short gu2_get_vsync_start(void); 21771d7fec4Smrgunsigned short gu2_get_vsync_end(void); 21871d7fec4Smrgunsigned short gu2_get_vblank_end(void); 21971d7fec4Smrgunsigned short gu2_get_vtotal(void); 22071d7fec4Smrgunsigned short gu2_get_display_bpp(void); 22171d7fec4Smrgunsigned long gu2_get_display_offset(void); 22271d7fec4Smrgint gu2_get_display_palette_entry(unsigned long index, 22371d7fec4Smrg unsigned long *palette); 22471d7fec4Smrgvoid gu2_get_display_palette(unsigned long *palette); 22571d7fec4Smrgunsigned long gu2_get_cursor_enable(void); 22671d7fec4Smrgunsigned long gu2_get_cursor_offset(void); 22771d7fec4Smrgunsigned long gu2_get_cursor_position(void); 22871d7fec4Smrgunsigned long gu2_get_cursor_clip(void); 22971d7fec4Smrgunsigned long gu2_get_cursor_color(int color); 23071d7fec4Smrgunsigned long gu2_get_icon_enable(void); 23171d7fec4Smrgunsigned long gu2_get_icon_offset(void); 23271d7fec4Smrgunsigned long gu2_get_icon_position(void); 23371d7fec4Smrgunsigned long gu2_get_icon_color(int color); 23471d7fec4Smrgint gu2_get_compression_enable(void); 23571d7fec4Smrgunsigned long gu2_get_compression_offset(void); 23671d7fec4Smrgunsigned short gu2_get_compression_pitch(void); 23771d7fec4Smrgunsigned short gu2_get_compression_size(void); 23871d7fec4Smrgint gu2_get_display_priority_high(void); 23971d7fec4Smrgint gu2_get_valid_bit(int line); 24071d7fec4Smrgint gu2_set_specified_mode(DISPLAYMODE * pMode, int bpp); 24171d7fec4Smrgvoid gu2_set_display_video_size(unsigned short width, unsigned short height); 24271d7fec4Smrgvoid gu2_set_display_video_offset(unsigned long offset); 24371d7fec4Smrgunsigned long gu2_get_display_video_offset(void); 24471d7fec4Smrgunsigned long gu2_get_display_video_size(void); 24571d7fec4Smrgvoid gu2_get_display_video_yuv_pitch(unsigned long *ypitch, 24671d7fec4Smrg unsigned long *uvpitch); 24771d7fec4Smrgint gu2_get_display_video_downscale_enable(void); 24871d7fec4Smrgvoid gu2_set_display_video_format(unsigned long format); 24971d7fec4Smrgvoid gu2_set_display_video_enable(int enable); 25071d7fec4Smrgvoid gu2_set_display_video_yuv_offsets(unsigned long yoffset, 25171d7fec4Smrg unsigned long uoffset, 25271d7fec4Smrg unsigned long voffset); 25371d7fec4Smrgvoid gu2_set_display_video_yuv_pitch(unsigned long ypitch, 25471d7fec4Smrg unsigned long uvpitch); 25571d7fec4Smrgvoid gu2_set_display_video_downscale(unsigned short srch, 25671d7fec4Smrg unsigned short dsth); 25771d7fec4Smrgvoid gu2_set_display_video_vertical_downscale_enable(int enable); 25871d7fec4Smrgvoid gu2_get_display_video_yuv_offsets(unsigned long *yoffset, 25971d7fec4Smrg unsigned long *uoffset, 26071d7fec4Smrg unsigned long *voffset); 26171d7fec4Smrgunsigned long gu2_get_display_video_downscale_delta(void); 26271d7fec4Smrg 26371d7fec4Smrg /*----------------------------------------------------------------------------- 26471d7fec4Smrg * WARNING!!!! INACCURATE DELAY MECHANISM 26571d7fec4Smrg * 26671d7fec4Smrg * In an effort to keep the code self contained and operating system 26771d7fec4Smrg * independent, the delay loop just performs reads of a display controller 26871d7fec4Smrg * register. This time will vary for faster processors. The delay can always 26971d7fec4Smrg * be longer than intended, only effecting the time of the mode switch 27071d7fec4Smrg * (obviously want it to still be under a second). Problems with the hardware 27171d7fec4Smrg * only arise if the delay is not long enough. 27271d7fec4Smrg *----------------------------------------------------------------------------- 27371d7fec4Smrg */ 27471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 27571d7fec4Smrgvoid 27671d7fec4Smrggu2_delay_milliseconds(unsigned long milliseconds) 27771d7fec4Smrg#else 27871d7fec4Smrgvoid 27971d7fec4Smrggfx_delay_milliseconds(unsigned long milliseconds) 28071d7fec4Smrg#endif 28171d7fec4Smrg{ 28271d7fec4Smrg /* ASSUME 300 MHZ 20 CLOCKS PER READ */ 28371d7fec4Smrg 28471d7fec4Smrg# define RC_READS_PER_MILLISECOND 15000L 28571d7fec4Smrg 28671d7fec4Smrg unsigned long loop; 28771d7fec4Smrg 28871d7fec4Smrg loop = milliseconds * RC_READS_PER_MILLISECOND; 28971d7fec4Smrg while (loop-- > 0) { 29071d7fec4Smrg READ_REG32(MDC_UNLOCK); 29171d7fec4Smrg } 29271d7fec4Smrg} 29371d7fec4Smrg 29471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 29571d7fec4Smrgvoid 29671d7fec4Smrggu2_delay_microseconds(unsigned long microseconds) 29771d7fec4Smrg#else 29871d7fec4Smrgvoid 29971d7fec4Smrggfx_delay_microseconds(unsigned long microseconds) 30071d7fec4Smrg#endif 30171d7fec4Smrg{ 30271d7fec4Smrg /* ASSUME 400 MHz, 2 CLOCKS PER INCREMENT */ 30371d7fec4Smrg 30471d7fec4Smrg unsigned long loop_count = microseconds * 15; 30571d7fec4Smrg 30671d7fec4Smrg while (loop_count-- > 0) { 30771d7fec4Smrg READ_REG32(MDC_UNLOCK); 30871d7fec4Smrg } 30971d7fec4Smrg} 31071d7fec4Smrg 31171d7fec4Smrg/*----------------------------------------------------------------------------- 31271d7fec4Smrg * GFX_SET_DISPLAY_BPP 31371d7fec4Smrg * 31471d7fec4Smrg * This routine programs the bpp in the display controller. 31571d7fec4Smrg *----------------------------------------------------------------------------- 31671d7fec4Smrg */ 31771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 31871d7fec4Smrgint 31971d7fec4Smrggu2_set_display_bpp(unsigned short bpp) 32071d7fec4Smrg#else 32171d7fec4Smrgint 32271d7fec4Smrggfx_set_display_bpp(unsigned short bpp) 32371d7fec4Smrg#endif 32471d7fec4Smrg{ 32571d7fec4Smrg unsigned long dcfg, lock; 32671d7fec4Smrg 32771d7fec4Smrg dcfg = READ_REG32(MDC_DISPLAY_CFG) & ~(MDC_DCFG_DISP_MODE_MASK | 32871d7fec4Smrg MDC_DCFG_16BPP_MODE_MASK); 32971d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 33071d7fec4Smrg 33171d7fec4Smrg switch (bpp) { 33271d7fec4Smrg case 12: 33371d7fec4Smrg dcfg |= (MDC_DCFG_DISP_MODE_16BPP | MDC_DCFG_12BPP); 33471d7fec4Smrg break; 33571d7fec4Smrg case 15: 33671d7fec4Smrg dcfg |= (MDC_DCFG_DISP_MODE_16BPP | MDC_DCFG_15BPP); 33771d7fec4Smrg break; 33871d7fec4Smrg case 16: 33971d7fec4Smrg dcfg |= (MDC_DCFG_DISP_MODE_16BPP | MDC_DCFG_16BPP); 34071d7fec4Smrg break; 34171d7fec4Smrg case 32: 34271d7fec4Smrg dcfg |= (MDC_DCFG_DISP_MODE_24BPP); 34371d7fec4Smrg break; 34471d7fec4Smrg case 8: 34571d7fec4Smrg dcfg |= (MDC_DCFG_DISP_MODE_8BPP); 34671d7fec4Smrg break; 34771d7fec4Smrg default: 34871d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 34971d7fec4Smrg } 35071d7fec4Smrg 35171d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 35271d7fec4Smrg WRITE_REG32(MDC_DISPLAY_CFG, dcfg); 35371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 35471d7fec4Smrg 35571d7fec4Smrg /* SET BPP IN GRAPHICS PIPELINE */ 35671d7fec4Smrg 35771d7fec4Smrg gfx_set_bpp(bpp); 35871d7fec4Smrg 35971d7fec4Smrg return 0; 36071d7fec4Smrg} 36171d7fec4Smrg 36271d7fec4Smrg/*----------------------------------------------------------------------------- 36371d7fec4Smrg * gu2_set_specified_mode (private routine) 36471d7fec4Smrg * This routine uses the parameters in the specified display mode structure 36571d7fec4Smrg * to program the display controller hardware. 36671d7fec4Smrg *----------------------------------------------------------------------------- 36771d7fec4Smrg */ 36871d7fec4Smrgint 36971d7fec4Smrggu2_set_specified_mode(DISPLAYMODE * pMode, int bpp) 37071d7fec4Smrg{ 37171d7fec4Smrg unsigned long unlock, value; 37271d7fec4Smrg unsigned long gcfg, dcfg; 37371d7fec4Smrg unsigned long size, pitch; 37471d7fec4Smrg unsigned long vid_buf_size; 37571d7fec4Smrg unsigned long bpp_mask, temp, dv_size; 37671d7fec4Smrg 37771d7fec4Smrg /* CHECK WHETHER TIMING CHANGE IS ALLOWED */ 37871d7fec4Smrg /* Flag used for locking also overrides timing change restriction */ 37971d7fec4Smrg 38071d7fec4Smrg if (gfx_timing_lock && !(pMode->flags & GFX_MODE_LOCK_TIMING)) 38171d7fec4Smrg return GFX_STATUS_ERROR; 38271d7fec4Smrg 38371d7fec4Smrg /* CLEAR PANNING OFFSETS */ 38471d7fec4Smrg 38571d7fec4Smrg DeltaX = 0; 38671d7fec4Smrg DeltaY = 0; 38771d7fec4Smrg panelLeft = 0; 38871d7fec4Smrg panelTop = 0; 38971d7fec4Smrg 39071d7fec4Smrg /* SET GLOBAL FLAG */ 39171d7fec4Smrg 39271d7fec4Smrg if (pMode->flags & GFX_MODE_LOCK_TIMING) 39371d7fec4Smrg gfx_timing_lock = 1; 39471d7fec4Smrg 39571d7fec4Smrg /* CHECK FOR VALID BPP */ 39671d7fec4Smrg /* As this function can be called directly from */ 39771d7fec4Smrg /* gfx_set_display_timings, we must correct any */ 39871d7fec4Smrg /* invalid bpp settings. */ 39971d7fec4Smrg 40071d7fec4Smrg switch (bpp) { 40171d7fec4Smrg case 12: 40271d7fec4Smrg bpp_mask = 0x00000900; 40371d7fec4Smrg break; 40471d7fec4Smrg case 15: 40571d7fec4Smrg bpp_mask = 0x00000500; 40671d7fec4Smrg break; 40771d7fec4Smrg case 16: 40871d7fec4Smrg bpp_mask = 0x00000100; 40971d7fec4Smrg break; 41071d7fec4Smrg case 32: 41171d7fec4Smrg bpp_mask = 0x00000200; 41271d7fec4Smrg break; 41371d7fec4Smrg default: 41471d7fec4Smrg bpp_mask = 0x00000000; 41571d7fec4Smrg bpp = 8; 41671d7fec4Smrg break; 41771d7fec4Smrg } 41871d7fec4Smrg 41971d7fec4Smrg gbpp = bpp; 42071d7fec4Smrg 42171d7fec4Smrg /* DISABLE COMPRESSION */ 42271d7fec4Smrg 42371d7fec4Smrg gu2_disable_compression(); 42471d7fec4Smrg 42571d7fec4Smrg /* ALSO DISABLE VIDEO */ 42671d7fec4Smrg /* Use private "reset video" routine to do all that is needed. */ 42771d7fec4Smrg /* SC1200, for example, also disables the alpha blending regions. */ 42871d7fec4Smrg 42971d7fec4Smrg gfx_reset_video(); 43071d7fec4Smrg 43171d7fec4Smrg /* UNLOCK THE DISPLAY CONTROLLER REGISTERS */ 43271d7fec4Smrg 43371d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 43471d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 43571d7fec4Smrg 43671d7fec4Smrg /* READ THE CURRENT REGISTER VALUES */ 43771d7fec4Smrg 43871d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 43971d7fec4Smrg dcfg = READ_REG32(MDC_DISPLAY_CFG); 44071d7fec4Smrg 44171d7fec4Smrg /* BLANK THE DISPLAY IN THE DISPLAY FILTER */ 44271d7fec4Smrg 44371d7fec4Smrg gfx_set_crt_enable(0); 44471d7fec4Smrg 44571d7fec4Smrg /* DISABLE THE TIMING GENERATOR */ 44671d7fec4Smrg 44771d7fec4Smrg dcfg &= ~(unsigned long)MDC_DCFG_TGEN; 44871d7fec4Smrg WRITE_REG32(MDC_DISPLAY_CFG, dcfg); 44971d7fec4Smrg 45071d7fec4Smrg /* DELAY: WAIT FOR PENDING MEMORY REQUESTS */ 45171d7fec4Smrg /* This delay is used to make sure that all pending requests to the */ 45271d7fec4Smrg /* memory controller have completed before disabling the FIFO load. */ 45371d7fec4Smrg 45471d7fec4Smrg gfx_delay_milliseconds(5); 45571d7fec4Smrg 45671d7fec4Smrg /* DISABLE DISPLAY FIFO LOAD */ 45771d7fec4Smrg 45871d7fec4Smrg gcfg &= ~(unsigned long)MDC_GCFG_DFLE; 45971d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 46071d7fec4Smrg 46171d7fec4Smrg /* PRESERVE VIDEO INFORMATION */ 46271d7fec4Smrg 46371d7fec4Smrg gcfg &= (unsigned long)(MDC_GCFG_YUVM | MDC_GCFG_VDSE); 46471d7fec4Smrg dcfg = 0; 46571d7fec4Smrg 46671d7fec4Smrg /* SET THE DOT CLOCK FREQUENCY */ 46771d7fec4Smrg /* Mask off the divide by two bit (bit 31) */ 46871d7fec4Smrg 46971d7fec4Smrg gfx_set_clock_frequency(pMode->frequency & 0x7FFFFFFF); 47071d7fec4Smrg 47171d7fec4Smrg /* DELAY: WAIT FOR THE PLL TO SETTLE */ 47271d7fec4Smrg /* This allows the dot clock frequency that was just set to settle. */ 47371d7fec4Smrg 47471d7fec4Smrg gfx_delay_milliseconds(10); 47571d7fec4Smrg 47671d7fec4Smrg /* SET THE GX DISPLAY CONTROLLER PARAMETERS */ 47771d7fec4Smrg 47871d7fec4Smrg WRITE_REG32(MDC_FB_ST_OFFSET, 0); 47971d7fec4Smrg WRITE_REG32(MDC_CB_ST_OFFSET, 0); 48071d7fec4Smrg WRITE_REG32(MDC_CURS_ST_OFFSET, 0); 48171d7fec4Smrg WRITE_REG32(MDC_ICON_ST_OFFSET, 0); 48271d7fec4Smrg 48371d7fec4Smrg /* SET LINE SIZE AND PITCH */ 48471d7fec4Smrg /* 1. Flat Panels must use the mode width and not */ 48571d7fec4Smrg /* the timing width to set the pitch. */ 48671d7fec4Smrg /* 2. Mode sets will use a pitch that is aligned */ 48771d7fec4Smrg /* on a 1K boundary to preserve legacy. The */ 48871d7fec4Smrg /* pitch can be overridden by a subsequent call */ 48971d7fec4Smrg /* to gfx_set_display_pitch. */ 49071d7fec4Smrg 49171d7fec4Smrg if (PanelEnable) 49271d7fec4Smrg size = ModeWidth; 49371d7fec4Smrg else 49471d7fec4Smrg size = pMode->hactive; 49571d7fec4Smrg 49671d7fec4Smrg if (bpp > 8) 49771d7fec4Smrg size <<= 1; 49871d7fec4Smrg if (bpp > 16) 49971d7fec4Smrg size <<= 1; 50071d7fec4Smrg 50171d7fec4Smrg pitch = 1024; 50271d7fec4Smrg dv_size = MDC_DV_LINE_SIZE_1024; 50371d7fec4Smrg 50471d7fec4Smrg if (size > 1024) { 50571d7fec4Smrg pitch = 2048; 50671d7fec4Smrg dv_size = MDC_DV_LINE_SIZE_2048; 50771d7fec4Smrg } 50871d7fec4Smrg if (size > 2048) { 50971d7fec4Smrg pitch = 4096; 51071d7fec4Smrg dv_size = MDC_DV_LINE_SIZE_4096; 51171d7fec4Smrg } 51271d7fec4Smrg if (size > 4096) { 51371d7fec4Smrg pitch = 8192; 51471d7fec4Smrg dv_size = MDC_DV_LINE_SIZE_8192; 51571d7fec4Smrg } 51671d7fec4Smrg WRITE_REG32(MDC_GFX_PITCH, pitch >> 3); 51771d7fec4Smrg 51871d7fec4Smrg /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ 51971d7fec4Smrg 52071d7fec4Smrg temp = READ_REG32(MDC_DV_CTL); 52171d7fec4Smrg WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); 52271d7fec4Smrg 52371d7fec4Smrg if (PanelEnable) { 52471d7fec4Smrg size = pMode->hactive; 52571d7fec4Smrg if (bpp > 8) 52671d7fec4Smrg size <<= 1; 52771d7fec4Smrg if (bpp > 16) 52871d7fec4Smrg size <<= 1; 52971d7fec4Smrg } 53071d7fec4Smrg 53171d7fec4Smrg /* SAVE PREVIOUSLY STORED VIDEO LINE SIZE */ 53271d7fec4Smrg 53371d7fec4Smrg vid_buf_size = READ_REG32(MDC_LINE_SIZE) & 0xFF000000; 53471d7fec4Smrg 53571d7fec4Smrg /* ADD 2 TO SIZE FOR POSSIBLE START ADDRESS ALIGNMENTS */ 53671d7fec4Smrg 53771d7fec4Smrg WRITE_REG32(MDC_LINE_SIZE, ((size >> 3) + 2) | vid_buf_size); 53871d7fec4Smrg 53971d7fec4Smrg /* ALWAYS ENABLE VIDEO AND GRAPHICS DATA */ 54071d7fec4Smrg /* These bits are relics from a previous design and */ 54171d7fec4Smrg /* should always be enabled. */ 54271d7fec4Smrg 54371d7fec4Smrg dcfg |= (unsigned long)(MDC_DCFG_VDEN | MDC_DCFG_GDEN); 54471d7fec4Smrg 54571d7fec4Smrg /* SET PIXEL FORMAT */ 54671d7fec4Smrg 54771d7fec4Smrg dcfg |= bpp_mask; 54871d7fec4Smrg 54971d7fec4Smrg /* ENABLE TIMING GENERATOR, TIM. REG. UPDATES, PALETTE BYPASS */ 55071d7fec4Smrg /* AND VERT. INT. SELECT */ 55171d7fec4Smrg 55271d7fec4Smrg dcfg |= 55371d7fec4Smrg (unsigned long)(MDC_DCFG_TGEN | MDC_DCFG_TRUP | MDC_DCFG_PALB | 55471d7fec4Smrg MDC_DCFG_VISL); 55571d7fec4Smrg 55671d7fec4Smrg /* DISABLE ADDRESS MASKS */ 55771d7fec4Smrg 55871d7fec4Smrg dcfg |= MDC_DCFG_A20M; 55971d7fec4Smrg dcfg |= MDC_DCFG_A18M; 56071d7fec4Smrg 56171d7fec4Smrg /* SET FIFO PRIORITIES AND DISPLAY FIFO LOAD ENABLE */ 56271d7fec4Smrg /* Set the priorities higher for high resolution modes. */ 56371d7fec4Smrg 56471d7fec4Smrg if (pMode->hactive > 1024 || bpp == 32) 56571d7fec4Smrg gcfg |= 0x000A901; 56671d7fec4Smrg else 56771d7fec4Smrg gcfg |= 0x0006501; 56871d7fec4Smrg 56971d7fec4Smrg /* ENABLE FLAT PANEL CENTERING */ 57071d7fec4Smrg /* For panel modes having a resolution smaller than the */ 57171d7fec4Smrg /* panel resolution, turn on data centering. */ 57271d7fec4Smrg 57371d7fec4Smrg if (PanelEnable && ModeWidth < PanelWidth) 57471d7fec4Smrg dcfg |= MDC_DCFG_DCEN; 57571d7fec4Smrg 57671d7fec4Smrg /* COMBINE AND SET TIMING VALUES */ 57771d7fec4Smrg 57871d7fec4Smrg value = (unsigned long)(pMode->hactive - 1) | 57971d7fec4Smrg (((unsigned long)(pMode->htotal - 1)) << 16); 58071d7fec4Smrg WRITE_REG32(MDC_H_ACTIVE_TIMING, value); 58171d7fec4Smrg value = (unsigned long)(pMode->hblankstart - 1) | 58271d7fec4Smrg (((unsigned long)(pMode->hblankend - 1)) << 16); 58371d7fec4Smrg WRITE_REG32(MDC_H_BLANK_TIMING, value); 58471d7fec4Smrg value = (unsigned long)(pMode->hsyncstart - 1) | 58571d7fec4Smrg (((unsigned long)(pMode->hsyncend - 1)) << 16); 58671d7fec4Smrg WRITE_REG32(MDC_H_SYNC_TIMING, value); 58771d7fec4Smrg value = (unsigned long)(pMode->vactive - 1) | 58871d7fec4Smrg (((unsigned long)(pMode->vtotal - 1)) << 16); 58971d7fec4Smrg WRITE_REG32(MDC_V_ACTIVE_TIMING, value); 59071d7fec4Smrg value = (unsigned long)(pMode->vblankstart - 1) | 59171d7fec4Smrg (((unsigned long)(pMode->vblankend - 1)) << 16); 59271d7fec4Smrg WRITE_REG32(MDC_V_BLANK_TIMING, value); 59371d7fec4Smrg value = (unsigned long)(pMode->vsyncstart - 1) | 59471d7fec4Smrg (((unsigned long)(pMode->vsyncend - 1)) << 16); 59571d7fec4Smrg WRITE_REG32(MDC_V_SYNC_TIMING, value); 59671d7fec4Smrg 59771d7fec4Smrg WRITE_REG32(MDC_DISPLAY_CFG, dcfg); 59871d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 59971d7fec4Smrg 60071d7fec4Smrg /* CONFIGURE DISPLAY OUTPUT FROM VIDEO PROCESSOR */ 60171d7fec4Smrg 60271d7fec4Smrg gfx_set_display_control(((pMode->flags & GFX_MODE_NEG_HSYNC) ? 1 : 0) | 60371d7fec4Smrg ((pMode->flags & GFX_MODE_NEG_VSYNC) ? 2 : 0)); 60471d7fec4Smrg 60571d7fec4Smrg /* RESTORE VALUE OF MDC_UNLOCK */ 60671d7fec4Smrg 60771d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 60871d7fec4Smrg 60971d7fec4Smrg /* RESET THE PITCH VALUES IN THE GP */ 61071d7fec4Smrg 61171d7fec4Smrg gfx_reset_pitch((unsigned short)pitch); 61271d7fec4Smrg 61371d7fec4Smrg gfx_set_bpp((unsigned short)bpp); 61471d7fec4Smrg 61571d7fec4Smrg return GFX_STATUS_OK; 61671d7fec4Smrg} 61771d7fec4Smrg 61871d7fec4Smrg /*---------------------------------------------------------------------------- 61971d7fec4Smrg * GFX_IS_DISPLAY_MODE_SUPPORTED 62071d7fec4Smrg * 62171d7fec4Smrg * This routine sets the specified display mode. 62271d7fec4Smrg * 62371d7fec4Smrg * Returns 1 if successful, 0 if mode could not be set. 62471d7fec4Smrg *---------------------------------------------------------------------------- 62571d7fec4Smrg */ 62671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 62771d7fec4Smrgint 62871d7fec4Smrggu2_is_display_mode_supported(int xres, int yres, int bpp, int hz) 62971d7fec4Smrg#else 63071d7fec4Smrgint 63171d7fec4Smrggfx_is_display_mode_supported(int xres, int yres, int bpp, int hz) 63271d7fec4Smrg#endif 63371d7fec4Smrg{ 63471d7fec4Smrg unsigned int mode; 63571d7fec4Smrg unsigned long hz_flag = 0, bpp_flag = 0; 63671d7fec4Smrg 63771d7fec4Smrg /* SET FLAGS TO MATCH REFRESH RATE */ 63871d7fec4Smrg 63971d7fec4Smrg if (hz == 56) 64071d7fec4Smrg hz_flag = GFX_MODE_56HZ; 64171d7fec4Smrg if (hz == 60) 64271d7fec4Smrg hz_flag = GFX_MODE_60HZ; 64371d7fec4Smrg if (hz == 70) 64471d7fec4Smrg hz_flag = GFX_MODE_70HZ; 64571d7fec4Smrg if (hz == 72) 64671d7fec4Smrg hz_flag = GFX_MODE_72HZ; 64771d7fec4Smrg if (hz == 75) 64871d7fec4Smrg hz_flag = GFX_MODE_75HZ; 64971d7fec4Smrg if (hz == 85) 65071d7fec4Smrg hz_flag = GFX_MODE_85HZ; 65171d7fec4Smrg 65271d7fec4Smrg /* SET BPP FLAGS TO LIMIT MODE SELECTION */ 65371d7fec4Smrg 65471d7fec4Smrg switch (bpp) { 65571d7fec4Smrg case 8: 65671d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 65771d7fec4Smrg break; 65871d7fec4Smrg case 12: 65971d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 66071d7fec4Smrg break; 66171d7fec4Smrg case 15: 66271d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 66371d7fec4Smrg break; 66471d7fec4Smrg case 16: 66571d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 66671d7fec4Smrg break; 66771d7fec4Smrg case 32: 66871d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 66971d7fec4Smrg break; 67071d7fec4Smrg default: 67171d7fec4Smrg return (-1); 67271d7fec4Smrg } 67371d7fec4Smrg 67471d7fec4Smrg /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ 67571d7fec4Smrg 67671d7fec4Smrg for (mode = 0; mode < NUM_RC_DISPLAY_MODES; mode++) { 67771d7fec4Smrg if ((DisplayParams[mode].hactive == (unsigned short)xres) && 67871d7fec4Smrg (DisplayParams[mode].vactive == (unsigned short)yres) && 67971d7fec4Smrg (DisplayParams[mode].flags & hz_flag) && 68071d7fec4Smrg (DisplayParams[mode].flags & bpp_flag)) { 68171d7fec4Smrg 68271d7fec4Smrg /* REDCLOUD DOES NOT SUPPORT EMULATED VGA MODES */ 68371d7fec4Smrg 68471d7fec4Smrg if ((DisplayParams[mode].flags & GFX_MODE_PIXEL_DOUBLE) || 68571d7fec4Smrg (DisplayParams[mode].flags & GFX_MODE_LINE_DOUBLE)) 68671d7fec4Smrg continue; 68771d7fec4Smrg 68871d7fec4Smrg /* SET THE DISPLAY CONTROLLER FOR THE SELECTED MODE */ 68971d7fec4Smrg 69071d7fec4Smrg return (mode); 69171d7fec4Smrg } 69271d7fec4Smrg } 69371d7fec4Smrg return (-1); 69471d7fec4Smrg} 69571d7fec4Smrg 69671d7fec4Smrg/*---------------------------------------------------------------------------- 69771d7fec4Smrg * gfx_set_display_mode 69871d7fec4Smrg * 69971d7fec4Smrg * This routine sets the specified display mode. 70071d7fec4Smrg * 70171d7fec4Smrg * Returns 1 if successful, 0 if mode could not be set. 70271d7fec4Smrg *---------------------------------------------------------------------------- 70371d7fec4Smrg */ 70471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 70571d7fec4Smrgint 70671d7fec4Smrggu2_set_display_mode(int xres, int yres, int bpp, int hz) 70771d7fec4Smrg#else 70871d7fec4Smrgint 70971d7fec4Smrggfx_set_display_mode(int xres, int yres, int bpp, int hz) 71071d7fec4Smrg#endif 71171d7fec4Smrg{ 71271d7fec4Smrg int mode; 71371d7fec4Smrg 71471d7fec4Smrg /* DISABLE FLAT PANEL */ 71571d7fec4Smrg /* Flat Panel settings are enabled by the function gfx_set_fixed_timings */ 71671d7fec4Smrg /* and disabled by gfx_set_display_mode. */ 71771d7fec4Smrg 71871d7fec4Smrg PanelEnable = 0; 71971d7fec4Smrg 72071d7fec4Smrg mode = gfx_is_display_mode_supported(xres, yres, bpp, hz); 72171d7fec4Smrg if (mode >= 0) { 72271d7fec4Smrg if (gu2_set_specified_mode(&DisplayParams[mode], bpp) == GFX_STATUS_OK) 72371d7fec4Smrg return (1); 72471d7fec4Smrg } 72571d7fec4Smrg return (0); 72671d7fec4Smrg} 72771d7fec4Smrg 72871d7fec4Smrg/*---------------------------------------------------------------------------- 72971d7fec4Smrg * GFX_SET_DISPLAY_TIMINGS 73071d7fec4Smrg * 73171d7fec4Smrg * This routine sets the display controller mode using the specified timing 73271d7fec4Smrg * values (as opposed to using the tables internal to Durango). 73371d7fec4Smrg * 73471d7fec4Smrg * Returns GFX_STATUS_OK ON SUCCESS, GFX_STATUS_ERROR otherwise. 73571d7fec4Smrg *---------------------------------------------------------------------------- 73671d7fec4Smrg */ 73771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 73871d7fec4Smrgint 73971d7fec4Smrggu2_set_display_timings(unsigned short bpp, unsigned short flags, 74071d7fec4Smrg unsigned short hactive, unsigned short hblankstart, 74171d7fec4Smrg unsigned short hsyncstart, unsigned short hsyncend, 74271d7fec4Smrg unsigned short hblankend, unsigned short htotal, 74371d7fec4Smrg unsigned short vactive, unsigned short vblankstart, 74471d7fec4Smrg unsigned short vsyncstart, unsigned short vsyncend, 74571d7fec4Smrg unsigned short vblankend, unsigned short vtotal, 74671d7fec4Smrg unsigned long frequency) 74771d7fec4Smrg#else 74871d7fec4Smrgint 74971d7fec4Smrggfx_set_display_timings(unsigned short bpp, unsigned short flags, 75071d7fec4Smrg unsigned short hactive, unsigned short hblankstart, 75171d7fec4Smrg unsigned short hsyncstart, unsigned short hsyncend, 75271d7fec4Smrg unsigned short hblankend, unsigned short htotal, 75371d7fec4Smrg unsigned short vactive, unsigned short vblankstart, 75471d7fec4Smrg unsigned short vsyncstart, unsigned short vsyncend, 75571d7fec4Smrg unsigned short vblankend, unsigned short vtotal, 75671d7fec4Smrg unsigned long frequency) 75771d7fec4Smrg#endif 75871d7fec4Smrg{ 75971d7fec4Smrg /* SET MODE STRUCTURE WITH SPECIFIED VALUES */ 76071d7fec4Smrg 76171d7fec4Smrg gfx_display_mode.flags = 0; 76271d7fec4Smrg if (flags & 1) 76371d7fec4Smrg gfx_display_mode.flags |= GFX_MODE_NEG_HSYNC; 76471d7fec4Smrg if (flags & 2) 76571d7fec4Smrg gfx_display_mode.flags |= GFX_MODE_NEG_VSYNC; 76671d7fec4Smrg if (flags & 0x1000) 76771d7fec4Smrg gfx_display_mode.flags |= GFX_MODE_LOCK_TIMING; 76871d7fec4Smrg gfx_display_mode.hactive = hactive; 76971d7fec4Smrg gfx_display_mode.hblankstart = hblankstart; 77071d7fec4Smrg gfx_display_mode.hsyncstart = hsyncstart; 77171d7fec4Smrg gfx_display_mode.hsyncend = hsyncend; 77271d7fec4Smrg gfx_display_mode.hblankend = hblankend; 77371d7fec4Smrg gfx_display_mode.htotal = htotal; 77471d7fec4Smrg gfx_display_mode.vactive = vactive; 77571d7fec4Smrg gfx_display_mode.vblankstart = vblankstart; 77671d7fec4Smrg gfx_display_mode.vsyncstart = vsyncstart; 77771d7fec4Smrg gfx_display_mode.vsyncend = vsyncend; 77871d7fec4Smrg gfx_display_mode.vblankend = vblankend; 77971d7fec4Smrg gfx_display_mode.vtotal = vtotal; 78071d7fec4Smrg gfx_display_mode.frequency = frequency; 78171d7fec4Smrg 78271d7fec4Smrg /* CALL ROUTINE TO SET MODE */ 78371d7fec4Smrg 78471d7fec4Smrg return (gu2_set_specified_mode(&gfx_display_mode, bpp)); 78571d7fec4Smrg} 78671d7fec4Smrg 78771d7fec4Smrg/*---------------------------------------------------------------------------- 78871d7fec4Smrg * GFX_SET_VTOTAL 78971d7fec4Smrg * 79071d7fec4Smrg * This routine sets the display controller vertical total to 79171d7fec4Smrg * "vtotal". As a side effect it also sets vertical blank end. 79271d7fec4Smrg * It should be used when only this value needs to be changed, 79371d7fec4Smrg * due to speed considerations. 79471d7fec4Smrg * 79571d7fec4Smrg * Note: it is the caller's responsibility to make sure that 79671d7fec4Smrg * a legal vtotal is used, i.e. that "vtotal" is greater than or 79771d7fec4Smrg * equal to vsync end. 79871d7fec4Smrg * 79971d7fec4Smrg * Always returns 0. 80071d7fec4Smrg *---------------------------------------------------------------------------- 80171d7fec4Smrg */ 80271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 80371d7fec4Smrgint 80471d7fec4Smrggu2_set_vtotal(unsigned short vtotal) 80571d7fec4Smrg#else 80671d7fec4Smrgint 80771d7fec4Smrggfx_set_vtotal(unsigned short vtotal) 80871d7fec4Smrg#endif 80971d7fec4Smrg{ 81071d7fec4Smrg unsigned long unlock, dcfg, vactive, vblank; 81171d7fec4Smrg 81271d7fec4Smrg /* UNLOCK THE DISPLAY CONTROLLER REGISTERS */ 81371d7fec4Smrg 81471d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 81571d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 81671d7fec4Smrg 81771d7fec4Smrg /* READ THE CURRENT RC VALUES */ 81871d7fec4Smrg 81971d7fec4Smrg dcfg = READ_REG32(MDC_DISPLAY_CFG); 82071d7fec4Smrg vactive = READ_REG32(MDC_V_ACTIVE_TIMING); 82171d7fec4Smrg vblank = READ_REG32(MDC_V_BLANK_TIMING); 82271d7fec4Smrg 82371d7fec4Smrg /* DISABLE TIMING REGISTER UPDATES */ 82471d7fec4Smrg 82571d7fec4Smrg WRITE_REG32(MDC_DISPLAY_CFG, dcfg & ~(unsigned long)MDC_DCFG_TRUP); 82671d7fec4Smrg 82771d7fec4Smrg /* WRITE NEW TIMING VALUES */ 82871d7fec4Smrg 82971d7fec4Smrg WRITE_REG32(MDC_V_ACTIVE_TIMING, 83071d7fec4Smrg (vactive & MDC_VAT_VA_MASK) | (unsigned long)(vtotal - 83171d7fec4Smrg 1) << 16); 83271d7fec4Smrg WRITE_REG32(MDC_V_BLANK_TIMING, 83371d7fec4Smrg (vblank & MDC_VBT_VBS_MASK) | (unsigned long)(vtotal - 83471d7fec4Smrg 1) << 16); 83571d7fec4Smrg 83671d7fec4Smrg /* RESTORE OLD RC VALUES */ 83771d7fec4Smrg 83871d7fec4Smrg WRITE_REG32(MDC_DISPLAY_CFG, dcfg); 83971d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 84071d7fec4Smrg 84171d7fec4Smrg return (0); 84271d7fec4Smrg} 84371d7fec4Smrg 84471d7fec4Smrg/*--------------------------------------------------------------------------- 84571d7fec4Smrg * gfx_set_display_pitch 84671d7fec4Smrg * 84771d7fec4Smrg * This routine sets the pitch of the frame buffer to the specified value. 84871d7fec4Smrg *--------------------------------------------------------------------------- 84971d7fec4Smrg */ 85071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 85171d7fec4Smrgvoid 85271d7fec4Smrggu2_set_display_pitch(unsigned short pitch) 85371d7fec4Smrg#else 85471d7fec4Smrgvoid 85571d7fec4Smrggfx_set_display_pitch(unsigned short pitch) 85671d7fec4Smrg#endif 85771d7fec4Smrg{ 85871d7fec4Smrg unsigned long value = 0; 85971d7fec4Smrg unsigned long lock = READ_REG32(MDC_UNLOCK); 86071d7fec4Smrg 86171d7fec4Smrg value = READ_REG32(MDC_GFX_PITCH) & 0xFFFF0000; 86271d7fec4Smrg value |= (pitch >> 3); 86371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 86471d7fec4Smrg WRITE_REG32(MDC_GFX_PITCH, value); 86571d7fec4Smrg 86671d7fec4Smrg /* SET RENDERING PITCHES TO MATCH */ 86771d7fec4Smrg 86871d7fec4Smrg gfx_reset_pitch(pitch); 86971d7fec4Smrg 87071d7fec4Smrg /* SET THE FRAME DIRTY MODE */ 87171d7fec4Smrg /* Non-standard pitches, i.e. pitches that */ 87271d7fec4Smrg /* are not 1K, 2K or 4K must mark the entire */ 87371d7fec4Smrg /* frame as dirty when writing to the frame */ 87471d7fec4Smrg /* buffer. */ 87571d7fec4Smrg 87671d7fec4Smrg value = READ_REG32(MDC_GENERAL_CFG); 87771d7fec4Smrg 87871d7fec4Smrg if (pitch == 1024 || pitch == 2048 || pitch == 4096 || pitch == 8192) 87971d7fec4Smrg value &= ~(unsigned long)(MDC_GCFG_FDTY); 88071d7fec4Smrg else 88171d7fec4Smrg value |= (unsigned long)(MDC_GCFG_FDTY); 88271d7fec4Smrg 88371d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, value); 88471d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 88571d7fec4Smrg} 88671d7fec4Smrg 88771d7fec4Smrg/*--------------------------------------------------------------------------- 88871d7fec4Smrg * gfx_set_display_offset 88971d7fec4Smrg * 89071d7fec4Smrg * This routine sets the start address of the frame buffer. It is 89171d7fec4Smrg * typically used to pan across a virtual desktop (frame buffer larger than 89271d7fec4Smrg * the displayed screen) or to flip the display between multiple buffers. 89371d7fec4Smrg *--------------------------------------------------------------------------- 89471d7fec4Smrg */ 89571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 89671d7fec4Smrgvoid 89771d7fec4Smrggu2_set_display_offset(unsigned long offset) 89871d7fec4Smrg#else 89971d7fec4Smrgvoid 90071d7fec4Smrggfx_set_display_offset(unsigned long offset) 90171d7fec4Smrg#endif 90271d7fec4Smrg{ 90371d7fec4Smrg /* UPDATE FRAME BUFFER OFFSET */ 90471d7fec4Smrg unsigned long lock; 90571d7fec4Smrg 90671d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 90771d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 90871d7fec4Smrg 90971d7fec4Smrg /* START ADDRESS EFFECTS DISPLAY COMPRESSION */ 91071d7fec4Smrg /* Disable compression for non-zero start addresss values. */ 91171d7fec4Smrg /* Enable compression if offset is zero and comression is intended to */ 91271d7fec4Smrg /* be enabled from a previous call to "gfx_set_compression_enable". */ 91371d7fec4Smrg /* Compression should be disabled BEFORE the offset is changed */ 91471d7fec4Smrg /* and enabled AFTER the offset is changed. */ 91571d7fec4Smrg 91671d7fec4Smrg if (offset == 0) { 91771d7fec4Smrg WRITE_REG32(MDC_FB_ST_OFFSET, offset); 91871d7fec4Smrg if (gfx_compression_enabled) { 91971d7fec4Smrg /* WAIT FOR THE OFFSET TO BE LATCHED */ 92071d7fec4Smrg gfx_wait_vertical_blank(); 92171d7fec4Smrg gu2_enable_compression(); 92271d7fec4Smrg } 92371d7fec4Smrg } else { 92471d7fec4Smrg /* ONLY DISABLE COMPRESSION ONCE */ 92571d7fec4Smrg 92671d7fec4Smrg if (gfx_compression_active) 92771d7fec4Smrg gu2_disable_compression(); 92871d7fec4Smrg 92971d7fec4Smrg WRITE_REG32(MDC_FB_ST_OFFSET, offset); 93071d7fec4Smrg } 93171d7fec4Smrg 93271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 93371d7fec4Smrg} 93471d7fec4Smrg 93571d7fec4Smrg/*--------------------------------------------------------------------------- 93671d7fec4Smrg * gfx_set_display_palette_entry 93771d7fec4Smrg * 93871d7fec4Smrg * This routine sets an palette entry in the display controller. 93971d7fec4Smrg * A 32-bit X:R:G:B value. 94071d7fec4Smrg *--------------------------------------------------------------------------- 94171d7fec4Smrg */ 94271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 94371d7fec4Smrgint 94471d7fec4Smrggu2_set_display_palette_entry(unsigned long index, unsigned long palette) 94571d7fec4Smrg#else 94671d7fec4Smrgint 94771d7fec4Smrggfx_set_display_palette_entry(unsigned long index, unsigned long palette) 94871d7fec4Smrg#endif 94971d7fec4Smrg{ 95071d7fec4Smrg if (index > 0xFF) 95171d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 95271d7fec4Smrg 95371d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, index); 95471d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, palette); 95571d7fec4Smrg 95671d7fec4Smrg return (0); 95771d7fec4Smrg} 95871d7fec4Smrg 95971d7fec4Smrg/*--------------------------------------------------------------------------- 96071d7fec4Smrg * gfx_set_display_palette 96171d7fec4Smrg * 96271d7fec4Smrg * This routine sets the entire palette in the display controller. 96371d7fec4Smrg * A pointer is provided to a 256 entry table of 32-bit X:R:G:B values. 96471d7fec4Smrg *--------------------------------------------------------------------------- 96571d7fec4Smrg */ 96671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 96771d7fec4Smrgint 96871d7fec4Smrggu2_set_display_palette(unsigned long *palette) 96971d7fec4Smrg#else 97071d7fec4Smrgint 97171d7fec4Smrggfx_set_display_palette(unsigned long *palette) 97271d7fec4Smrg#endif 97371d7fec4Smrg{ 97471d7fec4Smrg unsigned long i; 97571d7fec4Smrg 97671d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0); 97771d7fec4Smrg 97871d7fec4Smrg if (palette) { 97971d7fec4Smrg for (i = 0; i < 256; i++) { 98071d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, palette[i]); 98171d7fec4Smrg } 98271d7fec4Smrg } 98371d7fec4Smrg return (0); 98471d7fec4Smrg} 98571d7fec4Smrg 98671d7fec4Smrg/*--------------------------------------------------------------------------- 98771d7fec4Smrg * gfx_set_cursor_enable 98871d7fec4Smrg * 98971d7fec4Smrg * This routine enables or disables the hardware cursor. 99071d7fec4Smrg * 99171d7fec4Smrg * WARNING: The cursor start offset must be set by setting the cursor 99271d7fec4Smrg * position before calling this routine to assure that memory reads do not 99371d7fec4Smrg * go past the end of graphics memory (this can hang GXm). 99471d7fec4Smrg *--------------------------------------------------------------------------- 99571d7fec4Smrg */ 99671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 99771d7fec4Smrgvoid 99871d7fec4Smrggu2_set_cursor_enable(int enable) 99971d7fec4Smrg#else 100071d7fec4Smrgvoid 100171d7fec4Smrggfx_set_cursor_enable(int enable) 100271d7fec4Smrg#endif 100371d7fec4Smrg{ 100471d7fec4Smrg unsigned long unlock, gcfg; 100571d7fec4Smrg 100671d7fec4Smrg /* SET OR CLEAR CURSOR ENABLE BIT */ 100771d7fec4Smrg 100871d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 100971d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 101071d7fec4Smrg if (enable) 101171d7fec4Smrg gcfg |= MDC_GCFG_CURE; 101271d7fec4Smrg else 101371d7fec4Smrg gcfg &= ~(MDC_GCFG_CURE); 101471d7fec4Smrg 101571d7fec4Smrg /* WRITE NEW REGISTER VALUE */ 101671d7fec4Smrg 101771d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 101871d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 101971d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 102071d7fec4Smrg} 102171d7fec4Smrg 102271d7fec4Smrg/*--------------------------------------------------------------------------- 102371d7fec4Smrg * gfx_set_cursor_colors 102471d7fec4Smrg * 102571d7fec4Smrg * This routine sets the colors of the hardware cursor. 102671d7fec4Smrg *--------------------------------------------------------------------------- 102771d7fec4Smrg */ 102871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 102971d7fec4Smrgvoid 103071d7fec4Smrggu2_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor) 103171d7fec4Smrg#else 103271d7fec4Smrgvoid 103371d7fec4Smrggfx_set_cursor_colors(unsigned long bkcolor, unsigned long fgcolor) 103471d7fec4Smrg#endif 103571d7fec4Smrg{ 103671d7fec4Smrg /* SET CURSOR COLORS */ 103771d7fec4Smrg 103871d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0x100); 103971d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, bkcolor); 104071d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, fgcolor); 104171d7fec4Smrg} 104271d7fec4Smrg 104371d7fec4Smrg/*--------------------------------------------------------------------------- 104471d7fec4Smrg * gfx_set_cursor_position 104571d7fec4Smrg * 104671d7fec4Smrg * This routine sets the position of the hardware cusror. The starting 104771d7fec4Smrg * offset of the cursor buffer must be specified so that the routine can 104871d7fec4Smrg * properly clip scanlines if the cursor is off the top of the screen. 104971d7fec4Smrg *--------------------------------------------------------------------------- 105071d7fec4Smrg */ 105171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 105271d7fec4Smrgvoid 105371d7fec4Smrggu2_set_cursor_position(unsigned long memoffset, 105471d7fec4Smrg unsigned short xpos, unsigned short ypos, 105571d7fec4Smrg unsigned short xhotspot, unsigned short yhotspot) 105671d7fec4Smrg#else 105771d7fec4Smrgvoid 105871d7fec4Smrggfx_set_cursor_position(unsigned long memoffset, 105971d7fec4Smrg unsigned short xpos, unsigned short ypos, 106071d7fec4Smrg unsigned short xhotspot, unsigned short yhotspot) 106171d7fec4Smrg#endif 106271d7fec4Smrg{ 106371d7fec4Smrg unsigned long unlock; 106471d7fec4Smrg 106571d7fec4Smrg short x = (short)xpos - (short)xhotspot; 106671d7fec4Smrg short y = (short)ypos - (short)yhotspot; 106771d7fec4Smrg short xoffset = 0; 106871d7fec4Smrg short yoffset = 0; 106971d7fec4Smrg 107071d7fec4Smrg if (x < -63) 107171d7fec4Smrg return; 107271d7fec4Smrg if (y < -63) 107371d7fec4Smrg return; 107471d7fec4Smrg 107571d7fec4Smrg if (PanelEnable) { 107671d7fec4Smrg if ((ModeWidth > PanelWidth) || (ModeHeight > PanelHeight)) { 107771d7fec4Smrg gfx_enable_panning(xpos, ypos); 107871d7fec4Smrg x = x - (unsigned short)panelLeft; 107971d7fec4Smrg y = y - (unsigned short)panelTop; 108071d7fec4Smrg } 108171d7fec4Smrg } 108271d7fec4Smrg 108371d7fec4Smrg /* ADJUST OFFSETS */ 108471d7fec4Smrg /* Cursor movement and panning work as follows: The cursor position */ 108571d7fec4Smrg /* refers to where the hotspot of the cursor is located. However, for */ 108671d7fec4Smrg /* non-zero hotspots, the cursor buffer actually begins before the */ 108771d7fec4Smrg /* specified position. */ 108871d7fec4Smrg 108971d7fec4Smrg if (x < 0) { 109071d7fec4Smrg xoffset = -x; 109171d7fec4Smrg x = 0; 109271d7fec4Smrg } 109371d7fec4Smrg if (y < 0) { 109471d7fec4Smrg yoffset = -y; 109571d7fec4Smrg y = 0; 109671d7fec4Smrg } 109771d7fec4Smrg memoffset += (unsigned long)yoffset << 4; 109871d7fec4Smrg 109971d7fec4Smrg /* SET CURSOR POSITION */ 110071d7fec4Smrg 110171d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 110271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 110371d7fec4Smrg WRITE_REG32(MDC_CURS_ST_OFFSET, memoffset); 110471d7fec4Smrg WRITE_REG32(MDC_CURSOR_X, (unsigned long)x | 110571d7fec4Smrg (((unsigned long)xoffset) << 11)); 110671d7fec4Smrg WRITE_REG32(MDC_CURSOR_Y, (unsigned long)y | 110771d7fec4Smrg (((unsigned long)yoffset) << 11)); 110871d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 110971d7fec4Smrg} 111071d7fec4Smrg 111171d7fec4Smrg/*--------------------------------------------------------------------------- 111271d7fec4Smrg * gfx_set_cursor_shape32 111371d7fec4Smrg * 111471d7fec4Smrg * This routine loads 32x32 cursor data into the cursor buffer in graphics memory. 111571d7fec4Smrg * As the Redcloud cursor is actually 64x64, we must pad the outside of the 111671d7fec4Smrg * cursor data with transparent pixels. 111771d7fec4Smrg *--------------------------------------------------------------------------- 111871d7fec4Smrg */ 111971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 112071d7fec4Smrgvoid 112171d7fec4Smrggu2_set_cursor_shape32(unsigned long memoffset, 112271d7fec4Smrg unsigned long *andmask, unsigned long *xormask) 112371d7fec4Smrg#else 112471d7fec4Smrgvoid 112571d7fec4Smrggfx_set_cursor_shape32(unsigned long memoffset, 112671d7fec4Smrg unsigned long *andmask, unsigned long *xormask) 112771d7fec4Smrg#endif 112871d7fec4Smrg{ 112971d7fec4Smrg int i; 113071d7fec4Smrg 113171d7fec4Smrg for (i = 0; i < 32; i++) { 113271d7fec4Smrg /* EVEN QWORDS CONTAIN THE AND MASK */ 113371d7fec4Smrg 113471d7fec4Smrg WRITE_FB32(memoffset, 0xFFFFFFFF); 113571d7fec4Smrg WRITE_FB32(memoffset + 4, andmask[i]); 113671d7fec4Smrg 113771d7fec4Smrg /* ODD QWORDS CONTAIN THE XOR MASK */ 113871d7fec4Smrg 113971d7fec4Smrg WRITE_FB32(memoffset + 8, 0x00000000); 114071d7fec4Smrg WRITE_FB32(memoffset + 12, xormask[i]); 114171d7fec4Smrg 114271d7fec4Smrg memoffset += 16; 114371d7fec4Smrg } 114471d7fec4Smrg 114571d7fec4Smrg /* FILL THE LOWER HALF OF THE BUFFER WITH TRANSPARENT PIXELS */ 114671d7fec4Smrg 114771d7fec4Smrg for (i = 0; i < 32; i++) { 114871d7fec4Smrg WRITE_FB32(memoffset, 0xFFFFFFFF); 114971d7fec4Smrg WRITE_FB32(memoffset + 4, 0xFFFFFFFF); 115071d7fec4Smrg WRITE_FB32(memoffset + 8, 0x00000000); 115171d7fec4Smrg WRITE_FB32(memoffset + 12, 0x00000000); 115271d7fec4Smrg 115371d7fec4Smrg memoffset += 16; 115471d7fec4Smrg } 115571d7fec4Smrg} 115671d7fec4Smrg 115771d7fec4Smrg/*--------------------------------------------------------------------------- 115871d7fec4Smrg * gfx_set_cursor_shape64 115971d7fec4Smrg * 116071d7fec4Smrg * This routine loads 64x64 cursor data into the cursor buffer in graphics memory. 116171d7fec4Smrg *--------------------------------------------------------------------------- 116271d7fec4Smrg */ 116371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 116471d7fec4Smrgvoid 116571d7fec4Smrggu2_set_cursor_shape64(unsigned long memoffset, 116671d7fec4Smrg unsigned long *andmask, unsigned long *xormask) 116771d7fec4Smrg#else 116871d7fec4Smrgvoid 116971d7fec4Smrggfx_set_cursor_shape64(unsigned long memoffset, 117071d7fec4Smrg unsigned long *andmask, unsigned long *xormask) 117171d7fec4Smrg#endif 117271d7fec4Smrg{ 117371d7fec4Smrg int i; 117471d7fec4Smrg 117571d7fec4Smrg for (i = 0; i < 128; i += 2) { 117671d7fec4Smrg /* EVEN QWORDS CONTAIN THE AND MASK */ 117771d7fec4Smrg /* We invert the dwords to prevent the calling */ 117871d7fec4Smrg /* application from having to think in terms of Qwords. */ 117971d7fec4Smrg /* The hardware data order is actually 63:0, or 31:0 of */ 118071d7fec4Smrg /* the second dword followed by 31:0 of the first dword. */ 118171d7fec4Smrg 118271d7fec4Smrg WRITE_FB32(memoffset, andmask[i + 1]); 118371d7fec4Smrg WRITE_FB32(memoffset + 4, andmask[i]); 118471d7fec4Smrg 118571d7fec4Smrg /* ODD QWORDS CONTAIN THE XOR MASK */ 118671d7fec4Smrg 118771d7fec4Smrg WRITE_FB32(memoffset + 8, xormask[i + 1]); 118871d7fec4Smrg WRITE_FB32(memoffset + 12, xormask[i]); 118971d7fec4Smrg 119071d7fec4Smrg memoffset += 16; 119171d7fec4Smrg } 119271d7fec4Smrg} 119371d7fec4Smrg 119471d7fec4Smrg/*--------------------------------------------------------------------------- 119571d7fec4Smrg * gfx_set_icon_enable 119671d7fec4Smrg * 119771d7fec4Smrg * This routine enables or disables the hardware icon. The icon position 119871d7fec4Smrg * and colors should be programmed prior to calling this routine for the 119971d7fec4Smrg * first time. 120071d7fec4Smrg *--------------------------------------------------------------------------- 120171d7fec4Smrg */ 120271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 120371d7fec4Smrgvoid 120471d7fec4Smrggu2_set_icon_enable(int enable) 120571d7fec4Smrg#else 120671d7fec4Smrgvoid 120771d7fec4Smrggfx_set_icon_enable(int enable) 120871d7fec4Smrg#endif 120971d7fec4Smrg{ 121071d7fec4Smrg unsigned long unlock, gcfg; 121171d7fec4Smrg 121271d7fec4Smrg /* SET OR CLEAR ICON ENABLE BIT */ 121371d7fec4Smrg 121471d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 121571d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 121671d7fec4Smrg if (enable) 121771d7fec4Smrg gcfg |= MDC_GCFG_ICNE; 121871d7fec4Smrg else 121971d7fec4Smrg gcfg &= ~(MDC_GCFG_ICNE); 122071d7fec4Smrg 122171d7fec4Smrg /* WRITE NEW REGISTER VALUE */ 122271d7fec4Smrg 122371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 122471d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 122571d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 122671d7fec4Smrg} 122771d7fec4Smrg 122871d7fec4Smrg/*--------------------------------------------------------------------------- 122971d7fec4Smrg * gfx_set_icon_colors 123071d7fec4Smrg * 123171d7fec4Smrg * This routine sets the three icon colors. 123271d7fec4Smrg *--------------------------------------------------------------------------- 123371d7fec4Smrg */ 123471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 123571d7fec4Smrgvoid 123671d7fec4Smrggu2_set_icon_colors(unsigned long color0, unsigned long color1, 123771d7fec4Smrg unsigned long color2) 123871d7fec4Smrg#else 123971d7fec4Smrgvoid 124071d7fec4Smrggfx_set_icon_colors(unsigned long color0, unsigned long color1, 124171d7fec4Smrg unsigned long color2) 124271d7fec4Smrg#endif 124371d7fec4Smrg{ 124471d7fec4Smrg /* ICON COLORS LOCATED AT PALETTE INDEXES 102-104h */ 124571d7fec4Smrg 124671d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0x102); 124771d7fec4Smrg 124871d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, color0); 124971d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, color1); 125071d7fec4Smrg WRITE_REG32(MDC_PAL_DATA, color2); 125171d7fec4Smrg} 125271d7fec4Smrg 125371d7fec4Smrg/*--------------------------------------------------------------------------- 125471d7fec4Smrg * gfx_set_icon_position 125571d7fec4Smrg * 125671d7fec4Smrg * This routine sets the starting X coordinate for the hardware icon and the 125771d7fec4Smrg * memory offset for the icon buffer. 125871d7fec4Smrg *--------------------------------------------------------------------------- 125971d7fec4Smrg */ 126071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 126171d7fec4Smrgvoid 126271d7fec4Smrggu2_set_icon_position(unsigned long memoffset, unsigned short xpos) 126371d7fec4Smrg#else 126471d7fec4Smrgvoid 126571d7fec4Smrggfx_set_icon_position(unsigned long memoffset, unsigned short xpos) 126671d7fec4Smrg#endif 126771d7fec4Smrg{ 126871d7fec4Smrg unsigned long lock = READ_REG32(MDC_UNLOCK); 126971d7fec4Smrg 127071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 127171d7fec4Smrg 127271d7fec4Smrg /* PROGRAM THE MEMORY OFFSET */ 127371d7fec4Smrg 127471d7fec4Smrg WRITE_REG32(MDC_ICON_ST_OFFSET, memoffset & 0x0FFFFFFF); 127571d7fec4Smrg 127671d7fec4Smrg /* PROGRAM THE XCOORDINATE */ 127771d7fec4Smrg 127871d7fec4Smrg WRITE_REG32(MDC_ICON_X, (unsigned long)(xpos & 0x07FF)); 127971d7fec4Smrg 128071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 128171d7fec4Smrg} 128271d7fec4Smrg 128371d7fec4Smrg/*--------------------------------------------------------------------------- 128471d7fec4Smrg * gfx_set_icon_shape64 128571d7fec4Smrg * 128671d7fec4Smrg * This routine initializes the icon buffer according to the current mode. 128771d7fec4Smrg *--------------------------------------------------------------------------- 128871d7fec4Smrg */ 128971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 129071d7fec4Smrgvoid 129171d7fec4Smrggu2_set_icon_shape64(unsigned long memoffset, unsigned long *andmask, 129271d7fec4Smrg unsigned long *xormask, unsigned int lines) 129371d7fec4Smrg#else 129471d7fec4Smrgvoid 129571d7fec4Smrggfx_set_icon_shape64(unsigned long memoffset, unsigned long *andmask, 129671d7fec4Smrg unsigned long *xormask, unsigned int lines) 129771d7fec4Smrg#endif 129871d7fec4Smrg{ 129971d7fec4Smrg unsigned short i, height; 130071d7fec4Smrg 130171d7fec4Smrg height = lines << 1; 130271d7fec4Smrg 130371d7fec4Smrg for (i = 0; i < height; i += 2) { 130471d7fec4Smrg /* EVEN QWORDS CONTAIN THE AND MASK */ 130571d7fec4Smrg /* Swap dwords to hide qword constraint */ 130671d7fec4Smrg 130771d7fec4Smrg WRITE_FB32(memoffset, andmask[i + 1]); 130871d7fec4Smrg WRITE_FB32(memoffset + 4, andmask[i]); 130971d7fec4Smrg 131071d7fec4Smrg /* ODD QWORDS CONTAIN THE XOR MASK */ 131171d7fec4Smrg 131271d7fec4Smrg WRITE_FB32(memoffset + 8, xormask[i + 1]); 131371d7fec4Smrg WRITE_FB32(memoffset + 12, xormask[i]); 131471d7fec4Smrg 131571d7fec4Smrg memoffset += 16; 131671d7fec4Smrg } 131771d7fec4Smrg} 131871d7fec4Smrg 131971d7fec4Smrg/*--------------------------------------------------------------------------- 132071d7fec4Smrg * gu2_enable_compression 132171d7fec4Smrg * 132271d7fec4Smrg * This is a private routine to this module (not exposed in the Durango API). 132371d7fec4Smrg * It enables display compression. 132471d7fec4Smrg *--------------------------------------------------------------------------- 132571d7fec4Smrg */ 132671d7fec4Smrgvoid 132771d7fec4Smrggu2_enable_compression(void) 132871d7fec4Smrg{ 132971d7fec4Smrg unsigned long unlock, gcfg, temp; 133071d7fec4Smrg 133171d7fec4Smrg /* DO NOT ENABLE IF START ADDRESS IS NOT ZERO */ 133271d7fec4Smrg 133371d7fec4Smrg if (READ_REG32(MDC_FB_ST_OFFSET) & 0x0FFFFFFF) 133471d7fec4Smrg return; 133571d7fec4Smrg 133671d7fec4Smrg /* SET GLOBAL INDICATOR */ 133771d7fec4Smrg 133871d7fec4Smrg gfx_compression_active = 1; 133971d7fec4Smrg 134071d7fec4Smrg /* CLEAR DIRTY/VALID BITS IN MEMORY CONTROLLER */ 134171d7fec4Smrg /* Software is required to do this before enabling compression. */ 134271d7fec4Smrg /* Don't want controller to think that old lines are still valid. */ 134371d7fec4Smrg /* Writing a 1 to bit 0 of the DV Control register will force the */ 134471d7fec4Smrg /* hardware to clear all the valid bits. */ 134571d7fec4Smrg 134671d7fec4Smrg temp = READ_REG32(MDC_DV_CTL); 134771d7fec4Smrg WRITE_REG32(MDC_DV_CTL, temp | 0x00000001); 134871d7fec4Smrg 134971d7fec4Smrg /* TURN ON COMPRESSION CONTROL BITS */ 135071d7fec4Smrg 135171d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 135271d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 135371d7fec4Smrg gcfg |= MDC_GCFG_CMPE | MDC_GCFG_DECE; 135471d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 135571d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 135671d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 135771d7fec4Smrg} 135871d7fec4Smrg 135971d7fec4Smrg/*--------------------------------------------------------------------------- 136071d7fec4Smrg * gu2_disable_compression 136171d7fec4Smrg * 136271d7fec4Smrg * This is a private routine to this module (not exposed in the Durango API). 136371d7fec4Smrg * It disables display compression. 136471d7fec4Smrg *--------------------------------------------------------------------------- 136571d7fec4Smrg */ 136671d7fec4Smrgvoid 136771d7fec4Smrggu2_disable_compression(void) 136871d7fec4Smrg{ 136971d7fec4Smrg unsigned long unlock, gcfg; 137071d7fec4Smrg 137171d7fec4Smrg /* SET GLOBAL INDICATOR */ 137271d7fec4Smrg 137371d7fec4Smrg gfx_compression_active = 0; 137471d7fec4Smrg 137571d7fec4Smrg /* TURN OFF COMPRESSION CONTROL BITS */ 137671d7fec4Smrg 137771d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 137871d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 137971d7fec4Smrg gcfg &= ~(MDC_GCFG_CMPE | MDC_GCFG_DECE); 138071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 138171d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 138271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 138371d7fec4Smrg} 138471d7fec4Smrg 138571d7fec4Smrg/*--------------------------------------------------------------------------- 138671d7fec4Smrg * gfx_set_compression_enable 138771d7fec4Smrg * 138871d7fec4Smrg * This routine enables or disables display compression. 138971d7fec4Smrg *--------------------------------------------------------------------------- 139071d7fec4Smrg */ 139171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 139271d7fec4Smrgint 139371d7fec4Smrggu2_set_compression_enable(int enable) 139471d7fec4Smrg#else 139571d7fec4Smrgint 139671d7fec4Smrggfx_set_compression_enable(int enable) 139771d7fec4Smrg#endif 139871d7fec4Smrg{ 139971d7fec4Smrg /* SET GLOBAL VARIABLE FOR INDENDED STATE */ 140071d7fec4Smrg /* Compression can only be enabled for non-zero start address values. */ 140171d7fec4Smrg /* Keep state to enable compression on start address changes. */ 140271d7fec4Smrg 140371d7fec4Smrg gfx_compression_enabled = enable; 140471d7fec4Smrg if (enable) 140571d7fec4Smrg gu2_enable_compression(); 140671d7fec4Smrg else 140771d7fec4Smrg gu2_disable_compression(); 140871d7fec4Smrg return (0); 140971d7fec4Smrg} 141071d7fec4Smrg 141171d7fec4Smrg/*--------------------------------------------------------------------------- 141271d7fec4Smrg * gfx_set_compression_offset 141371d7fec4Smrg * 141471d7fec4Smrg * This routine sets the base offset for the compression buffer. 141571d7fec4Smrg *--------------------------------------------------------------------------- 141671d7fec4Smrg */ 141771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 141871d7fec4Smrgint 141971d7fec4Smrggu2_set_compression_offset(unsigned long offset) 142071d7fec4Smrg#else 142171d7fec4Smrgint 142271d7fec4Smrggfx_set_compression_offset(unsigned long offset) 142371d7fec4Smrg#endif 142471d7fec4Smrg{ 142571d7fec4Smrg unsigned long lock; 142671d7fec4Smrg 142771d7fec4Smrg /* MUST BE 16-BYTE ALIGNED FOR REDCLOUD */ 142871d7fec4Smrg 142971d7fec4Smrg if (offset & 0x0F) 143071d7fec4Smrg return (1); 143171d7fec4Smrg 143271d7fec4Smrg /* SET REGISTER VALUE */ 143371d7fec4Smrg 143471d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 143571d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 143671d7fec4Smrg WRITE_REG32(MDC_CB_ST_OFFSET, offset & 0x0FFFFFFF); 143771d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 143871d7fec4Smrg 143971d7fec4Smrg return (0); 144071d7fec4Smrg} 144171d7fec4Smrg 144271d7fec4Smrg/*--------------------------------------------------------------------------- 144371d7fec4Smrg * gfx_set_compression_pitch 144471d7fec4Smrg * 144571d7fec4Smrg * This routine sets the pitch, in bytes, of the compression buffer. 144671d7fec4Smrg *--------------------------------------------------------------------------- 144771d7fec4Smrg */ 144871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 144971d7fec4Smrgint 145071d7fec4Smrggu2_set_compression_pitch(unsigned short pitch) 145171d7fec4Smrg#else 145271d7fec4Smrgint 145371d7fec4Smrggfx_set_compression_pitch(unsigned short pitch) 145471d7fec4Smrg#endif 145571d7fec4Smrg{ 145671d7fec4Smrg unsigned long lock, line_delta; 145771d7fec4Smrg 145871d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 145971d7fec4Smrg 146071d7fec4Smrg /* SET REGISTER VALUE */ 146171d7fec4Smrg 146271d7fec4Smrg line_delta = READ_REG32(MDC_GFX_PITCH) & 0x0000FFFF; 146371d7fec4Smrg line_delta |= (((unsigned long)pitch << 13) & 0xFFFF0000); 146471d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 146571d7fec4Smrg WRITE_REG32(MDC_GFX_PITCH, line_delta); 146671d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 146771d7fec4Smrg return (0); 146871d7fec4Smrg} 146971d7fec4Smrg 147071d7fec4Smrg/*--------------------------------------------------------------------------- 147171d7fec4Smrg * gfx_set_compression_size 147271d7fec4Smrg * 147371d7fec4Smrg * This routine sets the line size of the compression buffer, which is the 147471d7fec4Smrg * maximum number of bytes allowed to store a compressed line. 147571d7fec4Smrg *--------------------------------------------------------------------------- 147671d7fec4Smrg */ 147771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 147871d7fec4Smrgint 147971d7fec4Smrggu2_set_compression_size(unsigned short size) 148071d7fec4Smrg#else 148171d7fec4Smrgint 148271d7fec4Smrggfx_set_compression_size(unsigned short size) 148371d7fec4Smrg#endif 148471d7fec4Smrg{ 148571d7fec4Smrg unsigned long lock, buf_size; 148671d7fec4Smrg 148771d7fec4Smrg /* SUBTRACT 32 FROM SIZE */ 148871d7fec4Smrg /* The display controller will actually write */ 148971d7fec4Smrg /* 4 extra QWords. So, if we assume that "size" */ 149071d7fec4Smrg /* refers to the allocated size, we must subtract */ 149171d7fec4Smrg /* 32 bytes. */ 149271d7fec4Smrg 149371d7fec4Smrg size -= 32; 149471d7fec4Smrg 149571d7fec4Smrg /* SET REGISTER VALUE */ 149671d7fec4Smrg 149771d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 149871d7fec4Smrg buf_size = READ_REG32(MDC_LINE_SIZE) & 0xFF80FFFF; 149971d7fec4Smrg buf_size |= ((((unsigned long)size >> 3) + 1) & 0x7F) << 16; 150071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 150171d7fec4Smrg WRITE_REG32(MDC_LINE_SIZE, buf_size); 150271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 150371d7fec4Smrg return (0); 150471d7fec4Smrg} 150571d7fec4Smrg 150671d7fec4Smrg/*--------------------------------------------------------------------------- 150771d7fec4Smrg * gfx_set_display_video_format (PRIVATE ROUTINE - NOT PART OF API) 150871d7fec4Smrg * 150971d7fec4Smrg * This routine is called by "gfx_set_video_format". It abstracts the 151071d7fec4Smrg * version of the display controller from the video overlay routines. 151171d7fec4Smrg *--------------------------------------------------------------------------- 151271d7fec4Smrg */ 151371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 151471d7fec4Smrgvoid 151571d7fec4Smrggu2_set_display_video_format(unsigned long format) 151671d7fec4Smrg#else 151771d7fec4Smrgvoid 151871d7fec4Smrggfx_set_display_video_format(unsigned long format) 151971d7fec4Smrg#endif 152071d7fec4Smrg{ 152171d7fec4Smrg unsigned long gcfg, lock; 152271d7fec4Smrg 152371d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 152471d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 152571d7fec4Smrg 152671d7fec4Smrg switch (format) { 152771d7fec4Smrg case VIDEO_FORMAT_Y0Y1Y2Y3: 152871d7fec4Smrg case VIDEO_FORMAT_Y3Y2Y1Y0: 152971d7fec4Smrg case VIDEO_FORMAT_Y1Y0Y3Y2: 153071d7fec4Smrg case VIDEO_FORMAT_Y1Y2Y3Y0: 153171d7fec4Smrg 153271d7fec4Smrg gcfg |= MDC_GCFG_YUVM; 153371d7fec4Smrg break; 153471d7fec4Smrg 153571d7fec4Smrg default: 153671d7fec4Smrg 153771d7fec4Smrg gcfg &= ~MDC_GCFG_YUVM; 153871d7fec4Smrg break; 153971d7fec4Smrg } 154071d7fec4Smrg 154171d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 154271d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 154371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 154471d7fec4Smrg} 154571d7fec4Smrg 154671d7fec4Smrg/*--------------------------------------------------------------------------- 154771d7fec4Smrg * gfx_set_display_video_enable (PRIVATE ROUTINE - NOT PART OF API) 154871d7fec4Smrg * 154971d7fec4Smrg * This routine is called by "gfx_set_video_enable". It abstracts the 155071d7fec4Smrg * version of the display controller from the video overlay routines. 155171d7fec4Smrg *--------------------------------------------------------------------------- 155271d7fec4Smrg */ 155371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 155471d7fec4Smrgvoid 155571d7fec4Smrggu2_set_display_video_enable(int enable) 155671d7fec4Smrg#else 155771d7fec4Smrgvoid 155871d7fec4Smrggfx_set_display_video_enable(int enable) 155971d7fec4Smrg#endif 156071d7fec4Smrg{ 156171d7fec4Smrg unsigned long lock, gcfg, dcfg; 156271d7fec4Smrg 156371d7fec4Smrg /* READ CURRENT VALUES */ 156471d7fec4Smrg 156571d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 156671d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 156771d7fec4Smrg dcfg = READ_REG32(MDC_DISPLAY_CFG); 156871d7fec4Smrg 156971d7fec4Smrg /* SET OR CLEAR VIDEO ENABLE IN GENERAL_CFG */ 157071d7fec4Smrg 157171d7fec4Smrg if (enable) 157271d7fec4Smrg gcfg |= MDC_GCFG_VIDE; 157371d7fec4Smrg else 157471d7fec4Smrg gcfg &= ~MDC_GCFG_VIDE; 157571d7fec4Smrg 157671d7fec4Smrg /* WRITE REGISTER */ 157771d7fec4Smrg 157871d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 157971d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 158071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 158171d7fec4Smrg} 158271d7fec4Smrg 158371d7fec4Smrg/*--------------------------------------------------------------------------- 158471d7fec4Smrg * gfx_set_display_video_size (PRIVATE ROUTINE - NOT PART OF API) 158571d7fec4Smrg * 158671d7fec4Smrg * This routine is called by "gfx_set_video_size". It abstracts the 158771d7fec4Smrg * version of the display controller from the video overlay routines. 158871d7fec4Smrg *--------------------------------------------------------------------------- 158971d7fec4Smrg */ 159071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 159171d7fec4Smrgvoid 159271d7fec4Smrggu2_set_display_video_size(unsigned short width, unsigned short height) 159371d7fec4Smrg#else 159471d7fec4Smrgvoid 159571d7fec4Smrggfx_set_display_video_size(unsigned short width, unsigned short height) 159671d7fec4Smrg#endif 159771d7fec4Smrg{ 159871d7fec4Smrg unsigned long lock, value, yuv_420; 159971d7fec4Smrg 160071d7fec4Smrg /* READ CURRENT VALUES */ 160171d7fec4Smrg 160271d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 160371d7fec4Smrg value = READ_REG32(MDC_LINE_SIZE) & 0x00FFFFFF; 160471d7fec4Smrg yuv_420 = READ_REG32(MDC_GENERAL_CFG) & MDC_GCFG_YUVM; 160571d7fec4Smrg 160671d7fec4Smrg /* LINE WIDTH IS 1/4 FOR 4:2:0 VIDEO */ 160771d7fec4Smrg /* All data must be 32-byte aligned. */ 160871d7fec4Smrg 160971d7fec4Smrg if (yuv_420) { 161071d7fec4Smrg width >>= 1; 161171d7fec4Smrg width = (width + 7) & 0xFFF8; 161271d7fec4Smrg } else { 161371d7fec4Smrg width <<= 1; 161471d7fec4Smrg width = (width + 31) & 0xFFE0; 161571d7fec4Smrg } 161671d7fec4Smrg 161771d7fec4Smrg /* ONLY THE LINE SIZE IS PROGRAMMED IN THE DISPLAY CONTROLLER */ 161871d7fec4Smrg 161971d7fec4Smrg value |= ((unsigned long)width << 21); 162071d7fec4Smrg 162171d7fec4Smrg /* WRITE THE REGISTER */ 162271d7fec4Smrg 162371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 162471d7fec4Smrg WRITE_REG32(MDC_LINE_SIZE, value); 162571d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 162671d7fec4Smrg} 162771d7fec4Smrg 162871d7fec4Smrg/*--------------------------------------------------------------------------- 162971d7fec4Smrg * gfx_set_display_video_offset (PRIVATE ROUTINE - NOT PART OF API) 163071d7fec4Smrg * 163171d7fec4Smrg * This routine is called by "gfx_set_video_offset". It abstracts the 163271d7fec4Smrg * version of the display controller from the video overlay routines. 163371d7fec4Smrg *--------------------------------------------------------------------------- 163471d7fec4Smrg */ 163571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 163671d7fec4Smrgvoid 163771d7fec4Smrggu2_set_display_video_offset(unsigned long offset) 163871d7fec4Smrg#else 163971d7fec4Smrgvoid 164071d7fec4Smrggfx_set_display_video_offset(unsigned long offset) 164171d7fec4Smrg#endif 164271d7fec4Smrg{ 164371d7fec4Smrg unsigned long lock; 164471d7fec4Smrg 164571d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 164671d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 164771d7fec4Smrg offset &= 0x0FFFFFF0; 164871d7fec4Smrg WRITE_REG32(MDC_VID_Y_ST_OFFSET, offset); 164971d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 165071d7fec4Smrg} 165171d7fec4Smrg 165271d7fec4Smrg/*--------------------------------------------------------------------------- 165371d7fec4Smrg * gfx_set_display_video_yuv_offsets (PRIVATE ROUTINE - NOT PART OF API) 165471d7fec4Smrg * 165571d7fec4Smrg * This routine is called by gfx_set_video_yuv_offsets. It abstracts the version 165671d7fec4Smrg * of the display controller from the video overlay routines. 165771d7fec4Smrg *--------------------------------------------------------------------------- 165871d7fec4Smrg */ 165971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 166071d7fec4Smrgvoid 166171d7fec4Smrggu2_set_display_video_yuv_offsets(unsigned long yoffset, 166271d7fec4Smrg unsigned long uoffset, 166371d7fec4Smrg unsigned long voffset) 166471d7fec4Smrg#else 166571d7fec4Smrgvoid 166671d7fec4Smrggfx_set_display_video_yuv_offsets(unsigned long yoffset, 166771d7fec4Smrg unsigned long uoffset, 166871d7fec4Smrg unsigned long voffset) 166971d7fec4Smrg#endif 167071d7fec4Smrg{ 167171d7fec4Smrg unsigned long lock; 167271d7fec4Smrg 167371d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 167471d7fec4Smrg 167571d7fec4Smrg yoffset &= 0x0FFFFFF0; 167671d7fec4Smrg uoffset &= 0x0FFFFFF8; 167771d7fec4Smrg voffset &= 0x0FFFFFF8; 167871d7fec4Smrg 167971d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 168071d7fec4Smrg WRITE_REG32(MDC_VID_Y_ST_OFFSET, yoffset); 168171d7fec4Smrg WRITE_REG32(MDC_VID_U_ST_OFFSET, uoffset); 168271d7fec4Smrg WRITE_REG32(MDC_VID_V_ST_OFFSET, voffset); 168371d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 168471d7fec4Smrg} 168571d7fec4Smrg 168671d7fec4Smrg/*--------------------------------------------------------------------------- 168771d7fec4Smrg * gfx_set_display_video_yuv_pitch (PRIVATE ROUTINE - NOT PART OF API) 168871d7fec4Smrg * 168971d7fec4Smrg * This routine is called by gfx_set_video_yuv_pitch. It abstracts the version 169071d7fec4Smrg * of the display controller from the video overlay routines. 169171d7fec4Smrg *--------------------------------------------------------------------------- 169271d7fec4Smrg */ 169371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 169471d7fec4Smrgvoid 169571d7fec4Smrggu2_set_display_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) 169671d7fec4Smrg#else 169771d7fec4Smrgvoid 169871d7fec4Smrggfx_set_display_video_yuv_pitch(unsigned long ypitch, unsigned long uvpitch) 169971d7fec4Smrg#endif 170071d7fec4Smrg{ 170171d7fec4Smrg unsigned long lock, pitch; 170271d7fec4Smrg 170371d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 170471d7fec4Smrg 170571d7fec4Smrg pitch = ((uvpitch << 13) & 0xFFFF0000) | ((ypitch >> 3) & 0xFFFF); 170671d7fec4Smrg 170771d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 170871d7fec4Smrg WRITE_REG32(MDC_VID_YUV_PITCH, pitch); 170971d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 171071d7fec4Smrg} 171171d7fec4Smrg 171271d7fec4Smrg/*--------------------------------------------------------------------------- 171371d7fec4Smrg * gfx_set_display_video_downscale (PRIVATE ROUTINE - NOT PART OF API) 171471d7fec4Smrg * 171571d7fec4Smrg * This routine is called by gfx_set_video_vertical_downscale. It abstracts the version 171671d7fec4Smrg * of the display controller from the video overlay routines. 171771d7fec4Smrg *--------------------------------------------------------------------------- 171871d7fec4Smrg */ 171971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 172071d7fec4Smrgvoid 172171d7fec4Smrggu2_set_display_video_downscale(unsigned short srch, unsigned short dsth) 172271d7fec4Smrg#else 172371d7fec4Smrgvoid 172471d7fec4Smrggfx_set_display_video_downscale(unsigned short srch, unsigned short dsth) 172571d7fec4Smrg#endif 172671d7fec4Smrg{ 172771d7fec4Smrg unsigned long lock, delta; 172871d7fec4Smrg 172971d7fec4Smrg lock = READ_REG32(MDC_UNLOCK); 173071d7fec4Smrg 173171d7fec4Smrg /* CLIP SCALING LIMITS */ 173271d7fec4Smrg /* Upscaling is performed in a separate function. */ 173371d7fec4Smrg /* Maximum scale ratio is 1/2. */ 173471d7fec4Smrg 173571d7fec4Smrg if (dsth > srch || dsth <= (srch >> 1)) 173671d7fec4Smrg delta = 0; 173771d7fec4Smrg else 173871d7fec4Smrg delta = (((unsigned long)srch << 14) / (unsigned long)dsth) << 18; 173971d7fec4Smrg 174071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 174171d7fec4Smrg WRITE_REG32(MDC_VID_DS_DELTA, delta); 174271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, lock); 174371d7fec4Smrg} 174471d7fec4Smrg 174571d7fec4Smrg/*--------------------------------------------------------------------------- 174671d7fec4Smrg * gfx_set_display_video_downscale_enable (PRIVATE ROUTINE - NOT PART OF API) 174771d7fec4Smrg * 174871d7fec4Smrg * This routine is called by "gfx_set_video_vertical_downscale_enable". It abstracts the 174971d7fec4Smrg * version of the display controller from the video overlay routines. 175071d7fec4Smrg *--------------------------------------------------------------------------- 175171d7fec4Smrg */ 175271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 175371d7fec4Smrgvoid 175471d7fec4Smrggu2_set_display_video_vertical_downscale_enable(int enable) 175571d7fec4Smrg#else 175671d7fec4Smrgvoid 175771d7fec4Smrggfx_set_display_video_vertical_downscale_enable(int enable) 175871d7fec4Smrg#endif 175971d7fec4Smrg{ 176071d7fec4Smrg unsigned long gcfg, unlock; 176171d7fec4Smrg 176271d7fec4Smrg unlock = READ_REG32(MDC_UNLOCK); 176371d7fec4Smrg gcfg = READ_REG32(MDC_GENERAL_CFG); 176471d7fec4Smrg 176571d7fec4Smrg if (enable) 176671d7fec4Smrg gcfg |= MDC_GCFG_VDSE; 176771d7fec4Smrg else 176871d7fec4Smrg gcfg &= ~MDC_GCFG_VDSE; 176971d7fec4Smrg 177071d7fec4Smrg WRITE_REG32(MDC_UNLOCK, MDC_UNLOCK_VALUE); 177171d7fec4Smrg WRITE_REG32(MDC_GENERAL_CFG, gcfg); 177271d7fec4Smrg WRITE_REG32(MDC_UNLOCK, unlock); 177371d7fec4Smrg} 177471d7fec4Smrg 177571d7fec4Smrg/*--------------------------------------------------------------------------- 177671d7fec4Smrg * gfx_test_timing_active 177771d7fec4Smrg *--------------------------------------------------------------------------- 177871d7fec4Smrg */ 177971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 178071d7fec4Smrgint 178171d7fec4Smrggu2_test_timing_active(void) 178271d7fec4Smrg#else 178371d7fec4Smrgint 178471d7fec4Smrggfx_test_timing_active(void) 178571d7fec4Smrg#endif 178671d7fec4Smrg{ 178771d7fec4Smrg if (READ_REG32(MDC_DISPLAY_CFG) & MDC_DCFG_TGEN) 178871d7fec4Smrg return (1); 178971d7fec4Smrg else 179071d7fec4Smrg return (0); 179171d7fec4Smrg} 179271d7fec4Smrg 179371d7fec4Smrg/*--------------------------------------------------------------------------- 179471d7fec4Smrg * gfx_test_vertical_active 179571d7fec4Smrg *--------------------------------------------------------------------------- 179671d7fec4Smrg */ 179771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 179871d7fec4Smrgint 179971d7fec4Smrggu2_test_vertical_active(void) 180071d7fec4Smrg#else 180171d7fec4Smrgint 180271d7fec4Smrggfx_test_vertical_active(void) 180371d7fec4Smrg#endif 180471d7fec4Smrg{ 180571d7fec4Smrg if (READ_REG32(MDC_LINE_CNT_STATUS) & MDC_LNCNT_VNA) 180671d7fec4Smrg return (0); 180771d7fec4Smrg 180871d7fec4Smrg return (1); 180971d7fec4Smrg} 181071d7fec4Smrg 181171d7fec4Smrg/*--------------------------------------------------------------------------- 181271d7fec4Smrg * gfx_wait_vertical_blank 181371d7fec4Smrg *--------------------------------------------------------------------------- 181471d7fec4Smrg */ 181571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 181671d7fec4Smrgint 181771d7fec4Smrggu2_wait_vertical_blank(void) 181871d7fec4Smrg#else 181971d7fec4Smrgint 182071d7fec4Smrggfx_wait_vertical_blank(void) 182171d7fec4Smrg#endif 182271d7fec4Smrg{ 182371d7fec4Smrg if (gfx_test_timing_active()) { 182471d7fec4Smrg while (!gfx_test_vertical_active()) ; 182571d7fec4Smrg while (gfx_test_vertical_active()) ; 182671d7fec4Smrg } 182771d7fec4Smrg return (0); 182871d7fec4Smrg} 182971d7fec4Smrg 183071d7fec4Smrg/*--------------------------------------------------------------------------- 183171d7fec4Smrg * gfx_enable_panning 183271d7fec4Smrg * 183371d7fec4Smrg * This routine enables the panning when the Mode is bigger than the panel 183471d7fec4Smrg * size. 183571d7fec4Smrg *--------------------------------------------------------------------------- 183671d7fec4Smrg */ 183771d7fec4Smrg 183871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 183971d7fec4Smrgvoid 184071d7fec4Smrggu2_enable_panning(int x, int y) 184171d7fec4Smrg#else 184271d7fec4Smrgvoid 184371d7fec4Smrggfx_enable_panning(int x, int y) 184471d7fec4Smrg#endif 184571d7fec4Smrg{ 184671d7fec4Smrg unsigned long modeBytesPerPixel; 184771d7fec4Smrg unsigned long modeBytesPerScanline = 0; 184871d7fec4Smrg unsigned long startAddress = 0; 184971d7fec4Smrg 185071d7fec4Smrg modeBytesPerPixel = (gbpp + 7) / 8; 185171d7fec4Smrg modeBytesPerScanline = (READ_REG32(MDC_GFX_PITCH) & 0x0000FFFF) << 3; 185271d7fec4Smrg 185371d7fec4Smrg /* TEST FOR NO-WORK */ 185471d7fec4Smrg 185571d7fec4Smrg if (x >= DeltaX && x < ((int)PanelWidth + DeltaX) && 185671d7fec4Smrg y >= DeltaY && y < ((int)PanelHeight + DeltaY)) 185771d7fec4Smrg return; 185871d7fec4Smrg 185971d7fec4Smrg /* ADJUST PANNING VARIABLES WHEN CURSOR EXCEEDS BOUNDARY */ 186071d7fec4Smrg /* Test the boundary conditions for each coordinate and update */ 186171d7fec4Smrg /* all variables and the starting offset accordingly. */ 186271d7fec4Smrg 186371d7fec4Smrg if (x < DeltaX) 186471d7fec4Smrg DeltaX = x; 186571d7fec4Smrg 186671d7fec4Smrg else if (x >= (DeltaX + (int)PanelWidth)) 186771d7fec4Smrg DeltaX = x - (int)PanelWidth + 1; 186871d7fec4Smrg 186971d7fec4Smrg if (y < DeltaY) 187071d7fec4Smrg DeltaY = y; 187171d7fec4Smrg 187271d7fec4Smrg else if (y >= (DeltaY + (int)PanelHeight)) 187371d7fec4Smrg DeltaY = y - (int)PanelHeight + 1; 187471d7fec4Smrg 187571d7fec4Smrg /* CALCULATE THE START OFFSET */ 187671d7fec4Smrg 187771d7fec4Smrg startAddress = 187871d7fec4Smrg (DeltaX * modeBytesPerPixel) + (DeltaY * modeBytesPerScanline); 187971d7fec4Smrg 188071d7fec4Smrg gfx_set_display_offset(startAddress); 188171d7fec4Smrg 188271d7fec4Smrg /* SET PANEL COORDINATES */ 188371d7fec4Smrg /* Panel's x position must be DWORD aligned */ 188471d7fec4Smrg 188571d7fec4Smrg panelTop = DeltaY; 188671d7fec4Smrg panelLeft = DeltaX * modeBytesPerPixel; 188771d7fec4Smrg 188871d7fec4Smrg if (panelLeft & 3) 188971d7fec4Smrg panelLeft = (panelLeft & 0xFFFFFFFC) + 4; 189071d7fec4Smrg 189171d7fec4Smrg panelLeft /= modeBytesPerPixel; 189271d7fec4Smrg} 189371d7fec4Smrg 189471d7fec4Smrg/*--------------------------------------------------------------------------- 189571d7fec4Smrg * gfx_set_fixed_timings 189671d7fec4Smrg *--------------------------------------------------------------------------- 189771d7fec4Smrg */ 189871d7fec4Smrg 189971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 190071d7fec4Smrgint 190171d7fec4Smrggu2_set_fixed_timings(int panelResX, int panelResY, unsigned short width, 190271d7fec4Smrg unsigned short height, unsigned short bpp) 190371d7fec4Smrg#else 190471d7fec4Smrgint 190571d7fec4Smrggfx_set_fixed_timings(int panelResX, int panelResY, unsigned short width, 190671d7fec4Smrg unsigned short height, unsigned short bpp) 190771d7fec4Smrg#endif 190871d7fec4Smrg{ 190971d7fec4Smrg unsigned int mode; 191071d7fec4Smrg 191171d7fec4Smrg ModeWidth = width; 191271d7fec4Smrg ModeHeight = height; 191371d7fec4Smrg PanelWidth = (unsigned short)panelResX; 191471d7fec4Smrg PanelHeight = (unsigned short)panelResY; 191571d7fec4Smrg PanelEnable = 1; 191671d7fec4Smrg 191771d7fec4Smrg /* LOOP THROUGH THE AVAILABLE MODES TO FIND A MATCH */ 191871d7fec4Smrg for (mode = 0; mode < NUM_FIXED_TIMINGS_MODES; mode++) { 191971d7fec4Smrg if ((FixedParams[mode].xres == width) && 192071d7fec4Smrg (FixedParams[mode].yres == height) && 192171d7fec4Smrg (FixedParams[mode].panelresx == panelResX) && 192271d7fec4Smrg (FixedParams[mode].panelresy == panelResY)) { 192371d7fec4Smrg 192471d7fec4Smrg /* SET THE 92xx FOR THE SELECTED MODE */ 192571d7fec4Smrg FIXEDTIMINGS *fmode = &FixedParams[mode]; 192671d7fec4Smrg 192771d7fec4Smrg gfx_set_display_timings(bpp, 3, fmode->hactive, fmode->hblankstart, 192871d7fec4Smrg fmode->hsyncstart, fmode->hsyncend, 192971d7fec4Smrg fmode->hblankend, fmode->htotal, 193071d7fec4Smrg fmode->vactive, fmode->vblankstart, 193171d7fec4Smrg fmode->vsyncstart, fmode->vsyncend, 193271d7fec4Smrg fmode->vblankend, fmode->vtotal, 193371d7fec4Smrg fmode->frequency); 193471d7fec4Smrg 193571d7fec4Smrg return (1); 193671d7fec4Smrg } /* end if() */ 193771d7fec4Smrg } /* end for() */ 193871d7fec4Smrg 193971d7fec4Smrg return (-1); 194071d7fec4Smrg} 194171d7fec4Smrg 194271d7fec4Smrg/*--------------------------------------------------------------------------- 194371d7fec4Smrg * gfx_set_panel_present 194471d7fec4Smrg *--------------------------------------------------------------------------- 194571d7fec4Smrg */ 194671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 194771d7fec4Smrgint 194871d7fec4Smrggu2_set_panel_present(int panelResX, int panelResY, unsigned short width, 194971d7fec4Smrg unsigned short height, unsigned short bpp) 195071d7fec4Smrg#else 195171d7fec4Smrgint 195271d7fec4Smrggfx_set_panel_present(int panelResX, int panelResY, unsigned short width, 195371d7fec4Smrg unsigned short height, unsigned short bpp) 195471d7fec4Smrg#endif 195571d7fec4Smrg{ 195671d7fec4Smrg /* SET VALID BPP */ 195771d7fec4Smrg /* 16BPP is the default. */ 195871d7fec4Smrg 195971d7fec4Smrg if (bpp != 8 && bpp != 12 && bpp != 15 && bpp != 16 && bpp != 32) 196071d7fec4Smrg bpp = 16; 196171d7fec4Smrg 196271d7fec4Smrg /* RECORD PANEL PARAMETERS */ 196371d7fec4Smrg /* This routine does not touch any panel timings. It is used when custom panel */ 196471d7fec4Smrg /* settings are set up in advance by the BIOS or an application, but the */ 196571d7fec4Smrg /* application still requires access to other panel functionality provided by */ 196671d7fec4Smrg /* Durango (i.e. panning). */ 196771d7fec4Smrg 196871d7fec4Smrg ModeWidth = width; 196971d7fec4Smrg ModeHeight = height; 197071d7fec4Smrg PanelWidth = (unsigned short)panelResX; 197171d7fec4Smrg PanelHeight = (unsigned short)panelResY; 197271d7fec4Smrg PanelEnable = 1; 197371d7fec4Smrg gbpp = bpp; 197471d7fec4Smrg 197571d7fec4Smrg /* PROGRAM THE BPP IN THE DISPLAY CONTROLLER */ 197671d7fec4Smrg 197771d7fec4Smrg gfx_set_display_bpp(bpp); 197871d7fec4Smrg 197971d7fec4Smrg return (GFX_STATUS_OK); 198071d7fec4Smrg} 198171d7fec4Smrg 198271d7fec4Smrg/* THE FOLLOWING READ ROUTINES ARE ALWAYS INCLUDED: */ 198371d7fec4Smrg 198471d7fec4Smrg/*--------------------------------------------------------------------------- 198571d7fec4Smrg * gfx_get_display_pitch 198671d7fec4Smrg * 198771d7fec4Smrg * This routine returns the current pitch of the frame buffer, in bytes. 198871d7fec4Smrg *--------------------------------------------------------------------------- 198971d7fec4Smrg */ 199071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 199171d7fec4Smrgunsigned short 199271d7fec4Smrggu2_get_display_pitch(void) 199371d7fec4Smrg#else 199471d7fec4Smrgunsigned short 199571d7fec4Smrggfx_get_display_pitch(void) 199671d7fec4Smrg#endif 199771d7fec4Smrg{ 199871d7fec4Smrg return ((unsigned short)(READ_REG32(MDC_GFX_PITCH) & 0x0000FFFF) << 3); 199971d7fec4Smrg} 200071d7fec4Smrg 200171d7fec4Smrg/*---------------------------------------------------------------------------- 200271d7fec4Smrg * gfx_mode_frequency_supported 200371d7fec4Smrg * 200471d7fec4Smrg * This routine examines if the requested mode with pixel frequency is supported. 200571d7fec4Smrg * 200671d7fec4Smrg * Returns >0 if successful , <0 if freq. could not be found and matched. 200771d7fec4Smrg *---------------------------------------------------------------------------- 200871d7fec4Smrg */ 200971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 201071d7fec4Smrgint 201171d7fec4Smrggu2_mode_frequency_supported(int xres, int yres, int bpp, 201271d7fec4Smrg unsigned long frequency) 201371d7fec4Smrg#else 201471d7fec4Smrgint 201571d7fec4Smrggfx_mode_frequency_supported(int xres, int yres, int bpp, 201671d7fec4Smrg unsigned long frequency) 201771d7fec4Smrg#endif 201871d7fec4Smrg{ 201971d7fec4Smrg unsigned int index; 202071d7fec4Smrg unsigned long value; 202171d7fec4Smrg unsigned long bpp_flag = 0; 202271d7fec4Smrg 202371d7fec4Smrg switch (bpp) { 202471d7fec4Smrg case 8: 202571d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 202671d7fec4Smrg break; 202771d7fec4Smrg case 12: 202871d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 202971d7fec4Smrg break; 203071d7fec4Smrg case 15: 203171d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 203271d7fec4Smrg break; 203371d7fec4Smrg case 16: 203471d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 203571d7fec4Smrg break; 203671d7fec4Smrg case 32: 203771d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 203871d7fec4Smrg break; 203971d7fec4Smrg default: 204071d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 204171d7fec4Smrg break; 204271d7fec4Smrg } 204371d7fec4Smrg 204471d7fec4Smrg for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { 204571d7fec4Smrg if ((DisplayParams[index].hactive == (unsigned int)xres) && 204671d7fec4Smrg (DisplayParams[index].vactive == (unsigned int)yres) && 204771d7fec4Smrg (DisplayParams[index].flags & bpp_flag) && 204871d7fec4Smrg (DisplayParams[index].frequency == frequency)) { 204971d7fec4Smrg int hz = 0; 205071d7fec4Smrg 205171d7fec4Smrg value = DisplayParams[index].flags; 205271d7fec4Smrg 205371d7fec4Smrg if (value & GFX_MODE_60HZ) 205471d7fec4Smrg hz = 60; 205571d7fec4Smrg else if (value & GFX_MODE_70HZ) 205671d7fec4Smrg hz = 70; 205771d7fec4Smrg else if (value & GFX_MODE_72HZ) 205871d7fec4Smrg hz = 72; 205971d7fec4Smrg else if (value & GFX_MODE_75HZ) 206071d7fec4Smrg hz = 75; 206171d7fec4Smrg else if (value & GFX_MODE_85HZ) 206271d7fec4Smrg hz = 85; 206371d7fec4Smrg return (hz); 206471d7fec4Smrg } 206571d7fec4Smrg } 206671d7fec4Smrg 206771d7fec4Smrg return (-1); 206871d7fec4Smrg} 206971d7fec4Smrg 207071d7fec4Smrg/*---------------------------------------------------------------------------- 207171d7fec4Smrg * gfx_refreshrate_from_frequency 207271d7fec4Smrg * 207371d7fec4Smrg * This routine maps the frequency to close match refresh rate 207471d7fec4Smrg * 207571d7fec4Smrg * Returns . 207671d7fec4Smrg *---------------------------------------------------------------------------- 207771d7fec4Smrg */ 207871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 207971d7fec4Smrgint 208071d7fec4Smrggu2_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, 208171d7fec4Smrg unsigned long frequency) 208271d7fec4Smrg#else 208371d7fec4Smrgint 208471d7fec4Smrggfx_get_refreshrate_from_frequency(int xres, int yres, int bpp, int *hz, 208571d7fec4Smrg unsigned long frequency) 208671d7fec4Smrg#endif 208771d7fec4Smrg{ 208871d7fec4Smrg unsigned int index, closematch = 0; 208971d7fec4Smrg unsigned long value; 209071d7fec4Smrg unsigned long bpp_flag = 0; 209171d7fec4Smrg long min, diff; 209271d7fec4Smrg 209371d7fec4Smrg *hz = 60; 209471d7fec4Smrg 209571d7fec4Smrg switch (bpp) { 209671d7fec4Smrg case 8: 209771d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 209871d7fec4Smrg break; 209971d7fec4Smrg case 12: 210071d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 210171d7fec4Smrg break; 210271d7fec4Smrg case 15: 210371d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 210471d7fec4Smrg break; 210571d7fec4Smrg case 16: 210671d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 210771d7fec4Smrg break; 210871d7fec4Smrg case 32: 210971d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 211071d7fec4Smrg break; 211171d7fec4Smrg default: 211271d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 211371d7fec4Smrg break; 211471d7fec4Smrg } 211571d7fec4Smrg 211671d7fec4Smrg /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ 211771d7fec4Smrg /* Search the table for the closest frequency (16.16 format). */ 211871d7fec4Smrg 211971d7fec4Smrg min = 0x7fffffff; 212071d7fec4Smrg for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { 212171d7fec4Smrg if ((DisplayParams[index].htotal == (unsigned int)xres) && 212271d7fec4Smrg (DisplayParams[index].vtotal == (unsigned int)yres) && 212371d7fec4Smrg (DisplayParams[index].flags & bpp_flag)) { 212471d7fec4Smrg diff = (long)frequency - (long)DisplayParams[index].frequency; 212571d7fec4Smrg if (diff < 0) 212671d7fec4Smrg diff = -diff; 212771d7fec4Smrg 212871d7fec4Smrg if (diff < min) { 212971d7fec4Smrg min = diff; 213071d7fec4Smrg closematch = index; 213171d7fec4Smrg } 213271d7fec4Smrg } 213371d7fec4Smrg } 213471d7fec4Smrg 213571d7fec4Smrg value = DisplayParams[closematch].flags; 213671d7fec4Smrg 213771d7fec4Smrg if (value & GFX_MODE_56HZ) 213871d7fec4Smrg *hz = 56; 213971d7fec4Smrg else if (value & GFX_MODE_60HZ) 214071d7fec4Smrg *hz = 60; 214171d7fec4Smrg else if (value & GFX_MODE_70HZ) 214271d7fec4Smrg *hz = 70; 214371d7fec4Smrg else if (value & GFX_MODE_72HZ) 214471d7fec4Smrg *hz = 72; 214571d7fec4Smrg else if (value & GFX_MODE_75HZ) 214671d7fec4Smrg *hz = 75; 214771d7fec4Smrg else if (value & GFX_MODE_85HZ) 214871d7fec4Smrg *hz = 85; 214971d7fec4Smrg 215071d7fec4Smrg return (1); 215171d7fec4Smrg} 215271d7fec4Smrg 215371d7fec4Smrg/*---------------------------------------------------------------------------- 215471d7fec4Smrg * gfx_refreshrate_from_mode 215571d7fec4Smrg * 215671d7fec4Smrg * This routine is identical to the gfx_get_refreshrate_from_frequency, 215771d7fec4Smrg * except that the active timing values are compared instead of the total 215871d7fec4Smrg * values. Some modes (such as 70Hz and 72Hz) may be confused in this routine. 215971d7fec4Smrg * 216071d7fec4Smrg * Returns . 216171d7fec4Smrg *---------------------------------------------------------------------------- 216271d7fec4Smrg */ 216371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 216471d7fec4Smrgint 216571d7fec4Smrggu2_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, 216671d7fec4Smrg unsigned long frequency) 216771d7fec4Smrg#else 216871d7fec4Smrgint 216971d7fec4Smrggfx_get_refreshrate_from_mode(int xres, int yres, int bpp, int *hz, 217071d7fec4Smrg unsigned long frequency) 217171d7fec4Smrg#endif 217271d7fec4Smrg{ 217371d7fec4Smrg unsigned int index, closematch = 0; 217471d7fec4Smrg unsigned long value; 217571d7fec4Smrg unsigned long bpp_flag = 0; 217671d7fec4Smrg long min, diff; 217771d7fec4Smrg 217871d7fec4Smrg *hz = 60; 217971d7fec4Smrg 218071d7fec4Smrg switch (bpp) { 218171d7fec4Smrg case 8: 218271d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 218371d7fec4Smrg break; 218471d7fec4Smrg case 12: 218571d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 218671d7fec4Smrg break; 218771d7fec4Smrg case 15: 218871d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 218971d7fec4Smrg break; 219071d7fec4Smrg case 16: 219171d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 219271d7fec4Smrg break; 219371d7fec4Smrg case 32: 219471d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 219571d7fec4Smrg break; 219671d7fec4Smrg default: 219771d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 219871d7fec4Smrg break; 219971d7fec4Smrg } 220071d7fec4Smrg 220171d7fec4Smrg /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ 220271d7fec4Smrg /* Search the table for the closest frequency (16.16 format). */ 220371d7fec4Smrg 220471d7fec4Smrg min = 0x7fffffff; 220571d7fec4Smrg for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { 220671d7fec4Smrg if ((DisplayParams[index].hactive == (unsigned int)xres) && 220771d7fec4Smrg (DisplayParams[index].vactive == (unsigned int)yres) && 220871d7fec4Smrg (DisplayParams[index].flags & bpp_flag)) { 220971d7fec4Smrg diff = (long)frequency - (long)DisplayParams[index].frequency; 221071d7fec4Smrg if (diff < 0) 221171d7fec4Smrg diff = -diff; 221271d7fec4Smrg 221371d7fec4Smrg if (diff < min) { 221471d7fec4Smrg min = diff; 221571d7fec4Smrg closematch = index; 221671d7fec4Smrg } 221771d7fec4Smrg } 221871d7fec4Smrg } 221971d7fec4Smrg 222071d7fec4Smrg value = DisplayParams[closematch].flags; 222171d7fec4Smrg 222271d7fec4Smrg if (value & GFX_MODE_56HZ) 222371d7fec4Smrg *hz = 56; 222471d7fec4Smrg else if (value & GFX_MODE_60HZ) 222571d7fec4Smrg *hz = 60; 222671d7fec4Smrg else if (value & GFX_MODE_70HZ) 222771d7fec4Smrg *hz = 70; 222871d7fec4Smrg else if (value & GFX_MODE_72HZ) 222971d7fec4Smrg *hz = 72; 223071d7fec4Smrg else if (value & GFX_MODE_75HZ) 223171d7fec4Smrg *hz = 75; 223271d7fec4Smrg else if (value & GFX_MODE_85HZ) 223371d7fec4Smrg *hz = 85; 223471d7fec4Smrg 223571d7fec4Smrg return (1); 223671d7fec4Smrg} 223771d7fec4Smrg 223871d7fec4Smrg/*---------------------------------------------------------------------------- 223971d7fec4Smrg * gfx_get_frequency_from_refreshrate 224071d7fec4Smrg * 224171d7fec4Smrg * This routine maps the refresh rate to the closest matching PLL frequency. 224271d7fec4Smrg *---------------------------------------------------------------------------- 224371d7fec4Smrg */ 224471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 224571d7fec4Smrgint 224671d7fec4Smrggu2_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, 224771d7fec4Smrg int *frequency) 224871d7fec4Smrg#else 224971d7fec4Smrgint 225071d7fec4Smrggfx_get_frequency_from_refreshrate(int xres, int yres, int bpp, int hz, 225171d7fec4Smrg int *frequency) 225271d7fec4Smrg#endif 225371d7fec4Smrg{ 225471d7fec4Smrg int retval = -1; 225571d7fec4Smrg unsigned long hz_flag = 0; 225671d7fec4Smrg unsigned long index, bpp_flag = 0; 225771d7fec4Smrg 225871d7fec4Smrg *frequency = 0; 225971d7fec4Smrg 226071d7fec4Smrg if (hz == 60) 226171d7fec4Smrg hz_flag = GFX_MODE_60HZ; 226271d7fec4Smrg else if (hz == 70) 226371d7fec4Smrg hz_flag = GFX_MODE_70HZ; 226471d7fec4Smrg else if (hz == 72) 226571d7fec4Smrg hz_flag = GFX_MODE_72HZ; 226671d7fec4Smrg else if (hz == 75) 226771d7fec4Smrg hz_flag = GFX_MODE_75HZ; 226871d7fec4Smrg else if (hz == 85) 226971d7fec4Smrg hz_flag = GFX_MODE_85HZ; 227071d7fec4Smrg 227171d7fec4Smrg switch (bpp) { 227271d7fec4Smrg case 8: 227371d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 227471d7fec4Smrg break; 227571d7fec4Smrg case 12: 227671d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 227771d7fec4Smrg break; 227871d7fec4Smrg case 15: 227971d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 228071d7fec4Smrg break; 228171d7fec4Smrg case 16: 228271d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 228371d7fec4Smrg break; 228471d7fec4Smrg case 32: 228571d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 228671d7fec4Smrg break; 228771d7fec4Smrg default: 228871d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 228971d7fec4Smrg break; 229071d7fec4Smrg } 229171d7fec4Smrg 229271d7fec4Smrg /* FIND THE REGISTER VALUES FOR THE DESIRED FREQUENCY */ 229371d7fec4Smrg /* Search the table for the closest frequency (16.16 format). */ 229471d7fec4Smrg 229571d7fec4Smrg for (index = 0; index < NUM_RC_DISPLAY_MODES; index++) { 229671d7fec4Smrg if ((DisplayParams[index].hactive == (unsigned short)xres) && 229771d7fec4Smrg (DisplayParams[index].vactive == (unsigned short)yres) && 229871d7fec4Smrg (DisplayParams[index].flags & bpp_flag) && 229971d7fec4Smrg (DisplayParams[index].flags & hz_flag)) { 230071d7fec4Smrg *frequency = DisplayParams[index].frequency; 230171d7fec4Smrg retval = 1; 230271d7fec4Smrg } 230371d7fec4Smrg } 230471d7fec4Smrg return retval; 230571d7fec4Smrg} 230671d7fec4Smrg 230771d7fec4Smrg/*--------------------------------------------------------------------------- 230871d7fec4Smrg * gfx_get_max_supported_pixel_clock 230971d7fec4Smrg * 231071d7fec4Smrg * This routine returns the maximum recommended speed for the pixel clock. The 231171d7fec4Smrg * return value is an integer of the format xxxyyy, where xxx.yyy is the maximum 231271d7fec4Smrg * floating point pixel clock speed. 231371d7fec4Smrg *--------------------------------------------------------------------------- 231471d7fec4Smrg */ 231571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 231671d7fec4Smrgunsigned long 231771d7fec4Smrggu2_get_max_supported_pixel_clock(void) 231871d7fec4Smrg#else 231971d7fec4Smrgunsigned long 232071d7fec4Smrggfx_get_max_supported_pixel_clock(void) 232171d7fec4Smrg#endif 232271d7fec4Smrg{ 232371d7fec4Smrg return 229500; 232471d7fec4Smrg} 232571d7fec4Smrg 232671d7fec4Smrg/*---------------------------------------------------------------------------- 232771d7fec4Smrg * gfx_get_display_mode 232871d7fec4Smrg * 232971d7fec4Smrg * This routine gets the specified display mode. 233071d7fec4Smrg * 233171d7fec4Smrg * Returns >0 if successful and mode returned, <0 if mode could not be found. 233271d7fec4Smrg *---------------------------------------------------------------------------- 233371d7fec4Smrg */ 233471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 233571d7fec4Smrgint 233671d7fec4Smrggu2_get_display_mode(int *xres, int *yres, int *bpp, int *hz) 233771d7fec4Smrg#else 233871d7fec4Smrgint 233971d7fec4Smrggfx_get_display_mode(int *xres, int *yres, int *bpp, int *hz) 234071d7fec4Smrg#endif 234171d7fec4Smrg{ 234271d7fec4Smrg unsigned int mode = 0; 234371d7fec4Smrg unsigned long pll_freq = 0, bpp_flag = 0; 234471d7fec4Smrg 234571d7fec4Smrg *xres = gfx_get_hactive(); 234671d7fec4Smrg *yres = gfx_get_vactive(); 234771d7fec4Smrg *bpp = gfx_get_display_bpp(); 234871d7fec4Smrg pll_freq = gfx_get_clock_frequency(); 234971d7fec4Smrg 235071d7fec4Smrg /* SET BPP FLAGS TO LIMIT MODE SELECTION */ 235171d7fec4Smrg 235271d7fec4Smrg switch (*bpp) { 235371d7fec4Smrg case 8: 235471d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 235571d7fec4Smrg break; 235671d7fec4Smrg case 12: 235771d7fec4Smrg bpp_flag = GFX_MODE_12BPP; 235871d7fec4Smrg break; 235971d7fec4Smrg case 15: 236071d7fec4Smrg bpp_flag = GFX_MODE_15BPP; 236171d7fec4Smrg break; 236271d7fec4Smrg case 16: 236371d7fec4Smrg bpp_flag = GFX_MODE_16BPP; 236471d7fec4Smrg break; 236571d7fec4Smrg case 32: 236671d7fec4Smrg bpp_flag = GFX_MODE_24BPP; 236771d7fec4Smrg break; 236871d7fec4Smrg default: 236971d7fec4Smrg bpp_flag = GFX_MODE_8BPP; 237071d7fec4Smrg break; 237171d7fec4Smrg } 237271d7fec4Smrg 237371d7fec4Smrg for (mode = 0; mode < NUM_RC_DISPLAY_MODES; mode++) { 237471d7fec4Smrg if ((DisplayParams[mode].hactive == (unsigned int)*xres) && 237571d7fec4Smrg (DisplayParams[mode].vactive == (unsigned int)*yres) && 237671d7fec4Smrg (DisplayParams[mode].frequency == pll_freq) && 237771d7fec4Smrg (DisplayParams[mode].flags & bpp_flag)) { 237871d7fec4Smrg 237971d7fec4Smrg pll_freq = DisplayParams[mode].flags; 238071d7fec4Smrg 238171d7fec4Smrg if (pll_freq & GFX_MODE_56HZ) 238271d7fec4Smrg *hz = 56; 238371d7fec4Smrg else if (pll_freq & GFX_MODE_60HZ) 238471d7fec4Smrg *hz = 60; 238571d7fec4Smrg else if (pll_freq & GFX_MODE_70HZ) 238671d7fec4Smrg *hz = 70; 238771d7fec4Smrg else if (pll_freq & GFX_MODE_72HZ) 238871d7fec4Smrg *hz = 72; 238971d7fec4Smrg else if (pll_freq & GFX_MODE_75HZ) 239071d7fec4Smrg *hz = 75; 239171d7fec4Smrg else if (pll_freq & GFX_MODE_85HZ) 239271d7fec4Smrg *hz = 85; 239371d7fec4Smrg 239471d7fec4Smrg return (1); 239571d7fec4Smrg } 239671d7fec4Smrg } 239771d7fec4Smrg return (-1); 239871d7fec4Smrg} 239971d7fec4Smrg 240071d7fec4Smrg/*---------------------------------------------------------------------------- 240171d7fec4Smrg * GFX_GET_DISPLAY_DETAILS 240271d7fec4Smrg * 240371d7fec4Smrg * This routine gets the specified display mode. 240471d7fec4Smrg * 240571d7fec4Smrg * Returns 1 if successful, 0 if mode could not be get. 240671d7fec4Smrg *---------------------------------------------------------------------------- 240771d7fec4Smrg */ 240871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 240971d7fec4Smrgint 241071d7fec4Smrggu2_get_display_details(unsigned int mode, int *xres, int *yres, int *hz) 241171d7fec4Smrg#else 241271d7fec4Smrgint 241371d7fec4Smrggfx_get_display_details(unsigned int mode, int *xres, int *yres, int *hz) 241471d7fec4Smrg#endif 241571d7fec4Smrg{ 241671d7fec4Smrg if (mode < NUM_RC_DISPLAY_MODES) { 241771d7fec4Smrg if (DisplayParams[mode].flags & GFX_MODE_56HZ) 241871d7fec4Smrg *hz = 56; 241971d7fec4Smrg else if (DisplayParams[mode].flags & GFX_MODE_60HZ) 242071d7fec4Smrg *hz = 60; 242171d7fec4Smrg else if (DisplayParams[mode].flags & GFX_MODE_70HZ) 242271d7fec4Smrg *hz = 70; 242371d7fec4Smrg else if (DisplayParams[mode].flags & GFX_MODE_72HZ) 242471d7fec4Smrg *hz = 72; 242571d7fec4Smrg else if (DisplayParams[mode].flags & GFX_MODE_75HZ) 242671d7fec4Smrg *hz = 75; 242771d7fec4Smrg else if (DisplayParams[mode].flags & GFX_MODE_85HZ) 242871d7fec4Smrg *hz = 85; 242971d7fec4Smrg 243071d7fec4Smrg *xres = DisplayParams[mode].hactive; 243171d7fec4Smrg *yres = DisplayParams[mode].vactive; 243271d7fec4Smrg 243371d7fec4Smrg if (DisplayParams[mode].flags & GFX_MODE_PIXEL_DOUBLE) 243471d7fec4Smrg *xres >>= 1; 243571d7fec4Smrg if (DisplayParams[mode].flags & GFX_MODE_LINE_DOUBLE) 243671d7fec4Smrg *yres >>= 1; 243771d7fec4Smrg 243871d7fec4Smrg return (1); 243971d7fec4Smrg } 244071d7fec4Smrg return (0); 244171d7fec4Smrg} 244271d7fec4Smrg 244371d7fec4Smrg/*---------------------------------------------------------------------------- 244471d7fec4Smrg * GFX_GET_DISPLAY_MODE_COUNT 244571d7fec4Smrg * 244671d7fec4Smrg * This routine gets the number of available display modes. 244771d7fec4Smrg *---------------------------------------------------------------------------- 244871d7fec4Smrg */ 244971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 245071d7fec4Smrgint 245171d7fec4Smrggu2_get_display_mode_count(void) 245271d7fec4Smrg#else 245371d7fec4Smrgint 245471d7fec4Smrggfx_get_display_mode_count(void) 245571d7fec4Smrg#endif 245671d7fec4Smrg{ 245771d7fec4Smrg return (NUM_RC_DISPLAY_MODES); 245871d7fec4Smrg} 245971d7fec4Smrg 246071d7fec4Smrg/*---------------------------------------------------------------------------- 246171d7fec4Smrg * gfx_get_frame_buffer_line_size 246271d7fec4Smrg * 246371d7fec4Smrg * Returns the current frame buffer line size, in bytes 246471d7fec4Smrg *---------------------------------------------------------------------------- 246571d7fec4Smrg */ 246671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 246771d7fec4Smrgunsigned long 246871d7fec4Smrggu2_get_frame_buffer_line_size(void) 246971d7fec4Smrg#else 247071d7fec4Smrgunsigned long 247171d7fec4Smrggfx_get_frame_buffer_line_size(void) 247271d7fec4Smrg#endif 247371d7fec4Smrg{ 247471d7fec4Smrg return ((READ_REG32(MDC_LINE_SIZE) & 0x7FF) << 3); 247571d7fec4Smrg} 247671d7fec4Smrg 247771d7fec4Smrg/*--------------------------------------------------------------------------- 247871d7fec4Smrg * gfx_get_hactive 247971d7fec4Smrg *--------------------------------------------------------------------------- 248071d7fec4Smrg */ 248171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 248271d7fec4Smrgunsigned short 248371d7fec4Smrggu2_get_hactive(void) 248471d7fec4Smrg#else 248571d7fec4Smrgunsigned short 248671d7fec4Smrggfx_get_hactive(void) 248771d7fec4Smrg#endif 248871d7fec4Smrg{ 248971d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_H_ACTIVE_TIMING) & 0x0FF8) + 8)); 249071d7fec4Smrg} 249171d7fec4Smrg 249271d7fec4Smrg/*--------------------------------------------------------------------------- 249371d7fec4Smrg * gfx_get_hsync_start 249471d7fec4Smrg *--------------------------------------------------------------------------- 249571d7fec4Smrg */ 249671d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 249771d7fec4Smrgunsigned short 249871d7fec4Smrggu2_get_hsync_start(void) 249971d7fec4Smrg#else 250071d7fec4Smrgunsigned short 250171d7fec4Smrggfx_get_hsync_start(void) 250271d7fec4Smrg#endif 250371d7fec4Smrg{ 250471d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_H_SYNC_TIMING) & 0x0FF8) + 8)); 250571d7fec4Smrg} 250671d7fec4Smrg 250771d7fec4Smrg/*--------------------------------------------------------------------------- 250871d7fec4Smrg * gfx_get_hsync_end 250971d7fec4Smrg *--------------------------------------------------------------------------- 251071d7fec4Smrg */ 251171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 251271d7fec4Smrgunsigned short 251371d7fec4Smrggu2_get_hsync_end(void) 251471d7fec4Smrg#else 251571d7fec4Smrgunsigned short 251671d7fec4Smrggfx_get_hsync_end(void) 251771d7fec4Smrg#endif 251871d7fec4Smrg{ 251971d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_H_SYNC_TIMING) >> 16) & 0x0FF8) + 252071d7fec4Smrg 8)); 252171d7fec4Smrg} 252271d7fec4Smrg 252371d7fec4Smrg/*--------------------------------------------------------------------------- 252471d7fec4Smrg * gfx_get_htotal 252571d7fec4Smrg *--------------------------------------------------------------------------- 252671d7fec4Smrg */ 252771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 252871d7fec4Smrgunsigned short 252971d7fec4Smrggu2_get_htotal(void) 253071d7fec4Smrg#else 253171d7fec4Smrgunsigned short 253271d7fec4Smrggfx_get_htotal(void) 253371d7fec4Smrg#endif 253471d7fec4Smrg{ 253571d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_H_ACTIVE_TIMING) >> 16) & 0x0FF8) 253671d7fec4Smrg + 8)); 253771d7fec4Smrg} 253871d7fec4Smrg 253971d7fec4Smrg/*--------------------------------------------------------------------------- 254071d7fec4Smrg * gfx_get_vactive 254171d7fec4Smrg *--------------------------------------------------------------------------- 254271d7fec4Smrg */ 254371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 254471d7fec4Smrgunsigned short 254571d7fec4Smrggu2_get_vactive(void) 254671d7fec4Smrg#else 254771d7fec4Smrgunsigned short 254871d7fec4Smrggfx_get_vactive(void) 254971d7fec4Smrg#endif 255071d7fec4Smrg{ 255171d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_V_ACTIVE_TIMING) & 0x07FF) + 1)); 255271d7fec4Smrg} 255371d7fec4Smrg 255471d7fec4Smrg/*--------------------------------------------------------------------------- 255571d7fec4Smrg * gfx_get_vsync_end 255671d7fec4Smrg *--------------------------------------------------------------------------- 255771d7fec4Smrg */ 255871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 255971d7fec4Smrgunsigned short 256071d7fec4Smrggu2_get_vsync_end(void) 256171d7fec4Smrg#else 256271d7fec4Smrgunsigned short 256371d7fec4Smrggfx_get_vsync_end(void) 256471d7fec4Smrg#endif 256571d7fec4Smrg{ 256671d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_V_SYNC_TIMING) >> 16) & 0x07FF) + 256771d7fec4Smrg 1)); 256871d7fec4Smrg} 256971d7fec4Smrg 257071d7fec4Smrg/*--------------------------------------------------------------------------- 257171d7fec4Smrg * gfx_get_vtotal 257271d7fec4Smrg *--------------------------------------------------------------------------- 257371d7fec4Smrg */ 257471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 257571d7fec4Smrgunsigned short 257671d7fec4Smrggu2_get_vtotal(void) 257771d7fec4Smrg#else 257871d7fec4Smrgunsigned short 257971d7fec4Smrggfx_get_vtotal(void) 258071d7fec4Smrg#endif 258171d7fec4Smrg{ 258271d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_V_ACTIVE_TIMING) >> 16) & 0x07FF) 258371d7fec4Smrg + 1)); 258471d7fec4Smrg} 258571d7fec4Smrg 258671d7fec4Smrg/*----------------------------------------------------------------------------- 258771d7fec4Smrg * gfx_get_display_bpp 258871d7fec4Smrg * 258971d7fec4Smrg * This routine returns the current color depth of the active display. 259071d7fec4Smrg *----------------------------------------------------------------------------- 259171d7fec4Smrg */ 259271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 259371d7fec4Smrgunsigned short 259471d7fec4Smrggu2_get_display_bpp(void) 259571d7fec4Smrg#else 259671d7fec4Smrgunsigned short 259771d7fec4Smrggfx_get_display_bpp(void) 259871d7fec4Smrg#endif 259971d7fec4Smrg{ 260071d7fec4Smrg unsigned long dcfg = READ_REG32(MDC_DISPLAY_CFG); 260171d7fec4Smrg 260271d7fec4Smrg switch ((dcfg & MDC_DCFG_DISP_MODE_MASK) >> 8) { 260371d7fec4Smrg case 0: 260471d7fec4Smrg return (8); 260571d7fec4Smrg case 2: 260671d7fec4Smrg return (32); 260771d7fec4Smrg 260871d7fec4Smrg case 1: 260971d7fec4Smrg 261071d7fec4Smrg switch ((dcfg & MDC_DCFG_16BPP_MODE_MASK) >> 10) { 261171d7fec4Smrg case 0: 261271d7fec4Smrg return (16); 261371d7fec4Smrg case 1: 261471d7fec4Smrg return (15); 261571d7fec4Smrg case 2: 261671d7fec4Smrg return (12); 261771d7fec4Smrg default: 261871d7fec4Smrg return (0); 261971d7fec4Smrg } 262071d7fec4Smrg } 262171d7fec4Smrg 262271d7fec4Smrg /* INVALID SETTING */ 262371d7fec4Smrg 262471d7fec4Smrg return (0); 262571d7fec4Smrg} 262671d7fec4Smrg 262771d7fec4Smrg/*--------------------------------------------------------------------------- 262871d7fec4Smrg * gfx_get_vline 262971d7fec4Smrg *--------------------------------------------------------------------------- 263071d7fec4Smrg */ 263171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 263271d7fec4Smrgunsigned short 263371d7fec4Smrggu2_get_vline(void) 263471d7fec4Smrg#else 263571d7fec4Smrgunsigned short 263671d7fec4Smrggfx_get_vline(void) 263771d7fec4Smrg#endif 263871d7fec4Smrg{ 263971d7fec4Smrg unsigned short current_scan_line; 264071d7fec4Smrg 264171d7fec4Smrg /* Read similar value twice to ensure that the value is not transitioning */ 264271d7fec4Smrg 264371d7fec4Smrg do 264471d7fec4Smrg current_scan_line = 264571d7fec4Smrg (unsigned short)(READ_REG32(MDC_LINE_CNT_STATUS) & 264671d7fec4Smrg MDC_LNCNT_V_LINE_CNT); 264771d7fec4Smrg while (current_scan_line != 264871d7fec4Smrg (unsigned short)(READ_REG32(MDC_LINE_CNT_STATUS) & 264971d7fec4Smrg MDC_LNCNT_V_LINE_CNT)); 265071d7fec4Smrg 265171d7fec4Smrg return (current_scan_line >> 16); 265271d7fec4Smrg} 265371d7fec4Smrg 265471d7fec4Smrg/*----------------------------------------------------------------------------- 265571d7fec4Smrg * gfx_get_display_offset 265671d7fec4Smrg *----------------------------------------------------------------------------- 265771d7fec4Smrg */ 265871d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 265971d7fec4Smrgunsigned long 266071d7fec4Smrggu2_get_display_offset(void) 266171d7fec4Smrg#else 266271d7fec4Smrgunsigned long 266371d7fec4Smrggfx_get_display_offset(void) 266471d7fec4Smrg#endif 266571d7fec4Smrg{ 266671d7fec4Smrg return (READ_REG32(MDC_FB_ST_OFFSET) & 0x0FFFFFFF); 266771d7fec4Smrg} 266871d7fec4Smrg 266971d7fec4Smrg/*----------------------------------------------------------------------------- 267071d7fec4Smrg * gfx_get_cursor_offset 267171d7fec4Smrg *----------------------------------------------------------------------------- 267271d7fec4Smrg */ 267371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 267471d7fec4Smrgunsigned long 267571d7fec4Smrggu2_get_cursor_offset(void) 267671d7fec4Smrg#else 267771d7fec4Smrgunsigned long 267871d7fec4Smrggfx_get_cursor_offset(void) 267971d7fec4Smrg#endif 268071d7fec4Smrg{ 268171d7fec4Smrg return (READ_REG32(MDC_CURS_ST_OFFSET) & 0x0FFFFFFF); 268271d7fec4Smrg} 268371d7fec4Smrg 268471d7fec4Smrg#if GFX_READ_ROUTINES 268571d7fec4Smrg 268671d7fec4Smrg/*************************************************************/ 268771d7fec4Smrg/* READ ROUTINES | INCLUDED FOR DIAGNOSTIC PURPOSES ONLY */ 268871d7fec4Smrg/*************************************************************/ 268971d7fec4Smrg 269071d7fec4Smrg/*--------------------------------------------------------------------------- 269171d7fec4Smrg * gfx_get_hblank_start 269271d7fec4Smrg *--------------------------------------------------------------------------- 269371d7fec4Smrg */ 269471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 269571d7fec4Smrgunsigned short 269671d7fec4Smrggu2_get_hblank_start(void) 269771d7fec4Smrg#else 269871d7fec4Smrgunsigned short 269971d7fec4Smrggfx_get_hblank_start(void) 270071d7fec4Smrg#endif 270171d7fec4Smrg{ 270271d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_H_BLANK_TIMING) & 0x0FF8) + 8)); 270371d7fec4Smrg} 270471d7fec4Smrg 270571d7fec4Smrg/*--------------------------------------------------------------------------- 270671d7fec4Smrg * gfx_get_hblank_end 270771d7fec4Smrg *--------------------------------------------------------------------------- 270871d7fec4Smrg */ 270971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 271071d7fec4Smrgunsigned short 271171d7fec4Smrggu2_get_hblank_end(void) 271271d7fec4Smrg#else 271371d7fec4Smrgunsigned short 271471d7fec4Smrggfx_get_hblank_end(void) 271571d7fec4Smrg#endif 271671d7fec4Smrg{ 271771d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_H_BLANK_TIMING) >> 16) & 0x0FF8) 271871d7fec4Smrg + 8)); 271971d7fec4Smrg} 272071d7fec4Smrg 272171d7fec4Smrg/*--------------------------------------------------------------------------- 272271d7fec4Smrg * gfx_get_vblank_start 272371d7fec4Smrg *--------------------------------------------------------------------------- 272471d7fec4Smrg */ 272571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 272671d7fec4Smrgunsigned short 272771d7fec4Smrggu2_get_vblank_start(void) 272871d7fec4Smrg#else 272971d7fec4Smrgunsigned short 273071d7fec4Smrggfx_get_vblank_start(void) 273171d7fec4Smrg#endif 273271d7fec4Smrg{ 273371d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_V_BLANK_TIMING) & 0x07FF) + 1)); 273471d7fec4Smrg} 273571d7fec4Smrg 273671d7fec4Smrg/*--------------------------------------------------------------------------- 273771d7fec4Smrg * gfx_get_vsync_start 273871d7fec4Smrg *--------------------------------------------------------------------------- 273971d7fec4Smrg */ 274071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 274171d7fec4Smrgunsigned short 274271d7fec4Smrggu2_get_vsync_start(void) 274371d7fec4Smrg#else 274471d7fec4Smrgunsigned short 274571d7fec4Smrggfx_get_vsync_start(void) 274671d7fec4Smrg#endif 274771d7fec4Smrg{ 274871d7fec4Smrg return ((unsigned short)((READ_REG32(MDC_V_SYNC_TIMING) & 0x07FF) + 1)); 274971d7fec4Smrg} 275071d7fec4Smrg 275171d7fec4Smrg/*--------------------------------------------------------------------------- 275271d7fec4Smrg * gfx_get_vblank_end 275371d7fec4Smrg *--------------------------------------------------------------------------- 275471d7fec4Smrg */ 275571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 275671d7fec4Smrgunsigned short 275771d7fec4Smrggu2_get_vblank_end(void) 275871d7fec4Smrg#else 275971d7fec4Smrgunsigned short 276071d7fec4Smrggfx_get_vblank_end(void) 276171d7fec4Smrg#endif 276271d7fec4Smrg{ 276371d7fec4Smrg return ((unsigned short)(((READ_REG32(MDC_V_BLANK_TIMING) >> 16) & 0x07FF) 276471d7fec4Smrg + 1)); 276571d7fec4Smrg} 276671d7fec4Smrg 276771d7fec4Smrg/*----------------------------------------------------------------------------- 276871d7fec4Smrg * gfx_get_display_palette_entry 276971d7fec4Smrg *----------------------------------------------------------------------------- 277071d7fec4Smrg */ 277171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 277271d7fec4Smrgint 277371d7fec4Smrggu2_get_display_palette_entry(unsigned long index, unsigned long *palette) 277471d7fec4Smrg#else 277571d7fec4Smrgint 277671d7fec4Smrggfx_get_display_palette_entry(unsigned long index, unsigned long *palette) 277771d7fec4Smrg#endif 277871d7fec4Smrg{ 277971d7fec4Smrg if (index > 0xFF) 278071d7fec4Smrg return GFX_STATUS_BAD_PARAMETER; 278171d7fec4Smrg 278271d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, index); 278371d7fec4Smrg *palette = READ_REG32(MDC_PAL_DATA); 278471d7fec4Smrg 278571d7fec4Smrg return 0; 278671d7fec4Smrg} 278771d7fec4Smrg 278871d7fec4Smrg/*----------------------------------------------------------------------------- 278971d7fec4Smrg * gfx_get_display_palette 279071d7fec4Smrg *----------------------------------------------------------------------------- 279171d7fec4Smrg */ 279271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 279371d7fec4Smrgvoid 279471d7fec4Smrggu2_get_display_palette(unsigned long *palette) 279571d7fec4Smrg#else 279671d7fec4Smrgvoid 279771d7fec4Smrggfx_get_display_palette(unsigned long *palette) 279871d7fec4Smrg#endif 279971d7fec4Smrg{ 280071d7fec4Smrg unsigned long i; 280171d7fec4Smrg 280271d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0); 280371d7fec4Smrg for (i = 0; i < 256; i++) { 280471d7fec4Smrg palette[i] = READ_REG32(MDC_PAL_DATA); 280571d7fec4Smrg } 280671d7fec4Smrg} 280771d7fec4Smrg 280871d7fec4Smrg/*----------------------------------------------------------------------------- 280971d7fec4Smrg * gfx_get_cursor_enable 281071d7fec4Smrg *----------------------------------------------------------------------------- 281171d7fec4Smrg */ 281271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 281371d7fec4Smrgunsigned long 281471d7fec4Smrggu2_get_cursor_enable(void) 281571d7fec4Smrg#else 281671d7fec4Smrgunsigned long 281771d7fec4Smrggfx_get_cursor_enable(void) 281871d7fec4Smrg#endif 281971d7fec4Smrg{ 282071d7fec4Smrg return (READ_REG32(MDC_GENERAL_CFG) & MDC_GCFG_CURE); 282171d7fec4Smrg} 282271d7fec4Smrg 282371d7fec4Smrg/*----------------------------------------------------------------------------- 282471d7fec4Smrg * gfx_get_cursor_position 282571d7fec4Smrg *----------------------------------------------------------------------------- 282671d7fec4Smrg */ 282771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 282871d7fec4Smrgunsigned long 282971d7fec4Smrggu2_get_cursor_position(void) 283071d7fec4Smrg#else 283171d7fec4Smrgunsigned long 283271d7fec4Smrggfx_get_cursor_position(void) 283371d7fec4Smrg#endif 283471d7fec4Smrg{ 283571d7fec4Smrg return ((READ_REG32(MDC_CURSOR_X) & 0x07FF) | 283671d7fec4Smrg ((READ_REG32(MDC_CURSOR_Y) << 16) & 0x03FF0000)); 283771d7fec4Smrg} 283871d7fec4Smrg 283971d7fec4Smrg/*----------------------------------------------------------------------------- 284071d7fec4Smrg * gfx_get_cursor_offset 284171d7fec4Smrg *----------------------------------------------------------------------------- 284271d7fec4Smrg */ 284371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 284471d7fec4Smrgunsigned long 284571d7fec4Smrggu2_get_cursor_clip(void) 284671d7fec4Smrg#else 284771d7fec4Smrgunsigned long 284871d7fec4Smrggfx_get_cursor_clip(void) 284971d7fec4Smrg#endif 285071d7fec4Smrg{ 285171d7fec4Smrg return (((READ_REG32(MDC_CURSOR_X) >> 11) & 0x03F) | 285271d7fec4Smrg ((READ_REG32(MDC_CURSOR_Y) << 5) & 0x3F0000)); 285371d7fec4Smrg} 285471d7fec4Smrg 285571d7fec4Smrg/*----------------------------------------------------------------------------- 285671d7fec4Smrg * gfx_get_cursor_color 285771d7fec4Smrg *----------------------------------------------------------------------------- 285871d7fec4Smrg */ 285971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 286071d7fec4Smrgunsigned long 286171d7fec4Smrggu2_get_cursor_color(int color) 286271d7fec4Smrg#else 286371d7fec4Smrgunsigned long 286471d7fec4Smrggfx_get_cursor_color(int color) 286571d7fec4Smrg#endif 286671d7fec4Smrg{ 286771d7fec4Smrg if (color) { 286871d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0x101); 286971d7fec4Smrg } else { 287071d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0x100); 287171d7fec4Smrg } 287271d7fec4Smrg return READ_REG32(MDC_PAL_DATA); 287371d7fec4Smrg} 287471d7fec4Smrg 287571d7fec4Smrg/*----------------------------------------------------------------------------- 287671d7fec4Smrg * gfx_get_icon_enable 287771d7fec4Smrg *----------------------------------------------------------------------------- 287871d7fec4Smrg */ 287971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 288071d7fec4Smrgunsigned long 288171d7fec4Smrggu2_get_icon_enable(void) 288271d7fec4Smrg#else 288371d7fec4Smrgunsigned long 288471d7fec4Smrggfx_get_icon_enable(void) 288571d7fec4Smrg#endif 288671d7fec4Smrg{ 288771d7fec4Smrg return (READ_REG32(MDC_GENERAL_CFG) & MDC_GCFG_ICNE); 288871d7fec4Smrg} 288971d7fec4Smrg 289071d7fec4Smrg/*----------------------------------------------------------------------------- 289171d7fec4Smrg * gfx_get_icon_offset 289271d7fec4Smrg *----------------------------------------------------------------------------- 289371d7fec4Smrg */ 289471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 289571d7fec4Smrgunsigned long 289671d7fec4Smrggu2_get_icon_offset(void) 289771d7fec4Smrg#else 289871d7fec4Smrgunsigned long 289971d7fec4Smrggfx_get_icon_offset(void) 290071d7fec4Smrg#endif 290171d7fec4Smrg{ 290271d7fec4Smrg return (READ_REG32(MDC_ICON_ST_OFFSET) & 0x0FFFFFFF); 290371d7fec4Smrg} 290471d7fec4Smrg 290571d7fec4Smrg/*----------------------------------------------------------------------------- 290671d7fec4Smrg * gfx_get_icon_position 290771d7fec4Smrg *----------------------------------------------------------------------------- 290871d7fec4Smrg */ 290971d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 291071d7fec4Smrgunsigned long 291171d7fec4Smrggu2_get_icon_position(void) 291271d7fec4Smrg#else 291371d7fec4Smrgunsigned long 291471d7fec4Smrggfx_get_icon_position(void) 291571d7fec4Smrg#endif 291671d7fec4Smrg{ 291771d7fec4Smrg return (READ_REG32(MDC_ICON_X) & 0x07FF); 291871d7fec4Smrg} 291971d7fec4Smrg 292071d7fec4Smrg/*----------------------------------------------------------------------------- 292171d7fec4Smrg * gfx_get_icon_color 292271d7fec4Smrg *----------------------------------------------------------------------------- 292371d7fec4Smrg */ 292471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 292571d7fec4Smrgunsigned long 292671d7fec4Smrggu2_get_icon_color(int color) 292771d7fec4Smrg#else 292871d7fec4Smrgunsigned long 292971d7fec4Smrggfx_get_icon_color(int color) 293071d7fec4Smrg#endif 293171d7fec4Smrg{ 293271d7fec4Smrg if (color >= 3) 293371d7fec4Smrg return 0; 293471d7fec4Smrg 293571d7fec4Smrg WRITE_REG32(MDC_PAL_ADDRESS, 0x102 + color); 293671d7fec4Smrg 293771d7fec4Smrg return READ_REG32(MDC_PAL_DATA); 293871d7fec4Smrg} 293971d7fec4Smrg 294071d7fec4Smrg/*----------------------------------------------------------------------------- 294171d7fec4Smrg * gfx_get_compression_enable 294271d7fec4Smrg *----------------------------------------------------------------------------- 294371d7fec4Smrg */ 294471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 294571d7fec4Smrgint 294671d7fec4Smrggu2_get_compression_enable(void) 294771d7fec4Smrg#else 294871d7fec4Smrgint 294971d7fec4Smrggfx_get_compression_enable(void) 295071d7fec4Smrg#endif 295171d7fec4Smrg{ 295271d7fec4Smrg if (READ_REG32(MDC_GENERAL_CFG) & MDC_GCFG_CMPE) 295371d7fec4Smrg return (1); 295471d7fec4Smrg 295571d7fec4Smrg return (0); 295671d7fec4Smrg} 295771d7fec4Smrg 295871d7fec4Smrg/*----------------------------------------------------------------------------- 295971d7fec4Smrg * gfx_get_compression_offset 296071d7fec4Smrg *----------------------------------------------------------------------------- 296171d7fec4Smrg */ 296271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 296371d7fec4Smrgunsigned long 296471d7fec4Smrggu2_get_compression_offset(void) 296571d7fec4Smrg#else 296671d7fec4Smrgunsigned long 296771d7fec4Smrggfx_get_compression_offset(void) 296871d7fec4Smrg#endif 296971d7fec4Smrg{ 297071d7fec4Smrg return (READ_REG32(MDC_CB_ST_OFFSET) & 0x007FFFFF); 297171d7fec4Smrg} 297271d7fec4Smrg 297371d7fec4Smrg/*----------------------------------------------------------------------------- 297471d7fec4Smrg * gfx_get_compression_pitch 297571d7fec4Smrg *----------------------------------------------------------------------------- 297671d7fec4Smrg */ 297771d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 297871d7fec4Smrgunsigned short 297971d7fec4Smrggu2_get_compression_pitch(void) 298071d7fec4Smrg#else 298171d7fec4Smrgunsigned short 298271d7fec4Smrggfx_get_compression_pitch(void) 298371d7fec4Smrg#endif 298471d7fec4Smrg{ 298571d7fec4Smrg unsigned short pitch; 298671d7fec4Smrg 298771d7fec4Smrg pitch = (unsigned short)(READ_REG32(MDC_GFX_PITCH) >> 16); 298871d7fec4Smrg return (pitch << 3); 298971d7fec4Smrg} 299071d7fec4Smrg 299171d7fec4Smrg/*----------------------------------------------------------------------------- 299271d7fec4Smrg * gfx_get_compression_size 299371d7fec4Smrg *----------------------------------------------------------------------------- 299471d7fec4Smrg */ 299571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 299671d7fec4Smrgunsigned short 299771d7fec4Smrggu2_get_compression_size(void) 299871d7fec4Smrg#else 299971d7fec4Smrgunsigned short 300071d7fec4Smrggfx_get_compression_size(void) 300171d7fec4Smrg#endif 300271d7fec4Smrg{ 300371d7fec4Smrg unsigned short size; 300471d7fec4Smrg 300571d7fec4Smrg size = (unsigned short)((READ_REG32(MDC_LINE_SIZE) >> 16) & 0x7F) - 1; 300671d7fec4Smrg return ((size << 3) + 32); 300771d7fec4Smrg} 300871d7fec4Smrg 300971d7fec4Smrg/*----------------------------------------------------------------------------- 301071d7fec4Smrg * gfx_get_valid_bit 301171d7fec4Smrg *----------------------------------------------------------------------------- 301271d7fec4Smrg */ 301371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 301471d7fec4Smrgint 301571d7fec4Smrggu2_get_valid_bit(int line) 301671d7fec4Smrg#else 301771d7fec4Smrgint 301871d7fec4Smrggfx_get_valid_bit(int line) 301971d7fec4Smrg#endif 302071d7fec4Smrg{ 302171d7fec4Smrg unsigned long offset; 302271d7fec4Smrg int valid; 302371d7fec4Smrg 302471d7fec4Smrg offset = READ_REG32(MDC_PHY_MEM_OFFSET) & 0xFF000000; 302571d7fec4Smrg offset |= line; 302671d7fec4Smrg 302771d7fec4Smrg WRITE_REG32(MDC_PHY_MEM_OFFSET, offset); 302871d7fec4Smrg valid = (int)READ_REG32(MDC_DV_ACC) & 2; 302971d7fec4Smrg 303071d7fec4Smrg if (valid) 303171d7fec4Smrg return 1; 303271d7fec4Smrg return 0; 303371d7fec4Smrg} 303471d7fec4Smrg 303571d7fec4Smrg/*--------------------------------------------------------------------------- 303671d7fec4Smrg * gfx_get_display_video_offset (PRIVATE ROUTINE - NOT PART OF API) 303771d7fec4Smrg * 303871d7fec4Smrg * This routine is called by "gfx_get_video_offset". It abstracts the 303971d7fec4Smrg * version of the display controller from the video overlay routines. 304071d7fec4Smrg *--------------------------------------------------------------------------- 304171d7fec4Smrg */ 304271d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 304371d7fec4Smrgunsigned long 304471d7fec4Smrggu2_get_display_video_offset(void) 304571d7fec4Smrg#else 304671d7fec4Smrgunsigned long 304771d7fec4Smrggfx_get_display_video_offset(void) 304871d7fec4Smrg#endif 304971d7fec4Smrg{ 305071d7fec4Smrg return (READ_REG32(MDC_VID_Y_ST_OFFSET) & 0x0FFFFFFF); 305171d7fec4Smrg} 305271d7fec4Smrg 305371d7fec4Smrg/*--------------------------------------------------------------------------- 305471d7fec4Smrg * gfx_get_display_video_yuv_offsets (PRIVATE ROUTINE - NOT PART OF API) 305571d7fec4Smrg * 305671d7fec4Smrg * This routine is called by "gfx_get_video_yuv_offsets". It abstracts the 305771d7fec4Smrg * version of the display controller from the video overlay routines. 305871d7fec4Smrg *--------------------------------------------------------------------------- 305971d7fec4Smrg */ 306071d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 306171d7fec4Smrgvoid 306271d7fec4Smrggu2_get_display_video_yuv_offsets(unsigned long *yoffset, 306371d7fec4Smrg unsigned long *uoffset, 306471d7fec4Smrg unsigned long *voffset) 306571d7fec4Smrg#else 306671d7fec4Smrgvoid 306771d7fec4Smrggfx_get_display_video_yuv_offsets(unsigned long *yoffset, 306871d7fec4Smrg unsigned long *uoffset, 306971d7fec4Smrg unsigned long *voffset) 307071d7fec4Smrg#endif 307171d7fec4Smrg{ 307271d7fec4Smrg *yoffset = (READ_REG32(MDC_VID_Y_ST_OFFSET) & 0x0FFFFFFF); 307371d7fec4Smrg *uoffset = (READ_REG32(MDC_VID_U_ST_OFFSET) & 0x0FFFFFFF); 307471d7fec4Smrg *voffset = (READ_REG32(MDC_VID_V_ST_OFFSET) & 0x0FFFFFFF); 307571d7fec4Smrg} 307671d7fec4Smrg 307771d7fec4Smrg/*--------------------------------------------------------------------------- 307871d7fec4Smrg * gfx_get_display_video_yuv_pitch (PRIVATE ROUTINE - NOT PART OF API) 307971d7fec4Smrg * 308071d7fec4Smrg * This routine is called by "gfx_get_video_yuv_pitch". It abstracts the 308171d7fec4Smrg * version of the display controller from the video overlay routines. 308271d7fec4Smrg *--------------------------------------------------------------------------- 308371d7fec4Smrg */ 308471d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 308571d7fec4Smrgvoid 308671d7fec4Smrggu2_get_display_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) 308771d7fec4Smrg#else 308871d7fec4Smrgvoid 308971d7fec4Smrggfx_get_display_video_yuv_pitch(unsigned long *ypitch, unsigned long *uvpitch) 309071d7fec4Smrg#endif 309171d7fec4Smrg{ 309271d7fec4Smrg unsigned long pitch = READ_REG32(MDC_VID_YUV_PITCH); 309371d7fec4Smrg 309471d7fec4Smrg *ypitch = ((pitch & 0xFFFF) << 3); 309571d7fec4Smrg *uvpitch = (pitch >> 13) & 0x7FFF8; 309671d7fec4Smrg} 309771d7fec4Smrg 309871d7fec4Smrg/*--------------------------------------------------------------------------- 309971d7fec4Smrg * gfx_get_display_video_downscale_delta (PRIVATE ROUTINE - NOT PART OF API) 310071d7fec4Smrg * 310171d7fec4Smrg * This routine is called by "gfx_get_video_downscale_delta". It abstracts the 310271d7fec4Smrg * version of the display controller from the video overlay routines. 310371d7fec4Smrg *--------------------------------------------------------------------------- 310471d7fec4Smrg */ 310571d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 310671d7fec4Smrgunsigned long 310771d7fec4Smrggu2_get_display_video_downscale_delta(void) 310871d7fec4Smrg#else 310971d7fec4Smrgunsigned long 311071d7fec4Smrggfx_get_display_video_downscale_delta(void) 311171d7fec4Smrg#endif 311271d7fec4Smrg{ 311371d7fec4Smrg return (READ_REG32(MDC_VID_DS_DELTA) >> 18); 311471d7fec4Smrg} 311571d7fec4Smrg 311671d7fec4Smrg/*--------------------------------------------------------------------------- 311771d7fec4Smrg * gfx_get_display_video_downscale_enable (PRIVATE ROUTINE - NOT PART OF API) 311871d7fec4Smrg * 311971d7fec4Smrg * This routine is called by "gfx_get_video_vertical_downscale_enable". It abstracts the 312071d7fec4Smrg * version of the display controller from the video overlay routines. 312171d7fec4Smrg *--------------------------------------------------------------------------- 312271d7fec4Smrg */ 312371d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 312471d7fec4Smrgint 312571d7fec4Smrggu2_get_display_video_downscale_enable(void) 312671d7fec4Smrg#else 312771d7fec4Smrgint 312871d7fec4Smrggfx_get_display_video_downscale_enable(void) 312971d7fec4Smrg#endif 313071d7fec4Smrg{ 313171d7fec4Smrg return ((int)((READ_REG32(MDC_GENERAL_CFG) >> 19) & 1)); 313271d7fec4Smrg} 313371d7fec4Smrg 313471d7fec4Smrg/*--------------------------------------------------------------------------- 313571d7fec4Smrg * gfx_get_display_video_size (PRIVATE ROUTINE - NOT PART OF API) 313671d7fec4Smrg * 313771d7fec4Smrg * This routine is called by "gfx_get_video_size". It abstracts the 313871d7fec4Smrg * version of the display controller from the video overlay routines. 313971d7fec4Smrg *--------------------------------------------------------------------------- 314071d7fec4Smrg */ 314171d7fec4Smrg#if GFX_DISPLAY_DYNAMIC 314271d7fec4Smrgunsigned long 314371d7fec4Smrggu2_get_display_video_size(void) 314471d7fec4Smrg#else 314571d7fec4Smrgunsigned long 314671d7fec4Smrggfx_get_display_video_size(void) 314771d7fec4Smrg#endif 314871d7fec4Smrg{ 314971d7fec4Smrg /* RETURN THE LINE SIZE, AS THIS IS ALL THAT IS AVAILABLE */ 315071d7fec4Smrg 315171d7fec4Smrg return ((READ_REG32(MDC_LINE_SIZE) >> 21) & 0x000007FF); 315271d7fec4Smrg} 315371d7fec4Smrg 315471d7fec4Smrg#endif /* GFX_READ_ROUTINES */ 315571d7fec4Smrg 315671d7fec4Smrg/* END OF FILE */ 3157