1f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park/* 2f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * linux/drivers/media/platform/s5p-mfc/s5p_mfc_cmd_v6.c 3f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * 4f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * http://www.samsung.com/ 6f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * 7f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * This program is free software; you can redistribute it and/or modify 8f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * it under the terms of the GNU General Public License as published by 9f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * the Free Software Foundation; either version 2 of the License, or 10f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park * (at your option) any later version. 11f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park */ 12f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 13f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park#include "s5p_mfc_common.h" 14f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 15f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park#include "s5p_mfc_cmd.h" 16f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park#include "s5p_mfc_debug.h" 17f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park#include "s5p_mfc_intr.h" 18f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park#include "s5p_mfc_opr.h" 198492ec69801ea039546fd27e84fa84f7a0612474Mauro Carvalho Chehab#include "s5p_mfc_cmd_v6.h" 20f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 2195a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_cmd_host2risc_v6(struct s5p_mfc_dev *dev, int cmd, 22f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args *args) 23f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 24f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_debug(2, "Issue the command: %d\n", cmd); 25f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 26f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park /* Reset RISC2HOST command */ 27f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, 0x0, S5P_FIMV_RISC2HOST_CMD_V6); 28f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 29f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park /* Issue the command */ 30f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, cmd, S5P_FIMV_HOST2RISC_CMD_V6); 31f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, 0x1, S5P_FIMV_HOST2RISC_INT_V6); 32f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 33f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return 0; 34f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 35f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 3695a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_sys_init_cmd_v6(struct s5p_mfc_dev *dev) 37f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 38f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args h2r_args; 39f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_buf_size_v6 *buf_size = dev->variant->buf_size->priv; 40f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 41f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park s5p_mfc_hw_call(dev->mfc_ops, alloc_dev_context_buffer, dev); 42f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, dev->ctx_buf.dma, S5P_FIMV_CONTEXT_MEM_ADDR_V6); 43f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, buf_size->dev_ctx, S5P_FIMV_CONTEXT_MEM_SIZE_V6); 44f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_SYS_INIT_V6, 45f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park &h2r_args); 46f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 47f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 4895a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_sleep_cmd_v6(struct s5p_mfc_dev *dev) 49f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 50f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args h2r_args; 51f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 52f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park memset(&h2r_args, 0, sizeof(struct s5p_mfc_cmd_args)); 53f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_SLEEP_V6, 54f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park &h2r_args); 55f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 56f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 5795a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_wakeup_cmd_v6(struct s5p_mfc_dev *dev) 58f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 59f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args h2r_args; 60f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 61f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park memset(&h2r_args, 0, sizeof(struct s5p_mfc_cmd_args)); 62f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_WAKEUP_V6, 63f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park &h2r_args); 64f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 65f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 66f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park/* Open a new instance and get its number */ 6795a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_open_inst_cmd_v6(struct s5p_mfc_ctx *ctx) 68f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 69f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_dev *dev = ctx->dev; 70f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args h2r_args; 71f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park int codec_type; 72f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 73f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_debug(2, "Requested codec mode: %d\n", ctx->codec_mode); 74f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park dev->curr_ctx = ctx->num; 75f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park switch (ctx->codec_mode) { 76f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H264_DEC: 77f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H264_DEC_V6; 78f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 79f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H264_MVC_DEC: 80f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H264_MVC_DEC_V6; 81f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 82f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_VC1_DEC: 83f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_VC1_DEC_V6; 84f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 85f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_MPEG4_DEC: 86f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_MPEG4_DEC_V6; 87f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 88f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_MPEG2_DEC: 89f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_MPEG2_DEC_V6; 90f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 91f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H263_DEC: 92f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H263_DEC_V6; 93f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 94f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_VC1RCV_DEC: 95f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_VC1RCV_DEC_V6; 96f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 97f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_VP8_DEC: 98f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_VP8_DEC_V6; 99f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 100f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H264_ENC: 101f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H264_ENC_V6; 102f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 103f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H264_MVC_ENC: 104f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H264_MVC_ENC_V6; 105f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 106f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_MPEG4_ENC: 107f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_MPEG4_ENC_V6; 108f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 109f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park case S5P_MFC_CODEC_H263_ENC: 110f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_H263_ENC_V6; 111f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park break; 1123a9677063f00a61b6067a07df3d7ee12eace79b7Arun Kumar K case S5P_MFC_CODEC_VP8_ENC: 1133a9677063f00a61b6067a07df3d7ee12eace79b7Arun Kumar K codec_type = S5P_FIMV_CODEC_VP8_ENC_V7; 1143a9677063f00a61b6067a07df3d7ee12eace79b7Arun Kumar K break; 115f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park default: 116f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park codec_type = S5P_FIMV_CODEC_NONE_V6; 1172028c71d54e7bd7eb4470d5968f581f9f9284406Joe Perches } 118f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, codec_type, S5P_FIMV_CODEC_TYPE_V6); 119f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, ctx->ctx.dma, S5P_FIMV_CONTEXT_MEM_ADDR_V6); 120f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, ctx->ctx.size, S5P_FIMV_CONTEXT_MEM_SIZE_V6); 121f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, 0, S5P_FIMV_D_CRC_CTRL_V6); /* no crc */ 122f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 123f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_OPEN_INSTANCE_V6, 124f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park &h2r_args); 125f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 126f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 127f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park/* Close instance */ 12895a75544cfb1410af721911cd8accdbc1a080b40Sachin Kamatstatic int s5p_mfc_close_inst_cmd_v6(struct s5p_mfc_ctx *ctx) 129f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 130f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_dev *dev = ctx->dev; 131f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park struct s5p_mfc_cmd_args h2r_args; 132f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park int ret = 0; 133f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 134f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park dev->curr_ctx = ctx->num; 135f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park if (ctx->state != MFCINST_FREE) { 136f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park mfc_write(dev, ctx->inst_no, S5P_FIMV_INSTANCE_ID_V6); 137f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park ret = s5p_mfc_cmd_host2risc_v6(dev, 138f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park S5P_FIMV_H2R_CMD_CLOSE_INSTANCE_V6, 139f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park &h2r_args); 140f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park } else { 141f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park ret = -EINVAL; 142f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park } 143f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 144f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return ret; 145f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 146f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 147f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park/* Initialize cmd function pointers for MFC v6 */ 148f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Parkstatic struct s5p_mfc_hw_cmds s5p_mfc_cmds_v6 = { 149f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .cmd_host2risc = s5p_mfc_cmd_host2risc_v6, 150f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .sys_init_cmd = s5p_mfc_sys_init_cmd_v6, 151f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .sleep_cmd = s5p_mfc_sleep_cmd_v6, 152f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .wakeup_cmd = s5p_mfc_wakeup_cmd_v6, 153f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .open_inst_cmd = s5p_mfc_open_inst_cmd_v6, 154f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park .close_inst_cmd = s5p_mfc_close_inst_cmd_v6, 155f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park}; 156f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park 157f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Parkstruct s5p_mfc_hw_cmds *s5p_mfc_init_hw_cmds_v6(void) 158f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park{ 159f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park return &s5p_mfc_cmds_v6; 160f96f3cfa0bb8f777fe877d7f881bf7ee58bd162aJeongtae Park} 161