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