linux/drivers/media/platform/mtk-mdp/mtk_mdp_regs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   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