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