drm/ast: Don't clear base address and offset with default values
[linux-2.6-microblaze.git] / drivers / gpu / drm / ast / ast_mode.c
1 /*
2  * Copyright 2012 Red Hat Inc.
3  * Parts based on xf86-video-ast
4  * Copyright (c) 2005 ASPEED Technology Inc.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20  * USE OR OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * The above copyright notice and this permission notice (including the
23  * next paragraph) shall be included in all copies or substantial portions
24  * of the Software.
25  *
26  */
27 /*
28  * Authors: Dave Airlie <airlied@redhat.com>
29  */
30
31 #include <linux/export.h>
32 #include <linux/pci.h>
33
34 #include <drm/drm_crtc.h>
35 #include <drm/drm_crtc_helper.h>
36 #include <drm/drm_fourcc.h>
37 #include <drm/drm_gem_vram_helper.h>
38 #include <drm/drm_plane_helper.h>
39 #include <drm/drm_probe_helper.h>
40
41 #include "ast_drv.h"
42 #include "ast_tables.h"
43
44 static struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev);
45 static void ast_i2c_destroy(struct ast_i2c_chan *i2c);
46 static int ast_cursor_set(struct drm_crtc *crtc,
47                           struct drm_file *file_priv,
48                           uint32_t handle,
49                           uint32_t width,
50                           uint32_t height);
51 static int ast_cursor_move(struct drm_crtc *crtc,
52                            int x, int y);
53
54 static inline void ast_load_palette_index(struct ast_private *ast,
55                                      u8 index, u8 red, u8 green,
56                                      u8 blue)
57 {
58         ast_io_write8(ast, AST_IO_DAC_INDEX_WRITE, index);
59         ast_io_read8(ast, AST_IO_SEQ_PORT);
60         ast_io_write8(ast, AST_IO_DAC_DATA, red);
61         ast_io_read8(ast, AST_IO_SEQ_PORT);
62         ast_io_write8(ast, AST_IO_DAC_DATA, green);
63         ast_io_read8(ast, AST_IO_SEQ_PORT);
64         ast_io_write8(ast, AST_IO_DAC_DATA, blue);
65         ast_io_read8(ast, AST_IO_SEQ_PORT);
66 }
67
68 static void ast_crtc_load_lut(struct drm_crtc *crtc)
69 {
70         struct ast_private *ast = crtc->dev->dev_private;
71         u16 *r, *g, *b;
72         int i;
73
74         if (!crtc->enabled)
75                 return;
76
77         r = crtc->gamma_store;
78         g = r + crtc->gamma_size;
79         b = g + crtc->gamma_size;
80
81         for (i = 0; i < 256; i++)
82                 ast_load_palette_index(ast, i, *r++ >> 8, *g++ >> 8, *b++ >> 8);
83 }
84
85 static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, struct drm_display_mode *mode,
86                                     struct drm_display_mode *adjusted_mode,
87                                     struct ast_vbios_mode_info *vbios_mode)
88 {
89         struct ast_private *ast = crtc->dev->dev_private;
90         const struct drm_framebuffer *fb = crtc->primary->fb;
91         u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate;
92         const struct ast_vbios_enhtable *best = NULL;
93         u32 hborder, vborder;
94         bool check_sync;
95
96         switch (fb->format->cpp[0] * 8) {
97         case 8:
98                 vbios_mode->std_table = &vbios_stdtable[VGAModeIndex];
99                 color_index = VGAModeIndex - 1;
100                 break;
101         case 16:
102                 vbios_mode->std_table = &vbios_stdtable[HiCModeIndex];
103                 color_index = HiCModeIndex;
104                 break;
105         case 24:
106         case 32:
107                 vbios_mode->std_table = &vbios_stdtable[TrueCModeIndex];
108                 color_index = TrueCModeIndex;
109                 break;
110         default:
111                 return false;
112         }
113
114         switch (crtc->mode.crtc_hdisplay) {
115         case 640:
116                 vbios_mode->enh_table = &res_640x480[refresh_rate_index];
117                 break;
118         case 800:
119                 vbios_mode->enh_table = &res_800x600[refresh_rate_index];
120                 break;
121         case 1024:
122                 vbios_mode->enh_table = &res_1024x768[refresh_rate_index];
123                 break;
124         case 1280:
125                 if (crtc->mode.crtc_vdisplay == 800)
126                         vbios_mode->enh_table = &res_1280x800[refresh_rate_index];
127                 else
128                         vbios_mode->enh_table = &res_1280x1024[refresh_rate_index];
129                 break;
130         case 1360:
131                 vbios_mode->enh_table = &res_1360x768[refresh_rate_index];
132                 break;
133         case 1440:
134                 vbios_mode->enh_table = &res_1440x900[refresh_rate_index];
135                 break;
136         case 1600:
137                 if (crtc->mode.crtc_vdisplay == 900)
138                         vbios_mode->enh_table = &res_1600x900[refresh_rate_index];
139                 else
140                         vbios_mode->enh_table = &res_1600x1200[refresh_rate_index];
141                 break;
142         case 1680:
143                 vbios_mode->enh_table = &res_1680x1050[refresh_rate_index];
144                 break;
145         case 1920:
146                 if (crtc->mode.crtc_vdisplay == 1080)
147                         vbios_mode->enh_table = &res_1920x1080[refresh_rate_index];
148                 else
149                         vbios_mode->enh_table = &res_1920x1200[refresh_rate_index];
150                 break;
151         default:
152                 return false;
153         }
154
155         refresh_rate = drm_mode_vrefresh(mode);
156         check_sync = vbios_mode->enh_table->flags & WideScreenMode;
157         do {
158                 const struct ast_vbios_enhtable *loop = vbios_mode->enh_table;
159
160                 while (loop->refresh_rate != 0xff) {
161                         if ((check_sync) &&
162                             (((mode->flags & DRM_MODE_FLAG_NVSYNC)  &&
163                               (loop->flags & PVSync))  ||
164                              ((mode->flags & DRM_MODE_FLAG_PVSYNC)  &&
165                               (loop->flags & NVSync))  ||
166                              ((mode->flags & DRM_MODE_FLAG_NHSYNC)  &&
167                               (loop->flags & PHSync))  ||
168                              ((mode->flags & DRM_MODE_FLAG_PHSYNC)  &&
169                               (loop->flags & NHSync)))) {
170                                 loop++;
171                                 continue;
172                         }
173                         if (loop->refresh_rate <= refresh_rate
174                             && (!best || loop->refresh_rate > best->refresh_rate))
175                                 best = loop;
176                         loop++;
177                 }
178                 if (best || !check_sync)
179                         break;
180                 check_sync = 0;
181         } while (1);
182         if (best)
183                 vbios_mode->enh_table = best;
184
185         hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0;
186         vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0;
187
188         adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht;
189         adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder;
190         adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder;
191         adjusted_mode->crtc_hsync_start = vbios_mode->enh_table->hde + hborder +
192                 vbios_mode->enh_table->hfp;
193         adjusted_mode->crtc_hsync_end = (vbios_mode->enh_table->hde + hborder +
194                                          vbios_mode->enh_table->hfp +
195                                          vbios_mode->enh_table->hsync);
196
197         adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt;
198         adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder;
199         adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder;
200         adjusted_mode->crtc_vsync_start = vbios_mode->enh_table->vde + vborder +
201                 vbios_mode->enh_table->vfp;
202         adjusted_mode->crtc_vsync_end = (vbios_mode->enh_table->vde + vborder +
203                                          vbios_mode->enh_table->vfp +
204                                          vbios_mode->enh_table->vsync);
205
206         refresh_rate_index = vbios_mode->enh_table->refresh_rate_index;
207         mode_id = vbios_mode->enh_table->mode_id;
208
209         if (ast->chip == AST1180) {
210                 /* TODO 1180 */
211         } else {
212                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8c, (u8)((color_index & 0xf) << 4));
213                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8d, refresh_rate_index & 0xff);
214                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8e, mode_id & 0xff);
215
216                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0x00);
217                 if (vbios_mode->enh_table->flags & NewModeInfo) {
218                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0xa8);
219                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x92,
220                                           fb->format->cpp[0] * 8);
221                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x93, adjusted_mode->clock / 1000);
222                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x94, adjusted_mode->crtc_hdisplay);
223                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x95, adjusted_mode->crtc_hdisplay >> 8);
224
225                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x96, adjusted_mode->crtc_vdisplay);
226                         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x97, adjusted_mode->crtc_vdisplay >> 8);
227                 }
228         }
229
230         return true;
231
232
233 }
234 static void ast_set_std_reg(struct drm_crtc *crtc, struct drm_display_mode *mode,
235                             struct ast_vbios_mode_info *vbios_mode)
236 {
237         struct ast_private *ast = crtc->dev->dev_private;
238         const struct ast_vbios_stdtable *stdtable;
239         u32 i;
240         u8 jreg;
241
242         stdtable = vbios_mode->std_table;
243
244         jreg = stdtable->misc;
245         ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, jreg);
246
247         /* Set SEQ */
248         ast_set_index_reg(ast, AST_IO_SEQ_PORT, 0x00, 0x03);
249         for (i = 0; i < 4; i++) {
250                 jreg = stdtable->seq[i];
251                 if (!i)
252                         jreg |= 0x20;
253                 ast_set_index_reg(ast, AST_IO_SEQ_PORT, (i + 1) , jreg);
254         }
255
256         /* Set CRTC; except base address and offset */
257         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x00);
258         for (i = 0; i < 12; i++)
259                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, stdtable->crtc[i]);
260         for (i = 14; i < 19; i++)
261                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, stdtable->crtc[i]);
262         for (i = 20; i < 25; i++)
263                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, stdtable->crtc[i]);
264
265         /* set AR */
266         jreg = ast_io_read8(ast, AST_IO_INPUT_STATUS1_READ);
267         for (i = 0; i < 20; i++) {
268                 jreg = stdtable->ar[i];
269                 ast_io_write8(ast, AST_IO_AR_PORT_WRITE, (u8)i);
270                 ast_io_write8(ast, AST_IO_AR_PORT_WRITE, jreg);
271         }
272         ast_io_write8(ast, AST_IO_AR_PORT_WRITE, 0x14);
273         ast_io_write8(ast, AST_IO_AR_PORT_WRITE, 0x00);
274
275         jreg = ast_io_read8(ast, AST_IO_INPUT_STATUS1_READ);
276         ast_io_write8(ast, AST_IO_AR_PORT_WRITE, 0x20);
277
278         /* Set GR */
279         for (i = 0; i < 9; i++)
280                 ast_set_index_reg(ast, AST_IO_GR_PORT, i, stdtable->gr[i]);
281 }
282
283 static void ast_set_crtc_reg(struct drm_crtc *crtc, struct drm_display_mode *mode,
284                              struct ast_vbios_mode_info *vbios_mode)
285 {
286         struct ast_private *ast = crtc->dev->dev_private;
287         u8 jreg05 = 0, jreg07 = 0, jreg09 = 0, jregAC = 0, jregAD = 0, jregAE = 0;
288         u16 temp, precache = 0;
289
290         if ((ast->chip == AST2500) &&
291             (vbios_mode->enh_table->flags & AST2500PreCatchCRT))
292                 precache = 40;
293
294         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x00);
295
296         temp = (mode->crtc_htotal >> 3) - 5;
297         if (temp & 0x100)
298                 jregAC |= 0x01; /* HT D[8] */
299         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x00, 0x00, temp);
300
301         temp = (mode->crtc_hdisplay >> 3) - 1;
302         if (temp & 0x100)
303                 jregAC |= 0x04; /* HDE D[8] */
304         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x01, 0x00, temp);
305
306         temp = (mode->crtc_hblank_start >> 3) - 1;
307         if (temp & 0x100)
308                 jregAC |= 0x10; /* HBS D[8] */
309         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x02, 0x00, temp);
310
311         temp = ((mode->crtc_hblank_end >> 3) - 1) & 0x7f;
312         if (temp & 0x20)
313                 jreg05 |= 0x80;  /* HBE D[5] */
314         if (temp & 0x40)
315                 jregAD |= 0x01;  /* HBE D[5] */
316         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x03, 0xE0, (temp & 0x1f));
317
318         temp = ((mode->crtc_hsync_start-precache) >> 3) - 1;
319         if (temp & 0x100)
320                 jregAC |= 0x40; /* HRS D[5] */
321         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x04, 0x00, temp);
322
323         temp = (((mode->crtc_hsync_end-precache) >> 3) - 1) & 0x3f;
324         if (temp & 0x20)
325                 jregAD |= 0x04; /* HRE D[5] */
326         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x05, 0x60, (u8)((temp & 0x1f) | jreg05));
327
328         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xAC, 0x00, jregAC);
329         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xAD, 0x00, jregAD);
330
331         /* vert timings */
332         temp = (mode->crtc_vtotal) - 2;
333         if (temp & 0x100)
334                 jreg07 |= 0x01;
335         if (temp & 0x200)
336                 jreg07 |= 0x20;
337         if (temp & 0x400)
338                 jregAE |= 0x01;
339         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x06, 0x00, temp);
340
341         temp = (mode->crtc_vsync_start) - 1;
342         if (temp & 0x100)
343                 jreg07 |= 0x04;
344         if (temp & 0x200)
345                 jreg07 |= 0x80;
346         if (temp & 0x400)
347                 jregAE |= 0x08;
348         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x10, 0x00, temp);
349
350         temp = (mode->crtc_vsync_end - 1) & 0x3f;
351         if (temp & 0x10)
352                 jregAE |= 0x20;
353         if (temp & 0x20)
354                 jregAE |= 0x40;
355         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x70, temp & 0xf);
356
357         temp = mode->crtc_vdisplay - 1;
358         if (temp & 0x100)
359                 jreg07 |= 0x02;
360         if (temp & 0x200)
361                 jreg07 |= 0x40;
362         if (temp & 0x400)
363                 jregAE |= 0x02;
364         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x12, 0x00, temp);
365
366         temp = mode->crtc_vblank_start - 1;
367         if (temp & 0x100)
368                 jreg07 |= 0x08;
369         if (temp & 0x200)
370                 jreg09 |= 0x20;
371         if (temp & 0x400)
372                 jregAE |= 0x04;
373         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x15, 0x00, temp);
374
375         temp = mode->crtc_vblank_end - 1;
376         if (temp & 0x100)
377                 jregAE |= 0x10;
378         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x16, 0x00, temp);
379
380         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x07, 0x00, jreg07);
381         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x09, 0xdf, jreg09);
382         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xAE, 0x00, (jregAE | 0x80));
383
384         if (precache)
385                 ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0x3f, 0x80);
386         else
387                 ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0x3f, 0x00);
388
389         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x80);
390 }
391
392 static void ast_set_offset_reg(struct drm_crtc *crtc)
393 {
394         struct ast_private *ast = crtc->dev->dev_private;
395         const struct drm_framebuffer *fb = crtc->primary->fb;
396
397         u16 offset;
398
399         offset = fb->pitches[0] >> 3;
400         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x13, (offset & 0xff));
401         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xb0, (offset >> 8) & 0x3f);
402 }
403
404 static void ast_set_dclk_reg(struct drm_device *dev, struct drm_display_mode *mode,
405                              struct ast_vbios_mode_info *vbios_mode)
406 {
407         struct ast_private *ast = dev->dev_private;
408         const struct ast_vbios_dclk_info *clk_info;
409
410         if (ast->chip == AST2500)
411                 clk_info = &dclk_table_ast2500[vbios_mode->enh_table->dclk_index];
412         else
413                 clk_info = &dclk_table[vbios_mode->enh_table->dclk_index];
414
415         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc0, 0x00, clk_info->param1);
416         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc1, 0x00, clk_info->param2);
417         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xbb, 0x0f,
418                                (clk_info->param3 & 0xc0) |
419                                ((clk_info->param3 & 0x3) << 4));
420 }
421
422 static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode,
423                              struct ast_vbios_mode_info *vbios_mode)
424 {
425         struct ast_private *ast = crtc->dev->dev_private;
426         const struct drm_framebuffer *fb = crtc->primary->fb;
427         u8 jregA0 = 0, jregA3 = 0, jregA8 = 0;
428
429         switch (fb->format->cpp[0] * 8) {
430         case 8:
431                 jregA0 = 0x70;
432                 jregA3 = 0x01;
433                 jregA8 = 0x00;
434                 break;
435         case 15:
436         case 16:
437                 jregA0 = 0x70;
438                 jregA3 = 0x04;
439                 jregA8 = 0x02;
440                 break;
441         case 32:
442                 jregA0 = 0x70;
443                 jregA3 = 0x08;
444                 jregA8 = 0x02;
445                 break;
446         }
447
448         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa0, 0x8f, jregA0);
449         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xf0, jregA3);
450         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa8, 0xfd, jregA8);
451
452         /* Set Threshold */
453         if (ast->chip == AST2300 || ast->chip == AST2400 ||
454             ast->chip == AST2500) {
455                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x78);
456                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x60);
457         } else if (ast->chip == AST2100 ||
458                    ast->chip == AST1100 ||
459                    ast->chip == AST2200 ||
460                    ast->chip == AST2150) {
461                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x3f);
462                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x2f);
463         } else {
464                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x2f);
465                 ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x1f);
466         }
467 }
468
469 static void ast_set_sync_reg(struct drm_device *dev, struct drm_display_mode *mode,
470                       struct ast_vbios_mode_info *vbios_mode)
471 {
472         struct ast_private *ast = dev->dev_private;
473         u8 jreg;
474
475         jreg  = ast_io_read8(ast, AST_IO_MISC_PORT_READ);
476         jreg &= ~0xC0;
477         if (vbios_mode->enh_table->flags & NVSync) jreg |= 0x80;
478         if (vbios_mode->enh_table->flags & NHSync) jreg |= 0x40;
479         ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, jreg);
480 }
481
482 static bool ast_set_dac_reg(struct drm_crtc *crtc, struct drm_display_mode *mode,
483                      struct ast_vbios_mode_info *vbios_mode)
484 {
485         const struct drm_framebuffer *fb = crtc->primary->fb;
486
487         switch (fb->format->cpp[0] * 8) {
488         case 8:
489                 break;
490         default:
491                 return false;
492         }
493         return true;
494 }
495
496 static void ast_set_start_address_crt1(struct drm_crtc *crtc, unsigned offset)
497 {
498         struct ast_private *ast = crtc->dev->dev_private;
499         u32 addr;
500
501         addr = offset >> 2;
502         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x0d, (u8)(addr & 0xff));
503         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x0c, (u8)((addr >> 8) & 0xff));
504         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xaf, (u8)((addr >> 16) & 0xff));
505
506 }
507
508 static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
509 {
510         struct ast_private *ast = crtc->dev->dev_private;
511
512         if (ast->chip == AST1180)
513                 return;
514
515         switch (mode) {
516         case DRM_MODE_DPMS_ON:
517         case DRM_MODE_DPMS_STANDBY:
518         case DRM_MODE_DPMS_SUSPEND:
519                 ast_set_index_reg_mask(ast, AST_IO_SEQ_PORT, 0x1, 0xdf, 0);
520                 if (ast->tx_chip_type == AST_TX_DP501)
521                         ast_set_dp501_video_output(crtc->dev, 1);
522                 ast_crtc_load_lut(crtc);
523                 break;
524         case DRM_MODE_DPMS_OFF:
525                 if (ast->tx_chip_type == AST_TX_DP501)
526                         ast_set_dp501_video_output(crtc->dev, 0);
527                 ast_set_index_reg_mask(ast, AST_IO_SEQ_PORT, 0x1, 0xdf, 0x20);
528                 break;
529         }
530 }
531
532 static int ast_crtc_do_set_base(struct drm_crtc *crtc,
533                                 struct drm_framebuffer *fb,
534                                 int x, int y, int atomic)
535 {
536         struct drm_gem_vram_object *gbo;
537         int ret;
538         s64 gpu_addr;
539
540         if (!atomic && fb) {
541                 gbo = drm_gem_vram_of_gem(fb->obj[0]);
542                 drm_gem_vram_unpin(gbo);
543         }
544
545         gbo = drm_gem_vram_of_gem(crtc->primary->fb->obj[0]);
546
547         ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
548         if (ret)
549                 return ret;
550         gpu_addr = drm_gem_vram_offset(gbo);
551         if (gpu_addr < 0) {
552                 ret = (int)gpu_addr;
553                 goto err_drm_gem_vram_unpin;
554         }
555
556         ast_set_offset_reg(crtc);
557         ast_set_start_address_crt1(crtc, (u32)gpu_addr);
558
559         return 0;
560
561 err_drm_gem_vram_unpin:
562         drm_gem_vram_unpin(gbo);
563         return ret;
564 }
565
566 static int ast_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
567                              struct drm_framebuffer *old_fb)
568 {
569         return ast_crtc_do_set_base(crtc, old_fb, x, y, 0);
570 }
571
572 static int ast_crtc_mode_set(struct drm_crtc *crtc,
573                              struct drm_display_mode *mode,
574                              struct drm_display_mode *adjusted_mode,
575                              int x, int y,
576                              struct drm_framebuffer *old_fb)
577 {
578         struct drm_device *dev = crtc->dev;
579         struct ast_private *ast = crtc->dev->dev_private;
580         struct ast_vbios_mode_info vbios_mode;
581         bool ret;
582         if (ast->chip == AST1180) {
583                 DRM_ERROR("AST 1180 modesetting not supported\n");
584                 return -EINVAL;
585         }
586
587         ret = ast_get_vbios_mode_info(crtc, mode, adjusted_mode, &vbios_mode);
588         if (ret == false)
589                 return -EINVAL;
590         ast_open_key(ast);
591
592         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa1, 0x06);
593
594         ast_set_std_reg(crtc, adjusted_mode, &vbios_mode);
595         ast_set_crtc_reg(crtc, adjusted_mode, &vbios_mode);
596         ast_set_offset_reg(crtc);
597         ast_set_dclk_reg(dev, adjusted_mode, &vbios_mode);
598         ast_set_ext_reg(crtc, adjusted_mode, &vbios_mode);
599         ast_set_sync_reg(dev, adjusted_mode, &vbios_mode);
600         ast_set_dac_reg(crtc, adjusted_mode, &vbios_mode);
601
602         ast_crtc_mode_set_base(crtc, x, y, old_fb);
603
604         return 0;
605 }
606
607 static void ast_crtc_disable(struct drm_crtc *crtc)
608 {
609         DRM_DEBUG_KMS("\n");
610         ast_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
611         if (crtc->primary->fb) {
612                 struct drm_framebuffer *fb = crtc->primary->fb;
613                 struct drm_gem_vram_object *gbo =
614                         drm_gem_vram_of_gem(fb->obj[0]);
615
616                 drm_gem_vram_unpin(gbo);
617         }
618         crtc->primary->fb = NULL;
619 }
620
621 static void ast_crtc_prepare(struct drm_crtc *crtc)
622 {
623
624 }
625
626 static void ast_crtc_commit(struct drm_crtc *crtc)
627 {
628         struct ast_private *ast = crtc->dev->dev_private;
629         ast_set_index_reg_mask(ast, AST_IO_SEQ_PORT, 0x1, 0xdf, 0);
630         ast_crtc_load_lut(crtc);
631 }
632
633
634 static const struct drm_crtc_helper_funcs ast_crtc_helper_funcs = {
635         .dpms = ast_crtc_dpms,
636         .mode_set = ast_crtc_mode_set,
637         .mode_set_base = ast_crtc_mode_set_base,
638         .disable = ast_crtc_disable,
639         .prepare = ast_crtc_prepare,
640         .commit = ast_crtc_commit,
641
642 };
643
644 static void ast_crtc_reset(struct drm_crtc *crtc)
645 {
646
647 }
648
649 static int ast_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
650                               u16 *blue, uint32_t size,
651                               struct drm_modeset_acquire_ctx *ctx)
652 {
653         ast_crtc_load_lut(crtc);
654
655         return 0;
656 }
657
658
659 static void ast_crtc_destroy(struct drm_crtc *crtc)
660 {
661         drm_crtc_cleanup(crtc);
662         kfree(crtc);
663 }
664
665 static const struct drm_crtc_funcs ast_crtc_funcs = {
666         .cursor_set = ast_cursor_set,
667         .cursor_move = ast_cursor_move,
668         .reset = ast_crtc_reset,
669         .set_config = drm_crtc_helper_set_config,
670         .gamma_set = ast_crtc_gamma_set,
671         .destroy = ast_crtc_destroy,
672 };
673
674 static int ast_crtc_init(struct drm_device *dev)
675 {
676         struct ast_crtc *crtc;
677
678         crtc = kzalloc(sizeof(struct ast_crtc), GFP_KERNEL);
679         if (!crtc)
680                 return -ENOMEM;
681
682         drm_crtc_init(dev, &crtc->base, &ast_crtc_funcs);
683         drm_mode_crtc_set_gamma_size(&crtc->base, 256);
684         drm_crtc_helper_add(&crtc->base, &ast_crtc_helper_funcs);
685         return 0;
686 }
687
688 static void ast_encoder_destroy(struct drm_encoder *encoder)
689 {
690         drm_encoder_cleanup(encoder);
691         kfree(encoder);
692 }
693
694 static const struct drm_encoder_funcs ast_enc_funcs = {
695         .destroy = ast_encoder_destroy,
696 };
697
698 static void ast_encoder_dpms(struct drm_encoder *encoder, int mode)
699 {
700
701 }
702
703 static void ast_encoder_mode_set(struct drm_encoder *encoder,
704                                struct drm_display_mode *mode,
705                                struct drm_display_mode *adjusted_mode)
706 {
707 }
708
709 static void ast_encoder_prepare(struct drm_encoder *encoder)
710 {
711
712 }
713
714 static void ast_encoder_commit(struct drm_encoder *encoder)
715 {
716
717 }
718
719
720 static const struct drm_encoder_helper_funcs ast_enc_helper_funcs = {
721         .dpms = ast_encoder_dpms,
722         .prepare = ast_encoder_prepare,
723         .commit = ast_encoder_commit,
724         .mode_set = ast_encoder_mode_set,
725 };
726
727 static int ast_encoder_init(struct drm_device *dev)
728 {
729         struct ast_encoder *ast_encoder;
730
731         ast_encoder = kzalloc(sizeof(struct ast_encoder), GFP_KERNEL);
732         if (!ast_encoder)
733                 return -ENOMEM;
734
735         drm_encoder_init(dev, &ast_encoder->base, &ast_enc_funcs,
736                          DRM_MODE_ENCODER_DAC, NULL);
737         drm_encoder_helper_add(&ast_encoder->base, &ast_enc_helper_funcs);
738
739         ast_encoder->base.possible_crtcs = 1;
740         return 0;
741 }
742
743 static int ast_get_modes(struct drm_connector *connector)
744 {
745         struct ast_connector *ast_connector = to_ast_connector(connector);
746         struct ast_private *ast = connector->dev->dev_private;
747         struct edid *edid;
748         int ret;
749         bool flags = false;
750         if (ast->tx_chip_type == AST_TX_DP501) {
751                 ast->dp501_maxclk = 0xff;
752                 edid = kmalloc(128, GFP_KERNEL);
753                 if (!edid)
754                         return -ENOMEM;
755
756                 flags = ast_dp501_read_edid(connector->dev, (u8 *)edid);
757                 if (flags)
758                         ast->dp501_maxclk = ast_get_dp501_max_clk(connector->dev);
759                 else
760                         kfree(edid);
761         }
762         if (!flags)
763                 edid = drm_get_edid(connector, &ast_connector->i2c->adapter);
764         if (edid) {
765                 drm_connector_update_edid_property(&ast_connector->base, edid);
766                 ret = drm_add_edid_modes(connector, edid);
767                 kfree(edid);
768                 return ret;
769         } else
770                 drm_connector_update_edid_property(&ast_connector->base, NULL);
771         return 0;
772 }
773
774 static enum drm_mode_status ast_mode_valid(struct drm_connector *connector,
775                           struct drm_display_mode *mode)
776 {
777         struct ast_private *ast = connector->dev->dev_private;
778         int flags = MODE_NOMODE;
779         uint32_t jtemp;
780
781         if (ast->support_wide_screen) {
782                 if ((mode->hdisplay == 1680) && (mode->vdisplay == 1050))
783                         return MODE_OK;
784                 if ((mode->hdisplay == 1280) && (mode->vdisplay == 800))
785                         return MODE_OK;
786                 if ((mode->hdisplay == 1440) && (mode->vdisplay == 900))
787                         return MODE_OK;
788                 if ((mode->hdisplay == 1360) && (mode->vdisplay == 768))
789                         return MODE_OK;
790                 if ((mode->hdisplay == 1600) && (mode->vdisplay == 900))
791                         return MODE_OK;
792
793                 if ((ast->chip == AST2100) || (ast->chip == AST2200) ||
794                     (ast->chip == AST2300) || (ast->chip == AST2400) ||
795                     (ast->chip == AST2500) || (ast->chip == AST1180)) {
796                         if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080))
797                                 return MODE_OK;
798
799                         if ((mode->hdisplay == 1920) && (mode->vdisplay == 1200)) {
800                                 jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
801                                 if (jtemp & 0x01)
802                                         return MODE_NOMODE;
803                                 else
804                                         return MODE_OK;
805                         }
806                 }
807         }
808         switch (mode->hdisplay) {
809         case 640:
810                 if (mode->vdisplay == 480) flags = MODE_OK;
811                 break;
812         case 800:
813                 if (mode->vdisplay == 600) flags = MODE_OK;
814                 break;
815         case 1024:
816                 if (mode->vdisplay == 768) flags = MODE_OK;
817                 break;
818         case 1280:
819                 if (mode->vdisplay == 1024) flags = MODE_OK;
820                 break;
821         case 1600:
822                 if (mode->vdisplay == 1200) flags = MODE_OK;
823                 break;
824         default:
825                 return flags;
826         }
827
828         return flags;
829 }
830
831 static void ast_connector_destroy(struct drm_connector *connector)
832 {
833         struct ast_connector *ast_connector = to_ast_connector(connector);
834         ast_i2c_destroy(ast_connector->i2c);
835         drm_connector_unregister(connector);
836         drm_connector_cleanup(connector);
837         kfree(connector);
838 }
839
840 static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
841         .mode_valid = ast_mode_valid,
842         .get_modes = ast_get_modes,
843 };
844
845 static const struct drm_connector_funcs ast_connector_funcs = {
846         .dpms = drm_helper_connector_dpms,
847         .fill_modes = drm_helper_probe_single_connector_modes,
848         .destroy = ast_connector_destroy,
849 };
850
851 static int ast_connector_init(struct drm_device *dev)
852 {
853         struct ast_connector *ast_connector;
854         struct drm_connector *connector;
855         struct drm_encoder *encoder;
856
857         ast_connector = kzalloc(sizeof(struct ast_connector), GFP_KERNEL);
858         if (!ast_connector)
859                 return -ENOMEM;
860
861         connector = &ast_connector->base;
862         ast_connector->i2c = ast_i2c_create(dev);
863         if (!ast_connector->i2c)
864                 DRM_ERROR("failed to add ddc bus for connector\n");
865
866         drm_connector_init_with_ddc(dev, connector,
867                                     &ast_connector_funcs,
868                                     DRM_MODE_CONNECTOR_VGA,
869                                     &ast_connector->i2c->adapter);
870
871         drm_connector_helper_add(connector, &ast_connector_helper_funcs);
872
873         connector->interlace_allowed = 0;
874         connector->doublescan_allowed = 0;
875
876         drm_connector_register(connector);
877
878         connector->polled = DRM_CONNECTOR_POLL_CONNECT;
879
880         encoder = list_first_entry(&dev->mode_config.encoder_list, struct drm_encoder, head);
881         drm_connector_attach_encoder(connector, encoder);
882
883         return 0;
884 }
885
886 /* allocate cursor cache and pin at start of VRAM */
887 static int ast_cursor_init(struct drm_device *dev)
888 {
889         struct ast_private *ast = dev->dev_private;
890         size_t size, i;
891         struct drm_gem_vram_object *gbo;
892         int ret;
893
894         size = roundup(AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE, PAGE_SIZE);
895
896         for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
897                 gbo = drm_gem_vram_create(dev, &dev->vram_mm->bdev,
898                                           size, 0, false);
899                 if (IS_ERR(gbo)) {
900                         ret = PTR_ERR(gbo);
901                         goto err_drm_gem_vram_put;
902                 }
903                 ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
904                                             DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
905                 if (ret) {
906                         drm_gem_vram_put(gbo);
907                         goto err_drm_gem_vram_put;
908                 }
909
910                 ast->cursor.gbo[i] = gbo;
911         }
912
913         return 0;
914
915 err_drm_gem_vram_put:
916         while (i) {
917                 --i;
918                 gbo = ast->cursor.gbo[i];
919                 drm_gem_vram_unpin(gbo);
920                 drm_gem_vram_put(gbo);
921                 ast->cursor.gbo[i] = NULL;
922         }
923         return ret;
924 }
925
926 static void ast_cursor_fini(struct drm_device *dev)
927 {
928         struct ast_private *ast = dev->dev_private;
929         size_t i;
930         struct drm_gem_vram_object *gbo;
931
932         for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
933                 gbo = ast->cursor.gbo[i];
934                 drm_gem_vram_unpin(gbo);
935                 drm_gem_vram_put(gbo);
936         }
937 }
938
939 int ast_mode_init(struct drm_device *dev)
940 {
941         ast_cursor_init(dev);
942         ast_crtc_init(dev);
943         ast_encoder_init(dev);
944         ast_connector_init(dev);
945         return 0;
946 }
947
948 void ast_mode_fini(struct drm_device *dev)
949 {
950         ast_cursor_fini(dev);
951 }
952
953 static int get_clock(void *i2c_priv)
954 {
955         struct ast_i2c_chan *i2c = i2c_priv;
956         struct ast_private *ast = i2c->dev->dev_private;
957         uint32_t val, val2, count, pass;
958
959         count = 0;
960         pass = 0;
961         val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
962         do {
963                 val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
964                 if (val == val2) {
965                         pass++;
966                 } else {
967                         pass = 0;
968                         val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
969                 }
970         } while ((pass < 5) && (count++ < 0x10000));
971
972         return val & 1 ? 1 : 0;
973 }
974
975 static int get_data(void *i2c_priv)
976 {
977         struct ast_i2c_chan *i2c = i2c_priv;
978         struct ast_private *ast = i2c->dev->dev_private;
979         uint32_t val, val2, count, pass;
980
981         count = 0;
982         pass = 0;
983         val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01;
984         do {
985                 val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01;
986                 if (val == val2) {
987                         pass++;
988                 } else {
989                         pass = 0;
990                         val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01;
991                 }
992         } while ((pass < 5) && (count++ < 0x10000));
993
994         return val & 1 ? 1 : 0;
995 }
996
997 static void set_clock(void *i2c_priv, int clock)
998 {
999         struct ast_i2c_chan *i2c = i2c_priv;
1000         struct ast_private *ast = i2c->dev->dev_private;
1001         int i;
1002         u8 ujcrb7, jtemp;
1003
1004         for (i = 0; i < 0x10000; i++) {
1005                 ujcrb7 = ((clock & 0x01) ? 0 : 1);
1006                 ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf4, ujcrb7);
1007                 jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x01);
1008                 if (ujcrb7 == jtemp)
1009                         break;
1010         }
1011 }
1012
1013 static void set_data(void *i2c_priv, int data)
1014 {
1015         struct ast_i2c_chan *i2c = i2c_priv;
1016         struct ast_private *ast = i2c->dev->dev_private;
1017         int i;
1018         u8 ujcrb7, jtemp;
1019
1020         for (i = 0; i < 0x10000; i++) {
1021                 ujcrb7 = ((data & 0x01) ? 0 : 1) << 2;
1022                 ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf1, ujcrb7);
1023                 jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x04);
1024                 if (ujcrb7 == jtemp)
1025                         break;
1026         }
1027 }
1028
1029 static struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
1030 {
1031         struct ast_i2c_chan *i2c;
1032         int ret;
1033
1034         i2c = kzalloc(sizeof(struct ast_i2c_chan), GFP_KERNEL);
1035         if (!i2c)
1036                 return NULL;
1037
1038         i2c->adapter.owner = THIS_MODULE;
1039         i2c->adapter.class = I2C_CLASS_DDC;
1040         i2c->adapter.dev.parent = &dev->pdev->dev;
1041         i2c->dev = dev;
1042         i2c_set_adapdata(&i2c->adapter, i2c);
1043         snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
1044                  "AST i2c bit bus");
1045         i2c->adapter.algo_data = &i2c->bit;
1046
1047         i2c->bit.udelay = 20;
1048         i2c->bit.timeout = 2;
1049         i2c->bit.data = i2c;
1050         i2c->bit.setsda = set_data;
1051         i2c->bit.setscl = set_clock;
1052         i2c->bit.getsda = get_data;
1053         i2c->bit.getscl = get_clock;
1054         ret = i2c_bit_add_bus(&i2c->adapter);
1055         if (ret) {
1056                 DRM_ERROR("Failed to register bit i2c\n");
1057                 goto out_free;
1058         }
1059
1060         return i2c;
1061 out_free:
1062         kfree(i2c);
1063         return NULL;
1064 }
1065
1066 static void ast_i2c_destroy(struct ast_i2c_chan *i2c)
1067 {
1068         if (!i2c)
1069                 return;
1070         i2c_del_adapter(&i2c->adapter);
1071         kfree(i2c);
1072 }
1073
1074 static u32 copy_cursor_image(u8 *src, u8 *dst, int width, int height)
1075 {
1076         union {
1077                 u32 ul;
1078                 u8 b[4];
1079         } srcdata32[2], data32;
1080         union {
1081                 u16 us;
1082                 u8 b[2];
1083         } data16;
1084         u32 csum = 0;
1085         s32 alpha_dst_delta, last_alpha_dst_delta;
1086         u8 *srcxor, *dstxor;
1087         int i, j;
1088         u32 per_pixel_copy, two_pixel_copy;
1089
1090         alpha_dst_delta = AST_MAX_HWC_WIDTH << 1;
1091         last_alpha_dst_delta = alpha_dst_delta - (width << 1);
1092
1093         srcxor = src;
1094         dstxor = (u8 *)dst + last_alpha_dst_delta + (AST_MAX_HWC_HEIGHT - height) * alpha_dst_delta;
1095         per_pixel_copy = width & 1;
1096         two_pixel_copy = width >> 1;
1097
1098         for (j = 0; j < height; j++) {
1099                 for (i = 0; i < two_pixel_copy; i++) {
1100                         srcdata32[0].ul = *((u32 *)srcxor) & 0xf0f0f0f0;
1101                         srcdata32[1].ul = *((u32 *)(srcxor + 4)) & 0xf0f0f0f0;
1102                         data32.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4);
1103                         data32.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4);
1104                         data32.b[2] = srcdata32[1].b[1] | (srcdata32[1].b[0] >> 4);
1105                         data32.b[3] = srcdata32[1].b[3] | (srcdata32[1].b[2] >> 4);
1106
1107                         writel(data32.ul, dstxor);
1108                         csum += data32.ul;
1109
1110                         dstxor += 4;
1111                         srcxor += 8;
1112
1113                 }
1114
1115                 for (i = 0; i < per_pixel_copy; i++) {
1116                         srcdata32[0].ul = *((u32 *)srcxor) & 0xf0f0f0f0;
1117                         data16.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4);
1118                         data16.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4);
1119                         writew(data16.us, dstxor);
1120                         csum += (u32)data16.us;
1121
1122                         dstxor += 2;
1123                         srcxor += 4;
1124                 }
1125                 dstxor += last_alpha_dst_delta;
1126         }
1127         return csum;
1128 }
1129
1130 static int ast_cursor_update(void *dst, void *src, unsigned int width,
1131                              unsigned int height)
1132 {
1133         u32 csum;
1134
1135         /* do data transfer to cursor cache */
1136         csum = copy_cursor_image(src, dst, width, height);
1137
1138         /* write checksum + signature */
1139         dst += AST_HWC_SIZE;
1140         writel(csum, dst);
1141         writel(width, dst + AST_HWC_SIGNATURE_SizeX);
1142         writel(height, dst + AST_HWC_SIGNATURE_SizeY);
1143         writel(0, dst + AST_HWC_SIGNATURE_HOTSPOTX);
1144         writel(0, dst + AST_HWC_SIGNATURE_HOTSPOTY);
1145
1146         return 0;
1147 }
1148
1149 static void ast_cursor_set_base(struct ast_private *ast, u64 address)
1150 {
1151         u8 addr0 = (address >> 3) & 0xff;
1152         u8 addr1 = (address >> 11) & 0xff;
1153         u8 addr2 = (address >> 19) & 0xff;
1154
1155         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc8, addr0);
1156         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc9, addr1);
1157         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xca, addr2);
1158 }
1159
1160 static int ast_show_cursor(struct drm_crtc *crtc, void *src,
1161                            unsigned int width, unsigned int height)
1162 {
1163         struct ast_private *ast = crtc->dev->dev_private;
1164         struct ast_crtc *ast_crtc = to_ast_crtc(crtc);
1165         struct drm_gem_vram_object *gbo;
1166         void *dst;
1167         s64 off;
1168         int ret;
1169         u8 jreg;
1170
1171         gbo = ast->cursor.gbo[ast->cursor.next_index];
1172         dst = drm_gem_vram_vmap(gbo);
1173         if (IS_ERR(dst))
1174                 return PTR_ERR(dst);
1175         off = drm_gem_vram_offset(gbo);
1176         if (off < 0) {
1177                 ret = (int)off;
1178                 goto err_drm_gem_vram_vunmap;
1179         }
1180
1181         ret = ast_cursor_update(dst, src, width, height);
1182         if (ret)
1183                 goto err_drm_gem_vram_vunmap;
1184         ast_cursor_set_base(ast, off);
1185
1186         ast_crtc->offset_x = AST_MAX_HWC_WIDTH - width;
1187         ast_crtc->offset_y = AST_MAX_HWC_WIDTH - height;
1188
1189         jreg = 0x2;
1190         /* enable ARGB cursor */
1191         jreg |= 1;
1192         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xcb, 0xfc, jreg);
1193
1194         ++ast->cursor.next_index;
1195         ast->cursor.next_index %= ARRAY_SIZE(ast->cursor.gbo);
1196
1197         drm_gem_vram_vunmap(gbo, dst);
1198
1199         return 0;
1200
1201 err_drm_gem_vram_vunmap:
1202         drm_gem_vram_vunmap(gbo, dst);
1203         return ret;
1204 }
1205
1206 static void ast_hide_cursor(struct drm_crtc *crtc)
1207 {
1208         struct ast_private *ast = crtc->dev->dev_private;
1209
1210         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xcb, 0xfc, 0x00);
1211 }
1212
1213 static int ast_cursor_set(struct drm_crtc *crtc,
1214                           struct drm_file *file_priv,
1215                           uint32_t handle,
1216                           uint32_t width,
1217                           uint32_t height)
1218 {
1219         struct drm_gem_object *obj;
1220         struct drm_gem_vram_object *gbo;
1221         u8 *src;
1222         int ret;
1223
1224         if (!handle) {
1225                 ast_hide_cursor(crtc);
1226                 return 0;
1227         }
1228
1229         if (width > AST_MAX_HWC_WIDTH || height > AST_MAX_HWC_HEIGHT)
1230                 return -EINVAL;
1231
1232         obj = drm_gem_object_lookup(file_priv, handle);
1233         if (!obj) {
1234                 DRM_ERROR("Cannot find cursor object %x for crtc\n", handle);
1235                 return -ENOENT;
1236         }
1237         gbo = drm_gem_vram_of_gem(obj);
1238         src = drm_gem_vram_vmap(gbo);
1239         if (IS_ERR(src)) {
1240                 ret = PTR_ERR(src);
1241                 goto err_drm_gem_object_put_unlocked;
1242         }
1243
1244         ret = ast_show_cursor(crtc, src, width, height);
1245         if (ret)
1246                 goto err_drm_gem_vram_vunmap;
1247
1248         drm_gem_vram_vunmap(gbo, src);
1249         drm_gem_object_put_unlocked(obj);
1250
1251         return 0;
1252
1253 err_drm_gem_vram_vunmap:
1254         drm_gem_vram_vunmap(gbo, src);
1255 err_drm_gem_object_put_unlocked:
1256         drm_gem_object_put_unlocked(obj);
1257         return ret;
1258 }
1259
1260 static int ast_cursor_move(struct drm_crtc *crtc,
1261                            int x, int y)
1262 {
1263         struct ast_crtc *ast_crtc = to_ast_crtc(crtc);
1264         struct ast_private *ast = crtc->dev->dev_private;
1265         struct drm_gem_vram_object *gbo;
1266         int x_offset, y_offset;
1267         u8 *dst, *sig;
1268         u8 jreg;
1269
1270         gbo = ast->cursor.gbo[ast->cursor.next_index];
1271         dst = drm_gem_vram_vmap(gbo);
1272         if (IS_ERR(dst))
1273                 return PTR_ERR(dst);
1274
1275         sig = dst + AST_HWC_SIZE;
1276         writel(x, sig + AST_HWC_SIGNATURE_X);
1277         writel(y, sig + AST_HWC_SIGNATURE_Y);
1278
1279         x_offset = ast_crtc->offset_x;
1280         y_offset = ast_crtc->offset_y;
1281         if (x < 0) {
1282                 x_offset = (-x) + ast_crtc->offset_x;
1283                 x = 0;
1284         }
1285
1286         if (y < 0) {
1287                 y_offset = (-y) + ast_crtc->offset_y;
1288                 y = 0;
1289         }
1290         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc2, x_offset);
1291         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc3, y_offset);
1292         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc4, (x & 0xff));
1293         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc5, ((x >> 8) & 0x0f));
1294         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc6, (y & 0xff));
1295         ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc7, ((y >> 8) & 0x07));
1296
1297         /* dummy write to fire HWC */
1298         jreg = 0x02 |
1299                0x01; /* enable ARGB4444 cursor */
1300         ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xcb, 0xfc, jreg);
1301
1302         drm_gem_vram_vunmap(gbo, dst);
1303
1304         return 0;
1305 }