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