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