intel_overlay.c revision edc3d8848dc9fe2a470316363dab8ef211d77e01
102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* 202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Copyright © 2009 302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * 402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Permission is hereby granted, free of charge, to any person obtaining a 502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * copy of this software and associated documentation files (the "Software"), 602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * to deal in the Software without restriction, including without limitation 702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * and/or sell copies of the Software, and to permit persons to whom the 902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Software is furnished to do so, subject to the following conditions: 1002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * 1102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * The above copyright notice and this permission notice (including the next 1202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * paragraph) shall be included in all copies or substantial portions of the 1302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Software. 1402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * 1502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 2102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * SOFTWARE. 2202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * 2302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Authors: 2402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Daniel Vetter <daniel@ffwll.ch> 2502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * 2602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Derived from Xorg ddx, xf86-video-intel, src/i830_video.c 2702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter */ 28760285e7e7ab282c25b5e90816f7c47000557f4fDavid Howells#include <drm/drmP.h> 29760285e7e7ab282c25b5e90816f7c47000557f4fDavid Howells#include <drm/i915_drm.h> 3002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#include "i915_drv.h" 3102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#include "i915_reg.h" 3202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#include "intel_drv.h" 3302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 3402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* Limits for overlay size. According to intel doc, the real limits are: 3502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * Y width: 4095, UV width (planar): 2047, Y height: 2047, 3602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * UV width (planar): * 1023. But the xorg thinks 2048 for height and width. Use 3702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * the mininum of both. */ 3802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define IMAGE_MAX_WIDTH 2048 3902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define IMAGE_MAX_HEIGHT 2046 /* 2 * 1023 */ 4002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* on 830 and 845 these large limits result in the card hanging */ 4102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define IMAGE_MAX_WIDTH_LEGACY 1024 4202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define IMAGE_MAX_HEIGHT_LEGACY 1088 4302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 4402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* overlay register definitions */ 4502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* OCMD register */ 4602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_TILED_SURFACE (0x1<<19) 4702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_MIRROR_MASK (0x3<<17) 4802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_MIRROR_MODE (0x3<<17) 4902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_MIRROR_HORIZONTAL (0x1<<17) 5002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_MIRROR_VERTICAL (0x2<<17) 5102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_MIRROR_BOTH (0x3<<17) 5202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BYTEORDER_MASK (0x3<<14) /* zero for YUYV or FOURCC YUY2 */ 5302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_UV_SWAP (0x1<<14) /* YVYU */ 5402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_Y_SWAP (0x2<<14) /* UYVY or FOURCC UYVY */ 5502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_Y_AND_UV_SWAP (0x3<<14) /* VYUY */ 5602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_SOURCE_FORMAT_MASK (0xf<<10) 5702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_RGB_888 (0x1<<10) /* not in i965 Intel docs */ 5802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_RGB_555 (0x2<<10) /* not in i965 Intel docs */ 5902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_RGB_565 (0x3<<10) /* not in i965 Intel docs */ 6002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_YUV_422_PACKED (0x8<<10) 6102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_YUV_411_PACKED (0x9<<10) /* not in i965 Intel docs */ 6202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_YUV_420_PLANAR (0xc<<10) 6302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_YUV_422_PLANAR (0xd<<10) 6402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_YUV_410_PLANAR (0xe<<10) /* also 411 */ 6502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_TVSYNCFLIP_PARITY (0x1<<9) 6602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_TVSYNCFLIP_ENABLE (0x1<<7) 67d79613643b4512962b2be5262a09b6694dd96101Chris Wilson#define OCMD_BUF_TYPE_MASK (0x1<<5) 6802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BUF_TYPE_FRAME (0x0<<5) 6902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BUF_TYPE_FIELD (0x1<<5) 7002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_TEST_MODE (0x1<<4) 7102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BUFFER_SELECT (0x3<<2) 7202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BUFFER0 (0x0<<2) 7302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_BUFFER1 (0x1<<2) 7402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_FIELD_SELECT (0x1<<2) 7502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_FIELD0 (0x0<<1) 7602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_FIELD1 (0x1<<1) 7702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCMD_ENABLE (0x1<<0) 7802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 7902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* OCONFIG register */ 8002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_PIPE_MASK (0x1<<18) 8102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_PIPE_A (0x0<<18) 8202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_PIPE_B (0x1<<18) 8302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_GAMMA2_ENABLE (0x1<<16) 8402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_CSC_MODE_BT601 (0x0<<5) 8502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_CSC_MODE_BT709 (0x1<<5) 8602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_CSC_BYPASS (0x1<<4) 8702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_CC_OUT_8BIT (0x1<<3) 8802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_TEST_MODE (0x1<<2) 8902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_THREE_LINE_BUFFER (0x1<<0) 9002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OCONF_TWO_LINE_BUFFER (0x0<<0) 9102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 9202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* DCLRKM (dst-key) register */ 9302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define DST_KEY_ENABLE (0x1<<31) 9402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define CLK_RGB24_MASK 0x0 9502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define CLK_RGB16_MASK 0x070307 9602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define CLK_RGB15_MASK 0x070707 9702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define CLK_RGB8I_MASK 0xffffff 9802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 9902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define RGB16_TO_COLORKEY(c) \ 10002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter (((c & 0xF800) << 8) | ((c & 0x07E0) << 5) | ((c & 0x001F) << 3)) 10102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define RGB15_TO_COLORKEY(c) \ 10202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter (((c & 0x7c00) << 9) | ((c & 0x03E0) << 6) | ((c & 0x001F) << 3)) 10302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 10402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* overlay flip addr flag */ 10502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define OFC_UPDATE 0x1 10602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 10702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* polyphase filter coefficients */ 10802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define N_HORIZ_Y_TAPS 5 10902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define N_VERT_Y_TAPS 3 11002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define N_HORIZ_UV_TAPS 3 11102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define N_VERT_UV_TAPS 3 11202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define N_PHASES 17 11302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define MAX_TAPS 5 11402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 11502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* memory bufferd overlay registers */ 11602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstruct overlay_registers { 1170206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_0Y; 1180206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_1Y; 1190206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_0U; 1200206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_0V; 1210206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_1U; 1220206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OBUF_1V; 1230206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTRIDE; 1240206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 YRGB_VPH; 1250206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 UV_VPH; 1260206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 HORZ_PH; 1270206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 INIT_PHS; 1280206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 DWINPOS; 1290206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 DWINSZ; 1300206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SWIDTH; 1310206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SWIDTHSW; 1320206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SHEIGHT; 1330206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 YRGBSCALE; 1340206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 UVSCALE; 1350206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OCLRC0; 1360206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OCLRC1; 1370206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 DCLRKV; 1380206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 DCLRKM; 1390206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SCLRKVH; 1400206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SCLRKVL; 1410206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 SCLRKEN; 1420206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OCONFIG; 1430206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OCMD; 1440206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 RESERVED1; /* 0x6C */ 1450206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_0Y; 1460206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_1Y; 1470206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_0U; 1480206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_0V; 1490206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_1U; 1500206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OSTART_1V; 1510206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_0Y; 1520206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_1Y; 1530206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_0U; 1540206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_0V; 1550206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_1U; 1560206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 OTILEOFF_1V; 1570206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 FASTHSCALE; /* 0xA0 */ 1580206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 UVSCALEV; /* 0xA4 */ 1590206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u32 RESERVEDC[(0x200 - 0xA8) / 4]; /* 0xA8 - 0x1FC */ 1600206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 Y_VCOEFS[N_VERT_Y_TAPS * N_PHASES]; /* 0x200 */ 1610206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 RESERVEDD[0x100 / 2 - N_VERT_Y_TAPS * N_PHASES]; 1620206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 Y_HCOEFS[N_HORIZ_Y_TAPS * N_PHASES]; /* 0x300 */ 1630206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 RESERVEDE[0x200 / 2 - N_HORIZ_Y_TAPS * N_PHASES]; 1640206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 UV_VCOEFS[N_VERT_UV_TAPS * N_PHASES]; /* 0x500 */ 1650206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 RESERVEDF[0x100 / 2 - N_VERT_UV_TAPS * N_PHASES]; 1660206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 UV_HCOEFS[N_HORIZ_UV_TAPS * N_PHASES]; /* 0x600 */ 1670206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi u16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES]; 16802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter}; 16902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 17023f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilsonstruct intel_overlay { 17123f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson struct drm_device *dev; 17223f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson struct intel_crtc *crtc; 17323f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson struct drm_i915_gem_object *vid_bo; 17423f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson struct drm_i915_gem_object *old_vid_bo; 17523f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson int active; 17623f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson int pfit_active; 17723f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */ 17823f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson u32 color_key; 17923f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson u32 brightness, contrast, saturation; 18023f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson u32 old_xscale, old_yscale; 18123f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson /* register access */ 18223f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson u32 flip_addr; 18323f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson struct drm_i915_gem_object *reg_bo; 18423f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson /* flip handling */ 18523f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson uint32_t last_flip_req; 186b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson void (*flip_tail)(struct intel_overlay *); 18723f09ce31ca68af3728ac5eed3e3efb03c5f990aChris Wilson}; 18802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 18975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawskystatic struct overlay_registers __iomem * 1908d74f656dd78ae1ba813389cd46197c6329696bcChris Wilsonintel_overlay_map_regs(struct intel_overlay *overlay) 19102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 1920206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi drm_i915_private_t *dev_priv = overlay->dev->dev_private; 19375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 19402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1959bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) 19675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_obj->handle->vaddr; 1979bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson else 1985d4545aef561ad47f91bcf75814af20c104b5a9eBen Widawsky regs = io_mapping_map_wc(dev_priv->gtt.mappable, 1998d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson overlay->reg_bo->gtt_offset); 20002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 2019bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson return regs; 2028d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson} 20302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 2049bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilsonstatic void intel_overlay_unmap_regs(struct intel_overlay *overlay, 20575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs) 2068d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson{ 2078d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) 2089bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson io_mapping_unmap(regs); 20902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 21002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 211b6c028e00445de9dfde2cd0c26521ac53965320aChris Wilsonstatic int intel_overlay_do_wait_request(struct intel_overlay *overlay, 212b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson void (*tail)(struct intel_overlay *)) 21302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 21402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 215852835f343146a82a528c3b712b373661d4fa17aZou Nan hai drm_i915_private_t *dev_priv = dev->dev_private; 2166d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 217b6c028e00445de9dfde2cd0c26521ac53965320aChris Wilson int ret; 21802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 219b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson BUG_ON(overlay->last_flip_req); 220acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson ret = i915_add_request(ring, NULL, &overlay->last_flip_req); 221acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson if (ret) 222acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson return ret; 223acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson 224b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->flip_tail = tail; 225199b2bc25ba587f666a712e9d8475d691d9cec4cBen Widawsky ret = i915_wait_seqno(ring, overlay->last_flip_req); 226b6c028e00445de9dfde2cd0c26521ac53965320aChris Wilson if (ret) 22703f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter return ret; 228b2da9fe5d5994a104bbae154590070d698279919Ben Widawsky i915_gem_retire_requests(dev); 22902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 23003f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter overlay->last_flip_req = 0; 23102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 23202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 23302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 23402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* overlay needs to be disable in OCMD reg */ 23502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int intel_overlay_on(struct intel_overlay *overlay) 23602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 23702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 238e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson struct drm_i915_private *dev_priv = dev->dev_private; 2396d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 24002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret; 24102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 24202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(overlay->active); 24303f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter overlay->active = 1; 244b6c028e00445de9dfde2cd0c26521ac53965320aChris Wilson 2456306cb4f809ccf92c1b7bf446635c571e33f5151Daniel Vetter WARN_ON(IS_I830(dev) && !(dev_priv->quirks & QUIRK_PIPEA_FORCE)); 246106dadacbeeea92f61a2c32f3651ee31c1b34e31Chris Wilson 2476d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter ret = intel_ring_begin(ring, 4); 248acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson if (ret) 249acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson return ret; 250e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson 2516d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_ON); 2526d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE); 2536d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 2546d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_NOOP); 2556d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_advance(ring); 25602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 257acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson return intel_overlay_do_wait_request(overlay, NULL); 25802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 25902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 26002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* overlay needs to be enabled in OCMD reg */ 2618dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilsonstatic int intel_overlay_continue(struct intel_overlay *overlay, 2628dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilson bool load_polyphase_filter) 26302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 26402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 2650206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi drm_i915_private_t *dev_priv = dev->dev_private; 2666d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 26702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 flip_addr = overlay->flip_addr; 26802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 tmp; 269e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson int ret; 27002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 27102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!overlay->active); 27202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 27302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (load_polyphase_filter) 27402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter flip_addr |= OFC_UPDATE; 27502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 27602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* check for underruns */ 27702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp = I915_READ(DOVSTA); 27802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (tmp & (1 << 17)) 27902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp); 28002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 2816d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter ret = intel_ring_begin(ring, 2); 282acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson if (ret) 283e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson return ret; 284acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson 2856d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); 2866d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, flip_addr); 2876d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_advance(ring); 2885a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter 289acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson return i915_add_request(ring, NULL, &overlay->last_flip_req); 2905a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter} 2915a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter 292b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilsonstatic void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) 2935a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter{ 29405394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *obj = overlay->old_vid_bo; 2955a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter 296b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson i915_gem_object_unpin(obj); 29705394f3975dceb107a5e1393e2244946e5b43660Chris Wilson drm_gem_object_unreference(&obj->base); 2985a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter 299b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->old_vid_bo = NULL; 300b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson} 30103f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 302b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilsonstatic void intel_overlay_off_tail(struct intel_overlay *overlay) 303b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson{ 30405394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *obj = overlay->vid_bo; 30502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 306b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson /* never have the overlay hw on without showing a frame */ 307b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson BUG_ON(!overlay->vid_bo); 30802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 309b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson i915_gem_object_unpin(obj); 31005394f3975dceb107a5e1393e2244946e5b43660Chris Wilson drm_gem_object_unreference(&obj->base); 311b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->vid_bo = NULL; 31203f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 313b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->crtc->overlay = NULL; 314b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->crtc = NULL; 315b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->active = 0; 31602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 31702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 31802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter/* overlay needs to be disabled in OCMD reg */ 319ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilsonstatic int intel_overlay_off(struct intel_overlay *overlay) 32002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 32102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 322e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson struct drm_i915_private *dev_priv = dev->dev_private; 3236d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 3248dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilson u32 flip_addr = overlay->flip_addr; 325e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson int ret; 32602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 32702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!overlay->active); 32802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 32902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* According to intel docs the overlay hw may hang (when switching 33002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * off) without loading the filter coeffs. It is however unclear whether 33102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * this applies to the disabling of the overlay or to the switching off 33202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter * of the hw. Do it in both cases */ 33302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter flip_addr |= OFC_UPDATE; 33402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 3356d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter ret = intel_ring_begin(ring, 6); 336acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson if (ret) 337e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson return ret; 338acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson 33902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* wait for overlay to go idle */ 3406d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); 3416d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, flip_addr); 3426d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 34302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* turn overlay off */ 344a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter if (IS_I830(dev)) { 345a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter /* Workaround: Don't disable the overlay fully, since otherwise 346a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter * it dies on the next OVERLAY_ON cmd. */ 347a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, MI_NOOP); 348a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, MI_NOOP); 349a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, MI_NOOP); 350a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter } else { 351a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_OFF); 352a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, flip_addr); 353a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 354a9193983f4f292a82a00c72971c17ec0ee8c6c15Daniel Vetter } 3556d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_advance(ring); 35602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 357acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson return intel_overlay_do_wait_request(overlay, intel_overlay_off_tail); 35812ca45fea91cfbb09df828bea958b47348caee6dDaniel Vetter} 35912ca45fea91cfbb09df828bea958b47348caee6dDaniel Vetter 36003f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter/* recover from an interruption due to a signal 36103f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter * We have to be careful not to repeat work forever an make forward progess. */ 362ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilsonstatic int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) 36303f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter{ 36403f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter struct drm_device *dev = overlay->dev; 365852835f343146a82a528c3b712b373661d4fa17aZou Nan hai drm_i915_private_t *dev_priv = dev->dev_private; 3666d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 36703f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter int ret; 36803f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 369b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson if (overlay->last_flip_req == 0) 370b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson return 0; 37103f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 372199b2bc25ba587f666a712e9d8475d691d9cec4cBen Widawsky ret = i915_wait_seqno(ring, overlay->last_flip_req); 373b6c028e00445de9dfde2cd0c26521ac53965320aChris Wilson if (ret) 37403f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter return ret; 375b2da9fe5d5994a104bbae154590070d698279919Ben Widawsky i915_gem_retire_requests(dev); 37603f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 377b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson if (overlay->flip_tail) 378b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson overlay->flip_tail(overlay); 37903f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 38003f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter overlay->last_flip_req = 0; 38103f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter return 0; 38203f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter} 38303f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 3845a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter/* Wait for pending overlay flip and release old frame. 3855a5a0c64a99d7542c48c99d1a8bbb49e665842beDaniel Vetter * Needs to be called before the overlay register are changed 3868d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson * via intel_overlay_(un)map_regs 3878d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson */ 38802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int intel_overlay_release_old_vid(struct intel_overlay *overlay) 38902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 3905cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson struct drm_device *dev = overlay->dev; 3915cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 3926d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; 39302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret; 39402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 3955cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson /* Only wait if there is actually an old frame to release to 3965cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson * guarantee forward progress. 3975cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson */ 39803f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter if (!overlay->old_vid_bo) 39903f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter return 0; 40003f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 4015cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson if (I915_READ(ISR) & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT) { 4025cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson /* synchronous slowpath */ 4036d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter ret = intel_ring_begin(ring, 2); 404acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson if (ret) 405e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson return ret; 406e1f99ce6cac3b6a95551642be5ddb5d9c46bea76Chris Wilson 4076d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 4086d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_emit(ring, MI_NOOP); 4096d90c952cdd20158ec41a5c016c6fad73c9a8749Daniel Vetter intel_ring_advance(ring); 4105cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson 411acb868d3d710b09a356d848e0cd44d9713a9e274Chris Wilson ret = intel_overlay_do_wait_request(overlay, 412b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson intel_overlay_release_old_vid_tail); 4135cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson if (ret) 4145cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson return ret; 4155cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson } 41602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 4175cd68c9864d65e49c910c701716e4e94e09f7ce0Chris Wilson intel_overlay_release_old_vid_tail(overlay); 41802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 41902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 42002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 42102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstruct put_image_params { 42202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int format; 42302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short dst_x; 42402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short dst_y; 42502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short dst_w; 42602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short dst_h; 42702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short src_w; 42802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short src_scan_h; 42902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short src_scan_w; 43002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short src_h; 43102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short stride_Y; 43202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter short stride_UV; 43302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int offset_Y; 43402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int offset_U; 43502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int offset_V; 43602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter}; 43702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 43802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int packed_depth_bytes(u32 format) 43902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 44002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (format & I915_OVERLAY_DEPTH_MASK) { 441722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 442722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return 4; 443722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV411: 444722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* return 6; not implemented */ 445722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson default: 446722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 44702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 44802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 44902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 45002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int packed_width_bytes(u32 format, short width) 45102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 45202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (format & I915_OVERLAY_DEPTH_MASK) { 453722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 454722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return width << 1; 455722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson default: 456722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 45702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 45802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 45902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 46002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int uv_hsubsampling(u32 format) 46102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 46202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (format & I915_OVERLAY_DEPTH_MASK) { 463722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 464722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV420: 465722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return 2; 466722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV411: 467722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV410: 468722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return 4; 469722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson default: 470722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 47102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 47202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 47302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 47402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int uv_vsubsampling(u32 format) 47502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 47602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (format & I915_OVERLAY_DEPTH_MASK) { 477722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV420: 478722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV410: 479722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return 2; 480722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 481722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV411: 482722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return 1; 483722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson default: 484722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 48502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 48602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 48702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 48802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic u32 calc_swidthsw(struct drm_device *dev, u32 offset, u32 width) 48902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 49002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 mask, shift, ret; 491a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (IS_GEN2(dev)) { 49202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mask = 0x1f; 49302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter shift = 5; 494a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson } else { 495a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson mask = 0x3f; 496a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson shift = 6; 49702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 49802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = ((offset + width + mask) >> shift) - (offset >> shift); 499a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (!IS_GEN2(dev)) 50002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret <<= 1; 5010206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi ret -= 1; 50202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret << 2; 50302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 50402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 50502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic const u16 y_static_hcoeffs[N_HORIZ_Y_TAPS * N_PHASES] = { 50602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0xb4a0, 0x1930, 0x1920, 0xb4a0, 50702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0xb500, 0x19d0, 0x1880, 0xb440, 50802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0xb540, 0x1a88, 0x2f80, 0xb3e0, 50902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0xb580, 0x1b30, 0x2e20, 0xb380, 51002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0xb5c0, 0x1bd8, 0x2cc0, 0xb320, 51102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb5e0, 0x1c60, 0x2b80, 0xb2c0, 51202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb5e0, 0x1cf8, 0x2a20, 0xb260, 51302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb5e0, 0x1d80, 0x28e0, 0xb200, 51402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb5c0, 0x1e08, 0x3f40, 0xb1c0, 51502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb580, 0x1e78, 0x3ce0, 0xb160, 51602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3040, 0xb520, 0x1ed8, 0x3aa0, 0xb120, 51702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3040, 0xb4a0, 0x1f30, 0x3880, 0xb0e0, 51802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3040, 0xb400, 0x1f78, 0x3680, 0xb0a0, 51902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060, 52002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040, 52102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020, 522722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 0xb000, 0x3000, 0x0800, 0x3000, 0xb000 523722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson}; 524722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 52502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = { 52602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60, 52702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40, 52802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb040, 0x1b20, 0x29e0, 0xb060, 0x1bd8, 0x2880, 52902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb080, 0x1c88, 0x3e60, 0xb0a0, 0x1d28, 0x3c00, 53002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb0c0, 0x1db8, 0x39e0, 0xb0e0, 0x1e40, 0x37e0, 53102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0, 53202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240, 53302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0, 534722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 0x3000, 0x0800, 0x3000 535722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson}; 53602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 53775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawskystatic void update_polyphase_filter(struct overlay_registers __iomem *regs) 53802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 53975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky memcpy_toio(regs->Y_HCOEFS, y_static_hcoeffs, sizeof(y_static_hcoeffs)); 54075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky memcpy_toio(regs->UV_HCOEFS, uv_static_hcoeffs, 54175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky sizeof(uv_static_hcoeffs)); 54202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 54302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 54402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic bool update_scaling_factors(struct intel_overlay *overlay, 54575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs, 54602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct put_image_params *params) 54702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 54802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* fixed point with a 12 bit shift */ 54902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 xscale, yscale, xscale_UV, yscale_UV; 55002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define FP_SHIFT 12 55102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter#define FRACT_MASK 0xfff 55202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter bool scale_changed = false; 55302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_hscale = uv_hsubsampling(params->format); 55402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_vscale = uv_vsubsampling(params->format); 55502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 55602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (params->dst_w > 1) 55702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter xscale = ((params->src_scan_w - 1) << FP_SHIFT) 55802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /(params->dst_w); 55902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter else 56002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter xscale = 1 << FP_SHIFT; 56102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 56202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (params->dst_h > 1) 56302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter yscale = ((params->src_scan_h - 1) << FP_SHIFT) 56402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /(params->dst_h); 56502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter else 56602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter yscale = 1 << FP_SHIFT; 56702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 56802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /*if (params->format & I915_OVERLAY_YUV_PLANAR) {*/ 569722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson xscale_UV = xscale/uv_hscale; 570722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson yscale_UV = yscale/uv_vscale; 571722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* make the Y scale to UV scale ratio an exact multiply */ 572722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson xscale = xscale_UV * uv_hscale; 573722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson yscale = yscale_UV * uv_vscale; 57402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /*} else { 575722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson xscale_UV = 0; 576722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson yscale_UV = 0; 577722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson }*/ 57802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 57902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) 58002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter scale_changed = true; 58102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->old_xscale = xscale; 58202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->old_yscale = yscale; 58302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 58475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(((yscale & FRACT_MASK) << 20) | 58575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ((xscale >> FP_SHIFT) << 16) | 58675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ((xscale & FRACT_MASK) << 3), 58775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->YRGBSCALE); 588722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 58975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(((yscale_UV & FRACT_MASK) << 20) | 59075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ((xscale_UV >> FP_SHIFT) << 16) | 59175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ((xscale_UV & FRACT_MASK) << 3), 59275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->UVSCALE); 593722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 59475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32((((yscale >> FP_SHIFT) << 16) | 59575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ((yscale_UV >> FP_SHIFT) << 0)), 59675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->UVSCALEV); 59702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 59802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (scale_changed) 59902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_polyphase_filter(regs); 60002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 60102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return scale_changed; 60202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 60302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 60402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic void update_colorkey(struct intel_overlay *overlay, 60575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs) 60602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 60702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 key = overlay->color_key; 6086ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson 60902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (overlay->crtc->base.fb->bits_per_pixel) { 610722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case 8: 61175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(0, ®s->DCLRKV); 61275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(CLK_RGB8I_MASK | DST_KEY_ENABLE, ®s->DCLRKM); 6136ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson break; 6146ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson 615722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case 16: 616722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (overlay->crtc->base.fb->depth == 15) { 61775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(RGB15_TO_COLORKEY(key), ®s->DCLRKV); 61875020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(CLK_RGB15_MASK | DST_KEY_ENABLE, 61975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->DCLRKM); 620722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson } else { 62175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(RGB16_TO_COLORKEY(key), ®s->DCLRKV); 62275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(CLK_RGB16_MASK | DST_KEY_ENABLE, 62375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->DCLRKM); 624722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson } 6256ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson break; 6266ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson 627722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case 24: 628722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case 32: 62975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(key, ®s->DCLRKV); 63075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(CLK_RGB24_MASK | DST_KEY_ENABLE, ®s->DCLRKM); 6316ba3ddd9838f5e4d6ac7c6dce95648d205e11bffChris Wilson break; 63202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 63302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 63402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 63502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic u32 overlay_cmd_reg(struct put_image_params *params) 63602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 63702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 cmd = OCMD_ENABLE | OCMD_BUF_TYPE_FRAME | OCMD_BUFFER0; 63802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 63902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (params->format & I915_OVERLAY_YUV_PLANAR) { 64002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (params->format & I915_OVERLAY_DEPTH_MASK) { 641722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 642722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_YUV_422_PLANAR; 643722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 644722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV420: 645722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_YUV_420_PLANAR; 646722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 647722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV411: 648722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV410: 649722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_YUV_410_PLANAR; 650722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 65102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 65202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } else { /* YUV packed */ 65302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (params->format & I915_OVERLAY_DEPTH_MASK) { 654722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV422: 655722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_YUV_422_PACKED; 656722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 657722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV411: 658722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_YUV_411_PACKED; 659722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 66002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 66102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 66202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (params->format & I915_OVERLAY_SWAP_MASK) { 663722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_NO_SWAP: 664722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 665722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_UV_SWAP: 666722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_UV_SWAP; 667722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 668722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_Y_SWAP: 669722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_Y_SWAP; 670722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 671722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_Y_AND_UV_SWAP: 672722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson cmd |= OCMD_Y_AND_UV_SWAP; 673722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 67402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 67502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 67602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 67702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return cmd; 67802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 67902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 6805fe82c5ee1ba2d04183c376038c5d233a0311ec9Chris Wilsonstatic int intel_overlay_do_put_image(struct intel_overlay *overlay, 68105394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *new_bo, 6825fe82c5ee1ba2d04183c376038c5d233a0311ec9Chris Wilson struct put_image_params *params) 68302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 68402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret, tmp_width; 68575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 68602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter bool scale_changed = false; 68702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 68875020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky u32 swidth, swidthsw, sheight, ostride; 68902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 69002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 69102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!mutex_is_locked(&dev->mode_config.mutex)); 69202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!overlay); 69302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 69402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = intel_overlay_release_old_vid(overlay); 69502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 69602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 69702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 6982da3b9b940e2a18147422c54ed8b29d01e1ade88Chris Wilson ret = i915_gem_object_pin_to_display_plane(new_bo, 0, NULL); 69902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 70002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 70102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 702d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson ret = i915_gem_object_put_fence(new_bo); 703d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson if (ret) 704d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson goto out_unpin; 705d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson 70602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!overlay->active) { 70775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky u32 oconfig; 7088d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson regs = intel_overlay_map_regs(overlay); 70902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!regs) { 71002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = -ENOMEM; 71102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unpin; 71202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 71375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky oconfig = OCONF_CC_OUT_8BIT; 714a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (IS_GEN4(overlay->dev)) 71575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky oconfig |= OCONF_CSC_MODE_BT709; 71675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky oconfig |= overlay->crtc->pipe == 0 ? 71702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter OCONF_PIPE_A : OCONF_PIPE_B; 71875020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(oconfig, ®s->OCONFIG); 7199bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson intel_overlay_unmap_regs(overlay, regs); 72002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 72102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = intel_overlay_on(overlay); 72202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 72302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unpin; 72402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 72502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 7268d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson regs = intel_overlay_map_regs(overlay); 72702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!regs) { 72802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = -ENOMEM; 72902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unpin; 73002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 73102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 73275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32((params->dst_y << 16) | params->dst_x, ®s->DWINPOS); 73375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32((params->dst_h << 16) | params->dst_w, ®s->DWINSZ); 73402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 73502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (params->format & I915_OVERLAY_YUV_PACKED) 73602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp_width = packed_width_bytes(params->format, params->src_w); 73702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter else 73802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp_width = params->src_w; 73902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 74075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky swidth = params->src_w; 74175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky swidthsw = calc_swidthsw(overlay->dev, params->offset_Y, tmp_width); 74275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky sheight = params->src_h; 74375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(new_bo->gtt_offset + params->offset_Y, ®s->OBUF_0Y); 74475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ostride = params->stride_Y; 74502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 74602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (params->format & I915_OVERLAY_YUV_PLANAR) { 74702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_hscale = uv_hsubsampling(params->format); 74802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_vscale = uv_vsubsampling(params->format); 74902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 tmp_U, tmp_V; 75075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky swidth |= (params->src_w/uv_hscale) << 16; 75102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp_U = calc_swidthsw(overlay->dev, params->offset_U, 752722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson params->src_w/uv_hscale); 75302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp_V = calc_swidthsw(overlay->dev, params->offset_V, 754722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson params->src_w/uv_hscale); 75575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky swidthsw |= max_t(u32, tmp_U, tmp_V) << 16; 75675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky sheight |= (params->src_h/uv_vscale) << 16; 75775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(new_bo->gtt_offset + params->offset_U, ®s->OBUF_0U); 75875020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(new_bo->gtt_offset + params->offset_V, ®s->OBUF_0V); 75975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ostride |= params->stride_UV << 16; 76002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 76102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 76275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(swidth, ®s->SWIDTH); 76375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(swidthsw, ®s->SWIDTHSW); 76475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(sheight, ®s->SHEIGHT); 76575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(ostride, ®s->OSTRIDE); 76675020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky 76702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter scale_changed = update_scaling_factors(overlay, regs, params); 76802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 76902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_colorkey(overlay, regs); 77002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 77175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(overlay_cmd_reg(params), ®s->OCMD); 77202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 7739bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson intel_overlay_unmap_regs(overlay, regs); 77402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 7758dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilson ret = intel_overlay_continue(overlay, scale_changed); 7768dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilson if (ret) 7778dc5d14741dc1ee0074a14b360993a10c2c02d24Chris Wilson goto out_unpin; 77802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 77902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->old_vid_bo = overlay->vid_bo; 78005394f3975dceb107a5e1393e2244946e5b43660Chris Wilson overlay->vid_bo = new_bo; 78102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 78202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 78302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 78402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterout_unpin: 78502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter i915_gem_object_unpin(new_bo); 78602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 78702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 78802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 789ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilsonint intel_overlay_switch_off(struct intel_overlay *overlay) 79002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 79175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 79202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 7935dcdbcb06badbdf2faa698bf3198e421a1e12840Chris Wilson int ret; 79402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 79502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 79602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter BUG_ON(!mutex_is_locked(&dev->mode_config.mutex)); 79702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 798ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilson ret = intel_overlay_recover_from_interrupt(overlay); 799b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson if (ret != 0) 800b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson return ret; 8019bedb9743fd906e4160468663ee6e1bbdc4412b8Daniel Vetter 80202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!overlay->active) 80302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 80402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 80502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = intel_overlay_release_old_vid(overlay); 80602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 80702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 80802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 8098d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson regs = intel_overlay_map_regs(overlay); 81075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(0, ®s->OCMD); 8119bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson intel_overlay_unmap_regs(overlay, regs); 81202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 813ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilson ret = intel_overlay_off(overlay); 81403f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter if (ret != 0) 81503f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter return ret; 81603f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 81712ca45fea91cfbb09df828bea958b47348caee6dDaniel Vetter intel_overlay_off_tail(overlay); 81802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 81902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 82002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 82102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int check_overlay_possible_on_crtc(struct intel_overlay *overlay, 82202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct intel_crtc *crtc) 82302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 824722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson drm_i915_private_t *dev_priv = overlay->dev->dev_private; 82502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 826f7abfe8b281991c66406c42c1a6c6c9ee0daa0ffChris Wilson if (!crtc->active) 82702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 82802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 82902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* can't use the overlay with double wide pipe */ 830a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (INTEL_INFO(overlay->dev)->gen < 4 && 831f7abfe8b281991c66406c42c1a6c6c9ee0daa0ffChris Wilson (I915_READ(PIPECONF(crtc->pipe)) & (PIPECONF_DOUBLE_WIDE | PIPECONF_ENABLE)) != PIPECONF_ENABLE) 83202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 83302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 83402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 83502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 83602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 83702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic void update_pfit_vscale_ratio(struct intel_overlay *overlay) 83802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 83902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_device *dev = overlay->dev; 840722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 84102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 pfit_control = I915_READ(PFIT_CONTROL); 842446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson u32 ratio; 84302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 84402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* XXX: This is not the same logic as in the xorg driver, but more in 845446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson * line with the intel documentation for the i965 846446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson */ 847a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (INTEL_INFO(dev)->gen >= 4) { 8480206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi /* on i965 use the PGM reg to read out the autoscaler values */ 849a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson ratio = I915_READ(PFIT_PGM_RATIOS) >> PFIT_VERT_SCALE_SHIFT_965; 850a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson } else { 851446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson if (pfit_control & VERT_AUTO_SCALE) 852446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson ratio = I915_READ(PFIT_AUTO_RATIOS); 85302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter else 854446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson ratio = I915_READ(PFIT_PGM_RATIOS); 855446d2183af68c0fd2772f5ef97a033efe69904a5Chris Wilson ratio >>= PFIT_VERT_SCALE_SHIFT; 85602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 85702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 85802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->pfit_vscale_ratio = ratio; 85902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 86002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 86102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int check_overlay_dst(struct intel_overlay *overlay, 86202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_intel_overlay_put_image *rec) 86302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 86402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_display_mode *mode = &overlay->crtc->base.mode; 86502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 86675c13993db592343bda1fd62f2555fea037d56bdDaniel Vetter if (rec->dst_x < mode->hdisplay && 86775c13993db592343bda1fd62f2555fea037d56bdDaniel Vetter rec->dst_x + rec->dst_width <= mode->hdisplay && 86875c13993db592343bda1fd62f2555fea037d56bdDaniel Vetter rec->dst_y < mode->vdisplay && 86975c13993db592343bda1fd62f2555fea037d56bdDaniel Vetter rec->dst_y + rec->dst_height <= mode->vdisplay) 87002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 87102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter else 87202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 87302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 87402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 87502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int check_overlay_scaling(struct put_image_params *rec) 87602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 87702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter u32 tmp; 87802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 87902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* downscaling limit is 8.0 */ 88002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp = ((rec->src_scan_h << 16) / rec->dst_h) >> 16; 88102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (tmp > 7) 88202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 88302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp = ((rec->src_scan_w << 16) / rec->dst_w) >> 16; 88402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (tmp > 7) 88502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 88602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 88702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 88802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 88902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 89002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int check_overlay_src(struct drm_device *dev, 89102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_intel_overlay_put_image *rec, 89205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *new_bo) 89302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 89402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_hscale = uv_hsubsampling(rec->flags); 89502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int uv_vscale = uv_vsubsampling(rec->flags); 8968f28f54aad8bcf52a47afb6447fac34f96597b6fDan Carpenter u32 stride_mask; 8978f28f54aad8bcf52a47afb6447fac34f96597b6fDan Carpenter int depth; 8988f28f54aad8bcf52a47afb6447fac34f96597b6fDan Carpenter u32 tmp; 89902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 90002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* check src dimensions */ 90102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (IS_845G(dev) || IS_I830(dev)) { 902722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY || 9039f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson rec->src_width > IMAGE_MAX_WIDTH_LEGACY) 90402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 90502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } else { 906722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->src_height > IMAGE_MAX_HEIGHT || 9079f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson rec->src_width > IMAGE_MAX_WIDTH) 90802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 90902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 9109f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 91102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* better safe than sorry, use 4 as the maximal subsampling ratio */ 912722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->src_height < N_VERT_Y_TAPS*4 || 9139f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson rec->src_width < N_HORIZ_Y_TAPS*4) 91402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 91502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 916a1efd14a99483a4fb9308902397ed86b69454c99Chris Wilson /* check alignment constraints */ 91702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (rec->flags & I915_OVERLAY_TYPE_MASK) { 918722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_RGB: 919722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* not implemented */ 920722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 9219f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 922722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV_PACKED: 923722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (uv_vscale != 1) 92402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 9259f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 9269f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson depth = packed_depth_bytes(rec->flags); 927722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (depth < 0) 928722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return depth; 9299f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 930722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* ignore UV planes */ 931722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson rec->stride_UV = 0; 932722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson rec->offset_U = 0; 933722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson rec->offset_V = 0; 934722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* check pixel alignment */ 935722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->offset_Y % depth) 936722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 937722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 9389f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 939722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV_PLANAR: 940722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (uv_vscale < 0 || uv_hscale < 0) 94102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 942722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* no offset restrictions for planar formats */ 943722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 9449f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 945722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson default: 946722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 94702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 94802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 94902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (rec->src_width % uv_hscale) 95002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 95102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 95202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* stride checking */ 953a1efd14a99483a4fb9308902397ed86b69454c99Chris Wilson if (IS_I830(dev) || IS_845G(dev)) 954a1efd14a99483a4fb9308902397ed86b69454c99Chris Wilson stride_mask = 255; 955a1efd14a99483a4fb9308902397ed86b69454c99Chris Wilson else 956a1efd14a99483a4fb9308902397ed86b69454c99Chris Wilson stride_mask = 63; 95702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 95802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (rec->stride_Y & stride_mask || rec->stride_UV & stride_mask) 95902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 960a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (IS_GEN4(dev) && rec->stride_Y < 512) 96102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 96202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 96302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter tmp = (rec->flags & I915_OVERLAY_TYPE_MASK) == I915_OVERLAY_YUV_PLANAR ? 9649f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 4096 : 8192; 9659f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson if (rec->stride_Y > tmp || rec->stride_UV > 2*1024) 96602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 96702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 96802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* check buffer dimensions */ 96902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter switch (rec->flags & I915_OVERLAY_TYPE_MASK) { 970722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_RGB: 971722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV_PACKED: 972722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson /* always 4 Y values per depth pixels */ 973722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (packed_width_bytes(rec->flags, rec->src_width) > rec->stride_Y) 974722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 975722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 976722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson tmp = rec->stride_Y*rec->src_height; 97705394f3975dceb107a5e1393e2244946e5b43660Chris Wilson if (rec->offset_Y + tmp > new_bo->base.size) 978722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 979722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 980722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 981722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson case I915_OVERLAY_YUV_PLANAR: 982722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->src_width > rec->stride_Y) 983722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 984722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (rec->src_width/uv_hscale > rec->stride_UV) 985722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 986722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 9879f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson tmp = rec->stride_Y * rec->src_height; 98805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson if (rec->offset_Y + tmp > new_bo->base.size) 989722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 9909f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson 9919f7c3f442bb7c0d0a0ed25cc287932450a1f2babChris Wilson tmp = rec->stride_UV * (rec->src_height / uv_vscale); 99205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson if (rec->offset_U + tmp > new_bo->base.size || 99305394f3975dceb107a5e1393e2244946e5b43660Chris Wilson rec->offset_V + tmp > new_bo->base.size) 994722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson return -EINVAL; 995722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson break; 99602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 99702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 99802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 99902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 100002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1001e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson/** 1002e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson * Return the pipe currently connected to the panel fitter, 1003e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson * or -1 if the panel fitter is not present or not in use 1004e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson */ 1005e9e331a8abeece1565d383510ed985945132ffe3Chris Wilsonstatic int intel_panel_fitter_pipe(struct drm_device *dev) 1006e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson{ 1007e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson struct drm_i915_private *dev_priv = dev->dev_private; 1008e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson u32 pfit_control; 1009e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 1010e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson /* i830 doesn't have a panel fitter */ 1011e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson if (IS_I830(dev)) 1012e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson return -1; 1013e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 1014e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson pfit_control = I915_READ(PFIT_CONTROL); 1015e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 1016e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson /* See if the panel fitter is in use */ 1017e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson if ((pfit_control & PFIT_ENABLE) == 0) 1018e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson return -1; 1019e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 1020e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson /* 965 can place panel fitter on either pipe */ 1021a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (IS_GEN4(dev)) 1022e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson return (pfit_control >> 29) & 0x3; 1023e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 1024e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson /* older chips can only use pipe 1 */ 1025e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson return 1; 1026e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson} 1027e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson 102802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterint intel_overlay_put_image(struct drm_device *dev, void *data, 10290206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi struct drm_file *file_priv) 103002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 103102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_intel_overlay_put_image *put_image_rec = data; 103202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter drm_i915_private_t *dev_priv = dev->dev_private; 103302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct intel_overlay *overlay; 103402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_mode_object *drmmode_obj; 103502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct intel_crtc *crtc; 103605394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *new_bo; 103702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct put_image_params *params; 103802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret; 103902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 10401cff8f6b4c668a060c7e3f82d3f1fb5aaa37edc4Daniel Vetter /* No need to check for DRIVER_MODESET - we don't set it up then. */ 104102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay = dev_priv->overlay; 104202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!overlay) { 104302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter DRM_DEBUG("userspace bug: no overlay\n"); 104402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -ENODEV; 104502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 104602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 104702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!(put_image_rec->flags & I915_OVERLAY_ENABLE)) { 1048a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_lock_all(dev); 104902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_lock(&dev->struct_mutex); 105002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1051ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilson ret = intel_overlay_switch_off(overlay); 105202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 105302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_unlock(&dev->struct_mutex); 1054a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_unlock_all(dev); 105502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 105602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 105702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 105802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 105902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params = kmalloc(sizeof(struct put_image_params), GFP_KERNEL); 106002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!params) 106102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -ENOMEM; 106202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 106302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id, 1064722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson DRM_MODE_OBJECT_CRTC); 1065915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter if (!drmmode_obj) { 1066915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter ret = -ENOENT; 1067915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter goto out_free; 1068915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter } 106902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); 107002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 107105394f3975dceb107a5e1393e2244946e5b43660Chris Wilson new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv, 107205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson put_image_rec->bo_handle)); 1073c87252266352c5201e2925740018f52578fa92bbChris Wilson if (&new_bo->base == NULL) { 1074915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter ret = -ENOENT; 1075915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter goto out_free; 1076915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenter } 107702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1078a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_lock_all(dev); 107902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_lock(&dev->struct_mutex); 108002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1081d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson if (new_bo->tiling_mode) { 1082d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson DRM_ERROR("buffer used for overlay image can not be tiled\n"); 1083d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson ret = -EINVAL; 1084d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson goto out_unlock; 1085d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson } 1086d9e86c0ee60f323e890484628f351bf50fa9a15dChris Wilson 1087ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilson ret = intel_overlay_recover_from_interrupt(overlay); 1088b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson if (ret != 0) 1089b303cf9542b016e2af3b9d17255a7f93cd790ef5Chris Wilson goto out_unlock; 109003f77ea5972e6a2363152aec692744cac824dabaDaniel Vetter 109102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (overlay->crtc != crtc) { 109202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_display_mode *mode = &crtc->base.mode; 1093ce453d81cb0397aa7d5148984f51907e14072d74Chris Wilson ret = intel_overlay_switch_off(overlay); 109402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 109502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 109602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 109702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = check_overlay_possible_on_crtc(overlay, crtc); 109802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 109902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 110002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 110102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->crtc = crtc; 110202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter crtc->overlay = overlay; 110302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1104e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson /* line too wide, i.e. one-line-mode */ 1105e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson if (mode->hdisplay > 1024 && 1106e9e331a8abeece1565d383510ed985945132ffe3Chris Wilson intel_panel_fitter_pipe(dev) == crtc->pipe) { 110702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->pfit_active = 1; 110802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_pfit_vscale_ratio(overlay); 110902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } else 111002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->pfit_active = 0; 111102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 111202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 111302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = check_overlay_dst(overlay, put_image_rec); 111402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 111502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 111602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 111702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (overlay->pfit_active) { 111802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_y = ((((u32)put_image_rec->dst_y) << 12) / 1119722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson overlay->pfit_vscale_ratio); 112002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* shifting right rounds downwards, so add 1 */ 112102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_h = ((((u32)put_image_rec->dst_height) << 12) / 1122722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson overlay->pfit_vscale_ratio) + 1; 112302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } else { 112402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_y = put_image_rec->dst_y; 112502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_h = put_image_rec->dst_height; 112602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 112702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_x = put_image_rec->dst_x; 112802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->dst_w = put_image_rec->dst_width; 112902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 113002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->src_w = put_image_rec->src_width; 113102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->src_h = put_image_rec->src_height; 113202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->src_scan_w = put_image_rec->src_scan_width; 113302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->src_scan_h = put_image_rec->src_scan_height; 1134722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (params->src_scan_h > params->src_h || 1135722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson params->src_scan_w > params->src_w) { 113602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = -EINVAL; 113702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 113802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 113902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 114002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = check_overlay_src(dev, put_image_rec, new_bo); 114102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 114202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 114302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->format = put_image_rec->flags & ~I915_OVERLAY_FLAGS_MASK; 114402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->stride_Y = put_image_rec->stride_Y; 114502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->stride_UV = put_image_rec->stride_UV; 114602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->offset_Y = put_image_rec->offset_Y; 114702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->offset_U = put_image_rec->offset_U; 114802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter params->offset_V = put_image_rec->offset_V; 114902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 115002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* Check scaling after src size to prevent a divide-by-zero. */ 115102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = check_overlay_scaling(params); 115202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 115302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 115402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 115502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = intel_overlay_do_put_image(overlay, new_bo, params); 115602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret != 0) 115702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 115802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 115902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_unlock(&dev->struct_mutex); 1160a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_unlock_all(dev); 116102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 116202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter kfree(params); 116302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 116402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 116502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 116602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterout_unlock: 116702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_unlock(&dev->struct_mutex); 1168a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_unlock_all(dev); 116905394f3975dceb107a5e1393e2244946e5b43660Chris Wilson drm_gem_object_unreference_unlocked(&new_bo->base); 1170915a428e43acfd05e4ffeaf40549b0cf163eebe2Dan Carpenterout_free: 117102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter kfree(params); 117202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 117302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 117402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 117502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 117602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic void update_reg_attrs(struct intel_overlay *overlay, 117775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs) 117802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 117975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff), 118075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky ®s->OCLRC0); 118175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky iowrite32(overlay->saturation, ®s->OCLRC1); 118202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 118302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 118402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic bool check_gamma_bounds(u32 gamma1, u32 gamma2) 118502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 118602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int i; 118702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 118802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (gamma1 & 0xff000000 || gamma2 & 0xff000000) 118902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return false; 119002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 119102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter for (i = 0; i < 3; i++) { 1192722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (((gamma1 >> i*8) & 0xff) >= ((gamma2 >> i*8) & 0xff)) 119302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return false; 119402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 119502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 119602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return true; 119702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 119802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 119902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic bool check_gamma5_errata(u32 gamma5) 120002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 120102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int i; 120202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 120302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter for (i = 0; i < 3; i++) { 120402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (((gamma5 >> i*8) & 0xff) == 0x80) 120502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return false; 120602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 120702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 120802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return true; 120902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 121002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 121102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterstatic int check_gamma(struct drm_intel_overlay_attrs *attrs) 121202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 1213722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson if (!check_gamma_bounds(0, attrs->gamma0) || 1214722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma0, attrs->gamma1) || 1215722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma1, attrs->gamma2) || 1216722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma2, attrs->gamma3) || 1217722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma3, attrs->gamma4) || 1218722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma4, attrs->gamma5) || 1219722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson !check_gamma_bounds(attrs->gamma5, 0x00ffffff)) 122002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 1221722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 122202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!check_gamma5_errata(attrs->gamma5)) 122302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -EINVAL; 1224722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson 122502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return 0; 122602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 122702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 122802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterint intel_overlay_attrs(struct drm_device *dev, void *data, 12290206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi struct drm_file *file_priv) 123002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 123102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct drm_intel_overlay_attrs *attrs = data; 12320206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi drm_i915_private_t *dev_priv = dev->dev_private; 123302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct intel_overlay *overlay; 123475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 123502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret; 123602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 12371cff8f6b4c668a060c7e3f82d3f1fb5aaa37edc4Daniel Vetter /* No need to check for DRIVER_MODESET - we don't set it up then. */ 123802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay = dev_priv->overlay; 123902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!overlay) { 124002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter DRM_DEBUG("userspace bug: no overlay\n"); 124102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return -ENODEV; 124202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 124302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1244a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_lock_all(dev); 124502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_lock(&dev->struct_mutex); 124602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 124760fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson ret = -EINVAL; 124802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!(attrs->flags & I915_OVERLAY_UPDATE_ATTRS)) { 124960fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson attrs->color_key = overlay->color_key; 125002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->brightness = overlay->brightness; 125160fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson attrs->contrast = overlay->contrast; 125202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->saturation = overlay->saturation; 125302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 1254a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (!IS_GEN2(dev)) { 125502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma0 = I915_READ(OGAMC0); 125602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma1 = I915_READ(OGAMC1); 125702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma2 = I915_READ(OGAMC2); 125802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma3 = I915_READ(OGAMC3); 125902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma4 = I915_READ(OGAMC4); 126002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter attrs->gamma5 = I915_READ(OGAMC5); 126102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 126202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } else { 126360fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson if (attrs->brightness < -128 || attrs->brightness > 127) 126402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 126560fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson if (attrs->contrast > 255) 126602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 126760fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson if (attrs->saturation > 1023) 126802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 126902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 127060fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson overlay->color_key = attrs->color_key; 127160fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson overlay->brightness = attrs->brightness; 127260fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson overlay->contrast = attrs->contrast; 127360fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson overlay->saturation = attrs->saturation; 127402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 12758d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson regs = intel_overlay_map_regs(overlay); 127602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!regs) { 127702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = -ENOMEM; 127802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 127902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 128002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 128102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_reg_attrs(overlay, regs); 128202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 12839bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson intel_overlay_unmap_regs(overlay, regs); 128402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 128502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (attrs->flags & I915_OVERLAY_UPDATE_GAMMA) { 1286a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (IS_GEN2(dev)) 128702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 128802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 128902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (overlay->active) { 129002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = -EBUSY; 129102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 129202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 129302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 129402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = check_gamma(attrs); 129560fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson if (ret) 129602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_unlock; 129702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 129802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC0, attrs->gamma0); 129902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC1, attrs->gamma1); 130002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC2, attrs->gamma2); 130102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC3, attrs->gamma3); 130202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC4, attrs->gamma4); 130302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter I915_WRITE(OGAMC5, attrs->gamma5); 130402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 130502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 130602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 130760fc332cb5ab19e5a86d696b210df65814b2ad8aChris Wilson ret = 0; 130802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterout_unlock: 130902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter mutex_unlock(&dev->struct_mutex); 1310a0e99e68c12ac6dc5d6b1da7942b5e05d5f848afDaniel Vetter drm_modeset_unlock_all(dev); 131102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 131202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return ret; 131302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 131402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 131502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vettervoid intel_setup_overlay(struct drm_device *dev) 131602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 13170206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi drm_i915_private_t *dev_priv = dev->dev_private; 131802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter struct intel_overlay *overlay; 131905394f3975dceb107a5e1393e2244946e5b43660Chris Wilson struct drm_i915_gem_object *reg_bo; 132075020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 132102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter int ret; 132202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 132331578148b2c62612f9516fdcf5ebb64ab32ed12dChris Wilson if (!HAS_OVERLAY(dev)) 132402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return; 132502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 132602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL); 132702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!overlay) 132802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return; 132979d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson 133079d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson mutex_lock(&dev->struct_mutex); 133179d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson if (WARN_ON(dev_priv->overlay)) 133279d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson goto out_free; 133379d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson 133402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->dev = dev; 133502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 13368040513870399f1cb032cb8bc805df5042fedcdfChris Wilson reg_bo = i915_gem_object_create_stolen(dev, PAGE_SIZE); 13378040513870399f1cb032cb8bc805df5042fedcdfChris Wilson if (reg_bo == NULL) 13388040513870399f1cb032cb8bc805df5042fedcdfChris Wilson reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); 13398040513870399f1cb032cb8bc805df5042fedcdfChris Wilson if (reg_bo == NULL) 134002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter goto out_free; 134105394f3975dceb107a5e1393e2244946e5b43660Chris Wilson overlay->reg_bo = reg_bo; 134202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 134331578148b2c62612f9516fdcf5ebb64ab32ed12dChris Wilson if (OVERLAY_NEEDS_PHYSICAL(dev)) { 134402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter ret = i915_gem_attach_phys_object(dev, reg_bo, 13456eeefaf3c86b8937db8ad930c48bfb592fc5e32eChris Wilson I915_GEM_PHYS_OVERLAY_REGS, 1346a29301288f1840bdf9c5456da9cd7c944436edd5Chris Wilson PAGE_SIZE); 13470206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi if (ret) { 13480206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi DRM_ERROR("failed to attach phys overlay regs\n"); 13490206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi goto out_free_bo; 13500206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi } 135105394f3975dceb107a5e1393e2244946e5b43660Chris Wilson overlay->flip_addr = reg_bo->phys_obj->handle->busaddr; 135231578148b2c62612f9516fdcf5ebb64ab32ed12dChris Wilson } else { 135386a1ee26bb60e1ab8984e92f0e9186c354670aedChris Wilson ret = i915_gem_object_pin(reg_bo, PAGE_SIZE, true, false); 135402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (ret) { 13550206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi DRM_ERROR("failed to pin overlay register bo\n"); 13560206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi goto out_free_bo; 13570206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi } 135805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson overlay->flip_addr = reg_bo->gtt_offset; 13590ddc1289f3ffd779779ddd3922f26ae7d0a21604Chris Wilson 13600ddc1289f3ffd779779ddd3922f26ae7d0a21604Chris Wilson ret = i915_gem_object_set_to_gtt_domain(reg_bo, true); 13610ddc1289f3ffd779779ddd3922f26ae7d0a21604Chris Wilson if (ret) { 13620206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi DRM_ERROR("failed to move overlay register bo into the GTT\n"); 13630206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi goto out_unpin_bo; 13640206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi } 136502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter } 136602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 136702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter /* init all values */ 136802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->color_key = 0x0101fe; 136902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->brightness = -19; 137002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->contrast = 75; 137102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter overlay->saturation = 146; 137202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 13738d74f656dd78ae1ba813389cd46197c6329696bcChris Wilson regs = intel_overlay_map_regs(overlay); 137402e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter if (!regs) 137579d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson goto out_unpin_bo; 137602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 137775020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky memset_io(regs, 0, sizeof(struct overlay_registers)); 137802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_polyphase_filter(regs); 137902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter update_reg_attrs(overlay, regs); 138002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 13819bb2ff731b32c023e7a502efdc0dee46157290d5Chris Wilson intel_overlay_unmap_regs(overlay, regs); 138202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 138302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter dev_priv->overlay = overlay; 138479d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson mutex_unlock(&dev->struct_mutex); 138502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter DRM_INFO("initialized overlay support\n"); 138602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return; 138702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 13880ddc1289f3ffd779779ddd3922f26ae7d0a21604Chris Wilsonout_unpin_bo: 138979d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson if (!OVERLAY_NEEDS_PHYSICAL(dev)) 139079d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson i915_gem_object_unpin(reg_bo); 139102e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterout_free_bo: 139205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson drm_gem_object_unreference(®_bo->base); 139302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetterout_free: 139479d2427338e8da362678de32a1c8af1dc8a9810aChris Wilson mutex_unlock(&dev->struct_mutex); 139502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter kfree(overlay); 139602e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter return; 139702e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 139802e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 139902e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vettervoid intel_cleanup_overlay(struct drm_device *dev) 140002e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter{ 1401722506f04dae7c88193dab2fc836ff15070190f0Chris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 140202e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 140362cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson if (!dev_priv->overlay) 140462cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson return; 140502e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter 140662cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson /* The bo's should be free'd by the generic code already. 140762cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson * Furthermore modesetting teardown happens beforehand so the 140862cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson * hardware should be off already */ 140962cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson BUG_ON(dev_priv->overlay->active); 141062cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson 141162cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base); 141262cf4e6fef35b4422e206b63b7f0ac90261d4ad9Chris Wilson kfree(dev_priv->overlay); 141302e792fbaadb75dec8e476a05b610e49908fc6a4Daniel Vetter} 14146ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14153bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson#ifdef CONFIG_DEBUG_FS 14163bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson#include <linux/seq_file.h> 14173bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14186ef3d4278034982c13df87c4a51e0445f762d316Chris Wilsonstruct intel_overlay_error_state { 14196ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson struct overlay_registers regs; 14206ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson unsigned long base; 14216ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson u32 dovsta; 14226ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson u32 isr; 14236ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson}; 14246ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 142575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawskystatic struct overlay_registers __iomem * 1426c48c43e422c1404fd72c57d1d21a6f6d01e18900Linus Torvaldsintel_overlay_map_regs_atomic(struct intel_overlay *overlay) 14273bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson{ 1428c48c43e422c1404fd72c57d1d21a6f6d01e18900Linus Torvalds drm_i915_private_t *dev_priv = overlay->dev->dev_private; 142975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs; 14303bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14313bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) 143275020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky /* Cast to make sparse happy, but it's wc memory anyway, so 143375020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky * equivalent to the wc io mapping on X86. */ 143475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky regs = (struct overlay_registers __iomem *) 143575020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky overlay->reg_bo->phys_obj->handle->vaddr; 14363bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson else 14375d4545aef561ad47f91bcf75814af20c104b5a9eBen Widawsky regs = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, 1438c48c43e422c1404fd72c57d1d21a6f6d01e18900Linus Torvalds overlay->reg_bo->gtt_offset); 14393bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14403bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson return regs; 14413bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson} 14423bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14433bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilsonstatic void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay, 144475020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky struct overlay_registers __iomem *regs) 14453bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson{ 14463bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) 1447c48c43e422c1404fd72c57d1d21a6f6d01e18900Linus Torvalds io_mapping_unmap_atomic(regs); 14483bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson} 14493bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14503bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson 14516ef3d4278034982c13df87c4a51e0445f762d316Chris Wilsonstruct intel_overlay_error_state * 14526ef3d4278034982c13df87c4a51e0445f762d316Chris Wilsonintel_overlay_capture_error_state(struct drm_device *dev) 14536ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson{ 14540206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi drm_i915_private_t *dev_priv = dev->dev_private; 14556ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson struct intel_overlay *overlay = dev_priv->overlay; 14566ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson struct intel_overlay_error_state *error; 14576ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson struct overlay_registers __iomem *regs; 14586ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14596ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson if (!overlay || !overlay->active) 14606ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson return NULL; 14616ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14626ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson error = kmalloc(sizeof(*error), GFP_ATOMIC); 14636ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson if (error == NULL) 14646ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson return NULL; 14656ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14666ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson error->dovsta = I915_READ(DOVSTA); 14676ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson error->isr = I915_READ(ISR); 146831578148b2c62612f9516fdcf5ebb64ab32ed12dChris Wilson if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) 146975020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky error->base = (__force long)overlay->reg_bo->phys_obj->handle->vaddr; 147031578148b2c62612f9516fdcf5ebb64ab32ed12dChris Wilson else 147175020bc11c2fa4c060d45b8d0e3f6a37109725bcBen Widawsky error->base = overlay->reg_bo->gtt_offset; 14726ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14736ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson regs = intel_overlay_map_regs_atomic(overlay); 14746ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson if (!regs) 14756ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson goto err; 14766ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14776ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson memcpy_fromio(&error->regs, regs, sizeof(struct overlay_registers)); 1478c48c43e422c1404fd72c57d1d21a6f6d01e18900Linus Torvalds intel_overlay_unmap_regs_atomic(overlay, regs); 14796ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14806ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson return error; 14816ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14826ef3d4278034982c13df87c4a51e0445f762d316Chris Wilsonerr: 14836ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson kfree(error); 14846ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson return NULL; 14856ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson} 14866ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 14876ef3d4278034982c13df87c4a51e0445f762d316Chris Wilsonvoid 1488edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppalaintel_overlay_print_error_state(struct drm_i915_error_state_buf *m, 1489edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala struct intel_overlay_error_state *error) 14906ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson{ 1491edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala i915_error_printf(m, "Overlay, status: 0x%08x, interrupt: 0x%08x\n", 1492edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala error->dovsta, error->isr); 1493edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala i915_error_printf(m, " Register file at 0x%08lx:\n", 1494edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala error->base); 14956ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 1496edc3d8848dc9fe2a470316363dab8ef211d77e01Mika Kuoppala#define P(x) i915_error_printf(m, " " #x ": 0x%08x\n", error->regs.x) 14976ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_0Y); 14986ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_1Y); 14996ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_0U); 15006ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_0V); 15016ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_1U); 15026ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OBUF_1V); 15036ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTRIDE); 15046ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(YRGB_VPH); 15056ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(UV_VPH); 15066ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(HORZ_PH); 15076ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(INIT_PHS); 15086ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(DWINPOS); 15096ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(DWINSZ); 15106ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SWIDTH); 15116ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SWIDTHSW); 15126ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SHEIGHT); 15136ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(YRGBSCALE); 15146ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(UVSCALE); 15156ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OCLRC0); 15166ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OCLRC1); 15176ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(DCLRKV); 15186ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(DCLRKM); 15196ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SCLRKVH); 15206ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SCLRKVL); 15216ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(SCLRKEN); 15226ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OCONFIG); 15236ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OCMD); 15246ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_0Y); 15256ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_1Y); 15266ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_0U); 15276ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_0V); 15286ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_1U); 15296ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OSTART_1V); 15306ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_0Y); 15316ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_1Y); 15326ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_0U); 15336ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_0V); 15346ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_1U); 15356ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(OTILEOFF_1V); 15366ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(FASTHSCALE); 15376ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson P(UVSCALEV); 15386ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson#undef P 15396ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson} 15403bd3c9329973a93fa3ef5e9840f2fd6fa2889e3fChris Wilson#endif 1541