123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /*
- * 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;
- }
|