17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
1162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang *
12f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
1562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang *
16f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Binglin Chen <binglin.chen@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Jason Hu <jason.hu@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zeng Li <zeng.li@intel.com>
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/*
32f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Most of rendering codes are ported from xf86-video-i810/src/i810_overlay.c
33bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
34bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
38fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <stdio.h>
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <math.h>
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h>
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drv_video.h"
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h"
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_overlay.h"
45c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
462befccec034c13d34746a9e87149889d59ac767bFei Jiang
472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#ifdef ANDROID
4854752e65b02b1a84c491e3f9c964046faeea306eKun Wang#define psb_xrandr_single_mode() 0
49bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#else
50bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangint psb_xrandr_single_mode();
512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif
522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData
542befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
552befccec034c13d34746a9e87149889d59ac767bFei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
56cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan//#define GET_SURFACE_INFO_rotate(psb_surface) ((int) (psb_surface)->extra_info[5])
572befccec034c13d34746a9e87149889d59ac767bFei Jiang
582befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifndef VA_FOURCC_I420
592befccec034c13d34746a9e87149889d59ac767bFei Jiang#define VA_FOURCC_I420          0x30323449
602befccec034c13d34746a9e87149889d59ac767bFei Jiang#endif
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/**********************************************************************************************
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * I830ResetVideo
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Description: Use this function to reset the overlay register back buffer to its default
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * values.  Note that this function does not actually apply these values.  To do so, please
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * write to OVADD.
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang **********************************************************************************************/
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void
704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoI830ResetVideo(VADriverContextP ctx, PsbPortPrivPtr pPriv)
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_DRIVER_DATA;
732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    I830OverlayRegPtr overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]);
742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    I830OverlayRegPtr overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]);
752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memset(overlayA, 0, sizeof(*overlayA));
772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memset(overlayC, 0, sizeof(*overlayC));
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff);
802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->OCLRC1 = pPriv->saturation.Value;
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff);
832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->OCLRC1 = pPriv->saturation.Value;
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DCLRK
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* case bit depth 16 */
874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlayA->DCLRKV = pPriv->colorKey;
882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->DCLRKM |= DEST_KEY_ENABLE;
892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->DCLRKM &= ~CONST_ALPHA_ENABLE;
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlayC->DCLRKV = pPriv->colorKey;
922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->DCLRKM |= DEST_KEY_ENABLE;
932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->DCLRKM &= ~CONST_ALPHA_ENABLE;
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->DCLRKM &= ~DEST_KEY_ENABLE;
962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->DCLRKM &= ~DEST_KEY_ENABLE;
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->DWINSZ = 0x00000000;
992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA->OCONFIG = CC_OUT_8BIT;
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->DWINSZ = 0x00000000;
1022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayC->OCONFIG = CC_OUT_8BIT;
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGammaElt(uint32_t elt, uint32_t eltPrev)
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    elt &= 0xff;
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    eltPrev &= 0xff;
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (elt < eltPrev)
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt = eltPrev;
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else if ((elt - eltPrev) > 0x7e)
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt = eltPrev + 0x7e;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return elt;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGamma(uint32_t gamma, uint32_t gammaPrev)
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return (I830BoundGammaElt(gamma >> 24, gammaPrev >> 24) << 24 |
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            I830BoundGammaElt(gamma >> 16, gammaPrev >> 16) << 16 |
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            I830BoundGammaElt(gamma >>  8, gammaPrev >>  8) <<  8 |
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            I830BoundGammaElt(gamma      , gammaPrev));
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangI830UpdateGamma(VADriverContextP ctx, PsbPortPrivPtr pPriv)
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
127b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma0 = pPriv->gamma0;
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma1 = pPriv->gamma1;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma2 = pPriv->gamma2;
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma3 = pPriv->gamma3;
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma4 = pPriv->gamma4;
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t gamma5 = pPriv->gamma5;
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_register_rw_arg regs;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    gamma1 = I830BoundGamma(gamma1, gamma0);
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    gamma2 = I830BoundGamma(gamma2, gamma1);
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    gamma3 = I830BoundGamma(gamma3, gamma2);
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    gamma4 = I830BoundGamma(gamma4, gamma3);
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    gamma5 = I830BoundGamma(gamma5, gamma4);
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(&regs, 0, sizeof(regs));
1442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (pPriv->is_mfld)
1452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL | OVC_REGRWBITS_OGAM_ALL;
1462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    else
1472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL;
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC0 = gamma0;
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC1 = gamma1;
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC2 = gamma2;
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC3 = gamma3;
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC4 = gamma4;
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    regs.overlay.OGAMC5 = gamma5;
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
155b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
158437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void I830StopVideo(VADriverContextP ctx)
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
160b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
1622befccec034c13d34746a9e87149889d59ac767bFei Jiang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
1633f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    I830OverlayRegPtr overlayA, overlayC;
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_register_rw_arg regs;
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1663f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    if (!pPriv->overlayA_enabled && !pPriv->overlayC_enabled) {
167c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "I830StopVideo : no overlay has been enabled, do nothing.\n");
1683f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        return;
1693f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
1703f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
1713f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]);
1723f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]);
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(&regs, 0, sizeof(regs));
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pPriv->subpicture_enabled) {
1782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.subpicture_disable_mask = pPriv->subpicture_enable_mask;
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->subpicture_enabled = 0;
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
1812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memset(&regs, 0, sizeof(regs));
1842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (pPriv->is_mfld && psb_xrandr_single_mode() == 0) {
1862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        if (pPriv->overlayC_enabled) {
1874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            regs.overlay_read_mask = OVC_REGRWBITS_OVADD;
188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
19054752e65b02b1a84c491e3f9c964046faeea306eKun Wang            overlayC->DWINSZ = 0x00000000;
1914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            overlayC->OCMD &= ~OVERLAY_ENABLE;
1924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            regs.overlay_read_mask = 0;
1932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            regs.overlay_write_mask = OVC_REGRWBITS_OVADD;
19462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            regs.overlay.b_wait_vblank = 1;
195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
1964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            memset(&regs, 0, sizeof(regs));
1984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            pPriv->overlayC_enabled = 0;
1992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        }
2002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        if (pPriv->overlayA_enabled) {
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            regs.overlay_read_mask = OV_REGRWBITS_OVADD;
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20454752e65b02b1a84c491e3f9c964046faeea306eKun Wang            overlayA->DWINSZ = 0x00000000;
2054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            overlayA->OCMD &= ~OVERLAY_ENABLE;
2064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            regs.overlay_read_mask = 0;
2074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            regs.overlay_write_mask = OV_REGRWBITS_OVADD;
20862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            regs.overlay.b_wait_vblank = 1;
209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
2104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            pPriv->overlayA_enabled = 0;
2112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        }
2122f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    } else {
21354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.overlay_read_mask = OV_REGRWBITS_OVADD;
21454752e65b02b1a84c491e3f9c964046faeea306eKun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
21554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
21654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        overlayA->DWINSZ = 0x00000000;
21754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        overlayA->OCMD &= ~OVERLAY_ENABLE;
21854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.overlay_read_mask = 0;
2192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.overlay_write_mask = OV_REGRWBITS_OVADD;
22062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        regs.overlay.b_wait_vblank = 1;
2212f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
22254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        pPriv->overlayA_enabled = 0;
2232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
224b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
227ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0
2284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void I830SwitchPipe(VADriverContextP ctx , int overlayId, int pipeId)
2294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
2304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_DRIVER_DATA;
2314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]);
2334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    struct drm_psb_register_rw_arg regs;
2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t overlay_mask;
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if ((overlayId == OVERLAY_A) && pPriv->overlayA_enabled)
2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        overlay_mask = OV_REGRWBITS_OVADD;
2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else if ((overlayId == OVERLAY_C) && pPriv->overlayC_enabled)
2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        overlay_mask = OVC_REGRWBITS_OVADD;
2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return;  /*No overlay enabled, do nothing.*/
2424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
243c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Overlay %d switch to pipe %d\n", overlayId, pipeId);
2444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(&regs, 0, sizeof(regs));
2454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(overlay, 0, sizeof(*overlay));
2464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff);
2474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->OCLRC1 = pPriv->saturation.Value;
2484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* case bit depth 16 */
2504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->DCLRKV = pPriv->colorKey;
2514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->DCLRKM |= DEST_KEY_ENABLE;
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    overlay->DCLRKM &= ~CONST_ALPHA_ENABLE;
2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->DWINSZ = 0x00000000;
2544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->OCONFIG = CC_OUT_8BIT;
2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    regs.overlay_read_mask = overlay_mask;
2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (pipeId) {
2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    case PIPEA:
261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        overlay->OCONFIG |= OVERLAY_C_PIPE_A;
2624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
2634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    case PIPEB:
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        overlay->OCONFIG |= OVERLAY_C_PIPE_B;
2654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
2664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    case PIPEC:
2674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        overlay->OCONFIG |= OVERLAY_C_PIPE_C;
2684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
2694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    regs.overlay_read_mask = 0;
2714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    regs.overlay_write_mask = overlay_mask;
2724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    regs.overlay.b_wait_vblank = 1;
2734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
2744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
275ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif
2764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuni830_swidth(unsigned int offset, unsigned int width, unsigned int mask, int shift)
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int swidth = ((offset + width + mask) >> shift) - (offset >> shift);
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    swidth <<= 1;
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    swidth -= 1;
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return swidth << 2;
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic Bool
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangSetCoeffRegs(double *coeff, int mantSize, coeffPtr pCoeff, int pos)
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int maxVal, icoeff, res;
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int sign;
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    double c;
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sign = 0;
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    maxVal = 1 << mantSize;
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    c = *coeff;
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (c < 0.0) {
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sign = 1;
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        c = -c;
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    res = 12 - mantSize;
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) {
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].exponent = 3;
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].mantissa = icoeff << res;
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *coeff = (double)icoeff / (double)(4 * maxVal);
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) {
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].exponent = 2;
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].mantissa = icoeff << res;
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *coeff = (double)icoeff / (double)(2 * maxVal);
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) {
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].exponent = 1;
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].mantissa = icoeff << res;
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *coeff = (double)icoeff / (double)(maxVal);
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) {
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].exponent = 0;
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pCoeff[pos].mantissa = icoeff << res;
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *coeff = (double)icoeff / (double)(maxVal / 2);
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else {
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Coeff out of range */
3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return FALSE;
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pCoeff[pos].sign = sign;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (sign)
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *coeff = -(*coeff);
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return TRUE;
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangUpdateCoeff(int taps, double fCutoff, Bool isHoriz, Bool isY, coeffPtr pCoeff)
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i, j, j1, num, pos, mantSize;
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    double pi = 3.1415926535, val, sinc, window, sum;
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS];
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    double diff;
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int tapAdjust[MAX_TAPS], tap2Fix;
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool isVertAndUV;
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (isHoriz)
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mantSize = 7;
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mantSize = 6;
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    isVertAndUV = !isHoriz && !isY;
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    num = taps * 16;
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for (i = 0; i < num  * 2; i++) {
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num);
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (val == 0.0)
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sinc = 1.0;
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        else
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sinc = sin(val) / val;
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Hamming window */
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        window = (0.5 - 0.5 * cos(i * pi / num));
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        rawCoeff[i] = sinc * window;
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for (i = 0; i < N_PHASES; i++) {
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Normalise the coefficients. */
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sum = 0.0;
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for (j = 0; j < taps; j++) {
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            pos = i + j * 32;
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sum += rawCoeff[pos];
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for (j = 0; j < taps; j++) {
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            pos = i + j * 32;
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            coeffs[i][j] = rawCoeff[pos] / sum;
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Set the register values. */
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for (j = 0; j < taps; j++) {
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            pos = j + i * taps;
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if ((j == (taps - 1) / 2) && !isVertAndUV)
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                SetCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos);
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            else
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                SetCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos);
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        tapAdjust[0] = (taps - 1) / 2;
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) {
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tapAdjust[j1] = tapAdjust[0] - j;
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tapAdjust[++j1] = tapAdjust[0] + j;
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Adjust the coefficients. */
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sum = 0.0;
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for (j = 0; j < taps; j++)
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sum += coeffs[i][j];
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (sum != 1.0) {
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            for (j1 = 0; j1 < taps; j1++) {
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                tap2Fix = tapAdjust[j1];
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                diff = 1.0 - sum;
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                coeffs[i][tap2Fix] += diff;
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                pos = tap2Fix + i * taps;
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV)
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    SetCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos);
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                else
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    SetCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos);
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                sum = 0.0;
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                for (j = 0; j < taps; j++)
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    sum += coeffs[i][j];
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (sum == 1.0)
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void
411437b3eda28a4bf098efa80598cab67f190275266Fei Jiangi830_display_video(
412cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VADriverContextP ctx, PsbPortPrivPtr pPriv, VASurfaceID __maybe_unused surface,
413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int id, short width, short height,
414cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    int dstPitch, int srcPitch, int __maybe_unused x1, int __maybe_unused y1, int __maybe_unused x2, int __maybe_unused y2, BoxPtr dstBox,
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    short src_w, short src_h, short drw_w, short drw_h,
4162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned int flags, int overlayId, int pipeId)
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
418b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int        swidth, swidthy, swidthuv;
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int        mask, shift, offsety, offsetu;
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int                 tmp;
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t            OCMD;
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool                scaleChanged = FALSE;
4252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned int        offset = wsbmBOOffsetHint(pPriv->wsbo[overlayId]) & 0x0FFFFFFF;
4262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    I830OverlayRegPtr   overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]);
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_register_rw_arg regs;
428f91c8768670386683a281cc39141e21bdda9c97fKun Wang    int i32EnableIEP = 0;
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int i32EnableIEPBLE = 0;
4305b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
4315b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    /*before enabling overlay, make sure overlay is disabled first.*/
4325b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    if ((overlayId == OVERLAY_A) && !pPriv->overlayA_enabled) {
4335b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        memset(&regs, 0, sizeof(regs));
4345b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        regs.overlay_read_mask = OV_REGRWBITS_OVADD;
4355b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
4365b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
4375b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        overlay->OCMD &= ~OVERLAY_ENABLE;
4385b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        regs.overlay_read_mask = 0;
4395b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        regs.overlay_write_mask = OV_REGRWBITS_OVADD;
4405b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
4415b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    }
4425b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* FIXME: don't know who and why add this
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     *        comment it for full screen scale issue
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     *        any concern contact qiang.miao@intel.com
446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     */
447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (drw_w >= 800) {
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        x2 = x2 / 4;
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        y2 = y2 / 4;
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        dstBox->x2 = dstBox->x2 / 4;
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        dstBox->y2 = dstBox->y2 / 4;
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drw_w = drw_w / 4;
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drw_h = drw_h / 4;
455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
457751400dde1eac64dd41c7de33fcddf8a939e4ab2hding
458751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#if USE_DCLRK
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    overlay->DCLRKM &= ~CONST_ALPHA_ENABLE;
4602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (pPriv->subpicture_enabled)
4612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        overlay->DCLRKM &= ~DEST_KEY_ENABLE;
4622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    else
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        overlay->DCLRKM |= DEST_KEY_ENABLE;
4644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    overlay->DCLRKV = pPriv->colorKey;
465751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    overlay->DCLRKM |= 0xffffff;
466751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#else
467751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    /* disable overlay destination color key didn't work,
468751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    * it seems z-order of overlay has been bellow display pipe.
469751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    */
470751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    overlay->DCLRKM &= ~DEST_KEY_ENABLE;
471751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#endif
472751400dde1eac64dd41c7de33fcddf8a939e4ab2hding
4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_ROTATION_FUNC
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (((pipeId == PIPEA) && (driver_data->mipi0_rotation != VA_ROTATION_NONE)) ||
4753f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((pipeId == PIPEB) && (driver_data->hdmi_rotation != VA_ROTATION_NONE))) {
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (pPriv->rotation) {
477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VA_ROTATION_NONE:
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VA_ROTATION_270:
480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x1;
481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x1 = dstBox->y1;
482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y1 = pPriv->height_save - tmp;
483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x2;
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x2 = dstBox->y2;
485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y2 = pPriv->height_save - tmp;
486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->y1;
487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y1 = dstBox->y2;
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y2 = tmp;
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = drw_w;
490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drw_w = drw_h;
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drw_h = tmp;
492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VA_ROTATION_180:
494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x1;
495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x1 = pPriv->width_save - dstBox->x2;
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x2 = pPriv->width_save - tmp;
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->y1;
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y1 = pPriv->height_save - dstBox->y2;
499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y2 = pPriv->height_save - tmp;
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VA_ROTATION_90:
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x1;
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x1 = pPriv->width_save - dstBox->y1;
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y1 = tmp;
505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x2;
506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x2 = pPriv->width_save - dstBox->y2;
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->y2 = tmp;
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = dstBox->x1;
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x1 = dstBox->x2;
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            dstBox->x2 = tmp;
511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = drw_w;
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drw_w = drw_h;
513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            drw_h = tmp;
514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (pPriv->oneLineMode) {
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* change the coordinates with panel fitting active */
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        dstBox->y1 = (((dstBox->y1 - 1) * pPriv->scaleRatio) >> 16) + 1;
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        dstBox->y2 = ((dstBox->y2 * pPriv->scaleRatio) >> 16) + 1;
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Now, alter the height, so we scale to the correct size */
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        drw_h = ((drw_h * pPriv->scaleRatio) >> 16) + 1;
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    shift = 6;
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mask = 0x3f;
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (pPriv->curBuf == 0) {
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        offsety = pPriv->YBuf0offset;
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        offsetu = pPriv->UBuf0offset;
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else {
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        offsety = pPriv->YBuf1offset;
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        offsetu = pPriv->UBuf1offset;
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    switch (id) {
540affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_NV12:
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16);
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        swidthy = i830_swidth(offsety, width, mask, shift);
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        swidthuv = i830_swidth(offsetu, width / 2, mask, shift);
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SWIDTHSW = (swidthy) | (swidthuv << 16);
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SHEIGHT = height | ((height / 2) << 16);
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
547affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YV12:
548affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_I420:
549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16);
550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        swidthy  = i830_swidth(offsety, width, mask, shift);
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        swidthuv = i830_swidth(offsetu, width / 2, mask, shift);
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SWIDTHSW = (swidthy) | (swidthuv << 16);
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SHEIGHT = height | ((height / 2) << 16);
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
555affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_UYVY:
556affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YUY2:
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    default:
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SWIDTH = width;
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        swidth = ((offsety + (width << 1) + mask) >> shift) -
560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 (offsety >> shift);
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        swidth <<= 1;
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        swidth -= 1;
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        swidth <<= 2;
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SWIDTHSW = swidth;
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->SHEIGHT = height;
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1;
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->DWINSZ = (((dstBox->y2 - dstBox->y1) << 16) |
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       (dstBox->x2 - dstBox->x1));
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* buffer locations */
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_0Y = pPriv->YBuf0offset;
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_0U = pPriv->UBuf0offset;
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_0V = pPriv->VBuf0offset;
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_1Y = pPriv->YBuf1offset;
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_1U = pPriv->UBuf1offset;
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OBUF_1V = pPriv->VBuf1offset;
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Calculate horizontal and vertical scaling factors and polyphase
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * coefficients.
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (1) {
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int xscaleIntUV, xscaleFractUV;
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int yscaleIntUV, yscaleFractUV;
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* UV is half the size of Y -- YUV420 */
5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int uvratio = 2;
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t newval;
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES];
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES];
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int i, j, pos;
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int deinterlace_factor;
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Y down-scale factor as a multiple of 4096.
6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((id == VA_FOURCC_NV12) && (0 != (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD))))
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            deinterlace_factor = 2;
6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        else
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            deinterlace_factor = 1;
6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* deinterlace requires twice of VSCALE setting*/
610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (src_w == drw_w && src_h == drw_h) {
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            xscaleFract = 1 << 12;
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            yscaleFract = (1 << 12) / deinterlace_factor;
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            xscaleFract = ((src_w - 1) << 12) / drw_w;
6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            yscaleFract = ((src_h - 1) << 12) / (deinterlace_factor * drw_h);
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Calculate the UV scaling factor. */
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        xscaleFractUV = xscaleFract / uvratio;
6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        yscaleFractUV = yscaleFract / uvratio;
6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * To keep the relative Y and UV ratios exact, round the Y scales
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * to a multiple of the Y/UV ratio.
6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        xscaleFract = xscaleFractUV * uvratio;
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        yscaleFract = yscaleFractUV * uvratio;
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Integer (un-multiplied) values. */
6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        xscaleInt = xscaleFract >> 12;
6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        yscaleInt = yscaleFract >> 12;
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        xscaleIntUV = xscaleFractUV >> 12;
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        yscaleIntUV = yscaleFractUV >> 12;
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* shouldn't get here */
6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (xscaleInt > 7) {
6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* shouldn't get here */
6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (xscaleIntUV > 7) {
6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pPriv->is_mfld)
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            newval = (xscaleInt << 15) |
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                     ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20);
649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        else
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            newval = (xscaleInt << 16) |
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                     ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20);
652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (newval != overlay->YRGBSCALE) {
6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            scaleChanged = TRUE;
6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            overlay->YRGBSCALE = newval;
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pPriv->is_mfld)
659437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) |
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                     ((yscaleFractUV & 0xFFF) << 20);
661437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        else
662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) |
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                     ((yscaleFractUV & 0xFFF) << 20);
664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (newval != overlay->UVSCALE) {
6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            scaleChanged = TRUE;
6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            overlay->UVSCALE = newval;
6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        newval = yscaleInt << 16 | yscaleIntUV;
6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (newval != overlay->UVSCALEV) {
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            scaleChanged = TRUE;
6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            overlay->UVSCALEV = newval;
6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Recalculate coefficients if the scaling changed. */
6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Only Horizontal coefficients so far.
6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (scaleChanged) {
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            double fCutoffY;
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            double fCutoffUV;
6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            fCutoffY = xscaleFract / 4096.0;
6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            fCutoffUV = xscaleFractUV / 4096.0;
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Limit to between 1.0 and 3.0. */
6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (fCutoffY < MIN_CUTOFF_FREQ)
6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                fCutoffY = MIN_CUTOFF_FREQ;
6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (fCutoffY > MAX_CUTOFF_FREQ)
6927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                fCutoffY = MAX_CUTOFF_FREQ;
6937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (fCutoffUV < MIN_CUTOFF_FREQ)
6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                fCutoffUV = MIN_CUTOFF_FREQ;
6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (fCutoffUV > MAX_CUTOFF_FREQ)
6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                fCutoffUV = MAX_CUTOFF_FREQ;
6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            UpdateCoeff(N_HORIZ_Y_TAPS, fCutoffY, TRUE, TRUE, xcoeffY);
6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            UpdateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, TRUE, FALSE, xcoeffUV);
7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            for (i = 0; i < N_PHASES; i++) {
7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                for (j = 0; j < N_HORIZ_Y_TAPS; j++) {
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    pos = i * N_HORIZ_Y_TAPS + j;
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    overlay->Y_HCOEFS[pos] = (xcoeffY[pos].sign << 15 |
7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                              xcoeffY[pos].exponent << 12 |
7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                              xcoeffY[pos].mantissa);
7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            for (i = 0; i < N_PHASES; i++) {
7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                for (j = 0; j < N_HORIZ_UV_TAPS; j++) {
7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    pos = i * N_HORIZ_UV_TAPS + j;
7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    overlay->UV_HCOEFS[pos] = (xcoeffUV[pos].sign << 15 |
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                               xcoeffUV[pos].exponent << 12 |
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                               xcoeffUV[pos].mantissa);
7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    OCMD = OVERLAY_ENABLE;
7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    switch (id) {
723affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_NV12:
7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->OSTRIDE = dstPitch | (dstPitch << 16);
7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~SOURCE_FORMAT;
7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~OV_BYTE_ORDER;
7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD |= NV12;//in the spec, there are two NV12, which to use?
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
729affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YV12:
730affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_I420:
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* set UV vertical phase to -0.25 */
732437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* overlay->UV_VPH = 0x30003000; */
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->OSTRIDE = (dstPitch * 2) | (dstPitch << 16);
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~SOURCE_FORMAT;
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~OV_BYTE_ORDER;
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD |= YUV_420;
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
738affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_UYVY:
739affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YUY2:
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        overlay->OSTRIDE = dstPitch;
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~SOURCE_FORMAT;
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD |= YUV_422;
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD &= ~OV_BYTE_ORDER;
744affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang        if (id == VA_FOURCC_UYVY)
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            OCMD |= Y_SWAP;
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD)) {
750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OCMD |= BUF_TYPE_FIELD;
751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OCMD &= ~FIELD_SELECT;
752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (flags & VA_BOTTOM_FIELD) {
754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            OCMD |= FIELD1;
755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_0Y = pPriv->YBuf0offset - srcPitch;
756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_0U = pPriv->UBuf0offset - srcPitch;
757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_0V = pPriv->VBuf0offset - srcPitch;
758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_1Y = pPriv->YBuf1offset - srcPitch;
759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_1U = pPriv->UBuf1offset - srcPitch;
760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OBUF_1V = pPriv->VBuf1offset - srcPitch;
761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else
762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            OCMD |= FIELD0;
763437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } else {
764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OCMD &= ~(FIELD_SELECT);
765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OCMD &= ~BUF_TYPE_FIELD;
7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    OCMD &= ~(BUFFER_SELECT);
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (pPriv->curBuf == 0)
7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD |= BUFFER0;
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        OCMD |= BUFFER1;
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    overlay->OCMD = OCMD;
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(&regs, 0, sizeof(regs));
778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (overlayId) {
7792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case OVERLAY_A:
7802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        pPriv->overlayA_enabled = 1;
7812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.overlay_write_mask = OV_REGRWBITS_OVADD;
7822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        break;
7832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case OVERLAY_C:
7842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        pPriv->overlayC_enabled = 1;
7852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        regs.overlay_write_mask = OVC_REGRWBITS_OVADD;
7862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        break;
7872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
7882befccec034c13d34746a9e87149889d59ac767bFei Jiang
789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pPriv->is_mfld) {
79062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        i32EnableIEP = 0;
791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
79262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        i32EnableIEPBLE = 0;
7932befccec034c13d34746a9e87149889d59ac767bFei Jiang
7942befccec034c13d34746a9e87149889d59ac767bFei Jiang        if (i32EnableIEP == 0) {
7952befccec034c13d34746a9e87149889d59ac767bFei Jiang            overlay->OCONFIG = CC_OUT_8BIT;
7962befccec034c13d34746a9e87149889d59ac767bFei Jiang            overlay->OCONFIG &= OVERLAY_C_PIPE_A | (~OVERLAY_C_PIPE_MASK);
7972befccec034c13d34746a9e87149889d59ac767bFei Jiang            overlay->OCONFIG |= IEP_LITE_BYPASS;
7982befccec034c13d34746a9e87149889d59ac767bFei Jiang            regs.overlay.OVADD = offset | 1;
7992befccec034c13d34746a9e87149889d59ac767bFei Jiang            regs.overlay.IEP_ENABLED = 0;
80062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            regs.overlay.buffer_handle = wsbmKBufHandle(wsbmKBuf(pPriv->wsbo[overlayId]));
801877c87ab252f7f62441423a29cdd1cbce8dd532fAustin Yuan        }
802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
803643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        overlay->OCONFIG = CC_OUT_8BIT;
804643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        overlay->OCONFIG |= IEP_LITE_BYPASS;
805643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        regs.overlay.OVADD = offset | 1;
806643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
8072befccec034c13d34746a9e87149889d59ac767bFei Jiang
808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pPriv->is_mfld) {
809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (pipeId) {
8102f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        case PIPEA:
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OCONFIG |= OVERLAY_C_PIPE_A;
812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OCONFIG |= ZORDER_TOP;
8132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            break;
814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case PIPEB:
815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OCONFIG |= OVERLAY_C_PIPE_B;
8162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            overlay->OCONFIG |= ZORDER_TOP;
8172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            regs.overlay.OVADD |= 0x80;
8182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            break;
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case PIPEC:
8202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            overlay->OCONFIG |= OVERLAY_C_PIPE_C;
821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            overlay->OCONFIG |= ZORDER_TOP;
8222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            regs.overlay.OVADD |= 0x40;
8232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            break;
8242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        }
8252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        overlay->OCONFIG |= ZORDER_TOP;
826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
8272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        overlay->OCONFIG |= pipeId << 18; /* mrst */
8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8299e01d13ef1fc6ecfcabcedb7269ed28a098f730dmahongpe    if (IS_CTP(driver_data) || IS_MRFL(driver_data) )
83060acc53b7127b8fbaec5cc53d695268c13659092Ma, Hongpeng        regs.overlay.b_wms = 1;
83160acc53b7127b8fbaec5cc53d695268c13659092Ma, Hongpeng
8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
8332befccec034c13d34746a9e87149889d59ac767bFei Jiang
834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pPriv->is_mfld) {
835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (regs.overlay.IEP_ENABLED) {
836dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0
837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            printf("regs.overlay BLE minmax 0x%x, BSSCC control 0x%x\n",
838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   regs.overlay.IEP_BLE_MINMAX, regs.overlay.IEP_BSSCC_CONTROL);
839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            *(unsigned int *)((unsigned int)&(overlay->IEP_SPACE[0]) + 0x804)  = regs.overlay.IEP_BLE_MINMAX;
8412befccec034c13d34746a9e87149889d59ac767bFei Jiang        }
8422befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
843b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8460da1930627209986e8db220799a690f816494401Austin Yuan
8470da1930627209986e8db220799a690f816494401Austin Yuanstatic void I830PutImageFlipRotateSurface(
8480da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx,
8495b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    object_surface_p obj_surface,
8500da1930627209986e8db220799a690f816494401Austin Yuan    int *src_w_new, int *src_h_new,
8510da1930627209986e8db220799a690f816494401Austin Yuan    int *width_new, int *height_new,
8520da1930627209986e8db220799a690f816494401Austin Yuan    psb_surface_p *psb_surface_new,
8530da1930627209986e8db220799a690f816494401Austin Yuan    int pipeId)
8540da1930627209986e8db220799a690f816494401Austin Yuan{
8550da1930627209986e8db220799a690f816494401Austin Yuan    int src_w = *src_w_new, src_h =  *src_h_new;
8560da1930627209986e8db220799a690f816494401Austin Yuan    int width = *width_new, height = *height_new;
8570da1930627209986e8db220799a690f816494401Austin Yuan    int  tmp = 0;
8585b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
8590da1930627209986e8db220799a690f816494401Austin Yuan    psb_surface_p psb_surface = NULL;
8600da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
8610da1930627209986e8db220799a690f816494401Austin Yuan    PsbPortPrivPtr pPriv;
8620da1930627209986e8db220799a690f816494401Austin Yuan
8634338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /* local/extend display doesn't have render rotation */
86462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    if (((pipeId == PIPEA) && (driver_data->local_rotation == VA_ROTATION_NONE)) ||
8653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((pipeId == PIPEB) && (driver_data->extend_rotation == VA_ROTATION_NONE)))
8660da1930627209986e8db220799a690f816494401Austin Yuan        return;
8670da1930627209986e8db220799a690f816494401Austin Yuan
8680da1930627209986e8db220799a690f816494401Austin Yuan    pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
8695b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
8700da1930627209986e8db220799a690f816494401Austin Yuan    if (pipeId == PIPEA) {
8710da1930627209986e8db220799a690f816494401Austin Yuan        if (driver_data->local_rotation != VA_ROTATION_NONE) {
8724d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            psb_surface = obj_surface->out_loop_surface;
8730da1930627209986e8db220799a690f816494401Austin Yuan            width = obj_surface->width_r;
8740da1930627209986e8db220799a690f816494401Austin Yuan            height = obj_surface->height_r;
8750da1930627209986e8db220799a690f816494401Austin Yuan            if (driver_data->local_rotation != VA_ROTATION_180) {
8760da1930627209986e8db220799a690f816494401Austin Yuan                tmp = src_w;
8770da1930627209986e8db220799a690f816494401Austin Yuan                src_w = src_h;
8780da1930627209986e8db220799a690f816494401Austin Yuan                src_h = tmp;
8790da1930627209986e8db220799a690f816494401Austin Yuan            }
8800da1930627209986e8db220799a690f816494401Austin Yuan        }
881f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if ((driver_data->local_rotation == VA_ROTATION_NONE) ||
8823f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            (driver_data->local_rotation == VA_ROTATION_180)) {
8830da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->width_save = pPriv->display_width;
8840da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->height_save = pPriv->display_height;
8850da1930627209986e8db220799a690f816494401Austin Yuan        } else {
8860da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->width_save = pPriv->display_height;
8870da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->height_save = pPriv->display_width;
8880da1930627209986e8db220799a690f816494401Austin Yuan        }
889f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if (driver_data->is_android == 0)
890f91c8768670386683a281cc39141e21bdda9c97fKun Wang            pPriv->rotation = driver_data->local_rotation;
891f91c8768670386683a281cc39141e21bdda9c97fKun Wang        else
892f91c8768670386683a281cc39141e21bdda9c97fKun Wang            pPriv->rotation = 0;
8930da1930627209986e8db220799a690f816494401Austin Yuan    } else if (pipeId == PIPEB) {
8940da1930627209986e8db220799a690f816494401Austin Yuan        if (driver_data->extend_rotation != VA_ROTATION_NONE) {
8954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            psb_surface = obj_surface->out_loop_surface;
8960da1930627209986e8db220799a690f816494401Austin Yuan            width = obj_surface->width_r;
8970da1930627209986e8db220799a690f816494401Austin Yuan            height = obj_surface->height_r;
8980da1930627209986e8db220799a690f816494401Austin Yuan            if (driver_data->extend_rotation != VA_ROTATION_180) {
8990da1930627209986e8db220799a690f816494401Austin Yuan                tmp = src_w;
9000da1930627209986e8db220799a690f816494401Austin Yuan                src_w = src_h;
9010da1930627209986e8db220799a690f816494401Austin Yuan                src_h = tmp;
9020da1930627209986e8db220799a690f816494401Austin Yuan            }
9030da1930627209986e8db220799a690f816494401Austin Yuan        }
904f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if ((driver_data->extend_rotation == VA_ROTATION_NONE) ||
9053f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            (driver_data->extend_rotation == VA_ROTATION_180)) {
9060da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->width_save = pPriv->extend_display_width;
9070da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->height_save = pPriv->extend_display_height;
9080da1930627209986e8db220799a690f816494401Austin Yuan        } else {
9090da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->width_save = pPriv->extend_display_height;
9100da1930627209986e8db220799a690f816494401Austin Yuan            pPriv->height_save = pPriv->extend_display_width;
9110da1930627209986e8db220799a690f816494401Austin Yuan        }
912f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if (driver_data->is_android == 0)
913f91c8768670386683a281cc39141e21bdda9c97fKun Wang            pPriv->rotation = driver_data->extend_rotation;
914f91c8768670386683a281cc39141e21bdda9c97fKun Wang        else
915f91c8768670386683a281cc39141e21bdda9c97fKun Wang            pPriv->rotation = 0;
9160da1930627209986e8db220799a690f816494401Austin Yuan    }
9170da1930627209986e8db220799a690f816494401Austin Yuan
9180da1930627209986e8db220799a690f816494401Austin Yuan    *src_w_new = src_w;
9190da1930627209986e8db220799a690f816494401Austin Yuan    *src_h_new = src_h;
9200da1930627209986e8db220799a690f816494401Austin Yuan    *width_new = width;
9210da1930627209986e8db220799a690f816494401Austin Yuan    *height_new = height;
9220da1930627209986e8db220799a690f816494401Austin Yuan    *psb_surface_new = psb_surface;
9230da1930627209986e8db220799a690f816494401Austin Yuan}
9240da1930627209986e8db220799a690f816494401Austin Yuan
9250da1930627209986e8db220799a690f816494401Austin Yuan
926cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic int I830PutImageFlipRotateDebug(
9270da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx,
9280da1930627209986e8db220799a690f816494401Austin Yuan    VASurfaceID surface,
929cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    short __maybe_unused src_x, short __maybe_unused src_y,
930cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    short __maybe_unused src_w, short __maybe_unused src_h,
931cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    short __maybe_unused drw_x, short __maybe_unused drw_y,
932cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    short __maybe_unused drw_w, short __maybe_unused drw_h,
933cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    int __maybe_unused fourcc, int __maybe_unused flags,
934cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    int __maybe_unused overlayId,
9350da1930627209986e8db220799a690f816494401Austin Yuan    int pipeId)
9360da1930627209986e8db220799a690f816494401Austin Yuan{
9370da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
9388bc6a6aa815a18f936036b5a47106b47aa904b1bhding    object_surface_p obj_surface;
9390da1930627209986e8db220799a690f816494401Austin Yuan    psb_surface_p psb_surface = NULL;
9408bc6a6aa815a18f936036b5a47106b47aa904b1bhding    VAStatus vaStatus = VA_STATUS_SUCCESS;
9418bc6a6aa815a18f936036b5a47106b47aa904b1bhding
9428bc6a6aa815a18f936036b5a47106b47aa904b1bhding    obj_surface = SURFACE(surface);
9438bc6a6aa815a18f936036b5a47106b47aa904b1bhding    CHECK_SURFACE(obj_surface);
9440da1930627209986e8db220799a690f816494401Austin Yuan
9450da1930627209986e8db220799a690f816494401Austin Yuan    if (pipeId != 0)
946cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        return -1;
9475b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
9484d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    psb_surface = obj_surface->out_loop_surface;
9490da1930627209986e8db220799a690f816494401Austin Yuan    psb_buffer_p buf = &psb_surface->buf;
9500da1930627209986e8db220799a690f816494401Austin Yuan    unsigned char *data, *chroma, *buffer, *header;
9510da1930627209986e8db220799a690f816494401Austin Yuan    static FILE *pf = NULL;
9520da1930627209986e8db220799a690f816494401Austin Yuan    int ret, i;
9530da1930627209986e8db220799a690f816494401Austin Yuan    if (!psb_surface)
9540da1930627209986e8db220799a690f816494401Austin Yuan        goto dump_out;
9550da1930627209986e8db220799a690f816494401Austin Yuan    if (pf == NULL)
9568bc6a6aa815a18f936036b5a47106b47aa904b1bhding        if ((pf = fopen("/home/dump.yuv", "w+")) == NULL) {
9570da1930627209986e8db220799a690f816494401Austin Yuan            printf("Open yuv file fails\n");
958cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            return -1;
9598bc6a6aa815a18f936036b5a47106b47aa904b1bhding        }
9600da1930627209986e8db220799a690f816494401Austin Yuan    ret = psb_buffer_map(buf, &data);
9610da1930627209986e8db220799a690f816494401Austin Yuan
9628bc6a6aa815a18f936036b5a47106b47aa904b1bhding    if (ret) {
9630da1930627209986e8db220799a690f816494401Austin Yuan        printf("Map buffer fail\n");
964cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        return -1;
9658bc6a6aa815a18f936036b5a47106b47aa904b1bhding    }
9660da1930627209986e8db220799a690f816494401Austin Yuan    for (i = 0; i < obj_surface->height_r; i++) {
9670da1930627209986e8db220799a690f816494401Austin Yuan        fwrite(data, 1, obj_surface->width_r, pf);
9680da1930627209986e8db220799a690f816494401Austin Yuan        data += psb_surface->stride;
9690da1930627209986e8db220799a690f816494401Austin Yuan    }
9700da1930627209986e8db220799a690f816494401Austin Yuan
9710da1930627209986e8db220799a690f816494401Austin Yuan    buffer = malloc(obj_surface->height_r * obj_surface->width_r);
9728bc6a6aa815a18f936036b5a47106b47aa904b1bhding    if (!buffer) {
9730da1930627209986e8db220799a690f816494401Austin Yuan        printf("Alloc chroma buffer fail\n");
974cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        return -1;
9758bc6a6aa815a18f936036b5a47106b47aa904b1bhding    }
9760da1930627209986e8db220799a690f816494401Austin Yuan    header = buffer;
9770da1930627209986e8db220799a690f816494401Austin Yuan    chroma = data;
9780da1930627209986e8db220799a690f816494401Austin Yuan    for (i = 0; i < obj_surface->height_r / 2; i++) {
9790da1930627209986e8db220799a690f816494401Austin Yuan        int j;
9800da1930627209986e8db220799a690f816494401Austin Yuan        for (j = 0; j < obj_surface->width_r / 2; j++) {
9810da1930627209986e8db220799a690f816494401Austin Yuan            *buffer++ = data[j*2];
9820da1930627209986e8db220799a690f816494401Austin Yuan        }
9830da1930627209986e8db220799a690f816494401Austin Yuan        data += psb_surface->stride;
9840da1930627209986e8db220799a690f816494401Austin Yuan    }
9850da1930627209986e8db220799a690f816494401Austin Yuan
9860da1930627209986e8db220799a690f816494401Austin Yuan    data = chroma;
9870da1930627209986e8db220799a690f816494401Austin Yuan    for (i = 0; i < obj_surface->height_r / 2; i++) {
9880da1930627209986e8db220799a690f816494401Austin Yuan        int j;
9890da1930627209986e8db220799a690f816494401Austin Yuan        for (j = 0; j < obj_surface->width_r / 2; j++) {
9900da1930627209986e8db220799a690f816494401Austin Yuan            *buffer++ = data[j*2 + 1];
9910da1930627209986e8db220799a690f816494401Austin Yuan        }
9920da1930627209986e8db220799a690f816494401Austin Yuan        data += psb_surface->stride;
9930da1930627209986e8db220799a690f816494401Austin Yuan    }
9940da1930627209986e8db220799a690f816494401Austin Yuan
9950da1930627209986e8db220799a690f816494401Austin Yuan    fwrite(header, obj_surface->height_r / 2, obj_surface->width_r, pf);
9960da1930627209986e8db220799a690f816494401Austin Yuan    free(header);
9970da1930627209986e8db220799a690f816494401Austin Yuan    psb_buffer_unmap(buf);
998cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    return 0;
999cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan
10005b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wangdump_out:
1001cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    return -1;
10020da1930627209986e8db220799a690f816494401Austin Yuan}
10030da1930627209986e8db220799a690f816494401Austin Yuan
10040da1930627209986e8db220799a690f816494401Austin Yuan
10057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h).
10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h).
10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * id is a fourcc code for the format of the video.
10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buf is the pointer to the source data in system memory.
10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * width and height are the w/h of the source data.
10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * If "sync" is TRUE, then we must be finished with *buf at the point of return
10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * (which we always are).
10137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * clipBoxes is the clipping region in screen space.
10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * data is a pointer to our port private.
10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * pDraw is a Drawable, which might not be the screen in the case of
10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * compositing.  It's a new argument to the function in the 1.1 server.
10177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int I830PutImage(
1019437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
1020437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
10210da1930627209986e8db220799a690f816494401Austin Yuan    int src_x, int src_y,
10220da1930627209986e8db220799a690f816494401Austin Yuan    int src_w, int src_h,
10230da1930627209986e8db220799a690f816494401Austin Yuan    int drw_x, int drw_y,
10240da1930627209986e8db220799a690f816494401Austin Yuan    int drw_w, int drw_h,
1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int fourcc, int flags,
1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int overlayId,
10272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    int pipeId)
10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int x1, x2, y1, y2;
10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int width, height;
1032437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int top, left, npixels;
1033437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int pitch = 0, pitch2 = 0;
1034437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int pre_add;
1035437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int gtt_ofs;
1036437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct _WsbmBufferObject *drm_buf;
10377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    BoxRec dstBox;
10387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PsbPortPrivPtr pPriv;
1039437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
10402befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface = NULL;
1041437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
10422befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* silent kw */
10432befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (NULL == obj_surface)
1044dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 1;
10452befccec034c13d34746a9e87149889d59ac767bFei Jiang
10462befccec034c13d34746a9e87149889d59ac767bFei Jiang    pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1048437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    switch (fourcc) {
1049437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    case VA_FOURCC_NV12:
1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        width = obj_surface->width;
1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        height = obj_surface->height;
1052437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        break;
1053437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    default:
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        width = obj_surface->width;
1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        height = obj_surface->height;
1056437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        break;
10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1059dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* rotate support here: more check?
1060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * and for oold also?
1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     */
1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_surface = obj_surface->psb_surface;
10630da1930627209986e8db220799a690f816494401Austin Yuan    I830PutImageFlipRotateSurface(ctx, obj_surface,
10640da1930627209986e8db220799a690f816494401Austin Yuan                                  &src_w, &src_h, &width, &height,
10650da1930627209986e8db220799a690f816494401Austin Yuan                                  &psb_surface, pipeId);
1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1067fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (NULL == psb_surface) {
1068fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        /*Rotate surface may not be ready, so we have to discard this frame.*/
1069c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Discard this frame if rotate surface hasn't be ready.\n");
10705b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
10710a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        return 1;
10720a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    }
10732befccec034c13d34746a9e87149889d59ac767bFei Jiang    width = (width <= 1920) ? width : 1920;
10742befccec034c13d34746a9e87149889d59ac767bFei Jiang
10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* If dst width and height are less than 1/8th the src size, the
10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * src/dst scale factor becomes larger than 8 and doesn't fit in
10777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * the scale register.
10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (src_w >= (drw_w * 8))
1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drw_w = src_w / 7;
10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1082dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (src_h >= (drw_h * 8))
1083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drw_h = src_h / 7;
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Clip */
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    x1 = src_x;
10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    x2 = src_x + src_w;
10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    y1 = src_y;
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    y2 = src_y + src_h;
10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.x1 = drw_x;
10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.x2 = drw_x + drw_w;
10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.y1 = drw_y;
10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.y2 = drw_y + drw_h;
10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_CLIP_FUNC
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!i830_get_crtc(pScrn, &crtc, &dstBox))
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return Success;
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *Update drw_* and 'clipBoxes' according to current downscale/upscale state
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Make sure the area determined by drw_* is in 'clipBoxes'
11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        h_ratio = (float)pScrn->pScreen->height / pPriv->width_save;
11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        v_ratio = (float)pScrn->pScreen->width / pPriv->height_save;
11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else {
11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        h_ratio = (float)pScrn->pScreen->width / pPriv->width_save;
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        v_ratio = (float)pScrn->pScreen->height / pPriv->height_save;
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Horizontal downscale/upscale */
11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((int)h_ratio)
11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        clipBoxes->extents.x1 /= h_ratio;
11157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else if (!(int)h_ratio)
11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        clipBoxes->extents.x2 /= h_ratio;
11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Vertical downscale/upscale */
11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((int)v_ratio)
11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        clipBoxes->extents.y1 /= v_ratio;
11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else if (!(int)v_ratio)
11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        clipBoxes->extents.y2 /= v_ratio;
11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drw_x /= h_ratio;
11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drw_y /= v_ratio;
11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drw_w /= h_ratio;
11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drw_h /= v_ratio;
11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.x1 = drw_x;
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.x2 = drw_x + drw_w;
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.y1 = drw_y;
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    dstBox.y2 = drw_y + drw_h;
11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Count in client supplied clipboxes */
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    clipRegion = clipBoxes;
11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_perform_clip(pScrn, vaPtr->clipbox, vaPtr->num_clipbox, clipBoxes, clipRegion, pDraw);
11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!i830_clip_video_helper(pScrn,
1139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                &crtc,
1140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                &dstBox, &x1, &x2, &y1, &y2, clipRegion,
1141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                width, height)) {
11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Fail to clip video to any crtc!\n", __FUNCTION__);
1143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return 0;
11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    switch (fourcc) {
1148affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_NV12:
1149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pitch = (width + 0x3) & ~0x3;
1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pitch2 = psb_surface->stride;
11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
1152affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YV12:
1153affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_I420:
1154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pitch = (width + 0x3) & ~0x3;
11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
11567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE
1157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    case FOURCC_RGBA:
1158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pitch = width << 2;
11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1161affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_UYVY:
1162affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang    case VA_FOURCC_YUY2:
11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    default:
1164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pitch = width << 1;
11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    top = (y1) & ~1;
11692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    left = (x1) & ~1;
1170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left;
11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (fourcc == VA_FOURCC_NV12) {
1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pre_add = psb_surface->buf.buffer_ofs;
1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        drm_buf = psb_surface->buf.drm_buf;
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        gtt_ofs = wsbmBOOffsetHint(drm_buf) & 0x0FFFFFFF;
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11770a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        /*skip pad bytes.*/
1178605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        if (driver_data->local_rotation == VA_ROTATION_90) {
1179605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang            left += ((src_w + 0xf) & ~0xf) - src_w;
1180605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        } else if (driver_data->local_rotation == VA_ROTATION_270) {
1181605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang            top += ((src_h + 0xf) & ~0xf) - src_h;
1182605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        } else if (driver_data->local_rotation == VA_ROTATION_180) {
1183605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang            left += ((src_w + 0xf) & ~0xf) - src_w;
1184605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang            top += ((src_h + 0xf) & ~0xf) - src_h;
1185605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        }
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->YBuf0offset = pre_add + gtt_ofs  + top * pitch2 + left;
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->YBuf1offset = pPriv->YBuf0offset;
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->UBuf0offset = pre_add + gtt_ofs + (pitch2  * height) + top * (pitch2 / 2) + left;
1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->VBuf0offset = pPriv->UBuf0offset;
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->UBuf1offset = pPriv->UBuf0offset;
1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pPriv->VBuf1offset = pPriv->UBuf0offset;
1192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } else {
1193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        //TBD
1194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        //pPriv->YBuf0offset = pPriv->videoBuf0_gtt_offset << PAGE_SHIFT;
1195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        //pPriv->YBuf1offset = pPriv->videoBuf1_gtt_offset << PAGE_SHIFT;
11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
1197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2  * width);
1198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * width / 2);
1199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * width);
1200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * width / 2);
12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } else {
1202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * height);
1203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * height / 2);
1204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * height);
1205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * height / 2);
12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE
1210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (fourcc == FOURCC_RGBA   \
12113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        || (fourcc == FOURCC_XVVA   \
12123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            && (pPriv->rotation != RR_Rotate_0) \
12133f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            && (vaPtr->dst_srf.fourcc == VA_FOURCC_RGBA)))
1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        i830_display_video_sprite(pScrn, crtc, width, height, dstPitch,
1215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  &dstBox, sprite_offset);
1216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    else
12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
12182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        i830_display_video(ctx, pPriv, surface, fourcc, src_w, src_h, pitch2, pitch,
1219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                           x1, y1, x2, y2, &dstBox, src_w, src_h,
12202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                           drw_w, drw_h, flags, overlayId, pipeId);
1221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    // FIXME : do I use two buffers here really?
1223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //    pPriv->curBuf = (pPriv->curBuf + 1) & 1;
1224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return Success;
1226437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12302befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic void psbPortPrivCreate(PsbPortPrivPtr pPriv)
1231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0
1233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    REGION_NULL(pScreen, &pPriv->clip);
12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* coeffs defaut value */
1237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->brightness.Value = OV_BRIGHTNESS_DEFAULT_VALUE;
1238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->brightness.Fraction = 0;
12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->contrast.Value = OV_CONTRAST_DEFAULT_VALUE;
1241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->contrast.Fraction = 0;
12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->hue.Value = OV_HUE_DEFAULT_VALUE;
1244437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->hue.Fraction = 0;
12457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->saturation.Value = OV_SATURATION_DEFAULT_VALUE;
1247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->saturation.Fraction = 0;
12482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->subpicture_enabled = 0;
12492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->subpicture_enable_mask = 0;
12502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->overlayA_enabled = 0;
12512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->overlayC_enabled = 0;
12524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pPriv->overlayA_pipeId = PIPEA;
12534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pPriv->overlayC_pipeId = PIPEB;
1254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* FIXME: is this right? set up to current screen size */
1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1
1257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->width_save = 1024;
1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->height_save = 600;
12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void
1263437b3eda28a4bf098efa80598cab67f190275266Fei JiangpsbPortPrivDestroy(VADriverContextP ctx, PsbPortPrivPtr pPriv)
1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
12653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    I830StopVideo(ctx);
1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnmap(pPriv->wsbo[0]);
12682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnreference(&pPriv->wsbo[0]);
12692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnmap(pPriv->wsbo[1]);
12702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnreference(&pPriv->wsbo[1]);
12712befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (pPriv->is_mfld) {
1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pPriv->p_iep_lite_context)
12732befccec034c13d34746a9e87149889d59ac767bFei Jiang            free(pPriv->p_iep_lite_context);
12742befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
12752befccec034c13d34746a9e87149889d59ac767bFei Jiang    pPriv->p_iep_lite_context = NULL;
1276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12786e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sangstatic int
12792befccec034c13d34746a9e87149889d59ac767bFei JiangpsbSetupImageVideoOverlay(VADriverContextP ctx, PsbPortPrivPtr pPriv)
1280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
12822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    I830OverlayRegPtr overlayA = NULL;
12832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    I830OverlayRegPtr overlayC = NULL;
1284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
12852befccec034c13d34746a9e87149889d59ac767bFei Jiang    psbPortPrivCreate(pPriv);
1286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1288437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* use green as color key by default for android media player */
12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pPriv->colorKey = driver_data->color_key/*0x0440*/;
129035405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang
1291fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /*Bypass color correction. Because these color
129235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    correction can be done in pipe color correction in future.*/
129335405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    pPriv->brightness.Value = 0;   /*-19*/
129435405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    pPriv->contrast.Value = 0x40;  /*75*/
129535405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    pPriv->saturation.Value = 0x80;  /*146*/
129635405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang
1297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma5 = 0xc0c0c0;
1298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma4 = 0x808080;
1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma3 = 0x404040;
1300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma2 = 0x202020;
1301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma1 = 0x101010;
1302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->gamma0 = 0x080808;
1303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pPriv->rotation = VA_ROTATION_NONE;
1305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pPriv->subpic_clear_flag = 1;
13067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* gotta uninit this someplace */
1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    REGION_NULL(pScreen, &pPriv->clip);
13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* With LFP's we need to detect whether we're in One Line Mode, which
1312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     * essentially means a resolution greater than 1024x768, and fix up
13132befccec034c13d34746a9e87149889d59ac767bFei Jiang     * the scaler accordingly.
13142befccec034c13d34746a9e87149889d59ac767bFei Jiang     */
1315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->scaleRatio = 0x10000;
1316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pPriv->oneLineMode = FALSE;
1317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
13182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 2,
1319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &pPriv->wsbo[0], 64 * 1024, /* 64k alignment */
132041051cf68a4a61406a5adcb9412cd83035eb8b0dFei Jiang                         WSBM_PL_FLAG_TT);
1321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (ret)
13222befccec034c13d34746a9e87149889d59ac767bFei Jiang        goto out_err;
1323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
13242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ret = wsbmBOData(pPriv->wsbo[0],
13252befccec034c13d34746a9e87149889d59ac767bFei Jiang                     5 * 4096,
1326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                     NULL, NULL,
1327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                     WSBM_PL_FLAG_TT);
1328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (ret)
13292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        goto out_err_bo0;
1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->regmap[0] = wsbmBOMap(pPriv->wsbo[0], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE);
13322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (!pPriv->regmap[0]) {
13332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        goto out_err_bo0;
13342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
1335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
13362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ret = wsbmBOData(pPriv->wsbo[1],
13372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                     5 * 4096,
13382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                     NULL, NULL,
13392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                     WSBM_PL_FLAG_TT);
13402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (ret)
13412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        goto out_err_bo1;
13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pPriv->regmap[1] = wsbmBOMap(pPriv->wsbo[1], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE);
13442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (!pPriv->regmap[1]) {
13452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        goto out_err_bo1;
13462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
13472befccec034c13d34746a9e87149889d59ac767bFei Jiang
13482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]);
1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]);
1350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13512befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (pPriv->is_mfld) {
13522befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->ble_black_mode.value = 1;
13532befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->ble_white_mode.value = 3;
13542befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->blueStretch_gain.value = 200;
13552befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->skinColorCorrection_gain.value = 100;
1356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->hue.value = (5.25f * (1 << 25));
1357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->saturation.value = (1.07f * (1 << 25));
1358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->brightness.value = (-10.1f * (1 << 10));
1359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->contrast.value = (0.99f * (1 << 25));
13602befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13622befccec034c13d34746a9e87149889d59ac767bFei Jiang    return 0;
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo1:
13652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnreference(&pPriv->wsbo[1]);
1366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo0:
13672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    wsbmBOUnreference(&pPriv->wsbo[0]);
13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err:
13706e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    return -1;
13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13732befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx)
13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1375b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
13772befccec034c13d34746a9e87149889d59ac767bFei Jiang    PsbPortPrivPtr pPriv = &driver_data->coverlay_priv;
13783f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    struct drm_psb_register_rw_arg regs;
13796e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    int ret;
13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(pPriv, 0, sizeof(PsbPortPrivRec));
138206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    pPriv->is_mfld = (IS_MFLD(driver_data) || IS_MRFL(driver_data));
13833f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan
13846e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    ret = psbSetupImageVideoOverlay(ctx, pPriv);
13856e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    if (ret != 0) {
1386c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb_coverlay_init : Create overlay cmd buffer failed.\n");
13876e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        return -1;
13886e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    }
13896e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang
13903f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    if (pPriv->is_mfld && driver_data->is_android) {
1391c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Android ExtVideo: set PIPEB(HDMI)display plane on the bottom.\n");
13925b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
13933f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        memset(&regs, 0, sizeof(regs));
139454752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display_read_mask = REGRWBITS_DSPBCNTR;
139554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
139654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display.dspcntr_b |= DISPPLANE_BOTTOM;
139754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display_write_mask = REGRWBITS_DSPBCNTR;
13983f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
13993f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
14005b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
14014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    I830ResetVideo(ctx, pPriv);
14022befccec034c13d34746a9e87149889d59ac767bFei Jiang    I830UpdateGamma(ctx, pPriv);
1403b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
14042befccec034c13d34746a9e87149889d59ac767bFei Jiang    return 0;
14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14072befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_stop(VADriverContextP ctx)
14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14092befccec034c13d34746a9e87149889d59ac767bFei Jiang    I830StopVideo(ctx);
14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14132befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx)
14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1415b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
1416437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
14172befccec034c13d34746a9e87149889d59ac767bFei Jiang    PsbPortPrivPtr pPriv = &driver_data->coverlay_priv;
141854752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
141954752e65b02b1a84c491e3f9c964046faeea306eKun Wang
142054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (pPriv->is_mfld && driver_data->is_android) {
1421c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Android ExtVideo: set PIPEB(HDMI)display plane normal.\n");
142254752e65b02b1a84c491e3f9c964046faeea306eKun Wang
142354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        memset(&regs, 0, sizeof(regs));
142454752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display_read_mask = REGRWBITS_DSPBCNTR;
142554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
142654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display.dspcntr_b &= ~DISPPLANE_BOTTOM;
142754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        regs.display_write_mask = REGRWBITS_DSPBCNTR;
142854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, &regs, sizeof(regs));
142954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14312befccec034c13d34746a9e87149889d59ac767bFei Jiang    psbPortPrivDestroy(ctx, pPriv);
1432b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1436437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus psb_putsurface_overlay(
1437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
1438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
1439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
1441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short srcw,
1442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short srch,
14432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    short destx,
1444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short destw,
1446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short desth,
14472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned int flags, /* de-interlacing flags */
1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int overlayId,
14492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    int pipeId
14502befccec034c13d34746a9e87149889d59ac767bFei Jiang)
14512befccec034c13d34746a9e87149889d59ac767bFei Jiang{
1452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
14544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
1455ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0
14564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if ((overlayId == OVERLAY_A) && (pPriv->overlayA_pipeId != pipeId)) {
14574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pPriv->overlayA_pipeId = pipeId;
14584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        I830SwitchPipe(ctx, OVERLAY_A, pipeId);
1459c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "OverlayA switch pipe to %d, stop overlayA first.\n", pipeId);
1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if ((overlayId == OVERLAY_C) && (pPriv->overlayC_pipeId != pipeId)) {
14614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pPriv->overlayC_pipeId = pipeId;
14624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        I830SwitchPipe(ctx, OVERLAY_C, pipeId);
1463c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "OverlayC switch pipe to %d, stop overlayC first.\n", pipeId);
14644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
1465ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif
14662befccec034c13d34746a9e87149889d59ac767bFei Jiang    I830PutImage(ctx, surface, srcx, srcy, srcw, srch,
14672befccec034c13d34746a9e87149889d59ac767bFei Jiang                 destx, desty, destw, desth,
14682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                 VA_FOURCC_NV12, flags, overlayId, pipeId);
1469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14702befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* current surface is being displayed */
1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE)
14722befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->last_displaying_surface = driver_data->cur_displaying_surface;
1473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_surface == NULL) {
1475c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid surface ID: 0x%08x\n", surface);
1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_INVALID_SURFACE;
14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14792befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface->display_timestamp = GetTickCount();
1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    driver_data->cur_displaying_surface = surface;
1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14822befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1484