Linux Audio

Check our new training course

Loading...
v5.4
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright 2010 Matt Turner.
   4 * Copyright 2012 Red Hat
   5 *
 
 
 
 
   6 * Authors: Matthew Garrett
   7 *	    Matt Turner
   8 *	    Dave Airlie
   9 */
  10
  11#include <linux/delay.h>
  12
  13#include <drm/drm_crtc_helper.h>
  14#include <drm/drm_fourcc.h>
  15#include <drm/drm_pci.h>
  16#include <drm/drm_plane_helper.h>
  17#include <drm/drm_probe_helper.h>
  18
  19#include "mgag200_drv.h"
  20
  21#define MGAG200_LUT_SIZE 256
  22
  23/*
  24 * This file contains setup code for the CRTC.
  25 */
  26
  27static void mga_crtc_load_lut(struct drm_crtc *crtc)
  28{
 
  29	struct drm_device *dev = crtc->dev;
  30	struct mga_device *mdev = dev->dev_private;
  31	struct drm_framebuffer *fb = crtc->primary->fb;
  32	u16 *r_ptr, *g_ptr, *b_ptr;
  33	int i;
  34
  35	if (!crtc->enabled)
  36		return;
  37
  38	r_ptr = crtc->gamma_store;
  39	g_ptr = r_ptr + crtc->gamma_size;
  40	b_ptr = g_ptr + crtc->gamma_size;
  41
  42	WREG8(DAC_INDEX + MGA1064_INDEX, 0);
  43
  44	if (fb && fb->format->cpp[0] * 8 == 16) {
  45		int inc = (fb->format->depth == 15) ? 8 : 4;
  46		u8 r, b;
  47		for (i = 0; i < MGAG200_LUT_SIZE; i += inc) {
  48			if (fb->format->depth == 16) {
  49				if (i > (MGAG200_LUT_SIZE >> 1)) {
  50					r = b = 0;
  51				} else {
  52					r = *r_ptr++ >> 8;
  53					b = *b_ptr++ >> 8;
  54					r_ptr++;
  55					b_ptr++;
  56				}
  57			} else {
  58				r = *r_ptr++ >> 8;
  59				b = *b_ptr++ >> 8;
  60			}
  61			/* VGA registers */
  62			WREG8(DAC_INDEX + MGA1064_COL_PAL, r);
  63			WREG8(DAC_INDEX + MGA1064_COL_PAL, *g_ptr++ >> 8);
  64			WREG8(DAC_INDEX + MGA1064_COL_PAL, b);
  65		}
  66		return;
  67	}
  68	for (i = 0; i < MGAG200_LUT_SIZE; i++) {
  69		/* VGA registers */
  70		WREG8(DAC_INDEX + MGA1064_COL_PAL, *r_ptr++ >> 8);
  71		WREG8(DAC_INDEX + MGA1064_COL_PAL, *g_ptr++ >> 8);
  72		WREG8(DAC_INDEX + MGA1064_COL_PAL, *b_ptr++ >> 8);
  73	}
  74}
  75
  76static inline void mga_wait_vsync(struct mga_device *mdev)
  77{
  78	unsigned long timeout = jiffies + HZ/10;
  79	unsigned int status = 0;
  80
  81	do {
  82		status = RREG32(MGAREG_Status);
  83	} while ((status & 0x08) && time_before(jiffies, timeout));
  84	timeout = jiffies + HZ/10;
 
  85	status = 0;
  86	do {
  87		status = RREG32(MGAREG_Status);
  88	} while (!(status & 0x08) && time_before(jiffies, timeout));
 
  89}
  90
  91static inline void mga_wait_busy(struct mga_device *mdev)
  92{
  93	unsigned long timeout = jiffies + HZ;
  94	unsigned int status = 0;
  95	do {
  96		status = RREG8(MGAREG_Status + 2);
  97	} while ((status & 0x01) && time_before(jiffies, timeout));
 
  98}
  99
 100#define P_ARRAY_SIZE 9
 
 
 
 
 
 
 
 
 
 
 101
 102static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
 103{
 104	unsigned int vcomax, vcomin, pllreffreq;
 105	unsigned int delta, tmpdelta, permitteddelta;
 106	unsigned int testp, testm, testn;
 107	unsigned int p, m, n;
 108	unsigned int computed;
 109	unsigned int pvalues_e4[P_ARRAY_SIZE] = {16, 14, 12, 10, 8, 6, 4, 2, 1};
 110	unsigned int fvv;
 111	unsigned int i;
 112
 113	if (mdev->unique_rev_id <= 0x03) {
 114
 115		m = n = p = 0;
 116		vcomax = 320000;
 117		vcomin = 160000;
 118		pllreffreq = 25000;
 119
 120		delta = 0xffffffff;
 121		permitteddelta = clock * 5 / 1000;
 122
 123		for (testp = 8; testp > 0; testp /= 2) {
 124			if (clock * testp > vcomax)
 125				continue;
 126			if (clock * testp < vcomin)
 127				continue;
 128
 129			for (testn = 17; testn < 256; testn++) {
 130				for (testm = 1; testm < 32; testm++) {
 131					computed = (pllreffreq * testn) /
 132						(testm * testp);
 133					if (computed > clock)
 134						tmpdelta = computed - clock;
 135					else
 136						tmpdelta = clock - computed;
 137					if (tmpdelta < delta) {
 138						delta = tmpdelta;
 139						m = testm - 1;
 140						n = testn - 1;
 141						p = testp - 1;
 142					}
 143				}
 144			}
 145		}
 146	} else {
 147
 
 
 
 
 148
 149		m = n = p = 0;
 150		vcomax        = 1600000;
 151		vcomin        = 800000;
 152		pllreffreq    = 25000;
 153
 154		if (clock < 25000)
 155			clock = 25000;
 156
 157		clock = clock * 2;
 158
 159		delta = 0xFFFFFFFF;
 160		/* Permited delta is 0.5% as VESA Specification */
 161		permitteddelta = clock * 5 / 1000;
 162
 163		for (i = 0 ; i < P_ARRAY_SIZE ; i++) {
 164			testp = pvalues_e4[i];
 165
 166			if ((clock * testp) > vcomax)
 167				continue;
 168			if ((clock * testp) < vcomin)
 169				continue;
 170
 171			for (testn = 50; testn <= 256; testn++) {
 172				for (testm = 1; testm <= 32; testm++) {
 173					computed = (pllreffreq * testn) /
 174						(testm * testp);
 175					if (computed > clock)
 176						tmpdelta = computed - clock;
 177					else
 178						tmpdelta = clock - computed;
 179
 180					if (tmpdelta < delta) {
 181						delta = tmpdelta;
 182						m = testm - 1;
 183						n = testn - 1;
 184						p = testp - 1;
 185					}
 
 
 
 
 
 
 
 
 
 
 
 
 
 186				}
 187			}
 188		}
 189
 190		fvv = pllreffreq * (n + 1) / (m + 1);
 191		fvv = (fvv - 800000) / 50000;
 192
 193		if (fvv > 15)
 194			fvv = 15;
 195
 196		p |= (fvv << 4);
 197		m |= 0x80;
 198
 199		clock = clock / 2;
 200	}
 201
 202	if (delta > permitteddelta) {
 203		pr_warn("PLL delta too large\n");
 204		return 1;
 205	}
 206
 207	WREG_DAC(MGA1064_PIX_PLLC_M, m);
 208	WREG_DAC(MGA1064_PIX_PLLC_N, n);
 209	WREG_DAC(MGA1064_PIX_PLLC_P, p);
 210
 211	if (mdev->unique_rev_id >= 0x04) {
 212		WREG_DAC(0x1a, 0x09);
 213		msleep(20);
 214		WREG_DAC(0x1a, 0x01);
 215
 216	}
 217
 218	return 0;
 219}
 220
 221static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)
 222{
 223	unsigned int vcomax, vcomin, pllreffreq;
 224	unsigned int delta, tmpdelta;
 225	unsigned int testp, testm, testn, testp2;
 226	unsigned int p, m, n;
 227	unsigned int computed;
 228	int i, j, tmpcount, vcount;
 229	bool pll_locked = false;
 230	u8 tmp;
 231
 232	m = n = p = 0;
 
 
 
 233
 234	delta = 0xffffffff;
 
 235
 236	if (mdev->type == G200_EW3) {
 237
 238		vcomax = 800000;
 239		vcomin = 400000;
 240		pllreffreq = 25000;
 241
 242		for (testp = 1; testp < 8; testp++) {
 243			for (testp2 = 1; testp2 < 8; testp2++) {
 244				if (testp < testp2)
 245					continue;
 246				if ((clock * testp * testp2) > vcomax)
 247					continue;
 248				if ((clock * testp * testp2) < vcomin)
 249					continue;
 250				for (testm = 1; testm < 26; testm++) {
 251					for (testn = 32; testn < 2048 ; testn++) {
 252						computed = (pllreffreq * testn) /
 253							(testm * testp * testp2);
 254						if (computed > clock)
 255							tmpdelta = computed - clock;
 256						else
 257							tmpdelta = clock - computed;
 258						if (tmpdelta < delta) {
 259							delta = tmpdelta;
 260							m = ((testn & 0x100) >> 1) |
 261								(testm);
 262							n = (testn & 0xFF);
 263							p = ((testn & 0x600) >> 3) |
 264								(testp2 << 3) |
 265								(testp);
 266						}
 267					}
 268				}
 269			}
 270		}
 271	} else {
 272
 273		vcomax = 550000;
 274		vcomin = 150000;
 275		pllreffreq = 48000;
 276
 277		for (testp = 1; testp < 9; testp++) {
 278			if (clock * testp > vcomax)
 279				continue;
 280			if (clock * testp < vcomin)
 281				continue;
 282
 283			for (testm = 1; testm < 17; testm++) {
 284				for (testn = 1; testn < 151; testn++) {
 285					computed = (pllreffreq * testn) /
 286						(testm * testp);
 287					if (computed > clock)
 288						tmpdelta = computed - clock;
 289					else
 290						tmpdelta = clock - computed;
 291					if (tmpdelta < delta) {
 292						delta = tmpdelta;
 293						n = testn - 1;
 294						m = (testm - 1) |
 295							((n >> 1) & 0x80);
 296						p = testp - 1;
 297					}
 298				}
 299			}
 300		}
 301	}
 302
 303	for (i = 0; i <= 32 && pll_locked == false; i++) {
 304		if (i > 0) {
 305			WREG8(MGAREG_CRTC_INDEX, 0x1e);
 306			tmp = RREG8(MGAREG_CRTC_DATA);
 307			if (tmp < 0xff)
 308				WREG8(MGAREG_CRTC_DATA, tmp+1);
 309		}
 310
 311		/* set pixclkdis to 1 */
 312		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 313		tmp = RREG8(DAC_DATA);
 314		tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 315		WREG8(DAC_DATA, tmp);
 316
 317		WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 318		tmp = RREG8(DAC_DATA);
 319		tmp |= MGA1064_REMHEADCTL_CLKDIS;
 320		WREG8(DAC_DATA, tmp);
 321
 322		/* select PLL Set C */
 323		tmp = RREG8(MGAREG_MEM_MISC_READ);
 324		tmp |= 0x3 << 2;
 325		WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 326
 327		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 328		tmp = RREG8(DAC_DATA);
 329		tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN | 0x80;
 330		WREG8(DAC_DATA, tmp);
 331
 332		udelay(500);
 333
 334		/* reset the PLL */
 335		WREG8(DAC_INDEX, MGA1064_VREF_CTL);
 336		tmp = RREG8(DAC_DATA);
 337		tmp &= ~0x04;
 338		WREG8(DAC_DATA, tmp);
 339
 340		udelay(50);
 341
 342		/* program pixel pll register */
 343		WREG_DAC(MGA1064_WB_PIX_PLLC_N, n);
 344		WREG_DAC(MGA1064_WB_PIX_PLLC_M, m);
 345		WREG_DAC(MGA1064_WB_PIX_PLLC_P, p);
 346
 347		udelay(50);
 348
 349		/* turn pll on */
 350		WREG8(DAC_INDEX, MGA1064_VREF_CTL);
 351		tmp = RREG8(DAC_DATA);
 352		tmp |= 0x04;
 353		WREG_DAC(MGA1064_VREF_CTL, tmp);
 354
 355		udelay(500);
 356
 357		/* select the pixel pll */
 358		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 359		tmp = RREG8(DAC_DATA);
 360		tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 361		tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 362		WREG8(DAC_DATA, tmp);
 363
 364		WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 365		tmp = RREG8(DAC_DATA);
 366		tmp &= ~MGA1064_REMHEADCTL_CLKSL_MSK;
 367		tmp |= MGA1064_REMHEADCTL_CLKSL_PLL;
 368		WREG8(DAC_DATA, tmp);
 369
 370		/* reset dotclock rate bit */
 371		WREG8(MGAREG_SEQ_INDEX, 1);
 372		tmp = RREG8(MGAREG_SEQ_DATA);
 373		tmp &= ~0x8;
 374		WREG8(MGAREG_SEQ_DATA, tmp);
 375
 376		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 377		tmp = RREG8(DAC_DATA);
 378		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 379		WREG8(DAC_DATA, tmp);
 380
 381		vcount = RREG8(MGAREG_VCOUNT);
 382
 383		for (j = 0; j < 30 && pll_locked == false; j++) {
 384			tmpcount = RREG8(MGAREG_VCOUNT);
 385			if (tmpcount < vcount)
 386				vcount = 0;
 387			if ((tmpcount - vcount) > 2)
 388				pll_locked = true;
 389			else
 390				udelay(5);
 391		}
 392	}
 393	WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 394	tmp = RREG8(DAC_DATA);
 395	tmp &= ~MGA1064_REMHEADCTL_CLKDIS;
 396	WREG_DAC(MGA1064_REMHEADCTL, tmp);
 397	return 0;
 398}
 399
 400static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)
 401{
 402	unsigned int vcomax, vcomin, pllreffreq;
 403	unsigned int delta, tmpdelta;
 404	unsigned int testp, testm, testn;
 405	unsigned int p, m, n;
 406	unsigned int computed;
 407	u8 tmp;
 408
 409	m = n = p = 0;
 410	vcomax = 550000;
 411	vcomin = 150000;
 412	pllreffreq = 50000;
 413
 414	delta = 0xffffffff;
 
 415
 416	for (testp = 16; testp > 0; testp--) {
 417		if (clock * testp > vcomax)
 418			continue;
 419		if (clock * testp < vcomin)
 420			continue;
 421
 422		for (testn = 1; testn < 257; testn++) {
 423			for (testm = 1; testm < 17; testm++) {
 424				computed = (pllreffreq * testn) /
 425					(testm * testp);
 426				if (computed > clock)
 427					tmpdelta = computed - clock;
 428				else
 429					tmpdelta = clock - computed;
 430				if (tmpdelta < delta) {
 431					delta = tmpdelta;
 432					n = testn - 1;
 433					m = testm - 1;
 434					p = testp - 1;
 435				}
 436			}
 437		}
 438	}
 439
 440	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 441	tmp = RREG8(DAC_DATA);
 442	tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 443	WREG8(DAC_DATA, tmp);
 444
 445	tmp = RREG8(MGAREG_MEM_MISC_READ);
 446	tmp |= 0x3 << 2;
 447	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 448
 449	WREG8(DAC_INDEX, MGA1064_PIX_PLL_STAT);
 450	tmp = RREG8(DAC_DATA);
 451	WREG8(DAC_DATA, tmp & ~0x40);
 452
 453	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 454	tmp = RREG8(DAC_DATA);
 455	tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 456	WREG8(DAC_DATA, tmp);
 457
 458	WREG_DAC(MGA1064_EV_PIX_PLLC_M, m);
 459	WREG_DAC(MGA1064_EV_PIX_PLLC_N, n);
 460	WREG_DAC(MGA1064_EV_PIX_PLLC_P, p);
 461
 462	udelay(50);
 463
 464	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 465	tmp = RREG8(DAC_DATA);
 466	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 467	WREG8(DAC_DATA, tmp);
 468
 469	udelay(500);
 470
 471	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 472	tmp = RREG8(DAC_DATA);
 473	tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 474	tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 475	WREG8(DAC_DATA, tmp);
 476
 477	WREG8(DAC_INDEX, MGA1064_PIX_PLL_STAT);
 478	tmp = RREG8(DAC_DATA);
 479	WREG8(DAC_DATA, tmp | 0x40);
 480
 481	tmp = RREG8(MGAREG_MEM_MISC_READ);
 482	tmp |= (0x3 << 2);
 483	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 484
 485	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 486	tmp = RREG8(DAC_DATA);
 487	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 488	WREG8(DAC_DATA, tmp);
 489
 490	return 0;
 491}
 492
 493static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)
 494{
 495	unsigned int vcomax, vcomin, pllreffreq;
 496	unsigned int delta, tmpdelta;
 497	unsigned int testp, testm, testn;
 498	unsigned int p, m, n;
 499	unsigned int computed;
 500	int i, j, tmpcount, vcount;
 501	u8 tmp;
 502	bool pll_locked = false;
 503
 504	m = n = p = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 505
 506	if (mdev->type == G200_EH3) {
 507		vcomax = 3000000;
 508		vcomin = 1500000;
 509		pllreffreq = 25000;
 510
 511		delta = 0xffffffff;
 512
 513		testp = 0;
 514
 515		for (testm = 150; testm >= 6; testm--) {
 516			if (clock * testm > vcomax)
 517				continue;
 518			if (clock * testm < vcomin)
 519				continue;
 520			for (testn = 120; testn >= 60; testn--) {
 521				computed = (pllreffreq * testn) / testm;
 522				if (computed > clock)
 523					tmpdelta = computed - clock;
 524				else
 525					tmpdelta = clock - computed;
 526				if (tmpdelta < delta) {
 527					delta = tmpdelta;
 528					n = testn;
 529					m = testm;
 530					p = testp;
 531				}
 532				if (delta == 0)
 533					break;
 534			}
 535			if (delta == 0)
 536				break;
 537		}
 538	} else {
 539
 540		vcomax = 800000;
 541		vcomin = 400000;
 542		pllreffreq = 33333;
 543
 544		delta = 0xffffffff;
 545
 546		for (testp = 16; testp > 0; testp >>= 1) {
 547			if (clock * testp > vcomax)
 548				continue;
 549			if (clock * testp < vcomin)
 550				continue;
 551
 552			for (testm = 1; testm < 33; testm++) {
 553				for (testn = 17; testn < 257; testn++) {
 554					computed = (pllreffreq * testn) /
 555						(testm * testp);
 556					if (computed > clock)
 557						tmpdelta = computed - clock;
 558					else
 559						tmpdelta = clock - computed;
 560					if (tmpdelta < delta) {
 561						delta = tmpdelta;
 562						n = testn - 1;
 563						m = (testm - 1);
 564						p = testp - 1;
 565					}
 566					if ((clock * testp) >= 600000)
 567						p |= 0x80;
 568				}
 
 
 569			}
 570		}
 571	}
 572	for (i = 0; i <= 32 && pll_locked == false; i++) {
 573		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 574		tmp = RREG8(DAC_DATA);
 575		tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 576		WREG8(DAC_DATA, tmp);
 577
 578		tmp = RREG8(MGAREG_MEM_MISC_READ);
 579		tmp |= 0x3 << 2;
 580		WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 581
 582		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 583		tmp = RREG8(DAC_DATA);
 584		tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 585		WREG8(DAC_DATA, tmp);
 586
 587		udelay(500);
 588
 589		WREG_DAC(MGA1064_EH_PIX_PLLC_M, m);
 590		WREG_DAC(MGA1064_EH_PIX_PLLC_N, n);
 591		WREG_DAC(MGA1064_EH_PIX_PLLC_P, p);
 592
 593		udelay(500);
 594
 595		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 596		tmp = RREG8(DAC_DATA);
 597		tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 598		tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 599		WREG8(DAC_DATA, tmp);
 600
 601		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 602		tmp = RREG8(DAC_DATA);
 603		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 604		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 605		WREG8(DAC_DATA, tmp);
 606
 607		vcount = RREG8(MGAREG_VCOUNT);
 608
 609		for (j = 0; j < 30 && pll_locked == false; j++) {
 610			tmpcount = RREG8(MGAREG_VCOUNT);
 611			if (tmpcount < vcount)
 612				vcount = 0;
 613			if ((tmpcount - vcount) > 2)
 614				pll_locked = true;
 615			else
 616				udelay(5);
 617		}
 618	}
 619
 620	return 0;
 621}
 622
 623static int mga_g200er_set_plls(struct mga_device *mdev, long clock)
 624{
 625	unsigned int vcomax, vcomin, pllreffreq;
 626	unsigned int delta, tmpdelta;
 627	int testr, testn, testm, testo;
 628	unsigned int p, m, n;
 629	unsigned int computed, vco;
 630	int tmp;
 631	const unsigned int m_div_val[] = { 1, 2, 4, 8 };
 632
 633	m = n = p = 0;
 634	vcomax = 1488000;
 635	vcomin = 1056000;
 636	pllreffreq = 48000;
 637
 638	delta = 0xffffffff;
 639
 640	for (testr = 0; testr < 4; testr++) {
 641		if (delta == 0)
 642			break;
 643		for (testn = 5; testn < 129; testn++) {
 644			if (delta == 0)
 645				break;
 646			for (testm = 3; testm >= 0; testm--) {
 647				if (delta == 0)
 648					break;
 649				for (testo = 5; testo < 33; testo++) {
 650					vco = pllreffreq * (testn + 1) /
 651						(testr + 1);
 652					if (vco < vcomin)
 653						continue;
 654					if (vco > vcomax)
 655						continue;
 656					computed = vco / (m_div_val[testm] * (testo + 1));
 657					if (computed > clock)
 658						tmpdelta = computed - clock;
 659					else
 660						tmpdelta = clock - computed;
 661					if (tmpdelta < delta) {
 662						delta = tmpdelta;
 663						m = testm | (testo << 3);
 664						n = testn;
 665						p = testr | (testr << 3);
 666					}
 667				}
 668			}
 669		}
 670	}
 671
 672	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 673	tmp = RREG8(DAC_DATA);
 674	tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 675	WREG8(DAC_DATA, tmp);
 676
 677	WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 678	tmp = RREG8(DAC_DATA);
 679	tmp |= MGA1064_REMHEADCTL_CLKDIS;
 680	WREG8(DAC_DATA, tmp);
 681
 682	tmp = RREG8(MGAREG_MEM_MISC_READ);
 683	tmp |= (0x3<<2) | 0xc0;
 684	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 685
 686	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 687	tmp = RREG8(DAC_DATA);
 688	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 689	tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 690	WREG8(DAC_DATA, tmp);
 691
 692	udelay(500);
 693
 694	WREG_DAC(MGA1064_ER_PIX_PLLC_N, n);
 695	WREG_DAC(MGA1064_ER_PIX_PLLC_M, m);
 696	WREG_DAC(MGA1064_ER_PIX_PLLC_P, p);
 697
 698	udelay(50);
 699
 700	return 0;
 701}
 702
 703static int mga_crtc_set_plls(struct mga_device *mdev, long clock)
 704{
 705	switch(mdev->type) {
 706	case G200_SE_A:
 707	case G200_SE_B:
 708		return mga_g200se_set_plls(mdev, clock);
 709		break;
 710	case G200_WB:
 711	case G200_EW3:
 712		return mga_g200wb_set_plls(mdev, clock);
 713		break;
 714	case G200_EV:
 715		return mga_g200ev_set_plls(mdev, clock);
 716		break;
 717	case G200_EH:
 718	case G200_EH3:
 719		return mga_g200eh_set_plls(mdev, clock);
 720		break;
 721	case G200_ER:
 722		return mga_g200er_set_plls(mdev, clock);
 723		break;
 724	}
 725	return 0;
 726}
 727
 728static void mga_g200wb_prepare(struct drm_crtc *crtc)
 729{
 730	struct mga_device *mdev = crtc->dev->dev_private;
 731	u8 tmp;
 732	int iter_max;
 733
 734	/* 1- The first step is to warn the BMC of an upcoming mode change.
 735	 * We are putting the misc<0> to output.*/
 736
 737	WREG8(DAC_INDEX, MGA1064_GEN_IO_CTL);
 738	tmp = RREG8(DAC_DATA);
 739	tmp |= 0x10;
 740	WREG_DAC(MGA1064_GEN_IO_CTL, tmp);
 741
 742	/* we are putting a 1 on the misc<0> line */
 743	WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
 744	tmp = RREG8(DAC_DATA);
 745	tmp |= 0x10;
 746	WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
 747
 748	/* 2- Second step to mask and further scan request
 749	 * This will be done by asserting the remfreqmsk bit (XSPAREREG<7>)
 750	 */
 751	WREG8(DAC_INDEX, MGA1064_SPAREREG);
 752	tmp = RREG8(DAC_DATA);
 753	tmp |= 0x80;
 754	WREG_DAC(MGA1064_SPAREREG, tmp);
 755
 756	/* 3a- the third step is to verifu if there is an active scan
 757	 * We are searching for a 0 on remhsyncsts <XSPAREREG<0>)
 758	 */
 759	iter_max = 300;
 760	while (!(tmp & 0x1) && iter_max) {
 761		WREG8(DAC_INDEX, MGA1064_SPAREREG);
 762		tmp = RREG8(DAC_DATA);
 763		udelay(1000);
 764		iter_max--;
 765	}
 766
 767	/* 3b- this step occurs only if the remove is actually scanning
 768	 * we are waiting for the end of the frame which is a 1 on
 769	 * remvsyncsts (XSPAREREG<1>)
 770	 */
 771	if (iter_max) {
 772		iter_max = 300;
 773		while ((tmp & 0x2) && iter_max) {
 774			WREG8(DAC_INDEX, MGA1064_SPAREREG);
 775			tmp = RREG8(DAC_DATA);
 776			udelay(1000);
 777			iter_max--;
 778		}
 779	}
 780}
 781
 782static void mga_g200wb_commit(struct drm_crtc *crtc)
 783{
 784	u8 tmp;
 785	struct mga_device *mdev = crtc->dev->dev_private;
 786
 787	/* 1- The first step is to ensure that the vrsten and hrsten are set */
 788	WREG8(MGAREG_CRTCEXT_INDEX, 1);
 789	tmp = RREG8(MGAREG_CRTCEXT_DATA);
 790	WREG8(MGAREG_CRTCEXT_DATA, tmp | 0x88);
 791
 792	/* 2- second step is to assert the rstlvl2 */
 793	WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
 794	tmp = RREG8(DAC_DATA);
 795	tmp |= 0x8;
 796	WREG8(DAC_DATA, tmp);
 797
 798	/* wait 10 us */
 799	udelay(10);
 800
 801	/* 3- deassert rstlvl2 */
 802	tmp &= ~0x08;
 803	WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
 804	WREG8(DAC_DATA, tmp);
 805
 806	/* 4- remove mask of scan request */
 807	WREG8(DAC_INDEX, MGA1064_SPAREREG);
 808	tmp = RREG8(DAC_DATA);
 809	tmp &= ~0x80;
 810	WREG8(DAC_DATA, tmp);
 811
 812	/* 5- put back a 0 on the misc<0> line */
 813	WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
 814	tmp = RREG8(DAC_DATA);
 815	tmp &= ~0x10;
 816	WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
 817}
 818
 819/*
 820   This is how the framebuffer base address is stored in g200 cards:
 821   * Assume @offset is the gpu_addr variable of the framebuffer object
 822   * Then addr is the number of _pixels_ (not bytes) from the start of
 823     VRAM to the first pixel we want to display. (divided by 2 for 32bit
 824     framebuffers)
 825   * addr is stored in the CRTCEXT0, CRTCC and CRTCD registers
 826   addr<20> -> CRTCEXT0<6>
 827   addr<19-16> -> CRTCEXT0<3-0>
 828   addr<15-8> -> CRTCC<7-0>
 829   addr<7-0> -> CRTCD<7-0>
 830   CRTCEXT0 has to be programmed last to trigger an update and make the
 831   new addr variable take effect.
 832 */
 833static void mga_set_start_address(struct drm_crtc *crtc, unsigned offset)
 834{
 835	struct mga_device *mdev = crtc->dev->dev_private;
 836	u32 addr;
 837	int count;
 838	u8 crtcext0;
 839
 840	while (RREG8(0x1fda) & 0x08);
 841	while (!(RREG8(0x1fda) & 0x08));
 842
 843	count = RREG8(MGAREG_VCOUNT) + 2;
 844	while (RREG8(MGAREG_VCOUNT) < count);
 845
 846	WREG8(MGAREG_CRTCEXT_INDEX, 0);
 847	crtcext0 = RREG8(MGAREG_CRTCEXT_DATA);
 848	crtcext0 &= 0xB0;
 849	addr = offset / 8;
 850	/* Can't store addresses any higher than that...
 851	   but we also don't have more than 16MB of memory, so it should be fine. */
 852	WARN_ON(addr > 0x1fffff);
 853	crtcext0 |= (!!(addr & (1<<20)))<<6;
 854	WREG_CRT(0x0d, (u8)(addr & 0xff));
 855	WREG_CRT(0x0c, (u8)(addr >> 8) & 0xff);
 856	WREG_ECRT(0x0, ((u8)(addr >> 16) & 0xf) | crtcext0);
 857}
 858
 
 
 859static int mga_crtc_do_set_base(struct drm_crtc *crtc,
 860				struct drm_framebuffer *fb,
 861				int x, int y, int atomic)
 862{
 863	struct drm_gem_vram_object *gbo;
 
 
 
 864	int ret;
 865	s64 gpu_addr;
 866
 
 867	if (!atomic && fb) {
 868		gbo = drm_gem_vram_of_gem(fb->obj[0]);
 869		drm_gem_vram_unpin(gbo);
 
 
 
 
 
 
 870	}
 871
 872	gbo = drm_gem_vram_of_gem(crtc->primary->fb->obj[0]);
 
 
 873
 874	ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
 875	if (ret)
 876		return ret;
 877	gpu_addr = drm_gem_vram_offset(gbo);
 878	if (gpu_addr < 0) {
 879		ret = (int)gpu_addr;
 880		goto err_drm_gem_vram_unpin;
 
 881	}
 882
 
 
 
 
 
 
 
 
 
 
 
 883	mga_set_start_address(crtc, (u32)gpu_addr);
 884
 885	return 0;
 886
 887err_drm_gem_vram_unpin:
 888	drm_gem_vram_unpin(gbo);
 889	return ret;
 890}
 891
 892static int mga_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 893				  struct drm_framebuffer *old_fb)
 894{
 895	return mga_crtc_do_set_base(crtc, old_fb, x, y, 0);
 896}
 897
 898static int mga_crtc_mode_set(struct drm_crtc *crtc,
 899				struct drm_display_mode *mode,
 900				struct drm_display_mode *adjusted_mode,
 901				int x, int y, struct drm_framebuffer *old_fb)
 902{
 903	struct drm_device *dev = crtc->dev;
 904	struct mga_device *mdev = dev->dev_private;
 905	const struct drm_framebuffer *fb = crtc->primary->fb;
 906	int hdisplay, hsyncstart, hsyncend, htotal;
 907	int vdisplay, vsyncstart, vsyncend, vtotal;
 908	int pitch;
 909	int option = 0, option2 = 0;
 910	int i;
 911	unsigned char misc = 0;
 912	unsigned char ext_vga[6];
 
 
 913	u8 bppshift;
 914
 915	static unsigned char dacvalue[] = {
 916		/* 0x00: */        0,    0,    0,    0,    0,    0, 0x00,    0,
 917		/* 0x08: */        0,    0,    0,    0,    0,    0,    0,    0,
 918		/* 0x10: */        0,    0,    0,    0,    0,    0,    0,    0,
 919		/* 0x18: */     0x00,    0, 0xC9, 0xFF, 0xBF, 0x20, 0x1F, 0x20,
 920		/* 0x20: */     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 921		/* 0x28: */     0x00, 0x00, 0x00, 0x00,    0,    0,    0, 0x40,
 922		/* 0x30: */     0x00, 0xB0, 0x00, 0xC2, 0x34, 0x14, 0x02, 0x83,
 923		/* 0x38: */     0x00, 0x93, 0x00, 0x77, 0x00, 0x00, 0x00, 0x3A,
 924		/* 0x40: */        0,    0,    0,    0,    0,    0,    0,    0,
 925		/* 0x48: */        0,    0,    0,    0,    0,    0,    0,    0
 926	};
 927
 928	bppshift = mdev->bpp_shifts[fb->format->cpp[0] - 1];
 929
 930	switch (mdev->type) {
 931	case G200_SE_A:
 932	case G200_SE_B:
 933		dacvalue[MGA1064_VREF_CTL] = 0x03;
 934		dacvalue[MGA1064_PIX_CLK_CTL] = MGA1064_PIX_CLK_CTL_SEL_PLL;
 935		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_DAC_EN |
 936					     MGA1064_MISC_CTL_VGA8 |
 937					     MGA1064_MISC_CTL_DAC_RAM_CS;
 938		if (mdev->has_sdram)
 939			option = 0x40049120;
 940		else
 941			option = 0x4004d120;
 942		option2 = 0x00008000;
 943		break;
 944	case G200_WB:
 945	case G200_EW3:
 946		dacvalue[MGA1064_VREF_CTL] = 0x07;
 947		option = 0x41049120;
 948		option2 = 0x0000b000;
 949		break;
 950	case G200_EV:
 951		dacvalue[MGA1064_PIX_CLK_CTL] = MGA1064_PIX_CLK_CTL_SEL_PLL;
 952		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_VGA8 |
 953					     MGA1064_MISC_CTL_DAC_RAM_CS;
 954		option = 0x00000120;
 955		option2 = 0x0000b000;
 956		break;
 957	case G200_EH:
 958	case G200_EH3:
 959		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_VGA8 |
 960					     MGA1064_MISC_CTL_DAC_RAM_CS;
 961		option = 0x00000120;
 962		option2 = 0x0000b000;
 963		break;
 964	case G200_ER:
 
 965		break;
 966	}
 967
 968	switch (fb->format->cpp[0] * 8) {
 969	case 8:
 970		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_8bits;
 971		break;
 972	case 16:
 973		if (fb->format->depth == 15)
 974			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_15bits;
 975		else
 976			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_16bits;
 977		break;
 978	case 24:
 979		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_24bits;
 980		break;
 981	case 32:
 982		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_32_24bits;
 983		break;
 984	}
 985
 986	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
 987		misc |= 0x40;
 988	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
 989		misc |= 0x80;
 990
 991
 992	for (i = 0; i < sizeof(dacvalue); i++) {
 993		if ((i <= 0x17) ||
 
 
 
 
 994		    (i == 0x1b) ||
 995		    (i == 0x1c) ||
 996		    ((i >= 0x1f) && (i <= 0x29)) ||
 997		    ((i >= 0x30) && (i <= 0x37)))
 998			continue;
 999		if (IS_G200_SE(mdev) &&
1000		    ((i == 0x2c) || (i == 0x2d) || (i == 0x2e)))
1001			continue;
1002		if ((mdev->type == G200_EV ||
1003		    mdev->type == G200_WB ||
1004		    mdev->type == G200_EH ||
1005		    mdev->type == G200_EW3 ||
1006		    mdev->type == G200_EH3) &&
1007		    (i >= 0x44) && (i <= 0x4e))
1008			continue;
1009
1010		WREG_DAC(i, dacvalue[i]);
1011	}
1012
1013	if (mdev->type == G200_ER)
1014		WREG_DAC(0x90, 0);
 
 
1015
1016	if (option)
1017		pci_write_config_dword(dev->pdev, PCI_MGA_OPTION, option);
1018	if (option2)
1019		pci_write_config_dword(dev->pdev, PCI_MGA_OPTION2, option2);
1020
1021	WREG_SEQ(2, 0xf);
1022	WREG_SEQ(3, 0);
1023	WREG_SEQ(4, 0xe);
1024
1025	pitch = fb->pitches[0] / fb->format->cpp[0];
1026	if (fb->format->cpp[0] * 8 == 24)
1027		pitch = (pitch * 3) >> (4 - bppshift);
1028	else
1029		pitch = pitch >> (4 - bppshift);
1030
1031	hdisplay = mode->hdisplay / 8 - 1;
1032	hsyncstart = mode->hsync_start / 8 - 1;
1033	hsyncend = mode->hsync_end / 8 - 1;
1034	htotal = mode->htotal / 8 - 1;
1035
1036	/* Work around hardware quirk */
1037	if ((htotal & 0x07) == 0x06 || (htotal & 0x07) == 0x04)
1038		htotal++;
1039
1040	vdisplay = mode->vdisplay - 1;
1041	vsyncstart = mode->vsync_start - 1;
1042	vsyncend = mode->vsync_end - 1;
1043	vtotal = mode->vtotal - 2;
1044
1045	WREG_GFX(0, 0);
1046	WREG_GFX(1, 0);
1047	WREG_GFX(2, 0);
1048	WREG_GFX(3, 0);
1049	WREG_GFX(4, 0);
1050	WREG_GFX(5, 0x40);
1051	WREG_GFX(6, 0x5);
1052	WREG_GFX(7, 0xf);
1053	WREG_GFX(8, 0xf);
1054
1055	WREG_CRT(0, htotal - 4);
1056	WREG_CRT(1, hdisplay);
1057	WREG_CRT(2, hdisplay);
1058	WREG_CRT(3, (htotal & 0x1F) | 0x80);
1059	WREG_CRT(4, hsyncstart);
1060	WREG_CRT(5, ((htotal & 0x20) << 2) | (hsyncend & 0x1F));
1061	WREG_CRT(6, vtotal & 0xFF);
1062	WREG_CRT(7, ((vtotal & 0x100) >> 8) |
1063		 ((vdisplay & 0x100) >> 7) |
1064		 ((vsyncstart & 0x100) >> 6) |
1065		 ((vdisplay & 0x100) >> 5) |
1066		 ((vdisplay & 0x100) >> 4) | /* linecomp */
1067		 ((vtotal & 0x200) >> 4)|
1068		 ((vdisplay & 0x200) >> 3) |
1069		 ((vsyncstart & 0x200) >> 2));
1070	WREG_CRT(9, ((vdisplay & 0x200) >> 4) |
1071		 ((vdisplay & 0x200) >> 3));
1072	WREG_CRT(10, 0);
1073	WREG_CRT(11, 0);
1074	WREG_CRT(12, 0);
1075	WREG_CRT(13, 0);
1076	WREG_CRT(14, 0);
1077	WREG_CRT(15, 0);
1078	WREG_CRT(16, vsyncstart & 0xFF);
1079	WREG_CRT(17, (vsyncend & 0x0F) | 0x20);
1080	WREG_CRT(18, vdisplay & 0xFF);
1081	WREG_CRT(19, pitch & 0xFF);
1082	WREG_CRT(20, 0);
1083	WREG_CRT(21, vdisplay & 0xFF);
1084	WREG_CRT(22, (vtotal + 1) & 0xFF);
1085	WREG_CRT(23, 0xc3);
1086	WREG_CRT(24, vdisplay & 0xFF);
1087
1088	ext_vga[0] = 0;
1089	ext_vga[5] = 0;
1090
1091	/* TODO interlace */
1092
1093	ext_vga[0] |= (pitch & 0x300) >> 4;
1094	ext_vga[1] = (((htotal - 4) & 0x100) >> 8) |
1095		((hdisplay & 0x100) >> 7) |
1096		((hsyncstart & 0x100) >> 6) |
1097		(htotal & 0x40);
1098	ext_vga[2] = ((vtotal & 0xc00) >> 10) |
1099		((vdisplay & 0x400) >> 8) |
1100		((vdisplay & 0xc00) >> 7) |
1101		((vsyncstart & 0xc00) >> 5) |
1102		((vdisplay & 0x400) >> 3);
1103	if (fb->format->cpp[0] * 8 == 24)
1104		ext_vga[3] = (((1 << bppshift) * 3) - 1) | 0x80;
1105	else
1106		ext_vga[3] = ((1 << bppshift) - 1) | 0x80;
1107	ext_vga[4] = 0;
1108	if (mdev->type == G200_WB || mdev->type == G200_EW3)
1109		ext_vga[1] |= 0x88;
1110
 
 
1111	/* Set pixel clocks */
1112	misc = 0x2d;
1113	WREG8(MGA_MISC_OUT, misc);
1114
1115	mga_crtc_set_plls(mdev, mode->clock);
1116
1117	for (i = 0; i < 6; i++) {
1118		WREG_ECRT(i, ext_vga[i]);
1119	}
1120
1121	if (mdev->type == G200_ER)
1122		WREG_ECRT(0x24, 0x5);
1123
1124	if (mdev->type == G200_EW3)
1125		WREG_ECRT(0x34, 0x5);
1126
1127	if (mdev->type == G200_EV) {
1128		WREG_ECRT(6, 0);
1129	}
1130
1131	WREG_ECRT(0, ext_vga[0]);
1132	/* Enable mga pixel clock */
1133	misc = 0x2d;
1134
1135	WREG8(MGA_MISC_OUT, misc);
1136
1137	if (adjusted_mode)
1138		memcpy(&mdev->mode, mode, sizeof(struct drm_display_mode));
1139
1140	mga_crtc_do_set_base(crtc, old_fb, x, y, 0);
1141
1142	/* reset tagfifo */
1143	if (mdev->type == G200_ER) {
1144		u32 mem_ctl = RREG32(MGAREG_MEMCTL);
1145		u8 seq1;
1146
1147		/* screen off */
1148		WREG8(MGAREG_SEQ_INDEX, 0x01);
1149		seq1 = RREG8(MGAREG_SEQ_DATA) | 0x20;
1150		WREG8(MGAREG_SEQ_DATA, seq1);
1151
1152		WREG32(MGAREG_MEMCTL, mem_ctl | 0x00200000);
1153		udelay(1000);
1154		WREG32(MGAREG_MEMCTL, mem_ctl & ~0x00200000);
1155
1156		WREG8(MGAREG_SEQ_DATA, seq1 & ~0x20);
1157	}
1158
1159
1160	if (IS_G200_SE(mdev)) {
1161		if  (mdev->unique_rev_id >= 0x04) {
1162			WREG8(MGAREG_CRTCEXT_INDEX, 0x06);
1163			WREG8(MGAREG_CRTCEXT_DATA, 0);
1164		} else if (mdev->unique_rev_id >= 0x02) {
1165			u8 hi_pri_lvl;
1166			u32 bpp;
1167			u32 mb;
1168
1169			if (fb->format->cpp[0] * 8 > 16)
1170				bpp = 32;
1171			else if (fb->format->cpp[0] * 8 > 8)
1172				bpp = 16;
1173			else
1174				bpp = 8;
1175
1176			mb = (mode->clock * bpp) / 1000;
1177			if (mb > 3100)
1178				hi_pri_lvl = 0;
1179			else if (mb > 2600)
1180				hi_pri_lvl = 1;
1181			else if (mb > 1900)
1182				hi_pri_lvl = 2;
1183			else if (mb > 1160)
1184				hi_pri_lvl = 3;
1185			else if (mb > 440)
1186				hi_pri_lvl = 4;
1187			else
1188				hi_pri_lvl = 5;
1189
1190			WREG8(MGAREG_CRTCEXT_INDEX, 0x06);
1191			WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl);
1192		} else {
1193			WREG8(MGAREG_CRTCEXT_INDEX, 0x06);
1194			if (mdev->unique_rev_id >= 0x01)
1195				WREG8(MGAREG_CRTCEXT_DATA, 0x03);
1196			else
1197				WREG8(MGAREG_CRTCEXT_DATA, 0x04);
1198		}
1199	}
1200	return 0;
1201}
1202
1203#if 0 /* code from mjg to attempt D3 on crtc dpms off - revisit later */
1204static int mga_suspend(struct drm_crtc *crtc)
1205{
1206	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1207	struct drm_device *dev = crtc->dev;
1208	struct mga_device *mdev = dev->dev_private;
1209	struct pci_dev *pdev = dev->pdev;
1210	int option;
1211
1212	if (mdev->suspended)
1213		return 0;
1214
1215	WREG_SEQ(1, 0x20);
1216	WREG_ECRT(1, 0x30);
1217	/* Disable the pixel clock */
1218	WREG_DAC(0x1a, 0x05);
1219	/* Power down the DAC */
1220	WREG_DAC(0x1e, 0x18);
1221	/* Power down the pixel PLL */
1222	WREG_DAC(0x1a, 0x0d);
1223
1224	/* Disable PLLs and clocks */
1225	pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
1226	option &= ~(0x1F8024);
1227	pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
1228	pci_set_power_state(pdev, PCI_D3hot);
1229	pci_disable_device(pdev);
1230
1231	mdev->suspended = true;
1232
1233	return 0;
1234}
1235
1236static int mga_resume(struct drm_crtc *crtc)
1237{
1238	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1239	struct drm_device *dev = crtc->dev;
1240	struct mga_device *mdev = dev->dev_private;
1241	struct pci_dev *pdev = dev->pdev;
1242	int option;
1243
1244	if (!mdev->suspended)
1245		return 0;
1246
1247	pci_set_power_state(pdev, PCI_D0);
1248	pci_enable_device(pdev);
1249
1250	/* Disable sysclk */
1251	pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
1252	option &= ~(0x4);
1253	pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
1254
1255	mdev->suspended = false;
1256
1257	return 0;
1258}
1259
1260#endif
1261
1262static void mga_crtc_dpms(struct drm_crtc *crtc, int mode)
1263{
1264	struct drm_device *dev = crtc->dev;
1265	struct mga_device *mdev = dev->dev_private;
1266	u8 seq1 = 0, crtcext1 = 0;
1267
1268	switch (mode) {
1269	case DRM_MODE_DPMS_ON:
1270		seq1 = 0;
1271		crtcext1 = 0;
1272		mga_crtc_load_lut(crtc);
1273		break;
1274	case DRM_MODE_DPMS_STANDBY:
1275		seq1 = 0x20;
1276		crtcext1 = 0x10;
1277		break;
1278	case DRM_MODE_DPMS_SUSPEND:
1279		seq1 = 0x20;
1280		crtcext1 = 0x20;
1281		break;
1282	case DRM_MODE_DPMS_OFF:
1283		seq1 = 0x20;
1284		crtcext1 = 0x30;
1285		break;
1286	}
1287
1288#if 0
1289	if (mode == DRM_MODE_DPMS_OFF) {
1290		mga_suspend(crtc);
1291	}
1292#endif
1293	WREG8(MGAREG_SEQ_INDEX, 0x01);
1294	seq1 |= RREG8(MGAREG_SEQ_DATA) & ~0x20;
1295	mga_wait_vsync(mdev);
1296	mga_wait_busy(mdev);
1297	WREG8(MGAREG_SEQ_DATA, seq1);
1298	msleep(20);
1299	WREG8(MGAREG_CRTCEXT_INDEX, 0x01);
1300	crtcext1 |= RREG8(MGAREG_CRTCEXT_DATA) & ~0x30;
1301	WREG8(MGAREG_CRTCEXT_DATA, crtcext1);
1302
1303#if 0
1304	if (mode == DRM_MODE_DPMS_ON && mdev->suspended == true) {
1305		mga_resume(crtc);
1306		drm_helper_resume_force_mode(dev);
1307	}
1308#endif
1309}
1310
1311/*
1312 * This is called before a mode is programmed. A typical use might be to
1313 * enable DPMS during the programming to avoid seeing intermediate stages,
1314 * but that's not relevant to us
1315 */
1316static void mga_crtc_prepare(struct drm_crtc *crtc)
1317{
1318	struct drm_device *dev = crtc->dev;
1319	struct mga_device *mdev = dev->dev_private;
1320	u8 tmp;
1321
1322	/*	mga_resume(crtc);*/
1323
1324	WREG8(MGAREG_CRTC_INDEX, 0x11);
1325	tmp = RREG8(MGAREG_CRTC_DATA);
1326	WREG_CRT(0x11, tmp | 0x80);
1327
1328	if (mdev->type == G200_SE_A || mdev->type == G200_SE_B) {
1329		WREG_SEQ(0, 1);
1330		msleep(50);
1331		WREG_SEQ(1, 0x20);
1332		msleep(20);
1333	} else {
1334		WREG8(MGAREG_SEQ_INDEX, 0x1);
1335		tmp = RREG8(MGAREG_SEQ_DATA);
1336
1337		/* start sync reset */
1338		WREG_SEQ(0, 1);
1339		WREG_SEQ(1, tmp | 0x20);
1340	}
1341
1342	if (mdev->type == G200_WB || mdev->type == G200_EW3)
1343		mga_g200wb_prepare(crtc);
1344
1345	WREG_CRT(17, 0);
1346}
1347
1348/*
1349 * This is called after a mode is programmed. It should reverse anything done
1350 * by the prepare function
1351 */
1352static void mga_crtc_commit(struct drm_crtc *crtc)
1353{
1354	struct drm_device *dev = crtc->dev;
1355	struct mga_device *mdev = dev->dev_private;
1356	const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
1357	u8 tmp;
1358
1359	if (mdev->type == G200_WB || mdev->type == G200_EW3)
1360		mga_g200wb_commit(crtc);
1361
1362	if (mdev->type == G200_SE_A || mdev->type == G200_SE_B) {
1363		msleep(50);
1364		WREG_SEQ(1, 0x0);
1365		msleep(20);
1366		WREG_SEQ(0, 0x3);
1367	} else {
1368		WREG8(MGAREG_SEQ_INDEX, 0x1);
1369		tmp = RREG8(MGAREG_SEQ_DATA);
1370
1371		tmp &= ~0x20;
1372		WREG_SEQ(0x1, tmp);
1373		WREG_SEQ(0, 3);
1374	}
1375	crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
1376}
1377
1378/*
1379 * The core can pass us a set of gamma values to program. We actually only
1380 * use this for 8-bit mode so can't perform smooth fades on deeper modes,
1381 * but it's a requirement that we provide the function
1382 */
1383static int mga_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
1384			      u16 *blue, uint32_t size,
1385			      struct drm_modeset_acquire_ctx *ctx)
1386{
1387	mga_crtc_load_lut(crtc);
 
 
1388
1389	return 0;
 
 
 
 
 
1390}
1391
1392/* Simple cleanup function */
1393static void mga_crtc_destroy(struct drm_crtc *crtc)
1394{
1395	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1396
1397	drm_crtc_cleanup(crtc);
1398	kfree(mga_crtc);
1399}
1400
1401static void mga_crtc_disable(struct drm_crtc *crtc)
1402{
1403	DRM_DEBUG_KMS("\n");
1404	mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1405	if (crtc->primary->fb) {
1406		struct drm_framebuffer *fb = crtc->primary->fb;
1407		struct drm_gem_vram_object *gbo =
1408			drm_gem_vram_of_gem(fb->obj[0]);
1409		drm_gem_vram_unpin(gbo);
1410	}
1411	crtc->primary->fb = NULL;
1412}
1413
1414/* These provide the minimum set of functions required to handle a CRTC */
1415static const struct drm_crtc_funcs mga_crtc_funcs = {
1416	.cursor_set = mga_crtc_cursor_set,
1417	.cursor_move = mga_crtc_cursor_move,
1418	.gamma_set = mga_crtc_gamma_set,
1419	.set_config = drm_crtc_helper_set_config,
1420	.destroy = mga_crtc_destroy,
1421};
1422
1423static const struct drm_crtc_helper_funcs mga_helper_funcs = {
1424	.disable = mga_crtc_disable,
1425	.dpms = mga_crtc_dpms,
 
1426	.mode_set = mga_crtc_mode_set,
1427	.mode_set_base = mga_crtc_mode_set_base,
1428	.prepare = mga_crtc_prepare,
1429	.commit = mga_crtc_commit,
 
1430};
1431
1432/* CRTC setup */
1433static void mga_crtc_init(struct mga_device *mdev)
1434{
 
1435	struct mga_crtc *mga_crtc;
 
1436
1437	mga_crtc = kzalloc(sizeof(struct mga_crtc) +
1438			      (MGAG200FB_CONN_LIMIT * sizeof(struct drm_connector *)),
1439			      GFP_KERNEL);
1440
1441	if (mga_crtc == NULL)
1442		return;
1443
1444	drm_crtc_init(mdev->dev, &mga_crtc->base, &mga_crtc_funcs);
1445
1446	drm_mode_crtc_set_gamma_size(&mga_crtc->base, MGAG200_LUT_SIZE);
1447	mdev->mode_info.crtc = mga_crtc;
1448
 
 
 
 
 
 
1449	drm_crtc_helper_add(&mga_crtc->base, &mga_helper_funcs);
1450}
1451
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1452/*
1453 * The encoder comes after the CRTC in the output pipeline, but before
1454 * the connector. It's responsible for ensuring that the digital
1455 * stream is appropriately converted into the output format. Setup is
1456 * very simple in this case - all we have to do is inform qemu of the
1457 * colour depth in order to ensure that it displays appropriately
1458 */
1459
1460/*
1461 * These functions are analagous to those in the CRTC code, but are intended
1462 * to handle any encoder-specific limitations
1463 */
 
 
 
 
 
 
 
1464static void mga_encoder_mode_set(struct drm_encoder *encoder,
1465				struct drm_display_mode *mode,
1466				struct drm_display_mode *adjusted_mode)
1467{
1468
1469}
1470
1471static void mga_encoder_dpms(struct drm_encoder *encoder, int state)
1472{
1473	return;
1474}
1475
1476static void mga_encoder_prepare(struct drm_encoder *encoder)
1477{
1478}
1479
1480static void mga_encoder_commit(struct drm_encoder *encoder)
1481{
1482}
1483
1484static void mga_encoder_destroy(struct drm_encoder *encoder)
1485{
1486	struct mga_encoder *mga_encoder = to_mga_encoder(encoder);
1487	drm_encoder_cleanup(encoder);
1488	kfree(mga_encoder);
1489}
1490
1491static const struct drm_encoder_helper_funcs mga_encoder_helper_funcs = {
1492	.dpms = mga_encoder_dpms,
 
1493	.mode_set = mga_encoder_mode_set,
1494	.prepare = mga_encoder_prepare,
1495	.commit = mga_encoder_commit,
1496};
1497
1498static const struct drm_encoder_funcs mga_encoder_encoder_funcs = {
1499	.destroy = mga_encoder_destroy,
1500};
1501
1502static struct drm_encoder *mga_encoder_init(struct drm_device *dev)
1503{
1504	struct drm_encoder *encoder;
1505	struct mga_encoder *mga_encoder;
1506
1507	mga_encoder = kzalloc(sizeof(struct mga_encoder), GFP_KERNEL);
1508	if (!mga_encoder)
1509		return NULL;
1510
1511	encoder = &mga_encoder->base;
1512	encoder->possible_crtcs = 0x1;
1513
1514	drm_encoder_init(dev, encoder, &mga_encoder_encoder_funcs,
1515			 DRM_MODE_ENCODER_DAC, NULL);
1516	drm_encoder_helper_add(encoder, &mga_encoder_helper_funcs);
1517
1518	return encoder;
1519}
1520
1521
1522static int mga_vga_get_modes(struct drm_connector *connector)
1523{
1524	struct mga_connector *mga_connector = to_mga_connector(connector);
1525	struct edid *edid;
1526	int ret = 0;
1527
1528	edid = drm_get_edid(connector, &mga_connector->i2c->adapter);
1529	if (edid) {
1530		drm_connector_update_edid_property(connector, edid);
1531		ret = drm_add_edid_modes(connector, edid);
 
1532		kfree(edid);
1533	}
1534	return ret;
1535}
1536
1537static uint32_t mga_vga_calculate_mode_bandwidth(struct drm_display_mode *mode,
1538							int bits_per_pixel)
1539{
1540	uint32_t total_area, divisor;
1541	uint64_t active_area, pixels_per_second, bandwidth;
1542	uint64_t bytes_per_pixel = (bits_per_pixel + 7) / 8;
1543
1544	divisor = 1024;
1545
1546	if (!mode->htotal || !mode->vtotal || !mode->clock)
1547		return 0;
1548
1549	active_area = mode->hdisplay * mode->vdisplay;
1550	total_area = mode->htotal * mode->vtotal;
1551
1552	pixels_per_second = active_area * mode->clock * 1000;
1553	do_div(pixels_per_second, total_area);
1554
1555	bandwidth = pixels_per_second * bytes_per_pixel * 100;
1556	do_div(bandwidth, divisor);
1557
1558	return (uint32_t)(bandwidth);
1559}
1560
1561#define MODE_BANDWIDTH	MODE_BAD
1562
1563static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
1564				 struct drm_display_mode *mode)
1565{
1566	struct drm_device *dev = connector->dev;
1567	struct mga_device *mdev = (struct mga_device*)dev->dev_private;
1568	int bpp = 32;
1569
1570	if (IS_G200_SE(mdev)) {
1571		if (mdev->unique_rev_id == 0x01) {
1572			if (mode->hdisplay > 1600)
1573				return MODE_VIRTUAL_X;
1574			if (mode->vdisplay > 1200)
1575				return MODE_VIRTUAL_Y;
1576			if (mga_vga_calculate_mode_bandwidth(mode, bpp)
1577				> (24400 * 1024))
1578				return MODE_BANDWIDTH;
1579		} else if (mdev->unique_rev_id == 0x02) {
1580			if (mode->hdisplay > 1920)
1581				return MODE_VIRTUAL_X;
1582			if (mode->vdisplay > 1200)
1583				return MODE_VIRTUAL_Y;
1584			if (mga_vga_calculate_mode_bandwidth(mode, bpp)
1585				> (30100 * 1024))
1586				return MODE_BANDWIDTH;
1587		} else {
1588			if (mga_vga_calculate_mode_bandwidth(mode, bpp)
1589				> (55000 * 1024))
1590				return MODE_BANDWIDTH;
1591		}
1592	} else if (mdev->type == G200_WB) {
1593		if (mode->hdisplay > 1280)
1594			return MODE_VIRTUAL_X;
1595		if (mode->vdisplay > 1024)
1596			return MODE_VIRTUAL_Y;
1597		if (mga_vga_calculate_mode_bandwidth(mode, bpp) >
1598		    (31877 * 1024))
1599			return MODE_BANDWIDTH;
1600	} else if (mdev->type == G200_EV &&
1601		(mga_vga_calculate_mode_bandwidth(mode, bpp)
1602			> (32700 * 1024))) {
1603		return MODE_BANDWIDTH;
1604	} else if (mdev->type == G200_EH &&
1605		(mga_vga_calculate_mode_bandwidth(mode, bpp)
1606			> (37500 * 1024))) {
1607		return MODE_BANDWIDTH;
1608	} else if (mdev->type == G200_ER &&
1609		(mga_vga_calculate_mode_bandwidth(mode,
1610			bpp) > (55000 * 1024))) {
1611		return MODE_BANDWIDTH;
1612	}
1613
1614	if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 ||
1615	    (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) {
1616		return MODE_H_ILLEGAL;
1617	}
1618
1619	if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 ||
1620	    mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 ||
1621	    mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
1622	    mode->crtc_vsync_end > 4096 || mode->crtc_vtotal > 4096) {
1623		return MODE_BAD;
1624	}
1625
1626	/* Validate the mode input by the user */
1627	if (connector->cmdline_mode.specified) {
1628		if (connector->cmdline_mode.bpp_specified)
1629			bpp = connector->cmdline_mode.bpp;
1630	}
1631
1632	if ((mode->hdisplay * mode->vdisplay * (bpp/8)) > mdev->mc.vram_size) {
1633		if (connector->cmdline_mode.specified)
1634			connector->cmdline_mode.specified = false;
1635		return MODE_BAD;
1636	}
1637
1638	return MODE_OK;
1639}
1640
1641static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
1642						  *connector)
1643{
1644	int enc_id = connector->encoder_ids[0];
 
 
 
1645	/* pick the encoder ids */
1646	if (enc_id)
1647		return drm_encoder_find(connector->dev, NULL, enc_id);
 
 
 
 
 
 
 
1648	return NULL;
1649}
1650
 
 
 
 
 
 
1651static void mga_connector_destroy(struct drm_connector *connector)
1652{
1653	struct mga_connector *mga_connector = to_mga_connector(connector);
1654	mgag200_i2c_destroy(mga_connector->i2c);
1655	drm_connector_cleanup(connector);
1656	kfree(connector);
1657}
1658
1659static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
1660	.get_modes = mga_vga_get_modes,
1661	.mode_valid = mga_vga_mode_valid,
1662	.best_encoder = mga_connector_best_encoder,
1663};
1664
1665static const struct drm_connector_funcs mga_vga_connector_funcs = {
1666	.dpms = drm_helper_connector_dpms,
 
1667	.fill_modes = drm_helper_probe_single_connector_modes,
1668	.destroy = mga_connector_destroy,
1669};
1670
1671static struct drm_connector *mga_vga_init(struct drm_device *dev)
1672{
1673	struct drm_connector *connector;
1674	struct mga_connector *mga_connector;
1675
1676	mga_connector = kzalloc(sizeof(struct mga_connector), GFP_KERNEL);
1677	if (!mga_connector)
1678		return NULL;
1679
1680	connector = &mga_connector->base;
1681	mga_connector->i2c = mgag200_i2c_create(dev);
1682	if (!mga_connector->i2c)
1683		DRM_ERROR("failed to add ddc bus\n");
1684
1685	drm_connector_init_with_ddc(dev, connector,
1686				    &mga_vga_connector_funcs,
1687				    DRM_MODE_CONNECTOR_VGA,
1688				    &mga_connector->i2c->adapter);
1689
1690	drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
1691
1692	drm_connector_register(connector);
 
 
1693
1694	return connector;
1695}
1696
1697
1698int mgag200_modeset_init(struct mga_device *mdev)
1699{
1700	struct drm_encoder *encoder;
1701	struct drm_connector *connector;
 
1702
1703	mdev->mode_info.mode_config_initialized = true;
1704
1705	mdev->dev->mode_config.max_width = MGAG200_MAX_FB_WIDTH;
1706	mdev->dev->mode_config.max_height = MGAG200_MAX_FB_HEIGHT;
1707
1708	mdev->dev->mode_config.fb_base = mdev->mc.vram_base;
1709
1710	mga_crtc_init(mdev);
1711
1712	encoder = mga_encoder_init(mdev->dev);
1713	if (!encoder) {
1714		DRM_ERROR("mga_encoder_init failed\n");
1715		return -1;
1716	}
1717
1718	connector = mga_vga_init(mdev->dev);
1719	if (!connector) {
1720		DRM_ERROR("mga_vga_init failed\n");
1721		return -1;
1722	}
1723
1724	drm_connector_attach_encoder(connector, encoder);
 
 
 
 
 
 
1725
1726	return 0;
1727}
1728
1729void mgag200_modeset_fini(struct mga_device *mdev)
1730{
1731
1732}
v3.5.6
 
   1/*
   2 * Copyright 2010 Matt Turner.
   3 * Copyright 2012 Red Hat
   4 *
   5 * This file is subject to the terms and conditions of the GNU General
   6 * Public License version 2. See the file COPYING in the main
   7 * directory of this archive for more details.
   8 *
   9 * Authors: Matthew Garrett
  10 *	    Matt Turner
  11 *	    Dave Airlie
  12 */
  13
  14#include <linux/delay.h>
  15
  16#include "drmP.h"
  17#include "drm.h"
  18#include "drm_crtc_helper.h"
 
 
  19
  20#include "mgag200_drv.h"
  21
  22#define MGAG200_LUT_SIZE 256
  23
  24/*
  25 * This file contains setup code for the CRTC.
  26 */
  27
  28static void mga_crtc_load_lut(struct drm_crtc *crtc)
  29{
  30	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
  31	struct drm_device *dev = crtc->dev;
  32	struct mga_device *mdev = dev->dev_private;
 
 
  33	int i;
  34
  35	if (!crtc->enabled)
  36		return;
  37
 
 
 
 
  38	WREG8(DAC_INDEX + MGA1064_INDEX, 0);
  39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  40	for (i = 0; i < MGAG200_LUT_SIZE; i++) {
  41		/* VGA registers */
  42		WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_r[i]);
  43		WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_g[i]);
  44		WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_b[i]);
  45	}
  46}
  47
  48static inline void mga_wait_vsync(struct mga_device *mdev)
  49{
  50	unsigned int count = 0;
  51	unsigned int status = 0;
  52
  53	do {
  54		status = RREG32(MGAREG_Status);
  55		count++;
  56	} while ((status & 0x08) && (count < 250000));
  57	count = 0;
  58	status = 0;
  59	do {
  60		status = RREG32(MGAREG_Status);
  61		count++;
  62	} while (!(status & 0x08) && (count < 250000));
  63}
  64
  65static inline void mga_wait_busy(struct mga_device *mdev)
  66{
  67	unsigned int count = 0;
  68	unsigned int status = 0;
  69	do {
  70		status = RREG8(MGAREG_Status + 2);
  71		count++;
  72	} while ((status & 0x01) && (count < 500000));
  73}
  74
  75/*
  76 * The core passes the desired mode to the CRTC code to see whether any
  77 * CRTC-specific modifications need to be made to it. We're in a position
  78 * to just pass that straight through, so this does nothing
  79 */
  80static bool mga_crtc_mode_fixup(struct drm_crtc *crtc,
  81				   struct drm_display_mode *mode,
  82				   struct drm_display_mode *adjusted_mode)
  83{
  84	return true;
  85}
  86
  87static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
  88{
  89	unsigned int vcomax, vcomin, pllreffreq;
  90	unsigned int delta, tmpdelta, permitteddelta;
  91	unsigned int testp, testm, testn;
  92	unsigned int p, m, n;
  93	unsigned int computed;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  94
  95	m = n = p = 0;
  96	vcomax = 320000;
  97	vcomin = 160000;
  98	pllreffreq = 25000;
  99
 100	delta = 0xffffffff;
 101	permitteddelta = clock * 5 / 1000;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 102
 103	for (testp = 8; testp > 0; testp /= 2) {
 104		if (clock * testp > vcomax)
 105			continue;
 106		if (clock * testp < vcomin)
 107			continue;
 108
 109		for (testn = 17; testn < 256; testn++) {
 110			for (testm = 1; testm < 32; testm++) {
 111				computed = (pllreffreq * testn) /
 112					(testm * testp);
 113				if (computed > clock)
 114					tmpdelta = computed - clock;
 115				else
 116					tmpdelta = clock - computed;
 117				if (tmpdelta < delta) {
 118					delta = tmpdelta;
 119					m = testm - 1;
 120					n = testn - 1;
 121					p = testp - 1;
 122				}
 123			}
 124		}
 
 
 
 
 
 
 
 
 
 
 
 125	}
 126
 127	if (delta > permitteddelta) {
 128		printk(KERN_WARNING "PLL delta too large\n");
 129		return 1;
 130	}
 131
 132	WREG_DAC(MGA1064_PIX_PLLC_M, m);
 133	WREG_DAC(MGA1064_PIX_PLLC_N, n);
 134	WREG_DAC(MGA1064_PIX_PLLC_P, p);
 
 
 
 
 
 
 
 
 135	return 0;
 136}
 137
 138static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)
 139{
 140	unsigned int vcomax, vcomin, pllreffreq;
 141	unsigned int delta, tmpdelta, permitteddelta;
 142	unsigned int testp, testm, testn;
 143	unsigned int p, m, n;
 144	unsigned int computed;
 145	int i, j, tmpcount, vcount;
 146	bool pll_locked = false;
 147	u8 tmp;
 148
 149	m = n = p = 0;
 150	vcomax = 550000;
 151	vcomin = 150000;
 152	pllreffreq = 48000;
 153
 154	delta = 0xffffffff;
 155	permitteddelta = clock * 5 / 1000;
 156
 157	for (testp = 1; testp < 9; testp++) {
 158		if (clock * testp > vcomax)
 159			continue;
 160		if (clock * testp < vcomin)
 161			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 162
 163		for (testm = 1; testm < 17; testm++) {
 164			for (testn = 1; testn < 151; testn++) {
 165				computed = (pllreffreq * testn) /
 166					(testm * testp);
 167				if (computed > clock)
 168					tmpdelta = computed - clock;
 169				else
 170					tmpdelta = clock - computed;
 171				if (tmpdelta < delta) {
 172					delta = tmpdelta;
 173					n = testn - 1;
 174					m = (testm - 1) | ((n >> 1) & 0x80);
 175					p = testp - 1;
 
 
 176				}
 177			}
 178		}
 179	}
 180
 181	for (i = 0; i <= 32 && pll_locked == false; i++) {
 182		if (i > 0) {
 183			WREG8(MGAREG_CRTC_INDEX, 0x1e);
 184			tmp = RREG8(MGAREG_CRTC_DATA);
 185			if (tmp < 0xff)
 186				WREG8(MGAREG_CRTC_DATA, tmp+1);
 187		}
 188
 189		/* set pixclkdis to 1 */
 190		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 191		tmp = RREG8(DAC_DATA);
 192		tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 193		WREG_DAC(MGA1064_PIX_CLK_CTL_CLK_DIS, tmp);
 194
 195		WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 196		tmp = RREG8(DAC_DATA);
 197		tmp |= MGA1064_REMHEADCTL_CLKDIS;
 198		WREG_DAC(MGA1064_REMHEADCTL, tmp);
 199
 200		/* select PLL Set C */
 201		tmp = RREG8(MGAREG_MEM_MISC_READ);
 202		tmp |= 0x3 << 2;
 203		WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 204
 205		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 206		tmp = RREG8(DAC_DATA);
 207		tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN | 0x80;
 208		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 209
 210		udelay(500);
 211
 212		/* reset the PLL */
 213		WREG8(DAC_INDEX, MGA1064_VREF_CTL);
 214		tmp = RREG8(DAC_DATA);
 215		tmp &= ~0x04;
 216		WREG_DAC(MGA1064_VREF_CTL, tmp);
 217
 218		udelay(50);
 219
 220		/* program pixel pll register */
 221		WREG_DAC(MGA1064_WB_PIX_PLLC_N, n);
 222		WREG_DAC(MGA1064_WB_PIX_PLLC_M, m);
 223		WREG_DAC(MGA1064_WB_PIX_PLLC_P, p);
 224
 225		udelay(50);
 226
 227		/* turn pll on */
 228		WREG8(DAC_INDEX, MGA1064_VREF_CTL);
 229		tmp = RREG8(DAC_DATA);
 230		tmp |= 0x04;
 231		WREG_DAC(MGA1064_VREF_CTL, tmp);
 232
 233		udelay(500);
 234
 235		/* select the pixel pll */
 236		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 237		tmp = RREG8(DAC_DATA);
 238		tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 239		tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 240		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 241
 242		WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 243		tmp = RREG8(DAC_DATA);
 244		tmp &= ~MGA1064_REMHEADCTL_CLKSL_MSK;
 245		tmp |= MGA1064_REMHEADCTL_CLKSL_PLL;
 246		WREG_DAC(MGA1064_REMHEADCTL, tmp);
 247
 248		/* reset dotclock rate bit */
 249		WREG8(MGAREG_SEQ_INDEX, 1);
 250		tmp = RREG8(MGAREG_SEQ_DATA);
 251		tmp &= ~0x8;
 252		WREG8(MGAREG_SEQ_DATA, tmp);
 253
 254		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 255		tmp = RREG8(DAC_DATA);
 256		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 257		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 258
 259		vcount = RREG8(MGAREG_VCOUNT);
 260
 261		for (j = 0; j < 30 && pll_locked == false; j++) {
 262			tmpcount = RREG8(MGAREG_VCOUNT);
 263			if (tmpcount < vcount)
 264				vcount = 0;
 265			if ((tmpcount - vcount) > 2)
 266				pll_locked = true;
 267			else
 268				udelay(5);
 269		}
 270	}
 271	WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 272	tmp = RREG8(DAC_DATA);
 273	tmp &= ~MGA1064_REMHEADCTL_CLKDIS;
 274	WREG_DAC(MGA1064_REMHEADCTL, tmp);
 275	return 0;
 276}
 277
 278static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)
 279{
 280	unsigned int vcomax, vcomin, pllreffreq;
 281	unsigned int delta, tmpdelta, permitteddelta;
 282	unsigned int testp, testm, testn;
 283	unsigned int p, m, n;
 284	unsigned int computed;
 285	u8 tmp;
 286
 287	m = n = p = 0;
 288	vcomax = 550000;
 289	vcomin = 150000;
 290	pllreffreq = 50000;
 291
 292	delta = 0xffffffff;
 293	permitteddelta = clock * 5 / 1000;
 294
 295	for (testp = 16; testp > 0; testp--) {
 296		if (clock * testp > vcomax)
 297			continue;
 298		if (clock * testp < vcomin)
 299			continue;
 300
 301		for (testn = 1; testn < 257; testn++) {
 302			for (testm = 1; testm < 17; testm++) {
 303				computed = (pllreffreq * testn) /
 304					(testm * testp);
 305				if (computed > clock)
 306					tmpdelta = computed - clock;
 307				else
 308					tmpdelta = clock - computed;
 309				if (tmpdelta < delta) {
 310					delta = tmpdelta;
 311					n = testn - 1;
 312					m = testm - 1;
 313					p = testp - 1;
 314				}
 315			}
 316		}
 317	}
 318
 319	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 320	tmp = RREG8(DAC_DATA);
 321	tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 322	WREG_DAC(MGA1064_PIX_CLK_CTL_CLK_DIS, tmp);
 323
 324	tmp = RREG8(MGAREG_MEM_MISC_READ);
 325	tmp |= 0x3 << 2;
 326	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 327
 328	WREG8(DAC_INDEX, MGA1064_PIX_PLL_STAT);
 329	tmp = RREG8(DAC_DATA);
 330	WREG_DAC(MGA1064_PIX_PLL_STAT, tmp & ~0x40);
 331
 332	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 333	tmp = RREG8(DAC_DATA);
 334	tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 335	WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 336
 337	WREG_DAC(MGA1064_EV_PIX_PLLC_M, m);
 338	WREG_DAC(MGA1064_EV_PIX_PLLC_N, n);
 339	WREG_DAC(MGA1064_EV_PIX_PLLC_P, p);
 340
 341	udelay(50);
 342
 343	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 344	tmp = RREG8(DAC_DATA);
 345	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 346	WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 347
 348	udelay(500);
 349
 350	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 351	tmp = RREG8(DAC_DATA);
 352	tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 353	tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 354	WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 355
 356	WREG8(DAC_INDEX, MGA1064_PIX_PLL_STAT);
 357	tmp = RREG8(DAC_DATA);
 358	WREG_DAC(MGA1064_PIX_PLL_STAT, tmp | 0x40);
 359
 360	tmp = RREG8(MGAREG_MEM_MISC_READ);
 361	tmp |= (0x3 << 2);
 362	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 363
 364	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 365	tmp = RREG8(DAC_DATA);
 366	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 367	WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 368
 369	return 0;
 370}
 371
 372static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)
 373{
 374	unsigned int vcomax, vcomin, pllreffreq;
 375	unsigned int delta, tmpdelta, permitteddelta;
 376	unsigned int testp, testm, testn;
 377	unsigned int p, m, n;
 378	unsigned int computed;
 379	int i, j, tmpcount, vcount;
 380	u8 tmp;
 381	bool pll_locked = false;
 382
 383	m = n = p = 0;
 384	vcomax = 800000;
 385	vcomin = 400000;
 386	pllreffreq = 3333;
 387
 388	delta = 0xffffffff;
 389	permitteddelta = clock * 5 / 1000;
 390
 391	for (testp = 16; testp > 0; testp--) {
 392		if (clock * testp > vcomax)
 393			continue;
 394		if (clock * testp < vcomin)
 395			continue;
 396
 397		for (testm = 1; testm < 33; testm++) {
 398			for (testn = 1; testn < 257; testn++) {
 399				computed = (pllreffreq * testn) /
 400					(testm * testp);
 
 
 
 
 
 
 
 
 
 
 
 
 401				if (computed > clock)
 402					tmpdelta = computed - clock;
 403				else
 404					tmpdelta = clock - computed;
 405				if (tmpdelta < delta) {
 406					delta = tmpdelta;
 407					n = testn - 1;
 408					m = (testm - 1) | ((n >> 1) & 0x80);
 409					p = testp - 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 410				}
 411				if ((clock * testp) >= 600000)
 412					p |= 80;
 413			}
 414		}
 415	}
 416	for (i = 0; i <= 32 && pll_locked == false; i++) {
 417		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 418		tmp = RREG8(DAC_DATA);
 419		tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 420		WREG_DAC(MGA1064_PIX_CLK_CTL_CLK_DIS, tmp);
 421
 422		tmp = RREG8(MGAREG_MEM_MISC_READ);
 423		tmp |= 0x3 << 2;
 424		WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 425
 426		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 427		tmp = RREG8(DAC_DATA);
 428		tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 429		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 430
 431		udelay(500);
 432
 433		WREG_DAC(MGA1064_EH_PIX_PLLC_M, m);
 434		WREG_DAC(MGA1064_EH_PIX_PLLC_N, n);
 435		WREG_DAC(MGA1064_EH_PIX_PLLC_P, p);
 436
 437		udelay(500);
 438
 439		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 440		tmp = RREG8(DAC_DATA);
 441		tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
 442		tmp |= MGA1064_PIX_CLK_CTL_SEL_PLL;
 443		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 444
 445		WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 446		tmp = RREG8(DAC_DATA);
 447		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 448		tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 449		WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 450
 451		vcount = RREG8(MGAREG_VCOUNT);
 452
 453		for (j = 0; j < 30 && pll_locked == false; j++) {
 454			tmpcount = RREG8(MGAREG_VCOUNT);
 455			if (tmpcount < vcount)
 456				vcount = 0;
 457			if ((tmpcount - vcount) > 2)
 458				pll_locked = true;
 459			else
 460				udelay(5);
 461		}
 462	}
 463
 464	return 0;
 465}
 466
 467static int mga_g200er_set_plls(struct mga_device *mdev, long clock)
 468{
 469	unsigned int vcomax, vcomin, pllreffreq;
 470	unsigned int delta, tmpdelta;
 471	int testr, testn, testm, testo;
 472	unsigned int p, m, n;
 473	unsigned int computed, vco;
 474	int tmp;
 475	const unsigned int m_div_val[] = { 1, 2, 4, 8 };
 476
 477	m = n = p = 0;
 478	vcomax = 1488000;
 479	vcomin = 1056000;
 480	pllreffreq = 48000;
 481
 482	delta = 0xffffffff;
 483
 484	for (testr = 0; testr < 4; testr++) {
 485		if (delta == 0)
 486			break;
 487		for (testn = 5; testn < 129; testn++) {
 488			if (delta == 0)
 489				break;
 490			for (testm = 3; testm >= 0; testm--) {
 491				if (delta == 0)
 492					break;
 493				for (testo = 5; testo < 33; testo++) {
 494					vco = pllreffreq * (testn + 1) /
 495						(testr + 1);
 496					if (vco < vcomin)
 497						continue;
 498					if (vco > vcomax)
 499						continue;
 500					computed = vco / (m_div_val[testm] * (testo + 1));
 501					if (computed > clock)
 502						tmpdelta = computed - clock;
 503					else
 504						tmpdelta = clock - computed;
 505					if (tmpdelta < delta) {
 506						delta = tmpdelta;
 507						m = testm | (testo << 3);
 508						n = testn;
 509						p = testr | (testr << 3);
 510					}
 511				}
 512			}
 513		}
 514	}
 515
 516	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 517	tmp = RREG8(DAC_DATA);
 518	tmp |= MGA1064_PIX_CLK_CTL_CLK_DIS;
 519	WREG_DAC(MGA1064_PIX_CLK_CTL_CLK_DIS, tmp);
 520
 521	WREG8(DAC_INDEX, MGA1064_REMHEADCTL);
 522	tmp = RREG8(DAC_DATA);
 523	tmp |= MGA1064_REMHEADCTL_CLKDIS;
 524	WREG_DAC(MGA1064_REMHEADCTL, tmp);
 525
 526	tmp = RREG8(MGAREG_MEM_MISC_READ);
 527	tmp |= (0x3<<2) | 0xc0;
 528	WREG8(MGAREG_MEM_MISC_WRITE, tmp);
 529
 530	WREG8(DAC_INDEX, MGA1064_PIX_CLK_CTL);
 531	tmp = RREG8(DAC_DATA);
 532	tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
 533	tmp |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN;
 534	WREG_DAC(MGA1064_PIX_CLK_CTL, tmp);
 535
 536	udelay(500);
 537
 538	WREG_DAC(MGA1064_ER_PIX_PLLC_N, n);
 539	WREG_DAC(MGA1064_ER_PIX_PLLC_M, m);
 540	WREG_DAC(MGA1064_ER_PIX_PLLC_P, p);
 541
 542	udelay(50);
 543
 544	return 0;
 545}
 546
 547static int mga_crtc_set_plls(struct mga_device *mdev, long clock)
 548{
 549	switch(mdev->type) {
 550	case G200_SE_A:
 551	case G200_SE_B:
 552		return mga_g200se_set_plls(mdev, clock);
 553		break;
 554	case G200_WB:
 
 555		return mga_g200wb_set_plls(mdev, clock);
 556		break;
 557	case G200_EV:
 558		return mga_g200ev_set_plls(mdev, clock);
 559		break;
 560	case G200_EH:
 
 561		return mga_g200eh_set_plls(mdev, clock);
 562		break;
 563	case G200_ER:
 564		return mga_g200er_set_plls(mdev, clock);
 565		break;
 566	}
 567	return 0;
 568}
 569
 570static void mga_g200wb_prepare(struct drm_crtc *crtc)
 571{
 572	struct mga_device *mdev = crtc->dev->dev_private;
 573	u8 tmp;
 574	int iter_max;
 575
 576	/* 1- The first step is to warn the BMC of an upcoming mode change.
 577	 * We are putting the misc<0> to output.*/
 578
 579	WREG8(DAC_INDEX, MGA1064_GEN_IO_CTL);
 580	tmp = RREG8(DAC_DATA);
 581	tmp |= 0x10;
 582	WREG_DAC(MGA1064_GEN_IO_CTL, tmp);
 583
 584	/* we are putting a 1 on the misc<0> line */
 585	WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
 586	tmp = RREG8(DAC_DATA);
 587	tmp |= 0x10;
 588	WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
 589
 590	/* 2- Second step to mask and further scan request
 591	 * This will be done by asserting the remfreqmsk bit (XSPAREREG<7>)
 592	 */
 593	WREG8(DAC_INDEX, MGA1064_SPAREREG);
 594	tmp = RREG8(DAC_DATA);
 595	tmp |= 0x80;
 596	WREG_DAC(MGA1064_SPAREREG, tmp);
 597
 598	/* 3a- the third step is to verifu if there is an active scan
 599	 * We are searching for a 0 on remhsyncsts <XSPAREREG<0>)
 600	 */
 601	iter_max = 300;
 602	while (!(tmp & 0x1) && iter_max) {
 603		WREG8(DAC_INDEX, MGA1064_SPAREREG);
 604		tmp = RREG8(DAC_DATA);
 605		udelay(1000);
 606		iter_max--;
 607	}
 608
 609	/* 3b- this step occurs only if the remove is actually scanning
 610	 * we are waiting for the end of the frame which is a 1 on
 611	 * remvsyncsts (XSPAREREG<1>)
 612	 */
 613	if (iter_max) {
 614		iter_max = 300;
 615		while ((tmp & 0x2) && iter_max) {
 616			WREG8(DAC_INDEX, MGA1064_SPAREREG);
 617			tmp = RREG8(DAC_DATA);
 618			udelay(1000);
 619			iter_max--;
 620		}
 621	}
 622}
 623
 624static void mga_g200wb_commit(struct drm_crtc *crtc)
 625{
 626	u8 tmp;
 627	struct mga_device *mdev = crtc->dev->dev_private;
 628
 629	/* 1- The first step is to ensure that the vrsten and hrsten are set */
 630	WREG8(MGAREG_CRTCEXT_INDEX, 1);
 631	tmp = RREG8(MGAREG_CRTCEXT_DATA);
 632	WREG8(MGAREG_CRTCEXT_DATA, tmp | 0x88);
 633
 634	/* 2- second step is to assert the rstlvl2 */
 635	WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
 636	tmp = RREG8(DAC_DATA);
 637	tmp |= 0x8;
 638	WREG8(DAC_DATA, tmp);
 639
 640	/* wait 10 us */
 641	udelay(10);
 642
 643	/* 3- deassert rstlvl2 */
 644	tmp &= ~0x08;
 645	WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
 646	WREG8(DAC_DATA, tmp);
 647
 648	/* 4- remove mask of scan request */
 649	WREG8(DAC_INDEX, MGA1064_SPAREREG);
 650	tmp = RREG8(DAC_DATA);
 651	tmp &= ~0x80;
 652	WREG8(DAC_DATA, tmp);
 653
 654	/* 5- put back a 0 on the misc<0> line */
 655	WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
 656	tmp = RREG8(DAC_DATA);
 657	tmp &= ~0x10;
 658	WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
 659}
 660
 661
 662void mga_set_start_address(struct drm_crtc *crtc, unsigned offset)
 
 
 
 
 
 
 
 
 
 
 
 
 
 663{
 664	struct mga_device *mdev = crtc->dev->dev_private;
 665	u32 addr;
 666	int count;
 
 667
 668	while (RREG8(0x1fda) & 0x08);
 669	while (!(RREG8(0x1fda) & 0x08));
 670
 671	count = RREG8(MGAREG_VCOUNT) + 2;
 672	while (RREG8(MGAREG_VCOUNT) < count);
 673
 674	addr = offset >> 2;
 
 
 
 
 
 
 
 675	WREG_CRT(0x0d, (u8)(addr & 0xff));
 676	WREG_CRT(0x0c, (u8)(addr >> 8) & 0xff);
 677	WREG_CRT(0xaf, (u8)(addr >> 16) & 0xf);
 678}
 679
 680
 681/* ast is different - we will force move buffers out of VRAM */
 682static int mga_crtc_do_set_base(struct drm_crtc *crtc,
 683				struct drm_framebuffer *fb,
 684				int x, int y, int atomic)
 685{
 686	struct mga_device *mdev = crtc->dev->dev_private;
 687	struct drm_gem_object *obj;
 688	struct mga_framebuffer *mga_fb;
 689	struct mgag200_bo *bo;
 690	int ret;
 691	u64 gpu_addr;
 692
 693	/* push the previous fb to system ram */
 694	if (!atomic && fb) {
 695		mga_fb = to_mga_framebuffer(fb);
 696		obj = mga_fb->obj;
 697		bo = gem_to_mga_bo(obj);
 698		ret = mgag200_bo_reserve(bo, false);
 699		if (ret)
 700			return ret;
 701		mgag200_bo_push_sysram(bo);
 702		mgag200_bo_unreserve(bo);
 703	}
 704
 705	mga_fb = to_mga_framebuffer(crtc->fb);
 706	obj = mga_fb->obj;
 707	bo = gem_to_mga_bo(obj);
 708
 709	ret = mgag200_bo_reserve(bo, false);
 710	if (ret)
 711		return ret;
 712
 713	ret = mgag200_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
 714	if (ret) {
 715		mgag200_bo_unreserve(bo);
 716		return ret;
 717	}
 718
 719	if (&mdev->mfbdev->mfb == mga_fb) {
 720		/* if pushing console in kmap it */
 721		ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap);
 722		if (ret)
 723			DRM_ERROR("failed to kmap fbcon\n");
 724
 725	}
 726	mgag200_bo_unreserve(bo);
 727
 728	DRM_INFO("mga base %llx\n", gpu_addr);
 729
 730	mga_set_start_address(crtc, (u32)gpu_addr);
 731
 732	return 0;
 
 
 
 
 733}
 734
 735static int mga_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 736				  struct drm_framebuffer *old_fb)
 737{
 738	return mga_crtc_do_set_base(crtc, old_fb, x, y, 0);
 739}
 740
 741static int mga_crtc_mode_set(struct drm_crtc *crtc,
 742				struct drm_display_mode *mode,
 743				struct drm_display_mode *adjusted_mode,
 744				int x, int y, struct drm_framebuffer *old_fb)
 745{
 746	struct drm_device *dev = crtc->dev;
 747	struct mga_device *mdev = dev->dev_private;
 
 748	int hdisplay, hsyncstart, hsyncend, htotal;
 749	int vdisplay, vsyncstart, vsyncend, vtotal;
 750	int pitch;
 751	int option = 0, option2 = 0;
 752	int i;
 753	unsigned char misc = 0;
 754	unsigned char ext_vga[6];
 755	unsigned char ext_vga_index24;
 756	unsigned char dac_index90 = 0;
 757	u8 bppshift;
 758
 759	static unsigned char dacvalue[] = {
 760		/* 0x00: */        0,    0,    0,    0,    0,    0, 0x00,    0,
 761		/* 0x08: */        0,    0,    0,    0,    0,    0,    0,    0,
 762		/* 0x10: */        0,    0,    0,    0,    0,    0,    0,    0,
 763		/* 0x18: */     0x00,    0, 0xC9, 0xFF, 0xBF, 0x20, 0x1F, 0x20,
 764		/* 0x20: */     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 765		/* 0x28: */     0x00, 0x00, 0x00, 0x00,    0,    0,    0, 0x40,
 766		/* 0x30: */     0x00, 0xB0, 0x00, 0xC2, 0x34, 0x14, 0x02, 0x83,
 767		/* 0x38: */     0x00, 0x93, 0x00, 0x77, 0x00, 0x00, 0x00, 0x3A,
 768		/* 0x40: */        0,    0,    0,    0,    0,    0,    0,    0,
 769		/* 0x48: */        0,    0,    0,    0,    0,    0,    0,    0
 770	};
 771
 772	bppshift = mdev->bpp_shifts[(crtc->fb->bits_per_pixel >> 3) - 1];
 773
 774	switch (mdev->type) {
 775	case G200_SE_A:
 776	case G200_SE_B:
 777		dacvalue[MGA1064_VREF_CTL] = 0x03;
 778		dacvalue[MGA1064_PIX_CLK_CTL] = MGA1064_PIX_CLK_CTL_SEL_PLL;
 779		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_DAC_EN |
 780					     MGA1064_MISC_CTL_VGA8 |
 781					     MGA1064_MISC_CTL_DAC_RAM_CS;
 782		if (mdev->has_sdram)
 783			option = 0x40049120;
 784		else
 785			option = 0x4004d120;
 786		option2 = 0x00008000;
 787		break;
 788	case G200_WB:
 
 789		dacvalue[MGA1064_VREF_CTL] = 0x07;
 790		option = 0x41049120;
 791		option2 = 0x0000b000;
 792		break;
 793	case G200_EV:
 794		dacvalue[MGA1064_PIX_CLK_CTL] = MGA1064_PIX_CLK_CTL_SEL_PLL;
 795		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_VGA8 |
 796					     MGA1064_MISC_CTL_DAC_RAM_CS;
 797		option = 0x00000120;
 798		option2 = 0x0000b000;
 799		break;
 800	case G200_EH:
 
 801		dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_VGA8 |
 802					     MGA1064_MISC_CTL_DAC_RAM_CS;
 803		option = 0x00000120;
 804		option2 = 0x0000b000;
 805		break;
 806	case G200_ER:
 807		dac_index90 = 0;
 808		break;
 809	}
 810
 811	switch (crtc->fb->bits_per_pixel) {
 812	case 8:
 813		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_8bits;
 814		break;
 815	case 16:
 816		if (crtc->fb->depth == 15)
 817			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_15bits;
 818		else
 819			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_16bits;
 820		break;
 821	case 24:
 822		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_24bits;
 823		break;
 824	case 32:
 825		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_32_24bits;
 826		break;
 827	}
 828
 829	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
 830		misc |= 0x40;
 831	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
 832		misc |= 0x80;
 833
 834
 835	for (i = 0; i < sizeof(dacvalue); i++) {
 836		if ((i <= 0x03) ||
 837		    (i == 0x07) ||
 838		    (i == 0x0b) ||
 839		    (i == 0x0f) ||
 840		    ((i >= 0x13) && (i <= 0x17)) ||
 841		    (i == 0x1b) ||
 842		    (i == 0x1c) ||
 843		    ((i >= 0x1f) && (i <= 0x29)) ||
 844		    ((i >= 0x30) && (i <= 0x37)))
 845			continue;
 846		if (IS_G200_SE(mdev) &&
 847		    ((i == 0x2c) || (i == 0x2d) || (i == 0x2e)))
 848			continue;
 849		if ((mdev->type == G200_EV || mdev->type == G200_WB || mdev->type == G200_EH) &&
 
 
 
 
 850		    (i >= 0x44) && (i <= 0x4e))
 851			continue;
 852
 853		WREG_DAC(i, dacvalue[i]);
 854	}
 855
 856	if (mdev->type == G200_ER) {
 857		WREG_DAC(0x90, dac_index90);
 858	}
 859
 860
 861	if (option)
 862		pci_write_config_dword(dev->pdev, PCI_MGA_OPTION, option);
 863	if (option2)
 864		pci_write_config_dword(dev->pdev, PCI_MGA_OPTION2, option2);
 865
 866	WREG_SEQ(2, 0xf);
 867	WREG_SEQ(3, 0);
 868	WREG_SEQ(4, 0xe);
 869
 870	pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8);
 871	if (crtc->fb->bits_per_pixel == 24)
 872		pitch = pitch >> (4 - bppshift);
 873	else
 874		pitch = pitch >> (4 - bppshift);
 875
 876	hdisplay = mode->hdisplay / 8 - 1;
 877	hsyncstart = mode->hsync_start / 8 - 1;
 878	hsyncend = mode->hsync_end / 8 - 1;
 879	htotal = mode->htotal / 8 - 1;
 880
 881	/* Work around hardware quirk */
 882	if ((htotal & 0x07) == 0x06 || (htotal & 0x07) == 0x04)
 883		htotal++;
 884
 885	vdisplay = mode->vdisplay - 1;
 886	vsyncstart = mode->vsync_start - 1;
 887	vsyncend = mode->vsync_end - 1;
 888	vtotal = mode->vtotal - 2;
 889
 890	WREG_GFX(0, 0);
 891	WREG_GFX(1, 0);
 892	WREG_GFX(2, 0);
 893	WREG_GFX(3, 0);
 894	WREG_GFX(4, 0);
 895	WREG_GFX(5, 0x40);
 896	WREG_GFX(6, 0x5);
 897	WREG_GFX(7, 0xf);
 898	WREG_GFX(8, 0xf);
 899
 900	WREG_CRT(0, htotal - 4);
 901	WREG_CRT(1, hdisplay);
 902	WREG_CRT(2, hdisplay);
 903	WREG_CRT(3, (htotal & 0x1F) | 0x80);
 904	WREG_CRT(4, hsyncstart);
 905	WREG_CRT(5, ((htotal & 0x20) << 2) | (hsyncend & 0x1F));
 906	WREG_CRT(6, vtotal & 0xFF);
 907	WREG_CRT(7, ((vtotal & 0x100) >> 8) |
 908		 ((vdisplay & 0x100) >> 7) |
 909		 ((vsyncstart & 0x100) >> 6) |
 910		 ((vdisplay & 0x100) >> 5) |
 911		 ((vdisplay & 0x100) >> 4) | /* linecomp */
 912		 ((vtotal & 0x200) >> 4)|
 913		 ((vdisplay & 0x200) >> 3) |
 914		 ((vsyncstart & 0x200) >> 2));
 915	WREG_CRT(9, ((vdisplay & 0x200) >> 4) |
 916		 ((vdisplay & 0x200) >> 3));
 917	WREG_CRT(10, 0);
 918	WREG_CRT(11, 0);
 919	WREG_CRT(12, 0);
 920	WREG_CRT(13, 0);
 921	WREG_CRT(14, 0);
 922	WREG_CRT(15, 0);
 923	WREG_CRT(16, vsyncstart & 0xFF);
 924	WREG_CRT(17, (vsyncend & 0x0F) | 0x20);
 925	WREG_CRT(18, vdisplay & 0xFF);
 926	WREG_CRT(19, pitch & 0xFF);
 927	WREG_CRT(20, 0);
 928	WREG_CRT(21, vdisplay & 0xFF);
 929	WREG_CRT(22, (vtotal + 1) & 0xFF);
 930	WREG_CRT(23, 0xc3);
 931	WREG_CRT(24, vdisplay & 0xFF);
 932
 933	ext_vga[0] = 0;
 934	ext_vga[5] = 0;
 935
 936	/* TODO interlace */
 937
 938	ext_vga[0] |= (pitch & 0x300) >> 4;
 939	ext_vga[1] = (((htotal - 4) & 0x100) >> 8) |
 940		((hdisplay & 0x100) >> 7) |
 941		((hsyncstart & 0x100) >> 6) |
 942		(htotal & 0x40);
 943	ext_vga[2] = ((vtotal & 0xc00) >> 10) |
 944		((vdisplay & 0x400) >> 8) |
 945		((vdisplay & 0xc00) >> 7) |
 946		((vsyncstart & 0xc00) >> 5) |
 947		((vdisplay & 0x400) >> 3);
 948	if (crtc->fb->bits_per_pixel == 24)
 949		ext_vga[3] = (((1 << bppshift) * 3) - 1) | 0x80;
 950	else
 951		ext_vga[3] = ((1 << bppshift) - 1) | 0x80;
 952	ext_vga[4] = 0;
 953	if (mdev->type == G200_WB)
 954		ext_vga[1] |= 0x88;
 955
 956	ext_vga_index24 = 0x05;
 957
 958	/* Set pixel clocks */
 959	misc = 0x2d;
 960	WREG8(MGA_MISC_OUT, misc);
 961
 962	mga_crtc_set_plls(mdev, mode->clock);
 963
 964	for (i = 0; i < 6; i++) {
 965		WREG_ECRT(i, ext_vga[i]);
 966	}
 967
 968	if (mdev->type == G200_ER)
 969		WREG_ECRT(24, ext_vga_index24);
 
 
 
 970
 971	if (mdev->type == G200_EV) {
 972		WREG_ECRT(6, 0);
 973	}
 974
 975	WREG_ECRT(0, ext_vga[0]);
 976	/* Enable mga pixel clock */
 977	misc = 0x2d;
 978
 979	WREG8(MGA_MISC_OUT, misc);
 980
 981	if (adjusted_mode)
 982		memcpy(&mdev->mode, mode, sizeof(struct drm_display_mode));
 983
 984	mga_crtc_do_set_base(crtc, old_fb, x, y, 0);
 985
 986	/* reset tagfifo */
 987	if (mdev->type == G200_ER) {
 988		u32 mem_ctl = RREG32(MGAREG_MEMCTL);
 989		u8 seq1;
 990
 991		/* screen off */
 992		WREG8(MGAREG_SEQ_INDEX, 0x01);
 993		seq1 = RREG8(MGAREG_SEQ_DATA) | 0x20;
 994		WREG8(MGAREG_SEQ_DATA, seq1);
 995
 996		WREG32(MGAREG_MEMCTL, mem_ctl | 0x00200000);
 997		udelay(1000);
 998		WREG32(MGAREG_MEMCTL, mem_ctl & ~0x00200000);
 999
1000		WREG8(MGAREG_SEQ_DATA, seq1 & ~0x20);
1001	}
1002
1003
1004	if (IS_G200_SE(mdev)) {
1005		if (mdev->reg_1e24 >= 0x02) {
 
 
 
1006			u8 hi_pri_lvl;
1007			u32 bpp;
1008			u32 mb;
1009
1010			if (crtc->fb->bits_per_pixel > 16)
1011				bpp = 32;
1012			else if (crtc->fb->bits_per_pixel > 8)
1013				bpp = 16;
1014			else
1015				bpp = 8;
1016
1017			mb = (mode->clock * bpp) / 1000;
1018			if (mb > 3100)
1019				hi_pri_lvl = 0;
1020			else if (mb > 2600)
1021				hi_pri_lvl = 1;
1022			else if (mb > 1900)
1023				hi_pri_lvl = 2;
1024			else if (mb > 1160)
1025				hi_pri_lvl = 3;
1026			else if (mb > 440)
1027				hi_pri_lvl = 4;
1028			else
1029				hi_pri_lvl = 5;
1030
1031			WREG8(0x1fde, 0x06);
1032			WREG8(0x1fdf, hi_pri_lvl);
1033		} else {
1034			if (mdev->reg_1e24 >= 0x01)
1035				WREG8(0x1fdf, 0x03);
 
1036			else
1037				WREG8(0x1fdf, 0x04);
1038		}
1039	}
1040	return 0;
1041}
1042
1043#if 0 /* code from mjg to attempt D3 on crtc dpms off - revisit later */
1044static int mga_suspend(struct drm_crtc *crtc)
1045{
1046	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1047	struct drm_device *dev = crtc->dev;
1048	struct mga_device *mdev = dev->dev_private;
1049	struct pci_dev *pdev = dev->pdev;
1050	int option;
1051
1052	if (mdev->suspended)
1053		return 0;
1054
1055	WREG_SEQ(1, 0x20);
1056	WREG_ECRT(1, 0x30);
1057	/* Disable the pixel clock */
1058	WREG_DAC(0x1a, 0x05);
1059	/* Power down the DAC */
1060	WREG_DAC(0x1e, 0x18);
1061	/* Power down the pixel PLL */
1062	WREG_DAC(0x1a, 0x0d);
1063
1064	/* Disable PLLs and clocks */
1065	pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
1066	option &= ~(0x1F8024);
1067	pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
1068	pci_set_power_state(pdev, PCI_D3hot);
1069	pci_disable_device(pdev);
1070
1071	mdev->suspended = true;
1072
1073	return 0;
1074}
1075
1076static int mga_resume(struct drm_crtc *crtc)
1077{
1078	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1079	struct drm_device *dev = crtc->dev;
1080	struct mga_device *mdev = dev->dev_private;
1081	struct pci_dev *pdev = dev->pdev;
1082	int option;
1083
1084	if (!mdev->suspended)
1085		return 0;
1086
1087	pci_set_power_state(pdev, PCI_D0);
1088	pci_enable_device(pdev);
1089
1090	/* Disable sysclk */
1091	pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
1092	option &= ~(0x4);
1093	pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
1094
1095	mdev->suspended = false;
1096
1097	return 0;
1098}
1099
1100#endif
1101
1102static void mga_crtc_dpms(struct drm_crtc *crtc, int mode)
1103{
1104	struct drm_device *dev = crtc->dev;
1105	struct mga_device *mdev = dev->dev_private;
1106	u8 seq1 = 0, crtcext1 = 0;
1107
1108	switch (mode) {
1109	case DRM_MODE_DPMS_ON:
1110		seq1 = 0;
1111		crtcext1 = 0;
1112		mga_crtc_load_lut(crtc);
1113		break;
1114	case DRM_MODE_DPMS_STANDBY:
1115		seq1 = 0x20;
1116		crtcext1 = 0x10;
1117		break;
1118	case DRM_MODE_DPMS_SUSPEND:
1119		seq1 = 0x20;
1120		crtcext1 = 0x20;
1121		break;
1122	case DRM_MODE_DPMS_OFF:
1123		seq1 = 0x20;
1124		crtcext1 = 0x30;
1125		break;
1126	}
1127
1128#if 0
1129	if (mode == DRM_MODE_DPMS_OFF) {
1130		mga_suspend(crtc);
1131	}
1132#endif
1133	WREG8(MGAREG_SEQ_INDEX, 0x01);
1134	seq1 |= RREG8(MGAREG_SEQ_DATA) & ~0x20;
1135	mga_wait_vsync(mdev);
1136	mga_wait_busy(mdev);
1137	WREG8(MGAREG_SEQ_DATA, seq1);
1138	msleep(20);
1139	WREG8(MGAREG_CRTCEXT_INDEX, 0x01);
1140	crtcext1 |= RREG8(MGAREG_CRTCEXT_DATA) & ~0x30;
1141	WREG8(MGAREG_CRTCEXT_DATA, crtcext1);
1142
1143#if 0
1144	if (mode == DRM_MODE_DPMS_ON && mdev->suspended == true) {
1145		mga_resume(crtc);
1146		drm_helper_resume_force_mode(dev);
1147	}
1148#endif
1149}
1150
1151/*
1152 * This is called before a mode is programmed. A typical use might be to
1153 * enable DPMS during the programming to avoid seeing intermediate stages,
1154 * but that's not relevant to us
1155 */
1156static void mga_crtc_prepare(struct drm_crtc *crtc)
1157{
1158	struct drm_device *dev = crtc->dev;
1159	struct mga_device *mdev = dev->dev_private;
1160	u8 tmp;
1161
1162	/*	mga_resume(crtc);*/
1163
1164	WREG8(MGAREG_CRTC_INDEX, 0x11);
1165	tmp = RREG8(MGAREG_CRTC_DATA);
1166	WREG_CRT(0x11, tmp | 0x80);
1167
1168	if (mdev->type == G200_SE_A || mdev->type == G200_SE_B) {
1169		WREG_SEQ(0, 1);
1170		msleep(50);
1171		WREG_SEQ(1, 0x20);
1172		msleep(20);
1173	} else {
1174		WREG8(MGAREG_SEQ_INDEX, 0x1);
1175		tmp = RREG8(MGAREG_SEQ_DATA);
1176
1177		/* start sync reset */
1178		WREG_SEQ(0, 1);
1179		WREG_SEQ(1, tmp | 0x20);
1180	}
1181
1182	if (mdev->type == G200_WB)
1183		mga_g200wb_prepare(crtc);
1184
1185	WREG_CRT(17, 0);
1186}
1187
1188/*
1189 * This is called after a mode is programmed. It should reverse anything done
1190 * by the prepare function
1191 */
1192static void mga_crtc_commit(struct drm_crtc *crtc)
1193{
1194	struct drm_device *dev = crtc->dev;
1195	struct mga_device *mdev = dev->dev_private;
1196	struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
1197	u8 tmp;
1198
1199	if (mdev->type == G200_WB)
1200		mga_g200wb_commit(crtc);
1201
1202	if (mdev->type == G200_SE_A || mdev->type == G200_SE_B) {
1203		msleep(50);
1204		WREG_SEQ(1, 0x0);
1205		msleep(20);
1206		WREG_SEQ(0, 0x3);
1207	} else {
1208		WREG8(MGAREG_SEQ_INDEX, 0x1);
1209		tmp = RREG8(MGAREG_SEQ_DATA);
1210
1211		tmp &= ~0x20;
1212		WREG_SEQ(0x1, tmp);
1213		WREG_SEQ(0, 3);
1214	}
1215	crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
1216}
1217
1218/*
1219 * The core can pass us a set of gamma values to program. We actually only
1220 * use this for 8-bit mode so can't perform smooth fades on deeper modes,
1221 * but it's a requirement that we provide the function
1222 */
1223static void mga_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
1224				  u16 *blue, uint32_t start, uint32_t size)
 
1225{
1226	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1227	int end = (start + size > MGAG200_LUT_SIZE) ? MGAG200_LUT_SIZE : start + size;
1228	int i;
1229
1230	for (i = start; i < end; i++) {
1231		mga_crtc->lut_r[i] = red[i] >> 8;
1232		mga_crtc->lut_g[i] = green[i] >> 8;
1233		mga_crtc->lut_b[i] = blue[i] >> 8;
1234	}
1235	mga_crtc_load_lut(crtc);
1236}
1237
1238/* Simple cleanup function */
1239static void mga_crtc_destroy(struct drm_crtc *crtc)
1240{
1241	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1242
1243	drm_crtc_cleanup(crtc);
1244	kfree(mga_crtc);
1245}
1246
 
 
 
 
 
 
 
 
 
 
 
 
 
1247/* These provide the minimum set of functions required to handle a CRTC */
1248static const struct drm_crtc_funcs mga_crtc_funcs = {
 
 
1249	.gamma_set = mga_crtc_gamma_set,
1250	.set_config = drm_crtc_helper_set_config,
1251	.destroy = mga_crtc_destroy,
1252};
1253
1254static const struct drm_crtc_helper_funcs mga_helper_funcs = {
 
1255	.dpms = mga_crtc_dpms,
1256	.mode_fixup = mga_crtc_mode_fixup,
1257	.mode_set = mga_crtc_mode_set,
1258	.mode_set_base = mga_crtc_mode_set_base,
1259	.prepare = mga_crtc_prepare,
1260	.commit = mga_crtc_commit,
1261	.load_lut = mga_crtc_load_lut,
1262};
1263
1264/* CRTC setup */
1265static void mga_crtc_init(struct drm_device *dev)
1266{
1267	struct mga_device *mdev = dev->dev_private;
1268	struct mga_crtc *mga_crtc;
1269	int i;
1270
1271	mga_crtc = kzalloc(sizeof(struct mga_crtc) +
1272			      (MGAG200FB_CONN_LIMIT * sizeof(struct drm_connector *)),
1273			      GFP_KERNEL);
1274
1275	if (mga_crtc == NULL)
1276		return;
1277
1278	drm_crtc_init(dev, &mga_crtc->base, &mga_crtc_funcs);
1279
1280	drm_mode_crtc_set_gamma_size(&mga_crtc->base, MGAG200_LUT_SIZE);
1281	mdev->mode_info.crtc = mga_crtc;
1282
1283	for (i = 0; i < MGAG200_LUT_SIZE; i++) {
1284		mga_crtc->lut_r[i] = i;
1285		mga_crtc->lut_g[i] = i;
1286		mga_crtc->lut_b[i] = i;
1287	}
1288
1289	drm_crtc_helper_add(&mga_crtc->base, &mga_helper_funcs);
1290}
1291
1292/** Sets the color ramps on behalf of fbcon */
1293void mga_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
1294			      u16 blue, int regno)
1295{
1296	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1297
1298	mga_crtc->lut_r[regno] = red >> 8;
1299	mga_crtc->lut_g[regno] = green >> 8;
1300	mga_crtc->lut_b[regno] = blue >> 8;
1301}
1302
1303/** Gets the color ramps on behalf of fbcon */
1304void mga_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
1305			      u16 *blue, int regno)
1306{
1307	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
1308
1309	*red = (u16)mga_crtc->lut_r[regno] << 8;
1310	*green = (u16)mga_crtc->lut_g[regno] << 8;
1311	*blue = (u16)mga_crtc->lut_b[regno] << 8;
1312}
1313
1314/*
1315 * The encoder comes after the CRTC in the output pipeline, but before
1316 * the connector. It's responsible for ensuring that the digital
1317 * stream is appropriately converted into the output format. Setup is
1318 * very simple in this case - all we have to do is inform qemu of the
1319 * colour depth in order to ensure that it displays appropriately
1320 */
1321
1322/*
1323 * These functions are analagous to those in the CRTC code, but are intended
1324 * to handle any encoder-specific limitations
1325 */
1326static bool mga_encoder_mode_fixup(struct drm_encoder *encoder,
1327				  struct drm_display_mode *mode,
1328				  struct drm_display_mode *adjusted_mode)
1329{
1330	return true;
1331}
1332
1333static void mga_encoder_mode_set(struct drm_encoder *encoder,
1334				struct drm_display_mode *mode,
1335				struct drm_display_mode *adjusted_mode)
1336{
1337
1338}
1339
1340static void mga_encoder_dpms(struct drm_encoder *encoder, int state)
1341{
1342	return;
1343}
1344
1345static void mga_encoder_prepare(struct drm_encoder *encoder)
1346{
1347}
1348
1349static void mga_encoder_commit(struct drm_encoder *encoder)
1350{
1351}
1352
1353void mga_encoder_destroy(struct drm_encoder *encoder)
1354{
1355	struct mga_encoder *mga_encoder = to_mga_encoder(encoder);
1356	drm_encoder_cleanup(encoder);
1357	kfree(mga_encoder);
1358}
1359
1360static const struct drm_encoder_helper_funcs mga_encoder_helper_funcs = {
1361	.dpms = mga_encoder_dpms,
1362	.mode_fixup = mga_encoder_mode_fixup,
1363	.mode_set = mga_encoder_mode_set,
1364	.prepare = mga_encoder_prepare,
1365	.commit = mga_encoder_commit,
1366};
1367
1368static const struct drm_encoder_funcs mga_encoder_encoder_funcs = {
1369	.destroy = mga_encoder_destroy,
1370};
1371
1372static struct drm_encoder *mga_encoder_init(struct drm_device *dev)
1373{
1374	struct drm_encoder *encoder;
1375	struct mga_encoder *mga_encoder;
1376
1377	mga_encoder = kzalloc(sizeof(struct mga_encoder), GFP_KERNEL);
1378	if (!mga_encoder)
1379		return NULL;
1380
1381	encoder = &mga_encoder->base;
1382	encoder->possible_crtcs = 0x1;
1383
1384	drm_encoder_init(dev, encoder, &mga_encoder_encoder_funcs,
1385			 DRM_MODE_ENCODER_DAC);
1386	drm_encoder_helper_add(encoder, &mga_encoder_helper_funcs);
1387
1388	return encoder;
1389}
1390
1391
1392static int mga_vga_get_modes(struct drm_connector *connector)
1393{
1394	struct mga_connector *mga_connector = to_mga_connector(connector);
1395	struct edid *edid;
1396	int ret = 0;
1397
1398	edid = drm_get_edid(connector, &mga_connector->i2c->adapter);
1399	if (edid) {
1400		drm_mode_connector_update_edid_property(connector, edid);
1401		ret = drm_add_edid_modes(connector, edid);
1402		connector->display_info.raw_edid = NULL;
1403		kfree(edid);
1404	}
1405	return ret;
1406}
1407
1408static int mga_vga_mode_valid(struct drm_connector *connector,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1409				 struct drm_display_mode *mode)
1410{
1411	/* FIXME: Add bandwidth and g200se limitations */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1412
1413	if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 ||
1414	    mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 ||
1415	    mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
1416	    mode->crtc_vsync_end > 4096 || mode->crtc_vtotal > 4096) {
1417		return MODE_BAD;
1418	}
1419
 
 
 
 
 
 
 
 
 
 
 
 
1420	return MODE_OK;
1421}
1422
1423struct drm_encoder *mga_connector_best_encoder(struct drm_connector
1424						  *connector)
1425{
1426	int enc_id = connector->encoder_ids[0];
1427	struct drm_mode_object *obj;
1428	struct drm_encoder *encoder;
1429
1430	/* pick the encoder ids */
1431	if (enc_id) {
1432		obj =
1433		    drm_mode_object_find(connector->dev, enc_id,
1434					 DRM_MODE_OBJECT_ENCODER);
1435		if (!obj)
1436			return NULL;
1437		encoder = obj_to_encoder(obj);
1438		return encoder;
1439	}
1440	return NULL;
1441}
1442
1443static enum drm_connector_status mga_vga_detect(struct drm_connector
1444						   *connector, bool force)
1445{
1446	return connector_status_connected;
1447}
1448
1449static void mga_connector_destroy(struct drm_connector *connector)
1450{
1451	struct mga_connector *mga_connector = to_mga_connector(connector);
1452	mgag200_i2c_destroy(mga_connector->i2c);
1453	drm_connector_cleanup(connector);
1454	kfree(connector);
1455}
1456
1457struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
1458	.get_modes = mga_vga_get_modes,
1459	.mode_valid = mga_vga_mode_valid,
1460	.best_encoder = mga_connector_best_encoder,
1461};
1462
1463struct drm_connector_funcs mga_vga_connector_funcs = {
1464	.dpms = drm_helper_connector_dpms,
1465	.detect = mga_vga_detect,
1466	.fill_modes = drm_helper_probe_single_connector_modes,
1467	.destroy = mga_connector_destroy,
1468};
1469
1470static struct drm_connector *mga_vga_init(struct drm_device *dev)
1471{
1472	struct drm_connector *connector;
1473	struct mga_connector *mga_connector;
1474
1475	mga_connector = kzalloc(sizeof(struct mga_connector), GFP_KERNEL);
1476	if (!mga_connector)
1477		return NULL;
1478
1479	connector = &mga_connector->base;
 
 
 
1480
1481	drm_connector_init(dev, connector,
1482			   &mga_vga_connector_funcs, DRM_MODE_CONNECTOR_VGA);
 
 
1483
1484	drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
1485
1486	mga_connector->i2c = mgag200_i2c_create(dev);
1487	if (!mga_connector->i2c)
1488		DRM_ERROR("failed to add ddc bus\n");
1489
1490	return connector;
1491}
1492
1493
1494int mgag200_modeset_init(struct mga_device *mdev)
1495{
1496	struct drm_encoder *encoder;
1497	struct drm_connector *connector;
1498	int ret;
1499
1500	mdev->mode_info.mode_config_initialized = true;
1501
1502	mdev->dev->mode_config.max_width = MGAG200_MAX_FB_WIDTH;
1503	mdev->dev->mode_config.max_height = MGAG200_MAX_FB_HEIGHT;
1504
1505	mdev->dev->mode_config.fb_base = mdev->mc.vram_base;
1506
1507	mga_crtc_init(mdev->dev);
1508
1509	encoder = mga_encoder_init(mdev->dev);
1510	if (!encoder) {
1511		DRM_ERROR("mga_encoder_init failed\n");
1512		return -1;
1513	}
1514
1515	connector = mga_vga_init(mdev->dev);
1516	if (!connector) {
1517		DRM_ERROR("mga_vga_init failed\n");
1518		return -1;
1519	}
1520
1521	drm_mode_connector_attach_encoder(connector, encoder);
1522
1523	ret = mgag200_fbdev_init(mdev);
1524	if (ret) {
1525		DRM_ERROR("mga_fbdev_init failed\n");
1526		return ret;
1527	}
1528
1529	return 0;
1530}
1531
1532void mgag200_modeset_fini(struct mga_device *mdev)
1533{
1534
1535}