1f7018c21STomi Valkeinen /* 2f7018c21STomi Valkeinen * linux/drivers/video/savagefb.h -- S3 Savage Framebuffer Driver 3f7018c21STomi Valkeinen * 4f7018c21STomi Valkeinen * Copyright (c) 2001 Denis Oliver Kropp <dok@convergence.de> 5f7018c21STomi Valkeinen * 6f7018c21STomi Valkeinen * This file is subject to the terms and conditions of the GNU General 7f7018c21STomi Valkeinen * Public License. See the file COPYING in the main directory of this 8f7018c21STomi Valkeinen * archive for more details. 9f7018c21STomi Valkeinen */ 10f7018c21STomi Valkeinen 11f7018c21STomi Valkeinen 12f7018c21STomi Valkeinen #ifndef __SAVAGEFB_H__ 13f7018c21STomi Valkeinen #define __SAVAGEFB_H__ 14f7018c21STomi Valkeinen 15f7018c21STomi Valkeinen #include <linux/i2c.h> 16f7018c21STomi Valkeinen #include <linux/i2c-algo-bit.h> 17f7018c21STomi Valkeinen #include <linux/mutex.h> 18f7018c21STomi Valkeinen #include <video/vga.h> 19f7018c21STomi Valkeinen #include "../edid.h" 20f7018c21STomi Valkeinen 21f7018c21STomi Valkeinen #ifdef SAVAGEFB_DEBUG 22f7018c21STomi Valkeinen # define DBG(x) printk (KERN_DEBUG "savagefb: %s\n", (x)); 23f7018c21STomi Valkeinen #else 24f7018c21STomi Valkeinen # define DBG(x) 25f7018c21STomi Valkeinen # define SavagePrintRegs(...) 26f7018c21STomi Valkeinen #endif 27f7018c21STomi Valkeinen 28f7018c21STomi Valkeinen 29f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE4 0x8a22 30f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE3D 0x8a20 31f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE3D_MV 0x8a21 32f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE2000 0x9102 33f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE_MX_MV 0x8c10 34f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE_MX 0x8c11 35f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE_IX_MV 0x8c12 36f7018c21STomi Valkeinen #define PCI_CHIP_SAVAGE_IX 0x8c13 37f7018c21STomi Valkeinen #define PCI_CHIP_PROSAVAGE_PM 0x8a25 38f7018c21STomi Valkeinen #define PCI_CHIP_PROSAVAGE_KM 0x8a26 39f7018c21STomi Valkeinen #define PCI_CHIP_S3TWISTER_P 0x8d01 40f7018c21STomi Valkeinen #define PCI_CHIP_S3TWISTER_K 0x8d02 41f7018c21STomi Valkeinen #define PCI_CHIP_PROSAVAGE_DDR 0x8d03 42f7018c21STomi Valkeinen #define PCI_CHIP_PROSAVAGE_DDRK 0x8d04 43f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_MX128 0x8c22 44f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_MX64 0x8c24 45f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_MX64C 0x8c26 46f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IX128SDR 0x8c2a 47f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IX128DDR 0x8c2b 48f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IX64SDR 0x8c2c 49f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IX64DDR 0x8c2d 50f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IXCSDR 0x8c2e 51f7018c21STomi Valkeinen #define PCI_CHIP_SUPSAV_IXCDDR 0x8c2f 52f7018c21STomi Valkeinen 53f7018c21STomi Valkeinen 54f7018c21STomi Valkeinen #define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000)) 55f7018c21STomi Valkeinen 56f7018c21STomi Valkeinen #define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) 57f7018c21STomi Valkeinen 58f7018c21STomi Valkeinen #define S3_SAVAGE4_SERIES(chip) ((chip>=S3_SAVAGE4) && (chip<=S3_PROSAVAGEDDR)) 59f7018c21STomi Valkeinen 60f7018c21STomi Valkeinen #define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) 61f7018c21STomi Valkeinen 62f7018c21STomi Valkeinen #define S3_MOBILE_TWISTER_SERIES(chip) ((chip==S3_TWISTER) || (chip==S3_PROSAVAGEDDR)) 63f7018c21STomi Valkeinen 64f7018c21STomi Valkeinen /* Chip tags. These are used to group the adapters into 65f7018c21STomi Valkeinen * related families. 66f7018c21STomi Valkeinen */ 67f7018c21STomi Valkeinen 68f7018c21STomi Valkeinen typedef enum { 69f7018c21STomi Valkeinen S3_UNKNOWN = 0, 70f7018c21STomi Valkeinen S3_SAVAGE3D, 71f7018c21STomi Valkeinen S3_SAVAGE_MX, 72f7018c21STomi Valkeinen S3_SAVAGE4, 73f7018c21STomi Valkeinen S3_PROSAVAGE, 74f7018c21STomi Valkeinen S3_TWISTER, 75f7018c21STomi Valkeinen S3_PROSAVAGEDDR, 76f7018c21STomi Valkeinen S3_SUPERSAVAGE, 77f7018c21STomi Valkeinen S3_SAVAGE2000, 78f7018c21STomi Valkeinen S3_LAST 79f7018c21STomi Valkeinen } savage_chipset; 80f7018c21STomi Valkeinen 81f7018c21STomi Valkeinen #define BIOS_BSIZE 1024 82f7018c21STomi Valkeinen #define BIOS_BASE 0xc0000 83f7018c21STomi Valkeinen 84f7018c21STomi Valkeinen #define SAVAGE_NEWMMIO_REGBASE_S3 0x1000000 /* 16MB */ 85f7018c21STomi Valkeinen #define SAVAGE_NEWMMIO_REGBASE_S4 0x0000000 86f7018c21STomi Valkeinen #define SAVAGE_NEWMMIO_REGSIZE 0x0080000 /* 512kb */ 87f7018c21STomi Valkeinen #define SAVAGE_NEWMMIO_VGABASE 0x8000 88f7018c21STomi Valkeinen 89f7018c21STomi Valkeinen #define BASE_FREQ 14318 90f7018c21STomi Valkeinen #define HALF_BASE_FREQ 7159 91f7018c21STomi Valkeinen 92f7018c21STomi Valkeinen #define FIFO_CONTROL_REG 0x8200 93f7018c21STomi Valkeinen #define MIU_CONTROL_REG 0x8204 94f7018c21STomi Valkeinen #define STREAMS_TIMEOUT_REG 0x8208 95f7018c21STomi Valkeinen #define MISC_TIMEOUT_REG 0x820c 96f7018c21STomi Valkeinen 97f7018c21STomi Valkeinen #define MONO_PAT_0 0xa4e8 98f7018c21STomi Valkeinen #define MONO_PAT_1 0xa4ec 99f7018c21STomi Valkeinen 100f7018c21STomi Valkeinen #define MAXFIFO 0x7f00 101f7018c21STomi Valkeinen 102f7018c21STomi Valkeinen #define BCI_CMD_NOP 0x40000000 103f7018c21STomi Valkeinen #define BCI_CMD_SETREG 0x96000000 104f7018c21STomi Valkeinen #define BCI_CMD_RECT 0x48000000 105f7018c21STomi Valkeinen #define BCI_CMD_RECT_XP 0x01000000 106f7018c21STomi Valkeinen #define BCI_CMD_RECT_YP 0x02000000 107f7018c21STomi Valkeinen #define BCI_CMD_SEND_COLOR 0x00008000 108f7018c21STomi Valkeinen #define BCI_CMD_DEST_GBD 0x00000000 109f7018c21STomi Valkeinen #define BCI_CMD_SRC_GBD 0x00000020 110f7018c21STomi Valkeinen #define BCI_CMD_SRC_SOLID 0x00000000 111f7018c21STomi Valkeinen #define BCI_CMD_SRC_MONO 0x00000060 112f7018c21STomi Valkeinen #define BCI_CMD_CLIP_NEW 0x00006000 113f7018c21STomi Valkeinen #define BCI_CMD_CLIP_LR 0x00004000 114f7018c21STomi Valkeinen 115f7018c21STomi Valkeinen #define BCI_CLIP_LR(l, r) ((((r) << 16) | (l)) & 0x0FFF0FFF) 116f7018c21STomi Valkeinen #define BCI_CLIP_TL(t, l) ((((t) << 16) | (l)) & 0x0FFF0FFF) 117f7018c21STomi Valkeinen #define BCI_CLIP_BR(b, r) ((((b) << 16) | (r)) & 0x0FFF0FFF) 118f7018c21STomi Valkeinen #define BCI_W_H(w, h) (((h) << 16) | ((w) & 0xFFF)) 119f7018c21STomi Valkeinen #define BCI_X_Y(x, y) (((y) << 16) | ((x) & 0xFFF)) 120f7018c21STomi Valkeinen 121f7018c21STomi Valkeinen #define BCI_GBD1 0xE0 122f7018c21STomi Valkeinen #define BCI_GBD2 0xE1 123f7018c21STomi Valkeinen 124f7018c21STomi Valkeinen #define BCI_BUFFER_OFFSET 0x10000 125f7018c21STomi Valkeinen #define BCI_SIZE 0x4000 126f7018c21STomi Valkeinen 127f7018c21STomi Valkeinen #define BCI_SEND(dw) writel(dw, par->bci_base + par->bci_ptr++) 128f7018c21STomi Valkeinen 129f7018c21STomi Valkeinen #define BCI_CMD_GET_ROP(cmd) (((cmd) >> 16) & 0xFF) 130f7018c21STomi Valkeinen #define BCI_CMD_SET_ROP(cmd, rop) ((cmd) |= ((rop & 0xFF) << 16)) 131f7018c21STomi Valkeinen #define BCI_CMD_SEND_COLOR 0x00008000 132f7018c21STomi Valkeinen 133f7018c21STomi Valkeinen #define DISP_CRT 1 134f7018c21STomi Valkeinen #define DISP_LCD 2 135f7018c21STomi Valkeinen #define DISP_DFP 3 136f7018c21STomi Valkeinen 137f7018c21STomi Valkeinen struct xtimings { 138f7018c21STomi Valkeinen unsigned int Clock; 139f7018c21STomi Valkeinen unsigned int HDisplay; 140f7018c21STomi Valkeinen unsigned int HSyncStart; 141f7018c21STomi Valkeinen unsigned int HSyncEnd; 142f7018c21STomi Valkeinen unsigned int HTotal; 143f7018c21STomi Valkeinen unsigned int HAdjusted; 144f7018c21STomi Valkeinen unsigned int VDisplay; 145f7018c21STomi Valkeinen unsigned int VSyncStart; 146f7018c21STomi Valkeinen unsigned int VSyncEnd; 147f7018c21STomi Valkeinen unsigned int VTotal; 148f7018c21STomi Valkeinen unsigned int sync; 149f7018c21STomi Valkeinen int dblscan; 150f7018c21STomi Valkeinen int interlaced; 151f7018c21STomi Valkeinen }; 152f7018c21STomi Valkeinen 153f7018c21STomi Valkeinen struct savage_reg { 154f7018c21STomi Valkeinen unsigned char MiscOutReg; /* Misc */ 155f7018c21STomi Valkeinen unsigned char CRTC[25]; /* Crtc Controller */ 156f7018c21STomi Valkeinen unsigned char Sequencer[5]; /* Video Sequencer */ 157f7018c21STomi Valkeinen unsigned char Graphics[9]; /* Video Graphics */ 158f7018c21STomi Valkeinen unsigned char Attribute[21]; /* Video Attribute */ 159f7018c21STomi Valkeinen 160f7018c21STomi Valkeinen unsigned int mode, refresh; 161f7018c21STomi Valkeinen unsigned char SR08, SR0E, SR0F; 162f7018c21STomi Valkeinen unsigned char SR10, SR11, SR12, SR13, SR15, SR18, SR29, SR30; 163f7018c21STomi Valkeinen unsigned char SR54[8]; 164f7018c21STomi Valkeinen unsigned char Clock; 165f7018c21STomi Valkeinen unsigned char CR31, CR32, CR33, CR34, CR36, CR3A, CR3B, CR3C; 166f7018c21STomi Valkeinen unsigned char CR40, CR41, CR42, CR43, CR45; 167f7018c21STomi Valkeinen unsigned char CR50, CR51, CR53, CR55, CR58, CR5B, CR5D, CR5E; 168f7018c21STomi Valkeinen unsigned char CR60, CR63, CR65, CR66, CR67, CR68, CR69, CR6D, CR6F; 169f7018c21STomi Valkeinen unsigned char CR86, CR88; 170f7018c21STomi Valkeinen unsigned char CR90, CR91, CRB0; 171f7018c21STomi Valkeinen unsigned int STREAMS[22]; /* yuck, streams regs */ 172f7018c21STomi Valkeinen unsigned int MMPR0, MMPR1, MMPR2, MMPR3; 173f7018c21STomi Valkeinen }; 174f7018c21STomi Valkeinen /* --------------------------------------------------------------------- */ 175f7018c21STomi Valkeinen 176f7018c21STomi Valkeinen #define NR_PALETTE 256 177f7018c21STomi Valkeinen 178f7018c21STomi Valkeinen 179f7018c21STomi Valkeinen struct savagefb_par; 180f7018c21STomi Valkeinen 181f7018c21STomi Valkeinen struct savagefb_i2c_chan { 182f7018c21STomi Valkeinen struct savagefb_par *par; 183f7018c21STomi Valkeinen struct i2c_adapter adapter; 184f7018c21STomi Valkeinen struct i2c_algo_bit_data algo; 185f7018c21STomi Valkeinen volatile u8 __iomem *ioaddr; 186f7018c21STomi Valkeinen u32 reg; 187f7018c21STomi Valkeinen }; 188f7018c21STomi Valkeinen 189f7018c21STomi Valkeinen struct savagefb_par { 190f7018c21STomi Valkeinen struct pci_dev *pcidev; 191f7018c21STomi Valkeinen savage_chipset chip; 192f7018c21STomi Valkeinen struct savagefb_i2c_chan chan; 193f7018c21STomi Valkeinen struct savage_reg state; 194f7018c21STomi Valkeinen struct savage_reg save; 195f7018c21STomi Valkeinen struct savage_reg initial; 196f7018c21STomi Valkeinen struct vgastate vgastate; 197f7018c21STomi Valkeinen struct mutex open_lock; 198f7018c21STomi Valkeinen unsigned char *edid; 199f7018c21STomi Valkeinen u32 pseudo_palette[16]; 200f7018c21STomi Valkeinen u32 open_count; 201f7018c21STomi Valkeinen int paletteEnabled; 202f7018c21STomi Valkeinen int pm_state; 203f7018c21STomi Valkeinen int display_type; 204f7018c21STomi Valkeinen int dvi; 205f7018c21STomi Valkeinen int crtonly; 206f7018c21STomi Valkeinen int dacSpeedBpp; 207f7018c21STomi Valkeinen int maxClock; 208f7018c21STomi Valkeinen int minClock; 209f7018c21STomi Valkeinen int numClocks; 210f7018c21STomi Valkeinen int clock[4]; 211f7018c21STomi Valkeinen int MCLK, REFCLK, LCDclk; 212f7018c21STomi Valkeinen struct { 213f7018c21STomi Valkeinen void __iomem *vbase; 214f7018c21STomi Valkeinen u32 pbase; 215f7018c21STomi Valkeinen u32 len; 216f7018c21STomi Valkeinen #ifdef CONFIG_MTRR 217f7018c21STomi Valkeinen int mtrr; 218f7018c21STomi Valkeinen #endif 219f7018c21STomi Valkeinen } video; 220f7018c21STomi Valkeinen 221f7018c21STomi Valkeinen struct { 222f7018c21STomi Valkeinen void __iomem *vbase; 223f7018c21STomi Valkeinen u32 pbase; 224f7018c21STomi Valkeinen u32 len; 225f7018c21STomi Valkeinen } mmio; 226f7018c21STomi Valkeinen 227f7018c21STomi Valkeinen volatile u32 __iomem *bci_base; 228f7018c21STomi Valkeinen unsigned int bci_ptr; 229f7018c21STomi Valkeinen u32 cob_offset; 230f7018c21STomi Valkeinen u32 cob_size; 231f7018c21STomi Valkeinen int cob_index; 232f7018c21STomi Valkeinen 233f7018c21STomi Valkeinen void (*SavageWaitIdle) (struct savagefb_par *par); 234f7018c21STomi Valkeinen void (*SavageWaitFifo) (struct savagefb_par *par, int space); 235f7018c21STomi Valkeinen 236f7018c21STomi Valkeinen int HorizScaleFactor; 237f7018c21STomi Valkeinen 238f7018c21STomi Valkeinen /* Panels size */ 239f7018c21STomi Valkeinen int SavagePanelWidth; 240f7018c21STomi Valkeinen int SavagePanelHeight; 241f7018c21STomi Valkeinen 242f7018c21STomi Valkeinen struct { 243f7018c21STomi Valkeinen u16 red, green, blue, transp; 244f7018c21STomi Valkeinen } palette[NR_PALETTE]; 245f7018c21STomi Valkeinen 246f7018c21STomi Valkeinen int depth; 247f7018c21STomi Valkeinen int vwidth; 248f7018c21STomi Valkeinen }; 249f7018c21STomi Valkeinen 250f7018c21STomi Valkeinen #define BCI_BD_BW_DISABLE 0x10000000 251f7018c21STomi Valkeinen #define BCI_BD_SET_BPP(bd, bpp) ((bd) |= (((bpp) & 0xFF) << 16)) 252f7018c21STomi Valkeinen #define BCI_BD_SET_STRIDE(bd, st) ((bd) |= ((st) & 0xFFFF)) 253f7018c21STomi Valkeinen 254f7018c21STomi Valkeinen 255f7018c21STomi Valkeinen /* IO functions */ 256f7018c21STomi Valkeinen static inline u8 savage_in8(u32 addr, struct savagefb_par *par) 257f7018c21STomi Valkeinen { 258f7018c21STomi Valkeinen return readb(par->mmio.vbase + addr); 259f7018c21STomi Valkeinen } 260f7018c21STomi Valkeinen 261f7018c21STomi Valkeinen static inline u16 savage_in16(u32 addr, struct savagefb_par *par) 262f7018c21STomi Valkeinen { 263f7018c21STomi Valkeinen return readw(par->mmio.vbase + addr); 264f7018c21STomi Valkeinen } 265f7018c21STomi Valkeinen 266f7018c21STomi Valkeinen static inline u32 savage_in32(u32 addr, struct savagefb_par *par) 267f7018c21STomi Valkeinen { 268f7018c21STomi Valkeinen return readl(par->mmio.vbase + addr); 269f7018c21STomi Valkeinen } 270f7018c21STomi Valkeinen 271f7018c21STomi Valkeinen static inline void savage_out8(u32 addr, u8 val, struct savagefb_par *par) 272f7018c21STomi Valkeinen { 273f7018c21STomi Valkeinen writeb(val, par->mmio.vbase + addr); 274f7018c21STomi Valkeinen } 275f7018c21STomi Valkeinen 276f7018c21STomi Valkeinen static inline void savage_out16(u32 addr, u16 val, struct savagefb_par *par) 277f7018c21STomi Valkeinen { 278f7018c21STomi Valkeinen writew(val, par->mmio.vbase + addr); 279f7018c21STomi Valkeinen } 280f7018c21STomi Valkeinen 281f7018c21STomi Valkeinen static inline void savage_out32(u32 addr, u32 val, struct savagefb_par *par) 282f7018c21STomi Valkeinen { 283f7018c21STomi Valkeinen writel(val, par->mmio.vbase + addr); 284f7018c21STomi Valkeinen } 285f7018c21STomi Valkeinen 286f7018c21STomi Valkeinen static inline u8 vga_in8(int addr, struct savagefb_par *par) 287f7018c21STomi Valkeinen { 288f7018c21STomi Valkeinen return savage_in8(0x8000 + addr, par); 289f7018c21STomi Valkeinen } 290f7018c21STomi Valkeinen 291f7018c21STomi Valkeinen static inline u16 vga_in16(int addr, struct savagefb_par *par) 292f7018c21STomi Valkeinen { 293f7018c21STomi Valkeinen return savage_in16(0x8000 + addr, par); 294f7018c21STomi Valkeinen } 295f7018c21STomi Valkeinen 296f7018c21STomi Valkeinen static inline u8 vga_in32(int addr, struct savagefb_par *par) 297f7018c21STomi Valkeinen { 298f7018c21STomi Valkeinen return savage_in32(0x8000 + addr, par); 299f7018c21STomi Valkeinen } 300f7018c21STomi Valkeinen 301f7018c21STomi Valkeinen static inline void vga_out8(int addr, u8 val, struct savagefb_par *par) 302f7018c21STomi Valkeinen { 303f7018c21STomi Valkeinen savage_out8(0x8000 + addr, val, par); 304f7018c21STomi Valkeinen } 305f7018c21STomi Valkeinen 306f7018c21STomi Valkeinen static inline void vga_out16(int addr, u16 val, struct savagefb_par *par) 307f7018c21STomi Valkeinen { 308f7018c21STomi Valkeinen savage_out16(0x8000 + addr, val, par); 309f7018c21STomi Valkeinen } 310f7018c21STomi Valkeinen 311f7018c21STomi Valkeinen static inline void vga_out32(int addr, u32 val, struct savagefb_par *par) 312f7018c21STomi Valkeinen { 313f7018c21STomi Valkeinen savage_out32(0x8000 + addr, val, par); 314f7018c21STomi Valkeinen } 315f7018c21STomi Valkeinen 316f7018c21STomi Valkeinen static inline u8 VGArCR (u8 index, struct savagefb_par *par) 317f7018c21STomi Valkeinen { 318f7018c21STomi Valkeinen vga_out8(0x3d4, index, par); 319f7018c21STomi Valkeinen return vga_in8(0x3d5, par); 320f7018c21STomi Valkeinen } 321f7018c21STomi Valkeinen 322f7018c21STomi Valkeinen static inline u8 VGArGR (u8 index, struct savagefb_par *par) 323f7018c21STomi Valkeinen { 324f7018c21STomi Valkeinen vga_out8(0x3ce, index, par); 325f7018c21STomi Valkeinen return vga_in8(0x3cf, par); 326f7018c21STomi Valkeinen } 327f7018c21STomi Valkeinen 328f7018c21STomi Valkeinen static inline u8 VGArSEQ (u8 index, struct savagefb_par *par) 329f7018c21STomi Valkeinen { 330f7018c21STomi Valkeinen vga_out8(0x3c4, index, par); 331f7018c21STomi Valkeinen return vga_in8(0x3c5, par); 332f7018c21STomi Valkeinen } 333f7018c21STomi Valkeinen 334f7018c21STomi Valkeinen static inline void VGAwCR(u8 index, u8 val, struct savagefb_par *par) 335f7018c21STomi Valkeinen { 336f7018c21STomi Valkeinen vga_out8(0x3d4, index, par); 337f7018c21STomi Valkeinen vga_out8(0x3d5, val, par); 338f7018c21STomi Valkeinen } 339f7018c21STomi Valkeinen 340f7018c21STomi Valkeinen static inline void VGAwGR(u8 index, u8 val, struct savagefb_par *par) 341f7018c21STomi Valkeinen { 342f7018c21STomi Valkeinen vga_out8(0x3ce, index, par); 343f7018c21STomi Valkeinen vga_out8(0x3cf, val, par); 344f7018c21STomi Valkeinen } 345f7018c21STomi Valkeinen 346f7018c21STomi Valkeinen static inline void VGAwSEQ(u8 index, u8 val, struct savagefb_par *par) 347f7018c21STomi Valkeinen { 348f7018c21STomi Valkeinen vga_out8(0x3c4, index, par); 349f7018c21STomi Valkeinen vga_out8 (0x3c5, val, par); 350f7018c21STomi Valkeinen } 351f7018c21STomi Valkeinen 352f7018c21STomi Valkeinen static inline void VGAenablePalette(struct savagefb_par *par) 353f7018c21STomi Valkeinen { 354f7018c21STomi Valkeinen u8 tmp; 355f7018c21STomi Valkeinen 356f7018c21STomi Valkeinen tmp = vga_in8(0x3da, par); 357f7018c21STomi Valkeinen vga_out8(0x3c0, 0x00, par); 358f7018c21STomi Valkeinen par->paletteEnabled = 1; 359f7018c21STomi Valkeinen } 360f7018c21STomi Valkeinen 361f7018c21STomi Valkeinen static inline void VGAdisablePalette(struct savagefb_par *par) 362f7018c21STomi Valkeinen { 363f7018c21STomi Valkeinen u8 tmp; 364f7018c21STomi Valkeinen 365f7018c21STomi Valkeinen tmp = vga_in8(0x3da, par); 366f7018c21STomi Valkeinen vga_out8(0x3c0, 0x20, par); 367f7018c21STomi Valkeinen par->paletteEnabled = 0; 368f7018c21STomi Valkeinen } 369f7018c21STomi Valkeinen 370f7018c21STomi Valkeinen static inline void VGAwATTR(u8 index, u8 value, struct savagefb_par *par) 371f7018c21STomi Valkeinen { 372f7018c21STomi Valkeinen u8 tmp; 373f7018c21STomi Valkeinen 374f7018c21STomi Valkeinen if (par->paletteEnabled) 375f7018c21STomi Valkeinen index &= ~0x20; 376f7018c21STomi Valkeinen else 377f7018c21STomi Valkeinen index |= 0x20; 378f7018c21STomi Valkeinen 379f7018c21STomi Valkeinen tmp = vga_in8(0x3da, par); 380f7018c21STomi Valkeinen vga_out8(0x3c0, index, par); 381f7018c21STomi Valkeinen vga_out8 (0x3c0, value, par); 382f7018c21STomi Valkeinen } 383f7018c21STomi Valkeinen 384f7018c21STomi Valkeinen static inline void VGAwMISC(u8 value, struct savagefb_par *par) 385f7018c21STomi Valkeinen { 386f7018c21STomi Valkeinen vga_out8(0x3c2, value, par); 387f7018c21STomi Valkeinen } 388f7018c21STomi Valkeinen 389f7018c21STomi Valkeinen #ifndef CONFIG_FB_SAVAGE_ACCEL 390f7018c21STomi Valkeinen #define savagefb_set_clip(x) 391f7018c21STomi Valkeinen #endif 392f7018c21STomi Valkeinen 393f7018c21STomi Valkeinen static inline void VerticalRetraceWait(struct savagefb_par *par) 394f7018c21STomi Valkeinen { 395f7018c21STomi Valkeinen vga_out8(0x3d4, 0x17, par); 396f7018c21STomi Valkeinen if (vga_in8(0x3d5, par) & 0x80) { 397f7018c21STomi Valkeinen while ((vga_in8(0x3da, par) & 0x08) == 0x08); 398f7018c21STomi Valkeinen while ((vga_in8(0x3da, par) & 0x08) == 0x00); 399f7018c21STomi Valkeinen } 400f7018c21STomi Valkeinen } 401f7018c21STomi Valkeinen 402f7018c21STomi Valkeinen extern int savagefb_probe_i2c_connector(struct fb_info *info, 403f7018c21STomi Valkeinen u8 **out_edid); 404f7018c21STomi Valkeinen extern void savagefb_create_i2c_busses(struct fb_info *info); 405f7018c21STomi Valkeinen extern void savagefb_delete_i2c_busses(struct fb_info *info); 406f7018c21STomi Valkeinen extern int savagefb_sync(struct fb_info *info); 407f7018c21STomi Valkeinen extern void savagefb_copyarea(struct fb_info *info, 408f7018c21STomi Valkeinen const struct fb_copyarea *region); 409f7018c21STomi Valkeinen extern void savagefb_fillrect(struct fb_info *info, 410f7018c21STomi Valkeinen const struct fb_fillrect *rect); 411f7018c21STomi Valkeinen extern void savagefb_imageblit(struct fb_info *info, 412f7018c21STomi Valkeinen const struct fb_image *image); 413f7018c21STomi Valkeinen 414f7018c21STomi Valkeinen 415f7018c21STomi Valkeinen #endif /* __SAVAGEFB_H__ */ 416