1/*
2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 *    Binglin Chen <binglin.chen@intel.com>
26 *
27 */
28
29#ifndef _VSP_CMDBUF_H_
30#define _VSP_CMDBUF_H_
31
32#include <wsbm/wsbm_manager.h>
33
34#include "psb_drv_video.h"
35#include "psb_buffer.h"
36
37struct vsp_cmdbuf_s {
38	struct psb_buffer_s buf;
39	unsigned int size;
40
41	/* Relocation records */
42	unsigned char *reloc_base;
43	struct drm_psb_reloc *reloc_idx;
44
45	/* CMD stream data */
46	int cmd_count;
47	unsigned char *cmd_base;
48	unsigned char *cmd_start;
49	unsigned int *cmd_idx;
50
51	int param_mem_loc;
52
53	/* Referenced buffers */
54	psb_buffer_p *buffer_refs;
55	int buffer_refs_count;
56	int buffer_refs_allocated;
57
58	struct psb_buffer_s param_mem;
59	unsigned char *param_mem_p;
60	unsigned char *pic_param_p;
61	unsigned char *seq_param_p;
62	unsigned char *end_param_p;
63	unsigned char *pipeline_param_p;
64	unsigned char *denoise_param_p;
65	unsigned char *enhancer_param_p;
66	unsigned char *sharpen_param_p;
67	unsigned char *frc_param_p;
68	unsigned char *ref_param_p;
69	unsigned char *compose_param_p;
70};
71
72typedef struct vsp_cmdbuf_s *vsp_cmdbuf_p;
73
74#define VSP_RELOC_CMDBUF(dest, offset, buf) vsp_cmdbuf_add_relocation(cmdbuf, (uint32_t*)(dest), buf, offset, 0XFFFFFFFF, 0, 0, 0, (uint32_t *)cmdbuf->cmd_start)
75
76/**
77 * VSP command:
78 * context
79 * type
80 * buffer
81 * size
82 * buffer_id
83 * irq
84 * reserved6
85 * reserved7
86 */
87/* operation number is inserted by DRM */
88#define vsp_cmdbuf_insert_command(cmdbuf,context_id, ref_buf,type,offset,size)	\
89	do { *cmdbuf->cmd_idx++ = context_id; *cmdbuf->cmd_idx++ = type;\
90	     VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, offset, ref_buf);\
91	     *cmdbuf->cmd_idx++ = size; *cmdbuf->cmd_idx++ = 0;\
92	     *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0; \
93	     *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((ref_buf)->drm_buf));} while(0)
94
95
96#define vsp_cmdbuf_reloc_pic_param(pic_param_dest,offset,ref_buf, dst_buf_loc, pic_param_buf_start)	\
97	do { vsp_cmdbuf_add_relocation(cmdbuf, (uint32_t*)(pic_param_dest), ref_buf, offset, 0XFFFFFFFF, 0, 0, dst_buf_loc,(uint32_t *)pic_param_buf_start); } while(0)
98#define vsp_cmdbuf_fence_pic_param(cmdbuf, pic_param_handler) \
99	do { *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = VspFencePictureParamCommand; *cmdbuf->cmd_idx++ = pic_param_handler; *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0;} while(0)
100
101#define vsp_cmdbuf_vpp_context(cmdbuf, type, buffer, size) \
102	do { *cmdbuf->cmd_idx++ = VSP_API_GENERIC_CONTEXT_ID; \
103	     *cmdbuf->cmd_idx++ = type; \
104	     *cmdbuf->cmd_idx++ = buffer; \
105	     *cmdbuf->cmd_idx++ = size; \
106	     *cmdbuf->cmd_idx++ = 0; \
107	     *cmdbuf->cmd_idx++ = 0; \
108	     *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0;} while(0)
109
110#define vsp_cmdbuf_fence_compose_param(cmdbuf, pic_param_handler) \
111	do { \
112		*cmdbuf->cmd_idx++ = 0; \
113		*cmdbuf->cmd_idx++ = VspFenceComposeCommand; \
114		*cmdbuf->cmd_idx++ = pic_param_handler; \
115		*cmdbuf->cmd_idx++ = 0; \
116		*cmdbuf->cmd_idx++ = 0; \
117		*cmdbuf->cmd_idx++ = 0; \
118		*cmdbuf->cmd_idx++ = 0; \
119		*cmdbuf->cmd_idx++ = 0; \
120	} while(0)
121
122#define vsp_cmdbuf_compose_end(cmdbuf) \
123	do { *cmdbuf->cmd_idx++ = 0; \
124	     *cmdbuf->cmd_idx++ = VssWiDi_ComposeEndOfSequenceCommand; \
125	     *cmdbuf->cmd_idx++ = 0; \
126	     *cmdbuf->cmd_idx++ = 0; \
127	     *cmdbuf->cmd_idx++ = 0; \
128	     *cmdbuf->cmd_idx++ = 0; \
129	     *cmdbuf->cmd_idx++ = 0; \
130	     *cmdbuf->cmd_idx++ = 0;} while(0)
131
132/*
133 * Create command buffer
134 */
135VAStatus vsp_cmdbuf_create(object_context_p obj_context,
136                           psb_driver_data_p driver_data,
137                           vsp_cmdbuf_p cmdbuf
138	);
139
140/*
141 * Destroy buffer
142 */
143void vsp_cmdbuf_destroy(vsp_cmdbuf_p cmdbuf);
144
145/*
146 * Reset buffer & map
147 *
148 * Returns 0 on success
149 */
150int vsp_cmdbuf_reset(vsp_cmdbuf_p cmdbuf);
151
152/*
153 * Unmap buffer
154 *
155 * Returns 0 on success
156 */
157int vsp_cmdbuf_unmap(vsp_cmdbuf_p cmdbuf);
158
159/*
160 * Advances "obj_context" to the next cmdbuf
161 *
162 * Returns 0 on success
163 */
164int vsp_context_get_next_cmdbuf(object_context_p obj_context);
165
166/*
167 * Submits the current cmdbuf
168 *
169 * Returns 0 on success
170 */
171int vsp_context_submit_cmdbuf(object_context_p obj_context);
172
173/*
174 * Flushes the pending cmdbuf
175 *
176 * Return 0 on success
177 */
178int vsp_context_flush_cmdbuf(object_context_p obj_context);
179
180void vsp_cmdbuf_add_relocation(vsp_cmdbuf_p cmdbuf,
181                               uint32_t *addr_in_dst_buffer,
182                               psb_buffer_p ref_buffer,
183                               uint32_t buf_offset,
184                               uint32_t mask,
185                               uint32_t background,
186                               uint32_t align_shift,
187                               uint32_t dst_buffer,
188                               uint32_t *start_of_dst_buffer);
189int vsp_cmdbuf_buffer_ref(vsp_cmdbuf_p cmdbuf, psb_buffer_p buf);
190
191#endif /* _VSP_CMDBUF_H_ */
192