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