xref: /aosp_15_r20/external/libdrm/tests/tegra/vic42.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright © 2018 NVIDIA Corporation
3*7688df22SAndroid Build Coastguard Worker  *
4*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker  *
11*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker  *
14*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7688df22SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker  */
22*7688df22SAndroid Build Coastguard Worker 
23*7688df22SAndroid Build Coastguard Worker #include <errno.h>
24*7688df22SAndroid Build Coastguard Worker #include <string.h>
25*7688df22SAndroid Build Coastguard Worker 
26*7688df22SAndroid Build Coastguard Worker #include "private.h"
27*7688df22SAndroid Build Coastguard Worker #include "tegra.h"
28*7688df22SAndroid Build Coastguard Worker #include "vic.h"
29*7688df22SAndroid Build Coastguard Worker #include "vic42.h"
30*7688df22SAndroid Build Coastguard Worker 
31*7688df22SAndroid Build Coastguard Worker struct vic42 {
32*7688df22SAndroid Build Coastguard Worker     struct vic base;
33*7688df22SAndroid Build Coastguard Worker 
34*7688df22SAndroid Build Coastguard Worker     struct {
35*7688df22SAndroid Build Coastguard Worker         struct drm_tegra_mapping *map;
36*7688df22SAndroid Build Coastguard Worker         struct drm_tegra_bo *bo;
37*7688df22SAndroid Build Coastguard Worker     } config;
38*7688df22SAndroid Build Coastguard Worker 
39*7688df22SAndroid Build Coastguard Worker     struct {
40*7688df22SAndroid Build Coastguard Worker         struct drm_tegra_mapping *map;
41*7688df22SAndroid Build Coastguard Worker         struct drm_tegra_bo *bo;
42*7688df22SAndroid Build Coastguard Worker     } filter;
43*7688df22SAndroid Build Coastguard Worker };
44*7688df22SAndroid Build Coastguard Worker 
vic42_fill(struct vic * v,struct vic_image * output,unsigned int left,unsigned int top,unsigned int right,unsigned int bottom,unsigned int alpha,unsigned int red,unsigned int green,unsigned int blue)45*7688df22SAndroid Build Coastguard Worker static int vic42_fill(struct vic *v, struct vic_image *output,
46*7688df22SAndroid Build Coastguard Worker                       unsigned int left, unsigned int top,
47*7688df22SAndroid Build Coastguard Worker                       unsigned int right, unsigned int bottom,
48*7688df22SAndroid Build Coastguard Worker                       unsigned int alpha, unsigned int red,
49*7688df22SAndroid Build Coastguard Worker                       unsigned int green, unsigned int blue)
50*7688df22SAndroid Build Coastguard Worker {
51*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic = container_of(v, struct vic42, base);
52*7688df22SAndroid Build Coastguard Worker     ConfigStruct *c;
53*7688df22SAndroid Build Coastguard Worker     int err;
54*7688df22SAndroid Build Coastguard Worker 
55*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(vic->config.bo, (void **)&c);
56*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
57*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map configuration structure: %s\n",
58*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
59*7688df22SAndroid Build Coastguard Worker         return err;
60*7688df22SAndroid Build Coastguard Worker     }
61*7688df22SAndroid Build Coastguard Worker 
62*7688df22SAndroid Build Coastguard Worker     memset(c, 0, sizeof(*c));
63*7688df22SAndroid Build Coastguard Worker 
64*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectTop = top;
65*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectLeft = left;
66*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectRight = right;
67*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectBottom = bottom;
68*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundAlpha = alpha;
69*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundR = red;
70*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundG = green;
71*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundB = blue;
72*7688df22SAndroid Build Coastguard Worker 
73*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutPixelFormat = output->format;
74*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkKind = output->kind;
75*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkHeight = 0;
76*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceWidth = output->width - 1;
77*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceHeight = output->height - 1;
78*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaWidth = output->stride - 1;
79*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaHeight = output->height - 1;
80*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaWidth = 16383;
81*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaHeight = 16383;
82*7688df22SAndroid Build Coastguard Worker 
83*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unmap(vic->config.bo);
84*7688df22SAndroid Build Coastguard Worker 
85*7688df22SAndroid Build Coastguard Worker     return 0;
86*7688df22SAndroid Build Coastguard Worker }
87*7688df22SAndroid Build Coastguard Worker 
vic42_blit(struct vic * v,struct vic_image * output,struct vic_image * input)88*7688df22SAndroid Build Coastguard Worker static int vic42_blit(struct vic *v, struct vic_image *output,
89*7688df22SAndroid Build Coastguard Worker                       struct vic_image *input)
90*7688df22SAndroid Build Coastguard Worker {
91*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic = container_of(v, struct vic42, base);
92*7688df22SAndroid Build Coastguard Worker     SlotSurfaceConfig *surface;
93*7688df22SAndroid Build Coastguard Worker     SlotConfig *slot;
94*7688df22SAndroid Build Coastguard Worker     ConfigStruct *c;
95*7688df22SAndroid Build Coastguard Worker     int err;
96*7688df22SAndroid Build Coastguard Worker 
97*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(vic->config.bo, (void **)&c);
98*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
99*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map configuration structure: %s\n",
100*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
101*7688df22SAndroid Build Coastguard Worker         return err;
102*7688df22SAndroid Build Coastguard Worker     }
103*7688df22SAndroid Build Coastguard Worker 
104*7688df22SAndroid Build Coastguard Worker     memset(c, 0, sizeof(*c));
105*7688df22SAndroid Build Coastguard Worker 
106*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectTop = 0;
107*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectLeft = 0;
108*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectRight = output->width - 1;
109*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectBottom = output->height - 1;
110*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundAlpha = 255;
111*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundR = 1023;
112*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundG = 1023;
113*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundB = 1023;
114*7688df22SAndroid Build Coastguard Worker 
115*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutPixelFormat = output->format;
116*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkKind = output->kind;
117*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkHeight = 0;
118*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceWidth = output->width - 1;
119*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceHeight = output->height - 1;
120*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaWidth = output->stride - 1;
121*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaHeight = output->height - 1;
122*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaWidth = 16383;
123*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaHeight = 16383;
124*7688df22SAndroid Build Coastguard Worker 
125*7688df22SAndroid Build Coastguard Worker     slot = &c->slotStruct[0].slotConfig;
126*7688df22SAndroid Build Coastguard Worker     slot->SlotEnable = 1;
127*7688df22SAndroid Build Coastguard Worker     slot->CurrentFieldEnable = 1;
128*7688df22SAndroid Build Coastguard Worker     slot->PlanarAlpha = 255;
129*7688df22SAndroid Build Coastguard Worker     slot->ConstantAlpha = 1;
130*7688df22SAndroid Build Coastguard Worker     slot->SourceRectLeft = 0 << 16;
131*7688df22SAndroid Build Coastguard Worker     slot->SourceRectRight = (input->width - 1) << 16;
132*7688df22SAndroid Build Coastguard Worker     slot->SourceRectTop = 0 << 16;
133*7688df22SAndroid Build Coastguard Worker     slot->SourceRectBottom = (input->height - 1) << 16;
134*7688df22SAndroid Build Coastguard Worker     slot->DestRectLeft = 0;
135*7688df22SAndroid Build Coastguard Worker     slot->DestRectRight = output->width - 1;
136*7688df22SAndroid Build Coastguard Worker     slot->DestRectTop = 0;
137*7688df22SAndroid Build Coastguard Worker     slot->DestRectBottom = output->height - 1;
138*7688df22SAndroid Build Coastguard Worker     slot->SoftClampHigh = 1023;
139*7688df22SAndroid Build Coastguard Worker 
140*7688df22SAndroid Build Coastguard Worker     surface = &c->slotStruct[0].slotSurfaceConfig;
141*7688df22SAndroid Build Coastguard Worker     surface->SlotPixelFormat = input->format;
142*7688df22SAndroid Build Coastguard Worker     surface->SlotBlkKind = input->kind;
143*7688df22SAndroid Build Coastguard Worker     surface->SlotBlkHeight = 0; /* XXX */
144*7688df22SAndroid Build Coastguard Worker     surface->SlotCacheWidth = VIC_CACHE_WIDTH_64Bx4; /* XXX */
145*7688df22SAndroid Build Coastguard Worker     surface->SlotSurfaceWidth = input->width - 1;
146*7688df22SAndroid Build Coastguard Worker     surface->SlotSurfaceHeight = input->height - 1;
147*7688df22SAndroid Build Coastguard Worker     surface->SlotLumaWidth = input->stride - 1;
148*7688df22SAndroid Build Coastguard Worker     surface->SlotLumaHeight = input->height - 1;
149*7688df22SAndroid Build Coastguard Worker     surface->SlotChromaWidth = 16383;
150*7688df22SAndroid Build Coastguard Worker     surface->SlotChromaHeight = 16383;
151*7688df22SAndroid Build Coastguard Worker 
152*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unmap(vic->config.bo);
153*7688df22SAndroid Build Coastguard Worker 
154*7688df22SAndroid Build Coastguard Worker     return 0;
155*7688df22SAndroid Build Coastguard Worker }
156*7688df22SAndroid Build Coastguard Worker 
vic42_flip(struct vic * v,struct vic_image * output,struct vic_image * input)157*7688df22SAndroid Build Coastguard Worker static int vic42_flip(struct vic *v, struct vic_image *output,
158*7688df22SAndroid Build Coastguard Worker                       struct vic_image *input)
159*7688df22SAndroid Build Coastguard Worker {
160*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic = container_of(v, struct vic42, base);
161*7688df22SAndroid Build Coastguard Worker     SlotSurfaceConfig *surface;
162*7688df22SAndroid Build Coastguard Worker     SlotConfig *slot;
163*7688df22SAndroid Build Coastguard Worker     ConfigStruct *c;
164*7688df22SAndroid Build Coastguard Worker     int err;
165*7688df22SAndroid Build Coastguard Worker 
166*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(vic->config.bo, (void **)&c);
167*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
168*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map configuration structure: %s\n",
169*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
170*7688df22SAndroid Build Coastguard Worker         return err;
171*7688df22SAndroid Build Coastguard Worker     }
172*7688df22SAndroid Build Coastguard Worker 
173*7688df22SAndroid Build Coastguard Worker     memset(c, 0, sizeof(*c));
174*7688df22SAndroid Build Coastguard Worker 
175*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectTop = 0;
176*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectLeft = 0;
177*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectRight = output->width - 1;
178*7688df22SAndroid Build Coastguard Worker     c->outputConfig.TargetRectBottom = output->height - 1;
179*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundAlpha = 255;
180*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundR = 1023;
181*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundG = 1023;
182*7688df22SAndroid Build Coastguard Worker     c->outputConfig.BackgroundB = 1023;
183*7688df22SAndroid Build Coastguard Worker     c->outputConfig.OutputFlipY = 1;
184*7688df22SAndroid Build Coastguard Worker 
185*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutPixelFormat = output->format;
186*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkKind = output->kind;
187*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutBlkHeight = 0;
188*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceWidth = output->width - 1;
189*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutSurfaceHeight = output->height - 1;
190*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaWidth = output->stride - 1;
191*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutLumaHeight = output->height - 1;
192*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaWidth = 16383;
193*7688df22SAndroid Build Coastguard Worker     c->outputSurfaceConfig.OutChromaHeight = 16383;
194*7688df22SAndroid Build Coastguard Worker 
195*7688df22SAndroid Build Coastguard Worker     slot = &c->slotStruct[0].slotConfig;
196*7688df22SAndroid Build Coastguard Worker     slot->SlotEnable = 1;
197*7688df22SAndroid Build Coastguard Worker     slot->CurrentFieldEnable = 1;
198*7688df22SAndroid Build Coastguard Worker     slot->PlanarAlpha = 255;
199*7688df22SAndroid Build Coastguard Worker     slot->ConstantAlpha = 1;
200*7688df22SAndroid Build Coastguard Worker     slot->SourceRectLeft = 0 << 16;
201*7688df22SAndroid Build Coastguard Worker     slot->SourceRectRight = (input->width - 1) << 16;
202*7688df22SAndroid Build Coastguard Worker     slot->SourceRectTop = 0 << 16;
203*7688df22SAndroid Build Coastguard Worker     slot->SourceRectBottom = (input->height - 1) << 16;
204*7688df22SAndroid Build Coastguard Worker     slot->DestRectLeft = 0;
205*7688df22SAndroid Build Coastguard Worker     slot->DestRectRight = output->width - 1;
206*7688df22SAndroid Build Coastguard Worker     slot->DestRectTop = 0;
207*7688df22SAndroid Build Coastguard Worker     slot->DestRectBottom = output->height - 1;
208*7688df22SAndroid Build Coastguard Worker     slot->SoftClampHigh = 1023;
209*7688df22SAndroid Build Coastguard Worker 
210*7688df22SAndroid Build Coastguard Worker     surface = &c->slotStruct[0].slotSurfaceConfig;
211*7688df22SAndroid Build Coastguard Worker     surface->SlotPixelFormat = input->format;
212*7688df22SAndroid Build Coastguard Worker     surface->SlotBlkKind = input->kind;
213*7688df22SAndroid Build Coastguard Worker     surface->SlotBlkHeight = 0; /* XXX */
214*7688df22SAndroid Build Coastguard Worker     surface->SlotCacheWidth = VIC_CACHE_WIDTH_64Bx4; /* XXX */
215*7688df22SAndroid Build Coastguard Worker     surface->SlotSurfaceWidth = input->width - 1;
216*7688df22SAndroid Build Coastguard Worker     surface->SlotSurfaceHeight = input->height - 1;
217*7688df22SAndroid Build Coastguard Worker     surface->SlotLumaWidth = input->stride - 1;
218*7688df22SAndroid Build Coastguard Worker     surface->SlotLumaHeight = input->height - 1;
219*7688df22SAndroid Build Coastguard Worker     surface->SlotChromaWidth = 16383;
220*7688df22SAndroid Build Coastguard Worker     surface->SlotChromaHeight = 16383;
221*7688df22SAndroid Build Coastguard Worker 
222*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unmap(vic->config.bo);
223*7688df22SAndroid Build Coastguard Worker 
224*7688df22SAndroid Build Coastguard Worker     return 0;
225*7688df22SAndroid Build Coastguard Worker }
226*7688df22SAndroid Build Coastguard Worker 
vic42_execute(struct vic * v,struct drm_tegra_pushbuf * pushbuf,uint32_t ** ptrp,struct vic_image * output,struct vic_image ** inputs,unsigned int num_inputs)227*7688df22SAndroid Build Coastguard Worker static int vic42_execute(struct vic *v, struct drm_tegra_pushbuf *pushbuf,
228*7688df22SAndroid Build Coastguard Worker                          uint32_t **ptrp, struct vic_image *output,
229*7688df22SAndroid Build Coastguard Worker                          struct vic_image **inputs, unsigned int num_inputs)
230*7688df22SAndroid Build Coastguard Worker {
231*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic = container_of(v, struct vic42, base);
232*7688df22SAndroid Build Coastguard Worker     unsigned int i;
233*7688df22SAndroid Build Coastguard Worker 
234*7688df22SAndroid Build Coastguard Worker     if (num_inputs > 1)
235*7688df22SAndroid Build Coastguard Worker         return -EINVAL;
236*7688df22SAndroid Build Coastguard Worker 
237*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_METHOD(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_SET_APPLICATION_ID, 1);
238*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_METHOD(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_SET_CONTROL_PARAMS, (sizeof(ConfigStruct) / 16) << 16);
239*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_BUFFER(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_SET_CONFIG_STRUCT_OFFSET, vic->config.map, 0, 0);
240*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_BUFFER(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_SET_FILTER_STRUCT_OFFSET, vic->filter.map, 0, 0);
241*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_BUFFER(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_SET_OUTPUT_SURFACE_LUMA_OFFSET, output->map, 0, 0);
242*7688df22SAndroid Build Coastguard Worker 
243*7688df22SAndroid Build Coastguard Worker     for (i = 0; i < num_inputs; i++) {
244*7688df22SAndroid Build Coastguard Worker         uint32_t method = NVC5B6_VIDEO_COMPOSITOR_SET_SURFACE0_LUMA_OFFSET(0) + (i * 3) * 4;
245*7688df22SAndroid Build Coastguard Worker 
246*7688df22SAndroid Build Coastguard Worker         VIC_PUSH_BUFFER(pushbuf, ptrp, method, inputs[i]->map, 0, 0);
247*7688df22SAndroid Build Coastguard Worker     }
248*7688df22SAndroid Build Coastguard Worker 
249*7688df22SAndroid Build Coastguard Worker     VIC_PUSH_METHOD(pushbuf, ptrp, NVC5B6_VIDEO_COMPOSITOR_EXECUTE, 1 << 8);
250*7688df22SAndroid Build Coastguard Worker 
251*7688df22SAndroid Build Coastguard Worker     return 0;
252*7688df22SAndroid Build Coastguard Worker }
253*7688df22SAndroid Build Coastguard Worker 
vic42_free(struct vic * v)254*7688df22SAndroid Build Coastguard Worker static void vic42_free(struct vic *v)
255*7688df22SAndroid Build Coastguard Worker {
256*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic = container_of(v, struct vic42, base);
257*7688df22SAndroid Build Coastguard Worker 
258*7688df22SAndroid Build Coastguard Worker     drm_tegra_channel_unmap(vic->filter.map);
259*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unref(vic->filter.bo);
260*7688df22SAndroid Build Coastguard Worker 
261*7688df22SAndroid Build Coastguard Worker     drm_tegra_channel_unmap(vic->config.map);
262*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unref(vic->config.bo);
263*7688df22SAndroid Build Coastguard Worker 
264*7688df22SAndroid Build Coastguard Worker     drm_tegra_syncpoint_free(v->syncpt);
265*7688df22SAndroid Build Coastguard Worker 
266*7688df22SAndroid Build Coastguard Worker     free(vic);
267*7688df22SAndroid Build Coastguard Worker }
268*7688df22SAndroid Build Coastguard Worker 
269*7688df22SAndroid Build Coastguard Worker static const struct vic_ops vic42_ops = {
270*7688df22SAndroid Build Coastguard Worker     .fill = vic42_fill,
271*7688df22SAndroid Build Coastguard Worker     .blit = vic42_blit,
272*7688df22SAndroid Build Coastguard Worker     .flip = vic42_flip,
273*7688df22SAndroid Build Coastguard Worker     .execute = vic42_execute,
274*7688df22SAndroid Build Coastguard Worker     .free = vic42_free,
275*7688df22SAndroid Build Coastguard Worker };
276*7688df22SAndroid Build Coastguard Worker 
vic42_new(struct drm_tegra * drm,struct drm_tegra_channel * channel,struct vic ** vicp)277*7688df22SAndroid Build Coastguard Worker int vic42_new(struct drm_tegra *drm, struct drm_tegra_channel *channel,
278*7688df22SAndroid Build Coastguard Worker               struct vic **vicp)
279*7688df22SAndroid Build Coastguard Worker {
280*7688df22SAndroid Build Coastguard Worker     struct vic42 *vic;
281*7688df22SAndroid Build Coastguard Worker     void *ptr;
282*7688df22SAndroid Build Coastguard Worker     int err;
283*7688df22SAndroid Build Coastguard Worker 
284*7688df22SAndroid Build Coastguard Worker     vic = calloc(1, sizeof(*vic));
285*7688df22SAndroid Build Coastguard Worker     if (!vic)
286*7688df22SAndroid Build Coastguard Worker         return -ENOMEM;
287*7688df22SAndroid Build Coastguard Worker 
288*7688df22SAndroid Build Coastguard Worker     vic->base.drm = drm;
289*7688df22SAndroid Build Coastguard Worker     vic->base.channel = channel;
290*7688df22SAndroid Build Coastguard Worker     vic->base.ops = &vic42_ops;
291*7688df22SAndroid Build Coastguard Worker     vic->base.version = 0x19;
292*7688df22SAndroid Build Coastguard Worker 
293*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_syncpoint_new(drm, &vic->base.syncpt);
294*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
295*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to allocate syncpoint: %s\n", strerror(-err));
296*7688df22SAndroid Build Coastguard Worker         return err;
297*7688df22SAndroid Build Coastguard Worker     }
298*7688df22SAndroid Build Coastguard Worker 
299*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_new(drm, 0, 16384, &vic->config.bo);
300*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
301*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to allocate configuration structurer: %s\n",
302*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
303*7688df22SAndroid Build Coastguard Worker         return err;
304*7688df22SAndroid Build Coastguard Worker     }
305*7688df22SAndroid Build Coastguard Worker 
306*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_channel_map(channel, vic->config.bo, DRM_TEGRA_CHANNEL_MAP_READ,
307*7688df22SAndroid Build Coastguard Worker                                 &vic->config.map);
308*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
309*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map configuration structure: %s\n",
310*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
311*7688df22SAndroid Build Coastguard Worker         return err;
312*7688df22SAndroid Build Coastguard Worker     }
313*7688df22SAndroid Build Coastguard Worker 
314*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_new(drm, 0, 16384, &vic->filter.bo);
315*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
316*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to allocate filter buffer: %s\n",
317*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
318*7688df22SAndroid Build Coastguard Worker         return err;
319*7688df22SAndroid Build Coastguard Worker     }
320*7688df22SAndroid Build Coastguard Worker 
321*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(vic->filter.bo, &ptr);
322*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
323*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map filter buffer: %s\n", strerror(-err));
324*7688df22SAndroid Build Coastguard Worker         return err;
325*7688df22SAndroid Build Coastguard Worker     }
326*7688df22SAndroid Build Coastguard Worker 
327*7688df22SAndroid Build Coastguard Worker     memset(ptr, 0, 16384);
328*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unmap(vic->filter.bo);
329*7688df22SAndroid Build Coastguard Worker 
330*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_channel_map(channel, vic->filter.bo, DRM_TEGRA_CHANNEL_MAP_READ,
331*7688df22SAndroid Build Coastguard Worker                                 &vic->filter.map);
332*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
333*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map filter buffer: %s\n",
334*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
335*7688df22SAndroid Build Coastguard Worker         return err;
336*7688df22SAndroid Build Coastguard Worker     }
337*7688df22SAndroid Build Coastguard Worker 
338*7688df22SAndroid Build Coastguard Worker     if (vicp)
339*7688df22SAndroid Build Coastguard Worker         *vicp = &vic->base;
340*7688df22SAndroid Build Coastguard Worker 
341*7688df22SAndroid Build Coastguard Worker     return 0;
342*7688df22SAndroid Build Coastguard Worker }
343