cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cirrusfb.c (76900B)


      1/*
      2 * drivers/video/cirrusfb.c - driver for Cirrus Logic chipsets
      3 *
      4 * Copyright 1999-2001 Jeff Garzik <jgarzik@pobox.com>
      5 *
      6 * Contributors (thanks, all!)
      7 *
      8 *	David Eger:
      9 *	Overhaul for Linux 2.6
     10 *
     11 *      Jeff Rugen:
     12 *      Major contributions;  Motorola PowerStack (PPC and PCI) support,
     13 *      GD54xx, 1280x1024 mode support, change MCLK based on VCLK.
     14 *
     15 *	Geert Uytterhoeven:
     16 *	Excellent code review.
     17 *
     18 *	Lars Hecking:
     19 *	Amiga updates and testing.
     20 *
     21 * Original cirrusfb author:  Frank Neumann
     22 *
     23 * Based on retz3fb.c and cirrusfb.c:
     24 *      Copyright (C) 1997 Jes Sorensen
     25 *      Copyright (C) 1996 Frank Neumann
     26 *
     27 ***************************************************************
     28 *
     29 * Format this code with GNU indent '-kr -i8 -pcs' options.
     30 *
     31 * This file is subject to the terms and conditions of the GNU General Public
     32 * License.  See the file COPYING in the main directory of this archive
     33 * for more details.
     34 *
     35 */
     36
     37#include <linux/module.h>
     38#include <linux/kernel.h>
     39#include <linux/errno.h>
     40#include <linux/string.h>
     41#include <linux/mm.h>
     42#include <linux/delay.h>
     43#include <linux/fb.h>
     44#include <linux/init.h>
     45
     46#ifdef CONFIG_ZORRO
     47#include <linux/zorro.h>
     48#endif
     49#ifdef CONFIG_PCI
     50#include <linux/pci.h>
     51#endif
     52#ifdef CONFIG_AMIGA
     53#include <asm/amigahw.h>
     54#endif
     55
     56#include <video/vga.h>
     57#include <video/cirrus.h>
     58
     59/*****************************************************************
     60 *
     61 * debugging and utility macros
     62 *
     63 */
     64
     65/* disable runtime assertions? */
     66/* #define CIRRUSFB_NDEBUG */
     67
     68/* debugging assertions */
     69#ifndef CIRRUSFB_NDEBUG
     70#define assert(expr) \
     71	if (!(expr)) { \
     72		printk("Assertion failed! %s,%s,%s,line=%d\n", \
     73		#expr, __FILE__, __func__, __LINE__); \
     74	}
     75#else
     76#define assert(expr)
     77#endif
     78
     79#define MB_ (1024 * 1024)
     80
     81/*****************************************************************
     82 *
     83 * chipset information
     84 *
     85 */
     86
     87/* board types */
     88enum cirrus_board {
     89	BT_NONE = 0,
     90	BT_SD64,	/* GD5434 */
     91	BT_PICCOLO,	/* GD5426 */
     92	BT_PICASSO,	/* GD5426 or GD5428 */
     93	BT_SPECTRUM,	/* GD5426 or GD5428 */
     94	BT_PICASSO4,	/* GD5446 */
     95	BT_ALPINE,	/* GD543x/4x */
     96	BT_GD5480,
     97	BT_LAGUNA,	/* GD5462/64 */
     98	BT_LAGUNAB,	/* GD5465 */
     99};
    100
    101/*
    102 * per-board-type information, used for enumerating and abstracting
    103 * chip-specific information
    104 * NOTE: MUST be in the same order as enum cirrus_board in order to
    105 * use direct indexing on this array
    106 * NOTE: '__initdata' cannot be used as some of this info
    107 * is required at runtime.  Maybe separate into an init-only and
    108 * a run-time table?
    109 */
    110static const struct cirrusfb_board_info_rec {
    111	char *name;		/* ASCII name of chipset */
    112	long maxclock[5];		/* maximum video clock */
    113	/* for  1/4bpp, 8bpp 15/16bpp, 24bpp, 32bpp - numbers from xorg code */
    114	bool init_sr07 : 1; /* init SR07 during init_vgachip() */
    115	bool init_sr1f : 1; /* write SR1F during init_vgachip() */
    116	/* construct bit 19 of screen start address */
    117	bool scrn_start_bit19 : 1;
    118
    119	/* initial SR07 value, then for each mode */
    120	unsigned char sr07;
    121	unsigned char sr07_1bpp;
    122	unsigned char sr07_1bpp_mux;
    123	unsigned char sr07_8bpp;
    124	unsigned char sr07_8bpp_mux;
    125
    126	unsigned char sr1f;	/* SR1F VGA initial register value */
    127} cirrusfb_board_info[] = {
    128	[BT_SD64] = {
    129		.name			= "CL SD64",
    130		.maxclock		= {
    131			/* guess */
    132			/* the SD64/P4 have a higher max. videoclock */
    133			135100, 135100, 85500, 85500, 0
    134		},
    135		.init_sr07		= true,
    136		.init_sr1f		= true,
    137		.scrn_start_bit19	= true,
    138		.sr07			= 0xF0,
    139		.sr07_1bpp		= 0xF0,
    140		.sr07_1bpp_mux		= 0xF6,
    141		.sr07_8bpp		= 0xF1,
    142		.sr07_8bpp_mux		= 0xF7,
    143		.sr1f			= 0x1E
    144	},
    145	[BT_PICCOLO] = {
    146		.name			= "CL Piccolo",
    147		.maxclock		= {
    148			/* guess */
    149			90000, 90000, 90000, 90000, 90000
    150		},
    151		.init_sr07		= true,
    152		.init_sr1f		= true,
    153		.scrn_start_bit19	= false,
    154		.sr07			= 0x80,
    155		.sr07_1bpp		= 0x80,
    156		.sr07_8bpp		= 0x81,
    157		.sr1f			= 0x22
    158	},
    159	[BT_PICASSO] = {
    160		.name			= "CL Picasso",
    161		.maxclock		= {
    162			/* guess */
    163			90000, 90000, 90000, 90000, 90000
    164		},
    165		.init_sr07		= true,
    166		.init_sr1f		= true,
    167		.scrn_start_bit19	= false,
    168		.sr07			= 0x20,
    169		.sr07_1bpp		= 0x20,
    170		.sr07_8bpp		= 0x21,
    171		.sr1f			= 0x22
    172	},
    173	[BT_SPECTRUM] = {
    174		.name			= "CL Spectrum",
    175		.maxclock		= {
    176			/* guess */
    177			90000, 90000, 90000, 90000, 90000
    178		},
    179		.init_sr07		= true,
    180		.init_sr1f		= true,
    181		.scrn_start_bit19	= false,
    182		.sr07			= 0x80,
    183		.sr07_1bpp		= 0x80,
    184		.sr07_8bpp		= 0x81,
    185		.sr1f			= 0x22
    186	},
    187	[BT_PICASSO4] = {
    188		.name			= "CL Picasso4",
    189		.maxclock		= {
    190			135100, 135100, 85500, 85500, 0
    191		},
    192		.init_sr07		= true,
    193		.init_sr1f		= false,
    194		.scrn_start_bit19	= true,
    195		.sr07			= 0xA0,
    196		.sr07_1bpp		= 0xA0,
    197		.sr07_1bpp_mux		= 0xA6,
    198		.sr07_8bpp		= 0xA1,
    199		.sr07_8bpp_mux		= 0xA7,
    200		.sr1f			= 0
    201	},
    202	[BT_ALPINE] = {
    203		.name			= "CL Alpine",
    204		.maxclock		= {
    205			/* for the GD5430.  GD5446 can do more... */
    206			85500, 85500, 50000, 28500, 0
    207		},
    208		.init_sr07		= true,
    209		.init_sr1f		= true,
    210		.scrn_start_bit19	= true,
    211		.sr07			= 0xA0,
    212		.sr07_1bpp		= 0xA0,
    213		.sr07_1bpp_mux		= 0xA6,
    214		.sr07_8bpp		= 0xA1,
    215		.sr07_8bpp_mux		= 0xA7,
    216		.sr1f			= 0x1C
    217	},
    218	[BT_GD5480] = {
    219		.name			= "CL GD5480",
    220		.maxclock		= {
    221			135100, 200000, 200000, 135100, 135100
    222		},
    223		.init_sr07		= true,
    224		.init_sr1f		= true,
    225		.scrn_start_bit19	= true,
    226		.sr07			= 0x10,
    227		.sr07_1bpp		= 0x11,
    228		.sr07_8bpp		= 0x11,
    229		.sr1f			= 0x1C
    230	},
    231	[BT_LAGUNA] = {
    232		.name			= "CL Laguna",
    233		.maxclock		= {
    234			/* taken from X11 code */
    235			170000, 170000, 170000, 170000, 135100,
    236		},
    237		.init_sr07		= false,
    238		.init_sr1f		= false,
    239		.scrn_start_bit19	= true,
    240	},
    241	[BT_LAGUNAB] = {
    242		.name			= "CL Laguna AGP",
    243		.maxclock		= {
    244			/* taken from X11 code */
    245			170000, 250000, 170000, 170000, 135100,
    246		},
    247		.init_sr07		= false,
    248		.init_sr1f		= false,
    249		.scrn_start_bit19	= true,
    250	}
    251};
    252
    253#ifdef CONFIG_PCI
    254#define CHIP(id, btype) \
    255	{ PCI_VENDOR_ID_CIRRUS, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (btype) }
    256
    257static struct pci_device_id cirrusfb_pci_table[] = {
    258	CHIP(PCI_DEVICE_ID_CIRRUS_5436, BT_ALPINE),
    259	CHIP(PCI_DEVICE_ID_CIRRUS_5434_8, BT_SD64),
    260	CHIP(PCI_DEVICE_ID_CIRRUS_5434_4, BT_SD64),
    261	CHIP(PCI_DEVICE_ID_CIRRUS_5430, BT_ALPINE), /* GD-5440 is same id */
    262	CHIP(PCI_DEVICE_ID_CIRRUS_7543, BT_ALPINE),
    263	CHIP(PCI_DEVICE_ID_CIRRUS_7548, BT_ALPINE),
    264	CHIP(PCI_DEVICE_ID_CIRRUS_5480, BT_GD5480), /* MacPicasso likely */
    265	CHIP(PCI_DEVICE_ID_CIRRUS_5446, BT_PICASSO4), /* Picasso 4 is 5446 */
    266	CHIP(PCI_DEVICE_ID_CIRRUS_5462, BT_LAGUNA), /* CL Laguna */
    267	CHIP(PCI_DEVICE_ID_CIRRUS_5464, BT_LAGUNA), /* CL Laguna 3D */
    268	CHIP(PCI_DEVICE_ID_CIRRUS_5465, BT_LAGUNAB), /* CL Laguna 3DA*/
    269	{ 0, }
    270};
    271MODULE_DEVICE_TABLE(pci, cirrusfb_pci_table);
    272#undef CHIP
    273#endif /* CONFIG_PCI */
    274
    275#ifdef CONFIG_ZORRO
    276struct zorrocl {
    277	enum cirrus_board type;	/* Board type */
    278	u32 regoffset;		/* Offset of registers in first Zorro device */
    279	u32 ramsize;		/* Size of video RAM in first Zorro device */
    280				/* If zero, use autoprobe on RAM device */
    281	u32 ramoffset;		/* Offset of video RAM in first Zorro device */
    282	zorro_id ramid;		/* Zorro ID of RAM device */
    283	zorro_id ramid2;	/* Zorro ID of optional second RAM device */
    284};
    285
    286static const struct zorrocl zcl_sd64 = {
    287	.type		= BT_SD64,
    288	.ramid		= ZORRO_PROD_HELFRICH_SD64_RAM,
    289};
    290
    291static const struct zorrocl zcl_piccolo = {
    292	.type		= BT_PICCOLO,
    293	.ramid		= ZORRO_PROD_HELFRICH_PICCOLO_RAM,
    294};
    295
    296static const struct zorrocl zcl_picasso = {
    297	.type		= BT_PICASSO,
    298	.ramid		= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM,
    299};
    300
    301static const struct zorrocl zcl_spectrum = {
    302	.type		= BT_SPECTRUM,
    303	.ramid		= ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_RAM,
    304};
    305
    306static const struct zorrocl zcl_picasso4_z3 = {
    307	.type		= BT_PICASSO4,
    308	.regoffset	= 0x00600000,
    309	.ramsize	= 4 * MB_,
    310	.ramoffset	= 0x01000000,	/* 0x02000000 for 64 MiB boards */
    311};
    312
    313static const struct zorrocl zcl_picasso4_z2 = {
    314	.type		= BT_PICASSO4,
    315	.regoffset	= 0x10000,
    316	.ramid		= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM1,
    317	.ramid2		= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM2,
    318};
    319
    320
    321static const struct zorro_device_id cirrusfb_zorro_table[] = {
    322	{
    323		.id		= ZORRO_PROD_HELFRICH_SD64_REG,
    324		.driver_data	= (unsigned long)&zcl_sd64,
    325	}, {
    326		.id		= ZORRO_PROD_HELFRICH_PICCOLO_REG,
    327		.driver_data	= (unsigned long)&zcl_piccolo,
    328	}, {
    329		.id	= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG,
    330		.driver_data	= (unsigned long)&zcl_picasso,
    331	}, {
    332		.id		= ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_REG,
    333		.driver_data	= (unsigned long)&zcl_spectrum,
    334	}, {
    335		.id		= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z3,
    336		.driver_data	= (unsigned long)&zcl_picasso4_z3,
    337	}, {
    338		.id		= ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_REG,
    339		.driver_data	= (unsigned long)&zcl_picasso4_z2,
    340	},
    341	{ 0 }
    342};
    343MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table);
    344#endif /* CONFIG_ZORRO */
    345
    346#ifdef CIRRUSFB_DEBUG
    347enum cirrusfb_dbg_reg_class {
    348	CRT,
    349	SEQ
    350};
    351#endif		/* CIRRUSFB_DEBUG */
    352
    353/* info about board */
    354struct cirrusfb_info {
    355	u8 __iomem *regbase;
    356	u8 __iomem *laguna_mmio;
    357	enum cirrus_board btype;
    358	unsigned char SFR;	/* Shadow of special function register */
    359
    360	int multiplexing;
    361	int doubleVCLK;
    362	int blank_mode;
    363	u32 pseudo_palette[16];
    364
    365	void (*unmap)(struct fb_info *info);
    366};
    367
    368static bool noaccel;
    369static char *mode_option = "640x480@60";
    370
    371/****************************************************************************/
    372/**** BEGIN PROTOTYPES ******************************************************/
    373
    374/*--- Interface used by the world ------------------------------------------*/
    375static int cirrusfb_pan_display(struct fb_var_screeninfo *var,
    376				struct fb_info *info);
    377
    378/*--- Internal routines ----------------------------------------------------*/
    379static void init_vgachip(struct fb_info *info);
    380static void switch_monitor(struct cirrusfb_info *cinfo, int on);
    381static void WGen(const struct cirrusfb_info *cinfo,
    382		 int regnum, unsigned char val);
    383static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum);
    384static void AttrOn(const struct cirrusfb_info *cinfo);
    385static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val);
    386static void WSFR(struct cirrusfb_info *cinfo, unsigned char val);
    387static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val);
    388static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum,
    389		  unsigned char red, unsigned char green, unsigned char blue);
    390#if 0
    391static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum,
    392		  unsigned char *red, unsigned char *green,
    393		  unsigned char *blue);
    394#endif
    395static void cirrusfb_WaitBLT(u8 __iomem *regbase);
    396static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel,
    397			    u_short curx, u_short cury,
    398			    u_short destx, u_short desty,
    399			    u_short width, u_short height,
    400			    u_short line_length);
    401static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel,
    402			      u_short x, u_short y,
    403			      u_short width, u_short height,
    404			      u32 fg_color, u32 bg_color,
    405			      u_short line_length, u_char blitmode);
    406
    407static void bestclock(long freq, int *nom, int *den, int *div);
    408
    409#ifdef CIRRUSFB_DEBUG
    410static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase);
    411static void cirrusfb_dbg_print_regs(struct fb_info *info,
    412				    caddr_t regbase,
    413				    enum cirrusfb_dbg_reg_class reg_class, ...);
    414#endif /* CIRRUSFB_DEBUG */
    415
    416/*** END   PROTOTYPES ********************************************************/
    417/*****************************************************************************/
    418/*** BEGIN Interface Used by the World ***************************************/
    419
    420static inline int is_laguna(const struct cirrusfb_info *cinfo)
    421{
    422	return cinfo->btype == BT_LAGUNA || cinfo->btype == BT_LAGUNAB;
    423}
    424
    425static int opencount;
    426
    427/*--- Open /dev/fbx ---------------------------------------------------------*/
    428static int cirrusfb_open(struct fb_info *info, int user)
    429{
    430	if (opencount++ == 0)
    431		switch_monitor(info->par, 1);
    432	return 0;
    433}
    434
    435/*--- Close /dev/fbx --------------------------------------------------------*/
    436static int cirrusfb_release(struct fb_info *info, int user)
    437{
    438	if (--opencount == 0)
    439		switch_monitor(info->par, 0);
    440	return 0;
    441}
    442
    443/**** END   Interface used by the World *************************************/
    444/****************************************************************************/
    445/**** BEGIN Hardware specific Routines **************************************/
    446
    447/* Check if the MCLK is not a better clock source */
    448static int cirrusfb_check_mclk(struct fb_info *info, long freq)
    449{
    450	struct cirrusfb_info *cinfo = info->par;
    451	long mclk = vga_rseq(cinfo->regbase, CL_SEQR1F) & 0x3f;
    452
    453	/* Read MCLK value */
    454	mclk = (14318 * mclk) >> 3;
    455	dev_dbg(info->device, "Read MCLK of %ld kHz\n", mclk);
    456
    457	/* Determine if we should use MCLK instead of VCLK, and if so, what we
    458	 * should divide it by to get VCLK
    459	 */
    460
    461	if (abs(freq - mclk) < 250) {
    462		dev_dbg(info->device, "Using VCLK = MCLK\n");
    463		return 1;
    464	} else if (abs(freq - (mclk / 2)) < 250) {
    465		dev_dbg(info->device, "Using VCLK = MCLK/2\n");
    466		return 2;
    467	}
    468
    469	return 0;
    470}
    471
    472static int cirrusfb_check_pixclock(struct fb_var_screeninfo *var,
    473				   struct fb_info *info)
    474{
    475	long freq;
    476	long maxclock;
    477	struct cirrusfb_info *cinfo = info->par;
    478	unsigned maxclockidx = var->bits_per_pixel >> 3;
    479
    480	/* convert from ps to kHz */
    481	freq = PICOS2KHZ(var->pixclock ? : 1);
    482
    483	maxclock = cirrusfb_board_info[cinfo->btype].maxclock[maxclockidx];
    484	cinfo->multiplexing = 0;
    485
    486	/* If the frequency is greater than we can support, we might be able
    487	 * to use multiplexing for the video mode */
    488	if (freq > maxclock) {
    489		var->pixclock = KHZ2PICOS(maxclock);
    490
    491		while ((freq = PICOS2KHZ(var->pixclock)) > maxclock)
    492			var->pixclock++;
    493	}
    494	dev_dbg(info->device, "desired pixclock: %ld kHz\n", freq);
    495
    496	/*
    497	 * Additional constraint: 8bpp uses DAC clock doubling to allow maximum
    498	 * pixel clock
    499	 */
    500	if (var->bits_per_pixel == 8) {
    501		switch (cinfo->btype) {
    502		case BT_ALPINE:
    503		case BT_SD64:
    504		case BT_PICASSO4:
    505			if (freq > 85500)
    506				cinfo->multiplexing = 1;
    507			break;
    508		case BT_GD5480:
    509			if (freq > 135100)
    510				cinfo->multiplexing = 1;
    511			break;
    512
    513		default:
    514			break;
    515		}
    516	}
    517
    518	/* If we have a 1MB 5434, we need to put ourselves in a mode where
    519	 * the VCLK is double the pixel clock. */
    520	cinfo->doubleVCLK = 0;
    521	if (cinfo->btype == BT_SD64 && info->fix.smem_len <= MB_ &&
    522	    var->bits_per_pixel == 16) {
    523		cinfo->doubleVCLK = 1;
    524	}
    525
    526	return 0;
    527}
    528
    529static int cirrusfb_check_var(struct fb_var_screeninfo *var,
    530			      struct fb_info *info)
    531{
    532	int yres;
    533	/* memory size in pixels */
    534	unsigned int pixels;
    535	struct cirrusfb_info *cinfo = info->par;
    536
    537	switch (var->bits_per_pixel) {
    538	case 1:
    539		var->red.offset = 0;
    540		var->red.length = 1;
    541		var->green = var->red;
    542		var->blue = var->red;
    543		break;
    544
    545	case 8:
    546		var->red.offset = 0;
    547		var->red.length = 8;
    548		var->green = var->red;
    549		var->blue = var->red;
    550		break;
    551
    552	case 16:
    553		var->red.offset = 11;
    554		var->green.offset = 5;
    555		var->blue.offset = 0;
    556		var->red.length = 5;
    557		var->green.length = 6;
    558		var->blue.length = 5;
    559		break;
    560
    561	case 24:
    562		var->red.offset = 16;
    563		var->green.offset = 8;
    564		var->blue.offset = 0;
    565		var->red.length = 8;
    566		var->green.length = 8;
    567		var->blue.length = 8;
    568		break;
    569
    570	default:
    571		dev_dbg(info->device,
    572			"Unsupported bpp size: %d\n", var->bits_per_pixel);
    573		return -EINVAL;
    574	}
    575
    576	pixels = info->screen_size * 8 / var->bits_per_pixel;
    577	if (var->xres_virtual < var->xres)
    578		var->xres_virtual = var->xres;
    579	/* use highest possible virtual resolution */
    580	if (var->yres_virtual == -1) {
    581		var->yres_virtual = pixels / var->xres_virtual;
    582
    583		dev_info(info->device,
    584			 "virtual resolution set to maximum of %dx%d\n",
    585			 var->xres_virtual, var->yres_virtual);
    586	}
    587	if (var->yres_virtual < var->yres)
    588		var->yres_virtual = var->yres;
    589
    590	if (var->xres_virtual * var->yres_virtual > pixels) {
    591		dev_err(info->device, "mode %dx%dx%d rejected... "
    592		      "virtual resolution too high to fit into video memory!\n",
    593			var->xres_virtual, var->yres_virtual,
    594			var->bits_per_pixel);
    595		return -EINVAL;
    596	}
    597
    598	/* truncate xoffset and yoffset to maximum if too high */
    599	if (var->xoffset > var->xres_virtual - var->xres)
    600		var->xoffset = var->xres_virtual - var->xres - 1;
    601	if (var->yoffset > var->yres_virtual - var->yres)
    602		var->yoffset = var->yres_virtual - var->yres - 1;
    603
    604	var->red.msb_right =
    605	    var->green.msb_right =
    606	    var->blue.msb_right =
    607	    var->transp.offset =
    608	    var->transp.length =
    609	    var->transp.msb_right = 0;
    610
    611	yres = var->yres;
    612	if (var->vmode & FB_VMODE_DOUBLE)
    613		yres *= 2;
    614	else if (var->vmode & FB_VMODE_INTERLACED)
    615		yres = (yres + 1) / 2;
    616
    617	if (yres >= 1280) {
    618		dev_err(info->device, "ERROR: VerticalTotal >= 1280; "
    619			"special treatment required! (TODO)\n");
    620		return -EINVAL;
    621	}
    622
    623	if (cirrusfb_check_pixclock(var, info))
    624		return -EINVAL;
    625
    626	if (!is_laguna(cinfo))
    627		var->accel_flags = FB_ACCELF_TEXT;
    628
    629	return 0;
    630}
    631
    632static void cirrusfb_set_mclk_as_source(const struct fb_info *info, int div)
    633{
    634	struct cirrusfb_info *cinfo = info->par;
    635	unsigned char old1f, old1e;
    636
    637	assert(cinfo != NULL);
    638	old1f = vga_rseq(cinfo->regbase, CL_SEQR1F) & ~0x40;
    639
    640	if (div) {
    641		dev_dbg(info->device, "Set %s as pixclock source.\n",
    642			(div == 2) ? "MCLK/2" : "MCLK");
    643		old1f |= 0x40;
    644		old1e = vga_rseq(cinfo->regbase, CL_SEQR1E) & ~0x1;
    645		if (div == 2)
    646			old1e |= 1;
    647
    648		vga_wseq(cinfo->regbase, CL_SEQR1E, old1e);
    649	}
    650	vga_wseq(cinfo->regbase, CL_SEQR1F, old1f);
    651}
    652
    653/*************************************************************************
    654	cirrusfb_set_par_foo()
    655
    656	actually writes the values for a new video mode into the hardware,
    657**************************************************************************/
    658static int cirrusfb_set_par_foo(struct fb_info *info)
    659{
    660	struct cirrusfb_info *cinfo = info->par;
    661	struct fb_var_screeninfo *var = &info->var;
    662	u8 __iomem *regbase = cinfo->regbase;
    663	unsigned char tmp;
    664	int pitch;
    665	const struct cirrusfb_board_info_rec *bi;
    666	int hdispend, hsyncstart, hsyncend, htotal;
    667	int yres, vdispend, vsyncstart, vsyncend, vtotal;
    668	long freq;
    669	int nom, den, div;
    670	unsigned int control = 0, format = 0, threshold = 0;
    671
    672	dev_dbg(info->device, "Requested mode: %dx%dx%d\n",
    673	       var->xres, var->yres, var->bits_per_pixel);
    674
    675	switch (var->bits_per_pixel) {
    676	case 1:
    677		info->fix.line_length = var->xres_virtual / 8;
    678		info->fix.visual = FB_VISUAL_MONO10;
    679		break;
    680
    681	case 8:
    682		info->fix.line_length = var->xres_virtual;
    683		info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
    684		break;
    685
    686	case 16:
    687	case 24:
    688		info->fix.line_length = var->xres_virtual *
    689					var->bits_per_pixel >> 3;
    690		info->fix.visual = FB_VISUAL_TRUECOLOR;
    691		break;
    692	}
    693	info->fix.type = FB_TYPE_PACKED_PIXELS;
    694
    695	init_vgachip(info);
    696
    697	bi = &cirrusfb_board_info[cinfo->btype];
    698
    699	hsyncstart = var->xres + var->right_margin;
    700	hsyncend = hsyncstart + var->hsync_len;
    701	htotal = (hsyncend + var->left_margin) / 8;
    702	hdispend = var->xres / 8;
    703	hsyncstart = hsyncstart / 8;
    704	hsyncend = hsyncend / 8;
    705
    706	vdispend = var->yres;
    707	vsyncstart = vdispend + var->lower_margin;
    708	vsyncend = vsyncstart + var->vsync_len;
    709	vtotal = vsyncend + var->upper_margin;
    710
    711	if (var->vmode & FB_VMODE_DOUBLE) {
    712		vdispend *= 2;
    713		vsyncstart *= 2;
    714		vsyncend *= 2;
    715		vtotal *= 2;
    716	} else if (var->vmode & FB_VMODE_INTERLACED) {
    717		vdispend = (vdispend + 1) / 2;
    718		vsyncstart = (vsyncstart + 1) / 2;
    719		vsyncend = (vsyncend + 1) / 2;
    720		vtotal = (vtotal + 1) / 2;
    721	}
    722	yres = vdispend;
    723	if (yres >= 1024) {
    724		vtotal /= 2;
    725		vsyncstart /= 2;
    726		vsyncend /= 2;
    727		vdispend /= 2;
    728	}
    729
    730	vdispend -= 1;
    731	vsyncstart -= 1;
    732	vsyncend -= 1;
    733	vtotal -= 2;
    734
    735	if (cinfo->multiplexing) {
    736		htotal /= 2;
    737		hsyncstart /= 2;
    738		hsyncend /= 2;
    739		hdispend /= 2;
    740	}
    741
    742	htotal -= 5;
    743	hdispend -= 1;
    744	hsyncstart += 1;
    745	hsyncend += 1;
    746
    747	/* unlock register VGA_CRTC_H_TOTAL..CRT7 */
    748	vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, 0x20);	/* previously: 0x00) */
    749
    750	/* if debugging is enabled, all parameters get output before writing */
    751	dev_dbg(info->device, "CRT0: %d\n", htotal);
    752	vga_wcrt(regbase, VGA_CRTC_H_TOTAL, htotal);
    753
    754	dev_dbg(info->device, "CRT1: %d\n", hdispend);
    755	vga_wcrt(regbase, VGA_CRTC_H_DISP, hdispend);
    756
    757	dev_dbg(info->device, "CRT2: %d\n", var->xres / 8);
    758	vga_wcrt(regbase, VGA_CRTC_H_BLANK_START, var->xres / 8);
    759
    760	/*  + 128: Compatible read */
    761	dev_dbg(info->device, "CRT3: 128+%d\n", (htotal + 5) % 32);
    762	vga_wcrt(regbase, VGA_CRTC_H_BLANK_END,
    763		 128 + ((htotal + 5) % 32));
    764
    765	dev_dbg(info->device, "CRT4: %d\n", hsyncstart);
    766	vga_wcrt(regbase, VGA_CRTC_H_SYNC_START, hsyncstart);
    767
    768	tmp = hsyncend % 32;
    769	if ((htotal + 5) & 32)
    770		tmp += 128;
    771	dev_dbg(info->device, "CRT5: %d\n", tmp);
    772	vga_wcrt(regbase, VGA_CRTC_H_SYNC_END, tmp);
    773
    774	dev_dbg(info->device, "CRT6: %d\n", vtotal & 0xff);
    775	vga_wcrt(regbase, VGA_CRTC_V_TOTAL, vtotal & 0xff);
    776
    777	tmp = 16;		/* LineCompare bit #9 */
    778	if (vtotal & 256)
    779		tmp |= 1;
    780	if (vdispend & 256)
    781		tmp |= 2;
    782	if (vsyncstart & 256)
    783		tmp |= 4;
    784	if ((vdispend + 1) & 256)
    785		tmp |= 8;
    786	if (vtotal & 512)
    787		tmp |= 32;
    788	if (vdispend & 512)
    789		tmp |= 64;
    790	if (vsyncstart & 512)
    791		tmp |= 128;
    792	dev_dbg(info->device, "CRT7: %d\n", tmp);
    793	vga_wcrt(regbase, VGA_CRTC_OVERFLOW, tmp);
    794
    795	tmp = 0x40;		/* LineCompare bit #8 */
    796	if ((vdispend + 1) & 512)
    797		tmp |= 0x20;
    798	if (var->vmode & FB_VMODE_DOUBLE)
    799		tmp |= 0x80;
    800	dev_dbg(info->device, "CRT9: %d\n", tmp);
    801	vga_wcrt(regbase, VGA_CRTC_MAX_SCAN, tmp);
    802
    803	dev_dbg(info->device, "CRT10: %d\n", vsyncstart & 0xff);
    804	vga_wcrt(regbase, VGA_CRTC_V_SYNC_START, vsyncstart & 0xff);
    805
    806	dev_dbg(info->device, "CRT11: 64+32+%d\n", vsyncend % 16);
    807	vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, vsyncend % 16 + 64 + 32);
    808
    809	dev_dbg(info->device, "CRT12: %d\n", vdispend & 0xff);
    810	vga_wcrt(regbase, VGA_CRTC_V_DISP_END, vdispend & 0xff);
    811
    812	dev_dbg(info->device, "CRT15: %d\n", (vdispend + 1) & 0xff);
    813	vga_wcrt(regbase, VGA_CRTC_V_BLANK_START, (vdispend + 1) & 0xff);
    814
    815	dev_dbg(info->device, "CRT16: %d\n", vtotal & 0xff);
    816	vga_wcrt(regbase, VGA_CRTC_V_BLANK_END, vtotal & 0xff);
    817
    818	dev_dbg(info->device, "CRT18: 0xff\n");
    819	vga_wcrt(regbase, VGA_CRTC_LINE_COMPARE, 0xff);
    820
    821	tmp = 0;
    822	if (var->vmode & FB_VMODE_INTERLACED)
    823		tmp |= 1;
    824	if ((htotal + 5) & 64)
    825		tmp |= 16;
    826	if ((htotal + 5) & 128)
    827		tmp |= 32;
    828	if (vtotal & 256)
    829		tmp |= 64;
    830	if (vtotal & 512)
    831		tmp |= 128;
    832
    833	dev_dbg(info->device, "CRT1a: %d\n", tmp);
    834	vga_wcrt(regbase, CL_CRT1A, tmp);
    835
    836	freq = PICOS2KHZ(var->pixclock);
    837	if (var->bits_per_pixel == 24)
    838		if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64)
    839			freq *= 3;
    840	if (cinfo->multiplexing)
    841		freq /= 2;
    842	if (cinfo->doubleVCLK)
    843		freq *= 2;
    844
    845	bestclock(freq, &nom, &den, &div);
    846
    847	dev_dbg(info->device, "VCLK freq: %ld kHz  nom: %d  den: %d  div: %d\n",
    848		freq, nom, den, div);
    849
    850	/* set VCLK0 */
    851	/* hardware RefClock: 14.31818 MHz */
    852	/* formula: VClk = (OSC * N) / (D * (1+P)) */
    853	/* Example: VClk = (14.31818 * 91) / (23 * (1+1)) = 28.325 MHz */
    854
    855	if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_PICASSO4 ||
    856	    cinfo->btype == BT_SD64) {
    857		/* if freq is close to mclk or mclk/2 select mclk
    858		 * as clock source
    859		 */
    860		int divMCLK = cirrusfb_check_mclk(info, freq);
    861		if (divMCLK)
    862			nom = 0;
    863		cirrusfb_set_mclk_as_source(info, divMCLK);
    864	}
    865	if (is_laguna(cinfo)) {
    866		long pcifc = fb_readl(cinfo->laguna_mmio + 0x3fc);
    867		unsigned char tile = fb_readb(cinfo->laguna_mmio + 0x407);
    868		unsigned short tile_control;
    869
    870		if (cinfo->btype == BT_LAGUNAB) {
    871			tile_control = fb_readw(cinfo->laguna_mmio + 0x2c4);
    872			tile_control &= ~0x80;
    873			fb_writew(tile_control, cinfo->laguna_mmio + 0x2c4);
    874		}
    875
    876		fb_writel(pcifc | 0x10000000l, cinfo->laguna_mmio + 0x3fc);
    877		fb_writeb(tile & 0x3f, cinfo->laguna_mmio + 0x407);
    878		control = fb_readw(cinfo->laguna_mmio + 0x402);
    879		threshold = fb_readw(cinfo->laguna_mmio + 0xea);
    880		control &= ~0x6800;
    881		format = 0;
    882		threshold &= 0xffc0 & 0x3fbf;
    883	}
    884	if (nom) {
    885		tmp = den << 1;
    886		if (div != 0)
    887			tmp |= 1;
    888		/* 6 bit denom; ONLY 5434!!! (bugged me 10 days) */
    889		if ((cinfo->btype == BT_SD64) ||
    890		    (cinfo->btype == BT_ALPINE) ||
    891		    (cinfo->btype == BT_GD5480))
    892			tmp |= 0x80;
    893
    894		/* Laguna chipset has reversed clock registers */
    895		if (is_laguna(cinfo)) {
    896			vga_wseq(regbase, CL_SEQRE, tmp);
    897			vga_wseq(regbase, CL_SEQR1E, nom);
    898		} else {
    899			vga_wseq(regbase, CL_SEQRE, nom);
    900			vga_wseq(regbase, CL_SEQR1E, tmp);
    901		}
    902	}
    903
    904	if (yres >= 1024)
    905		/* 1280x1024 */
    906		vga_wcrt(regbase, VGA_CRTC_MODE, 0xc7);
    907	else
    908		/* mode control: VGA_CRTC_START_HI enable, ROTATE(?), 16bit
    909		 * address wrap, no compat. */
    910		vga_wcrt(regbase, VGA_CRTC_MODE, 0xc3);
    911
    912	/* don't know if it would hurt to also program this if no interlaced */
    913	/* mode is used, but I feel better this way.. :-) */
    914	if (var->vmode & FB_VMODE_INTERLACED)
    915		vga_wcrt(regbase, VGA_CRTC_REGS, htotal / 2);
    916	else
    917		vga_wcrt(regbase, VGA_CRTC_REGS, 0x00);	/* interlace control */
    918
    919	/* adjust horizontal/vertical sync type (low/high), use VCLK3 */
    920	/* enable display memory & CRTC I/O address for color mode */
    921	tmp = 0x03 | 0xc;
    922	if (var->sync & FB_SYNC_HOR_HIGH_ACT)
    923		tmp |= 0x40;
    924	if (var->sync & FB_SYNC_VERT_HIGH_ACT)
    925		tmp |= 0x80;
    926	WGen(cinfo, VGA_MIS_W, tmp);
    927
    928	/* text cursor on and start line */
    929	vga_wcrt(regbase, VGA_CRTC_CURSOR_START, 0);
    930	/* text cursor end line */
    931	vga_wcrt(regbase, VGA_CRTC_CURSOR_END, 31);
    932
    933	/******************************************************
    934	 *
    935	 * 1 bpp
    936	 *
    937	 */
    938
    939	/* programming for different color depths */
    940	if (var->bits_per_pixel == 1) {
    941		dev_dbg(info->device, "preparing for 1 bit deep display\n");
    942		vga_wgfx(regbase, VGA_GFX_MODE, 0);	/* mode register */
    943
    944		/* SR07 */
    945		switch (cinfo->btype) {
    946		case BT_SD64:
    947		case BT_PICCOLO:
    948		case BT_PICASSO:
    949		case BT_SPECTRUM:
    950		case BT_PICASSO4:
    951		case BT_ALPINE:
    952		case BT_GD5480:
    953			vga_wseq(regbase, CL_SEQR7,
    954				 cinfo->multiplexing ?
    955					bi->sr07_1bpp_mux : bi->sr07_1bpp);
    956			break;
    957
    958		case BT_LAGUNA:
    959		case BT_LAGUNAB:
    960			vga_wseq(regbase, CL_SEQR7,
    961				vga_rseq(regbase, CL_SEQR7) & ~0x01);
    962			break;
    963
    964		default:
    965			dev_warn(info->device, "unknown Board\n");
    966			break;
    967		}
    968
    969		/* Extended Sequencer Mode */
    970		switch (cinfo->btype) {
    971
    972		case BT_PICCOLO:
    973		case BT_SPECTRUM:
    974			/* evtl d0 bei 1 bit? avoid FIFO underruns..? */
    975			vga_wseq(regbase, CL_SEQRF, 0xb0);
    976			break;
    977
    978		case BT_PICASSO:
    979			/* ## vorher d0 avoid FIFO underruns..? */
    980			vga_wseq(regbase, CL_SEQRF, 0xd0);
    981			break;
    982
    983		case BT_SD64:
    984		case BT_PICASSO4:
    985		case BT_ALPINE:
    986		case BT_GD5480:
    987		case BT_LAGUNA:
    988		case BT_LAGUNAB:
    989			/* do nothing */
    990			break;
    991
    992		default:
    993			dev_warn(info->device, "unknown Board\n");
    994			break;
    995		}
    996
    997		/* pixel mask: pass-through for first plane */
    998		WGen(cinfo, VGA_PEL_MSK, 0x01);
    999		if (cinfo->multiplexing)
   1000			/* hidden dac reg: 1280x1024 */
   1001			WHDR(cinfo, 0x4a);
   1002		else
   1003			/* hidden dac: nothing */
   1004			WHDR(cinfo, 0);
   1005		/* memory mode: odd/even, ext. memory */
   1006		vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, 0x06);
   1007		/* plane mask: only write to first plane */
   1008		vga_wseq(regbase, VGA_SEQ_PLANE_WRITE, 0x01);
   1009	}
   1010
   1011	/******************************************************
   1012	 *
   1013	 * 8 bpp
   1014	 *
   1015	 */
   1016
   1017	else if (var->bits_per_pixel == 8) {
   1018		dev_dbg(info->device, "preparing for 8 bit deep display\n");
   1019		switch (cinfo->btype) {
   1020		case BT_SD64:
   1021		case BT_PICCOLO:
   1022		case BT_PICASSO:
   1023		case BT_SPECTRUM:
   1024		case BT_PICASSO4:
   1025		case BT_ALPINE:
   1026		case BT_GD5480:
   1027			vga_wseq(regbase, CL_SEQR7,
   1028				  cinfo->multiplexing ?
   1029					bi->sr07_8bpp_mux : bi->sr07_8bpp);
   1030			break;
   1031
   1032		case BT_LAGUNA:
   1033		case BT_LAGUNAB:
   1034			vga_wseq(regbase, CL_SEQR7,
   1035				vga_rseq(regbase, CL_SEQR7) | 0x01);
   1036			threshold |= 0x10;
   1037			break;
   1038
   1039		default:
   1040			dev_warn(info->device, "unknown Board\n");
   1041			break;
   1042		}
   1043
   1044		switch (cinfo->btype) {
   1045		case BT_PICCOLO:
   1046		case BT_PICASSO:
   1047		case BT_SPECTRUM:
   1048			/* Fast Page-Mode writes */
   1049			vga_wseq(regbase, CL_SEQRF, 0xb0);
   1050			break;
   1051
   1052		case BT_PICASSO4:
   1053#ifdef CONFIG_ZORRO
   1054			/* ### INCOMPLETE!! */
   1055			vga_wseq(regbase, CL_SEQRF, 0xb8);
   1056#endif
   1057		case BT_ALPINE:
   1058		case BT_SD64:
   1059		case BT_GD5480:
   1060		case BT_LAGUNA:
   1061		case BT_LAGUNAB:
   1062			/* do nothing */
   1063			break;
   1064
   1065		default:
   1066			dev_warn(info->device, "unknown board\n");
   1067			break;
   1068		}
   1069
   1070		/* mode register: 256 color mode */
   1071		vga_wgfx(regbase, VGA_GFX_MODE, 64);
   1072		if (cinfo->multiplexing)
   1073			/* hidden dac reg: 1280x1024 */
   1074			WHDR(cinfo, 0x4a);
   1075		else
   1076			/* hidden dac: nothing */
   1077			WHDR(cinfo, 0);
   1078	}
   1079
   1080	/******************************************************
   1081	 *
   1082	 * 16 bpp
   1083	 *
   1084	 */
   1085
   1086	else if (var->bits_per_pixel == 16) {
   1087		dev_dbg(info->device, "preparing for 16 bit deep display\n");
   1088		switch (cinfo->btype) {
   1089		case BT_PICCOLO:
   1090		case BT_SPECTRUM:
   1091			vga_wseq(regbase, CL_SEQR7, 0x87);
   1092			/* Fast Page-Mode writes */
   1093			vga_wseq(regbase, CL_SEQRF, 0xb0);
   1094			break;
   1095
   1096		case BT_PICASSO:
   1097			vga_wseq(regbase, CL_SEQR7, 0x27);
   1098			/* Fast Page-Mode writes */
   1099			vga_wseq(regbase, CL_SEQRF, 0xb0);
   1100			break;
   1101
   1102		case BT_SD64:
   1103		case BT_PICASSO4:
   1104		case BT_ALPINE:
   1105			/* Extended Sequencer Mode: 256c col. mode */
   1106			vga_wseq(regbase, CL_SEQR7,
   1107					cinfo->doubleVCLK ? 0xa3 : 0xa7);
   1108			break;
   1109
   1110		case BT_GD5480:
   1111			vga_wseq(regbase, CL_SEQR7, 0x17);
   1112			/* We already set SRF and SR1F */
   1113			break;
   1114
   1115		case BT_LAGUNA:
   1116		case BT_LAGUNAB:
   1117			vga_wseq(regbase, CL_SEQR7,
   1118				vga_rseq(regbase, CL_SEQR7) & ~0x01);
   1119			control |= 0x2000;
   1120			format |= 0x1400;
   1121			threshold |= 0x10;
   1122			break;
   1123
   1124		default:
   1125			dev_warn(info->device, "unknown Board\n");
   1126			break;
   1127		}
   1128
   1129		/* mode register: 256 color mode */
   1130		vga_wgfx(regbase, VGA_GFX_MODE, 64);
   1131#ifdef CONFIG_PCI
   1132		WHDR(cinfo, cinfo->doubleVCLK ? 0xe1 : 0xc1);
   1133#elif defined(CONFIG_ZORRO)
   1134		/* FIXME: CONFIG_PCI and CONFIG_ZORRO may be defined both */
   1135		WHDR(cinfo, 0xa0);	/* hidden dac reg: nothing special */
   1136#endif
   1137	}
   1138
   1139	/******************************************************
   1140	 *
   1141	 * 24 bpp
   1142	 *
   1143	 */
   1144
   1145	else if (var->bits_per_pixel == 24) {
   1146		dev_dbg(info->device, "preparing for 24 bit deep display\n");
   1147		switch (cinfo->btype) {
   1148		case BT_PICCOLO:
   1149		case BT_SPECTRUM:
   1150			vga_wseq(regbase, CL_SEQR7, 0x85);
   1151			/* Fast Page-Mode writes */
   1152			vga_wseq(regbase, CL_SEQRF, 0xb0);
   1153			break;
   1154
   1155		case BT_PICASSO:
   1156			vga_wseq(regbase, CL_SEQR7, 0x25);
   1157			/* Fast Page-Mode writes */
   1158			vga_wseq(regbase, CL_SEQRF, 0xb0);
   1159			break;
   1160
   1161		case BT_SD64:
   1162		case BT_PICASSO4:
   1163		case BT_ALPINE:
   1164			/* Extended Sequencer Mode: 256c col. mode */
   1165			vga_wseq(regbase, CL_SEQR7, 0xa5);
   1166			break;
   1167
   1168		case BT_GD5480:
   1169			vga_wseq(regbase, CL_SEQR7, 0x15);
   1170			/* We already set SRF and SR1F */
   1171			break;
   1172
   1173		case BT_LAGUNA:
   1174		case BT_LAGUNAB:
   1175			vga_wseq(regbase, CL_SEQR7,
   1176				vga_rseq(regbase, CL_SEQR7) & ~0x01);
   1177			control |= 0x4000;
   1178			format |= 0x2400;
   1179			threshold |= 0x20;
   1180			break;
   1181
   1182		default:
   1183			dev_warn(info->device, "unknown Board\n");
   1184			break;
   1185		}
   1186
   1187		/* mode register: 256 color mode */
   1188		vga_wgfx(regbase, VGA_GFX_MODE, 64);
   1189		/* hidden dac reg: 8-8-8 mode (24 or 32) */
   1190		WHDR(cinfo, 0xc5);
   1191	}
   1192
   1193	/******************************************************
   1194	 *
   1195	 * unknown/unsupported bpp
   1196	 *
   1197	 */
   1198
   1199	else
   1200		dev_err(info->device,
   1201			"What's this? requested color depth == %d.\n",
   1202			var->bits_per_pixel);
   1203
   1204	pitch = info->fix.line_length >> 3;
   1205	vga_wcrt(regbase, VGA_CRTC_OFFSET, pitch & 0xff);
   1206	tmp = 0x22;
   1207	if (pitch & 0x100)
   1208		tmp |= 0x10;	/* offset overflow bit */
   1209
   1210	/* screen start addr #16-18, fastpagemode cycles */
   1211	vga_wcrt(regbase, CL_CRT1B, tmp);
   1212
   1213	/* screen start address bit 19 */
   1214	if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19)
   1215		vga_wcrt(regbase, CL_CRT1D, (pitch >> 9) & 1);
   1216
   1217	if (is_laguna(cinfo)) {
   1218		tmp = 0;
   1219		if ((htotal + 5) & 256)
   1220			tmp |= 128;
   1221		if (hdispend & 256)
   1222			tmp |= 64;
   1223		if (hsyncstart & 256)
   1224			tmp |= 48;
   1225		if (vtotal & 1024)
   1226			tmp |= 8;
   1227		if (vdispend & 1024)
   1228			tmp |= 4;
   1229		if (vsyncstart & 1024)
   1230			tmp |= 3;
   1231
   1232		vga_wcrt(regbase, CL_CRT1E, tmp);
   1233		dev_dbg(info->device, "CRT1e: %d\n", tmp);
   1234	}
   1235
   1236	/* pixel panning */
   1237	vga_wattr(regbase, CL_AR33, 0);
   1238
   1239	/* [ EGS: SetOffset(); ] */
   1240	/* From SetOffset(): Turn on VideoEnable bit in Attribute controller */
   1241	AttrOn(cinfo);
   1242
   1243	if (is_laguna(cinfo)) {
   1244		/* no tiles */
   1245		fb_writew(control | 0x1000, cinfo->laguna_mmio + 0x402);
   1246		fb_writew(format, cinfo->laguna_mmio + 0xc0);
   1247		fb_writew(threshold, cinfo->laguna_mmio + 0xea);
   1248	}
   1249	/* finally, turn on everything - turn off "FullBandwidth" bit */
   1250	/* also, set "DotClock%2" bit where requested */
   1251	tmp = 0x01;
   1252
   1253/*** FB_VMODE_CLOCK_HALVE in linux/fb.h not defined anymore ?
   1254    if (var->vmode & FB_VMODE_CLOCK_HALVE)
   1255	tmp |= 0x08;
   1256*/
   1257
   1258	vga_wseq(regbase, VGA_SEQ_CLOCK_MODE, tmp);
   1259	dev_dbg(info->device, "CL_SEQR1: %d\n", tmp);
   1260
   1261#ifdef CIRRUSFB_DEBUG
   1262	cirrusfb_dbg_reg_dump(info, NULL);
   1263#endif
   1264
   1265	return 0;
   1266}
   1267
   1268/* for some reason incomprehensible to me, cirrusfb requires that you write
   1269 * the registers twice for the settings to take..grr. -dte */
   1270static int cirrusfb_set_par(struct fb_info *info)
   1271{
   1272	cirrusfb_set_par_foo(info);
   1273	return cirrusfb_set_par_foo(info);
   1274}
   1275
   1276static int cirrusfb_setcolreg(unsigned regno, unsigned red, unsigned green,
   1277			      unsigned blue, unsigned transp,
   1278			      struct fb_info *info)
   1279{
   1280	struct cirrusfb_info *cinfo = info->par;
   1281
   1282	if (regno > 255)
   1283		return -EINVAL;
   1284
   1285	if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
   1286		u32 v;
   1287		red >>= (16 - info->var.red.length);
   1288		green >>= (16 - info->var.green.length);
   1289		blue >>= (16 - info->var.blue.length);
   1290
   1291		if (regno >= 16)
   1292			return 1;
   1293		v = (red << info->var.red.offset) |
   1294		    (green << info->var.green.offset) |
   1295		    (blue << info->var.blue.offset);
   1296
   1297		cinfo->pseudo_palette[regno] = v;
   1298		return 0;
   1299	}
   1300
   1301	if (info->var.bits_per_pixel == 8)
   1302		WClut(cinfo, regno, red >> 10, green >> 10, blue >> 10);
   1303
   1304	return 0;
   1305
   1306}
   1307
   1308/*************************************************************************
   1309	cirrusfb_pan_display()
   1310
   1311	performs display panning - provided hardware permits this
   1312**************************************************************************/
   1313static int cirrusfb_pan_display(struct fb_var_screeninfo *var,
   1314				struct fb_info *info)
   1315{
   1316	int xoffset;
   1317	unsigned long base;
   1318	unsigned char tmp, xpix;
   1319	struct cirrusfb_info *cinfo = info->par;
   1320
   1321	/* no range checks for xoffset and yoffset,   */
   1322	/* as fb_pan_display has already done this */
   1323	if (var->vmode & FB_VMODE_YWRAP)
   1324		return -EINVAL;
   1325
   1326	xoffset = var->xoffset * info->var.bits_per_pixel / 8;
   1327
   1328	base = var->yoffset * info->fix.line_length + xoffset;
   1329
   1330	if (info->var.bits_per_pixel == 1) {
   1331		/* base is already correct */
   1332		xpix = (unsigned char) (var->xoffset % 8);
   1333	} else {
   1334		base /= 4;
   1335		xpix = (unsigned char) ((xoffset % 4) * 2);
   1336	}
   1337
   1338	if (!is_laguna(cinfo))
   1339		cirrusfb_WaitBLT(cinfo->regbase);
   1340
   1341	/* lower 8 + 8 bits of screen start address */
   1342	vga_wcrt(cinfo->regbase, VGA_CRTC_START_LO, base & 0xff);
   1343	vga_wcrt(cinfo->regbase, VGA_CRTC_START_HI, (base >> 8) & 0xff);
   1344
   1345	/* 0xf2 is %11110010, exclude tmp bits */
   1346	tmp = vga_rcrt(cinfo->regbase, CL_CRT1B) & 0xf2;
   1347	/* construct bits 16, 17 and 18 of screen start address */
   1348	if (base & 0x10000)
   1349		tmp |= 0x01;
   1350	if (base & 0x20000)
   1351		tmp |= 0x04;
   1352	if (base & 0x40000)
   1353		tmp |= 0x08;
   1354
   1355	vga_wcrt(cinfo->regbase, CL_CRT1B, tmp);
   1356
   1357	/* construct bit 19 of screen start address */
   1358	if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) {
   1359		tmp = vga_rcrt(cinfo->regbase, CL_CRT1D);
   1360		if (is_laguna(cinfo))
   1361			tmp = (tmp & ~0x18) | ((base >> 16) & 0x18);
   1362		else
   1363			tmp = (tmp & ~0x80) | ((base >> 12) & 0x80);
   1364		vga_wcrt(cinfo->regbase, CL_CRT1D, tmp);
   1365	}
   1366
   1367	/* write pixel panning value to AR33; this does not quite work in 8bpp
   1368	 *
   1369	 * ### Piccolo..? Will this work?
   1370	 */
   1371	if (info->var.bits_per_pixel == 1)
   1372		vga_wattr(cinfo->regbase, CL_AR33, xpix);
   1373
   1374	return 0;
   1375}
   1376
   1377static int cirrusfb_blank(int blank_mode, struct fb_info *info)
   1378{
   1379	/*
   1380	 * Blank the screen if blank_mode != 0, else unblank. If blank == NULL
   1381	 * then the caller blanks by setting the CLUT (Color Look Up Table)
   1382	 * to all black. Return 0 if blanking succeeded, != 0 if un-/blanking
   1383	 * failed due to e.g. a video mode which doesn't support it.
   1384	 * Implements VESA suspend and powerdown modes on hardware that
   1385	 * supports disabling hsync/vsync:
   1386	 *   blank_mode == 2: suspend vsync
   1387	 *   blank_mode == 3: suspend hsync
   1388	 *   blank_mode == 4: powerdown
   1389	 */
   1390	unsigned char val;
   1391	struct cirrusfb_info *cinfo = info->par;
   1392	int current_mode = cinfo->blank_mode;
   1393
   1394	dev_dbg(info->device, "ENTER, blank mode = %d\n", blank_mode);
   1395
   1396	if (info->state != FBINFO_STATE_RUNNING ||
   1397	    current_mode == blank_mode) {
   1398		dev_dbg(info->device, "EXIT, returning 0\n");
   1399		return 0;
   1400	}
   1401
   1402	/* Undo current */
   1403	if (current_mode == FB_BLANK_NORMAL ||
   1404	    current_mode == FB_BLANK_UNBLANK)
   1405		/* clear "FullBandwidth" bit */
   1406		val = 0;
   1407	else
   1408		/* set "FullBandwidth" bit */
   1409		val = 0x20;
   1410
   1411	val |= vga_rseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE) & 0xdf;
   1412	vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, val);
   1413
   1414	switch (blank_mode) {
   1415	case FB_BLANK_UNBLANK:
   1416	case FB_BLANK_NORMAL:
   1417		val = 0x00;
   1418		break;
   1419	case FB_BLANK_VSYNC_SUSPEND:
   1420		val = 0x04;
   1421		break;
   1422	case FB_BLANK_HSYNC_SUSPEND:
   1423		val = 0x02;
   1424		break;
   1425	case FB_BLANK_POWERDOWN:
   1426		val = 0x06;
   1427		break;
   1428	default:
   1429		dev_dbg(info->device, "EXIT, returning 1\n");
   1430		return 1;
   1431	}
   1432
   1433	vga_wgfx(cinfo->regbase, CL_GRE, val);
   1434
   1435	cinfo->blank_mode = blank_mode;
   1436	dev_dbg(info->device, "EXIT, returning 0\n");
   1437
   1438	/* Let fbcon do a soft blank for us */
   1439	return (blank_mode == FB_BLANK_NORMAL) ? 1 : 0;
   1440}
   1441
   1442/**** END   Hardware specific Routines **************************************/
   1443/****************************************************************************/
   1444/**** BEGIN Internal Routines ***********************************************/
   1445
   1446static void init_vgachip(struct fb_info *info)
   1447{
   1448	struct cirrusfb_info *cinfo = info->par;
   1449	const struct cirrusfb_board_info_rec *bi;
   1450
   1451	assert(cinfo != NULL);
   1452
   1453	bi = &cirrusfb_board_info[cinfo->btype];
   1454
   1455	/* reset board globally */
   1456	switch (cinfo->btype) {
   1457	case BT_PICCOLO:
   1458		WSFR(cinfo, 0x01);
   1459		udelay(500);
   1460		WSFR(cinfo, 0x51);
   1461		udelay(500);
   1462		break;
   1463	case BT_PICASSO:
   1464		WSFR2(cinfo, 0xff);
   1465		udelay(500);
   1466		break;
   1467	case BT_SD64:
   1468	case BT_SPECTRUM:
   1469		WSFR(cinfo, 0x1f);
   1470		udelay(500);
   1471		WSFR(cinfo, 0x4f);
   1472		udelay(500);
   1473		break;
   1474	case BT_PICASSO4:
   1475		/* disable flickerfixer */
   1476		vga_wcrt(cinfo->regbase, CL_CRT51, 0x00);
   1477		mdelay(100);
   1478		/* mode */
   1479		vga_wgfx(cinfo->regbase, CL_GR31, 0x00);
   1480		fallthrough;
   1481	case BT_GD5480:
   1482		/* from Klaus' NetBSD driver: */
   1483		vga_wgfx(cinfo->regbase, CL_GR2F, 0x00);
   1484		fallthrough;
   1485	case BT_ALPINE:
   1486		/* put blitter into 542x compat */
   1487		vga_wgfx(cinfo->regbase, CL_GR33, 0x00);
   1488		break;
   1489
   1490	case BT_LAGUNA:
   1491	case BT_LAGUNAB:
   1492		/* Nothing to do to reset the board. */
   1493		break;
   1494
   1495	default:
   1496		dev_err(info->device, "Warning: Unknown board type\n");
   1497		break;
   1498	}
   1499
   1500	/* make sure RAM size set by this point */
   1501	assert(info->screen_size > 0);
   1502
   1503	/* the P4 is not fully initialized here; I rely on it having been */
   1504	/* inited under AmigaOS already, which seems to work just fine    */
   1505	/* (Klaus advised to do it this way)			      */
   1506
   1507	if (cinfo->btype != BT_PICASSO4) {
   1508		WGen(cinfo, CL_VSSM, 0x10);	/* EGS: 0x16 */
   1509		WGen(cinfo, CL_POS102, 0x01);
   1510		WGen(cinfo, CL_VSSM, 0x08);	/* EGS: 0x0e */
   1511
   1512		if (cinfo->btype != BT_SD64)
   1513			WGen(cinfo, CL_VSSM2, 0x01);
   1514
   1515		/* reset sequencer logic */
   1516		vga_wseq(cinfo->regbase, VGA_SEQ_RESET, 0x03);
   1517
   1518		/* FullBandwidth (video off) and 8/9 dot clock */
   1519		vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, 0x21);
   1520
   1521		/* "magic cookie" - doesn't make any sense to me.. */
   1522/*      vga_wgfx(cinfo->regbase, CL_GRA, 0xce);   */
   1523		/* unlock all extension registers */
   1524		vga_wseq(cinfo->regbase, CL_SEQR6, 0x12);
   1525
   1526		switch (cinfo->btype) {
   1527		case BT_GD5480:
   1528			vga_wseq(cinfo->regbase, CL_SEQRF, 0x98);
   1529			break;
   1530		case BT_ALPINE:
   1531		case BT_LAGUNA:
   1532		case BT_LAGUNAB:
   1533			break;
   1534		case BT_SD64:
   1535#ifdef CONFIG_ZORRO
   1536			vga_wseq(cinfo->regbase, CL_SEQRF, 0xb8);
   1537#endif
   1538			break;
   1539		default:
   1540			vga_wseq(cinfo->regbase, CL_SEQR16, 0x0f);
   1541			vga_wseq(cinfo->regbase, CL_SEQRF, 0xb0);
   1542			break;
   1543		}
   1544	}
   1545	/* plane mask: nothing */
   1546	vga_wseq(cinfo->regbase, VGA_SEQ_PLANE_WRITE, 0xff);
   1547	/* character map select: doesn't even matter in gx mode */
   1548	vga_wseq(cinfo->regbase, VGA_SEQ_CHARACTER_MAP, 0x00);
   1549	/* memory mode: chain4, ext. memory */
   1550	vga_wseq(cinfo->regbase, VGA_SEQ_MEMORY_MODE, 0x0a);
   1551
   1552	/* controller-internal base address of video memory */
   1553	if (bi->init_sr07)
   1554		vga_wseq(cinfo->regbase, CL_SEQR7, bi->sr07);
   1555
   1556	/*  vga_wseq(cinfo->regbase, CL_SEQR8, 0x00); */
   1557	/* EEPROM control: shouldn't be necessary to write to this at all.. */
   1558
   1559	/* graphics cursor X position (incomplete; position gives rem. 3 bits */
   1560	vga_wseq(cinfo->regbase, CL_SEQR10, 0x00);
   1561	/* graphics cursor Y position (..."... ) */
   1562	vga_wseq(cinfo->regbase, CL_SEQR11, 0x00);
   1563	/* graphics cursor attributes */
   1564	vga_wseq(cinfo->regbase, CL_SEQR12, 0x00);
   1565	/* graphics cursor pattern address */
   1566	vga_wseq(cinfo->regbase, CL_SEQR13, 0x00);
   1567
   1568	/* writing these on a P4 might give problems..  */
   1569	if (cinfo->btype != BT_PICASSO4) {
   1570		/* configuration readback and ext. color */
   1571		vga_wseq(cinfo->regbase, CL_SEQR17, 0x00);
   1572		/* signature generator */
   1573		vga_wseq(cinfo->regbase, CL_SEQR18, 0x02);
   1574	}
   1575
   1576	/* Screen A preset row scan: none */
   1577	vga_wcrt(cinfo->regbase, VGA_CRTC_PRESET_ROW, 0x00);
   1578	/* Text cursor start: disable text cursor */
   1579	vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_START, 0x20);
   1580	/* Text cursor end: - */
   1581	vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_END, 0x00);
   1582	/* text cursor location high: 0 */
   1583	vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_HI, 0x00);
   1584	/* text cursor location low: 0 */
   1585	vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_LO, 0x00);
   1586
   1587	/* Underline Row scanline: - */
   1588	vga_wcrt(cinfo->regbase, VGA_CRTC_UNDERLINE, 0x00);
   1589	/* ### add 0x40 for text modes with > 30 MHz pixclock */
   1590	/* ext. display controls: ext.adr. wrap */
   1591	vga_wcrt(cinfo->regbase, CL_CRT1B, 0x02);
   1592
   1593	/* Set/Reset registers: - */
   1594	vga_wgfx(cinfo->regbase, VGA_GFX_SR_VALUE, 0x00);
   1595	/* Set/Reset enable: - */
   1596	vga_wgfx(cinfo->regbase, VGA_GFX_SR_ENABLE, 0x00);
   1597	/* Color Compare: - */
   1598	vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_VALUE, 0x00);
   1599	/* Data Rotate: - */
   1600	vga_wgfx(cinfo->regbase, VGA_GFX_DATA_ROTATE, 0x00);
   1601	/* Read Map Select: - */
   1602	vga_wgfx(cinfo->regbase, VGA_GFX_PLANE_READ, 0x00);
   1603	/* Mode: conf. for 16/4/2 color mode, no odd/even, read/write mode 0 */
   1604	vga_wgfx(cinfo->regbase, VGA_GFX_MODE, 0x00);
   1605	/* Miscellaneous: memory map base address, graphics mode */
   1606	vga_wgfx(cinfo->regbase, VGA_GFX_MISC, 0x01);
   1607	/* Color Don't care: involve all planes */
   1608	vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_MASK, 0x0f);
   1609	/* Bit Mask: no mask at all */
   1610	vga_wgfx(cinfo->regbase, VGA_GFX_BIT_MASK, 0xff);
   1611
   1612	if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64 ||
   1613	    is_laguna(cinfo))
   1614		/* (5434 can't have bit 3 set for bitblt) */
   1615		vga_wgfx(cinfo->regbase, CL_GRB, 0x20);
   1616	else
   1617	/* Graphics controller mode extensions: finer granularity,
   1618	 * 8byte data latches
   1619	 */
   1620		vga_wgfx(cinfo->regbase, CL_GRB, 0x28);
   1621
   1622	vga_wgfx(cinfo->regbase, CL_GRC, 0xff);	/* Color Key compare: - */
   1623	vga_wgfx(cinfo->regbase, CL_GRD, 0x00);	/* Color Key compare mask: - */
   1624	vga_wgfx(cinfo->regbase, CL_GRE, 0x00);	/* Miscellaneous control: - */
   1625	/* Background color byte 1: - */
   1626	/*  vga_wgfx (cinfo->regbase, CL_GR10, 0x00); */
   1627	/*  vga_wgfx (cinfo->regbase, CL_GR11, 0x00); */
   1628
   1629	/* Attribute Controller palette registers: "identity mapping" */
   1630	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE0, 0x00);
   1631	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE1, 0x01);
   1632	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE2, 0x02);
   1633	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE3, 0x03);
   1634	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE4, 0x04);
   1635	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE5, 0x05);
   1636	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE6, 0x06);
   1637	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE7, 0x07);
   1638	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE8, 0x08);
   1639	vga_wattr(cinfo->regbase, VGA_ATC_PALETTE9, 0x09);
   1640	vga_wattr(cinfo->regbase, VGA_ATC_PALETTEA, 0x0a);
   1641	vga_wattr(cinfo->regbase, VGA_ATC_PALETTEB, 0x0b);
   1642	vga_wattr(cinfo->regbase, VGA_ATC_PALETTEC, 0x0c);
   1643	vga_wattr(cinfo->regbase, VGA_ATC_PALETTED, 0x0d);
   1644	vga_wattr(cinfo->regbase, VGA_ATC_PALETTEE, 0x0e);
   1645	vga_wattr(cinfo->regbase, VGA_ATC_PALETTEF, 0x0f);
   1646
   1647	/* Attribute Controller mode: graphics mode */
   1648	vga_wattr(cinfo->regbase, VGA_ATC_MODE, 0x01);
   1649	/* Overscan color reg.: reg. 0 */
   1650	vga_wattr(cinfo->regbase, VGA_ATC_OVERSCAN, 0x00);
   1651	/* Color Plane enable: Enable all 4 planes */
   1652	vga_wattr(cinfo->regbase, VGA_ATC_PLANE_ENABLE, 0x0f);
   1653	/* Color Select: - */
   1654	vga_wattr(cinfo->regbase, VGA_ATC_COLOR_PAGE, 0x00);
   1655
   1656	WGen(cinfo, VGA_PEL_MSK, 0xff);	/* Pixel mask: no mask */
   1657
   1658	/* BLT Start/status: Blitter reset */
   1659	vga_wgfx(cinfo->regbase, CL_GR31, 0x04);
   1660	/* - " -	   : "end-of-reset" */
   1661	vga_wgfx(cinfo->regbase, CL_GR31, 0x00);
   1662
   1663	/* misc... */
   1664	WHDR(cinfo, 0);	/* Hidden DAC register: - */
   1665	return;
   1666}
   1667
   1668static void switch_monitor(struct cirrusfb_info *cinfo, int on)
   1669{
   1670#ifdef CONFIG_ZORRO /* only works on Zorro boards */
   1671	static int IsOn = 0;	/* XXX not ok for multiple boards */
   1672
   1673	if (cinfo->btype == BT_PICASSO4)
   1674		return;		/* nothing to switch */
   1675	if (cinfo->btype == BT_ALPINE)
   1676		return;		/* nothing to switch */
   1677	if (cinfo->btype == BT_GD5480)
   1678		return;		/* nothing to switch */
   1679	if (cinfo->btype == BT_PICASSO) {
   1680		if ((on && !IsOn) || (!on && IsOn))
   1681			WSFR(cinfo, 0xff);
   1682		return;
   1683	}
   1684	if (on) {
   1685		switch (cinfo->btype) {
   1686		case BT_SD64:
   1687			WSFR(cinfo, cinfo->SFR | 0x21);
   1688			break;
   1689		case BT_PICCOLO:
   1690			WSFR(cinfo, cinfo->SFR | 0x28);
   1691			break;
   1692		case BT_SPECTRUM:
   1693			WSFR(cinfo, 0x6f);
   1694			break;
   1695		default: /* do nothing */ break;
   1696		}
   1697	} else {
   1698		switch (cinfo->btype) {
   1699		case BT_SD64:
   1700			WSFR(cinfo, cinfo->SFR & 0xde);
   1701			break;
   1702		case BT_PICCOLO:
   1703			WSFR(cinfo, cinfo->SFR & 0xd7);
   1704			break;
   1705		case BT_SPECTRUM:
   1706			WSFR(cinfo, 0x4f);
   1707			break;
   1708		default: /* do nothing */
   1709			break;
   1710		}
   1711	}
   1712#endif /* CONFIG_ZORRO */
   1713}
   1714
   1715/******************************************/
   1716/* Linux 2.6-style  accelerated functions */
   1717/******************************************/
   1718
   1719static int cirrusfb_sync(struct fb_info *info)
   1720{
   1721	struct cirrusfb_info *cinfo = info->par;
   1722
   1723	if (!is_laguna(cinfo)) {
   1724		while (vga_rgfx(cinfo->regbase, CL_GR31) & 0x03)
   1725			cpu_relax();
   1726	}
   1727	return 0;
   1728}
   1729
   1730static void cirrusfb_fillrect(struct fb_info *info,
   1731			      const struct fb_fillrect *region)
   1732{
   1733	struct fb_fillrect modded;
   1734	int vxres, vyres;
   1735	struct cirrusfb_info *cinfo = info->par;
   1736	int m = info->var.bits_per_pixel;
   1737	u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
   1738		cinfo->pseudo_palette[region->color] : region->color;
   1739
   1740	if (info->state != FBINFO_STATE_RUNNING)
   1741		return;
   1742	if (info->flags & FBINFO_HWACCEL_DISABLED) {
   1743		cfb_fillrect(info, region);
   1744		return;
   1745	}
   1746
   1747	vxres = info->var.xres_virtual;
   1748	vyres = info->var.yres_virtual;
   1749
   1750	memcpy(&modded, region, sizeof(struct fb_fillrect));
   1751
   1752	if (!modded.width || !modded.height ||
   1753	   modded.dx >= vxres || modded.dy >= vyres)
   1754		return;
   1755
   1756	if (modded.dx + modded.width  > vxres)
   1757		modded.width  = vxres - modded.dx;
   1758	if (modded.dy + modded.height > vyres)
   1759		modded.height = vyres - modded.dy;
   1760
   1761	cirrusfb_RectFill(cinfo->regbase,
   1762			  info->var.bits_per_pixel,
   1763			  (region->dx * m) / 8, region->dy,
   1764			  (region->width * m) / 8, region->height,
   1765			  color, color,
   1766			  info->fix.line_length, 0x40);
   1767}
   1768
   1769static void cirrusfb_copyarea(struct fb_info *info,
   1770			      const struct fb_copyarea *area)
   1771{
   1772	struct fb_copyarea modded;
   1773	u32 vxres, vyres;
   1774	struct cirrusfb_info *cinfo = info->par;
   1775	int m = info->var.bits_per_pixel;
   1776
   1777	if (info->state != FBINFO_STATE_RUNNING)
   1778		return;
   1779	if (info->flags & FBINFO_HWACCEL_DISABLED) {
   1780		cfb_copyarea(info, area);
   1781		return;
   1782	}
   1783
   1784	vxres = info->var.xres_virtual;
   1785	vyres = info->var.yres_virtual;
   1786	memcpy(&modded, area, sizeof(struct fb_copyarea));
   1787
   1788	if (!modded.width || !modded.height ||
   1789	   modded.sx >= vxres || modded.sy >= vyres ||
   1790	   modded.dx >= vxres || modded.dy >= vyres)
   1791		return;
   1792
   1793	if (modded.sx + modded.width > vxres)
   1794		modded.width = vxres - modded.sx;
   1795	if (modded.dx + modded.width > vxres)
   1796		modded.width = vxres - modded.dx;
   1797	if (modded.sy + modded.height > vyres)
   1798		modded.height = vyres - modded.sy;
   1799	if (modded.dy + modded.height > vyres)
   1800		modded.height = vyres - modded.dy;
   1801
   1802	cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
   1803			(area->sx * m) / 8, area->sy,
   1804			(area->dx * m) / 8, area->dy,
   1805			(area->width * m) / 8, area->height,
   1806			info->fix.line_length);
   1807
   1808}
   1809
   1810static void cirrusfb_imageblit(struct fb_info *info,
   1811			       const struct fb_image *image)
   1812{
   1813	struct cirrusfb_info *cinfo = info->par;
   1814	unsigned char op = (info->var.bits_per_pixel == 24) ? 0xc : 0x4;
   1815
   1816	if (info->state != FBINFO_STATE_RUNNING)
   1817		return;
   1818	/* Alpine/SD64 does not work at 24bpp ??? */
   1819	if (info->flags & FBINFO_HWACCEL_DISABLED || image->depth != 1)
   1820		cfb_imageblit(info, image);
   1821	else if ((cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64) &&
   1822		  op == 0xc)
   1823		cfb_imageblit(info, image);
   1824	else {
   1825		unsigned size = ((image->width + 7) >> 3) * image->height;
   1826		int m = info->var.bits_per_pixel;
   1827		u32 fg, bg;
   1828
   1829		if (info->var.bits_per_pixel == 8) {
   1830			fg = image->fg_color;
   1831			bg = image->bg_color;
   1832		} else {
   1833			fg = ((u32 *)(info->pseudo_palette))[image->fg_color];
   1834			bg = ((u32 *)(info->pseudo_palette))[image->bg_color];
   1835		}
   1836		if (info->var.bits_per_pixel == 24) {
   1837			/* clear background first */
   1838			cirrusfb_RectFill(cinfo->regbase,
   1839					  info->var.bits_per_pixel,
   1840					  (image->dx * m) / 8, image->dy,
   1841					  (image->width * m) / 8,
   1842					  image->height,
   1843					  bg, bg,
   1844					  info->fix.line_length, 0x40);
   1845		}
   1846		cirrusfb_RectFill(cinfo->regbase,
   1847				  info->var.bits_per_pixel,
   1848				  (image->dx * m) / 8, image->dy,
   1849				  (image->width * m) / 8, image->height,
   1850				  fg, bg,
   1851				  info->fix.line_length, op);
   1852		memcpy(info->screen_base, image->data, size);
   1853	}
   1854}
   1855
   1856#ifdef CONFIG_PCI
   1857static int release_io_ports;
   1858
   1859/* Pulled the logic from XFree86 Cirrus driver to get the memory size,
   1860 * based on the DRAM bandwidth bit and DRAM bank switching bit.  This
   1861 * works with 1MB, 2MB and 4MB configurations (which the Motorola boards
   1862 * seem to have. */
   1863static unsigned int cirrusfb_get_memsize(struct fb_info *info,
   1864					 u8 __iomem *regbase)
   1865{
   1866	unsigned long mem;
   1867	struct cirrusfb_info *cinfo = info->par;
   1868
   1869	if (is_laguna(cinfo)) {
   1870		unsigned char SR14 = vga_rseq(regbase, CL_SEQR14);
   1871
   1872		mem = ((SR14 & 7) + 1) << 20;
   1873	} else {
   1874		unsigned char SRF = vga_rseq(regbase, CL_SEQRF);
   1875		switch ((SRF & 0x18)) {
   1876		case 0x08:
   1877			mem = 512 * 1024;
   1878			break;
   1879		case 0x10:
   1880			mem = 1024 * 1024;
   1881			break;
   1882		/* 64-bit DRAM data bus width; assume 2MB.
   1883		 * Also indicates 2MB memory on the 5430.
   1884		 */
   1885		case 0x18:
   1886			mem = 2048 * 1024;
   1887			break;
   1888		default:
   1889			dev_warn(info->device, "Unknown memory size!\n");
   1890			mem = 1024 * 1024;
   1891		}
   1892		/* If DRAM bank switching is enabled, there must be
   1893		 * twice as much memory installed. (4MB on the 5434)
   1894		 */
   1895		if (cinfo->btype != BT_ALPINE && (SRF & 0x80) != 0)
   1896			mem *= 2;
   1897	}
   1898
   1899	/* TODO: Handling of GD5446/5480 (see XF86 sources ...) */
   1900	return mem;
   1901}
   1902
   1903static void get_pci_addrs(const struct pci_dev *pdev,
   1904			  unsigned long *display, unsigned long *registers)
   1905{
   1906	assert(pdev != NULL);
   1907	assert(display != NULL);
   1908	assert(registers != NULL);
   1909
   1910	*display = 0;
   1911	*registers = 0;
   1912
   1913	/* This is a best-guess for now */
   1914
   1915	if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) {
   1916		*display = pci_resource_start(pdev, 1);
   1917		*registers = pci_resource_start(pdev, 0);
   1918	} else {
   1919		*display = pci_resource_start(pdev, 0);
   1920		*registers = pci_resource_start(pdev, 1);
   1921	}
   1922
   1923	assert(*display != 0);
   1924}
   1925
   1926static void cirrusfb_pci_unmap(struct fb_info *info)
   1927{
   1928	struct pci_dev *pdev = to_pci_dev(info->device);
   1929	struct cirrusfb_info *cinfo = info->par;
   1930
   1931	if (cinfo->laguna_mmio == NULL)
   1932		iounmap(cinfo->laguna_mmio);
   1933	iounmap(info->screen_base);
   1934#if 0 /* if system didn't claim this region, we would... */
   1935	release_mem_region(0xA0000, 65535);
   1936#endif
   1937	if (release_io_ports)
   1938		release_region(0x3C0, 32);
   1939	pci_release_regions(pdev);
   1940}
   1941#endif /* CONFIG_PCI */
   1942
   1943#ifdef CONFIG_ZORRO
   1944static void cirrusfb_zorro_unmap(struct fb_info *info)
   1945{
   1946	struct cirrusfb_info *cinfo = info->par;
   1947	struct zorro_dev *zdev = to_zorro_dev(info->device);
   1948
   1949	if (info->fix.smem_start > 16 * MB_)
   1950		iounmap(info->screen_base);
   1951	if (info->fix.mmio_start > 16 * MB_)
   1952		iounmap(cinfo->regbase);
   1953
   1954	zorro_release_device(zdev);
   1955}
   1956#endif /* CONFIG_ZORRO */
   1957
   1958/* function table of the above functions */
   1959static const struct fb_ops cirrusfb_ops = {
   1960	.owner		= THIS_MODULE,
   1961	.fb_open	= cirrusfb_open,
   1962	.fb_release	= cirrusfb_release,
   1963	.fb_setcolreg	= cirrusfb_setcolreg,
   1964	.fb_check_var	= cirrusfb_check_var,
   1965	.fb_set_par	= cirrusfb_set_par,
   1966	.fb_pan_display = cirrusfb_pan_display,
   1967	.fb_blank	= cirrusfb_blank,
   1968	.fb_fillrect	= cirrusfb_fillrect,
   1969	.fb_copyarea	= cirrusfb_copyarea,
   1970	.fb_sync	= cirrusfb_sync,
   1971	.fb_imageblit	= cirrusfb_imageblit,
   1972};
   1973
   1974static int cirrusfb_set_fbinfo(struct fb_info *info)
   1975{
   1976	struct cirrusfb_info *cinfo = info->par;
   1977	struct fb_var_screeninfo *var = &info->var;
   1978
   1979	info->pseudo_palette = cinfo->pseudo_palette;
   1980	info->flags = FBINFO_DEFAULT
   1981		    | FBINFO_HWACCEL_XPAN
   1982		    | FBINFO_HWACCEL_YPAN
   1983		    | FBINFO_HWACCEL_FILLRECT
   1984		    | FBINFO_HWACCEL_IMAGEBLIT
   1985		    | FBINFO_HWACCEL_COPYAREA;
   1986	if (noaccel || is_laguna(cinfo)) {
   1987		info->flags |= FBINFO_HWACCEL_DISABLED;
   1988		info->fix.accel = FB_ACCEL_NONE;
   1989	} else
   1990		info->fix.accel = FB_ACCEL_CIRRUS_ALPINE;
   1991
   1992	info->fbops = &cirrusfb_ops;
   1993
   1994	if (cinfo->btype == BT_GD5480) {
   1995		if (var->bits_per_pixel == 16)
   1996			info->screen_base += 1 * MB_;
   1997		if (var->bits_per_pixel == 32)
   1998			info->screen_base += 2 * MB_;
   1999	}
   2000
   2001	/* Fill fix common fields */
   2002	strlcpy(info->fix.id, cirrusfb_board_info[cinfo->btype].name,
   2003		sizeof(info->fix.id));
   2004
   2005	/* monochrome: only 1 memory plane */
   2006	/* 8 bit and above: Use whole memory area */
   2007	info->fix.smem_len   = info->screen_size;
   2008	if (var->bits_per_pixel == 1)
   2009		info->fix.smem_len /= 4;
   2010	info->fix.type_aux   = 0;
   2011	info->fix.xpanstep   = 1;
   2012	info->fix.ypanstep   = 1;
   2013	info->fix.ywrapstep  = 0;
   2014
   2015	/* FIXME: map region at 0xB8000 if available, fill in here */
   2016	info->fix.mmio_len   = 0;
   2017
   2018	fb_alloc_cmap(&info->cmap, 256, 0);
   2019
   2020	return 0;
   2021}
   2022
   2023static int cirrusfb_register(struct fb_info *info)
   2024{
   2025	struct cirrusfb_info *cinfo = info->par;
   2026	int err;
   2027
   2028	/* sanity checks */
   2029	assert(cinfo->btype != BT_NONE);
   2030
   2031	/* set all the vital stuff */
   2032	cirrusfb_set_fbinfo(info);
   2033
   2034	dev_dbg(info->device, "(RAM start set to: 0x%p)\n", info->screen_base);
   2035
   2036	err = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8);
   2037	if (!err) {
   2038		dev_dbg(info->device, "wrong initial video mode\n");
   2039		err = -EINVAL;
   2040		goto err_dealloc_cmap;
   2041	}
   2042
   2043	info->var.activate = FB_ACTIVATE_NOW;
   2044
   2045	err = cirrusfb_check_var(&info->var, info);
   2046	if (err < 0) {
   2047		/* should never happen */
   2048		dev_dbg(info->device,
   2049			"choking on default var... umm, no good.\n");
   2050		goto err_dealloc_cmap;
   2051	}
   2052
   2053	err = register_framebuffer(info);
   2054	if (err < 0) {
   2055		dev_err(info->device,
   2056			"could not register fb device; err = %d!\n", err);
   2057		goto err_dealloc_cmap;
   2058	}
   2059
   2060	return 0;
   2061
   2062err_dealloc_cmap:
   2063	fb_dealloc_cmap(&info->cmap);
   2064	return err;
   2065}
   2066
   2067static void cirrusfb_cleanup(struct fb_info *info)
   2068{
   2069	struct cirrusfb_info *cinfo = info->par;
   2070
   2071	switch_monitor(cinfo, 0);
   2072	unregister_framebuffer(info);
   2073	fb_dealloc_cmap(&info->cmap);
   2074	dev_dbg(info->device, "Framebuffer unregistered\n");
   2075	cinfo->unmap(info);
   2076	framebuffer_release(info);
   2077}
   2078
   2079#ifdef CONFIG_PCI
   2080static int cirrusfb_pci_register(struct pci_dev *pdev,
   2081				 const struct pci_device_id *ent)
   2082{
   2083	struct cirrusfb_info *cinfo;
   2084	struct fb_info *info;
   2085	unsigned long board_addr, board_size;
   2086	int ret;
   2087
   2088	ret = pci_enable_device(pdev);
   2089	if (ret < 0) {
   2090		printk(KERN_ERR "cirrusfb: Cannot enable PCI device\n");
   2091		goto err_out;
   2092	}
   2093
   2094	info = framebuffer_alloc(sizeof(struct cirrusfb_info), &pdev->dev);
   2095	if (!info) {
   2096		ret = -ENOMEM;
   2097		goto err_out;
   2098	}
   2099
   2100	cinfo = info->par;
   2101	cinfo->btype = (enum cirrus_board) ent->driver_data;
   2102
   2103	dev_dbg(info->device,
   2104		" Found PCI device, base address 0 is 0x%Lx, btype set to %d\n",
   2105		(unsigned long long)pdev->resource[0].start,  cinfo->btype);
   2106	dev_dbg(info->device, " base address 1 is 0x%Lx\n",
   2107		(unsigned long long)pdev->resource[1].start);
   2108
   2109	dev_dbg(info->device,
   2110		"Attempt to get PCI info for Cirrus Graphics Card\n");
   2111	get_pci_addrs(pdev, &board_addr, &info->fix.mmio_start);
   2112	/* FIXME: this forces VGA.  alternatives? */
   2113	cinfo->regbase = NULL;
   2114	cinfo->laguna_mmio = ioremap(info->fix.mmio_start, 0x1000);
   2115
   2116	dev_dbg(info->device, "Board address: 0x%lx, register address: 0x%lx\n",
   2117		board_addr, info->fix.mmio_start);
   2118
   2119	board_size = (cinfo->btype == BT_GD5480) ?
   2120		32 * MB_ : cirrusfb_get_memsize(info, cinfo->regbase);
   2121
   2122	ret = pci_request_regions(pdev, "cirrusfb");
   2123	if (ret < 0) {
   2124		dev_err(info->device, "cannot reserve region 0x%lx, abort\n",
   2125			board_addr);
   2126		goto err_release_fb;
   2127	}
   2128#if 0 /* if the system didn't claim this region, we would... */
   2129	if (!request_mem_region(0xA0000, 65535, "cirrusfb")) {
   2130		dev_err(info->device, "cannot reserve region 0x%lx, abort\n",
   2131			0xA0000L);
   2132		ret = -EBUSY;
   2133		goto err_release_regions;
   2134	}
   2135#endif
   2136	if (request_region(0x3C0, 32, "cirrusfb"))
   2137		release_io_ports = 1;
   2138
   2139	info->screen_base = ioremap(board_addr, board_size);
   2140	if (!info->screen_base) {
   2141		ret = -EIO;
   2142		goto err_release_legacy;
   2143	}
   2144
   2145	info->fix.smem_start = board_addr;
   2146	info->screen_size = board_size;
   2147	cinfo->unmap = cirrusfb_pci_unmap;
   2148
   2149	dev_info(info->device,
   2150		 "Cirrus Logic chipset on PCI bus, RAM (%lu kB) at 0x%lx\n",
   2151		 info->screen_size >> 10, board_addr);
   2152	pci_set_drvdata(pdev, info);
   2153
   2154	ret = cirrusfb_register(info);
   2155	if (!ret)
   2156		return 0;
   2157
   2158	iounmap(info->screen_base);
   2159err_release_legacy:
   2160	if (release_io_ports)
   2161		release_region(0x3C0, 32);
   2162#if 0
   2163	release_mem_region(0xA0000, 65535);
   2164err_release_regions:
   2165#endif
   2166	pci_release_regions(pdev);
   2167err_release_fb:
   2168	if (cinfo->laguna_mmio != NULL)
   2169		iounmap(cinfo->laguna_mmio);
   2170	framebuffer_release(info);
   2171err_out:
   2172	return ret;
   2173}
   2174
   2175static void cirrusfb_pci_unregister(struct pci_dev *pdev)
   2176{
   2177	struct fb_info *info = pci_get_drvdata(pdev);
   2178
   2179	cirrusfb_cleanup(info);
   2180}
   2181
   2182static struct pci_driver cirrusfb_pci_driver = {
   2183	.name		= "cirrusfb",
   2184	.id_table	= cirrusfb_pci_table,
   2185	.probe		= cirrusfb_pci_register,
   2186	.remove		= cirrusfb_pci_unregister,
   2187};
   2188#endif /* CONFIG_PCI */
   2189
   2190#ifdef CONFIG_ZORRO
   2191static int cirrusfb_zorro_register(struct zorro_dev *z,
   2192				   const struct zorro_device_id *ent)
   2193{
   2194	struct fb_info *info;
   2195	int error;
   2196	const struct zorrocl *zcl;
   2197	enum cirrus_board btype;
   2198	unsigned long regbase, ramsize, rambase;
   2199	struct cirrusfb_info *cinfo;
   2200
   2201	info = framebuffer_alloc(sizeof(struct cirrusfb_info), &z->dev);
   2202	if (!info)
   2203		return -ENOMEM;
   2204
   2205	zcl = (const struct zorrocl *)ent->driver_data;
   2206	btype = zcl->type;
   2207	regbase = zorro_resource_start(z) + zcl->regoffset;
   2208	ramsize = zcl->ramsize;
   2209	if (ramsize) {
   2210		rambase = zorro_resource_start(z) + zcl->ramoffset;
   2211		if (zorro_resource_len(z) == 64 * MB_) {
   2212			/* Quirk for 64 MiB Picasso IV */
   2213			rambase += zcl->ramoffset;
   2214		}
   2215	} else {
   2216		struct zorro_dev *ram = zorro_find_device(zcl->ramid, NULL);
   2217		if (!ram || !zorro_resource_len(ram)) {
   2218			dev_err(info->device, "No video RAM found\n");
   2219			error = -ENODEV;
   2220			goto err_release_fb;
   2221		}
   2222		rambase = zorro_resource_start(ram);
   2223		ramsize = zorro_resource_len(ram);
   2224		if (zcl->ramid2 &&
   2225		    (ram = zorro_find_device(zcl->ramid2, NULL))) {
   2226			if (zorro_resource_start(ram) != rambase + ramsize) {
   2227				dev_warn(info->device,
   2228					 "Skipping non-contiguous RAM at %pR\n",
   2229					 &ram->resource);
   2230			} else {
   2231				ramsize += zorro_resource_len(ram);
   2232			}
   2233		}
   2234	}
   2235
   2236	dev_info(info->device,
   2237		 "%s board detected, REG at 0x%lx, %lu MiB RAM at 0x%lx\n",
   2238		 cirrusfb_board_info[btype].name, regbase, ramsize / MB_,
   2239		 rambase);
   2240
   2241	if (!zorro_request_device(z, "cirrusfb")) {
   2242		dev_err(info->device, "Cannot reserve %pR\n", &z->resource);
   2243		error = -EBUSY;
   2244		goto err_release_fb;
   2245	}
   2246
   2247	cinfo = info->par;
   2248	cinfo->btype = btype;
   2249
   2250	info->fix.mmio_start = regbase;
   2251	cinfo->regbase = regbase > 16 * MB_ ? ioremap(regbase, 64 * 1024)
   2252					    : ZTWO_VADDR(regbase);
   2253	if (!cinfo->regbase) {
   2254		dev_err(info->device, "Cannot map registers\n");
   2255		error = -EIO;
   2256		goto err_release_dev;
   2257	}
   2258
   2259	info->fix.smem_start = rambase;
   2260	info->screen_size = ramsize;
   2261	info->screen_base = rambase > 16 * MB_ ? ioremap(rambase, ramsize)
   2262					       : ZTWO_VADDR(rambase);
   2263	if (!info->screen_base) {
   2264		dev_err(info->device, "Cannot map video RAM\n");
   2265		error = -EIO;
   2266		goto err_unmap_reg;
   2267	}
   2268
   2269	cinfo->unmap = cirrusfb_zorro_unmap;
   2270
   2271	dev_info(info->device,
   2272		 "Cirrus Logic chipset on Zorro bus, RAM (%lu MiB) at 0x%lx\n",
   2273		 ramsize / MB_, rambase);
   2274
   2275	/* MCLK select etc. */
   2276	if (cirrusfb_board_info[btype].init_sr1f)
   2277		vga_wseq(cinfo->regbase, CL_SEQR1F,
   2278			 cirrusfb_board_info[btype].sr1f);
   2279
   2280	error = cirrusfb_register(info);
   2281	if (error) {
   2282		dev_err(info->device, "Failed to register device, error %d\n",
   2283			error);
   2284		goto err_unmap_ram;
   2285	}
   2286
   2287	zorro_set_drvdata(z, info);
   2288	return 0;
   2289
   2290err_unmap_ram:
   2291	if (rambase > 16 * MB_)
   2292		iounmap(info->screen_base);
   2293
   2294err_unmap_reg:
   2295	if (regbase > 16 * MB_)
   2296		iounmap(cinfo->regbase);
   2297err_release_dev:
   2298	zorro_release_device(z);
   2299err_release_fb:
   2300	framebuffer_release(info);
   2301	return error;
   2302}
   2303
   2304void cirrusfb_zorro_unregister(struct zorro_dev *z)
   2305{
   2306	struct fb_info *info = zorro_get_drvdata(z);
   2307
   2308	cirrusfb_cleanup(info);
   2309	zorro_set_drvdata(z, NULL);
   2310}
   2311
   2312static struct zorro_driver cirrusfb_zorro_driver = {
   2313	.name		= "cirrusfb",
   2314	.id_table	= cirrusfb_zorro_table,
   2315	.probe		= cirrusfb_zorro_register,
   2316	.remove		= cirrusfb_zorro_unregister,
   2317};
   2318#endif /* CONFIG_ZORRO */
   2319
   2320#ifndef MODULE
   2321static int __init cirrusfb_setup(char *options)
   2322{
   2323	char *this_opt;
   2324
   2325	if (!options || !*options)
   2326		return 0;
   2327
   2328	while ((this_opt = strsep(&options, ",")) != NULL) {
   2329		if (!*this_opt)
   2330			continue;
   2331
   2332		if (!strcmp(this_opt, "noaccel"))
   2333			noaccel = 1;
   2334		else if (!strncmp(this_opt, "mode:", 5))
   2335			mode_option = this_opt + 5;
   2336		else
   2337			mode_option = this_opt;
   2338	}
   2339	return 0;
   2340}
   2341#endif
   2342
   2343    /*
   2344     *  Modularization
   2345     */
   2346
   2347MODULE_AUTHOR("Copyright 1999,2000 Jeff Garzik <jgarzik@pobox.com>");
   2348MODULE_DESCRIPTION("Accelerated FBDev driver for Cirrus Logic chips");
   2349MODULE_LICENSE("GPL");
   2350
   2351static int __init cirrusfb_init(void)
   2352{
   2353	int error = 0;
   2354
   2355#ifndef MODULE
   2356	char *option = NULL;
   2357
   2358	if (fb_get_options("cirrusfb", &option))
   2359		return -ENODEV;
   2360	cirrusfb_setup(option);
   2361#endif
   2362
   2363#ifdef CONFIG_ZORRO
   2364	error |= zorro_register_driver(&cirrusfb_zorro_driver);
   2365#endif
   2366#ifdef CONFIG_PCI
   2367	error |= pci_register_driver(&cirrusfb_pci_driver);
   2368#endif
   2369	return error;
   2370}
   2371
   2372static void __exit cirrusfb_exit(void)
   2373{
   2374#ifdef CONFIG_PCI
   2375	pci_unregister_driver(&cirrusfb_pci_driver);
   2376#endif
   2377#ifdef CONFIG_ZORRO
   2378	zorro_unregister_driver(&cirrusfb_zorro_driver);
   2379#endif
   2380}
   2381
   2382module_init(cirrusfb_init);
   2383
   2384module_param(mode_option, charp, 0);
   2385MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");
   2386module_param(noaccel, bool, 0);
   2387MODULE_PARM_DESC(noaccel, "Disable acceleration");
   2388
   2389#ifdef MODULE
   2390module_exit(cirrusfb_exit);
   2391#endif
   2392
   2393/**********************************************************************/
   2394/* about the following functions - I have used the same names for the */
   2395/* functions as Markus Wild did in his Retina driver for NetBSD as    */
   2396/* they just made sense for this purpose. Apart from that, I wrote    */
   2397/* these functions myself.					    */
   2398/**********************************************************************/
   2399
   2400/*** WGen() - write into one of the external/general registers ***/
   2401static void WGen(const struct cirrusfb_info *cinfo,
   2402		  int regnum, unsigned char val)
   2403{
   2404	unsigned long regofs = 0;
   2405
   2406	if (cinfo->btype == BT_PICASSO) {
   2407		/* Picasso II specific hack */
   2408/*	      if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D ||
   2409		  regnum == CL_VSSM2) */
   2410		if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D)
   2411			regofs = 0xfff;
   2412	}
   2413
   2414	vga_w(cinfo->regbase, regofs + regnum, val);
   2415}
   2416
   2417/*** RGen() - read out one of the external/general registers ***/
   2418static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum)
   2419{
   2420	unsigned long regofs = 0;
   2421
   2422	if (cinfo->btype == BT_PICASSO) {
   2423		/* Picasso II specific hack */
   2424/*	      if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D ||
   2425		  regnum == CL_VSSM2) */
   2426		if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D)
   2427			regofs = 0xfff;
   2428	}
   2429
   2430	return vga_r(cinfo->regbase, regofs + regnum);
   2431}
   2432
   2433/*** AttrOn() - turn on VideoEnable for Attribute controller ***/
   2434static void AttrOn(const struct cirrusfb_info *cinfo)
   2435{
   2436	assert(cinfo != NULL);
   2437
   2438	if (vga_rcrt(cinfo->regbase, CL_CRT24) & 0x80) {
   2439		/* if we're just in "write value" mode, write back the */
   2440		/* same value as before to not modify anything */
   2441		vga_w(cinfo->regbase, VGA_ATT_IW,
   2442		      vga_r(cinfo->regbase, VGA_ATT_R));
   2443	}
   2444	/* turn on video bit */
   2445/*      vga_w(cinfo->regbase, VGA_ATT_IW, 0x20); */
   2446	vga_w(cinfo->regbase, VGA_ATT_IW, 0x33);
   2447
   2448	/* dummy write on Reg0 to be on "write index" mode next time */
   2449	vga_w(cinfo->regbase, VGA_ATT_IW, 0x00);
   2450}
   2451
   2452/*** WHDR() - write into the Hidden DAC register ***/
   2453/* as the HDR is the only extension register that requires special treatment
   2454 * (the other extension registers are accessible just like the "ordinary"
   2455 * registers of their functional group) here is a specialized routine for
   2456 * accessing the HDR
   2457 */
   2458static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val)
   2459{
   2460	if (is_laguna(cinfo))
   2461		return;
   2462	if (cinfo->btype == BT_PICASSO) {
   2463		/* Klaus' hint for correct access to HDR on some boards */
   2464		/* first write 0 to pixel mask (3c6) */
   2465		WGen(cinfo, VGA_PEL_MSK, 0x00);
   2466		udelay(200);
   2467		/* next read dummy from pixel address (3c8) */
   2468		RGen(cinfo, VGA_PEL_IW);
   2469		udelay(200);
   2470	}
   2471	/* now do the usual stuff to access the HDR */
   2472
   2473	RGen(cinfo, VGA_PEL_MSK);
   2474	udelay(200);
   2475	RGen(cinfo, VGA_PEL_MSK);
   2476	udelay(200);
   2477	RGen(cinfo, VGA_PEL_MSK);
   2478	udelay(200);
   2479	RGen(cinfo, VGA_PEL_MSK);
   2480	udelay(200);
   2481
   2482	WGen(cinfo, VGA_PEL_MSK, val);
   2483	udelay(200);
   2484
   2485	if (cinfo->btype == BT_PICASSO) {
   2486		/* now first reset HDR access counter */
   2487		RGen(cinfo, VGA_PEL_IW);
   2488		udelay(200);
   2489
   2490		/* and at the end, restore the mask value */
   2491		/* ## is this mask always 0xff? */
   2492		WGen(cinfo, VGA_PEL_MSK, 0xff);
   2493		udelay(200);
   2494	}
   2495}
   2496
   2497/*** WSFR() - write to the "special function register" (SFR) ***/
   2498static void WSFR(struct cirrusfb_info *cinfo, unsigned char val)
   2499{
   2500#ifdef CONFIG_ZORRO
   2501	assert(cinfo->regbase != NULL);
   2502	cinfo->SFR = val;
   2503	z_writeb(val, cinfo->regbase + 0x8000);
   2504#endif
   2505}
   2506
   2507/* The Picasso has a second register for switching the monitor bit */
   2508static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val)
   2509{
   2510#ifdef CONFIG_ZORRO
   2511	/* writing an arbitrary value to this one causes the monitor switcher */
   2512	/* to flip to Amiga display */
   2513	assert(cinfo->regbase != NULL);
   2514	cinfo->SFR = val;
   2515	z_writeb(val, cinfo->regbase + 0x9000);
   2516#endif
   2517}
   2518
   2519/*** WClut - set CLUT entry (range: 0..63) ***/
   2520static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char red,
   2521	    unsigned char green, unsigned char blue)
   2522{
   2523	unsigned int data = VGA_PEL_D;
   2524
   2525	/* address write mode register is not translated.. */
   2526	vga_w(cinfo->regbase, VGA_PEL_IW, regnum);
   2527
   2528	if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 ||
   2529	    cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480 ||
   2530	    cinfo->btype == BT_SD64 || is_laguna(cinfo)) {
   2531		/* but DAC data register IS, at least for Picasso II */
   2532		if (cinfo->btype == BT_PICASSO)
   2533			data += 0xfff;
   2534		vga_w(cinfo->regbase, data, red);
   2535		vga_w(cinfo->regbase, data, green);
   2536		vga_w(cinfo->regbase, data, blue);
   2537	} else {
   2538		vga_w(cinfo->regbase, data, blue);
   2539		vga_w(cinfo->regbase, data, green);
   2540		vga_w(cinfo->regbase, data, red);
   2541	}
   2542}
   2543
   2544#if 0
   2545/*** RClut - read CLUT entry (range 0..63) ***/
   2546static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char *red,
   2547	    unsigned char *green, unsigned char *blue)
   2548{
   2549	unsigned int data = VGA_PEL_D;
   2550
   2551	vga_w(cinfo->regbase, VGA_PEL_IR, regnum);
   2552
   2553	if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 ||
   2554	    cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480) {
   2555		if (cinfo->btype == BT_PICASSO)
   2556			data += 0xfff;
   2557		*red = vga_r(cinfo->regbase, data);
   2558		*green = vga_r(cinfo->regbase, data);
   2559		*blue = vga_r(cinfo->regbase, data);
   2560	} else {
   2561		*blue = vga_r(cinfo->regbase, data);
   2562		*green = vga_r(cinfo->regbase, data);
   2563		*red = vga_r(cinfo->regbase, data);
   2564	}
   2565}
   2566#endif
   2567
   2568/*******************************************************************
   2569	cirrusfb_WaitBLT()
   2570
   2571	Wait for the BitBLT engine to complete a possible earlier job
   2572*********************************************************************/
   2573
   2574/* FIXME: use interrupts instead */
   2575static void cirrusfb_WaitBLT(u8 __iomem *regbase)
   2576{
   2577	while (vga_rgfx(regbase, CL_GR31) & 0x08)
   2578		cpu_relax();
   2579}
   2580
   2581/*******************************************************************
   2582	cirrusfb_BitBLT()
   2583
   2584	perform accelerated "scrolling"
   2585********************************************************************/
   2586
   2587static void cirrusfb_set_blitter(u8 __iomem *regbase,
   2588			    u_short nwidth, u_short nheight,
   2589			    u_long nsrc, u_long ndest,
   2590			    u_short bltmode, u_short line_length)
   2591
   2592{
   2593	/* pitch: set to line_length */
   2594	/* dest pitch low */
   2595	vga_wgfx(regbase, CL_GR24, line_length & 0xff);
   2596	/* dest pitch hi */
   2597	vga_wgfx(regbase, CL_GR25, line_length >> 8);
   2598	/* source pitch low */
   2599	vga_wgfx(regbase, CL_GR26, line_length & 0xff);
   2600	/* source pitch hi */
   2601	vga_wgfx(regbase, CL_GR27, line_length >> 8);
   2602
   2603	/* BLT width: actual number of pixels - 1 */
   2604	/* BLT width low */
   2605	vga_wgfx(regbase, CL_GR20, nwidth & 0xff);
   2606	/* BLT width hi */
   2607	vga_wgfx(regbase, CL_GR21, nwidth >> 8);
   2608
   2609	/* BLT height: actual number of lines -1 */
   2610	/* BLT height low */
   2611	vga_wgfx(regbase, CL_GR22, nheight & 0xff);
   2612	/* BLT width hi */
   2613	vga_wgfx(regbase, CL_GR23, nheight >> 8);
   2614
   2615	/* BLT destination */
   2616	/* BLT dest low */
   2617	vga_wgfx(regbase, CL_GR28, (u_char) (ndest & 0xff));
   2618	/* BLT dest mid */
   2619	vga_wgfx(regbase, CL_GR29, (u_char) (ndest >> 8));
   2620	/* BLT dest hi */
   2621	vga_wgfx(regbase, CL_GR2A, (u_char) (ndest >> 16));
   2622
   2623	/* BLT source */
   2624	/* BLT src low */
   2625	vga_wgfx(regbase, CL_GR2C, (u_char) (nsrc & 0xff));
   2626	/* BLT src mid */
   2627	vga_wgfx(regbase, CL_GR2D, (u_char) (nsrc >> 8));
   2628	/* BLT src hi */
   2629	vga_wgfx(regbase, CL_GR2E, (u_char) (nsrc >> 16));
   2630
   2631	/* BLT mode */
   2632	vga_wgfx(regbase, CL_GR30, bltmode);	/* BLT mode */
   2633
   2634	/* BLT ROP: SrcCopy */
   2635	vga_wgfx(regbase, CL_GR32, 0x0d);	/* BLT ROP */
   2636
   2637	/* and finally: GO! */
   2638	vga_wgfx(regbase, CL_GR31, 0x02);	/* BLT Start/status */
   2639}
   2640
   2641/*******************************************************************
   2642	cirrusfb_BitBLT()
   2643
   2644	perform accelerated "scrolling"
   2645********************************************************************/
   2646
   2647static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel,
   2648			    u_short curx, u_short cury,
   2649			    u_short destx, u_short desty,
   2650			    u_short width, u_short height,
   2651			    u_short line_length)
   2652{
   2653	u_short nwidth = width - 1;
   2654	u_short nheight = height - 1;
   2655	u_long nsrc, ndest;
   2656	u_char bltmode;
   2657
   2658	bltmode = 0x00;
   2659	/* if source adr < dest addr, do the Blt backwards */
   2660	if (cury <= desty) {
   2661		if (cury == desty) {
   2662			/* if src and dest are on the same line, check x */
   2663			if (curx < destx)
   2664				bltmode |= 0x01;
   2665		} else
   2666			bltmode |= 0x01;
   2667	}
   2668	/* standard case: forward blitting */
   2669	nsrc = (cury * line_length) + curx;
   2670	ndest = (desty * line_length) + destx;
   2671	if (bltmode) {
   2672		/* this means start addresses are at the end,
   2673		 * counting backwards
   2674		 */
   2675		nsrc += nheight * line_length + nwidth;
   2676		ndest += nheight * line_length + nwidth;
   2677	}
   2678
   2679	cirrusfb_WaitBLT(regbase);
   2680
   2681	cirrusfb_set_blitter(regbase, nwidth, nheight,
   2682			    nsrc, ndest, bltmode, line_length);
   2683}
   2684
   2685/*******************************************************************
   2686	cirrusfb_RectFill()
   2687
   2688	perform accelerated rectangle fill
   2689********************************************************************/
   2690
   2691static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel,
   2692		     u_short x, u_short y, u_short width, u_short height,
   2693		     u32 fg_color, u32 bg_color, u_short line_length,
   2694		     u_char blitmode)
   2695{
   2696	u_long ndest = (y * line_length) + x;
   2697	u_char op;
   2698
   2699	cirrusfb_WaitBLT(regbase);
   2700
   2701	/* This is a ColorExpand Blt, using the */
   2702	/* same color for foreground and background */
   2703	vga_wgfx(regbase, VGA_GFX_SR_VALUE, bg_color);
   2704	vga_wgfx(regbase, VGA_GFX_SR_ENABLE, fg_color);
   2705
   2706	op = 0x80;
   2707	if (bits_per_pixel >= 16) {
   2708		vga_wgfx(regbase, CL_GR10, bg_color >> 8);
   2709		vga_wgfx(regbase, CL_GR11, fg_color >> 8);
   2710		op = 0x90;
   2711	}
   2712	if (bits_per_pixel >= 24) {
   2713		vga_wgfx(regbase, CL_GR12, bg_color >> 16);
   2714		vga_wgfx(regbase, CL_GR13, fg_color >> 16);
   2715		op = 0xa0;
   2716	}
   2717	if (bits_per_pixel == 32) {
   2718		vga_wgfx(regbase, CL_GR14, bg_color >> 24);
   2719		vga_wgfx(regbase, CL_GR15, fg_color >> 24);
   2720		op = 0xb0;
   2721	}
   2722	cirrusfb_set_blitter(regbase, width - 1, height - 1,
   2723			    0, ndest, op | blitmode, line_length);
   2724}
   2725
   2726/**************************************************************************
   2727 * bestclock() - determine closest possible clock lower(?) than the
   2728 * desired pixel clock
   2729 **************************************************************************/
   2730static void bestclock(long freq, int *nom, int *den, int *div)
   2731{
   2732	int n, d;
   2733	long h, diff;
   2734
   2735	assert(nom != NULL);
   2736	assert(den != NULL);
   2737	assert(div != NULL);
   2738
   2739	*nom = 0;
   2740	*den = 0;
   2741	*div = 0;
   2742
   2743	if (freq < 8000)
   2744		freq = 8000;
   2745
   2746	diff = freq;
   2747
   2748	for (n = 32; n < 128; n++) {
   2749		int s = 0;
   2750
   2751		d = (14318 * n) / freq;
   2752		if ((d >= 7) && (d <= 63)) {
   2753			int temp = d;
   2754
   2755			if (temp > 31) {
   2756				s = 1;
   2757				temp >>= 1;
   2758			}
   2759			h = ((14318 * n) / temp) >> s;
   2760			h = h > freq ? h - freq : freq - h;
   2761			if (h < diff) {
   2762				diff = h;
   2763				*nom = n;
   2764				*den = temp;
   2765				*div = s;
   2766			}
   2767		}
   2768		d++;
   2769		if ((d >= 7) && (d <= 63)) {
   2770			if (d > 31) {
   2771				s = 1;
   2772				d >>= 1;
   2773			}
   2774			h = ((14318 * n) / d) >> s;
   2775			h = h > freq ? h - freq : freq - h;
   2776			if (h < diff) {
   2777				diff = h;
   2778				*nom = n;
   2779				*den = d;
   2780				*div = s;
   2781			}
   2782		}
   2783	}
   2784}
   2785
   2786/* -------------------------------------------------------------------------
   2787 *
   2788 * debugging functions
   2789 *
   2790 * -------------------------------------------------------------------------
   2791 */
   2792
   2793#ifdef CIRRUSFB_DEBUG
   2794
   2795/*
   2796 * cirrusfb_dbg_print_regs
   2797 * @regbase: If using newmmio, the newmmio base address, otherwise %NULL
   2798 * @reg_class: type of registers to read: %CRT, or %SEQ
   2799 *
   2800 * DESCRIPTION:
   2801 * Dumps the given list of VGA CRTC registers.  If @base is %NULL,
   2802 * old-style I/O ports are queried for information, otherwise MMIO is
   2803 * used at the given @base address to query the information.
   2804 */
   2805
   2806static void cirrusfb_dbg_print_regs(struct fb_info *info,
   2807				    caddr_t regbase,
   2808				    enum cirrusfb_dbg_reg_class reg_class, ...)
   2809{
   2810	va_list list;
   2811	unsigned char val = 0;
   2812	unsigned reg;
   2813	char *name;
   2814
   2815	va_start(list, reg_class);
   2816
   2817	name = va_arg(list, char *);
   2818	while (name != NULL) {
   2819		reg = va_arg(list, int);
   2820
   2821		switch (reg_class) {
   2822		case CRT:
   2823			val = vga_rcrt(regbase, (unsigned char) reg);
   2824			break;
   2825		case SEQ:
   2826			val = vga_rseq(regbase, (unsigned char) reg);
   2827			break;
   2828		default:
   2829			/* should never occur */
   2830			assert(false);
   2831			break;
   2832		}
   2833
   2834		dev_dbg(info->device, "%8s = 0x%02X\n", name, val);
   2835
   2836		name = va_arg(list, char *);
   2837	}
   2838
   2839	va_end(list);
   2840}
   2841
   2842/*
   2843 * cirrusfb_dbg_reg_dump
   2844 * @base: If using newmmio, the newmmio base address, otherwise %NULL
   2845 *
   2846 * DESCRIPTION:
   2847 * Dumps a list of interesting VGA and CIRRUSFB registers.  If @base is %NULL,
   2848 * old-style I/O ports are queried for information, otherwise MMIO is
   2849 * used at the given @base address to query the information.
   2850 */
   2851
   2852static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase)
   2853{
   2854	dev_dbg(info->device, "VGA CRTC register dump:\n");
   2855
   2856	cirrusfb_dbg_print_regs(info, regbase, CRT,
   2857			   "CR00", 0x00,
   2858			   "CR01", 0x01,
   2859			   "CR02", 0x02,
   2860			   "CR03", 0x03,
   2861			   "CR04", 0x04,
   2862			   "CR05", 0x05,
   2863			   "CR06", 0x06,
   2864			   "CR07", 0x07,
   2865			   "CR08", 0x08,
   2866			   "CR09", 0x09,
   2867			   "CR0A", 0x0A,
   2868			   "CR0B", 0x0B,
   2869			   "CR0C", 0x0C,
   2870			   "CR0D", 0x0D,
   2871			   "CR0E", 0x0E,
   2872			   "CR0F", 0x0F,
   2873			   "CR10", 0x10,
   2874			   "CR11", 0x11,
   2875			   "CR12", 0x12,
   2876			   "CR13", 0x13,
   2877			   "CR14", 0x14,
   2878			   "CR15", 0x15,
   2879			   "CR16", 0x16,
   2880			   "CR17", 0x17,
   2881			   "CR18", 0x18,
   2882			   "CR22", 0x22,
   2883			   "CR24", 0x24,
   2884			   "CR26", 0x26,
   2885			   "CR2D", 0x2D,
   2886			   "CR2E", 0x2E,
   2887			   "CR2F", 0x2F,
   2888			   "CR30", 0x30,
   2889			   "CR31", 0x31,
   2890			   "CR32", 0x32,
   2891			   "CR33", 0x33,
   2892			   "CR34", 0x34,
   2893			   "CR35", 0x35,
   2894			   "CR36", 0x36,
   2895			   "CR37", 0x37,
   2896			   "CR38", 0x38,
   2897			   "CR39", 0x39,
   2898			   "CR3A", 0x3A,
   2899			   "CR3B", 0x3B,
   2900			   "CR3C", 0x3C,
   2901			   "CR3D", 0x3D,
   2902			   "CR3E", 0x3E,
   2903			   "CR3F", 0x3F,
   2904			   NULL);
   2905
   2906	dev_dbg(info->device, "\n");
   2907
   2908	dev_dbg(info->device, "VGA SEQ register dump:\n");
   2909
   2910	cirrusfb_dbg_print_regs(info, regbase, SEQ,
   2911			   "SR00", 0x00,
   2912			   "SR01", 0x01,
   2913			   "SR02", 0x02,
   2914			   "SR03", 0x03,
   2915			   "SR04", 0x04,
   2916			   "SR08", 0x08,
   2917			   "SR09", 0x09,
   2918			   "SR0A", 0x0A,
   2919			   "SR0B", 0x0B,
   2920			   "SR0D", 0x0D,
   2921			   "SR10", 0x10,
   2922			   "SR11", 0x11,
   2923			   "SR12", 0x12,
   2924			   "SR13", 0x13,
   2925			   "SR14", 0x14,
   2926			   "SR15", 0x15,
   2927			   "SR16", 0x16,
   2928			   "SR17", 0x17,
   2929			   "SR18", 0x18,
   2930			   "SR19", 0x19,
   2931			   "SR1A", 0x1A,
   2932			   "SR1B", 0x1B,
   2933			   "SR1C", 0x1C,
   2934			   "SR1D", 0x1D,
   2935			   "SR1E", 0x1E,
   2936			   "SR1F", 0x1F,
   2937			   NULL);
   2938
   2939	dev_dbg(info->device, "\n");
   2940}
   2941
   2942#endif				/* CIRRUSFB_DEBUG */
   2943