1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nsc/gfx/durango.c,v 1.1 2002/12/10 15:12:25 alanh Exp $ */
2/*
3 * $Workfile: durango.c $
4 *
5 * This is the main file used to add Durango graphics support to a software
6 * project.  The main reason to have a single file include the other files
7 * is that it centralizes the location of the compiler options.  This file
8 * should be tuned for a specific implementation, and then modified as needed
9 * for new Durango releases.  The releases.txt file indicates any updates to
10 * this main file, such as a new definition for a new hardware platform.
11 *
12 * In other words, this file should be copied from the Durango source files
13 * once when a software project starts, and then maintained as necessary.
14 * It should not be recopied with new versions of Durango unless the
15 * developer is willing to tune the file again for the specific project.
16 *
17 * NSC_LIC_ALTERNATIVE_PREAMBLE
18 *
19 * Revision 1.0
20 *
21 * National Semiconductor Alternative GPL-BSD License
22 *
23 * National Semiconductor Corporation licenses this software
24 * ("Software"):
25 *
26 *      Durango
27 *
28 * under one of the two following licenses, depending on how the
29 * Software is received by the Licensee.
30 *
31 * If this Software is received as part of the Linux Framebuffer or
32 * other GPL licensed software, then the GPL license designated
33 * NSC_LIC_GPL applies to this Software; in all other circumstances
34 * then the BSD-style license designated NSC_LIC_BSD shall apply.
35 *
36 * END_NSC_LIC_ALTERNATIVE_PREAMBLE */
37
38/* NSC_LIC_BSD
39 *
40 * National Semiconductor Corporation Open Source License for Durango
41 *
42 * (BSD License with Export Notice)
43 *
44 * Copyright (c) 1999-2001
45 * National Semiconductor Corporation.
46 * All rights reserved.
47 *
48 * Redistribution and use in source and binary forms, with or without
49 * modification, are permitted provided that the following conditions
50 * are met:
51 *
52 *   * Redistributions of source code must retain the above copyright
53 *     notice, this list of conditions and the following disclaimer.
54 *
55 *   * Redistributions in binary form must reproduce the above
56 *     copyright notice, this list of conditions and the following
57 *     disclaimer in the documentation and/or other materials provided
58 *     with the distribution.
59 *
60 *   * Neither the name of the National Semiconductor Corporation nor
61 *     the names of its contributors may be used to endorse or promote
62 *     products derived from this software without specific prior
63 *     written permission.
64 *
65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
66 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
67 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
68 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
69 * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY
70 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
72 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
73 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
74 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE,
75 * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY
76 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
77 * OF SUCH DAMAGE.
78 *
79 * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF
80 * YOUR JURISDICTION. It is licensee's responsibility to comply with
81 * any export regulations applicable in licensee's jurisdiction. Under
82 * CURRENT (2001) U.S. export regulations this software
83 * is eligible for export from the U.S. and can be downloaded by or
84 * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed
85 * destinations which include Cuba, Iraq, Libya, North Korea, Iran,
86 * Syria, Sudan, Afghanistan and any other country to which the U.S.
87 * has embargoed goods and services.
88 *
89 * END_NSC_LIC_BSD */
90
91/* NSC_LIC_GPL
92 *
93 * National Semiconductor Corporation Gnu General Public License for Durango
94 *
95 * (GPL License with Export Notice)
96 *
97 * Copyright (c) 1999-2001
98 * National Semiconductor Corporation.
99 * All rights reserved.
100 *
101 * Redistribution and use in source and binary forms, with or without
102 * modification, are permitted under the terms of the GNU General
103 * Public License as published by the Free Software Foundation; either
104 * version 2 of the License, or (at your option) any later version
105 *
106 * In addition to the terms of the GNU General Public License, neither
107 * the name of the National Semiconductor Corporation nor the names of
108 * its contributors may be used to endorse or promote products derived
109 * from this software without specific prior written permission.
110 *
111 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
112 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
113 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
114 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
115 * NATIONAL SEMICONDUCTOR CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY
116 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
117 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
118 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
119 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
120 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE,
121 * INTELLECTUAL PROPERTY INFRINGEMENT, OR OTHERWISE) ARISING IN ANY WAY
122 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
123 * OF SUCH DAMAGE. See the GNU General Public License for more details.
124 *
125 * EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF
126 * YOUR JURISDICTION. It is licensee's responsibility to comply with
127 * any export regulations applicable in licensee's jurisdiction. Under
128 * CURRENT (2001) U.S. export regulations this software
129 * is eligible for export from the U.S. and can be downloaded by or
130 * otherwise exported or reexported worldwide EXCEPT to U.S. embargoed
131 * destinations which include Cuba, Iraq, Libya, North Korea, Iran,
132 * Syria, Sudan, Afghanistan and any other country to which the U.S.
133 * has embargoed goods and services.
134 *
135 * You should have received a copy of the GNU General Public License
136 * along with this file; if not, write to the Free Software Foundation,
137 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
138 *
139 * END_NSC_LIC_GPL */
140
141/* COMPILER OPTIONS
142 * These compiler options specify how the Durango routines are compiled
143 * for the different hardware platforms.  For best performance, a driver
144 * would build for a specific platform.  The "dynamic" switches are set
145 * by diagnostic applications such as Darwin that will run on a variety
146 * of platforms and use the appropriate code at runtime.  Each component
147 * may be separately dynamic, so that a driver has the option of being
148 * tuned for a specific 2D accelerator, but will still run with a variety
149 * of chipsets.
150 */
151
152#define GFX_DISPLAY_DYNAMIC			1	/* runtime selection */
153#define GFX_DISPLAY_GU1				1	/* 1st generation display controller */
154#define GFX_DISPLAY_GU2				1	/* 2nd generation display controller */
155
156#define GFX_INIT_DYNAMIC            1	/* runtime selection */
157#define GFX_INIT_GU1                1	/* Geode family      */
158#define GFX_INIT_GU2                1	/* Redcloud          */
159
160#define GFX_MSR_DYNAMIC             1	/* runtime selection */
161#define GFX_MSR_REDCLOUD            1	/* Redcloud          */
162
163#define GFX_2DACCEL_DYNAMIC			1	/* runtime selection */
164#define GFX_2DACCEL_GU1				1	/* 1st generation 2D accelerator */
165#define GFX_2DACCEL_GU2				1	/* 2nd generation 2D accelerator */
166
167#define GFX_VIDEO_DYNAMIC			1	/* runtime selection */
168#define GFX_VIDEO_CS5530			1	/* support for CS5530 */
169#define GFX_VIDEO_SC1200			1	/* support for SC1200 */
170#define GFX_VIDEO_REDCLOUD          1	/* support for Redcloud */
171
172#define GFX_VIP_DYNAMIC				1	/* runtime selection */
173#define GFX_VIP_SC1200				1	/* support for SC1200 */
174
175#define GFX_DECODER_DYNAMIC			1	/* runtime selection */
176#define GFX_DECODER_SAA7114			1	/* Philips SAA7114 decoder */
177
178#define GFX_TV_DYNAMIC				1	/* runtime selection */
179#define GFX_TV_FS451				1	/* Focus Enhancements FS450 */
180#define GFX_TV_SC1200				1	/* SC1200 integrated TV encoder */
181
182#define GFX_I2C_DYNAMIC				1	/* runtime selection */
183#define GFX_I2C_ACCESS				1	/* support for ACCESS.BUS */
184#define GFX_I2C_GPIO				1	/* support for CS5530 GPIOs */
185
186#define GFX_VGA_DYNAMIC				1	/* runtime selection */
187#define GFX_VGA_GU1					1	/* 1st generation graphics unit */
188
189#define FB4MB						1	/* Set to use 4Mb video ram for Pyramid */
190
191#define GFX_NO_IO_IN_WAIT_MACROS    0	/* Set to remove I/O accesses in GP bit testing */
192
193/* ROUTINES TO READ VALUES
194 * These are routines used by Darwin or other diagnostics to read the
195 * current state of the hardware.  Display drivers or embedded applications can
196 * reduce the size of the Durango code by not including these routines.
197 */
198#define GFX_READ_ROUTINES			1	/* add routines to read values */
199
200/* VARIABLES USED FOR RUNTIME SELECTION
201 * If part of the graphics subsystem is declared as dynamic, then the
202 * following variables are used to specify which platform has been detected.
203 * The variables are set in the "gfx_detect_cpu" routine.  The values should
204 * be bit flags to allow masks to be used to check for multiple platforms.
205 */
206
207#if GFX_DISPLAY_DYNAMIC
208int gfx_display_type = 0;
209#endif
210
211#if GFX_INIT_DYNAMIC
212int gfx_init_type = 0;
213#endif
214
215#if GFX_MSR_DYNAMIC
216int gfx_msr_type = 0;
217#endif
218
219#if GFX_2DACCEL_DYNAMIC
220int gfx_2daccel_type = 0;
221#endif
222
223#if GFX_VIDEO_DYNAMIC
224int gfx_video_type = 0;
225#endif
226
227#if GFX_VIP_DYNAMIC
228int gfx_vip_type = 0;
229#endif
230
231#if GFX_DECODER_DYNAMIC
232int gfx_decoder_type = 0;
233#endif
234
235#if GFX_TV_DYNAMIC
236int gfx_tv_type = 0;
237#endif
238
239#if GFX_I2C_DYNAMIC
240int gfx_i2c_type = 0;
241#endif
242
243#if GFX_VGA_DYNAMIC
244int gfx_vga_type = 0;
245#endif
246
247/* HEADER FILE FOR DURANGO ROUTINE DEFINITIONS
248 * Needed since some of the Durango routines call other Durango routines.
249 * Also defines the size of chipset array (GFX_CSPTR_SIZE).
250 */
251#include "gfx_rtns.h"			/* routine definitions */
252
253/* DEFINE POINTERS TO MEMORY MAPPED REGIONS
254 * These pointers are used by the Durango routines to access the hardware.
255 * The variables must be set by the project's initialization code after
256 * mapping the regions in the appropriate manner.
257 */
258
259/* DEFINE VIRTUAL ADDRESSES */
260/* Note: These addresses define the starting base expected by all    */
261/*       Durango offsets.  Under an OS that requires these pointers  */
262/*       to be mapped to linear addresses (i.e Windows), it may not  */
263/*       be possible to keep these base offsets.  In these cases,    */
264/*       the addresses are modified to point to the beginning of the */
265/*       relevant memory region and the access macros are adjusted   */
266/*       to subtract the offset from the default base.  For example, */
267/*       the register pointer could be moved to be 0x40008000, while */
268/*       the WRITE_REG* macros are modified to subtract 0x8000 from  */
269/*       the offset.                                                 */
270
271unsigned char *gfx_virt_regptr = (unsigned char *)0x40000000;
272unsigned char *gfx_virt_fbptr = (unsigned char *)0x40800000;
273unsigned char *gfx_virt_vidptr = (unsigned char *)0x40010000;
274unsigned char *gfx_virt_vipptr = (unsigned char *)0x40015000;
275unsigned char *gfx_virt_spptr = (unsigned char *)0x40000000;
276unsigned char *gfx_virt_gpptr = (unsigned char *)0x40000000;
277
278/* DEFINE PHYSICAL ADDRESSES */
279
280unsigned char *gfx_phys_regptr = (unsigned char *)0x40000000;
281unsigned char *gfx_phys_fbptr = (unsigned char *)0x40800000;
282unsigned char *gfx_phys_vidptr = (unsigned char *)0x40010000;
283unsigned char *gfx_phys_vipptr = (unsigned char *)0x40015000;
284
285/* HEADER FILE FOR GRAPHICS REGISTER DEFINITIONS
286 * This contains only constant definitions, so it should be able to be
287 * included in any software project as is.
288 */
289#include "gfx_regs.h"			/* graphics register definitions */
290
291/* HEADER FILE FOR REGISTER ACCESS MACROS
292 * This file contains the definitions of the WRITE_REG32 and similar macros
293 * used by the Durango routines to access the hardware.  The file assumes
294 * that the environment can handle 32-bit pointer access.  If this is not
295 * the case, or if there are special requirements, then this header file
296 * should not be included and the project must define the macros itself.
297 * (A project may define WRITE_REG32 to call a routine, for example).
298 */
299#include "gfx_defs.h"			/* register access macros */
300
301/* IO MACROS AND ROUTINES
302 * These macros must be defined before the initialization or I2C
303 * routines will work properly.
304 */
305
306#if defined(OS_WIN32)			/* For Windows */
307
308/* VSA II CALL */
309
310void
311gfx_msr_asm_read(unsigned short msrReg, unsigned long msrAddr,
312		 unsigned long *ptrHigh, unsigned long *ptrLow)
313{
314   unsigned long temp1, temp2;
315
316   _asm {
317      mov dx, 0x0AC1C
318      mov eax, 0x0FC530007
319      out dx, eax
320      add dl, 2
321      mov ecx, msrAddr
322      mov cx, msrReg
323      in ax, dx;
324      ;EDX:EAX will contain MSR contents.
325      mov temp1, edx
326      mov temp2, eax
327   }
328
329   *ptrHigh = temp1;
330   *ptrLow = temp2;
331}
332
333void
334gfx_msr_asm_write(unsigned short msrReg, unsigned long msrAddr,
335		  unsigned long *ptrHigh, unsigned long *ptrLow)
336{
337   unsigned long temp1 = *ptrHigh;
338   unsigned long temp2 = *ptrLow;
339
340   _asm {
341      mov dx, 0x0AC1C
342      mov eax, 0x0FC530007
343      out dx, eax i
344      add dl, 2
345      ;ECX contains msrAddr | msrReg
346      mov ecx, msrAddr
347      mov cx, msrReg
348      ;<OR_mask_hi >
349      mov ebx, temp1
350
351      ;<OR_mask_hi >
352      mov eax, temp2
353      ;<AND_mask_hi >
354      mov esi, 0
355      ;<AND_mask_lo >
356      mov edi, 0
357      ;MSR is written at this point
358      out dx, ax
359   }
360}
361
362unsigned char
363gfx_inb(unsigned short port)
364{
365   unsigned char data;
366
367   _asm {
368      pushf
369      mov dx, port
370      in al, dx
371      mov data, al
372      popf
373   }
374   return (data);
375}
376
377unsigned short
378gfx_inw(unsigned short port)
379{
380   unsigned short data;
381
382   _asm {
383      pushf
384      mov dx, port
385      in ax, dx
386      mov data, ax
387      popf
388   }
389   return (data);
390}
391
392unsigned long
393gfx_ind(unsigned short port)
394{
395   unsigned long data;
396
397   _asm {
398      pushf
399      mov dx, port
400      in eax, dx
401      mov data, eax
402      popf
403   }
404   return (data);
405}
406
407void
408gfx_outb(unsigned short port, unsigned char data)
409{
410   _asm {
411      pushf
412      mov al, data
413      mov dx, port
414      out dx, al
415      popf
416   }
417}
418
419void
420gfx_outw(unsigned short port, unsigned short data)
421{
422   _asm {
423      pushf
424      mov ax, data
425      mov dx, port
426      out dx, ax
427      popf
428   }
429}
430
431void
432gfx_outd(unsigned short port, unsigned long data)
433{
434   _asm {
435      pushf
436      mov eax, data
437      mov dx, port
438      out dx, eax
439      popf
440   }
441}
442
443
444#elif defined(OS_VXWORKS) || defined (OS_LINUX)	/* VxWorks and Linux */
445
446#if defined(OS_LINUX)
447#include "asm/msr.h"
448#endif
449
450void
451gfx_msr_asm_read(unsigned short msrReg, unsigned long msrAddr,
452		 unsigned long *ptrHigh, unsigned long *ptrLow)
453{
454   unsigned long addr, val1, val2;
455
456   addr = msrAddr | (unsigned long)msrReg;
457   rdmsr(addr, val1, val2);
458
459   *ptrHigh = val2;
460   *ptrLow = val1;
461}
462
463void
464gfx_msr_asm_write(unsigned short msrReg, unsigned long msrAddr,
465		  unsigned long *ptrHigh, unsigned long *ptrLow)
466{
467   unsigned long addr, val1, val2;
468
469   val2 = *ptrHigh;
470   val1 = *ptrLow;
471
472   addr = (msrAddr & 0xFFFF0000) | (unsigned long)msrReg;
473   wrmsr(addr, val1, val2);
474}
475
476unsigned char
477gfx_inb(unsigned short port)
478{
479   unsigned char value;
480   __asm__ volatile ("inb %1,%0":"=a" (value):"d"(port));
481
482   return value;
483}
484
485unsigned short
486gfx_inw(unsigned short port)
487{
488   unsigned short value;
489   __asm__ volatile ("in %1,%0":"=a" (value):"d"(port));
490
491   return value;
492}
493
494unsigned long
495gfx_ind(unsigned short port)
496{
497   unsigned long value;
498   __asm__ volatile ("inl %1,%0":"=a" (value):"d"(port));
499
500   return value;
501}
502
503void
504gfx_outb(unsigned short port, unsigned char data)
505{
506   __asm__ volatile ("outb %0,%1"::"a" (data), "d"(port));
507}
508
509void
510gfx_outw(unsigned short port, unsigned short data)
511{
512   __asm__ volatile ("out %0,%1"::"a" (data), "d"(port));
513}
514
515void
516gfx_outd(unsigned short port, unsigned long data)
517{
518   __asm__ volatile ("outl %0,%1"::"a" (data), "d"(port));
519}
520
521#else /* else nothing */
522
523unsigned char
524gfx_inb(unsigned short port)
525{
526   /* ADD OS SPECIFIC IMPLEMENTATION */
527   return (0);
528}
529
530unsigned short
531gfx_inw(unsigned short port)
532{
533   /* ADD OS SPECIFIC IMPLEMENTATION */
534   return (0);
535}
536
537unsigned long
538gfx_ind(unsigned short port)
539{
540   /* ADD OS SPECIFIC IMPLEMENTATION */
541   return (0);
542}
543
544void
545gfx_outb(unsigned short port, unsigned char data)
546{
547   /* ADD OS SPECIFIC IMPLEMENTATION */
548}
549
550void
551gfx_outw(unsigned short port, unsigned short data)
552{
553   /* ADD OS SPECIFIC IMPLEMENTATION */
554}
555
556void
557gfx_outd(unsigned short port, unsigned long data)
558{
559   /* ADD OS SPECIFIC IMPLEMENTATION */
560}
561#endif
562
563#define INB(port) gfx_inb(port)
564#define INW(port) gfx_inw(port)
565#define IND(port) gfx_ind(port)
566#define OUTB(port, data) gfx_outb(port, data)
567#define OUTW(port, data) gfx_outw(port, data)
568#define OUTD(port, data) gfx_outd(port, data)
569
570/* INITIALIZATION ROUTINES
571 * These routines are used during the initialization of the driver to
572 * perform such tasks as detecting the type of CPU and video hardware.
573 * The routines require the use of IO, so the above IO routines need
574 * to be implemented before the initialization routines will work
575 * properly.
576 */
577
578#include "gfx_init.c"
579
580/* INCLUDE MSR ACCESS ROUTINES */
581
582#include "gfx_msr.c"
583
584/* INCLUDE GRAPHICS ENGINE ROUTINES
585 * These routines are used to program the 2D graphics accelerator.  If
586 * the project does not use graphics acceleration (direct frame buffer
587 * access only), then this file does not need to be included.
588 */
589#include "gfx_rndr.c"			/* graphics engine routines */
590
591/* INCLUDE DISPLAY CONTROLLER ROUTINES
592 * These routines are used if the display mode is set directly.  If the
593 * project uses VGA registers to set a display mode, then these files
594 * do not need to be included.
595 */
596#include "gfx_mode.h"			/* display mode tables */
597#include "gfx_disp.c"			/* display controller routines */
598
599/* INCLUDE VIDEO OVERLAY ROUTINES
600 * These routines control the video overlay hardware.
601 */
602#include "gfx_vid.c"			/* video overlay routines */
603
604/* VIDEO PORT AND VIDEO DECODER ROUTINES
605 * These routines rely on the I2C routines.
606 */
607#include "gfx_vip.c"			/* video port routines */
608#include "gfx_dcdr.c"			/* video decoder routines */
609
610/* I2C BUS ACCESS ROUTINES
611 * These routines are used by the video decoder and possibly an
612 * external TV encoer.
613 */
614#include "gfx_i2c.c"			/* I2C bus access routines */
615
616/* TV ENCODER ROUTINES
617 * This file does not need to be included if the system does not
618 * support TV output.
619 */
620#include "gfx_tv.c"			/* TV encoder routines */
621
622/* VGA ROUTINES
623 * This file is used if setting display modes using VGA registers.
624 */
625#include "gfx_vga.c"			/* VGA routines */
626
627/* END OF FILE */
628