brintos

brintos / linux-shallow public Read only

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