1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2008 The Android Open Source Project
346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu * Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved.
4728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R *
5728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained
6728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R * for attribution purposes only.
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h>
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <linux/msm_mdp.h>
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <linux/fb.h>
25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <stdint.h>
27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <string.h>
28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <unistd.h>
29befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h>
30befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h>
31befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/ioctl.h>
33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/types.h>
34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/mman.h>
35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <copybit.h>
37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "gralloc_priv.h"
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "software_converter.h"
40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
41befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define DEBUG_MDP_ERRORS 1
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define MAX_SCALE_FACTOR    (4)
46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define MAX_DIMENSION       (4096)
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/
49ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampsonstruct blitReq{
50ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct  mdp_buf_sync sync;
51ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    uint32_t count;
52ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct mdp_blit_req req[10];
53ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson};
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** State information for each device instance */
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct copybit_context_t {
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_device_t device;
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int     mFD;
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    uint8_t mAlpha;
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int     mFlags;
61bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    bool    mBlitToFB;
62ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    int     acqFence[MDP_MAX_FENCE_FD];
63ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    int     relFence;
64ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct  mdp_buf_sync sync;
65ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct  blitReq list;
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/**
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Common hardware methods
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int open_copybit(const struct hw_module_t* module, const char* name,
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        struct hw_device_t** device);
74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t copybit_module_methods = {
76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedopen:  open_copybit
77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
78befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
80befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * The COPYBIT Module
81befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct copybit_module_t HAL_MODULE_INFO_SYM = {
83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedcommon: {
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedtag: HARDWARE_MODULE_TAG,
85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     version_major: 1,
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     version_minor: 0,
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     id: COPYBIT_HARDWARE_MODULE_ID,
88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     name: "QCT MSM7K COPYBIT Module",
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     author: "Google, Inc.",
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed     methods: &copybit_module_methods
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** min of int a, b */
97befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline int min(int a, int b) {
98befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (a<b) ? a : b;
99befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** max of int a, b */
102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline int max(int a, int b) {
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (a>b) ? a : b;
104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
105befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
106befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** scale each parameter by mul/div. Assume div isn't 0 */
107befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline void MULDIV(uint32_t *a, uint32_t *b, int mul, int div) {
108befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (mul != div) {
109befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        *a = (mul * *a) / div;
110befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        *b = (mul * *b) / div;
111befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
112befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
113befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
114befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Determine the intersection of lhs & rhs store in out */
115befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void intersect(struct copybit_rect_t *out,
116befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      const struct copybit_rect_t *lhs,
117befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      const struct copybit_rect_t *rhs) {
118befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    out->l = max(lhs->l, rhs->l);
119befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    out->t = max(lhs->t, rhs->t);
120befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    out->r = min(lhs->r, rhs->r);
121befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    out->b = min(lhs->b, rhs->b);
122befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
123befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
124befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** convert COPYBIT_FORMAT to MDP format */
125befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int get_format(int format) {
126befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    switch (format) {
127befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_RGB_565:       return MDP_RGB_565;
128befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_RGBX_8888:     return MDP_RGBX_8888;
129f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        case HAL_PIXEL_FORMAT_BGRX_8888:     return MDP_BGRX_8888;
130befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_RGB_888:       return MDP_RGB_888;
131befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_RGBA_8888:     return MDP_RGBA_8888;
132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_BGRA_8888:     return MDP_BGRA_8888;
13322977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan        case HAL_PIXEL_FORMAT_YCrCb_422_I:   return MDP_YCRYCB_H2V1;
13422977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan        case HAL_PIXEL_FORMAT_YCbCr_422_I:   return MDP_YCBYCR_H2V1;
13591406473de6b246b1b16f28f599d5d746f2c0133Raj kamal        case HAL_PIXEL_FORMAT_YCrCb_422_SP:  return MDP_Y_CRCB_H2V1;
13691406473de6b246b1b16f28f599d5d746f2c0133Raj kamal        case HAL_PIXEL_FORMAT_YCrCb_420_SP:  return MDP_Y_CRCB_H2V2;
13791406473de6b246b1b16f28f599d5d746f2c0133Raj kamal        case HAL_PIXEL_FORMAT_YCbCr_422_SP:  return MDP_Y_CBCR_H2V1;
13891406473de6b246b1b16f28f599d5d746f2c0133Raj kamal        case HAL_PIXEL_FORMAT_YCbCr_420_SP:  return MDP_Y_CBCR_H2V2;
139befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: return MDP_Y_CBCR_H2V2_ADRENO;
140fe48baec7f4379aac0cf5d06ef121cd71f8844deRadhika Ranjan Soni        case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: return MDP_Y_CBCR_H2V2_VENUS;
141728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: return MDP_Y_CBCR_H2V2;
142befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
143befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return -1;
144befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
145befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
146befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** convert from copybit image to mdp image structure */
147befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_image(struct mdp_img *img, const struct copybit_image_t *rhs)
148befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
149befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    private_handle_t* hnd = (private_handle_t*)rhs->handle;
150befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(hnd == NULL){
151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("copybit: Invalid handle");
152befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
153befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
154befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    img->width      = rhs->w;
155befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    img->height     = rhs->h;
156befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    img->format     = get_format(rhs->format);
15746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu    img->offset     = (uint32_t)hnd->offset;
158befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    img->memory_id  = hnd->fd;
159befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
160befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** setup rectangles */
161befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_rects(struct copybit_context_t *dev,
162befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      struct mdp_blit_req *e,
163befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      const struct copybit_rect_t *dst,
164befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      const struct copybit_rect_t *src,
16546f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu                      const struct copybit_rect_t *scissor) {
166befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_rect_t clip;
167befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    intersect(&clip, scissor, dst);
168befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
169befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->dst_rect.x  = clip.l;
170befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->dst_rect.y  = clip.t;
171befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->dst_rect.w  = clip.r - clip.l;
172befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->dst_rect.h  = clip.b - clip.t;
173befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
174befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    uint32_t W, H, delta_x, delta_y;
175befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) {
176befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        delta_x = (clip.t - dst->t);
177befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        delta_y = (dst->r - clip.r);
178befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        e->src_rect.w = (clip.b - clip.t);
179befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        e->src_rect.h = (clip.r - clip.l);
180befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        W = dst->b - dst->t;
181befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        H = dst->r - dst->l;
182befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
183befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        delta_x  = (clip.l - dst->l);
184befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        delta_y  = (clip.t - dst->t);
185befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        e->src_rect.w  = (clip.r - clip.l);
186befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        e->src_rect.h  = (clip.b - clip.t);
187befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        W = dst->r - dst->l;
188befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        H = dst->b - dst->t;
189befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
190befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
191befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    MULDIV(&delta_x, &e->src_rect.w, src->r - src->l, W);
192befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    MULDIV(&delta_y, &e->src_rect.h, src->b - src->t, H);
193befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
194befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->src_rect.x = delta_x + src->l;
195befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    e->src_rect.y = delta_y + src->t;
196befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
197befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) {
198befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) {
199befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w);
200befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }else{
201befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h);
202befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
203befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
204befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
205befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) {
206befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) {
207befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h);
208befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }else{
209befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w);
210befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
211befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
212befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
213befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
214befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** setup mdp request */
215befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_infos(struct copybit_context_t *dev,
216befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                      struct mdp_blit_req *req, int flags)
217befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
218befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    req->alpha = dev->mAlpha;
219befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    req->transp_mask = MDP_TRANSP_NOP;
220befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    req->flags = dev->mFlags | flags;
221bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    // check if we are blitting to f/b
222bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    if (COPYBIT_ENABLE == dev->mBlitToFB) {
223bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed        req->flags |= MDP_MEMORY_ID_TYPE_FB;
224bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    }
225befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#if defined(COPYBIT_QSD8K)
226befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    req->flags |= MDP_BLEND_FG_PREMULT;
227befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif
228befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
229befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
230befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** copy the bits */
231befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int msm_copybit(struct copybit_context_t *dev, void const *list)
232befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
233dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson    int err;
234dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson    if (dev->relFence != -1) {
235dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson        close(dev->relFence);
236dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson        dev->relFence = -1;
237dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson    }
238dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson    err = ioctl(dev->mFD, MSMFB_ASYNC_BLIT,
239ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson                    (struct mdp_async_blit_req_list const*)list);
240befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE_IF(err<0, "copyBits failed (%s)", strerror(errno));
241befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (err == 0) {
242befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return 0;
243befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
244befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#if DEBUG_MDP_ERRORS
245ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        struct mdp_async_blit_req_list const* l =
246ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            (struct mdp_async_blit_req_list const*)list;
2475aa9f9bebbb02ccfe9b6a4e5a092c8bd324e0e88Naseer Ahmed        for (unsigned int i=0 ; i<l->count ; i++) {
248befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            ALOGE("%d: src={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n"
249befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  "    dst={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n"
2505aa9f9bebbb02ccfe9b6a4e5a092c8bd324e0e88Naseer Ahmed                  "    flags=%08x"
251befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  ,
252befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  i,
253befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src.width,
254befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src.height,
255befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src.format,
256befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src_rect.x,
257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src_rect.y,
258befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src_rect.w,
259befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].src_rect.h,
260befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst.width,
261befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst.height,
262befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst.format,
263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst_rect.x,
264befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst_rect.y,
265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst_rect.w,
266befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].dst_rect.h,
267befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                  l->req[i].flags
268befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                 );
269befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
270befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif
271befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -errno;
272befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
273befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
274befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
275befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*****************************************************************************/
276befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
277befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Set a parameter to value */
278befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int set_parameter_copybit(
279befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_device_t *dev,
280befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int name,
281befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int value)
282befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
283befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
284befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = 0;
285befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (ctx) {
286befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        switch(name) {
287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_ROTATION_DEG:
288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                switch (value) {
289befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    case 0:
290befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags &= ~0x7;
291befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        break;
292befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    case 90:
293befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags &= ~0x7;
294befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags |= MDP_ROT_90;
295befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        break;
296befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    case 180:
297befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags &= ~0x7;
298befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags |= MDP_ROT_180;
299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        break;
300befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    case 270:
301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags &= ~0x7;
302befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ctx->mFlags |= MDP_ROT_270;
303befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        break;
304befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    default:
305befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        ALOGE("Invalid value for COPYBIT_ROTATION_DEG");
306befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        status = -EINVAL;
307befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        break;
308befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
309befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
310befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_PLANE_ALPHA:
311befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                if (value < 0)      value = MDP_ALPHA_NOP;
312befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                if (value >= 256)   value = 255;
31346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu                ctx->mAlpha = (uint8_t)value;
314befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
315befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_DITHER:
316befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                if (value == COPYBIT_ENABLE) {
317befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags |= MDP_DITHER;
318befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                } else if (value == COPYBIT_DISABLE) {
319befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags &= ~MDP_DITHER;
320befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
321befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
322befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_BLUR:
323befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                if (value == COPYBIT_ENABLE) {
324befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags |= MDP_BLUR;
325befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                } else if (value == COPYBIT_DISABLE) {
326befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags &= ~MDP_BLUR;
327befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
328befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
329728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R            case COPYBIT_BLEND_MODE:
330728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R                if(value == COPYBIT_BLENDING_PREMULT) {
331befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags |= MDP_BLEND_FG_PREMULT;
332728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R                } else {
333befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ctx->mFlags &= ~MDP_BLEND_FG_PREMULT;
334befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
336befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_TRANSFORM:
337befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                ctx->mFlags &= ~0x7;
338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                ctx->mFlags |= value & 0x7;
339befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
340bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed            case COPYBIT_BLIT_TO_FRAMEBUFFER:
341bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                if (COPYBIT_ENABLE == value) {
342bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                    ctx->mBlitToFB = value;
343bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                } else if (COPYBIT_DISABLE == value) {
344bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                    ctx->mBlitToFB = value;
345bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                } else {
346bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                    ALOGE ("%s:Invalid input for COPYBIT_BLIT_TO_FRAMEBUFFER : %d",
347bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                            __FUNCTION__, value);
348bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                }
349bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                break;
35006e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty            case COPYBIT_FG_LAYER:
35106e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                if(value == COPYBIT_ENABLE) {
35206e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                     ctx->mFlags |= MDP_IS_FG;
35306e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                } else if (value == COPYBIT_DISABLE) {
35406e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                    ctx->mFlags &= ~MDP_IS_FG;
35506e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                }
35606e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty                break ;
357befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            default:
358befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                status = -EINVAL;
359befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
360befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
361befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
362befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = -EINVAL;
363befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
364befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
365befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
366befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
367befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Get a static info value */
368befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int get(struct copybit_device_t *dev, int name)
369befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
370befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
371befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int value;
372befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (ctx) {
373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        switch(name) {
374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_MINIFICATION_LIMIT:
375befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                value = MAX_SCALE_FACTOR;
376befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
377befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_MAGNIFICATION_LIMIT:
378befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                value = MAX_SCALE_FACTOR;
379befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
380befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_SCALING_FRAC_BITS:
381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                value = 32;
382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            case COPYBIT_ROTATION_STEP_DEG:
384befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                value = 90;
385befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                break;
386befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            default:
387befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                value = -EINVAL;
388befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
389befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
390befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        value = -EINVAL;
391befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
392befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return value;
393befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
394befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
395ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampsonstatic int set_sync_copybit(struct copybit_device_t *dev,
396ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    int acquireFenceFd)
397ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson{
398ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
399ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    if (acquireFenceFd != -1) {
4000fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson        if (ctx->list.sync.acq_fen_fd_cnt < (MDP_MAX_FENCE_FD - 1)) {
4010fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson            ctx->acqFence[ctx->list.sync.acq_fen_fd_cnt++] = acquireFenceFd;
402ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        } else {
403ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            int ret = -EINVAL;
404ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            struct blitReq *list = &ctx->list;
405ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson
406ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            // Since fence is full kick off what is already in the list
407ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            ret = msm_copybit(ctx, list);
408ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            if (ret < 0) {
409ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson                ALOGE("%s: Blit call failed", __FUNCTION__);
410ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson                return -EINVAL;
411ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            }
412ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            list->count = 0;
4130fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson            list->sync.acq_fen_fd_cnt = 0;
4140fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson            ctx->acqFence[list->sync.acq_fen_fd_cnt++] = acquireFenceFd;
415ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        }
416ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    }
417ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    return 0;
418ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson}
419ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson
420befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** do a stretch blit type operation */
421befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int stretch_copybit(
422befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_device_t *dev,
423befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_image_t const *dst,
424befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_image_t const *src,
425befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_rect_t const *dst_rect,
426befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_rect_t const *src_rect,
427befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_region_t const *region)
428befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
429befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
430ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct blitReq *list;
431befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = 0;
432befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    private_handle_t *yv12_handle = NULL;
433ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson
434befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (ctx) {
435ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        list = &ctx->list;
436befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
437befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if (ctx->mAlpha < 255) {
438befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            switch (src->format) {
439befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                // we don't support plane alpha with RGBA formats
440befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                case HAL_PIXEL_FORMAT_RGBA_8888:
441befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                case HAL_PIXEL_FORMAT_BGRA_8888:
442befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ALOGE ("%s : Unsupported Pixel format %d", __FUNCTION__,
443befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           src->format);
444befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    return -EINVAL;
445befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            }
446befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
447befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
448728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R        if (src_rect->l < 0 || (uint32_t)src_rect->r > src->w ||
449728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R            src_rect->t < 0 || (uint32_t)src_rect->b > src->h) {
450befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            // this is always invalid
451befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            ALOGE ("%s : Invalid source rectangle : src_rect l %d t %d r %d b %d",\
452befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                   __FUNCTION__, src_rect->l, src_rect->t, src_rect->r, src_rect->b);
453befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
454befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            return -EINVAL;
455befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
456befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
457befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if (src->w > MAX_DIMENSION || src->h > MAX_DIMENSION) {
458befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            ALOGE ("%s : Invalid source dimensions w %d h %d", __FUNCTION__, src->w, src->h);
459befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            return -EINVAL;
460befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
461befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
462befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) {
463befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            ALOGE ("%s : Invalid DST dimensions w %d h %d", __FUNCTION__, dst->w, dst->h);
464befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            return -EINVAL;
465befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
466befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
467befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        if(src->format ==  HAL_PIXEL_FORMAT_YV12) {
468728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R            int usage =
4699ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED;
470befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            if (0 == alloc_buffer(&yv12_handle,src->w,src->h,
471befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                                  src->format, usage)){
472befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                if(0 == convertYV12toYCrCb420SP(src,yv12_handle)){
473befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    (const_cast<copybit_image_t *>(src))->format =
474befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        HAL_PIXEL_FORMAT_YCrCb_420_SP;
475befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    (const_cast<copybit_image_t *>(src))->handle =
476befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        yv12_handle;
477befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    (const_cast<copybit_image_t *>(src))->base =
478befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        (void *)yv12_handle->base;
479befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
480befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                else{
481befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    ALOGE("Error copybit conversion from yv12 failed");
482befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    if(yv12_handle)
483befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        free_buffer(yv12_handle);
484befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                    return -EINVAL;
485befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                }
486befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            }
487befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            else{
488befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                ALOGE("Error:unable to allocate memeory for yv12 software conversion");
489befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                return -EINVAL;
490befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            }
491befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
49246f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu        const uint32_t maxCount =
49346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu                (uint32_t)(sizeof(list->req)/sizeof(list->req[0]));
494ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian        const struct copybit_rect_t bounds = { 0, 0, (int)dst->w, (int)dst->h };
495befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct copybit_rect_t clip;
496befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
497befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        while ((status == 0) && region->next(region, &clip)) {
498befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            intersect(&clip, &bounds, &clip);
499ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            mdp_blit_req* req = &list->req[list->count];
500befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            int flags = 0;
501befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
502befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            private_handle_t* src_hnd = (private_handle_t*)src->handle;
503befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            if(src_hnd != NULL && src_hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) {
504befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                flags |=  MDP_BLIT_NON_CACHED;
505befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            }
506befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
507befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            set_infos(ctx, req, flags);
508befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            set_image(&req->dst, dst);
509befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            set_image(&req->src, src);
51046f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu            set_rects(ctx, req, dst_rect, src_rect, &clip);
511befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
512befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            if (req->src_rect.w<=0 || req->src_rect.h<=0)
513befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                continue;
514befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
515befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            if (req->dst_rect.w<=0 || req->dst_rect.h<=0)
516befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                continue;
517befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
518ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            if (++list->count == maxCount) {
519ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson                status = msm_copybit(ctx, list);
520dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson                list->sync.acq_fen_fd_cnt = 0;
521ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson                list->count = 0;
522befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed            }
523befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
524730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson        if(yv12_handle) {
525730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson            //Before freeing the buffer we need buffer passed through blit call
526730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson            if (list->count != 0) {
527730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson                status = msm_copybit(ctx, list);
528dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson                list->sync.acq_fen_fd_cnt = 0;
529730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson                list->count = 0;
530730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson            }
531730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson            free_buffer(yv12_handle);
532730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson        }
533befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
534befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE ("%s : Invalid COPYBIT context", __FUNCTION__);
535befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = -EINVAL;
536befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
537befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
538befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
539befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
540befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Perform a blit type operation */
541befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int blit_copybit(
542befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_device_t *dev,
543befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_image_t const *dst,
544befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_image_t const *src,
545befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_region_t const *region)
546befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
547ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian    struct copybit_rect_t dr = { 0, 0, (int)dst->w, (int)dst->h };
548ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian    struct copybit_rect_t sr = { 0, 0, (int)src->w, (int)src->h };
549befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return stretch_copybit(dev, dst, src, &dr, &sr, region);
550befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
551befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
552728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.Rstatic int finish_copybit(struct copybit_device_t *dev)
553728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R{
554728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R    // NOP for MDP copybit
55546f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu    if(!dev)
55646f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu       return -EINVAL;
55746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu
5589ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson    return 0;
559728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R}
5604c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singhstatic int clear_copybit(struct copybit_device_t *dev,
5614c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh                         struct copybit_image_t const *buf,
5624c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh                         struct copybit_rect_t *rect)
5634c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh{
5644c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
5654c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    uint32_t color = 0; // black color
5664c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5674c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    if (!ctx) {
5684c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh        ALOGE ("%s: Invalid copybit context", __FUNCTION__);
5694c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh        return -EINVAL;
5704c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    }
5714c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5724c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    struct blitReq list1;
5734c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    memset((char *)&list1 , 0 ,sizeof (struct blitReq) );
5744c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    list1.count = 1;
5754c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    int rel_fen_fd = -1;
5764c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    int my_tmp_get_fence = -1;
5774c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
578ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson    list1.sync.acq_fen_fd  =  ctx->acqFence;
5794c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    list1.sync.rel_fen_fd  =  &my_tmp_get_fence;
580ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson    list1.sync.acq_fen_fd_cnt = ctx->list.sync.acq_fen_fd_cnt;
5814c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    mdp_blit_req* req = &list1.req[0];
5824c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5834c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    if(!req) {
5844c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh        ALOGE ("%s : Invalid request", __FUNCTION__);
5854c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh        return -EINVAL;
5864c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    }
5874c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5884c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    set_image(&req->dst, buf);
5894c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    set_image(&req->src, buf);
5904c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5914c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > req->dst.width ||
5924c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh       rect->t < 0 || (uint32_t)(rect->b - rect->t) > req->dst.height) {
5934c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh       ALOGE ("%s : Invalid rect : src_rect l %d t %d r %d b %d",\
5944c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh       __FUNCTION__, rect->l, rect->t, rect->r, rect->b);
5954c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh       return -EINVAL;
5964c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    }
5974c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
5984c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->dst_rect.x  = rect->l;
5994c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->dst_rect.y  = rect->t;
6004c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->dst_rect.w  = rect->r - rect->l;
6014c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->dst_rect.h  = rect->b - rect->t;
6024c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
6034c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->src_rect = req->dst_rect;
6044c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
6054c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->const_color.b = (uint32_t)((color >> 16) & 0xff);
6064c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->const_color.g = (uint32_t)((color >> 8) & 0xff);
6074c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->const_color.r = (uint32_t)((color >> 0) & 0xff);
6084c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->const_color.alpha = MDP_ALPHA_NOP;
6094c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
6104c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->transp_mask = MDP_TRANSP_NOP;
6114c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    req->flags = MDP_SOLID_FILL | MDP_MEMORY_ID_TYPE_FB | MDP_BLEND_FG_PREMULT;
6124c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    int status = msm_copybit(ctx, &list1);
6134c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
614ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson    ctx->list.sync.acq_fen_fd_cnt = 0;
6154c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    if (my_tmp_get_fence !=  -1)
6164c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh        close(my_tmp_get_fence);
6174c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh
6184c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    return status;
6194c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh}
620728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R
621905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan/** Fill the rect on dst with RGBA color **/
622905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhanstatic int fill_color(struct copybit_device_t *dev,
623905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan                      struct copybit_image_t const *dst,
624905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan                      struct copybit_rect_t const *rect,
625905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan                      uint32_t color)
626905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan{
627905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
628905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    if (!ctx) {
629905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        ALOGE("%s: Invalid copybit context", __FUNCTION__);
630905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        return -EINVAL;
631905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    }
632905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
633905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) {
634905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        ALOGE("%s: Invalid DST w=%d h=%d", __FUNCTION__, dst->w, dst->h);
635905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        return -EINVAL;
636905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    }
637905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
638905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > dst->w ||
639905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        rect->t < 0 || (uint32_t)(rect->b - rect->t) > dst->h) {
640905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        ALOGE("%s: Invalid destination rect: l=%d t=%d r=%d b=%d",
641905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan                __FUNCTION__, rect->l, rect->t, rect->r, rect->b);
642905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        return -EINVAL;
643905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    }
644905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
6454dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan    int status = 0;
646905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    struct blitReq* list = &ctx->list;
647905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    mdp_blit_req* req = &list->req[list->count++];
648905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    set_infos(ctx, req, MDP_SOLID_FILL);
649905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    set_image(&req->src, dst);
650905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    set_image(&req->dst, dst);
651905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
652905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->dst_rect.x = rect->l;
653905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->dst_rect.y = rect->t;
654905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->dst_rect.w = rect->r - rect->l;
655905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->dst_rect.h = rect->b - rect->t;
656905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->src_rect = req->dst_rect;
657905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
658905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->const_color.r = (uint32_t)((color >> 0) & 0xff);
659905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->const_color.g = (uint32_t)((color >> 8) & 0xff);
660905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->const_color.b = (uint32_t)((color >> 16) & 0xff);
661905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    req->const_color.alpha = (uint32_t)((color >> 24) & 0xff);
662905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
6634dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan    if (list->count == sizeof(list->req)/sizeof(list->req[0])) {
6644dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan        status = msm_copybit(ctx, list);
6654dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan        list->sync.acq_fen_fd_cnt = 0;
6664dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan        list->count = 0;
6674dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan    }
668905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    return status;
669905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan}
670905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan
671befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*****************************************************************************/
672befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
673befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Close the copybit device */
674befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int close_copybit(struct hw_device_t *dev)
675befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
676befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
677befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (ctx) {
678befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        close(ctx->mFD);
679befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        free(ctx);
680befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
681befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
682befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
683befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
6849ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampsonstatic int flush_get_fence(struct copybit_device_t *dev, int* fd)
6859ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson{
686ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
687ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    struct blitReq *list = &ctx->list;
688ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    int ret = -EINVAL;
689ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson
690ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    if (list->count) {
691ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        ret = msm_copybit(ctx, list);
692ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        if (ret < 0)
693ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson            ALOGE("%s: Blit call failed", __FUNCTION__);
694ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson        list->count = 0;
695ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    }
696ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    *fd = ctx->relFence;
6970fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson    list->sync.acq_fen_fd_cnt = 0;
698ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->relFence = -1;
699ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    return ret;
7009ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson}
7019ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson
702befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Open a new instance of a copybit device using name */
703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int open_copybit(const struct hw_module_t* module, const char* name,
704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                        struct hw_device_t** device)
705befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
706befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
70746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu
70846f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu    if (!strcmp(name, COPYBIT_HARDWARE_COPYBIT0)) {
70946f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu        return COPYBIT_FAILURE;
71046f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu    }
711befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    copybit_context_t *ctx;
712befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx = (copybit_context_t *)malloc(sizeof(copybit_context_t));
713befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    memset(ctx, 0, sizeof(*ctx));
714befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
715befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.common.tag = HARDWARE_DEVICE_TAG;
716befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.common.version = 1;
717befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.common.module = const_cast<hw_module_t*>(module);
718befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.common.close = close_copybit;
719befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.set_parameter = set_parameter_copybit;
720befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.get = get;
721befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.blit = blit_copybit;
722ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->device.set_sync = set_sync_copybit;
723befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->device.stretch = stretch_copybit;
724728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R    ctx->device.finish = finish_copybit;
725905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    ctx->device.fill_color = fill_color;
7269ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson    ctx->device.flush_get_fence = flush_get_fence;
7274c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh    ctx->device.clear = clear_copybit;
728befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->mAlpha = MDP_ALPHA_NOP;
729befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->mFlags = 0;
730ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->sync.flags = 0;
731b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan    ctx->relFence = -1;
732b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan    for (int i=0; i < MDP_MAX_FENCE_FD; i++) {
733b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan        ctx->acqFence[i] = -1;
734b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan    }
735ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->sync.acq_fen_fd = ctx->acqFence;
736ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->sync.rel_fen_fd = &ctx->relFence;
737ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->list.count = 0;
7380fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson    ctx->list.sync.acq_fen_fd_cnt = 0;
739ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->list.sync.rel_fen_fd = ctx->sync.rel_fen_fd;
740ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson    ctx->list.sync.acq_fen_fd = ctx->sync.acq_fen_fd;
741befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ctx->mFD = open("/dev/graphics/fb0", O_RDWR, 0);
742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (ctx->mFD < 0) {
743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = errno;
744befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("Error opening frame buffer errno=%d (%s)",
745befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed              status, strerror(status));
746befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = -status;
747befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    } else {
7489ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson        status = 0;
749befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        *device = &ctx->device.common;
750befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
751befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
752befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
753