1*43ecec16SMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0-or-later
2*43ecec16SMauro Carvalho Chehab /*
3*43ecec16SMauro Carvalho Chehab  * linux/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd_v6.c
4*43ecec16SMauro Carvalho Chehab  *
5*43ecec16SMauro Carvalho Chehab  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6*43ecec16SMauro Carvalho Chehab  *		http://www.samsung.com/
7*43ecec16SMauro Carvalho Chehab  */
8*43ecec16SMauro Carvalho Chehab 
9*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_common.h"
10*43ecec16SMauro Carvalho Chehab 
11*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_cmd.h"
12*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_debug.h"
13*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_intr.h"
14*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_opr.h"
15*43ecec16SMauro Carvalho Chehab #include "s5p_mfc_cmd_v6.h"
16*43ecec16SMauro Carvalho Chehab 
s5p_mfc_cmd_host2risc_v6(struct s5p_mfc_dev * dev,int cmd,struct s5p_mfc_cmd_args * args)17*43ecec16SMauro Carvalho Chehab static int s5p_mfc_cmd_host2risc_v6(struct s5p_mfc_dev *dev, int cmd,
18*43ecec16SMauro Carvalho Chehab 				struct s5p_mfc_cmd_args *args)
19*43ecec16SMauro Carvalho Chehab {
20*43ecec16SMauro Carvalho Chehab 	mfc_debug(2, "Issue the command: %d\n", cmd);
21*43ecec16SMauro Carvalho Chehab 
22*43ecec16SMauro Carvalho Chehab 	/* Reset RISC2HOST command */
23*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, 0x0, S5P_FIMV_RISC2HOST_CMD_V6);
24*43ecec16SMauro Carvalho Chehab 
25*43ecec16SMauro Carvalho Chehab 	/* Issue the command */
26*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, cmd, S5P_FIMV_HOST2RISC_CMD_V6);
27*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, 0x1, S5P_FIMV_HOST2RISC_INT_V6);
28*43ecec16SMauro Carvalho Chehab 
29*43ecec16SMauro Carvalho Chehab 	return 0;
30*43ecec16SMauro Carvalho Chehab }
31*43ecec16SMauro Carvalho Chehab 
s5p_mfc_sys_init_cmd_v6(struct s5p_mfc_dev * dev)32*43ecec16SMauro Carvalho Chehab static int s5p_mfc_sys_init_cmd_v6(struct s5p_mfc_dev *dev)
33*43ecec16SMauro Carvalho Chehab {
34*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_cmd_args h2r_args;
35*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_buf_size_v6 *buf_size = dev->variant->buf_size->priv;
36*43ecec16SMauro Carvalho Chehab 	int ret;
37*43ecec16SMauro Carvalho Chehab 
38*43ecec16SMauro Carvalho Chehab 	ret = s5p_mfc_hw_call(dev->mfc_ops, alloc_dev_context_buffer, dev);
39*43ecec16SMauro Carvalho Chehab 	if (ret)
40*43ecec16SMauro Carvalho Chehab 		return ret;
41*43ecec16SMauro Carvalho Chehab 
42*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, dev->ctx_buf.dma, S5P_FIMV_CONTEXT_MEM_ADDR_V6);
43*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, buf_size->dev_ctx, S5P_FIMV_CONTEXT_MEM_SIZE_V6);
44*43ecec16SMauro Carvalho Chehab 	return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_SYS_INIT_V6,
45*43ecec16SMauro Carvalho Chehab 					&h2r_args);
46*43ecec16SMauro Carvalho Chehab }
47*43ecec16SMauro Carvalho Chehab 
s5p_mfc_sleep_cmd_v6(struct s5p_mfc_dev * dev)48*43ecec16SMauro Carvalho Chehab static int s5p_mfc_sleep_cmd_v6(struct s5p_mfc_dev *dev)
49*43ecec16SMauro Carvalho Chehab {
50*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_cmd_args h2r_args;
51*43ecec16SMauro Carvalho Chehab 
52*43ecec16SMauro Carvalho Chehab 	memset(&h2r_args, 0, sizeof(struct s5p_mfc_cmd_args));
53*43ecec16SMauro Carvalho Chehab 	return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_SLEEP_V6,
54*43ecec16SMauro Carvalho Chehab 			&h2r_args);
55*43ecec16SMauro Carvalho Chehab }
56*43ecec16SMauro Carvalho Chehab 
s5p_mfc_wakeup_cmd_v6(struct s5p_mfc_dev * dev)57*43ecec16SMauro Carvalho Chehab static int s5p_mfc_wakeup_cmd_v6(struct s5p_mfc_dev *dev)
58*43ecec16SMauro Carvalho Chehab {
59*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_cmd_args h2r_args;
60*43ecec16SMauro Carvalho Chehab 
61*43ecec16SMauro Carvalho Chehab 	memset(&h2r_args, 0, sizeof(struct s5p_mfc_cmd_args));
62*43ecec16SMauro Carvalho Chehab 	return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_WAKEUP_V6,
63*43ecec16SMauro Carvalho Chehab 					&h2r_args);
64*43ecec16SMauro Carvalho Chehab }
65*43ecec16SMauro Carvalho Chehab 
66*43ecec16SMauro Carvalho Chehab /* Open a new instance and get its number */
s5p_mfc_open_inst_cmd_v6(struct s5p_mfc_ctx * ctx)67*43ecec16SMauro Carvalho Chehab static int s5p_mfc_open_inst_cmd_v6(struct s5p_mfc_ctx *ctx)
68*43ecec16SMauro Carvalho Chehab {
69*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_dev *dev = ctx->dev;
70*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_cmd_args h2r_args;
71*43ecec16SMauro Carvalho Chehab 	int codec_type;
72*43ecec16SMauro Carvalho Chehab 
73*43ecec16SMauro Carvalho Chehab 	mfc_debug(2, "Requested codec mode: %d\n", ctx->codec_mode);
74*43ecec16SMauro Carvalho Chehab 	dev->curr_ctx = ctx->num;
75*43ecec16SMauro Carvalho Chehab 	switch (ctx->codec_mode) {
76*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H264_DEC:
77*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H264_DEC_V6;
78*43ecec16SMauro Carvalho Chehab 		break;
79*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H264_MVC_DEC:
80*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H264_MVC_DEC_V6;
81*43ecec16SMauro Carvalho Chehab 		break;
82*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_VC1_DEC:
83*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_VC1_DEC_V6;
84*43ecec16SMauro Carvalho Chehab 		break;
85*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_MPEG4_DEC:
86*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_MPEG4_DEC_V6;
87*43ecec16SMauro Carvalho Chehab 		break;
88*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_MPEG2_DEC:
89*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_MPEG2_DEC_V6;
90*43ecec16SMauro Carvalho Chehab 		break;
91*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H263_DEC:
92*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H263_DEC_V6;
93*43ecec16SMauro Carvalho Chehab 		break;
94*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_VC1RCV_DEC:
95*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_VC1RCV_DEC_V6;
96*43ecec16SMauro Carvalho Chehab 		break;
97*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_VP8_DEC:
98*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_VP8_DEC_V6;
99*43ecec16SMauro Carvalho Chehab 		break;
100*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_HEVC_DEC:
101*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_HEVC_DEC;
102*43ecec16SMauro Carvalho Chehab 		break;
103*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_VP9_DEC:
104*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_VP9_DEC;
105*43ecec16SMauro Carvalho Chehab 		break;
106*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H264_ENC:
107*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H264_ENC_V6;
108*43ecec16SMauro Carvalho Chehab 		break;
109*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H264_MVC_ENC:
110*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H264_MVC_ENC_V6;
111*43ecec16SMauro Carvalho Chehab 		break;
112*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_MPEG4_ENC:
113*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_MPEG4_ENC_V6;
114*43ecec16SMauro Carvalho Chehab 		break;
115*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_H263_ENC:
116*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_H263_ENC_V6;
117*43ecec16SMauro Carvalho Chehab 		break;
118*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_VP8_ENC:
119*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_VP8_ENC_V7;
120*43ecec16SMauro Carvalho Chehab 		break;
121*43ecec16SMauro Carvalho Chehab 	case S5P_MFC_CODEC_HEVC_ENC:
122*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_HEVC_ENC;
123*43ecec16SMauro Carvalho Chehab 		break;
124*43ecec16SMauro Carvalho Chehab 	default:
125*43ecec16SMauro Carvalho Chehab 		codec_type = S5P_FIMV_CODEC_NONE_V6;
126*43ecec16SMauro Carvalho Chehab 	}
127*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, codec_type, S5P_FIMV_CODEC_TYPE_V6);
128*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, ctx->ctx.dma, S5P_FIMV_CONTEXT_MEM_ADDR_V6);
129*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, ctx->ctx.size, S5P_FIMV_CONTEXT_MEM_SIZE_V6);
130*43ecec16SMauro Carvalho Chehab 	mfc_write(dev, 0, S5P_FIMV_D_CRC_CTRL_V6); /* no crc */
131*43ecec16SMauro Carvalho Chehab 
132*43ecec16SMauro Carvalho Chehab 	return s5p_mfc_cmd_host2risc_v6(dev, S5P_FIMV_H2R_CMD_OPEN_INSTANCE_V6,
133*43ecec16SMauro Carvalho Chehab 					&h2r_args);
134*43ecec16SMauro Carvalho Chehab }
135*43ecec16SMauro Carvalho Chehab 
136*43ecec16SMauro Carvalho Chehab /* Close instance */
s5p_mfc_close_inst_cmd_v6(struct s5p_mfc_ctx * ctx)137*43ecec16SMauro Carvalho Chehab static int s5p_mfc_close_inst_cmd_v6(struct s5p_mfc_ctx *ctx)
138*43ecec16SMauro Carvalho Chehab {
139*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_dev *dev = ctx->dev;
140*43ecec16SMauro Carvalho Chehab 	struct s5p_mfc_cmd_args h2r_args;
141*43ecec16SMauro Carvalho Chehab 	int ret = 0;
142*43ecec16SMauro Carvalho Chehab 
143*43ecec16SMauro Carvalho Chehab 	dev->curr_ctx = ctx->num;
144*43ecec16SMauro Carvalho Chehab 	if (ctx->state != MFCINST_FREE) {
145*43ecec16SMauro Carvalho Chehab 		mfc_write(dev, ctx->inst_no, S5P_FIMV_INSTANCE_ID_V6);
146*43ecec16SMauro Carvalho Chehab 		ret = s5p_mfc_cmd_host2risc_v6(dev,
147*43ecec16SMauro Carvalho Chehab 					S5P_FIMV_H2R_CMD_CLOSE_INSTANCE_V6,
148*43ecec16SMauro Carvalho Chehab 					&h2r_args);
149*43ecec16SMauro Carvalho Chehab 	} else {
150*43ecec16SMauro Carvalho Chehab 		ret = -EINVAL;
151*43ecec16SMauro Carvalho Chehab 	}
152*43ecec16SMauro Carvalho Chehab 
153*43ecec16SMauro Carvalho Chehab 	return ret;
154*43ecec16SMauro Carvalho Chehab }
155*43ecec16SMauro Carvalho Chehab 
156*43ecec16SMauro Carvalho Chehab /* Initialize cmd function pointers for MFC v6 */
157*43ecec16SMauro Carvalho Chehab static struct s5p_mfc_hw_cmds s5p_mfc_cmds_v6 = {
158*43ecec16SMauro Carvalho Chehab 	.cmd_host2risc = s5p_mfc_cmd_host2risc_v6,
159*43ecec16SMauro Carvalho Chehab 	.sys_init_cmd = s5p_mfc_sys_init_cmd_v6,
160*43ecec16SMauro Carvalho Chehab 	.sleep_cmd = s5p_mfc_sleep_cmd_v6,
161*43ecec16SMauro Carvalho Chehab 	.wakeup_cmd = s5p_mfc_wakeup_cmd_v6,
162*43ecec16SMauro Carvalho Chehab 	.open_inst_cmd = s5p_mfc_open_inst_cmd_v6,
163*43ecec16SMauro Carvalho Chehab 	.close_inst_cmd = s5p_mfc_close_inst_cmd_v6,
164*43ecec16SMauro Carvalho Chehab };
165*43ecec16SMauro Carvalho Chehab 
s5p_mfc_init_hw_cmds_v6(void)166*43ecec16SMauro Carvalho Chehab struct s5p_mfc_hw_cmds *s5p_mfc_init_hw_cmds_v6(void)
167*43ecec16SMauro Carvalho Chehab {
168*43ecec16SMauro Carvalho Chehab 	return &s5p_mfc_cmds_v6;
169*43ecec16SMauro Carvalho Chehab }
170