durango.c revision 04007eba
1f29dbc25Smrg/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc. 2f29dbc25Smrg * 3f29dbc25Smrg * Permission is hereby granted, free of charge, to any person obtaining a copy 4f29dbc25Smrg * of this software and associated documentation files (the "Software"), to 5f29dbc25Smrg * deal in the Software without restriction, including without limitation the 6f29dbc25Smrg * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7f29dbc25Smrg * sell copies of the Software, and to permit persons to whom the Software is 8f29dbc25Smrg * furnished to do so, subject to the following conditions: 9f29dbc25Smrg * 10f29dbc25Smrg * The above copyright notice and this permission notice shall be included in 11f29dbc25Smrg * all copies or substantial portions of the Software. 12f29dbc25Smrg * 13f29dbc25Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f29dbc25Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f29dbc25Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16f29dbc25Smrg * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17f29dbc25Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18f29dbc25Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19f29dbc25Smrg * IN THE SOFTWARE. 20f29dbc25Smrg * 21f29dbc25Smrg * Neither the name of the Advanced Micro Devices, Inc. nor the names of its 22f29dbc25Smrg * contributors may be used to endorse or promote products derived from this 23f29dbc25Smrg * software without specific prior written permission. 24f29dbc25Smrg * */ 25f29dbc25Smrg 26f29dbc25Smrg/* The previous version of this file was way more complex then it should have 27f29dbc25Smrg been - remove the unnessesary #defines and routines, and concentrate on 28f29dbc25Smrg Linux for now. 29f29dbc25Smrg*/ 30f29dbc25Smrg 31f29dbc25Smrg#ifdef HAVE_CONFIG_H 32f29dbc25Smrg#include "config.h" 33f29dbc25Smrg#endif 34f29dbc25Smrg 35f29dbc25Smrg#include <unistd.h> 36f29dbc25Smrg#include <errno.h> 37f29dbc25Smrg#include <compiler.h> 3804007ebaSmrg#include <os.h> /* ErrorF() */ 39f29dbc25Smrg 40f29dbc25Smrg/* Compiler options */ 41f29dbc25Smrg 4204007ebaSmrg#define GFX_DISPLAY_GU1 0 /* 1st generation display controller */ 4304007ebaSmrg#define GFX_DISPLAY_GU2 1 /* 2nd generation display controller */ 44f29dbc25Smrg 4504007ebaSmrg#define GFX_INIT_DYNAMIC 0 /* runtime selection */ 4604007ebaSmrg#define GFX_INIT_GU1 0 /* SC1200/GX1 */ 4704007ebaSmrg#define GFX_INIT_GU2 1 /* GX */ 48f29dbc25Smrg 4904007ebaSmrg#define GFX_MSR_DYNAMIC 0 /* runtime selection */ 5004007ebaSmrg#define GFX_MSR_REDCLOUD 1 /* GX */ 51f29dbc25Smrg 5204007ebaSmrg#define GFX_2DACCEL_DYNAMIC 0 /* runtime selection */ 5304007ebaSmrg#define GFX_2DACCEL_GU1 0 /* 1st generation 2D accelerator */ 5404007ebaSmrg#define GFX_2DACCEL_GU2 1 /* 2nd generation 2D accelerator */ 55f29dbc25Smrg 5604007ebaSmrg#define GFX_VIDEO_DYNAMIC 0 /* runtime selection */ 5704007ebaSmrg#define GFX_VIDEO_CS5530 0 /* support for CS5530 */ 5804007ebaSmrg#define GFX_VIDEO_SC1200 0 /* support for SC1200 */ 5904007ebaSmrg#define GFX_VIDEO_REDCLOUD 1 /* support for GX */ 60f29dbc25Smrg 6104007ebaSmrg#define GFX_VIP_DYNAMIC 0 /* runtime selection */ 6204007ebaSmrg#define GFX_VIP_SC1200 0 /* support for SC1200 */ 63f29dbc25Smrg 6404007ebaSmrg#define GFX_DECODER_DYNAMIC 0 /* runtime selection */ 6504007ebaSmrg#define GFX_DECODER_SAA7114 0 /* Philips SAA7114 decoder */ 66f29dbc25Smrg 6704007ebaSmrg#define GFX_TV_DYNAMIC 0 /* runtime selection */ 6804007ebaSmrg#define GFX_TV_FS451 0 /* Focus Enhancements FS450 */ 6904007ebaSmrg#define GFX_TV_SC1200 0 /* SC1200 integrated TV encoder */ 70f29dbc25Smrg 7104007ebaSmrg#define GFX_I2C_DYNAMIC 0 /* runtime selection */ 7204007ebaSmrg#define GFX_I2C_ACCESS 0 /* support for ACCESS.BUS */ 7304007ebaSmrg#define GFX_I2C_GPIO 0 /* support for CS5530 GPIOs */ 74f29dbc25Smrg 7504007ebaSmrg#define GFX_VGA_DYNAMIC 0 /* runtime selection */ 7604007ebaSmrg#define GFX_VGA_GU1 0 /* 1st generation graphics unit */ 77f29dbc25Smrg 7804007ebaSmrg#define FB4MB 1 /* Set to use 4Mb vid ram for Pyramid */ 79f29dbc25Smrg 8004007ebaSmrg#define GFX_NO_IO_IN_WAIT_MACROS 1 /* Set to remove I/O accesses in GP */ 81f29dbc25Smrg#define GFX_READ_ROUTINES 1 82f29dbc25Smrg 83f29dbc25Smrg#include "gfx_rtns.h" 84f29dbc25Smrg#include "gfx_priv.h" 85f29dbc25Smrg#include "gfx_regs.h" 86f29dbc25Smrg#include "gfx_defs.h" 87f29dbc25Smrg 8804007ebaSmrgunsigned char *gfx_virt_regptr = (unsigned char *) 0x40000000; 8904007ebaSmrgunsigned char *gfx_virt_fbptr = (unsigned char *) 0x40800000; 9004007ebaSmrgunsigned char *gfx_virt_vidptr = (unsigned char *) 0x40010000; 9104007ebaSmrgunsigned char *gfx_virt_vipptr = (unsigned char *) 0x40015000; 9204007ebaSmrgunsigned char *gfx_virt_spptr = (unsigned char *) 0x40000000; 9304007ebaSmrgunsigned char *gfx_virt_gpptr = (unsigned char *) 0x40000000; 94f29dbc25Smrg 9504007ebaSmrgunsigned char *gfx_phys_regptr = (unsigned char *) 0x40000000; 9604007ebaSmrgunsigned char *gfx_phys_fbptr = (unsigned char *) 0x40800000; 9704007ebaSmrgunsigned char *gfx_phys_vidptr = (unsigned char *) 0x40010000; 9804007ebaSmrgunsigned char *gfx_phys_vipptr = (unsigned char *) 0x40015000; 99f29dbc25Smrg 100f29dbc25Smrg#define INB(port) inb(port) 101f29dbc25Smrg#define INW(port) inw(port) 102f29dbc25Smrg#define IND(port) inl(port) 103f29dbc25Smrg#define OUTB(port,data) outb(port, data) 104f29dbc25Smrg#define OUTW(port,data) outw(port, data) 105f29dbc25Smrg#define OUTD(port,data) outl(port, data) 106f29dbc25Smrg 107f29dbc25Smrg/* Squash warnings */ 108f29dbc25Smrgunsigned char gfx_inb(unsigned short); 109f29dbc25Smrgunsigned short gfx_inw(unsigned short); 110f29dbc25Smrgunsigned long gfx_ind(unsigned short); 111f29dbc25Smrg 112f29dbc25Smrgvoid gfx_outb(unsigned short, unsigned char); 113f29dbc25Smrgvoid gfx_outw(unsigned short, unsigned short); 114f29dbc25Smrgvoid gfx_outd(unsigned short, unsigned long); 115f29dbc25Smrg 116f29dbc25Smrginline unsigned char 117f29dbc25Smrggfx_inb(unsigned short port) 118f29dbc25Smrg{ 119f29dbc25Smrg return inb(port); 120f29dbc25Smrg} 121f29dbc25Smrg 122f29dbc25Smrginline unsigned short 123f29dbc25Smrggfx_inw(unsigned short port) 124f29dbc25Smrg{ 125f29dbc25Smrg return inw(port); 126f29dbc25Smrg} 127f29dbc25Smrg 128f29dbc25Smrginline unsigned long 129f29dbc25Smrggfx_ind(unsigned short port) 130f29dbc25Smrg{ 131f29dbc25Smrg return inl(port); 132f29dbc25Smrg} 133f29dbc25Smrg 134f29dbc25Smrginline void 135f29dbc25Smrggfx_outb(unsigned short port, unsigned char data) 136f29dbc25Smrg{ 137f29dbc25Smrg outb(port, data); 138f29dbc25Smrg} 139f29dbc25Smrg 140f29dbc25Smrginline void 141f29dbc25Smrggfx_outw(unsigned short port, unsigned short data) 142f29dbc25Smrg{ 143f29dbc25Smrg outw(port, data); 144f29dbc25Smrg} 145f29dbc25Smrg 146f29dbc25Smrginline void 147f29dbc25Smrggfx_outd(unsigned short port, unsigned long data) 148f29dbc25Smrg{ 149f29dbc25Smrg outl(port, data); 150f29dbc25Smrg} 151f29dbc25Smrg 152f29dbc25Smrg/* These routines use VSA to read the MSRs - these are a second resort to the Linux MSR method */ 153f29dbc25Smrg 154f29dbc25Smrg#define vsa_msr_read(msr,adr,high,low) \ 155f29dbc25Smrg __asm__ __volatile__( \ 156f29dbc25Smrg " mov $0x0AC1C, %%edx\n" \ 157f29dbc25Smrg " mov $0xFC530007, %%eax\n" \ 158f29dbc25Smrg " out %%eax,%%dx\n" \ 159f29dbc25Smrg " add $2,%%dl\n" \ 160f29dbc25Smrg " in %%dx, %%ax" \ 161f29dbc25Smrg : "=a" (*(low)), "=d" (*(high)) \ 162f29dbc25Smrg : "c" (msr | adr)) 163f29dbc25Smrg 164f29dbc25Smrg#define vsa_msr_write(msr,adr,high,low) \ 165f29dbc25Smrg { int d0, d1, d2, d3, d4; \ 166f29dbc25Smrg __asm__ __volatile__( \ 167f29dbc25Smrg " push %%ebx\n" \ 168f29dbc25Smrg " mov $0x0AC1C, %%edx\n" \ 169f29dbc25Smrg " mov $0xFC530007, %%eax\n" \ 170f29dbc25Smrg " out %%eax,%%dx\n" \ 171f29dbc25Smrg " add $2,%%dl\n" \ 172f29dbc25Smrg " mov %6, %%ebx\n" \ 173f29dbc25Smrg " mov %7, %0\n" \ 174f29dbc25Smrg " mov %5, %3\n" \ 175f29dbc25Smrg " xor %2, %2\n" \ 176f29dbc25Smrg " xor %1, %1\n" \ 177f29dbc25Smrg " out %%ax, %%dx\n" \ 178f29dbc25Smrg " pop %%ebx\n" \ 179f29dbc25Smrg : "=a"(d0),"=&D"(d1),"=&S"(d2), \ 180f29dbc25Smrg "=c"(d3),"=d"(d4) \ 181f29dbc25Smrg : "1"(msr | adr),"2"(*(high)),"3"(*(low))); \ 182f29dbc25Smrg } 183f29dbc25Smrg 184f29dbc25Smrgextern int GeodeWriteMSR(unsigned long, unsigned long, unsigned long); 185f29dbc25Smrgextern int GeodeReadMSR(unsigned long, unsigned long *, unsigned long *); 186f29dbc25Smrg 187f29dbc25Smrgvoid 188f29dbc25Smrggfx_msr_asm_write(unsigned short reg, unsigned long addr, 18904007ebaSmrg unsigned long *hi, unsigned long *lo) 190f29dbc25Smrg{ 191f29dbc25Smrg static int msr_method = 0; 192f29dbc25Smrg 193f29dbc25Smrg if (msr_method == 0) { 19404007ebaSmrg if (!GeodeWriteMSR(addr | reg, *lo, *hi)) 19504007ebaSmrg return; 196f29dbc25Smrg 19704007ebaSmrg msr_method = 1; 198f29dbc25Smrg } 199f29dbc25Smrg 200f29dbc25Smrg /* This is the fallback VSA method - not preferred */ 201f29dbc25Smrg vsa_msr_write(reg, addr, hi, lo); 202f29dbc25Smrg} 203f29dbc25Smrg 204f29dbc25Smrgvoid 205f29dbc25Smrggfx_msr_asm_read(unsigned short reg, unsigned long addr, 20604007ebaSmrg unsigned long *hi, unsigned long *lo) 207f29dbc25Smrg{ 208f29dbc25Smrg static int msr_method = 0; 209f29dbc25Smrg 210f29dbc25Smrg if (msr_method == 0) { 21104007ebaSmrg if (!GeodeReadMSR(addr | reg, lo, hi)) 21204007ebaSmrg return; 213f29dbc25Smrg 21404007ebaSmrg ErrorF("Unable to read the MSR - reverting to the VSA method.\n"); 21504007ebaSmrg msr_method = 1; 216f29dbc25Smrg } 217f29dbc25Smrg 218f29dbc25Smrg /* This is the fallback VSA method - not preferred */ 219f29dbc25Smrg vsa_msr_read(reg, addr, hi, lo); 220f29dbc25Smrg} 221f29dbc25Smrg 222f29dbc25Smrg#include "gfx_init.c" 223f29dbc25Smrg#include "gfx_msr.c" 224f29dbc25Smrg#include "gfx_rndr.c" 225f29dbc25Smrg#include "gfx_mode.h" 226f29dbc25Smrg#include "gfx_disp.c" 227f29dbc25Smrg#include "gfx_vid.c" 228f29dbc25Smrg#include "gfx_vip.c" 229f29dbc25Smrg#include "gfx_dcdr.c" 230f29dbc25Smrg#include "gfx_i2c.c" 231f29dbc25Smrg#include "gfx_tv.c" 232f29dbc25Smrg#include "gfx_vga.c" 233