Merge branch 'vendor/OPENSSL'
[dragonfly.git] / sys / dev / drm / i915 / intel_overlay.c
1 /*
2  * Copyright © 2009
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  * Authors:
24  *    Daniel Vetter <daniel@ffwll.ch>
25  *
26  * Derived from Xorg ddx, xf86-video-intel, src/i830_video.c
27  */
28 #include <drm/drmP.h>
29 #include <drm/i915_drm.h>
30 #include "i915_drv.h"
31 #include "i915_reg.h"
32 #include "intel_drv.h"
33
34 /* Limits for overlay size. According to intel doc, the real limits are:
35  * Y width: 4095, UV width (planar): 2047, Y height: 2047,
36  * UV width (planar): * 1023. But the xorg thinks 2048 for height and width. Use
37  * the mininum of both.  */
38 #define IMAGE_MAX_WIDTH         2048
39 #define IMAGE_MAX_HEIGHT        2046 /* 2 * 1023 */
40 /* on 830 and 845 these large limits result in the card hanging */
41 #define IMAGE_MAX_WIDTH_LEGACY  1024
42 #define IMAGE_MAX_HEIGHT_LEGACY 1088
43
44 /* overlay register definitions */
45 /* OCMD register */
46 #define OCMD_TILED_SURFACE      (0x1<<19)
47 #define OCMD_MIRROR_MASK        (0x3<<17)
48 #define OCMD_MIRROR_MODE        (0x3<<17)
49 #define OCMD_MIRROR_HORIZONTAL  (0x1<<17)
50 #define OCMD_MIRROR_VERTICAL    (0x2<<17)
51 #define OCMD_MIRROR_BOTH        (0x3<<17)
52 #define OCMD_BYTEORDER_MASK     (0x3<<14) /* zero for YUYV or FOURCC YUY2 */
53 #define OCMD_UV_SWAP            (0x1<<14) /* YVYU */
54 #define OCMD_Y_SWAP             (0x2<<14) /* UYVY or FOURCC UYVY */
55 #define OCMD_Y_AND_UV_SWAP      (0x3<<14) /* VYUY */
56 #define OCMD_SOURCE_FORMAT_MASK (0xf<<10)
57 #define OCMD_RGB_888            (0x1<<10) /* not in i965 Intel docs */
58 #define OCMD_RGB_555            (0x2<<10) /* not in i965 Intel docs */
59 #define OCMD_RGB_565            (0x3<<10) /* not in i965 Intel docs */
60 #define OCMD_YUV_422_PACKED     (0x8<<10)
61 #define OCMD_YUV_411_PACKED     (0x9<<10) /* not in i965 Intel docs */
62 #define OCMD_YUV_420_PLANAR     (0xc<<10)
63 #define OCMD_YUV_422_PLANAR     (0xd<<10)
64 #define OCMD_YUV_410_PLANAR     (0xe<<10) /* also 411 */
65 #define OCMD_TVSYNCFLIP_PARITY  (0x1<<9)
66 #define OCMD_TVSYNCFLIP_ENABLE  (0x1<<7)
67 #define OCMD_BUF_TYPE_MASK      (0x1<<5)
68 #define OCMD_BUF_TYPE_FRAME     (0x0<<5)
69 #define OCMD_BUF_TYPE_FIELD     (0x1<<5)
70 #define OCMD_TEST_MODE          (0x1<<4)
71 #define OCMD_BUFFER_SELECT      (0x3<<2)
72 #define OCMD_BUFFER0            (0x0<<2)
73 #define OCMD_BUFFER1            (0x1<<2)
74 #define OCMD_FIELD_SELECT       (0x1<<2)
75 #define OCMD_FIELD0             (0x0<<1)
76 #define OCMD_FIELD1             (0x1<<1)
77 #define OCMD_ENABLE             (0x1<<0)
78
79 /* OCONFIG register */
80 #define OCONF_PIPE_MASK         (0x1<<18)
81 #define OCONF_PIPE_A            (0x0<<18)
82 #define OCONF_PIPE_B            (0x1<<18)
83 #define OCONF_GAMMA2_ENABLE     (0x1<<16)
84 #define OCONF_CSC_MODE_BT601    (0x0<<5)
85 #define OCONF_CSC_MODE_BT709    (0x1<<5)
86 #define OCONF_CSC_BYPASS        (0x1<<4)
87 #define OCONF_CC_OUT_8BIT       (0x1<<3)
88 #define OCONF_TEST_MODE         (0x1<<2)
89 #define OCONF_THREE_LINE_BUFFER (0x1<<0)
90 #define OCONF_TWO_LINE_BUFFER   (0x0<<0)
91
92 /* DCLRKM (dst-key) register */
93 #define DST_KEY_ENABLE          (0x1<<31)
94 #define CLK_RGB24_MASK          0x0
95 #define CLK_RGB16_MASK          0x070307
96 #define CLK_RGB15_MASK          0x070707
97 #define CLK_RGB8I_MASK          0xffffff
98
99 #define RGB16_TO_COLORKEY(c) \
100         (((c & 0xF800) << 8) | ((c & 0x07E0) << 5) | ((c & 0x001F) << 3))
101 #define RGB15_TO_COLORKEY(c) \
102         (((c & 0x7c00) << 9) | ((c & 0x03E0) << 6) | ((c & 0x001F) << 3))
103
104 /* overlay flip addr flag */
105 #define OFC_UPDATE              0x1
106
107 /* polyphase filter coefficients */
108 #define N_HORIZ_Y_TAPS          5
109 #define N_VERT_Y_TAPS           3
110 #define N_HORIZ_UV_TAPS         3
111 #define N_VERT_UV_TAPS          3
112 #define N_PHASES                17
113 #define MAX_TAPS                5
114
115 /* memory bufferd overlay registers */
116 struct overlay_registers {
117         u32 OBUF_0Y;
118         u32 OBUF_1Y;
119         u32 OBUF_0U;
120         u32 OBUF_0V;
121         u32 OBUF_1U;
122         u32 OBUF_1V;
123         u32 OSTRIDE;
124         u32 YRGB_VPH;
125         u32 UV_VPH;
126         u32 HORZ_PH;
127         u32 INIT_PHS;
128         u32 DWINPOS;
129         u32 DWINSZ;
130         u32 SWIDTH;
131         u32 SWIDTHSW;
132         u32 SHEIGHT;
133         u32 YRGBSCALE;
134         u32 UVSCALE;
135         u32 OCLRC0;
136         u32 OCLRC1;
137         u32 DCLRKV;
138         u32 DCLRKM;
139         u32 SCLRKVH;
140         u32 SCLRKVL;
141         u32 SCLRKEN;
142         u32 OCONFIG;
143         u32 OCMD;
144         u32 RESERVED1; /* 0x6C */
145         u32 OSTART_0Y;
146         u32 OSTART_1Y;
147         u32 OSTART_0U;
148         u32 OSTART_0V;
149         u32 OSTART_1U;
150         u32 OSTART_1V;
151         u32 OTILEOFF_0Y;
152         u32 OTILEOFF_1Y;
153         u32 OTILEOFF_0U;
154         u32 OTILEOFF_0V;
155         u32 OTILEOFF_1U;
156         u32 OTILEOFF_1V;
157         u32 FASTHSCALE; /* 0xA0 */
158         u32 UVSCALEV; /* 0xA4 */
159         u32 RESERVEDC[(0x200 - 0xA8) / 4]; /* 0xA8 - 0x1FC */
160         u16 Y_VCOEFS[N_VERT_Y_TAPS * N_PHASES]; /* 0x200 */
161         u16 RESERVEDD[0x100 / 2 - N_VERT_Y_TAPS * N_PHASES];
162         u16 Y_HCOEFS[N_HORIZ_Y_TAPS * N_PHASES]; /* 0x300 */
163         u16 RESERVEDE[0x200 / 2 - N_HORIZ_Y_TAPS * N_PHASES];
164         u16 UV_VCOEFS[N_VERT_UV_TAPS * N_PHASES]; /* 0x500 */
165         u16 RESERVEDF[0x100 / 2 - N_VERT_UV_TAPS * N_PHASES];
166         u16 UV_HCOEFS[N_HORIZ_UV_TAPS * N_PHASES]; /* 0x600 */
167         u16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES];
168 };
169
170 struct intel_overlay {
171         struct drm_device *dev;
172         struct intel_crtc *crtc;
173         struct drm_i915_gem_object *vid_bo;
174         struct drm_i915_gem_object *old_vid_bo;
175         bool active;
176         bool pfit_active;
177         u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
178         u32 color_key:24;
179         u32 color_key_enabled:1;
180         u32 brightness, contrast, saturation;
181         u32 old_xscale, old_yscale;
182         /* register access */
183         u32 flip_addr;
184         struct drm_i915_gem_object *reg_bo;
185         /* flip handling */
186         struct drm_i915_gem_request *last_flip_req;
187         void (*flip_tail)(struct intel_overlay *);
188 };
189
190 static struct overlay_registers __iomem *
191 intel_overlay_map_regs(struct intel_overlay *overlay)
192 {
193         struct drm_i915_private *dev_priv = overlay->dev->dev_private;
194         struct overlay_registers __iomem *regs;
195
196         if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
197                 regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->vaddr;
198         else
199                 regs = io_mapping_map_wc(dev_priv->gtt.mappable,
200                                          i915_gem_obj_ggtt_offset(overlay->reg_bo));
201
202         return regs;
203 }
204
205 static void intel_overlay_unmap_regs(struct intel_overlay *overlay,
206                                      struct overlay_registers __iomem *regs)
207 {
208         if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev))
209                 pmap_unmapdev((vm_offset_t)regs, PAGE_SIZE);
210 }
211
212 static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
213                                          void (*tail)(struct intel_overlay *))
214 {
215         struct drm_device *dev = overlay->dev;
216         struct drm_i915_private *dev_priv = dev->dev_private;
217         struct intel_engine_cs *ring = &dev_priv->ring[RCS];
218         int ret;
219
220         WARN_ON(overlay->last_flip_req);
221         i915_gem_request_assign(&overlay->last_flip_req,
222                                              ring->outstanding_lazy_request);
223         ret = i915_add_request(ring);
224         if (ret)
225                 return ret;
226
227         overlay->flip_tail = tail;
228         ret = i915_wait_request(overlay->last_flip_req);
229         if (ret)
230                 return ret;
231
232         i915_gem_request_assign(&overlay->last_flip_req, NULL);
233         return 0;
234 }
235
236 /* overlay needs to be disable in OCMD reg */
237 static int intel_overlay_on(struct intel_overlay *overlay)
238 {
239         struct drm_device *dev = overlay->dev;
240         struct drm_i915_private *dev_priv = dev->dev_private;
241         struct intel_engine_cs *ring = &dev_priv->ring[RCS];
242         int ret;
243
244         WARN_ON(overlay->active);
245         WARN_ON(IS_I830(dev) && !(dev_priv->quirks & QUIRK_PIPEA_FORCE));
246
247         ret = intel_ring_begin(ring, 4);
248         if (ret)
249                 return ret;
250
251         overlay->active = true;
252
253         intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_ON);
254         intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE);
255         intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
256         intel_ring_emit(ring, MI_NOOP);
257         intel_ring_advance(ring);
258
259         return intel_overlay_do_wait_request(overlay, NULL);
260 }
261
262 /* overlay needs to be enabled in OCMD reg */
263 static int intel_overlay_continue(struct intel_overlay *overlay,
264                                   bool load_polyphase_filter)
265 {
266         struct drm_device *dev = overlay->dev;
267         struct drm_i915_private *dev_priv = dev->dev_private;
268         struct intel_engine_cs *ring = &dev_priv->ring[RCS];
269         u32 flip_addr = overlay->flip_addr;
270         u32 tmp;
271         int ret;
272
273         WARN_ON(!overlay->active);
274
275         if (load_polyphase_filter)
276                 flip_addr |= OFC_UPDATE;
277
278         /* check for underruns */
279         tmp = I915_READ(DOVSTA);
280         if (tmp & (1 << 17))
281                 DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp);
282
283         ret = intel_ring_begin(ring, 2);
284         if (ret)
285                 return ret;
286
287         intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
288         intel_ring_emit(ring, flip_addr);
289         intel_ring_advance(ring);
290
291         WARN_ON(overlay->last_flip_req);
292         i915_gem_request_assign(&overlay->last_flip_req,
293                                              ring->outstanding_lazy_request);
294         return i915_add_request(ring);
295 }
296
297 static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay)
298 {
299         struct drm_i915_gem_object *obj = overlay->old_vid_bo;
300
301         i915_gem_object_ggtt_unpin(obj);
302         drm_gem_object_unreference(&obj->base);
303
304         overlay->old_vid_bo = NULL;
305 }
306
307 static void intel_overlay_off_tail(struct intel_overlay *overlay)
308 {
309         struct drm_i915_gem_object *obj = overlay->vid_bo;
310
311         /* never have the overlay hw on without showing a frame */
312         if (WARN_ON(!obj))
313                 return;
314
315         i915_gem_object_ggtt_unpin(obj);
316         drm_gem_object_unreference(&obj->base);
317         overlay->vid_bo = NULL;
318
319         overlay->crtc->overlay = NULL;
320         overlay->crtc = NULL;
321         overlay->active = false;
322 }
323
324 /* overlay needs to be disabled in OCMD reg */
325 static int intel_overlay_off(struct intel_overlay *overlay)
326 {
327         struct drm_device *dev = overlay->dev;
328         struct drm_i915_private *dev_priv = dev->dev_private;
329         struct intel_engine_cs *ring = &dev_priv->ring[RCS];
330         u32 flip_addr = overlay->flip_addr;
331         int ret;
332
333         WARN_ON(!overlay->active);
334
335         /* According to intel docs the overlay hw may hang (when switching
336          * off) without loading the filter coeffs. It is however unclear whether
337          * this applies to the disabling of the overlay or to the switching off
338          * of the hw. Do it in both cases */
339         flip_addr |= OFC_UPDATE;
340
341         ret = intel_ring_begin(ring, 6);
342         if (ret)
343                 return ret;
344
345         /* wait for overlay to go idle */
346         intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
347         intel_ring_emit(ring, flip_addr);
348         intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
349         /* turn overlay off */
350         if (IS_I830(dev)) {
351                 /* Workaround: Don't disable the overlay fully, since otherwise
352                  * it dies on the next OVERLAY_ON cmd. */
353                 intel_ring_emit(ring, MI_NOOP);
354                 intel_ring_emit(ring, MI_NOOP);
355                 intel_ring_emit(ring, MI_NOOP);
356         } else {
357                 intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
358                 intel_ring_emit(ring, flip_addr);
359                 intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
360         }
361         intel_ring_advance(ring);
362
363         return intel_overlay_do_wait_request(overlay, intel_overlay_off_tail);
364 }
365
366 /* recover from an interruption due to a signal
367  * We have to be careful not to repeat work forever an make forward progess. */
368 static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
369 {
370         int ret;
371
372         if (overlay->last_flip_req == NULL)
373                 return 0;
374
375         ret = i915_wait_request(overlay->last_flip_req);
376         if (ret)
377                 return ret;
378
379         if (overlay->flip_tail)
380                 overlay->flip_tail(overlay);
381
382         i915_gem_request_assign(&overlay->last_flip_req, NULL);
383         return 0;
384 }
385
386 /* Wait for pending overlay flip and release old frame.
387  * Needs to be called before the overlay register are changed
388  * via intel_overlay_(un)map_regs
389  */
390 static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
391 {
392         struct drm_device *dev = overlay->dev;
393         struct drm_i915_private *dev_priv = dev->dev_private;
394         struct intel_engine_cs *ring = &dev_priv->ring[RCS];
395         int ret;
396
397         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
398
399         /* Only wait if there is actually an old frame to release to
400          * guarantee forward progress.
401          */
402         if (!overlay->old_vid_bo)
403                 return 0;
404
405         if (I915_READ(ISR) & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT) {
406                 /* synchronous slowpath */
407                 ret = intel_ring_begin(ring, 2);
408                 if (ret)
409                         return ret;
410
411                 intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
412                 intel_ring_emit(ring, MI_NOOP);
413                 intel_ring_advance(ring);
414
415                 ret = intel_overlay_do_wait_request(overlay,
416                                                     intel_overlay_release_old_vid_tail);
417                 if (ret)
418                         return ret;
419         }
420
421         intel_overlay_release_old_vid_tail(overlay);
422
423
424         i915_gem_track_fb(overlay->old_vid_bo, NULL,
425                           INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
426         return 0;
427 }
428
429 void intel_overlay_reset(struct drm_i915_private *dev_priv)
430 {
431         struct intel_overlay *overlay = dev_priv->overlay;
432
433         if (!overlay)
434                 return;
435
436         intel_overlay_release_old_vid(overlay);
437
438         overlay->last_flip_req = NULL;
439         overlay->old_xscale = 0;
440         overlay->old_yscale = 0;
441         overlay->crtc = NULL;
442         overlay->active = false;
443 }
444
445 struct put_image_params {
446         int format;
447         short dst_x;
448         short dst_y;
449         short dst_w;
450         short dst_h;
451         short src_w;
452         short src_scan_h;
453         short src_scan_w;
454         short src_h;
455         short stride_Y;
456         short stride_UV;
457         int offset_Y;
458         int offset_U;
459         int offset_V;
460 };
461
462 static int packed_depth_bytes(u32 format)
463 {
464         switch (format & I915_OVERLAY_DEPTH_MASK) {
465         case I915_OVERLAY_YUV422:
466                 return 4;
467         case I915_OVERLAY_YUV411:
468                 /* return 6; not implemented */
469         default:
470                 return -EINVAL;
471         }
472 }
473
474 static int packed_width_bytes(u32 format, short width)
475 {
476         switch (format & I915_OVERLAY_DEPTH_MASK) {
477         case I915_OVERLAY_YUV422:
478                 return width << 1;
479         default:
480                 return -EINVAL;
481         }
482 }
483
484 static int uv_hsubsampling(u32 format)
485 {
486         switch (format & I915_OVERLAY_DEPTH_MASK) {
487         case I915_OVERLAY_YUV422:
488         case I915_OVERLAY_YUV420:
489                 return 2;
490         case I915_OVERLAY_YUV411:
491         case I915_OVERLAY_YUV410:
492                 return 4;
493         default:
494                 return -EINVAL;
495         }
496 }
497
498 static int uv_vsubsampling(u32 format)
499 {
500         switch (format & I915_OVERLAY_DEPTH_MASK) {
501         case I915_OVERLAY_YUV420:
502         case I915_OVERLAY_YUV410:
503                 return 2;
504         case I915_OVERLAY_YUV422:
505         case I915_OVERLAY_YUV411:
506                 return 1;
507         default:
508                 return -EINVAL;
509         }
510 }
511
512 static u32 calc_swidthsw(struct drm_device *dev, u32 offset, u32 width)
513 {
514         u32 mask, shift, ret;
515         if (IS_GEN2(dev)) {
516                 mask = 0x1f;
517                 shift = 5;
518         } else {
519                 mask = 0x3f;
520                 shift = 6;
521         }
522         ret = ((offset + width + mask) >> shift) - (offset >> shift);
523         if (!IS_GEN2(dev))
524                 ret <<= 1;
525         ret -= 1;
526         return ret << 2;
527 }
528
529 static const u16 y_static_hcoeffs[N_HORIZ_Y_TAPS * N_PHASES] = {
530         0x3000, 0xb4a0, 0x1930, 0x1920, 0xb4a0,
531         0x3000, 0xb500, 0x19d0, 0x1880, 0xb440,
532         0x3000, 0xb540, 0x1a88, 0x2f80, 0xb3e0,
533         0x3000, 0xb580, 0x1b30, 0x2e20, 0xb380,
534         0x3000, 0xb5c0, 0x1bd8, 0x2cc0, 0xb320,
535         0x3020, 0xb5e0, 0x1c60, 0x2b80, 0xb2c0,
536         0x3020, 0xb5e0, 0x1cf8, 0x2a20, 0xb260,
537         0x3020, 0xb5e0, 0x1d80, 0x28e0, 0xb200,
538         0x3020, 0xb5c0, 0x1e08, 0x3f40, 0xb1c0,
539         0x3020, 0xb580, 0x1e78, 0x3ce0, 0xb160,
540         0x3040, 0xb520, 0x1ed8, 0x3aa0, 0xb120,
541         0x3040, 0xb4a0, 0x1f30, 0x3880, 0xb0e0,
542         0x3040, 0xb400, 0x1f78, 0x3680, 0xb0a0,
543         0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060,
544         0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040,
545         0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020,
546         0xb000, 0x3000, 0x0800, 0x3000, 0xb000
547 };
548
549 static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = {
550         0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60,
551         0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40,
552         0xb040, 0x1b20, 0x29e0, 0xb060, 0x1bd8, 0x2880,
553         0xb080, 0x1c88, 0x3e60, 0xb0a0, 0x1d28, 0x3c00,
554         0xb0c0, 0x1db8, 0x39e0, 0xb0e0, 0x1e40, 0x37e0,
555         0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0,
556         0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240,
557         0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0,
558         0x3000, 0x0800, 0x3000
559 };
560
561 static void update_polyphase_filter(struct overlay_registers __iomem *regs)
562 {
563         memcpy_toio(regs->Y_HCOEFS, y_static_hcoeffs, sizeof(y_static_hcoeffs));
564         memcpy_toio(regs->UV_HCOEFS, uv_static_hcoeffs,
565                     sizeof(uv_static_hcoeffs));
566 }
567
568 static bool update_scaling_factors(struct intel_overlay *overlay,
569                                    struct overlay_registers __iomem *regs,
570                                    struct put_image_params *params)
571 {
572         /* fixed point with a 12 bit shift */
573         u32 xscale, yscale, xscale_UV, yscale_UV;
574 #define FP_SHIFT 12
575 #define FRACT_MASK 0xfff
576         bool scale_changed = false;
577         int uv_hscale = uv_hsubsampling(params->format);
578         int uv_vscale = uv_vsubsampling(params->format);
579
580         if (params->dst_w > 1)
581                 xscale = ((params->src_scan_w - 1) << FP_SHIFT)
582                         /(params->dst_w);
583         else
584                 xscale = 1 << FP_SHIFT;
585
586         if (params->dst_h > 1)
587                 yscale = ((params->src_scan_h - 1) << FP_SHIFT)
588                         /(params->dst_h);
589         else
590                 yscale = 1 << FP_SHIFT;
591
592         /*if (params->format & I915_OVERLAY_YUV_PLANAR) {*/
593         xscale_UV = xscale/uv_hscale;
594         yscale_UV = yscale/uv_vscale;
595         /* make the Y scale to UV scale ratio an exact multiply */
596         xscale = xscale_UV * uv_hscale;
597         yscale = yscale_UV * uv_vscale;
598         /*} else {
599           xscale_UV = 0;
600           yscale_UV = 0;
601           }*/
602
603         if (xscale != overlay->old_xscale || yscale != overlay->old_yscale)
604                 scale_changed = true;
605         overlay->old_xscale = xscale;
606         overlay->old_yscale = yscale;
607
608         iowrite32(((yscale & FRACT_MASK) << 20) |
609                   ((xscale >> FP_SHIFT)  << 16) |
610                   ((xscale & FRACT_MASK) << 3),
611                  &regs->YRGBSCALE);
612
613         iowrite32(((yscale_UV & FRACT_MASK) << 20) |
614                   ((xscale_UV >> FP_SHIFT)  << 16) |
615                   ((xscale_UV & FRACT_MASK) << 3),
616                  &regs->UVSCALE);
617
618         iowrite32((((yscale    >> FP_SHIFT) << 16) |
619                    ((yscale_UV >> FP_SHIFT) << 0)),
620                  &regs->UVSCALEV);
621
622         if (scale_changed)
623                 update_polyphase_filter(regs);
624
625         return scale_changed;
626 }
627
628 static void update_colorkey(struct intel_overlay *overlay,
629                             struct overlay_registers __iomem *regs)
630 {
631         u32 key = overlay->color_key;
632         u32 flags;
633
634         flags = 0;
635         if (overlay->color_key_enabled)
636                 flags |= DST_KEY_ENABLE;
637
638         switch (overlay->crtc->base.primary->fb->bits_per_pixel) {
639         case 8:
640                 key = 0;
641                 flags |= CLK_RGB8I_MASK;
642                 break;
643
644         case 16:
645                 if (overlay->crtc->base.primary->fb->depth == 15) {
646                         key = RGB15_TO_COLORKEY(key);
647                         flags |= CLK_RGB15_MASK;
648                 } else {
649                         key = RGB16_TO_COLORKEY(key);
650                         flags |= CLK_RGB16_MASK;
651                 }
652                 break;
653
654         case 24:
655         case 32:
656                 flags |= CLK_RGB24_MASK;
657                 break;
658         }
659
660         iowrite32(key, &regs->DCLRKV);
661         iowrite32(flags, &regs->DCLRKM);
662 }
663
664 static u32 overlay_cmd_reg(struct put_image_params *params)
665 {
666         u32 cmd = OCMD_ENABLE | OCMD_BUF_TYPE_FRAME | OCMD_BUFFER0;
667
668         if (params->format & I915_OVERLAY_YUV_PLANAR) {
669                 switch (params->format & I915_OVERLAY_DEPTH_MASK) {
670                 case I915_OVERLAY_YUV422:
671                         cmd |= OCMD_YUV_422_PLANAR;
672                         break;
673                 case I915_OVERLAY_YUV420:
674                         cmd |= OCMD_YUV_420_PLANAR;
675                         break;
676                 case I915_OVERLAY_YUV411:
677                 case I915_OVERLAY_YUV410:
678                         cmd |= OCMD_YUV_410_PLANAR;
679                         break;
680                 }
681         } else { /* YUV packed */
682                 switch (params->format & I915_OVERLAY_DEPTH_MASK) {
683                 case I915_OVERLAY_YUV422:
684                         cmd |= OCMD_YUV_422_PACKED;
685                         break;
686                 case I915_OVERLAY_YUV411:
687                         cmd |= OCMD_YUV_411_PACKED;
688                         break;
689                 }
690
691                 switch (params->format & I915_OVERLAY_SWAP_MASK) {
692                 case I915_OVERLAY_NO_SWAP:
693                         break;
694                 case I915_OVERLAY_UV_SWAP:
695                         cmd |= OCMD_UV_SWAP;
696                         break;
697                 case I915_OVERLAY_Y_SWAP:
698                         cmd |= OCMD_Y_SWAP;
699                         break;
700                 case I915_OVERLAY_Y_AND_UV_SWAP:
701                         cmd |= OCMD_Y_AND_UV_SWAP;
702                         break;
703                 }
704         }
705
706         return cmd;
707 }
708
709 static int intel_overlay_do_put_image(struct intel_overlay *overlay,
710                                       struct drm_i915_gem_object *new_bo,
711                                       struct put_image_params *params)
712 {
713         int ret, tmp_width;
714         struct overlay_registers __iomem *regs;
715         bool scale_changed = false;
716         struct drm_device *dev = overlay->dev;
717         u32 swidth, swidthsw, sheight, ostride;
718         enum i915_pipe pipe = overlay->crtc->pipe;
719
720         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
721         WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
722
723         ret = intel_overlay_release_old_vid(overlay);
724         if (ret != 0)
725                 return ret;
726
727         ret = i915_gem_object_pin_to_display_plane(new_bo, 0, NULL,
728                                                    &i915_ggtt_view_normal);
729         if (ret != 0)
730                 return ret;
731
732         ret = i915_gem_object_put_fence(new_bo);
733         if (ret)
734                 goto out_unpin;
735
736         if (!overlay->active) {
737                 u32 oconfig;
738                 regs = intel_overlay_map_regs(overlay);
739                 if (!regs) {
740                         ret = -ENOMEM;
741                         goto out_unpin;
742                 }
743                 oconfig = OCONF_CC_OUT_8BIT;
744                 if (IS_GEN4(overlay->dev))
745                         oconfig |= OCONF_CSC_MODE_BT709;
746                 oconfig |= pipe == 0 ?
747                         OCONF_PIPE_A : OCONF_PIPE_B;
748                 iowrite32(oconfig, &regs->OCONFIG);
749                 intel_overlay_unmap_regs(overlay, regs);
750
751                 ret = intel_overlay_on(overlay);
752                 if (ret != 0)
753                         goto out_unpin;
754         }
755
756         regs = intel_overlay_map_regs(overlay);
757         if (!regs) {
758                 ret = -ENOMEM;
759                 goto out_unpin;
760         }
761
762         iowrite32((params->dst_y << 16) | params->dst_x, &regs->DWINPOS);
763         iowrite32((params->dst_h << 16) | params->dst_w, &regs->DWINSZ);
764
765         if (params->format & I915_OVERLAY_YUV_PACKED)
766                 tmp_width = packed_width_bytes(params->format, params->src_w);
767         else
768                 tmp_width = params->src_w;
769
770         swidth = params->src_w;
771         swidthsw = calc_swidthsw(overlay->dev, params->offset_Y, tmp_width);
772         sheight = params->src_h;
773         iowrite32(i915_gem_obj_ggtt_offset(new_bo) + params->offset_Y, &regs->OBUF_0Y);
774         ostride = params->stride_Y;
775
776         if (params->format & I915_OVERLAY_YUV_PLANAR) {
777                 int uv_hscale = uv_hsubsampling(params->format);
778                 int uv_vscale = uv_vsubsampling(params->format);
779                 u32 tmp_U, tmp_V;
780                 swidth |= (params->src_w/uv_hscale) << 16;
781                 tmp_U = calc_swidthsw(overlay->dev, params->offset_U,
782                                       params->src_w/uv_hscale);
783                 tmp_V = calc_swidthsw(overlay->dev, params->offset_V,
784                                       params->src_w/uv_hscale);
785                 swidthsw |= max_t(u32, tmp_U, tmp_V) << 16;
786                 sheight |= (params->src_h/uv_vscale) << 16;
787                 iowrite32(i915_gem_obj_ggtt_offset(new_bo) + params->offset_U, &regs->OBUF_0U);
788                 iowrite32(i915_gem_obj_ggtt_offset(new_bo) + params->offset_V, &regs->OBUF_0V);
789                 ostride |= params->stride_UV << 16;
790         }
791
792         iowrite32(swidth, &regs->SWIDTH);
793         iowrite32(swidthsw, &regs->SWIDTHSW);
794         iowrite32(sheight, &regs->SHEIGHT);
795         iowrite32(ostride, &regs->OSTRIDE);
796
797         scale_changed = update_scaling_factors(overlay, regs, params);
798
799         update_colorkey(overlay, regs);
800
801         iowrite32(overlay_cmd_reg(params), &regs->OCMD);
802
803         intel_overlay_unmap_regs(overlay, regs);
804
805         ret = intel_overlay_continue(overlay, scale_changed);
806         if (ret)
807                 goto out_unpin;
808
809         i915_gem_track_fb(overlay->vid_bo, new_bo,
810                           INTEL_FRONTBUFFER_OVERLAY(pipe));
811
812         overlay->old_vid_bo = overlay->vid_bo;
813         overlay->vid_bo = new_bo;
814
815         intel_frontbuffer_flip(dev,
816                                INTEL_FRONTBUFFER_OVERLAY(pipe));
817
818         return 0;
819
820 out_unpin:
821         i915_gem_object_ggtt_unpin(new_bo);
822         return ret;
823 }
824
825 int intel_overlay_switch_off(struct intel_overlay *overlay)
826 {
827         struct overlay_registers __iomem *regs;
828         struct drm_device *dev = overlay->dev;
829         int ret;
830
831         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
832         WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
833
834         ret = intel_overlay_recover_from_interrupt(overlay);
835         if (ret != 0)
836                 return ret;
837
838         if (!overlay->active)
839                 return 0;
840
841         ret = intel_overlay_release_old_vid(overlay);
842         if (ret != 0)
843                 return ret;
844
845         regs = intel_overlay_map_regs(overlay);
846         iowrite32(0, &regs->OCMD);
847         intel_overlay_unmap_regs(overlay, regs);
848
849         ret = intel_overlay_off(overlay);
850         if (ret != 0)
851                 return ret;
852
853         intel_overlay_off_tail(overlay);
854         return 0;
855 }
856
857 static int check_overlay_possible_on_crtc(struct intel_overlay *overlay,
858                                           struct intel_crtc *crtc)
859 {
860         if (!crtc->active)
861                 return -EINVAL;
862
863         /* can't use the overlay with double wide pipe */
864         if (crtc->config->double_wide)
865                 return -EINVAL;
866
867         return 0;
868 }
869
870 static void update_pfit_vscale_ratio(struct intel_overlay *overlay)
871 {
872         struct drm_device *dev = overlay->dev;
873         struct drm_i915_private *dev_priv = dev->dev_private;
874         u32 pfit_control = I915_READ(PFIT_CONTROL);
875         u32 ratio;
876
877         /* XXX: This is not the same logic as in the xorg driver, but more in
878          * line with the intel documentation for the i965
879          */
880         if (INTEL_INFO(dev)->gen >= 4) {
881                 /* on i965 use the PGM reg to read out the autoscaler values */
882                 ratio = I915_READ(PFIT_PGM_RATIOS) >> PFIT_VERT_SCALE_SHIFT_965;
883         } else {
884                 if (pfit_control & VERT_AUTO_SCALE)
885                         ratio = I915_READ(PFIT_AUTO_RATIOS);
886                 else
887                         ratio = I915_READ(PFIT_PGM_RATIOS);
888                 ratio >>= PFIT_VERT_SCALE_SHIFT;
889         }
890
891         overlay->pfit_vscale_ratio = ratio;
892 }
893
894 static int check_overlay_dst(struct intel_overlay *overlay,
895                              struct drm_intel_overlay_put_image *rec)
896 {
897         struct drm_display_mode *mode = &overlay->crtc->base.mode;
898
899         if (rec->dst_x < mode->hdisplay &&
900             rec->dst_x + rec->dst_width <= mode->hdisplay &&
901             rec->dst_y < mode->vdisplay &&
902             rec->dst_y + rec->dst_height <= mode->vdisplay)
903                 return 0;
904         else
905                 return -EINVAL;
906 }
907
908 static int check_overlay_scaling(struct put_image_params *rec)
909 {
910         u32 tmp;
911
912         /* downscaling limit is 8.0 */
913         tmp = ((rec->src_scan_h << 16) / rec->dst_h) >> 16;
914         if (tmp > 7)
915                 return -EINVAL;
916         tmp = ((rec->src_scan_w << 16) / rec->dst_w) >> 16;
917         if (tmp > 7)
918                 return -EINVAL;
919
920         return 0;
921 }
922
923 static int check_overlay_src(struct drm_device *dev,
924                              struct drm_intel_overlay_put_image *rec,
925                              struct drm_i915_gem_object *new_bo)
926 {
927         int uv_hscale = uv_hsubsampling(rec->flags);
928         int uv_vscale = uv_vsubsampling(rec->flags);
929         u32 stride_mask;
930         int depth;
931         u32 tmp;
932
933         /* check src dimensions */
934         if (IS_845G(dev) || IS_I830(dev)) {
935                 if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY ||
936                     rec->src_width  > IMAGE_MAX_WIDTH_LEGACY)
937                         return -EINVAL;
938         } else {
939                 if (rec->src_height > IMAGE_MAX_HEIGHT ||
940                     rec->src_width  > IMAGE_MAX_WIDTH)
941                         return -EINVAL;
942         }
943
944         /* better safe than sorry, use 4 as the maximal subsampling ratio */
945         if (rec->src_height < N_VERT_Y_TAPS*4 ||
946             rec->src_width  < N_HORIZ_Y_TAPS*4)
947                 return -EINVAL;
948
949         /* check alignment constraints */
950         switch (rec->flags & I915_OVERLAY_TYPE_MASK) {
951         case I915_OVERLAY_RGB:
952                 /* not implemented */
953                 return -EINVAL;
954
955         case I915_OVERLAY_YUV_PACKED:
956                 if (uv_vscale != 1)
957                         return -EINVAL;
958
959                 depth = packed_depth_bytes(rec->flags);
960                 if (depth < 0)
961                         return depth;
962
963                 /* ignore UV planes */
964                 rec->stride_UV = 0;
965                 rec->offset_U = 0;
966                 rec->offset_V = 0;
967                 /* check pixel alignment */
968                 if (rec->offset_Y % depth)
969                         return -EINVAL;
970                 break;
971
972         case I915_OVERLAY_YUV_PLANAR:
973                 if (uv_vscale < 0 || uv_hscale < 0)
974                         return -EINVAL;
975                 /* no offset restrictions for planar formats */
976                 break;
977
978         default:
979                 return -EINVAL;
980         }
981
982         if (rec->src_width % uv_hscale)
983                 return -EINVAL;
984
985         /* stride checking */
986         if (IS_I830(dev) || IS_845G(dev))
987                 stride_mask = 255;
988         else
989                 stride_mask = 63;
990
991         if (rec->stride_Y & stride_mask || rec->stride_UV & stride_mask)
992                 return -EINVAL;
993         if (IS_GEN4(dev) && rec->stride_Y < 512)
994                 return -EINVAL;
995
996         tmp = (rec->flags & I915_OVERLAY_TYPE_MASK) == I915_OVERLAY_YUV_PLANAR ?
997                 4096 : 8192;
998         if (rec->stride_Y > tmp || rec->stride_UV > 2*1024)
999                 return -EINVAL;
1000
1001         /* check buffer dimensions */
1002         switch (rec->flags & I915_OVERLAY_TYPE_MASK) {
1003         case I915_OVERLAY_RGB:
1004         case I915_OVERLAY_YUV_PACKED:
1005                 /* always 4 Y values per depth pixels */
1006                 if (packed_width_bytes(rec->flags, rec->src_width) > rec->stride_Y)
1007                         return -EINVAL;
1008
1009                 tmp = rec->stride_Y*rec->src_height;
1010                 if (rec->offset_Y + tmp > new_bo->base.size)
1011                         return -EINVAL;
1012                 break;
1013
1014         case I915_OVERLAY_YUV_PLANAR:
1015                 if (rec->src_width > rec->stride_Y)
1016                         return -EINVAL;
1017                 if (rec->src_width/uv_hscale > rec->stride_UV)
1018                         return -EINVAL;
1019
1020                 tmp = rec->stride_Y * rec->src_height;
1021                 if (rec->offset_Y + tmp > new_bo->base.size)
1022                         return -EINVAL;
1023
1024                 tmp = rec->stride_UV * (rec->src_height / uv_vscale);
1025                 if (rec->offset_U + tmp > new_bo->base.size ||
1026                     rec->offset_V + tmp > new_bo->base.size)
1027                         return -EINVAL;
1028                 break;
1029         }
1030
1031         return 0;
1032 }
1033
1034 /**
1035  * Return the pipe currently connected to the panel fitter,
1036  * or -1 if the panel fitter is not present or not in use
1037  */
1038 static int intel_panel_fitter_pipe(struct drm_device *dev)
1039 {
1040         struct drm_i915_private *dev_priv = dev->dev_private;
1041         u32  pfit_control;
1042
1043         /* i830 doesn't have a panel fitter */
1044         if (INTEL_INFO(dev)->gen <= 3 && (IS_I830(dev) || !IS_MOBILE(dev)))
1045                 return -1;
1046
1047         pfit_control = I915_READ(PFIT_CONTROL);
1048
1049         /* See if the panel fitter is in use */
1050         if ((pfit_control & PFIT_ENABLE) == 0)
1051                 return -1;
1052
1053         /* 965 can place panel fitter on either pipe */
1054         if (IS_GEN4(dev))
1055                 return (pfit_control >> 29) & 0x3;
1056
1057         /* older chips can only use pipe 1 */
1058         return 1;
1059 }
1060
1061 int intel_overlay_put_image(struct drm_device *dev, void *data,
1062                             struct drm_file *file_priv)
1063 {
1064         struct drm_intel_overlay_put_image *put_image_rec = data;
1065         struct drm_i915_private *dev_priv = dev->dev_private;
1066         struct intel_overlay *overlay;
1067         struct drm_crtc *drmmode_crtc;
1068         struct intel_crtc *crtc;
1069         struct drm_i915_gem_object *new_bo;
1070         struct put_image_params *params;
1071         int ret;
1072
1073         overlay = dev_priv->overlay;
1074         if (!overlay) {
1075                 DRM_DEBUG("userspace bug: no overlay\n");
1076                 return -ENODEV;
1077         }
1078
1079         if (!(put_image_rec->flags & I915_OVERLAY_ENABLE)) {
1080                 drm_modeset_lock_all(dev);
1081                 mutex_lock(&dev->struct_mutex);
1082
1083                 ret = intel_overlay_switch_off(overlay);
1084
1085                 mutex_unlock(&dev->struct_mutex);
1086                 drm_modeset_unlock_all(dev);
1087
1088                 return ret;
1089         }
1090
1091         params = kmalloc(sizeof(*params), M_DRM, M_WAITOK);
1092         if (!params)
1093                 return -ENOMEM;
1094
1095         drmmode_crtc = drm_crtc_find(dev, put_image_rec->crtc_id);
1096         if (!drmmode_crtc) {
1097                 ret = -ENOENT;
1098                 goto out_free;
1099         }
1100         crtc = to_intel_crtc(drmmode_crtc);
1101
1102         new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
1103                                                    put_image_rec->bo_handle));
1104         if (&new_bo->base == NULL) {
1105                 ret = -ENOENT;
1106                 goto out_free;
1107         }
1108
1109         drm_modeset_lock_all(dev);
1110         mutex_lock(&dev->struct_mutex);
1111
1112         if (new_bo->tiling_mode) {
1113                 DRM_DEBUG_KMS("buffer used for overlay image can not be tiled\n");
1114                 ret = -EINVAL;
1115                 goto out_unlock;
1116         }
1117
1118         ret = intel_overlay_recover_from_interrupt(overlay);
1119         if (ret != 0)
1120                 goto out_unlock;
1121
1122         if (overlay->crtc != crtc) {
1123                 struct drm_display_mode *mode = &crtc->base.mode;
1124                 ret = intel_overlay_switch_off(overlay);
1125                 if (ret != 0)
1126                         goto out_unlock;
1127
1128                 ret = check_overlay_possible_on_crtc(overlay, crtc);
1129                 if (ret != 0)
1130                         goto out_unlock;
1131
1132                 overlay->crtc = crtc;
1133                 crtc->overlay = overlay;
1134
1135                 /* line too wide, i.e. one-line-mode */
1136                 if (mode->hdisplay > 1024 &&
1137                     intel_panel_fitter_pipe(dev) == crtc->pipe) {
1138                         overlay->pfit_active = true;
1139                         update_pfit_vscale_ratio(overlay);
1140                 } else
1141                         overlay->pfit_active = false;
1142         }
1143
1144         ret = check_overlay_dst(overlay, put_image_rec);
1145         if (ret != 0)
1146                 goto out_unlock;
1147
1148         if (overlay->pfit_active) {
1149                 params->dst_y = ((((u32)put_image_rec->dst_y) << 12) /
1150                                  overlay->pfit_vscale_ratio);
1151                 /* shifting right rounds downwards, so add 1 */
1152                 params->dst_h = ((((u32)put_image_rec->dst_height) << 12) /
1153                                  overlay->pfit_vscale_ratio) + 1;
1154         } else {
1155                 params->dst_y = put_image_rec->dst_y;
1156                 params->dst_h = put_image_rec->dst_height;
1157         }
1158         params->dst_x = put_image_rec->dst_x;
1159         params->dst_w = put_image_rec->dst_width;
1160
1161         params->src_w = put_image_rec->src_width;
1162         params->src_h = put_image_rec->src_height;
1163         params->src_scan_w = put_image_rec->src_scan_width;
1164         params->src_scan_h = put_image_rec->src_scan_height;
1165         if (params->src_scan_h > params->src_h ||
1166             params->src_scan_w > params->src_w) {
1167                 ret = -EINVAL;
1168                 goto out_unlock;
1169         }
1170
1171         ret = check_overlay_src(dev, put_image_rec, new_bo);
1172         if (ret != 0)
1173                 goto out_unlock;
1174         params->format = put_image_rec->flags & ~I915_OVERLAY_FLAGS_MASK;
1175         params->stride_Y = put_image_rec->stride_Y;
1176         params->stride_UV = put_image_rec->stride_UV;
1177         params->offset_Y = put_image_rec->offset_Y;
1178         params->offset_U = put_image_rec->offset_U;
1179         params->offset_V = put_image_rec->offset_V;
1180
1181         /* Check scaling after src size to prevent a divide-by-zero. */
1182         ret = check_overlay_scaling(params);
1183         if (ret != 0)
1184                 goto out_unlock;
1185
1186         ret = intel_overlay_do_put_image(overlay, new_bo, params);
1187         if (ret != 0)
1188                 goto out_unlock;
1189
1190         mutex_unlock(&dev->struct_mutex);
1191         drm_modeset_unlock_all(dev);
1192
1193         kfree(params);
1194
1195         return 0;
1196
1197 out_unlock:
1198         mutex_unlock(&dev->struct_mutex);
1199         drm_modeset_unlock_all(dev);
1200         drm_gem_object_unreference_unlocked(&new_bo->base);
1201 out_free:
1202         kfree(params);
1203
1204         return ret;
1205 }
1206
1207 static void update_reg_attrs(struct intel_overlay *overlay,
1208                              struct overlay_registers __iomem *regs)
1209 {
1210         iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff),
1211                   &regs->OCLRC0);
1212         iowrite32(overlay->saturation, &regs->OCLRC1);
1213 }
1214
1215 static bool check_gamma_bounds(u32 gamma1, u32 gamma2)
1216 {
1217         int i;
1218
1219         if (gamma1 & 0xff000000 || gamma2 & 0xff000000)
1220                 return false;
1221
1222         for (i = 0; i < 3; i++) {
1223                 if (((gamma1 >> i*8) & 0xff) >= ((gamma2 >> i*8) & 0xff))
1224                         return false;
1225         }
1226
1227         return true;
1228 }
1229
1230 static bool check_gamma5_errata(u32 gamma5)
1231 {
1232         int i;
1233
1234         for (i = 0; i < 3; i++) {
1235                 if (((gamma5 >> i*8) & 0xff) == 0x80)
1236                         return false;
1237         }
1238
1239         return true;
1240 }
1241
1242 static int check_gamma(struct drm_intel_overlay_attrs *attrs)
1243 {
1244         if (!check_gamma_bounds(0, attrs->gamma0) ||
1245             !check_gamma_bounds(attrs->gamma0, attrs->gamma1) ||
1246             !check_gamma_bounds(attrs->gamma1, attrs->gamma2) ||
1247             !check_gamma_bounds(attrs->gamma2, attrs->gamma3) ||
1248             !check_gamma_bounds(attrs->gamma3, attrs->gamma4) ||
1249             !check_gamma_bounds(attrs->gamma4, attrs->gamma5) ||
1250             !check_gamma_bounds(attrs->gamma5, 0x00ffffff))
1251                 return -EINVAL;
1252
1253         if (!check_gamma5_errata(attrs->gamma5))
1254                 return -EINVAL;
1255
1256         return 0;
1257 }
1258
1259 int intel_overlay_attrs(struct drm_device *dev, void *data,
1260                         struct drm_file *file_priv)
1261 {
1262         struct drm_intel_overlay_attrs *attrs = data;
1263         struct drm_i915_private *dev_priv = dev->dev_private;
1264         struct intel_overlay *overlay;
1265         struct overlay_registers __iomem *regs;
1266         int ret;
1267
1268         overlay = dev_priv->overlay;
1269         if (!overlay) {
1270                 DRM_DEBUG("userspace bug: no overlay\n");
1271                 return -ENODEV;
1272         }
1273
1274         drm_modeset_lock_all(dev);
1275         mutex_lock(&dev->struct_mutex);
1276
1277         ret = -EINVAL;
1278         if (!(attrs->flags & I915_OVERLAY_UPDATE_ATTRS)) {
1279                 attrs->color_key  = overlay->color_key;
1280                 attrs->brightness = overlay->brightness;
1281                 attrs->contrast   = overlay->contrast;
1282                 attrs->saturation = overlay->saturation;
1283
1284                 if (!IS_GEN2(dev)) {
1285                         attrs->gamma0 = I915_READ(OGAMC0);
1286                         attrs->gamma1 = I915_READ(OGAMC1);
1287                         attrs->gamma2 = I915_READ(OGAMC2);
1288                         attrs->gamma3 = I915_READ(OGAMC3);
1289                         attrs->gamma4 = I915_READ(OGAMC4);
1290                         attrs->gamma5 = I915_READ(OGAMC5);
1291                 }
1292         } else {
1293                 if (attrs->brightness < -128 || attrs->brightness > 127)
1294                         goto out_unlock;
1295                 if (attrs->contrast > 255)
1296                         goto out_unlock;
1297                 if (attrs->saturation > 1023)
1298                         goto out_unlock;
1299
1300                 overlay->color_key  = attrs->color_key;
1301                 overlay->brightness = attrs->brightness;
1302                 overlay->contrast   = attrs->contrast;
1303                 overlay->saturation = attrs->saturation;
1304
1305                 regs = intel_overlay_map_regs(overlay);
1306                 if (!regs) {
1307                         ret = -ENOMEM;
1308                         goto out_unlock;
1309                 }
1310
1311                 update_reg_attrs(overlay, regs);
1312
1313                 intel_overlay_unmap_regs(overlay, regs);
1314
1315                 if (attrs->flags & I915_OVERLAY_UPDATE_GAMMA) {
1316                         if (IS_GEN2(dev))
1317                                 goto out_unlock;
1318
1319                         if (overlay->active) {
1320                                 ret = -EBUSY;
1321                                 goto out_unlock;
1322                         }
1323
1324                         ret = check_gamma(attrs);
1325                         if (ret)
1326                                 goto out_unlock;
1327
1328                         I915_WRITE(OGAMC0, attrs->gamma0);
1329                         I915_WRITE(OGAMC1, attrs->gamma1);
1330                         I915_WRITE(OGAMC2, attrs->gamma2);
1331                         I915_WRITE(OGAMC3, attrs->gamma3);
1332                         I915_WRITE(OGAMC4, attrs->gamma4);
1333                         I915_WRITE(OGAMC5, attrs->gamma5);
1334                 }
1335         }
1336         overlay->color_key_enabled = (attrs->flags & I915_OVERLAY_DISABLE_DEST_COLORKEY) == 0;
1337
1338         ret = 0;
1339 out_unlock:
1340         mutex_unlock(&dev->struct_mutex);
1341         drm_modeset_unlock_all(dev);
1342
1343         return ret;
1344 }
1345
1346 void intel_setup_overlay(struct drm_device *dev)
1347 {
1348         struct drm_i915_private *dev_priv = dev->dev_private;
1349         struct intel_overlay *overlay;
1350         struct drm_i915_gem_object *reg_bo;
1351         struct overlay_registers __iomem *regs;
1352         int ret;
1353
1354         if (!HAS_OVERLAY(dev))
1355                 return;
1356
1357         overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
1358         if (!overlay)
1359                 return;
1360
1361         mutex_lock(&dev->struct_mutex);
1362         if (WARN_ON(dev_priv->overlay))
1363                 goto out_free;
1364
1365         overlay->dev = dev;
1366
1367         reg_bo = NULL;
1368         if (!OVERLAY_NEEDS_PHYSICAL(dev))
1369                 reg_bo = i915_gem_object_create_stolen(dev, PAGE_SIZE);
1370         if (reg_bo == NULL)
1371                 reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE);
1372         if (reg_bo == NULL)
1373                 goto out_free;
1374         overlay->reg_bo = reg_bo;
1375
1376         if (OVERLAY_NEEDS_PHYSICAL(dev)) {
1377                 ret = i915_gem_object_attach_phys(reg_bo, PAGE_SIZE);
1378                 if (ret) {
1379                         DRM_ERROR("failed to attach phys overlay regs\n");
1380                         goto out_free_bo;
1381                 }
1382                 overlay->flip_addr = reg_bo->phys_handle->busaddr;
1383         } else {
1384                 ret = i915_gem_obj_ggtt_pin(reg_bo, PAGE_SIZE, PIN_MAPPABLE);
1385                 if (ret) {
1386                         DRM_ERROR("failed to pin overlay register bo\n");
1387                         goto out_free_bo;
1388                 }
1389                 overlay->flip_addr = i915_gem_obj_ggtt_offset(reg_bo);
1390
1391                 ret = i915_gem_object_set_to_gtt_domain(reg_bo, true);
1392                 if (ret) {
1393                         DRM_ERROR("failed to move overlay register bo into the GTT\n");
1394                         goto out_unpin_bo;
1395                 }
1396         }
1397
1398         /* init all values */
1399         overlay->color_key = 0x0101fe;
1400         overlay->color_key_enabled = true;
1401         overlay->brightness = -19;
1402         overlay->contrast = 75;
1403         overlay->saturation = 146;
1404
1405         regs = intel_overlay_map_regs(overlay);
1406         if (!regs)
1407                 goto out_unpin_bo;
1408
1409         memset_io(regs, 0, sizeof(struct overlay_registers));
1410         update_polyphase_filter(regs);
1411         update_reg_attrs(overlay, regs);
1412
1413         intel_overlay_unmap_regs(overlay, regs);
1414
1415         dev_priv->overlay = overlay;
1416         mutex_unlock(&dev->struct_mutex);
1417         DRM_INFO("initialized overlay support\n");
1418         return;
1419
1420 out_unpin_bo:
1421         if (!OVERLAY_NEEDS_PHYSICAL(dev))
1422                 i915_gem_object_ggtt_unpin(reg_bo);
1423 out_free_bo:
1424         drm_gem_object_unreference(&reg_bo->base);
1425 out_free:
1426         mutex_unlock(&dev->struct_mutex);
1427         kfree(overlay);
1428         return;
1429 }
1430
1431 void intel_cleanup_overlay(struct drm_device *dev)
1432 {
1433         struct drm_i915_private *dev_priv = dev->dev_private;
1434
1435         if (!dev_priv->overlay)
1436                 return;
1437
1438         /* The bo's should be free'd by the generic code already.
1439          * Furthermore modesetting teardown happens beforehand so the
1440          * hardware should be off already */
1441         WARN_ON(dev_priv->overlay->active);
1442
1443         drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base);
1444         kfree(dev_priv->overlay);
1445 }
1446
1447 struct intel_overlay_error_state {
1448         struct overlay_registers regs;
1449         unsigned long base;
1450         u32 dovsta;
1451         u32 isr;
1452 };
1453
1454 #if 0
1455 static struct overlay_registers __iomem *
1456 intel_overlay_map_regs_atomic(struct intel_overlay *overlay)
1457 {
1458         struct drm_i915_private *dev_priv = overlay->dev->dev_private;
1459         struct overlay_registers __iomem *regs;
1460
1461         if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1462                 /* Cast to make sparse happy, but it's wc memory anyway, so
1463                  * equivalent to the wc io mapping on X86. */
1464                 regs = (struct overlay_registers __iomem *)
1465                         overlay->reg_bo->phys_handle->vaddr;
1466         else
1467                 regs = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
1468                                                 i915_gem_obj_ggtt_offset(overlay->reg_bo));
1469
1470         return regs;
1471 }
1472
1473 static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay,
1474                                         struct overlay_registers __iomem *regs)
1475 {
1476         if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1477                 io_mapping_unmap_atomic(regs);
1478 }
1479
1480
1481 struct intel_overlay_error_state *
1482 intel_overlay_capture_error_state(struct drm_device *dev)
1483 {
1484         struct drm_i915_private *dev_priv = dev->dev_private;
1485         struct intel_overlay *overlay = dev_priv->overlay;
1486         struct intel_overlay_error_state *error;
1487         struct overlay_registers __iomem *regs;
1488
1489         if (!overlay || !overlay->active)
1490                 return NULL;
1491
1492         error = kmalloc(sizeof(*error), GFP_ATOMIC);
1493         if (error == NULL)
1494                 return NULL;
1495
1496         error->dovsta = I915_READ(DOVSTA);
1497         error->isr = I915_READ(ISR);
1498         if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1499                 error->base = (__force long)overlay->reg_bo->phys_handle->vaddr;
1500         else
1501                 error->base = i915_gem_obj_ggtt_offset(overlay->reg_bo);
1502
1503         regs = intel_overlay_map_regs_atomic(overlay);
1504         if (!regs)
1505                 goto err;
1506
1507         memcpy_fromio(&error->regs, regs, sizeof(struct overlay_registers));
1508         intel_overlay_unmap_regs_atomic(overlay, regs);
1509
1510         return error;
1511
1512 err:
1513         kfree(error);
1514         return NULL;
1515 }
1516
1517 void
1518 intel_overlay_print_error_state(struct drm_i915_error_state_buf *m,
1519                                 struct intel_overlay_error_state *error)
1520 {
1521         i915_error_printf(m, "Overlay, status: 0x%08x, interrupt: 0x%08x\n",
1522                           error->dovsta, error->isr);
1523         i915_error_printf(m, "  Register file at 0x%08lx:\n",
1524                           error->base);
1525
1526 #define P(x) i915_error_printf(m, "    " #x ":  0x%08x\n", error->regs.x)
1527         P(OBUF_0Y);
1528         P(OBUF_1Y);
1529         P(OBUF_0U);
1530         P(OBUF_0V);
1531         P(OBUF_1U);
1532         P(OBUF_1V);
1533         P(OSTRIDE);
1534         P(YRGB_VPH);
1535         P(UV_VPH);
1536         P(HORZ_PH);
1537         P(INIT_PHS);
1538         P(DWINPOS);
1539         P(DWINSZ);
1540         P(SWIDTH);
1541         P(SWIDTHSW);
1542         P(SHEIGHT);
1543         P(YRGBSCALE);
1544         P(UVSCALE);
1545         P(OCLRC0);
1546         P(OCLRC1);
1547         P(DCLRKV);
1548         P(DCLRKM);
1549         P(SCLRKVH);
1550         P(SCLRKVL);
1551         P(SCLRKEN);
1552         P(OCONFIG);
1553         P(OCMD);
1554         P(OSTART_0Y);
1555         P(OSTART_1Y);
1556         P(OSTART_0U);
1557         P(OSTART_0V);
1558         P(OSTART_1U);
1559         P(OSTART_1V);
1560         P(OTILEOFF_0Y);
1561         P(OTILEOFF_1Y);
1562         P(OTILEOFF_0U);
1563         P(OTILEOFF_0V);
1564         P(OTILEOFF_1U);
1565         P(OTILEOFF_1V);
1566         P(FASTHSCALE);
1567         P(UVSCALEV);
1568 #undef P
1569 }
1570 #endif