Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | /*
* Copyright (c) 2015-2016 MediaTek Inc.
* Author: Houlong Wei <houlong.wei@mediatek.com>
* Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/platform_device.h>
#include "mtk_mdp_core.h"
#include "mtk_mdp_regs.h"
#define MDP_COLORFMT_PACK(VIDEO, PLANE, COPLANE, HF, VF, BITS, GROUP, SWAP, ID)\
(((VIDEO) << 27) | ((PLANE) << 24) | ((COPLANE) << 22) |\
((HF) << 20) | ((VF) << 18) | ((BITS) << 8) | ((GROUP) << 6) |\
((SWAP) << 5) | ((ID) << 0))
enum MDP_COLOR_ENUM {
MDP_COLOR_UNKNOWN = 0,
MDP_COLOR_NV12 = MDP_COLORFMT_PACK(0, 2, 1, 1, 1, 8, 1, 0, 12),
MDP_COLOR_I420 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 0, 8),
MDP_COLOR_YV12 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 1, 8),
/* Mediatek proprietary format */
MDP_COLOR_420_MT21 = MDP_COLORFMT_PACK(5, 2, 1, 1, 1, 256, 1, 0, 12),
};
static int32_t mtk_mdp_map_color_format(int v4l2_format)
{
switch (v4l2_format) {
case V4L2_PIX_FMT_NV12M:
case V4L2_PIX_FMT_NV12:
return MDP_COLOR_NV12;
case V4L2_PIX_FMT_MT21C:
return MDP_COLOR_420_MT21;
case V4L2_PIX_FMT_YUV420M:
case V4L2_PIX_FMT_YUV420:
return MDP_COLOR_I420;
case V4L2_PIX_FMT_YVU420:
return MDP_COLOR_YV12;
}
mtk_mdp_err("Unknown format 0x%x", v4l2_format);
return MDP_COLOR_UNKNOWN;
}
void mtk_mdp_hw_set_input_addr(struct mtk_mdp_ctx *ctx,
struct mtk_mdp_addr *addr)
{
struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
int i;
for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
src_buf->addr_mva[i] = (uint64_t)addr->addr[i];
}
void mtk_mdp_hw_set_output_addr(struct mtk_mdp_ctx *ctx,
struct mtk_mdp_addr *addr)
{
struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
int i;
for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
dst_buf->addr_mva[i] = (uint64_t)addr->addr[i];
}
void mtk_mdp_hw_set_in_size(struct mtk_mdp_ctx *ctx)
{
struct mtk_mdp_frame *frame = &ctx->s_frame;
struct mdp_config *config = &ctx->vpu.vsi->src_config;
/* Set input pixel offset */
config->crop_x = frame->crop.left;
config->crop_y = frame->crop.top;
/* Set input cropped size */
config->crop_w = frame->crop.width;
config->crop_h = frame->crop.height;
/* Set input original size */
config->x = 0;
config->y = 0;
config->w = frame->width;
config->h = frame->height;
}
void mtk_mdp_hw_set_in_image_format(struct mtk_mdp_ctx *ctx)
{
unsigned int i;
struct mtk_mdp_frame *frame = &ctx->s_frame;
struct mdp_config *config = &ctx->vpu.vsi->src_config;
struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
src_buf->plane_num = frame->fmt->num_comp;
config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
config->w_stride = 0; /* MDP will calculate it by color format. */
config->h_stride = 0; /* MDP will calculate it by color format. */
for (i = 0; i < src_buf->plane_num; i++)
src_buf->plane_size[i] = frame->payload[i];
}
void mtk_mdp_hw_set_out_size(struct mtk_mdp_ctx *ctx)
{
struct mtk_mdp_frame *frame = &ctx->d_frame;
struct mdp_config *config = &ctx->vpu.vsi->dst_config;
config->crop_x = frame->crop.left;
config->crop_y = frame->crop.top;
config->crop_w = frame->crop.width;
config->crop_h = frame->crop.height;
config->x = 0;
config->y = 0;
config->w = frame->width;
config->h = frame->height;
}
void mtk_mdp_hw_set_out_image_format(struct mtk_mdp_ctx *ctx)
{
unsigned int i;
struct mtk_mdp_frame *frame = &ctx->d_frame;
struct mdp_config *config = &ctx->vpu.vsi->dst_config;
struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
dst_buf->plane_num = frame->fmt->num_comp;
config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
config->w_stride = 0; /* MDP will calculate it by color format. */
config->h_stride = 0; /* MDP will calculate it by color format. */
for (i = 0; i < dst_buf->plane_num; i++)
dst_buf->plane_size[i] = frame->payload[i];
}
void mtk_mdp_hw_set_rotation(struct mtk_mdp_ctx *ctx)
{
struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
misc->orientation = ctx->ctrls.rotate->val;
misc->hflip = ctx->ctrls.hflip->val;
misc->vflip = ctx->ctrls.vflip->val;
}
void mtk_mdp_hw_set_global_alpha(struct mtk_mdp_ctx *ctx)
{
struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
misc->alpha = ctx->ctrls.global_alpha->val;
}
|