162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * linux/drivers/video/savagefb.h -- S3 Savage Framebuffer Driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2001 Denis Oliver Kropp <dok@convergence.de> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General 762306a36Sopenharmony_ci * Public License. See the file COPYING in the main directory of this 862306a36Sopenharmony_ci * archive for more details. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef __SAVAGEFB_H__ 1362306a36Sopenharmony_ci#define __SAVAGEFB_H__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/i2c.h> 1662306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1762306a36Sopenharmony_ci#include <linux/mutex.h> 1862306a36Sopenharmony_ci#include <video/vga.h> 1962306a36Sopenharmony_ci#include "../edid.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#ifdef SAVAGEFB_DEBUG 2262306a36Sopenharmony_ci# define DBG(x) printk (KERN_DEBUG "savagefb: %s\n", (x)); 2362306a36Sopenharmony_ci#else 2462306a36Sopenharmony_ci# define DBG(x) no_printk(x) 2562306a36Sopenharmony_ci# define SavagePrintRegs(...) 2662306a36Sopenharmony_ci#endif 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE4 0x8a22 3062306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE3D 0x8a20 3162306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE3D_MV 0x8a21 3262306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE2000 0x9102 3362306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE_MX_MV 0x8c10 3462306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE_MX 0x8c11 3562306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE_IX_MV 0x8c12 3662306a36Sopenharmony_ci#define PCI_CHIP_SAVAGE_IX 0x8c13 3762306a36Sopenharmony_ci#define PCI_CHIP_PROSAVAGE_PM 0x8a25 3862306a36Sopenharmony_ci#define PCI_CHIP_PROSAVAGE_KM 0x8a26 3962306a36Sopenharmony_ci#define PCI_CHIP_S3TWISTER_P 0x8d01 4062306a36Sopenharmony_ci#define PCI_CHIP_S3TWISTER_K 0x8d02 4162306a36Sopenharmony_ci#define PCI_CHIP_PROSAVAGE_DDR 0x8d03 4262306a36Sopenharmony_ci#define PCI_CHIP_PROSAVAGE_DDRK 0x8d04 4362306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_MX128 0x8c22 4462306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_MX64 0x8c24 4562306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_MX64C 0x8c26 4662306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IX128SDR 0x8c2a 4762306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IX128DDR 0x8c2b 4862306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IX64SDR 0x8c2c 4962306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IX64DDR 0x8c2d 5062306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IXCSDR 0x8c2e 5162306a36Sopenharmony_ci#define PCI_CHIP_SUPSAV_IXCDDR 0x8c2f 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000)) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define S3_SAVAGE4_SERIES(chip) ((chip>=S3_SAVAGE4) && (chip<=S3_PROSAVAGEDDR)) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define S3_MOBILE_TWISTER_SERIES(chip) ((chip==S3_TWISTER) || (chip==S3_PROSAVAGEDDR)) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* Chip tags. These are used to group the adapters into 6562306a36Sopenharmony_ci * related families. 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_citypedef enum { 6962306a36Sopenharmony_ci S3_UNKNOWN = 0, 7062306a36Sopenharmony_ci S3_SAVAGE3D, 7162306a36Sopenharmony_ci S3_SAVAGE_MX, 7262306a36Sopenharmony_ci S3_SAVAGE4, 7362306a36Sopenharmony_ci S3_PROSAVAGE, 7462306a36Sopenharmony_ci S3_TWISTER, 7562306a36Sopenharmony_ci S3_PROSAVAGEDDR, 7662306a36Sopenharmony_ci S3_SUPERSAVAGE, 7762306a36Sopenharmony_ci S3_SAVAGE2000, 7862306a36Sopenharmony_ci S3_LAST 7962306a36Sopenharmony_ci} savage_chipset; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define BIOS_BSIZE 1024 8262306a36Sopenharmony_ci#define BIOS_BASE 0xc0000 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#define SAVAGE_NEWMMIO_REGBASE_S3 0x1000000 /* 16MB */ 8562306a36Sopenharmony_ci#define SAVAGE_NEWMMIO_REGBASE_S4 0x0000000 8662306a36Sopenharmony_ci#define SAVAGE_NEWMMIO_REGSIZE 0x0080000 /* 512kb */ 8762306a36Sopenharmony_ci#define SAVAGE_NEWMMIO_VGABASE 0x8000 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define BASE_FREQ 14318 9062306a36Sopenharmony_ci#define HALF_BASE_FREQ 7159 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define FIFO_CONTROL_REG 0x8200 9362306a36Sopenharmony_ci#define MIU_CONTROL_REG 0x8204 9462306a36Sopenharmony_ci#define STREAMS_TIMEOUT_REG 0x8208 9562306a36Sopenharmony_ci#define MISC_TIMEOUT_REG 0x820c 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define MONO_PAT_0 0xa4e8 9862306a36Sopenharmony_ci#define MONO_PAT_1 0xa4ec 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define MAXFIFO 0x7f00 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define BCI_CMD_NOP 0x40000000 10362306a36Sopenharmony_ci#define BCI_CMD_SETREG 0x96000000 10462306a36Sopenharmony_ci#define BCI_CMD_RECT 0x48000000 10562306a36Sopenharmony_ci#define BCI_CMD_RECT_XP 0x01000000 10662306a36Sopenharmony_ci#define BCI_CMD_RECT_YP 0x02000000 10762306a36Sopenharmony_ci#define BCI_CMD_SEND_COLOR 0x00008000 10862306a36Sopenharmony_ci#define BCI_CMD_DEST_GBD 0x00000000 10962306a36Sopenharmony_ci#define BCI_CMD_SRC_GBD 0x00000020 11062306a36Sopenharmony_ci#define BCI_CMD_SRC_SOLID 0x00000000 11162306a36Sopenharmony_ci#define BCI_CMD_SRC_MONO 0x00000060 11262306a36Sopenharmony_ci#define BCI_CMD_CLIP_NEW 0x00006000 11362306a36Sopenharmony_ci#define BCI_CMD_CLIP_LR 0x00004000 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define BCI_CLIP_LR(l, r) ((((r) << 16) | (l)) & 0x0FFF0FFF) 11662306a36Sopenharmony_ci#define BCI_CLIP_TL(t, l) ((((t) << 16) | (l)) & 0x0FFF0FFF) 11762306a36Sopenharmony_ci#define BCI_CLIP_BR(b, r) ((((b) << 16) | (r)) & 0x0FFF0FFF) 11862306a36Sopenharmony_ci#define BCI_W_H(w, h) (((h) << 16) | ((w) & 0xFFF)) 11962306a36Sopenharmony_ci#define BCI_X_Y(x, y) (((y) << 16) | ((x) & 0xFFF)) 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define BCI_GBD1 0xE0 12262306a36Sopenharmony_ci#define BCI_GBD2 0xE1 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define BCI_BUFFER_OFFSET 0x10000 12562306a36Sopenharmony_ci#define BCI_SIZE 0x4000 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#define BCI_SEND(dw) writel(dw, par->bci_base + par->bci_ptr++) 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#define BCI_CMD_GET_ROP(cmd) (((cmd) >> 16) & 0xFF) 13062306a36Sopenharmony_ci#define BCI_CMD_SET_ROP(cmd, rop) ((cmd) |= ((rop & 0xFF) << 16)) 13162306a36Sopenharmony_ci#define BCI_CMD_SEND_COLOR 0x00008000 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define DISP_CRT 1 13462306a36Sopenharmony_ci#define DISP_LCD 2 13562306a36Sopenharmony_ci#define DISP_DFP 3 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct xtimings { 13862306a36Sopenharmony_ci unsigned int Clock; 13962306a36Sopenharmony_ci unsigned int HDisplay; 14062306a36Sopenharmony_ci unsigned int HSyncStart; 14162306a36Sopenharmony_ci unsigned int HSyncEnd; 14262306a36Sopenharmony_ci unsigned int HTotal; 14362306a36Sopenharmony_ci unsigned int HAdjusted; 14462306a36Sopenharmony_ci unsigned int VDisplay; 14562306a36Sopenharmony_ci unsigned int VSyncStart; 14662306a36Sopenharmony_ci unsigned int VSyncEnd; 14762306a36Sopenharmony_ci unsigned int VTotal; 14862306a36Sopenharmony_ci unsigned int sync; 14962306a36Sopenharmony_ci int dblscan; 15062306a36Sopenharmony_ci int interlaced; 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistruct savage_reg { 15462306a36Sopenharmony_ci unsigned char MiscOutReg; /* Misc */ 15562306a36Sopenharmony_ci unsigned char CRTC[25]; /* Crtc Controller */ 15662306a36Sopenharmony_ci unsigned char Sequencer[5]; /* Video Sequencer */ 15762306a36Sopenharmony_ci unsigned char Graphics[9]; /* Video Graphics */ 15862306a36Sopenharmony_ci unsigned char Attribute[21]; /* Video Attribute */ 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci unsigned int mode, refresh; 16162306a36Sopenharmony_ci unsigned char SR08, SR0E, SR0F; 16262306a36Sopenharmony_ci unsigned char SR10, SR11, SR12, SR13, SR15, SR18, SR29, SR30; 16362306a36Sopenharmony_ci unsigned char SR54[8]; 16462306a36Sopenharmony_ci unsigned char Clock; 16562306a36Sopenharmony_ci unsigned char CR31, CR32, CR33, CR34, CR36, CR3A, CR3B, CR3C; 16662306a36Sopenharmony_ci unsigned char CR40, CR41, CR42, CR43, CR45; 16762306a36Sopenharmony_ci unsigned char CR50, CR51, CR53, CR55, CR58, CR5B, CR5D, CR5E; 16862306a36Sopenharmony_ci unsigned char CR60, CR63, CR65, CR66, CR67, CR68, CR69, CR6D, CR6F; 16962306a36Sopenharmony_ci unsigned char CR86, CR88; 17062306a36Sopenharmony_ci unsigned char CR90, CR91, CRB0; 17162306a36Sopenharmony_ci unsigned int STREAMS[22]; /* yuck, streams regs */ 17262306a36Sopenharmony_ci unsigned int MMPR0, MMPR1, MMPR2, MMPR3; 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci/* --------------------------------------------------------------------- */ 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#define NR_PALETTE 256 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct savagefb_par; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistruct savagefb_i2c_chan { 18262306a36Sopenharmony_ci struct savagefb_par *par; 18362306a36Sopenharmony_ci struct i2c_adapter adapter; 18462306a36Sopenharmony_ci struct i2c_algo_bit_data algo; 18562306a36Sopenharmony_ci volatile u8 __iomem *ioaddr; 18662306a36Sopenharmony_ci u32 reg; 18762306a36Sopenharmony_ci}; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct savagefb_par { 19062306a36Sopenharmony_ci struct pci_dev *pcidev; 19162306a36Sopenharmony_ci savage_chipset chip; 19262306a36Sopenharmony_ci struct savagefb_i2c_chan chan; 19362306a36Sopenharmony_ci struct savage_reg state; 19462306a36Sopenharmony_ci struct savage_reg save; 19562306a36Sopenharmony_ci struct savage_reg initial; 19662306a36Sopenharmony_ci struct vgastate vgastate; 19762306a36Sopenharmony_ci struct mutex open_lock; 19862306a36Sopenharmony_ci u32 pseudo_palette[16]; 19962306a36Sopenharmony_ci u32 open_count; 20062306a36Sopenharmony_ci int paletteEnabled; 20162306a36Sopenharmony_ci int pm_state; 20262306a36Sopenharmony_ci int display_type; 20362306a36Sopenharmony_ci int dvi; 20462306a36Sopenharmony_ci int crtonly; 20562306a36Sopenharmony_ci int dacSpeedBpp; 20662306a36Sopenharmony_ci int maxClock; 20762306a36Sopenharmony_ci int minClock; 20862306a36Sopenharmony_ci int numClocks; 20962306a36Sopenharmony_ci int clock[4]; 21062306a36Sopenharmony_ci int MCLK, REFCLK, LCDclk; 21162306a36Sopenharmony_ci struct { 21262306a36Sopenharmony_ci void __iomem *vbase; 21362306a36Sopenharmony_ci u32 pbase; 21462306a36Sopenharmony_ci u32 len; 21562306a36Sopenharmony_ci int wc_cookie; 21662306a36Sopenharmony_ci } video; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci struct { 21962306a36Sopenharmony_ci void __iomem *vbase; 22062306a36Sopenharmony_ci u32 pbase; 22162306a36Sopenharmony_ci u32 len; 22262306a36Sopenharmony_ci } mmio; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci volatile u32 __iomem *bci_base; 22562306a36Sopenharmony_ci unsigned int bci_ptr; 22662306a36Sopenharmony_ci u32 cob_offset; 22762306a36Sopenharmony_ci u32 cob_size; 22862306a36Sopenharmony_ci int cob_index; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci void (*SavageWaitIdle) (struct savagefb_par *par); 23162306a36Sopenharmony_ci void (*SavageWaitFifo) (struct savagefb_par *par, int space); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci int HorizScaleFactor; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci /* Panels size */ 23662306a36Sopenharmony_ci int SavagePanelWidth; 23762306a36Sopenharmony_ci int SavagePanelHeight; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci struct { 24062306a36Sopenharmony_ci u16 red, green, blue, transp; 24162306a36Sopenharmony_ci } palette[NR_PALETTE]; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci int depth; 24462306a36Sopenharmony_ci int vwidth; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci#define BCI_BD_BW_DISABLE 0x10000000 24862306a36Sopenharmony_ci#define BCI_BD_SET_BPP(bd, bpp) ((bd) |= (((bpp) & 0xFF) << 16)) 24962306a36Sopenharmony_ci#define BCI_BD_SET_STRIDE(bd, st) ((bd) |= ((st) & 0xFFFF)) 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci/* IO functions */ 25362306a36Sopenharmony_cistatic inline u8 savage_in8(u32 addr, struct savagefb_par *par) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci return readb(par->mmio.vbase + addr); 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic inline u16 savage_in16(u32 addr, struct savagefb_par *par) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci return readw(par->mmio.vbase + addr); 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistatic inline u32 savage_in32(u32 addr, struct savagefb_par *par) 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci return readl(par->mmio.vbase + addr); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic inline void savage_out8(u32 addr, u8 val, struct savagefb_par *par) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci writeb(val, par->mmio.vbase + addr); 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistatic inline void savage_out16(u32 addr, u16 val, struct savagefb_par *par) 27462306a36Sopenharmony_ci{ 27562306a36Sopenharmony_ci writew(val, par->mmio.vbase + addr); 27662306a36Sopenharmony_ci} 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic inline void savage_out32(u32 addr, u32 val, struct savagefb_par *par) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci writel(val, par->mmio.vbase + addr); 28162306a36Sopenharmony_ci} 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic inline u8 vga_in8(int addr, struct savagefb_par *par) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci return savage_in8(0x8000 + addr, par); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic inline u16 vga_in16(int addr, struct savagefb_par *par) 28962306a36Sopenharmony_ci{ 29062306a36Sopenharmony_ci return savage_in16(0x8000 + addr, par); 29162306a36Sopenharmony_ci} 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic inline u8 vga_in32(int addr, struct savagefb_par *par) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci return savage_in32(0x8000 + addr, par); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic inline void vga_out8(int addr, u8 val, struct savagefb_par *par) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci savage_out8(0x8000 + addr, val, par); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic inline void vga_out16(int addr, u16 val, struct savagefb_par *par) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci savage_out16(0x8000 + addr, val, par); 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic inline void vga_out32(int addr, u32 val, struct savagefb_par *par) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci savage_out32(0x8000 + addr, val, par); 31162306a36Sopenharmony_ci} 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistatic inline u8 VGArCR (u8 index, struct savagefb_par *par) 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci vga_out8(0x3d4, index, par); 31662306a36Sopenharmony_ci return vga_in8(0x3d5, par); 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic inline u8 VGArGR (u8 index, struct savagefb_par *par) 32062306a36Sopenharmony_ci{ 32162306a36Sopenharmony_ci vga_out8(0x3ce, index, par); 32262306a36Sopenharmony_ci return vga_in8(0x3cf, par); 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic inline u8 VGArSEQ (u8 index, struct savagefb_par *par) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci vga_out8(0x3c4, index, par); 32862306a36Sopenharmony_ci return vga_in8(0x3c5, par); 32962306a36Sopenharmony_ci} 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_cistatic inline void VGAwCR(u8 index, u8 val, struct savagefb_par *par) 33262306a36Sopenharmony_ci{ 33362306a36Sopenharmony_ci vga_out8(0x3d4, index, par); 33462306a36Sopenharmony_ci vga_out8(0x3d5, val, par); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline void VGAwGR(u8 index, u8 val, struct savagefb_par *par) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci vga_out8(0x3ce, index, par); 34062306a36Sopenharmony_ci vga_out8(0x3cf, val, par); 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic inline void VGAwSEQ(u8 index, u8 val, struct savagefb_par *par) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci vga_out8(0x3c4, index, par); 34662306a36Sopenharmony_ci vga_out8 (0x3c5, val, par); 34762306a36Sopenharmony_ci} 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistatic inline void VGAenablePalette(struct savagefb_par *par) 35062306a36Sopenharmony_ci{ 35162306a36Sopenharmony_ci vga_in8(0x3da, par); 35262306a36Sopenharmony_ci vga_out8(0x3c0, 0x00, par); 35362306a36Sopenharmony_ci par->paletteEnabled = 1; 35462306a36Sopenharmony_ci} 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistatic inline void VGAdisablePalette(struct savagefb_par *par) 35762306a36Sopenharmony_ci{ 35862306a36Sopenharmony_ci vga_in8(0x3da, par); 35962306a36Sopenharmony_ci vga_out8(0x3c0, 0x20, par); 36062306a36Sopenharmony_ci par->paletteEnabled = 0; 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic inline void VGAwATTR(u8 index, u8 value, struct savagefb_par *par) 36462306a36Sopenharmony_ci{ 36562306a36Sopenharmony_ci if (par->paletteEnabled) 36662306a36Sopenharmony_ci index &= ~0x20; 36762306a36Sopenharmony_ci else 36862306a36Sopenharmony_ci index |= 0x20; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci vga_in8(0x3da, par); 37162306a36Sopenharmony_ci vga_out8(0x3c0, index, par); 37262306a36Sopenharmony_ci vga_out8 (0x3c0, value, par); 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic inline void VGAwMISC(u8 value, struct savagefb_par *par) 37662306a36Sopenharmony_ci{ 37762306a36Sopenharmony_ci vga_out8(0x3c2, value, par); 37862306a36Sopenharmony_ci} 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci#ifndef CONFIG_FB_SAVAGE_ACCEL 38162306a36Sopenharmony_ci#define savagefb_set_clip(x) 38262306a36Sopenharmony_ci#endif 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_cistatic inline void VerticalRetraceWait(struct savagefb_par *par) 38562306a36Sopenharmony_ci{ 38662306a36Sopenharmony_ci vga_out8(0x3d4, 0x17, par); 38762306a36Sopenharmony_ci if (vga_in8(0x3d5, par) & 0x80) { 38862306a36Sopenharmony_ci while ((vga_in8(0x3da, par) & 0x08) == 0x08); 38962306a36Sopenharmony_ci while ((vga_in8(0x3da, par) & 0x08) == 0x00); 39062306a36Sopenharmony_ci } 39162306a36Sopenharmony_ci} 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ciextern int savagefb_probe_i2c_connector(struct fb_info *info, 39462306a36Sopenharmony_ci u8 **out_edid); 39562306a36Sopenharmony_ciextern void savagefb_create_i2c_busses(struct fb_info *info); 39662306a36Sopenharmony_ciextern void savagefb_delete_i2c_busses(struct fb_info *info); 39762306a36Sopenharmony_ciextern int savagefb_sync(struct fb_info *info); 39862306a36Sopenharmony_ciextern void savagefb_copyarea(struct fb_info *info, 39962306a36Sopenharmony_ci const struct fb_copyarea *region); 40062306a36Sopenharmony_ciextern void savagefb_fillrect(struct fb_info *info, 40162306a36Sopenharmony_ci const struct fb_fillrect *rect); 40262306a36Sopenharmony_ciextern void savagefb_imageblit(struct fb_info *info, 40362306a36Sopenharmony_ci const struct fb_image *image); 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci#endif /* __SAVAGEFB_H__ */ 407