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

radeon_base.c (78923B)


      1/*
      2 *	drivers/video/aty/radeon_base.c
      3 *
      4 *	framebuffer driver for ATI Radeon chipset video boards
      5 *
      6 *	Copyright 2003	Ben. Herrenschmidt <benh@kernel.crashing.org>
      7 *	Copyright 2000	Ani Joshi <ajoshi@kernel.crashing.org>
      8 *
      9 *	i2c bits from Luca Tettamanti <kronos@kronoz.cjb.net>
     10 *	
     11 *	Special thanks to ATI DevRel team for their hardware donations.
     12 *
     13 *	...Insert GPL boilerplate here...
     14 *
     15 *	Significant portions of this driver apdated from XFree86 Radeon
     16 *	driver which has the following copyright notice:
     17 *
     18 *	Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
     19 *                     VA Linux Systems Inc., Fremont, California.
     20 *
     21 *	All Rights Reserved.
     22 *
     23 *	Permission is hereby granted, free of charge, to any person obtaining
     24 *	a copy of this software and associated documentation files (the
     25 *	"Software"), to deal in the Software without restriction, including
     26 *	without limitation on the rights to use, copy, modify, merge,
     27 *	publish, distribute, sublicense, and/or sell copies of the Software,
     28 *	and to permit persons to whom the Software is furnished to do so,
     29 *	subject to the following conditions:
     30 *
     31 *	The above copyright notice and this permission notice (including the
     32 *	next paragraph) shall be included in all copies or substantial
     33 *	portions of the Software.
     34 *
     35 *	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     36 * 	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     37 *	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     38 *	NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
     39 *	THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     40 *	WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     41 *	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     42 *	DEALINGS IN THE SOFTWARE.
     43 *
     44 *	XFree86 driver authors:
     45 *
     46 *	   Kevin E. Martin <martin@xfree86.org>
     47 *	   Rickard E. Faith <faith@valinux.com>
     48 *	   Alan Hourihane <alanh@fairlite.demon.co.uk>
     49 *
     50 */
     51
     52
     53#define RADEON_VERSION	"0.2.0"
     54
     55#include "radeonfb.h"
     56
     57#include <linux/module.h>
     58#include <linux/moduleparam.h>
     59#include <linux/kernel.h>
     60#include <linux/errno.h>
     61#include <linux/string.h>
     62#include <linux/ctype.h>
     63#include <linux/mm.h>
     64#include <linux/slab.h>
     65#include <linux/delay.h>
     66#include <linux/time.h>
     67#include <linux/fb.h>
     68#include <linux/ioport.h>
     69#include <linux/init.h>
     70#include <linux/pci.h>
     71#include <linux/vmalloc.h>
     72#include <linux/device.h>
     73
     74#include <asm/io.h>
     75#include <linux/uaccess.h>
     76
     77#ifdef CONFIG_PPC
     78
     79#include "../macmodes.h"
     80
     81#ifdef CONFIG_BOOTX_TEXT
     82#include <asm/btext.h>
     83#endif
     84
     85#endif /* CONFIG_PPC */
     86
     87#include <video/radeon.h>
     88#include <linux/radeonfb.h>
     89
     90#include "../edid.h" // MOVE THAT TO include/video
     91#include "ati_ids.h"
     92
     93#define MAX_MAPPED_VRAM	(2048*2048*4)
     94#define MIN_MAPPED_VRAM	(1024*768*1)
     95
     96#define CHIP_DEF(id, family, flags)					\
     97	{ PCI_VENDOR_ID_ATI, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (flags) | (CHIP_FAMILY_##family) }
     98
     99static const struct pci_device_id radeonfb_pci_table[] = {
    100        /* Radeon Xpress 200m */
    101	CHIP_DEF(PCI_CHIP_RS480_5955,   RS480,  CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    102	CHIP_DEF(PCI_CHIP_RS482_5975,	RS480,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    103	/* Mobility M6 */
    104	CHIP_DEF(PCI_CHIP_RADEON_LY, 	RV100,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    105	CHIP_DEF(PCI_CHIP_RADEON_LZ,	RV100,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    106	/* Radeon VE/7000 */
    107	CHIP_DEF(PCI_CHIP_RV100_QY, 	RV100,	CHIP_HAS_CRTC2),
    108	CHIP_DEF(PCI_CHIP_RV100_QZ, 	RV100,	CHIP_HAS_CRTC2),
    109	CHIP_DEF(PCI_CHIP_RN50,		RV100,	CHIP_HAS_CRTC2),
    110	/* Radeon IGP320M (U1) */
    111	CHIP_DEF(PCI_CHIP_RS100_4336,	RS100,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    112	/* Radeon IGP320 (A3) */
    113	CHIP_DEF(PCI_CHIP_RS100_4136,	RS100,	CHIP_HAS_CRTC2 | CHIP_IS_IGP), 
    114	/* IGP330M/340M/350M (U2) */
    115	CHIP_DEF(PCI_CHIP_RS200_4337,	RS200,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    116	/* IGP330/340/350 (A4) */
    117	CHIP_DEF(PCI_CHIP_RS200_4137,	RS200,	CHIP_HAS_CRTC2 | CHIP_IS_IGP),
    118	/* Mobility 7000 IGP */
    119	CHIP_DEF(PCI_CHIP_RS250_4437,	RS200,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    120	/* 7000 IGP (A4+) */
    121	CHIP_DEF(PCI_CHIP_RS250_4237,	RS200,	CHIP_HAS_CRTC2 | CHIP_IS_IGP),
    122	/* 8500 AIW */
    123	CHIP_DEF(PCI_CHIP_R200_BB,	R200,	CHIP_HAS_CRTC2),
    124	CHIP_DEF(PCI_CHIP_R200_BC,	R200,	CHIP_HAS_CRTC2),
    125	/* 8700/8800 */
    126	CHIP_DEF(PCI_CHIP_R200_QH,	R200,	CHIP_HAS_CRTC2),
    127	/* 8500 */
    128	CHIP_DEF(PCI_CHIP_R200_QL,	R200,	CHIP_HAS_CRTC2),
    129	/* 9100 */
    130	CHIP_DEF(PCI_CHIP_R200_QM,	R200,	CHIP_HAS_CRTC2),
    131	/* Mobility M7 */
    132	CHIP_DEF(PCI_CHIP_RADEON_LW,	RV200,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    133	CHIP_DEF(PCI_CHIP_RADEON_LX,	RV200,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    134	/* 7500 */
    135	CHIP_DEF(PCI_CHIP_RV200_QW,	RV200,	CHIP_HAS_CRTC2),
    136	CHIP_DEF(PCI_CHIP_RV200_QX,	RV200,	CHIP_HAS_CRTC2),
    137	/* Mobility M9 */
    138	CHIP_DEF(PCI_CHIP_RV250_Ld,	RV250,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    139	CHIP_DEF(PCI_CHIP_RV250_Le,	RV250,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    140	CHIP_DEF(PCI_CHIP_RV250_Lf,	RV250,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    141	CHIP_DEF(PCI_CHIP_RV250_Lg,	RV250,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    142	/* 9000/Pro */
    143	CHIP_DEF(PCI_CHIP_RV250_If,	RV250,	CHIP_HAS_CRTC2),
    144	CHIP_DEF(PCI_CHIP_RV250_Ig,	RV250,	CHIP_HAS_CRTC2),
    145
    146	CHIP_DEF(PCI_CHIP_RC410_5A62,   RC410,  CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    147	/* Mobility 9100 IGP (U3) */
    148	CHIP_DEF(PCI_CHIP_RS300_5835,	RS300,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    149	CHIP_DEF(PCI_CHIP_RS350_7835,	RS300,	CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
    150	/* 9100 IGP (A5) */
    151	CHIP_DEF(PCI_CHIP_RS300_5834,	RS300,	CHIP_HAS_CRTC2 | CHIP_IS_IGP),
    152	CHIP_DEF(PCI_CHIP_RS350_7834,	RS300,	CHIP_HAS_CRTC2 | CHIP_IS_IGP),
    153	/* Mobility 9200 (M9+) */
    154	CHIP_DEF(PCI_CHIP_RV280_5C61,	RV280,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    155	CHIP_DEF(PCI_CHIP_RV280_5C63,	RV280,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    156	/* 9200 */
    157	CHIP_DEF(PCI_CHIP_RV280_5960,	RV280,	CHIP_HAS_CRTC2),
    158	CHIP_DEF(PCI_CHIP_RV280_5961,	RV280,	CHIP_HAS_CRTC2),
    159	CHIP_DEF(PCI_CHIP_RV280_5962,	RV280,	CHIP_HAS_CRTC2),
    160	CHIP_DEF(PCI_CHIP_RV280_5964,	RV280,	CHIP_HAS_CRTC2),
    161	/* 9500 */
    162	CHIP_DEF(PCI_CHIP_R300_AD,	R300,	CHIP_HAS_CRTC2),
    163	CHIP_DEF(PCI_CHIP_R300_AE,	R300,	CHIP_HAS_CRTC2),
    164	/* 9600TX / FireGL Z1 */
    165	CHIP_DEF(PCI_CHIP_R300_AF,	R300,	CHIP_HAS_CRTC2),
    166	CHIP_DEF(PCI_CHIP_R300_AG,	R300,	CHIP_HAS_CRTC2),
    167	/* 9700/9500/Pro/FireGL X1 */
    168	CHIP_DEF(PCI_CHIP_R300_ND,	R300,	CHIP_HAS_CRTC2),
    169	CHIP_DEF(PCI_CHIP_R300_NE,	R300,	CHIP_HAS_CRTC2),
    170	CHIP_DEF(PCI_CHIP_R300_NF,	R300,	CHIP_HAS_CRTC2),
    171	CHIP_DEF(PCI_CHIP_R300_NG,	R300,	CHIP_HAS_CRTC2),
    172	/* Mobility M10/M11 */
    173	CHIP_DEF(PCI_CHIP_RV350_NP,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    174	CHIP_DEF(PCI_CHIP_RV350_NQ,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    175	CHIP_DEF(PCI_CHIP_RV350_NR,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    176	CHIP_DEF(PCI_CHIP_RV350_NS,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    177	CHIP_DEF(PCI_CHIP_RV350_NT,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    178	CHIP_DEF(PCI_CHIP_RV350_NV,	RV350,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    179	/* 9600/FireGL T2 */
    180	CHIP_DEF(PCI_CHIP_RV350_AP,	RV350,	CHIP_HAS_CRTC2),
    181	CHIP_DEF(PCI_CHIP_RV350_AQ,	RV350,	CHIP_HAS_CRTC2),
    182	CHIP_DEF(PCI_CHIP_RV360_AR,	RV350,	CHIP_HAS_CRTC2),
    183	CHIP_DEF(PCI_CHIP_RV350_AS,	RV350,	CHIP_HAS_CRTC2),
    184	CHIP_DEF(PCI_CHIP_RV350_AT,	RV350,	CHIP_HAS_CRTC2),
    185	CHIP_DEF(PCI_CHIP_RV350_AV,	RV350,	CHIP_HAS_CRTC2),
    186	/* 9800/Pro/FileGL X2 */
    187	CHIP_DEF(PCI_CHIP_R350_AH,	R350,	CHIP_HAS_CRTC2),
    188	CHIP_DEF(PCI_CHIP_R350_AI,	R350,	CHIP_HAS_CRTC2),
    189	CHIP_DEF(PCI_CHIP_R350_AJ,	R350,	CHIP_HAS_CRTC2),
    190	CHIP_DEF(PCI_CHIP_R350_AK,	R350,	CHIP_HAS_CRTC2),
    191	CHIP_DEF(PCI_CHIP_R350_NH,	R350,	CHIP_HAS_CRTC2),
    192	CHIP_DEF(PCI_CHIP_R350_NI,	R350,	CHIP_HAS_CRTC2),
    193	CHIP_DEF(PCI_CHIP_R360_NJ,	R350,	CHIP_HAS_CRTC2),
    194	CHIP_DEF(PCI_CHIP_R350_NK,	R350,	CHIP_HAS_CRTC2),
    195	/* Newer stuff */
    196	CHIP_DEF(PCI_CHIP_RV380_3E50,	RV380,	CHIP_HAS_CRTC2),
    197	CHIP_DEF(PCI_CHIP_RV380_3E54,	RV380,	CHIP_HAS_CRTC2),
    198	CHIP_DEF(PCI_CHIP_RV380_3150,	RV380,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    199	CHIP_DEF(PCI_CHIP_RV380_3154,	RV380,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    200	CHIP_DEF(PCI_CHIP_RV370_5B60,	RV380,	CHIP_HAS_CRTC2),
    201	CHIP_DEF(PCI_CHIP_RV370_5B62,	RV380,	CHIP_HAS_CRTC2),
    202	CHIP_DEF(PCI_CHIP_RV370_5B63,	RV380,	CHIP_HAS_CRTC2),
    203	CHIP_DEF(PCI_CHIP_RV370_5B64,	RV380,	CHIP_HAS_CRTC2),
    204	CHIP_DEF(PCI_CHIP_RV370_5B65,	RV380,	CHIP_HAS_CRTC2),
    205	CHIP_DEF(PCI_CHIP_RV370_5460,	RV380,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    206	CHIP_DEF(PCI_CHIP_RV370_5464,	RV380,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    207	CHIP_DEF(PCI_CHIP_R420_JH,	R420,	CHIP_HAS_CRTC2),
    208	CHIP_DEF(PCI_CHIP_R420_JI,	R420,	CHIP_HAS_CRTC2),
    209	CHIP_DEF(PCI_CHIP_R420_JJ,	R420,	CHIP_HAS_CRTC2),
    210	CHIP_DEF(PCI_CHIP_R420_JK,	R420,	CHIP_HAS_CRTC2),
    211	CHIP_DEF(PCI_CHIP_R420_JL,	R420,	CHIP_HAS_CRTC2),
    212	CHIP_DEF(PCI_CHIP_R420_JM,	R420,	CHIP_HAS_CRTC2),
    213	CHIP_DEF(PCI_CHIP_R420_JN,	R420,	CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
    214	CHIP_DEF(PCI_CHIP_R420_JP,	R420,	CHIP_HAS_CRTC2),
    215	CHIP_DEF(PCI_CHIP_R423_UH,	R420,	CHIP_HAS_CRTC2),
    216	CHIP_DEF(PCI_CHIP_R423_UI,	R420,	CHIP_HAS_CRTC2),
    217	CHIP_DEF(PCI_CHIP_R423_UJ,	R420,	CHIP_HAS_CRTC2),
    218	CHIP_DEF(PCI_CHIP_R423_UK,	R420,	CHIP_HAS_CRTC2),
    219	CHIP_DEF(PCI_CHIP_R423_UQ,	R420,	CHIP_HAS_CRTC2),
    220	CHIP_DEF(PCI_CHIP_R423_UR,	R420,	CHIP_HAS_CRTC2),
    221	CHIP_DEF(PCI_CHIP_R423_UT,	R420,	CHIP_HAS_CRTC2),
    222	CHIP_DEF(PCI_CHIP_R423_5D57,	R420,	CHIP_HAS_CRTC2),
    223	/* Original Radeon/7200 */
    224	CHIP_DEF(PCI_CHIP_RADEON_QD,	RADEON,	0),
    225	CHIP_DEF(PCI_CHIP_RADEON_QE,	RADEON,	0),
    226	CHIP_DEF(PCI_CHIP_RADEON_QF,	RADEON,	0),
    227	CHIP_DEF(PCI_CHIP_RADEON_QG,	RADEON,	0),
    228	{ 0, }
    229};
    230MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
    231
    232
    233typedef struct {
    234	u16 reg;
    235	u32 val;
    236} reg_val;
    237
    238
    239/* these common regs are cleared before mode setting so they do not
    240 * interfere with anything
    241 */
    242static reg_val common_regs[] = {
    243	{ OVR_CLR, 0 },	
    244	{ OVR_WID_LEFT_RIGHT, 0 },
    245	{ OVR_WID_TOP_BOTTOM, 0 },
    246	{ OV0_SCALE_CNTL, 0 },
    247	{ SUBPIC_CNTL, 0 },
    248	{ VIPH_CONTROL, 0 },
    249	{ I2C_CNTL_1, 0 },
    250	{ GEN_INT_CNTL, 0 },
    251	{ CAP0_TRIG_CNTL, 0 },
    252	{ CAP1_TRIG_CNTL, 0 },
    253};
    254
    255/*
    256 * globals
    257 */
    258        
    259static char *mode_option;
    260static char *monitor_layout;
    261static bool noaccel = 0;
    262static int default_dynclk = -2;
    263static bool nomodeset = 0;
    264static bool ignore_edid = 0;
    265static bool mirror = 0;
    266static int panel_yres = 0;
    267static bool force_dfp = 0;
    268static bool force_measure_pll = 0;
    269static bool nomtrr = 0;
    270static bool force_sleep;
    271static bool ignore_devlist;
    272static int backlight = IS_BUILTIN(CONFIG_PMAC_BACKLIGHT);
    273
    274/* Note about this function: we have some rare cases where we must not schedule,
    275 * this typically happen with our special "wake up early" hook which allows us to
    276 * wake up the graphic chip (and thus get the console back) before everything else
    277 * on some machines that support that mechanism. At this point, interrupts are off
    278 * and scheduling is not permitted
    279 */
    280void _radeon_msleep(struct radeonfb_info *rinfo, unsigned long ms)
    281{
    282	if (rinfo->no_schedule || oops_in_progress)
    283		mdelay(ms);
    284	else
    285		msleep(ms);
    286}
    287
    288void radeon_pll_errata_after_index_slow(struct radeonfb_info *rinfo)
    289{
    290	/* Called if (rinfo->errata & CHIP_ERRATA_PLL_DUMMYREADS) is set */
    291	(void)INREG(CLOCK_CNTL_DATA);
    292	(void)INREG(CRTC_GEN_CNTL);
    293}
    294
    295void radeon_pll_errata_after_data_slow(struct radeonfb_info *rinfo)
    296{
    297	if (rinfo->errata & CHIP_ERRATA_PLL_DELAY) {
    298		/* we can't deal with posted writes here ... */
    299		_radeon_msleep(rinfo, 5);
    300	}
    301	if (rinfo->errata & CHIP_ERRATA_R300_CG) {
    302		u32 save, tmp;
    303		save = INREG(CLOCK_CNTL_INDEX);
    304		tmp = save & ~(0x3f | PLL_WR_EN);
    305		OUTREG(CLOCK_CNTL_INDEX, tmp);
    306		tmp = INREG(CLOCK_CNTL_DATA);
    307		OUTREG(CLOCK_CNTL_INDEX, save);
    308	}
    309}
    310
    311void _OUTREGP(struct radeonfb_info *rinfo, u32 addr, u32 val, u32 mask)
    312{
    313	unsigned long flags;
    314	unsigned int tmp;
    315
    316	spin_lock_irqsave(&rinfo->reg_lock, flags);
    317	tmp = INREG(addr);
    318	tmp &= (mask);
    319	tmp |= (val);
    320	OUTREG(addr, tmp);
    321	spin_unlock_irqrestore(&rinfo->reg_lock, flags);
    322}
    323
    324u32 __INPLL(struct radeonfb_info *rinfo, u32 addr)
    325{
    326	u32 data;
    327
    328	OUTREG8(CLOCK_CNTL_INDEX, addr & 0x0000003f);
    329	radeon_pll_errata_after_index(rinfo);
    330	data = INREG(CLOCK_CNTL_DATA);
    331	radeon_pll_errata_after_data(rinfo);
    332	return data;
    333}
    334
    335void __OUTPLL(struct radeonfb_info *rinfo, unsigned int index, u32 val)
    336{
    337	OUTREG8(CLOCK_CNTL_INDEX, (index & 0x0000003f) | 0x00000080);
    338	radeon_pll_errata_after_index(rinfo);
    339	OUTREG(CLOCK_CNTL_DATA, val);
    340	radeon_pll_errata_after_data(rinfo);
    341}
    342
    343void __OUTPLLP(struct radeonfb_info *rinfo, unsigned int index,
    344			     u32 val, u32 mask)
    345{
    346	unsigned int tmp;
    347
    348	tmp  = __INPLL(rinfo, index);
    349	tmp &= (mask);
    350	tmp |= (val);
    351	__OUTPLL(rinfo, index, tmp);
    352}
    353
    354void _radeon_fifo_wait(struct radeonfb_info *rinfo, int entries)
    355{
    356	int i;
    357
    358	for (i=0; i<2000000; i++) {
    359		if ((INREG(RBBM_STATUS) & 0x7f) >= entries)
    360			return;
    361		udelay(1);
    362	}
    363	printk(KERN_ERR "radeonfb: FIFO Timeout !\n");
    364}
    365
    366void radeon_engine_flush(struct radeonfb_info *rinfo)
    367{
    368	int i;
    369
    370	/* Initiate flush */
    371	OUTREGP(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL,
    372	        ~RB2D_DC_FLUSH_ALL);
    373
    374	/* Ensure FIFO is empty, ie, make sure the flush commands
    375	 * has reached the cache
    376	 */
    377	_radeon_fifo_wait(rinfo, 64);
    378
    379	/* Wait for the flush to complete */
    380	for (i=0; i < 2000000; i++) {
    381		if (!(INREG(DSTCACHE_CTLSTAT) & RB2D_DC_BUSY))
    382			return;
    383		udelay(1);
    384	}
    385	printk(KERN_ERR "radeonfb: Flush Timeout !\n");
    386}
    387
    388void _radeon_engine_idle(struct radeonfb_info *rinfo)
    389{
    390	int i;
    391
    392	/* ensure FIFO is empty before waiting for idle */
    393	_radeon_fifo_wait(rinfo, 64);
    394
    395	for (i=0; i<2000000; i++) {
    396		if (((INREG(RBBM_STATUS) & GUI_ACTIVE)) == 0) {
    397			radeon_engine_flush(rinfo);
    398			return;
    399		}
    400		udelay(1);
    401	}
    402	printk(KERN_ERR "radeonfb: Idle Timeout !\n");
    403}
    404
    405
    406
    407static void radeon_unmap_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
    408{
    409	if (!rinfo->bios_seg)
    410		return;
    411	pci_unmap_rom(dev, rinfo->bios_seg);
    412}
    413
    414static int radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
    415{
    416	void __iomem *rom;
    417	u16 dptr;
    418	u8 rom_type;
    419	size_t rom_size;
    420
    421	/* If this is a primary card, there is a shadow copy of the
    422	 * ROM somewhere in the first meg. We will just ignore the copy
    423	 * and use the ROM directly.
    424	 */
    425    
    426    	/* Fix from ATI for problem with Radeon hardware not leaving ROM enabled */
    427    	unsigned int temp;
    428	temp = INREG(MPP_TB_CONFIG);
    429	temp &= 0x00ffffffu;
    430	temp |= 0x04 << 24;
    431	OUTREG(MPP_TB_CONFIG, temp);
    432	temp = INREG(MPP_TB_CONFIG);
    433                                                                                                          
    434	rom = pci_map_rom(dev, &rom_size);
    435	if (!rom) {
    436		printk(KERN_ERR "radeonfb (%s): ROM failed to map\n",
    437		       pci_name(rinfo->pdev));
    438		return -ENOMEM;
    439	}
    440	
    441	rinfo->bios_seg = rom;
    442
    443	/* Very simple test to make sure it appeared */
    444	if (BIOS_IN16(0) != 0xaa55) {
    445		printk(KERN_DEBUG "radeonfb (%s): Invalid ROM signature %x "
    446			"should be 0xaa55\n",
    447			pci_name(rinfo->pdev), BIOS_IN16(0));
    448		goto failed;
    449	}
    450	/* Look for the PCI data to check the ROM type */
    451	dptr = BIOS_IN16(0x18);
    452
    453	/* Check the PCI data signature. If it's wrong, we still assume a normal x86 ROM
    454	 * for now, until I've verified this works everywhere. The goal here is more
    455	 * to phase out Open Firmware images.
    456	 *
    457	 * Currently, we only look at the first PCI data, we could iteratre and deal with
    458	 * them all, and we should use fb_bios_start relative to start of image and not
    459	 * relative start of ROM, but so far, I never found a dual-image ATI card
    460	 *
    461	 * typedef struct {
    462	 * 	u32	signature;	+ 0x00
    463	 * 	u16	vendor;		+ 0x04
    464	 * 	u16	device;		+ 0x06
    465	 * 	u16	reserved_1;	+ 0x08
    466	 * 	u16	dlen;		+ 0x0a
    467	 * 	u8	drevision;	+ 0x0c
    468	 * 	u8	class_hi;	+ 0x0d
    469	 * 	u16	class_lo;	+ 0x0e
    470	 * 	u16	ilen;		+ 0x10
    471	 * 	u16	irevision;	+ 0x12
    472	 * 	u8	type;		+ 0x14
    473	 * 	u8	indicator;	+ 0x15
    474	 * 	u16	reserved_2;	+ 0x16
    475	 * } pci_data_t;
    476	 */
    477	if (BIOS_IN32(dptr) !=  (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P')) {
    478		printk(KERN_WARNING "radeonfb (%s): PCI DATA signature in ROM"
    479		       "incorrect: %08x\n", pci_name(rinfo->pdev), BIOS_IN32(dptr));
    480		goto anyway;
    481	}
    482	rom_type = BIOS_IN8(dptr + 0x14);
    483	switch(rom_type) {
    484	case 0:
    485		printk(KERN_INFO "radeonfb: Found Intel x86 BIOS ROM Image\n");
    486		break;
    487	case 1:
    488		printk(KERN_INFO "radeonfb: Found Open Firmware ROM Image\n");
    489		goto failed;
    490	case 2:
    491		printk(KERN_INFO "radeonfb: Found HP PA-RISC ROM Image\n");
    492		goto failed;
    493	default:
    494		printk(KERN_INFO "radeonfb: Found unknown type %d ROM Image\n", rom_type);
    495		goto failed;
    496	}
    497 anyway:
    498	/* Locate the flat panel infos, do some sanity checking !!! */
    499	rinfo->fp_bios_start = BIOS_IN16(0x48);
    500	return 0;
    501
    502 failed:
    503	rinfo->bios_seg = NULL;
    504	radeon_unmap_ROM(rinfo, dev);
    505	return -ENXIO;
    506}
    507
    508#ifdef CONFIG_X86
    509static int  radeon_find_mem_vbios(struct radeonfb_info *rinfo)
    510{
    511	/* I simplified this code as we used to miss the signatures in
    512	 * a lot of case. It's now closer to XFree, we just don't check
    513	 * for signatures at all... Something better will have to be done
    514	 * if we end up having conflicts
    515	 */
    516        u32  segstart;
    517	void __iomem *rom_base = NULL;
    518                                                
    519        for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
    520                rom_base = ioremap(segstart, 0x10000);
    521		if (rom_base == NULL)
    522			return -ENOMEM;
    523                if (readb(rom_base) == 0x55 && readb(rom_base + 1) == 0xaa)
    524	                break;
    525                iounmap(rom_base);
    526		rom_base = NULL;
    527        }
    528	if (rom_base == NULL)
    529		return -ENXIO;
    530
    531	/* Locate the flat panel infos, do some sanity checking !!! */
    532	rinfo->bios_seg = rom_base;
    533	rinfo->fp_bios_start = BIOS_IN16(0x48);
    534
    535	return 0;
    536}
    537#endif
    538
    539#if defined(CONFIG_PPC) || defined(CONFIG_SPARC)
    540/*
    541 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
    542 * tree. Hopefully, ATI OF driver is kind enough to fill these
    543 */
    544static int radeon_read_xtal_OF(struct radeonfb_info *rinfo)
    545{
    546	struct device_node *dp = rinfo->of_node;
    547	const u32 *val;
    548
    549	if (dp == NULL)
    550		return -ENODEV;
    551	val = of_get_property(dp, "ATY,RefCLK", NULL);
    552	if (!val || !*val) {
    553		printk(KERN_WARNING "radeonfb: No ATY,RefCLK property !\n");
    554		return -EINVAL;
    555	}
    556
    557	rinfo->pll.ref_clk = (*val) / 10;
    558
    559	val = of_get_property(dp, "ATY,SCLK", NULL);
    560	if (val && *val)
    561		rinfo->pll.sclk = (*val) / 10;
    562
    563	val = of_get_property(dp, "ATY,MCLK", NULL);
    564	if (val && *val)
    565		rinfo->pll.mclk = (*val) / 10;
    566
    567       	return 0;
    568}
    569#endif /* CONFIG_PPC || CONFIG_SPARC */
    570
    571/*
    572 * Read PLL infos from chip registers
    573 */
    574static int radeon_probe_pll_params(struct radeonfb_info *rinfo)
    575{
    576	unsigned char ppll_div_sel;
    577	unsigned Ns, Nm, M;
    578	unsigned sclk, mclk, tmp, ref_div;
    579	int hTotal, vTotal, num, denom, m, n;
    580	unsigned long long hz, vclk;
    581	long xtal;
    582	ktime_t start_time, stop_time;
    583	u64 total_usecs;
    584	int i;
    585
    586	/* Ugh, we cut interrupts, bad bad bad, but we want some precision
    587	 * here, so... --BenH
    588	 */
    589
    590	/* Flush PCI buffers ? */
    591	tmp = INREG16(DEVICE_ID);
    592
    593	local_irq_disable();
    594
    595	for(i=0; i<1000000; i++)
    596		if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
    597			break;
    598
    599	start_time = ktime_get();
    600
    601	for(i=0; i<1000000; i++)
    602		if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) != 0)
    603			break;
    604
    605	for(i=0; i<1000000; i++)
    606		if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
    607			break;
    608	
    609	stop_time = ktime_get();
    610	
    611	local_irq_enable();
    612
    613	total_usecs = ktime_us_delta(stop_time, start_time);
    614	if (total_usecs >= 10 * USEC_PER_SEC || total_usecs == 0)
    615		return -1;
    616	hz = USEC_PER_SEC/(u32)total_usecs;
    617 
    618	hTotal = ((INREG(CRTC_H_TOTAL_DISP) & 0x1ff) + 1) * 8;
    619	vTotal = ((INREG(CRTC_V_TOTAL_DISP) & 0x3ff) + 1);
    620	vclk = (long long)hTotal * (long long)vTotal * hz;
    621
    622	switch((INPLL(PPLL_REF_DIV) & 0x30000) >> 16) {
    623	case 0:
    624	default:
    625		num = 1;
    626		denom = 1;
    627		break;
    628	case 1:
    629		n = ((INPLL(M_SPLL_REF_FB_DIV) >> 16) & 0xff);
    630		m = (INPLL(M_SPLL_REF_FB_DIV) & 0xff);
    631		num = 2*n;
    632		denom = 2*m;
    633		break;
    634	case 2:
    635		n = ((INPLL(M_SPLL_REF_FB_DIV) >> 8) & 0xff);
    636		m = (INPLL(M_SPLL_REF_FB_DIV) & 0xff);
    637		num = 2*n;
    638		denom = 2*m;
    639        break;
    640	}
    641
    642	ppll_div_sel = INREG8(CLOCK_CNTL_INDEX + 1) & 0x3;
    643	radeon_pll_errata_after_index(rinfo);
    644
    645	n = (INPLL(PPLL_DIV_0 + ppll_div_sel) & 0x7ff);
    646	m = (INPLL(PPLL_REF_DIV) & 0x3ff);
    647
    648	num *= n;
    649	denom *= m;
    650
    651	switch ((INPLL(PPLL_DIV_0 + ppll_div_sel) >> 16) & 0x7) {
    652	case 1:
    653		denom *= 2;
    654		break;
    655	case 2:
    656		denom *= 4;
    657		break;
    658	case 3:
    659		denom *= 8;
    660		break;
    661	case 4:
    662		denom *= 3;
    663		break;
    664	case 6:
    665		denom *= 6;   
    666		break;
    667	case 7:
    668		denom *= 12;
    669		break;
    670	}
    671
    672	vclk *= denom;
    673	do_div(vclk, 1000 * num);
    674	xtal = vclk;
    675
    676	if ((xtal > 26900) && (xtal < 27100))
    677		xtal = 2700;
    678	else if ((xtal > 14200) && (xtal < 14400))
    679		xtal = 1432;
    680	else if ((xtal > 29400) && (xtal < 29600))
    681		xtal = 2950;
    682	else {
    683		printk(KERN_WARNING "xtal calculation failed: %ld\n", xtal);
    684		return -1;
    685	}
    686
    687	tmp = INPLL(M_SPLL_REF_FB_DIV);
    688	ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
    689
    690	Ns = (tmp & 0xff0000) >> 16;
    691	Nm = (tmp & 0xff00) >> 8;
    692	M = (tmp & 0xff);
    693	sclk = round_div((2 * Ns * xtal), (2 * M));
    694	mclk = round_div((2 * Nm * xtal), (2 * M));
    695
    696	/* we're done, hopefully these are sane values */
    697	rinfo->pll.ref_clk = xtal;
    698	rinfo->pll.ref_div = ref_div;
    699	rinfo->pll.sclk = sclk;
    700	rinfo->pll.mclk = mclk;
    701
    702	return 0;
    703}
    704
    705/*
    706 * Retrieve PLL infos by different means (BIOS, Open Firmware, register probing...)
    707 */
    708static void radeon_get_pllinfo(struct radeonfb_info *rinfo)
    709{
    710	/*
    711	 * In the case nothing works, these are defaults; they are mostly
    712	 * incomplete, however.  It does provide ppll_max and _min values
    713	 * even for most other methods, however.
    714	 */
    715	switch (rinfo->chipset) {
    716	case PCI_DEVICE_ID_ATI_RADEON_QW:
    717	case PCI_DEVICE_ID_ATI_RADEON_QX:
    718		rinfo->pll.ppll_max = 35000;
    719		rinfo->pll.ppll_min = 12000;
    720		rinfo->pll.mclk = 23000;
    721		rinfo->pll.sclk = 23000;
    722		rinfo->pll.ref_clk = 2700;
    723		break;
    724	case PCI_DEVICE_ID_ATI_RADEON_QL:
    725	case PCI_DEVICE_ID_ATI_RADEON_QN:
    726	case PCI_DEVICE_ID_ATI_RADEON_QO:
    727	case PCI_DEVICE_ID_ATI_RADEON_Ql:
    728	case PCI_DEVICE_ID_ATI_RADEON_BB:
    729		rinfo->pll.ppll_max = 35000;
    730		rinfo->pll.ppll_min = 12000;
    731		rinfo->pll.mclk = 27500;
    732		rinfo->pll.sclk = 27500;
    733		rinfo->pll.ref_clk = 2700;
    734		break;
    735	case PCI_DEVICE_ID_ATI_RADEON_Id:
    736	case PCI_DEVICE_ID_ATI_RADEON_Ie:
    737	case PCI_DEVICE_ID_ATI_RADEON_If:
    738	case PCI_DEVICE_ID_ATI_RADEON_Ig:
    739		rinfo->pll.ppll_max = 35000;
    740		rinfo->pll.ppll_min = 12000;
    741		rinfo->pll.mclk = 25000;
    742		rinfo->pll.sclk = 25000;
    743		rinfo->pll.ref_clk = 2700;
    744		break;
    745	case PCI_DEVICE_ID_ATI_RADEON_ND:
    746	case PCI_DEVICE_ID_ATI_RADEON_NE:
    747	case PCI_DEVICE_ID_ATI_RADEON_NF:
    748	case PCI_DEVICE_ID_ATI_RADEON_NG:
    749		rinfo->pll.ppll_max = 40000;
    750		rinfo->pll.ppll_min = 20000;
    751		rinfo->pll.mclk = 27000;
    752		rinfo->pll.sclk = 27000;
    753		rinfo->pll.ref_clk = 2700;
    754		break;
    755	case PCI_DEVICE_ID_ATI_RADEON_QD:
    756	case PCI_DEVICE_ID_ATI_RADEON_QE:
    757	case PCI_DEVICE_ID_ATI_RADEON_QF:
    758	case PCI_DEVICE_ID_ATI_RADEON_QG:
    759	default:
    760		rinfo->pll.ppll_max = 35000;
    761		rinfo->pll.ppll_min = 12000;
    762		rinfo->pll.mclk = 16600;
    763		rinfo->pll.sclk = 16600;
    764		rinfo->pll.ref_clk = 2700;
    765		break;
    766	}
    767	rinfo->pll.ref_div = INPLL(PPLL_REF_DIV) & PPLL_REF_DIV_MASK;
    768
    769
    770#if defined(CONFIG_PPC) || defined(CONFIG_SPARC)
    771	/*
    772	 * Retrieve PLL infos from Open Firmware first
    773	 */
    774       	if (!force_measure_pll && radeon_read_xtal_OF(rinfo) == 0) {
    775       		printk(KERN_INFO "radeonfb: Retrieved PLL infos from Open Firmware\n");
    776		goto found;
    777	}
    778#endif /* CONFIG_PPC || CONFIG_SPARC */
    779
    780	/*
    781	 * Check out if we have an X86 which gave us some PLL informations
    782	 * and if yes, retrieve them
    783	 */
    784	if (!force_measure_pll && rinfo->bios_seg) {
    785		u16 pll_info_block = BIOS_IN16(rinfo->fp_bios_start + 0x30);
    786
    787		rinfo->pll.sclk		= BIOS_IN16(pll_info_block + 0x08);
    788		rinfo->pll.mclk		= BIOS_IN16(pll_info_block + 0x0a);
    789		rinfo->pll.ref_clk	= BIOS_IN16(pll_info_block + 0x0e);
    790		rinfo->pll.ref_div	= BIOS_IN16(pll_info_block + 0x10);
    791		rinfo->pll.ppll_min	= BIOS_IN32(pll_info_block + 0x12);
    792		rinfo->pll.ppll_max	= BIOS_IN32(pll_info_block + 0x16);
    793
    794		printk(KERN_INFO "radeonfb: Retrieved PLL infos from BIOS\n");
    795		goto found;
    796	}
    797
    798	/*
    799	 * We didn't get PLL parameters from either OF or BIOS, we try to
    800	 * probe them
    801	 */
    802	if (radeon_probe_pll_params(rinfo) == 0) {
    803		printk(KERN_INFO "radeonfb: Retrieved PLL infos from registers\n");
    804		goto found;
    805	}
    806
    807	/*
    808	 * Fall back to already-set defaults...
    809	 */
    810       	printk(KERN_INFO "radeonfb: Used default PLL infos\n");
    811
    812found:
    813	/*
    814	 * Some methods fail to retrieve SCLK and MCLK values, we apply default
    815	 * settings in this case (200Mhz). If that really happens often, we
    816	 * could fetch from registers instead...
    817	 */
    818	if (rinfo->pll.mclk == 0)
    819		rinfo->pll.mclk = 20000;
    820	if (rinfo->pll.sclk == 0)
    821		rinfo->pll.sclk = 20000;
    822
    823	printk("radeonfb: Reference=%d.%02d MHz (RefDiv=%d) Memory=%d.%02d Mhz, System=%d.%02d MHz\n",
    824	       rinfo->pll.ref_clk / 100, rinfo->pll.ref_clk % 100,
    825	       rinfo->pll.ref_div,
    826	       rinfo->pll.mclk / 100, rinfo->pll.mclk % 100,
    827	       rinfo->pll.sclk / 100, rinfo->pll.sclk % 100);
    828	printk("radeonfb: PLL min %d max %d\n", rinfo->pll.ppll_min, rinfo->pll.ppll_max);
    829}
    830
    831static int radeonfb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
    832{
    833	struct radeonfb_info *rinfo = info->par;
    834        struct fb_var_screeninfo v;
    835        int nom, den;
    836	unsigned int pitch;
    837
    838	if (radeon_match_mode(rinfo, &v, var))
    839		return -EINVAL;
    840
    841        switch (v.bits_per_pixel) {
    842		case 0 ... 8:
    843			v.bits_per_pixel = 8;
    844			break;
    845		case 9 ... 16:
    846			v.bits_per_pixel = 16;
    847			break;
    848		case 25 ... 32:
    849			v.bits_per_pixel = 32;
    850			break;
    851		default:
    852			return -EINVAL;
    853	}
    854
    855	switch (var_to_depth(&v)) {
    856                case 8:
    857                        nom = den = 1;
    858                        v.red.offset = v.green.offset = v.blue.offset = 0;
    859                        v.red.length = v.green.length = v.blue.length = 8;
    860                        v.transp.offset = v.transp.length = 0;
    861                        break;
    862		case 15:
    863			nom = 2;
    864			den = 1;
    865			v.red.offset = 10;
    866			v.green.offset = 5;
    867			v.blue.offset = 0;
    868			v.red.length = v.green.length = v.blue.length = 5;
    869			v.transp.offset = v.transp.length = 0;
    870			break;
    871                case 16:
    872                        nom = 2;
    873                        den = 1;
    874                        v.red.offset = 11;
    875                        v.green.offset = 5;
    876                        v.blue.offset = 0;
    877                        v.red.length = 5;
    878                        v.green.length = 6;
    879                        v.blue.length = 5;
    880                        v.transp.offset = v.transp.length = 0;
    881                        break;                          
    882                case 24:
    883                        nom = 4;
    884                        den = 1;
    885                        v.red.offset = 16;
    886                        v.green.offset = 8;
    887                        v.blue.offset = 0;
    888                        v.red.length = v.blue.length = v.green.length = 8;
    889                        v.transp.offset = v.transp.length = 0;
    890                        break;
    891                case 32:
    892                        nom = 4;
    893                        den = 1;
    894                        v.red.offset = 16;
    895                        v.green.offset = 8;
    896                        v.blue.offset = 0;
    897                        v.red.length = v.blue.length = v.green.length = 8;
    898                        v.transp.offset = 24;
    899                        v.transp.length = 8;
    900                        break;
    901                default:
    902                        printk ("radeonfb: mode %dx%dx%d rejected, color depth invalid\n",
    903                                var->xres, var->yres, var->bits_per_pixel);
    904                        return -EINVAL;
    905        }
    906
    907	if (v.yres_virtual < v.yres)
    908		v.yres_virtual = v.yres;
    909	if (v.xres_virtual < v.xres)
    910		v.xres_virtual = v.xres;
    911                
    912
    913	/* XXX I'm adjusting xres_virtual to the pitch, that may help XFree
    914	 * with some panels, though I don't quite like this solution
    915	 */
    916  	if (rinfo->info->flags & FBINFO_HWACCEL_DISABLED) {
    917		v.xres_virtual = v.xres_virtual & ~7ul;
    918	} else {
    919		pitch = ((v.xres_virtual * ((v.bits_per_pixel + 1) / 8) + 0x3f)
    920 				& ~(0x3f)) >> 6;
    921		v.xres_virtual = (pitch << 6) / ((v.bits_per_pixel + 1) / 8);
    922	}
    923
    924	if (((v.xres_virtual * v.yres_virtual * nom) / den) > rinfo->mapped_vram)
    925		return -EINVAL;
    926
    927	if (v.xres_virtual < v.xres)
    928		v.xres = v.xres_virtual;
    929
    930        if (v.xoffset > v.xres_virtual - v.xres)
    931                v.xoffset = v.xres_virtual - v.xres - 1;
    932                        
    933        if (v.yoffset > v.yres_virtual - v.yres)
    934                v.yoffset = v.yres_virtual - v.yres - 1;
    935         
    936        v.red.msb_right = v.green.msb_right = v.blue.msb_right =
    937                          v.transp.offset = v.transp.length =
    938                          v.transp.msb_right = 0;
    939	
    940        memcpy(var, &v, sizeof(v));
    941
    942        return 0;
    943}
    944
    945
    946static int radeonfb_pan_display (struct fb_var_screeninfo *var,
    947                                 struct fb_info *info)
    948{
    949        struct radeonfb_info *rinfo = info->par;
    950
    951	if ((var->xoffset + info->var.xres > info->var.xres_virtual)
    952	    || (var->yoffset + info->var.yres > info->var.yres_virtual))
    953		return -EINVAL;
    954                
    955        if (rinfo->asleep)
    956        	return 0;
    957
    958	radeon_fifo_wait(2);
    959	OUTREG(CRTC_OFFSET, (var->yoffset * info->fix.line_length +
    960			     var->xoffset * info->var.bits_per_pixel / 8) & ~7);
    961        return 0;
    962}
    963
    964
    965static int radeonfb_ioctl (struct fb_info *info, unsigned int cmd,
    966                           unsigned long arg)
    967{
    968        struct radeonfb_info *rinfo = info->par;
    969	unsigned int tmp;
    970	u32 value = 0;
    971	int rc;
    972
    973	switch (cmd) {
    974		/*
    975		 * TODO:  set mirror accordingly for non-Mobility chipsets with 2 CRTC's
    976		 *        and do something better using 2nd CRTC instead of just hackish
    977		 *        routing to second output
    978		 */
    979		case FBIO_RADEON_SET_MIRROR:
    980			if (!rinfo->is_mobility)
    981				return -EINVAL;
    982
    983			rc = get_user(value, (__u32 __user *)arg);
    984
    985			if (rc)
    986				return rc;
    987
    988			radeon_fifo_wait(2);
    989			if (value & 0x01) {
    990				tmp = INREG(LVDS_GEN_CNTL);
    991
    992				tmp |= (LVDS_ON | LVDS_BLON);
    993			} else {
    994				tmp = INREG(LVDS_GEN_CNTL);
    995
    996				tmp &= ~(LVDS_ON | LVDS_BLON);
    997			}
    998
    999			OUTREG(LVDS_GEN_CNTL, tmp);
   1000
   1001			if (value & 0x02) {
   1002				tmp = INREG(CRTC_EXT_CNTL);
   1003				tmp |= CRTC_CRT_ON;
   1004
   1005				mirror = 1;
   1006			} else {
   1007				tmp = INREG(CRTC_EXT_CNTL);
   1008				tmp &= ~CRTC_CRT_ON;
   1009
   1010				mirror = 0;
   1011			}
   1012
   1013			OUTREG(CRTC_EXT_CNTL, tmp);
   1014
   1015			return 0;
   1016		case FBIO_RADEON_GET_MIRROR:
   1017			if (!rinfo->is_mobility)
   1018				return -EINVAL;
   1019
   1020			tmp = INREG(LVDS_GEN_CNTL);
   1021			if ((LVDS_ON | LVDS_BLON) & tmp)
   1022				value |= 0x01;
   1023
   1024			tmp = INREG(CRTC_EXT_CNTL);
   1025			if (CRTC_CRT_ON & tmp)
   1026				value |= 0x02;
   1027
   1028			return put_user(value, (__u32 __user *)arg);
   1029		default:
   1030			return -EINVAL;
   1031	}
   1032
   1033	return -EINVAL;
   1034}
   1035
   1036
   1037int radeon_screen_blank(struct radeonfb_info *rinfo, int blank, int mode_switch)
   1038{
   1039        u32 val;
   1040	u32 tmp_pix_clks;
   1041	int unblank = 0;
   1042
   1043	if (rinfo->lock_blank)
   1044		return 0;
   1045
   1046	radeon_engine_idle();
   1047
   1048	val = INREG(CRTC_EXT_CNTL);
   1049        val &= ~(CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS |
   1050                 CRTC_VSYNC_DIS);
   1051        switch (blank) {
   1052	case FB_BLANK_VSYNC_SUSPEND:
   1053		val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS);
   1054		break;
   1055	case FB_BLANK_HSYNC_SUSPEND:
   1056		val |= (CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS);
   1057		break;
   1058	case FB_BLANK_POWERDOWN:
   1059		val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS |
   1060			CRTC_HSYNC_DIS);
   1061		break;
   1062	case FB_BLANK_NORMAL:
   1063		val |= CRTC_DISPLAY_DIS;
   1064		break;
   1065	case FB_BLANK_UNBLANK:
   1066	default:
   1067		unblank = 1;
   1068        }
   1069	OUTREG(CRTC_EXT_CNTL, val);
   1070
   1071
   1072	switch (rinfo->mon1_type) {
   1073	case MT_DFP:
   1074		if (unblank)
   1075			OUTREGP(FP_GEN_CNTL, (FP_FPON | FP_TMDS_EN),
   1076				~(FP_FPON | FP_TMDS_EN));
   1077		else {
   1078			if (mode_switch || blank == FB_BLANK_NORMAL)
   1079				break;
   1080			OUTREGP(FP_GEN_CNTL, 0, ~(FP_FPON | FP_TMDS_EN));
   1081		}
   1082		break;
   1083	case MT_LCD:
   1084		del_timer_sync(&rinfo->lvds_timer);
   1085		val = INREG(LVDS_GEN_CNTL);
   1086		if (unblank) {
   1087			u32 target_val = (val & ~LVDS_DISPLAY_DIS) | LVDS_BLON | LVDS_ON
   1088				| LVDS_EN | (rinfo->init_state.lvds_gen_cntl
   1089					     & (LVDS_DIGON | LVDS_BL_MOD_EN));
   1090			if ((val ^ target_val) == LVDS_DISPLAY_DIS)
   1091				OUTREG(LVDS_GEN_CNTL, target_val);
   1092			else if ((val ^ target_val) != 0) {
   1093				OUTREG(LVDS_GEN_CNTL, target_val
   1094				       & ~(LVDS_ON | LVDS_BL_MOD_EN));
   1095				rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
   1096				rinfo->init_state.lvds_gen_cntl |=
   1097					target_val & LVDS_STATE_MASK;
   1098				if (mode_switch) {
   1099					radeon_msleep(rinfo->panel_info.pwr_delay);
   1100					OUTREG(LVDS_GEN_CNTL, target_val);
   1101				}
   1102				else {
   1103					rinfo->pending_lvds_gen_cntl = target_val;
   1104					mod_timer(&rinfo->lvds_timer,
   1105					   jiffies +
   1106					   msecs_to_jiffies(rinfo->panel_info.pwr_delay));
   1107				}
   1108			}
   1109		} else {
   1110			val |= LVDS_DISPLAY_DIS;
   1111			OUTREG(LVDS_GEN_CNTL, val);
   1112
   1113			/* We don't do a full switch-off on a simple mode switch */
   1114			if (mode_switch || blank == FB_BLANK_NORMAL)
   1115				break;
   1116
   1117			/* Asic bug, when turning off LVDS_ON, we have to make sure
   1118			 * RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off
   1119			 */
   1120			tmp_pix_clks = INPLL(PIXCLKS_CNTL);
   1121			if (rinfo->is_mobility || rinfo->is_IGP)
   1122				OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb);
   1123			val &= ~(LVDS_BL_MOD_EN);
   1124			OUTREG(LVDS_GEN_CNTL, val);
   1125			udelay(100);
   1126			val &= ~(LVDS_ON | LVDS_EN);
   1127			OUTREG(LVDS_GEN_CNTL, val);
   1128			val &= ~LVDS_DIGON;
   1129			rinfo->pending_lvds_gen_cntl = val;
   1130			mod_timer(&rinfo->lvds_timer,
   1131				  jiffies +
   1132				  msecs_to_jiffies(rinfo->panel_info.pwr_delay));
   1133			rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
   1134			rinfo->init_state.lvds_gen_cntl |= val & LVDS_STATE_MASK;
   1135			if (rinfo->is_mobility || rinfo->is_IGP)
   1136				OUTPLL(PIXCLKS_CNTL, tmp_pix_clks);
   1137		}
   1138		break;
   1139	case MT_CRT:
   1140		// todo: powerdown DAC
   1141	default:
   1142		break;
   1143	}
   1144
   1145	return 0;
   1146}
   1147
   1148static int radeonfb_blank (int blank, struct fb_info *info)
   1149{
   1150        struct radeonfb_info *rinfo = info->par;
   1151
   1152	if (rinfo->asleep)
   1153		return 0;
   1154		
   1155	return radeon_screen_blank(rinfo, blank, 0);
   1156}
   1157
   1158static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green,
   1159                             unsigned blue, unsigned transp,
   1160			     struct radeonfb_info *rinfo)
   1161{
   1162	u32 pindex;
   1163	unsigned int i;
   1164
   1165
   1166	if (regno > 255)
   1167		return -EINVAL;
   1168
   1169	red >>= 8;
   1170	green >>= 8;
   1171	blue >>= 8;
   1172	rinfo->palette[regno].red = red;
   1173	rinfo->palette[regno].green = green;
   1174	rinfo->palette[regno].blue = blue;
   1175
   1176        /* default */
   1177        pindex = regno;
   1178
   1179        if (!rinfo->asleep) {
   1180		radeon_fifo_wait(9);
   1181
   1182		if (rinfo->bpp == 16) {
   1183			pindex = regno * 8;
   1184
   1185			if (rinfo->depth == 16 && regno > 63)
   1186				return -EINVAL;
   1187			if (rinfo->depth == 15 && regno > 31)
   1188				return -EINVAL;
   1189
   1190			/* For 565, the green component is mixed one order
   1191			 * below
   1192			 */
   1193			if (rinfo->depth == 16) {
   1194		                OUTREG(PALETTE_INDEX, pindex>>1);
   1195	       	         	OUTREG(PALETTE_DATA,
   1196				       (rinfo->palette[regno>>1].red << 16) |
   1197	                        	(green << 8) |
   1198				       (rinfo->palette[regno>>1].blue));
   1199	                	green = rinfo->palette[regno<<1].green;
   1200	        	}
   1201		}
   1202
   1203		if (rinfo->depth != 16 || regno < 32) {
   1204			OUTREG(PALETTE_INDEX, pindex);
   1205			OUTREG(PALETTE_DATA, (red << 16) |
   1206			       (green << 8) | blue);
   1207		}
   1208	}
   1209 	if (regno < 16) {
   1210		u32 *pal = rinfo->info->pseudo_palette;
   1211        	switch (rinfo->depth) {
   1212		case 15:
   1213			pal[regno] = (regno << 10) | (regno << 5) | regno;
   1214			break;
   1215		case 16:
   1216			pal[regno] = (regno << 11) | (regno << 5) | regno;
   1217			break;
   1218		case 24:
   1219			pal[regno] = (regno << 16) | (regno << 8) | regno;
   1220			break;
   1221		case 32:
   1222			i = (regno << 8) | regno;
   1223			pal[regno] = (i << 16) | i;
   1224			break;
   1225		}
   1226        }
   1227	return 0;
   1228}
   1229
   1230static int radeonfb_setcolreg (unsigned regno, unsigned red, unsigned green,
   1231			       unsigned blue, unsigned transp,
   1232			       struct fb_info *info)
   1233{
   1234        struct radeonfb_info *rinfo = info->par;
   1235	u32 dac_cntl2, vclk_cntl = 0;
   1236	int rc;
   1237
   1238        if (!rinfo->asleep) {
   1239		if (rinfo->is_mobility) {
   1240			vclk_cntl = INPLL(VCLK_ECP_CNTL);
   1241			OUTPLL(VCLK_ECP_CNTL,
   1242			       vclk_cntl & ~PIXCLK_DAC_ALWAYS_ONb);
   1243		}
   1244
   1245		/* Make sure we are on first palette */
   1246		if (rinfo->has_CRTC2) {
   1247			dac_cntl2 = INREG(DAC_CNTL2);
   1248			dac_cntl2 &= ~DAC2_PALETTE_ACCESS_CNTL;
   1249			OUTREG(DAC_CNTL2, dac_cntl2);
   1250		}
   1251	}
   1252
   1253	rc = radeon_setcolreg (regno, red, green, blue, transp, rinfo);
   1254
   1255	if (!rinfo->asleep && rinfo->is_mobility)
   1256		OUTPLL(VCLK_ECP_CNTL, vclk_cntl);
   1257
   1258	return rc;
   1259}
   1260
   1261static int radeonfb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
   1262{
   1263        struct radeonfb_info *rinfo = info->par;
   1264	u16 *red, *green, *blue, *transp;
   1265	u32 dac_cntl2, vclk_cntl = 0;
   1266	int i, start, rc = 0;
   1267
   1268        if (!rinfo->asleep) {
   1269		if (rinfo->is_mobility) {
   1270			vclk_cntl = INPLL(VCLK_ECP_CNTL);
   1271			OUTPLL(VCLK_ECP_CNTL,
   1272			       vclk_cntl & ~PIXCLK_DAC_ALWAYS_ONb);
   1273		}
   1274
   1275		/* Make sure we are on first palette */
   1276		if (rinfo->has_CRTC2) {
   1277			dac_cntl2 = INREG(DAC_CNTL2);
   1278			dac_cntl2 &= ~DAC2_PALETTE_ACCESS_CNTL;
   1279			OUTREG(DAC_CNTL2, dac_cntl2);
   1280		}
   1281	}
   1282
   1283	red = cmap->red;
   1284	green = cmap->green;
   1285	blue = cmap->blue;
   1286	transp = cmap->transp;
   1287	start = cmap->start;
   1288
   1289	for (i = 0; i < cmap->len; i++) {
   1290		u_int hred, hgreen, hblue, htransp = 0xffff;
   1291
   1292		hred = *red++;
   1293		hgreen = *green++;
   1294		hblue = *blue++;
   1295		if (transp)
   1296			htransp = *transp++;
   1297		rc = radeon_setcolreg (start++, hred, hgreen, hblue, htransp,
   1298				       rinfo);
   1299		if (rc)
   1300			break;
   1301	}
   1302
   1303	if (!rinfo->asleep && rinfo->is_mobility)
   1304		OUTPLL(VCLK_ECP_CNTL, vclk_cntl);
   1305
   1306	return rc;
   1307}
   1308
   1309static void radeon_save_state (struct radeonfb_info *rinfo,
   1310			       struct radeon_regs *save)
   1311{
   1312	/* CRTC regs */
   1313	save->crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
   1314	save->crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
   1315	save->crtc_more_cntl = INREG(CRTC_MORE_CNTL);
   1316	save->dac_cntl = INREG(DAC_CNTL);
   1317        save->crtc_h_total_disp = INREG(CRTC_H_TOTAL_DISP);
   1318        save->crtc_h_sync_strt_wid = INREG(CRTC_H_SYNC_STRT_WID);
   1319        save->crtc_v_total_disp = INREG(CRTC_V_TOTAL_DISP);
   1320        save->crtc_v_sync_strt_wid = INREG(CRTC_V_SYNC_STRT_WID);
   1321	save->crtc_pitch = INREG(CRTC_PITCH);
   1322	save->surface_cntl = INREG(SURFACE_CNTL);
   1323
   1324	/* FP regs */
   1325	save->fp_crtc_h_total_disp = INREG(FP_CRTC_H_TOTAL_DISP);
   1326	save->fp_crtc_v_total_disp = INREG(FP_CRTC_V_TOTAL_DISP);
   1327	save->fp_gen_cntl = INREG(FP_GEN_CNTL);
   1328	save->fp_h_sync_strt_wid = INREG(FP_H_SYNC_STRT_WID);
   1329	save->fp_horz_stretch = INREG(FP_HORZ_STRETCH);
   1330	save->fp_v_sync_strt_wid = INREG(FP_V_SYNC_STRT_WID);
   1331	save->fp_vert_stretch = INREG(FP_VERT_STRETCH);
   1332	save->lvds_gen_cntl = INREG(LVDS_GEN_CNTL);
   1333	save->lvds_pll_cntl = INREG(LVDS_PLL_CNTL);
   1334	save->tmds_crc = INREG(TMDS_CRC);
   1335	save->tmds_transmitter_cntl = INREG(TMDS_TRANSMITTER_CNTL);
   1336	save->vclk_ecp_cntl = INPLL(VCLK_ECP_CNTL);
   1337
   1338	/* PLL regs */
   1339	save->clk_cntl_index = INREG(CLOCK_CNTL_INDEX) & ~0x3f;
   1340	radeon_pll_errata_after_index(rinfo);
   1341	save->ppll_div_3 = INPLL(PPLL_DIV_3);
   1342	save->ppll_ref_div = INPLL(PPLL_REF_DIV);
   1343}
   1344
   1345
   1346static void radeon_write_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *mode)
   1347{
   1348	int i;
   1349
   1350	radeon_fifo_wait(20);
   1351
   1352	/* Workaround from XFree */
   1353	if (rinfo->is_mobility) {
   1354	        /* A temporal workaround for the occasional blanking on certain laptop
   1355		 * panels. This appears to related to the PLL divider registers
   1356		 * (fail to lock?). It occurs even when all dividers are the same
   1357		 * with their old settings. In this case we really don't need to
   1358		 * fiddle with PLL registers. By doing this we can avoid the blanking
   1359		 * problem with some panels.
   1360	         */
   1361		if ((mode->ppll_ref_div == (INPLL(PPLL_REF_DIV) & PPLL_REF_DIV_MASK)) &&
   1362		    (mode->ppll_div_3 == (INPLL(PPLL_DIV_3) &
   1363					  (PPLL_POST3_DIV_MASK | PPLL_FB3_DIV_MASK)))) {
   1364			/* We still have to force a switch to selected PPLL div thanks to
   1365			 * an XFree86 driver bug which will switch it away in some cases
   1366			 * even when using UseFDev */
   1367			OUTREGP(CLOCK_CNTL_INDEX,
   1368				mode->clk_cntl_index & PPLL_DIV_SEL_MASK,
   1369				~PPLL_DIV_SEL_MASK);
   1370			radeon_pll_errata_after_index(rinfo);
   1371			radeon_pll_errata_after_data(rinfo);
   1372            		return;
   1373		}
   1374	}
   1375
   1376	/* Swich VCKL clock input to CPUCLK so it stays fed while PPLL updates*/
   1377	OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_CPUCLK, ~VCLK_SRC_SEL_MASK);
   1378
   1379	/* Reset PPLL & enable atomic update */
   1380	OUTPLLP(PPLL_CNTL,
   1381		PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN,
   1382		~(PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
   1383
   1384	/* Switch to selected PPLL divider */
   1385	OUTREGP(CLOCK_CNTL_INDEX,
   1386		mode->clk_cntl_index & PPLL_DIV_SEL_MASK,
   1387		~PPLL_DIV_SEL_MASK);
   1388	radeon_pll_errata_after_index(rinfo);
   1389	radeon_pll_errata_after_data(rinfo);
   1390
   1391	/* Set PPLL ref. div */
   1392	if (IS_R300_VARIANT(rinfo) ||
   1393	    rinfo->family == CHIP_FAMILY_RS300 ||
   1394	    rinfo->family == CHIP_FAMILY_RS400 ||
   1395	    rinfo->family == CHIP_FAMILY_RS480) {
   1396		if (mode->ppll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
   1397			/* When restoring console mode, use saved PPLL_REF_DIV
   1398			 * setting.
   1399			 */
   1400			OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, 0);
   1401		} else {
   1402			/* R300 uses ref_div_acc field as real ref divider */
   1403			OUTPLLP(PPLL_REF_DIV,
   1404				(mode->ppll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT), 
   1405				~R300_PPLL_REF_DIV_ACC_MASK);
   1406		}
   1407	} else
   1408		OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, ~PPLL_REF_DIV_MASK);
   1409
   1410	/* Set PPLL divider 3 & post divider*/
   1411	OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_FB3_DIV_MASK);
   1412	OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_POST3_DIV_MASK);
   1413
   1414	/* Write update */
   1415	while (INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R)
   1416		;
   1417	OUTPLLP(PPLL_REF_DIV, PPLL_ATOMIC_UPDATE_W, ~PPLL_ATOMIC_UPDATE_W);
   1418
   1419	/* Wait read update complete */
   1420	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
   1421	   the cause yet, but this workaround will mask the problem for now.
   1422	   Other chips usually will pass at the very first test, so the
   1423	   workaround shouldn't have any effect on them. */
   1424	for (i = 0; (i < 10000 && INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R); i++)
   1425		;
   1426	
   1427	OUTPLL(HTOTAL_CNTL, 0);
   1428
   1429	/* Clear reset & atomic update */
   1430	OUTPLLP(PPLL_CNTL, 0,
   1431		~(PPLL_RESET | PPLL_SLEEP | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
   1432
   1433	/* We may want some locking ... oh well */
   1434       	radeon_msleep(5);
   1435
   1436	/* Switch back VCLK source to PPLL */
   1437	OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_PPLLCLK, ~VCLK_SRC_SEL_MASK);
   1438}
   1439
   1440/*
   1441 * Timer function for delayed LVDS panel power up/down
   1442 */
   1443static void radeon_lvds_timer_func(struct timer_list *t)
   1444{
   1445	struct radeonfb_info *rinfo = from_timer(rinfo, t, lvds_timer);
   1446
   1447	radeon_engine_idle();
   1448
   1449	OUTREG(LVDS_GEN_CNTL, rinfo->pending_lvds_gen_cntl);
   1450}
   1451
   1452/*
   1453 * Apply a video mode. This will apply the whole register set, including
   1454 * the PLL registers, to the card
   1455 */
   1456void radeon_write_mode (struct radeonfb_info *rinfo, struct radeon_regs *mode,
   1457			int regs_only)
   1458{
   1459	int i;
   1460	int primary_mon = PRIMARY_MONITOR(rinfo);
   1461
   1462	if (nomodeset)
   1463		return;
   1464
   1465	if (!regs_only)
   1466		radeon_screen_blank(rinfo, FB_BLANK_NORMAL, 0);
   1467
   1468	radeon_fifo_wait(31);
   1469	for (i=0; i<10; i++)
   1470		OUTREG(common_regs[i].reg, common_regs[i].val);
   1471
   1472	/* Apply surface registers */
   1473	for (i=0; i<8; i++) {
   1474		OUTREG(SURFACE0_LOWER_BOUND + 0x10*i, mode->surf_lower_bound[i]);
   1475		OUTREG(SURFACE0_UPPER_BOUND + 0x10*i, mode->surf_upper_bound[i]);
   1476		OUTREG(SURFACE0_INFO + 0x10*i, mode->surf_info[i]);
   1477	}
   1478
   1479	OUTREG(CRTC_GEN_CNTL, mode->crtc_gen_cntl);
   1480	OUTREGP(CRTC_EXT_CNTL, mode->crtc_ext_cntl,
   1481		~(CRTC_HSYNC_DIS | CRTC_VSYNC_DIS | CRTC_DISPLAY_DIS));
   1482	OUTREG(CRTC_MORE_CNTL, mode->crtc_more_cntl);
   1483	OUTREGP(DAC_CNTL, mode->dac_cntl, DAC_RANGE_CNTL | DAC_BLANKING);
   1484	OUTREG(CRTC_H_TOTAL_DISP, mode->crtc_h_total_disp);
   1485	OUTREG(CRTC_H_SYNC_STRT_WID, mode->crtc_h_sync_strt_wid);
   1486	OUTREG(CRTC_V_TOTAL_DISP, mode->crtc_v_total_disp);
   1487	OUTREG(CRTC_V_SYNC_STRT_WID, mode->crtc_v_sync_strt_wid);
   1488	OUTREG(CRTC_OFFSET, 0);
   1489	OUTREG(CRTC_OFFSET_CNTL, 0);
   1490	OUTREG(CRTC_PITCH, mode->crtc_pitch);
   1491	OUTREG(SURFACE_CNTL, mode->surface_cntl);
   1492
   1493	radeon_write_pll_regs(rinfo, mode);
   1494
   1495	if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
   1496		radeon_fifo_wait(10);
   1497		OUTREG(FP_CRTC_H_TOTAL_DISP, mode->fp_crtc_h_total_disp);
   1498		OUTREG(FP_CRTC_V_TOTAL_DISP, mode->fp_crtc_v_total_disp);
   1499		OUTREG(FP_H_SYNC_STRT_WID, mode->fp_h_sync_strt_wid);
   1500		OUTREG(FP_V_SYNC_STRT_WID, mode->fp_v_sync_strt_wid);
   1501		OUTREG(FP_HORZ_STRETCH, mode->fp_horz_stretch);
   1502		OUTREG(FP_VERT_STRETCH, mode->fp_vert_stretch);
   1503		OUTREG(FP_GEN_CNTL, mode->fp_gen_cntl);
   1504		OUTREG(TMDS_CRC, mode->tmds_crc);
   1505		OUTREG(TMDS_TRANSMITTER_CNTL, mode->tmds_transmitter_cntl);
   1506	}
   1507
   1508	if (!regs_only)
   1509		radeon_screen_blank(rinfo, FB_BLANK_UNBLANK, 0);
   1510
   1511	radeon_fifo_wait(2);
   1512	OUTPLL(VCLK_ECP_CNTL, mode->vclk_ecp_cntl);
   1513	
   1514	return;
   1515}
   1516
   1517/*
   1518 * Calculate the PLL values for a given mode
   1519 */
   1520static void radeon_calc_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *regs,
   1521				 unsigned long freq)
   1522{
   1523	static const struct {
   1524		int divider;
   1525		int bitvalue;
   1526	} *post_div,
   1527	  post_divs[] = {
   1528		{ 1,  0 },
   1529		{ 2,  1 },
   1530		{ 4,  2 },
   1531		{ 8,  3 },
   1532		{ 3,  4 },
   1533		{ 16, 5 },
   1534		{ 6,  6 },
   1535		{ 12, 7 },
   1536		{ 0,  0 },
   1537	};
   1538	int fb_div, pll_output_freq = 0;
   1539	int uses_dvo = 0;
   1540
   1541	/* Check if the DVO port is enabled and sourced from the primary CRTC. I'm
   1542	 * not sure which model starts having FP2_GEN_CNTL, I assume anything more
   1543	 * recent than an r(v)100...
   1544	 */
   1545#if 1
   1546	/* XXX I had reports of flicker happening with the cinema display
   1547	 * on TMDS1 that seem to be fixed if I also forbit odd dividers in
   1548	 * this case. This could just be a bandwidth calculation issue, I
   1549	 * haven't implemented the bandwidth code yet, but in the meantime,
   1550	 * forcing uses_dvo to 1 fixes it and shouln't have bad side effects,
   1551	 * I haven't seen a case were were absolutely needed an odd PLL
   1552	 * divider. I'll find a better fix once I have more infos on the
   1553	 * real cause of the problem.
   1554	 */
   1555	while (rinfo->has_CRTC2) {
   1556		u32 fp2_gen_cntl = INREG(FP2_GEN_CNTL);
   1557		u32 disp_output_cntl;
   1558		int source;
   1559
   1560		/* FP2 path not enabled */
   1561		if ((fp2_gen_cntl & FP2_ON) == 0)
   1562			break;
   1563		/* Not all chip revs have the same format for this register,
   1564		 * extract the source selection
   1565		 */
   1566		if (rinfo->family == CHIP_FAMILY_R200 || IS_R300_VARIANT(rinfo)) {
   1567			source = (fp2_gen_cntl >> 10) & 0x3;
   1568			/* sourced from transform unit, check for transform unit
   1569			 * own source
   1570			 */
   1571			if (source == 3) {
   1572				disp_output_cntl = INREG(DISP_OUTPUT_CNTL);
   1573				source = (disp_output_cntl >> 12) & 0x3;
   1574			}
   1575		} else
   1576			source = (fp2_gen_cntl >> 13) & 0x1;
   1577		/* sourced from CRTC2 -> exit */
   1578		if (source == 1)
   1579			break;
   1580
   1581		/* so we end up on CRTC1, let's set uses_dvo to 1 now */
   1582		uses_dvo = 1;
   1583		break;
   1584	}
   1585#else
   1586	uses_dvo = 1;
   1587#endif
   1588	if (freq > rinfo->pll.ppll_max)
   1589		freq = rinfo->pll.ppll_max;
   1590	if (freq*12 < rinfo->pll.ppll_min)
   1591		freq = rinfo->pll.ppll_min / 12;
   1592	pr_debug("freq = %lu, PLL min = %u, PLL max = %u\n",
   1593	       freq, rinfo->pll.ppll_min, rinfo->pll.ppll_max);
   1594
   1595	for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
   1596		pll_output_freq = post_div->divider * freq;
   1597		/* If we output to the DVO port (external TMDS), we don't allow an
   1598		 * odd PLL divider as those aren't supported on this path
   1599		 */
   1600		if (uses_dvo && (post_div->divider & 1))
   1601			continue;
   1602		if (pll_output_freq >= rinfo->pll.ppll_min  &&
   1603		    pll_output_freq <= rinfo->pll.ppll_max)
   1604			break;
   1605	}
   1606
   1607	/* If we fall through the bottom, try the "default value"
   1608	   given by the terminal post_div->bitvalue */
   1609	if ( !post_div->divider ) {
   1610		post_div = &post_divs[post_div->bitvalue];
   1611		pll_output_freq = post_div->divider * freq;
   1612	}
   1613	pr_debug("ref_div = %d, ref_clk = %d, output_freq = %d\n",
   1614	       rinfo->pll.ref_div, rinfo->pll.ref_clk,
   1615	       pll_output_freq);
   1616
   1617	/* If we fall through the bottom, try the "default value"
   1618	   given by the terminal post_div->bitvalue */
   1619	if ( !post_div->divider ) {
   1620		post_div = &post_divs[post_div->bitvalue];
   1621		pll_output_freq = post_div->divider * freq;
   1622	}
   1623	pr_debug("ref_div = %d, ref_clk = %d, output_freq = %d\n",
   1624	       rinfo->pll.ref_div, rinfo->pll.ref_clk,
   1625	       pll_output_freq);
   1626
   1627	fb_div = round_div(rinfo->pll.ref_div*pll_output_freq,
   1628				  rinfo->pll.ref_clk);
   1629	regs->ppll_ref_div = rinfo->pll.ref_div;
   1630	regs->ppll_div_3 = fb_div | (post_div->bitvalue << 16);
   1631
   1632	pr_debug("post div = 0x%x\n", post_div->bitvalue);
   1633	pr_debug("fb_div = 0x%x\n", fb_div);
   1634	pr_debug("ppll_div_3 = 0x%x\n", regs->ppll_div_3);
   1635}
   1636
   1637static int radeonfb_set_par(struct fb_info *info)
   1638{
   1639	struct radeonfb_info *rinfo = info->par;
   1640	struct fb_var_screeninfo *mode = &info->var;
   1641	struct radeon_regs *newmode;
   1642	int hTotal, vTotal, hSyncStart, hSyncEnd,
   1643	    vSyncStart, vSyncEnd;
   1644	u8 hsync_adj_tab[] = {0, 0x12, 9, 9, 6, 5};
   1645	u8 hsync_fudge_fp[] = {2, 2, 0, 0, 5, 5};
   1646	u32 sync, h_sync_pol, v_sync_pol, dotClock, pixClock;
   1647	int i, freq;
   1648	int format = 0;
   1649	int nopllcalc = 0;
   1650	int hsync_start, hsync_fudge, hsync_wid, vsync_wid;
   1651	int primary_mon = PRIMARY_MONITOR(rinfo);
   1652	int depth = var_to_depth(mode);
   1653	int use_rmx = 0;
   1654
   1655	newmode = kmalloc(sizeof(struct radeon_regs), GFP_KERNEL);
   1656	if (!newmode)
   1657		return -ENOMEM;
   1658
   1659	/* We always want engine to be idle on a mode switch, even
   1660	 * if we won't actually change the mode
   1661	 */
   1662	radeon_engine_idle();
   1663
   1664	hSyncStart = mode->xres + mode->right_margin;
   1665	hSyncEnd = hSyncStart + mode->hsync_len;
   1666	hTotal = hSyncEnd + mode->left_margin;
   1667
   1668	vSyncStart = mode->yres + mode->lower_margin;
   1669	vSyncEnd = vSyncStart + mode->vsync_len;
   1670	vTotal = vSyncEnd + mode->upper_margin;
   1671	pixClock = mode->pixclock;
   1672
   1673	sync = mode->sync;
   1674	h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
   1675	v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
   1676
   1677	if (primary_mon == MT_DFP || primary_mon == MT_LCD) {
   1678		if (rinfo->panel_info.xres < mode->xres)
   1679			mode->xres = rinfo->panel_info.xres;
   1680		if (rinfo->panel_info.yres < mode->yres)
   1681			mode->yres = rinfo->panel_info.yres;
   1682
   1683		hTotal = mode->xres + rinfo->panel_info.hblank;
   1684		hSyncStart = mode->xres + rinfo->panel_info.hOver_plus;
   1685		hSyncEnd = hSyncStart + rinfo->panel_info.hSync_width;
   1686
   1687		vTotal = mode->yres + rinfo->panel_info.vblank;
   1688		vSyncStart = mode->yres + rinfo->panel_info.vOver_plus;
   1689		vSyncEnd = vSyncStart + rinfo->panel_info.vSync_width;
   1690
   1691		h_sync_pol = !rinfo->panel_info.hAct_high;
   1692		v_sync_pol = !rinfo->panel_info.vAct_high;
   1693
   1694		pixClock = 100000000 / rinfo->panel_info.clock;
   1695
   1696		if (rinfo->panel_info.use_bios_dividers) {
   1697			nopllcalc = 1;
   1698			newmode->ppll_div_3 = rinfo->panel_info.fbk_divider |
   1699				(rinfo->panel_info.post_divider << 16);
   1700			newmode->ppll_ref_div = rinfo->panel_info.ref_divider;
   1701		}
   1702	}
   1703	dotClock = 1000000000 / pixClock;
   1704	freq = dotClock / 10; /* x100 */
   1705
   1706	pr_debug("hStart = %d, hEnd = %d, hTotal = %d\n",
   1707		hSyncStart, hSyncEnd, hTotal);
   1708	pr_debug("vStart = %d, vEnd = %d, vTotal = %d\n",
   1709		vSyncStart, vSyncEnd, vTotal);
   1710
   1711	hsync_wid = (hSyncEnd - hSyncStart) / 8;
   1712	vsync_wid = vSyncEnd - vSyncStart;
   1713	if (hsync_wid == 0)
   1714		hsync_wid = 1;
   1715	else if (hsync_wid > 0x3f)	/* max */
   1716		hsync_wid = 0x3f;
   1717
   1718	if (vsync_wid == 0)
   1719		vsync_wid = 1;
   1720	else if (vsync_wid > 0x1f)	/* max */
   1721		vsync_wid = 0x1f;
   1722
   1723	format = radeon_get_dstbpp(depth);
   1724
   1725	if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD))
   1726		hsync_fudge = hsync_fudge_fp[format-1];
   1727	else
   1728		hsync_fudge = hsync_adj_tab[format-1];
   1729
   1730	hsync_start = hSyncStart - 8 + hsync_fudge;
   1731
   1732	newmode->crtc_gen_cntl = CRTC_EXT_DISP_EN | CRTC_EN |
   1733				(format << 8);
   1734
   1735	/* Clear auto-center etc... */
   1736	newmode->crtc_more_cntl = rinfo->init_state.crtc_more_cntl;
   1737	newmode->crtc_more_cntl &= 0xfffffff0;
   1738	
   1739	if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
   1740		newmode->crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN;
   1741		if (mirror)
   1742			newmode->crtc_ext_cntl |= CRTC_CRT_ON;
   1743
   1744		newmode->crtc_gen_cntl &= ~(CRTC_DBL_SCAN_EN |
   1745					   CRTC_INTERLACE_EN);
   1746	} else {
   1747		newmode->crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN |
   1748					CRTC_CRT_ON;
   1749	}
   1750
   1751	newmode->dac_cntl = /* INREG(DAC_CNTL) | */ DAC_MASK_ALL | DAC_VGA_ADR_EN |
   1752			   DAC_8BIT_EN;
   1753
   1754	newmode->crtc_h_total_disp = ((((hTotal / 8) - 1) & 0x3ff) |
   1755				     (((mode->xres / 8) - 1) << 16));
   1756
   1757	newmode->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) |
   1758					(hsync_wid << 16) | (h_sync_pol << 23));
   1759
   1760	newmode->crtc_v_total_disp = ((vTotal - 1) & 0xffff) |
   1761				    ((mode->yres - 1) << 16);
   1762
   1763	newmode->crtc_v_sync_strt_wid = (((vSyncStart - 1) & 0xfff) |
   1764					 (vsync_wid << 16) | (v_sync_pol  << 23));
   1765
   1766	if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
   1767		/* We first calculate the engine pitch */
   1768		rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
   1769 				& ~(0x3f)) >> 6;
   1770
   1771		/* Then, re-multiply it to get the CRTC pitch */
   1772		newmode->crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
   1773	} else
   1774		newmode->crtc_pitch = (mode->xres_virtual >> 3);
   1775
   1776	newmode->crtc_pitch |= (newmode->crtc_pitch << 16);
   1777
   1778	/*
   1779	 * It looks like recent chips have a problem with SURFACE_CNTL,
   1780	 * setting SURF_TRANSLATION_DIS completely disables the
   1781	 * swapper as well, so we leave it unset now.
   1782	 */
   1783	newmode->surface_cntl = 0;
   1784
   1785#if defined(__BIG_ENDIAN)
   1786
   1787	/* Setup swapping on both apertures, though we currently
   1788	 * only use aperture 0, enabling swapper on aperture 1
   1789	 * won't harm
   1790	 */
   1791	switch (mode->bits_per_pixel) {
   1792		case 16:
   1793			newmode->surface_cntl |= NONSURF_AP0_SWP_16BPP;
   1794			newmode->surface_cntl |= NONSURF_AP1_SWP_16BPP;
   1795			break;
   1796		case 24:	
   1797		case 32:
   1798			newmode->surface_cntl |= NONSURF_AP0_SWP_32BPP;
   1799			newmode->surface_cntl |= NONSURF_AP1_SWP_32BPP;
   1800			break;
   1801	}
   1802#endif
   1803
   1804	/* Clear surface registers */
   1805	for (i=0; i<8; i++) {
   1806		newmode->surf_lower_bound[i] = 0;
   1807		newmode->surf_upper_bound[i] = 0x1f;
   1808		newmode->surf_info[i] = 0;
   1809	}
   1810
   1811	pr_debug("h_total_disp = 0x%x\t   hsync_strt_wid = 0x%x\n",
   1812		newmode->crtc_h_total_disp, newmode->crtc_h_sync_strt_wid);
   1813	pr_debug("v_total_disp = 0x%x\t   vsync_strt_wid = 0x%x\n",
   1814		newmode->crtc_v_total_disp, newmode->crtc_v_sync_strt_wid);
   1815
   1816	rinfo->bpp = mode->bits_per_pixel;
   1817	rinfo->depth = depth;
   1818
   1819	pr_debug("pixclock = %lu\n", (unsigned long)pixClock);
   1820	pr_debug("freq = %lu\n", (unsigned long)freq);
   1821
   1822	/* We use PPLL_DIV_3 */
   1823	newmode->clk_cntl_index = 0x300;
   1824
   1825	/* Calculate PPLL value if necessary */
   1826	if (!nopllcalc)
   1827		radeon_calc_pll_regs(rinfo, newmode, freq);
   1828
   1829	newmode->vclk_ecp_cntl = rinfo->init_state.vclk_ecp_cntl;
   1830
   1831	if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
   1832		unsigned int hRatio, vRatio;
   1833
   1834		if (mode->xres > rinfo->panel_info.xres)
   1835			mode->xres = rinfo->panel_info.xres;
   1836		if (mode->yres > rinfo->panel_info.yres)
   1837			mode->yres = rinfo->panel_info.yres;
   1838
   1839		newmode->fp_horz_stretch = (((rinfo->panel_info.xres / 8) - 1)
   1840					   << HORZ_PANEL_SHIFT);
   1841		newmode->fp_vert_stretch = ((rinfo->panel_info.yres - 1)
   1842					   << VERT_PANEL_SHIFT);
   1843
   1844		if (mode->xres != rinfo->panel_info.xres) {
   1845			hRatio = round_div(mode->xres * HORZ_STRETCH_RATIO_MAX,
   1846					   rinfo->panel_info.xres);
   1847			newmode->fp_horz_stretch = (((((unsigned long)hRatio) & HORZ_STRETCH_RATIO_MASK)) |
   1848						   (newmode->fp_horz_stretch &
   1849						    (HORZ_PANEL_SIZE | HORZ_FP_LOOP_STRETCH |
   1850						     HORZ_AUTO_RATIO_INC)));
   1851			newmode->fp_horz_stretch |= (HORZ_STRETCH_BLEND |
   1852						    HORZ_STRETCH_ENABLE);
   1853			use_rmx = 1;
   1854		}
   1855		newmode->fp_horz_stretch &= ~HORZ_AUTO_RATIO;
   1856
   1857		if (mode->yres != rinfo->panel_info.yres) {
   1858			vRatio = round_div(mode->yres * VERT_STRETCH_RATIO_MAX,
   1859					   rinfo->panel_info.yres);
   1860			newmode->fp_vert_stretch = (((((unsigned long)vRatio) & VERT_STRETCH_RATIO_MASK)) |
   1861						   (newmode->fp_vert_stretch &
   1862						   (VERT_PANEL_SIZE | VERT_STRETCH_RESERVED)));
   1863			newmode->fp_vert_stretch |= (VERT_STRETCH_BLEND |
   1864						    VERT_STRETCH_ENABLE);
   1865			use_rmx = 1;
   1866		}
   1867		newmode->fp_vert_stretch &= ~VERT_AUTO_RATIO_EN;
   1868
   1869		newmode->fp_gen_cntl = (rinfo->init_state.fp_gen_cntl & (u32)
   1870				       ~(FP_SEL_CRTC2 |
   1871					 FP_RMX_HVSYNC_CONTROL_EN |
   1872					 FP_DFP_SYNC_SEL |
   1873					 FP_CRT_SYNC_SEL |
   1874					 FP_CRTC_LOCK_8DOT |
   1875					 FP_USE_SHADOW_EN |
   1876					 FP_CRTC_USE_SHADOW_VEND |
   1877					 FP_CRT_SYNC_ALT));
   1878
   1879		newmode->fp_gen_cntl |= (FP_CRTC_DONT_SHADOW_VPAR |
   1880					FP_CRTC_DONT_SHADOW_HEND |
   1881					FP_PANEL_FORMAT);
   1882
   1883		if (IS_R300_VARIANT(rinfo) ||
   1884		    (rinfo->family == CHIP_FAMILY_R200)) {
   1885			newmode->fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
   1886			if (use_rmx)
   1887				newmode->fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX;
   1888			else
   1889				newmode->fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1;
   1890		} else
   1891			newmode->fp_gen_cntl |= FP_SEL_CRTC1;
   1892
   1893		newmode->lvds_gen_cntl = rinfo->init_state.lvds_gen_cntl;
   1894		newmode->lvds_pll_cntl = rinfo->init_state.lvds_pll_cntl;
   1895		newmode->tmds_crc = rinfo->init_state.tmds_crc;
   1896		newmode->tmds_transmitter_cntl = rinfo->init_state.tmds_transmitter_cntl;
   1897
   1898		if (primary_mon == MT_LCD) {
   1899			newmode->lvds_gen_cntl |= (LVDS_ON | LVDS_BLON);
   1900			newmode->fp_gen_cntl &= ~(FP_FPON | FP_TMDS_EN);
   1901		} else {
   1902			/* DFP */
   1903			newmode->fp_gen_cntl |= (FP_FPON | FP_TMDS_EN);
   1904			newmode->tmds_transmitter_cntl &= ~(TMDS_PLLRST);
   1905			/* TMDS_PLL_EN bit is reversed on RV (and mobility) chips */
   1906			if (IS_R300_VARIANT(rinfo) ||
   1907			    (rinfo->family == CHIP_FAMILY_R200) || !rinfo->has_CRTC2)
   1908				newmode->tmds_transmitter_cntl &= ~TMDS_PLL_EN;
   1909			else
   1910				newmode->tmds_transmitter_cntl |= TMDS_PLL_EN;
   1911			newmode->crtc_ext_cntl &= ~CRTC_CRT_ON;
   1912		}
   1913
   1914		newmode->fp_crtc_h_total_disp = (((rinfo->panel_info.hblank / 8) & 0x3ff) |
   1915				(((mode->xres / 8) - 1) << 16));
   1916		newmode->fp_crtc_v_total_disp = (rinfo->panel_info.vblank & 0xffff) |
   1917				((mode->yres - 1) << 16);
   1918		newmode->fp_h_sync_strt_wid = ((rinfo->panel_info.hOver_plus & 0x1fff) |
   1919				(hsync_wid << 16) | (h_sync_pol << 23));
   1920		newmode->fp_v_sync_strt_wid = ((rinfo->panel_info.vOver_plus & 0xfff) |
   1921				(vsync_wid << 16) | (v_sync_pol  << 23));
   1922	}
   1923
   1924	/* do it! */
   1925	if (!rinfo->asleep) {
   1926		memcpy(&rinfo->state, newmode, sizeof(*newmode));
   1927		radeon_write_mode (rinfo, newmode, 0);
   1928		/* (re)initialize the engine */
   1929		if (!(info->flags & FBINFO_HWACCEL_DISABLED))
   1930			radeonfb_engine_init (rinfo);
   1931	}
   1932	/* Update fix */
   1933	if (!(info->flags & FBINFO_HWACCEL_DISABLED))
   1934        	info->fix.line_length = rinfo->pitch*64;
   1935        else
   1936		info->fix.line_length = mode->xres_virtual
   1937			* ((mode->bits_per_pixel + 1) / 8);
   1938        info->fix.visual = rinfo->depth == 8 ? FB_VISUAL_PSEUDOCOLOR
   1939		: FB_VISUAL_DIRECTCOLOR;
   1940
   1941#ifdef CONFIG_BOOTX_TEXT
   1942	/* Update debug text engine */
   1943	btext_update_display(rinfo->fb_base_phys, mode->xres, mode->yres,
   1944			     rinfo->depth, info->fix.line_length);
   1945#endif
   1946
   1947	kfree(newmode);
   1948	return 0;
   1949}
   1950
   1951
   1952static const struct fb_ops radeonfb_ops = {
   1953	.owner			= THIS_MODULE,
   1954	.fb_check_var		= radeonfb_check_var,
   1955	.fb_set_par		= radeonfb_set_par,
   1956	.fb_setcolreg		= radeonfb_setcolreg,
   1957	.fb_setcmap		= radeonfb_setcmap,
   1958	.fb_pan_display 	= radeonfb_pan_display,
   1959	.fb_blank		= radeonfb_blank,
   1960	.fb_ioctl		= radeonfb_ioctl,
   1961	.fb_sync		= radeonfb_sync,
   1962	.fb_fillrect		= radeonfb_fillrect,
   1963	.fb_copyarea		= radeonfb_copyarea,
   1964	.fb_imageblit		= radeonfb_imageblit,
   1965};
   1966
   1967
   1968static int radeon_set_fbinfo(struct radeonfb_info *rinfo)
   1969{
   1970	struct fb_info *info = rinfo->info;
   1971
   1972	info->par = rinfo;
   1973	info->pseudo_palette = rinfo->pseudo_palette;
   1974	info->flags = FBINFO_DEFAULT
   1975		    | FBINFO_HWACCEL_COPYAREA
   1976		    | FBINFO_HWACCEL_FILLRECT
   1977		    | FBINFO_HWACCEL_XPAN
   1978		    | FBINFO_HWACCEL_YPAN;
   1979	info->fbops = &radeonfb_ops;
   1980	info->screen_base = rinfo->fb_base;
   1981	info->screen_size = rinfo->mapped_vram;
   1982	/* Fill fix common fields */
   1983	strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id));
   1984        info->fix.smem_start = rinfo->fb_base_phys;
   1985        info->fix.smem_len = rinfo->video_ram;
   1986        info->fix.type = FB_TYPE_PACKED_PIXELS;
   1987        info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
   1988        info->fix.xpanstep = 8;
   1989        info->fix.ypanstep = 1;
   1990        info->fix.ywrapstep = 0;
   1991        info->fix.type_aux = 0;
   1992        info->fix.mmio_start = rinfo->mmio_base_phys;
   1993        info->fix.mmio_len = RADEON_REGSIZE;
   1994	info->fix.accel = FB_ACCEL_ATI_RADEON;
   1995
   1996	fb_alloc_cmap(&info->cmap, 256, 0);
   1997
   1998	if (noaccel)
   1999		info->flags |= FBINFO_HWACCEL_DISABLED;
   2000
   2001        return 0;
   2002}
   2003
   2004/*
   2005 * This reconfigure the card's internal memory map. In theory, we'd like
   2006 * to setup the card's memory at the same address as it's PCI bus address,
   2007 * and the AGP aperture right after that so that system RAM on 32 bits
   2008 * machines at least, is directly accessible. However, doing so would
   2009 * conflict with the current XFree drivers...
   2010 * Ultimately, I hope XFree, GATOS and ATI binary drivers will all agree
   2011 * on the proper way to set this up and duplicate this here. In the meantime,
   2012 * I put the card's memory at 0 in card space and AGP at some random high
   2013 * local (0xe0000000 for now) that will be changed by XFree/DRI anyway
   2014 */
   2015#ifdef CONFIG_PPC
   2016#undef SET_MC_FB_FROM_APERTURE
   2017static void fixup_memory_mappings(struct radeonfb_info *rinfo)
   2018{
   2019	u32 save_crtc_gen_cntl, save_crtc2_gen_cntl = 0;
   2020	u32 save_crtc_ext_cntl;
   2021	u32 aper_base, aper_size;
   2022	u32 agp_base;
   2023
   2024	/* First, we disable display to avoid interfering */
   2025	if (rinfo->has_CRTC2) {
   2026		save_crtc2_gen_cntl = INREG(CRTC2_GEN_CNTL);
   2027		OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl | CRTC2_DISP_REQ_EN_B);
   2028	}
   2029	save_crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
   2030	save_crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
   2031	
   2032	OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl | CRTC_DISPLAY_DIS);
   2033	OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B);
   2034	mdelay(100);
   2035
   2036	aper_base = INREG(CNFG_APER_0_BASE);
   2037	aper_size = INREG(CNFG_APER_SIZE);
   2038
   2039#ifdef SET_MC_FB_FROM_APERTURE
   2040	/* Set framebuffer to be at the same address as set in PCI BAR */
   2041	OUTREG(MC_FB_LOCATION, 
   2042		((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16));
   2043	rinfo->fb_local_base = aper_base;
   2044#else
   2045	OUTREG(MC_FB_LOCATION, 0x7fff0000);
   2046	rinfo->fb_local_base = 0;
   2047#endif
   2048	agp_base = aper_base + aper_size;
   2049	if (agp_base & 0xf0000000)
   2050		agp_base = (aper_base | 0x0fffffff) + 1;
   2051
   2052	/* Set AGP to be just after the framebuffer on a 256Mb boundary. This
   2053	 * assumes the FB isn't mapped to 0xf0000000 or above, but this is
   2054	 * always the case on PPCs afaik.
   2055	 */
   2056#ifdef SET_MC_FB_FROM_APERTURE
   2057	OUTREG(MC_AGP_LOCATION, 0xffff0000 | (agp_base >> 16));
   2058#else
   2059	OUTREG(MC_AGP_LOCATION, 0xffffe000);
   2060#endif
   2061
   2062	/* Fixup the display base addresses & engine offsets while we
   2063	 * are at it as well
   2064	 */
   2065#ifdef SET_MC_FB_FROM_APERTURE
   2066	OUTREG(DISPLAY_BASE_ADDR, aper_base);
   2067	if (rinfo->has_CRTC2)
   2068		OUTREG(CRTC2_DISPLAY_BASE_ADDR, aper_base);
   2069	OUTREG(OV0_BASE_ADDR, aper_base);
   2070#else
   2071	OUTREG(DISPLAY_BASE_ADDR, 0);
   2072	if (rinfo->has_CRTC2)
   2073		OUTREG(CRTC2_DISPLAY_BASE_ADDR, 0);
   2074	OUTREG(OV0_BASE_ADDR, 0);
   2075#endif
   2076	mdelay(100);
   2077
   2078	/* Restore display settings */
   2079	OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl);
   2080	OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl);
   2081	if (rinfo->has_CRTC2)
   2082		OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl);	
   2083
   2084	pr_debug("aper_base: %08x MC_FB_LOC to: %08x, MC_AGP_LOC to: %08x\n",
   2085		aper_base,
   2086		((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16),
   2087		0xffff0000 | (agp_base >> 16));
   2088}
   2089#endif /* CONFIG_PPC */
   2090
   2091
   2092static void radeon_identify_vram(struct radeonfb_info *rinfo)
   2093{
   2094	u32 tmp;
   2095
   2096	/* framebuffer size */
   2097        if ((rinfo->family == CHIP_FAMILY_RS100) ||
   2098            (rinfo->family == CHIP_FAMILY_RS200) ||
   2099            (rinfo->family == CHIP_FAMILY_RS300) ||
   2100            (rinfo->family == CHIP_FAMILY_RC410) ||
   2101            (rinfo->family == CHIP_FAMILY_RS400) ||
   2102	    (rinfo->family == CHIP_FAMILY_RS480) ) {
   2103          u32 tom = INREG(NB_TOM);
   2104          tmp = ((((tom >> 16) - (tom & 0xffff) + 1) << 6) * 1024);
   2105
   2106 		radeon_fifo_wait(6);
   2107          OUTREG(MC_FB_LOCATION, tom);
   2108          OUTREG(DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
   2109          OUTREG(CRTC2_DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
   2110          OUTREG(OV0_BASE_ADDR, (tom & 0xffff) << 16);
   2111
   2112          /* This is supposed to fix the crtc2 noise problem. */
   2113          OUTREG(GRPH2_BUFFER_CNTL, INREG(GRPH2_BUFFER_CNTL) & ~0x7f0000);
   2114
   2115          if ((rinfo->family == CHIP_FAMILY_RS100) ||
   2116              (rinfo->family == CHIP_FAMILY_RS200)) {
   2117             /* This is to workaround the asic bug for RMX, some versions
   2118                of BIOS doesn't have this register initialized correctly.
   2119             */
   2120             OUTREGP(CRTC_MORE_CNTL, CRTC_H_CUTOFF_ACTIVE_EN,
   2121                     ~CRTC_H_CUTOFF_ACTIVE_EN);
   2122          }
   2123        } else {
   2124          tmp = INREG(CNFG_MEMSIZE);
   2125        }
   2126
   2127	/* mem size is bits [28:0], mask off the rest */
   2128	rinfo->video_ram = tmp & CNFG_MEMSIZE_MASK;
   2129
   2130	/*
   2131	 * Hack to get around some busted production M6's
   2132	 * reporting no ram
   2133	 */
   2134	if (rinfo->video_ram == 0) {
   2135		switch (rinfo->pdev->device) {
   2136	       	case PCI_CHIP_RADEON_LY:
   2137		case PCI_CHIP_RADEON_LZ:
   2138	       		rinfo->video_ram = 8192 * 1024;
   2139	       		break;
   2140	       	default:
   2141	       		break;
   2142		}
   2143	}
   2144
   2145
   2146	/*
   2147	 * Now try to identify VRAM type
   2148	 */
   2149	if (rinfo->is_IGP || (rinfo->family >= CHIP_FAMILY_R300) ||
   2150	    (INREG(MEM_SDRAM_MODE_REG) & (1<<30)))
   2151		rinfo->vram_ddr = 1;
   2152	else
   2153		rinfo->vram_ddr = 0;
   2154
   2155	tmp = INREG(MEM_CNTL);
   2156	if (IS_R300_VARIANT(rinfo)) {
   2157		tmp &=  R300_MEM_NUM_CHANNELS_MASK;
   2158		switch (tmp) {
   2159		case 0:  rinfo->vram_width = 64; break;
   2160		case 1:  rinfo->vram_width = 128; break;
   2161		case 2:  rinfo->vram_width = 256; break;
   2162		default: rinfo->vram_width = 128; break;
   2163		}
   2164	} else if ((rinfo->family == CHIP_FAMILY_RV100) ||
   2165		   (rinfo->family == CHIP_FAMILY_RS100) ||
   2166		   (rinfo->family == CHIP_FAMILY_RS200)){
   2167		if (tmp & RV100_MEM_HALF_MODE)
   2168			rinfo->vram_width = 32;
   2169		else
   2170			rinfo->vram_width = 64;
   2171	} else {
   2172		if (tmp & MEM_NUM_CHANNELS_MASK)
   2173			rinfo->vram_width = 128;
   2174		else
   2175			rinfo->vram_width = 64;
   2176	}
   2177
   2178	/* This may not be correct, as some cards can have half of channel disabled
   2179	 * ToDo: identify these cases
   2180	 */
   2181
   2182	pr_debug("radeonfb (%s): Found %ldk of %s %d bits wide videoram\n",
   2183	       pci_name(rinfo->pdev),
   2184	       rinfo->video_ram / 1024,
   2185	       rinfo->vram_ddr ? "DDR" : "SDRAM",
   2186	       rinfo->vram_width);
   2187}
   2188
   2189/*
   2190 * Sysfs
   2191 */
   2192
   2193static ssize_t radeon_show_one_edid(char *buf, loff_t off, size_t count, const u8 *edid)
   2194{
   2195	return memory_read_from_buffer(buf, count, &off, edid, EDID_LENGTH);
   2196}
   2197
   2198
   2199static ssize_t radeon_show_edid1(struct file *filp, struct kobject *kobj,
   2200				 struct bin_attribute *bin_attr,
   2201				 char *buf, loff_t off, size_t count)
   2202{
   2203	struct device *dev = kobj_to_dev(kobj);
   2204	struct fb_info *info = dev_get_drvdata(dev);
   2205        struct radeonfb_info *rinfo = info->par;
   2206
   2207	return radeon_show_one_edid(buf, off, count, rinfo->mon1_EDID);
   2208}
   2209
   2210
   2211static ssize_t radeon_show_edid2(struct file *filp, struct kobject *kobj,
   2212				 struct bin_attribute *bin_attr,
   2213				 char *buf, loff_t off, size_t count)
   2214{
   2215	struct device *dev = kobj_to_dev(kobj);
   2216	struct fb_info *info = dev_get_drvdata(dev);
   2217        struct radeonfb_info *rinfo = info->par;
   2218
   2219	return radeon_show_one_edid(buf, off, count, rinfo->mon2_EDID);
   2220}
   2221
   2222static const struct bin_attribute edid1_attr = {
   2223	.attr   = {
   2224		.name	= "edid1",
   2225		.mode	= 0444,
   2226	},
   2227	.size	= EDID_LENGTH,
   2228	.read	= radeon_show_edid1,
   2229};
   2230
   2231static const struct bin_attribute edid2_attr = {
   2232	.attr   = {
   2233		.name	= "edid2",
   2234		.mode	= 0444,
   2235	},
   2236	.size	= EDID_LENGTH,
   2237	.read	= radeon_show_edid2,
   2238};
   2239
   2240static int radeon_kick_out_firmware_fb(struct pci_dev *pdev)
   2241{
   2242	struct apertures_struct *ap;
   2243
   2244	ap = alloc_apertures(1);
   2245	if (!ap)
   2246		return -ENOMEM;
   2247
   2248	ap->ranges[0].base = pci_resource_start(pdev, 0);
   2249	ap->ranges[0].size = pci_resource_len(pdev, 0);
   2250
   2251	remove_conflicting_framebuffers(ap, KBUILD_MODNAME, false);
   2252
   2253	kfree(ap);
   2254
   2255	return 0;
   2256}
   2257
   2258static int radeonfb_pci_register(struct pci_dev *pdev,
   2259				 const struct pci_device_id *ent)
   2260{
   2261	struct fb_info *info;
   2262	struct radeonfb_info *rinfo;
   2263	int ret;
   2264	unsigned char c1, c2;
   2265	int err = 0;
   2266
   2267	pr_debug("radeonfb_pci_register BEGIN\n");
   2268	
   2269	/* Enable device in PCI config */
   2270	ret = pci_enable_device(pdev);
   2271	if (ret < 0) {
   2272		printk(KERN_ERR "radeonfb (%s): Cannot enable PCI device\n",
   2273		       pci_name(pdev));
   2274		goto err_out;
   2275	}
   2276
   2277	info = framebuffer_alloc(sizeof(struct radeonfb_info), &pdev->dev);
   2278	if (!info) {
   2279		ret = -ENOMEM;
   2280		goto err_disable;
   2281	}
   2282	rinfo = info->par;
   2283	rinfo->info = info;	
   2284	rinfo->pdev = pdev;
   2285	
   2286	spin_lock_init(&rinfo->reg_lock);
   2287	timer_setup(&rinfo->lvds_timer, radeon_lvds_timer_func, 0);
   2288
   2289	c1 = ent->device >> 8;
   2290	c2 = ent->device & 0xff;
   2291	if (isprint(c1) && isprint(c2))
   2292		snprintf(rinfo->name, sizeof(rinfo->name),
   2293			 "ATI Radeon %x \"%c%c\"", ent->device & 0xffff, c1, c2);
   2294	else
   2295		snprintf(rinfo->name, sizeof(rinfo->name),
   2296			 "ATI Radeon %x", ent->device & 0xffff);
   2297
   2298	rinfo->family = ent->driver_data & CHIP_FAMILY_MASK;
   2299	rinfo->chipset = pdev->device;
   2300	rinfo->has_CRTC2 = (ent->driver_data & CHIP_HAS_CRTC2) != 0;
   2301	rinfo->is_mobility = (ent->driver_data & CHIP_IS_MOBILITY) != 0;
   2302	rinfo->is_IGP = (ent->driver_data & CHIP_IS_IGP) != 0;
   2303
   2304	/* Set base addrs */
   2305	rinfo->fb_base_phys = pci_resource_start (pdev, 0);
   2306	rinfo->mmio_base_phys = pci_resource_start (pdev, 2);
   2307
   2308	ret = radeon_kick_out_firmware_fb(pdev);
   2309	if (ret)
   2310		goto err_release_fb;
   2311
   2312	/* request the mem regions */
   2313	ret = pci_request_region(pdev, 0, "radeonfb framebuffer");
   2314	if (ret < 0) {
   2315		printk( KERN_ERR "radeonfb (%s): cannot request region 0.\n",
   2316			pci_name(rinfo->pdev));
   2317		goto err_release_fb;
   2318	}
   2319
   2320	ret = pci_request_region(pdev, 2, "radeonfb mmio");
   2321	if (ret < 0) {
   2322		printk( KERN_ERR "radeonfb (%s): cannot request region 2.\n",
   2323			pci_name(rinfo->pdev));
   2324		goto err_release_pci0;
   2325	}
   2326
   2327	/* map the regions */
   2328	rinfo->mmio_base = ioremap(rinfo->mmio_base_phys, RADEON_REGSIZE);
   2329	if (!rinfo->mmio_base) {
   2330		printk(KERN_ERR "radeonfb (%s): cannot map MMIO\n",
   2331		       pci_name(rinfo->pdev));
   2332		ret = -EIO;
   2333		goto err_release_pci2;
   2334	}
   2335
   2336	rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16;
   2337
   2338	/*
   2339	 * Check for errata
   2340	 */
   2341	rinfo->errata = 0;
   2342	if (rinfo->family == CHIP_FAMILY_R300 &&
   2343	    (INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK)
   2344	    == CFG_ATI_REV_A11)
   2345		rinfo->errata |= CHIP_ERRATA_R300_CG;
   2346
   2347	if (rinfo->family == CHIP_FAMILY_RV200 ||
   2348	    rinfo->family == CHIP_FAMILY_RS200)
   2349		rinfo->errata |= CHIP_ERRATA_PLL_DUMMYREADS;
   2350
   2351	if (rinfo->family == CHIP_FAMILY_RV100 ||
   2352	    rinfo->family == CHIP_FAMILY_RS100 ||
   2353	    rinfo->family == CHIP_FAMILY_RS200)
   2354		rinfo->errata |= CHIP_ERRATA_PLL_DELAY;
   2355
   2356#if defined(CONFIG_PPC) || defined(CONFIG_SPARC)
   2357	/* On PPC, we obtain the OF device-node pointer to the firmware
   2358	 * data for this chip
   2359	 */
   2360	rinfo->of_node = pci_device_to_OF_node(pdev);
   2361	if (rinfo->of_node == NULL)
   2362		printk(KERN_WARNING "radeonfb (%s): Cannot match card to OF node !\n",
   2363		       pci_name(rinfo->pdev));
   2364
   2365#endif /* CONFIG_PPC || CONFIG_SPARC */
   2366#ifdef CONFIG_PPC
   2367	/* On PPC, the firmware sets up a memory mapping that tends
   2368	 * to cause lockups when enabling the engine. We reconfigure
   2369	 * the card internal memory mappings properly
   2370	 */
   2371	fixup_memory_mappings(rinfo);
   2372#endif /* CONFIG_PPC */
   2373
   2374	/* Get VRAM size and type */
   2375	radeon_identify_vram(rinfo);
   2376
   2377	rinfo->mapped_vram = min_t(unsigned long, MAX_MAPPED_VRAM, rinfo->video_ram);
   2378
   2379	do {
   2380		rinfo->fb_base = ioremap_wc(rinfo->fb_base_phys,
   2381					    rinfo->mapped_vram);
   2382	} while (rinfo->fb_base == NULL &&
   2383		 ((rinfo->mapped_vram /= 2) >= MIN_MAPPED_VRAM));
   2384
   2385	if (rinfo->fb_base == NULL) {
   2386		printk (KERN_ERR "radeonfb (%s): cannot map FB\n",
   2387			pci_name(rinfo->pdev));
   2388		ret = -EIO;
   2389		goto err_unmap_rom;
   2390	}
   2391
   2392	pr_debug("radeonfb (%s): mapped %ldk videoram\n", pci_name(rinfo->pdev),
   2393	       rinfo->mapped_vram/1024);
   2394
   2395	/*
   2396	 * Map the BIOS ROM if any and retrieve PLL parameters from
   2397	 * the BIOS. We skip that on mobility chips as the real panel
   2398	 * values we need aren't in the ROM but in the BIOS image in
   2399	 * memory. This is definitely not the best meacnism though,
   2400	 * we really need the arch code to tell us which is the "primary"
   2401	 * video adapter to use the memory image (or better, the arch
   2402	 * should provide us a copy of the BIOS image to shield us from
   2403	 * archs who would store that elsewhere and/or could initialize
   2404	 * more than one adapter during boot).
   2405	 */
   2406	if (!rinfo->is_mobility)
   2407		radeon_map_ROM(rinfo, pdev);
   2408
   2409	/*
   2410	 * On x86, the primary display on laptop may have it's BIOS
   2411	 * ROM elsewhere, try to locate it at the legacy memory hole.
   2412	 * We probably need to make sure this is the primary display,
   2413	 * but that is difficult without some arch support.
   2414	 */
   2415#ifdef CONFIG_X86
   2416	if (rinfo->bios_seg == NULL)
   2417		radeon_find_mem_vbios(rinfo);
   2418#endif
   2419
   2420	/* If both above failed, try the BIOS ROM again for mobility
   2421	 * chips
   2422	 */
   2423	if (rinfo->bios_seg == NULL && rinfo->is_mobility)
   2424		radeon_map_ROM(rinfo, pdev);
   2425
   2426	/* Get informations about the board's PLL */
   2427	radeon_get_pllinfo(rinfo);
   2428
   2429#ifdef CONFIG_FB_RADEON_I2C
   2430	/* Register I2C bus */
   2431	radeon_create_i2c_busses(rinfo);
   2432#endif
   2433
   2434	/* set all the vital stuff */
   2435	radeon_set_fbinfo (rinfo);
   2436
   2437	/* Probe screen types */
   2438	radeon_probe_screens(rinfo, monitor_layout, ignore_edid);
   2439
   2440	/* Build mode list, check out panel native model */
   2441	radeon_check_modes(rinfo, mode_option);
   2442
   2443	/* Register some sysfs stuff (should be done better) */
   2444	if (rinfo->mon1_EDID)
   2445		err |= sysfs_create_bin_file(&rinfo->pdev->dev.kobj,
   2446						&edid1_attr);
   2447	if (rinfo->mon2_EDID)
   2448		err |= sysfs_create_bin_file(&rinfo->pdev->dev.kobj,
   2449						&edid2_attr);
   2450	if (err)
   2451		pr_warn("%s() Creating sysfs files failed, continuing\n",
   2452			__func__);
   2453
   2454	/* save current mode regs before we switch into the new one
   2455	 * so we can restore this upon __exit
   2456	 */
   2457	radeon_save_state (rinfo, &rinfo->init_state);
   2458	memcpy(&rinfo->state, &rinfo->init_state, sizeof(struct radeon_regs));
   2459
   2460	/* Setup Power Management capabilities */
   2461	if (default_dynclk < -1) {
   2462		/* -2 is special: means  ON on mobility chips and do not
   2463		 * change on others
   2464		 */
   2465		radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1, ignore_devlist, force_sleep);
   2466	} else
   2467		radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep);
   2468
   2469	pci_set_drvdata(pdev, info);
   2470
   2471	/* Register with fbdev layer */
   2472	ret = register_framebuffer(info);
   2473	if (ret < 0) {
   2474		printk (KERN_ERR "radeonfb (%s): could not register framebuffer\n",
   2475			pci_name(rinfo->pdev));
   2476		goto err_unmap_fb;
   2477	}
   2478
   2479	if (!nomtrr)
   2480		rinfo->wc_cookie = arch_phys_wc_add(rinfo->fb_base_phys,
   2481						    rinfo->video_ram);
   2482
   2483	if (backlight)
   2484		radeonfb_bl_init(rinfo);
   2485
   2486	printk ("radeonfb (%s): %s\n", pci_name(rinfo->pdev), rinfo->name);
   2487
   2488	if (rinfo->bios_seg)
   2489		radeon_unmap_ROM(rinfo, pdev);
   2490	pr_debug("radeonfb_pci_register END\n");
   2491
   2492	return 0;
   2493err_unmap_fb:
   2494	iounmap(rinfo->fb_base);
   2495err_unmap_rom:
   2496	kfree(rinfo->mon1_EDID);
   2497	kfree(rinfo->mon2_EDID);
   2498	if (rinfo->mon1_modedb)
   2499		fb_destroy_modedb(rinfo->mon1_modedb);
   2500	fb_dealloc_cmap(&info->cmap);
   2501#ifdef CONFIG_FB_RADEON_I2C
   2502	radeon_delete_i2c_busses(rinfo);
   2503#endif
   2504	if (rinfo->bios_seg)
   2505		radeon_unmap_ROM(rinfo, pdev);
   2506	iounmap(rinfo->mmio_base);
   2507err_release_pci2:
   2508	pci_release_region(pdev, 2);
   2509err_release_pci0:
   2510	pci_release_region(pdev, 0);
   2511err_release_fb:
   2512        framebuffer_release(info);
   2513err_disable:
   2514err_out:
   2515	return ret;
   2516}
   2517
   2518
   2519
   2520static void radeonfb_pci_unregister(struct pci_dev *pdev)
   2521{
   2522        struct fb_info *info = pci_get_drvdata(pdev);
   2523        struct radeonfb_info *rinfo = info->par;
   2524 
   2525        if (!rinfo)
   2526                return;
   2527
   2528	radeonfb_pm_exit(rinfo);
   2529
   2530	if (rinfo->mon1_EDID)
   2531		sysfs_remove_bin_file(&rinfo->pdev->dev.kobj, &edid1_attr);
   2532	if (rinfo->mon2_EDID)
   2533		sysfs_remove_bin_file(&rinfo->pdev->dev.kobj, &edid2_attr);
   2534
   2535	del_timer_sync(&rinfo->lvds_timer);
   2536	arch_phys_wc_del(rinfo->wc_cookie);
   2537        unregister_framebuffer(info);
   2538
   2539        radeonfb_bl_exit(rinfo);
   2540
   2541        iounmap(rinfo->mmio_base);
   2542        iounmap(rinfo->fb_base);
   2543 
   2544	pci_release_region(pdev, 2);
   2545	pci_release_region(pdev, 0);
   2546
   2547	kfree(rinfo->mon1_EDID);
   2548	kfree(rinfo->mon2_EDID);
   2549	if (rinfo->mon1_modedb)
   2550		fb_destroy_modedb(rinfo->mon1_modedb);
   2551#ifdef CONFIG_FB_RADEON_I2C
   2552	radeon_delete_i2c_busses(rinfo);
   2553#endif        
   2554	fb_dealloc_cmap(&info->cmap);
   2555        framebuffer_release(info);
   2556}
   2557
   2558#ifdef CONFIG_PM
   2559#define RADEONFB_PCI_PM_OPS (&radeonfb_pci_pm_ops)
   2560#else
   2561#define RADEONFB_PCI_PM_OPS NULL
   2562#endif
   2563
   2564static struct pci_driver radeonfb_driver = {
   2565	.name		= "radeonfb",
   2566	.id_table	= radeonfb_pci_table,
   2567	.probe		= radeonfb_pci_register,
   2568	.remove		= radeonfb_pci_unregister,
   2569	.driver.pm	= RADEONFB_PCI_PM_OPS,
   2570};
   2571
   2572#ifndef MODULE
   2573static int __init radeonfb_setup (char *options)
   2574{
   2575	char *this_opt;
   2576
   2577	if (!options || !*options)
   2578		return 0;
   2579
   2580	while ((this_opt = strsep (&options, ",")) != NULL) {
   2581		if (!*this_opt)
   2582			continue;
   2583
   2584		if (!strncmp(this_opt, "noaccel", 7)) {
   2585			noaccel = 1;
   2586		} else if (!strncmp(this_opt, "mirror", 6)) {
   2587			mirror = 1;
   2588		} else if (!strncmp(this_opt, "force_dfp", 9)) {
   2589			force_dfp = 1;
   2590		} else if (!strncmp(this_opt, "panel_yres:", 11)) {
   2591			panel_yres = simple_strtoul((this_opt+11), NULL, 0);
   2592		} else if (!strncmp(this_opt, "backlight:", 10)) {
   2593			backlight = simple_strtoul(this_opt+10, NULL, 0);
   2594		} else if (!strncmp(this_opt, "nomtrr", 6)) {
   2595			nomtrr = 1;
   2596		} else if (!strncmp(this_opt, "nomodeset", 9)) {
   2597			nomodeset = 1;
   2598		} else if (!strncmp(this_opt, "force_measure_pll", 17)) {
   2599			force_measure_pll = 1;
   2600		} else if (!strncmp(this_opt, "ignore_edid", 11)) {
   2601			ignore_edid = 1;
   2602#if defined(CONFIG_PM) && defined(CONFIG_X86)
   2603	 	} else if (!strncmp(this_opt, "force_sleep", 11)) {
   2604			force_sleep = 1;
   2605		} else if (!strncmp(this_opt, "ignore_devlist", 14)) {
   2606			ignore_devlist = 1;
   2607#endif
   2608		} else
   2609			mode_option = this_opt;
   2610	}
   2611	return 0;
   2612}
   2613#endif  /*  MODULE  */
   2614
   2615static int __init radeonfb_init (void)
   2616{
   2617#ifndef MODULE
   2618	char *option = NULL;
   2619
   2620	if (fb_get_options("radeonfb", &option))
   2621		return -ENODEV;
   2622	radeonfb_setup(option);
   2623#endif
   2624	return pci_register_driver (&radeonfb_driver);
   2625}
   2626
   2627
   2628static void __exit radeonfb_exit (void)
   2629{
   2630	pci_unregister_driver (&radeonfb_driver);
   2631}
   2632
   2633module_init(radeonfb_init);
   2634module_exit(radeonfb_exit);
   2635
   2636MODULE_AUTHOR("Ani Joshi");
   2637MODULE_DESCRIPTION("framebuffer driver for ATI Radeon chipset");
   2638MODULE_LICENSE("GPL");
   2639module_param(noaccel, bool, 0);
   2640module_param(default_dynclk, int, 0);
   2641MODULE_PARM_DESC(default_dynclk, "int: -2=enable on mobility only,-1=do not change,0=off,1=on");
   2642MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
   2643module_param(nomodeset, bool, 0);
   2644MODULE_PARM_DESC(nomodeset, "bool: disable actual setting of video mode");
   2645module_param(mirror, bool, 0);
   2646MODULE_PARM_DESC(mirror, "bool: mirror the display to both monitors");
   2647module_param(force_dfp, bool, 0);
   2648MODULE_PARM_DESC(force_dfp, "bool: force display to dfp");
   2649module_param(ignore_edid, bool, 0);
   2650MODULE_PARM_DESC(ignore_edid, "bool: Ignore EDID data when doing DDC probe");
   2651module_param(monitor_layout, charp, 0);
   2652MODULE_PARM_DESC(monitor_layout, "Specify monitor mapping (like XFree86)");
   2653module_param(force_measure_pll, bool, 0);
   2654MODULE_PARM_DESC(force_measure_pll, "Force measurement of PLL (debug)");
   2655module_param(nomtrr, bool, 0);
   2656MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers");
   2657module_param(panel_yres, int, 0);
   2658MODULE_PARM_DESC(panel_yres, "int: set panel yres");
   2659module_param(mode_option, charp, 0);
   2660MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
   2661#if defined(CONFIG_PM) && defined(CONFIG_X86)
   2662module_param(force_sleep, bool, 0);
   2663MODULE_PARM_DESC(force_sleep, "bool: force D2 sleep mode on all hardware");
   2664module_param(ignore_devlist, bool, 0);
   2665MODULE_PARM_DESC(ignore_devlist, "bool: ignore workarounds for bugs in specific laptops");
   2666#endif