1/*
2Copyright (c) 2016, Raspberry Pi (Trading) Ltd
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of the copyright holder nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#ifndef VC_VCHI_GPUSERV_H
29#define VC_VCHI_GPUSERV_H
30#include "interface/vchiq_arm/vchiq.h"
31
32// these go in command word of gpu_job_s
33// EXECUTE_VPU and EXECUTE_QPU are valid from host
34enum { EXECUTE_NONE, EXECUTE_VPU, EXECUTE_QPU, EXECUTE_SYNC };
35
36struct vpu_job_s {
37 // these are function address and parameters for vpu job
38 uint32_t q[7];
39 uint32_t dummy[21];
40};
41
42struct qpu_job_s {
43 // parameters for qpu job
44 uint32_t jobs;
45 uint32_t noflush;
46 uint32_t timeout;
47 uint32_t dummy;
48 uint32_t control[12][2];
49};
50
51struct sync_job_s {
52 // parameters for syncjob
53 // bit 0 set means wait for preceding vpu jobs to complete
54 // bit 1 set means wait for preceding qpu jobs to complete
55 uint32_t mask;
56 uint32_t dummy[27];
57};
58
59struct gpu_callback_s {
60 // callback to call when complete (can be NULL)
61 void (*func)();
62 void *cookie;
63};
64
65struct gpu_internal_s {
66 void *message;
67 int refcount;
68};
69
70struct gpu_job_s {
71 // from enum above
72 uint32_t command;
73 // qpu or vpu jobs
74 union {
75 struct vpu_job_s v;
76 struct qpu_job_s q;
77 struct sync_job_s s;
78 } u;
79 // callback function to call when complete
80 struct gpu_callback_s callback;
81 // for internal use - leave as zero
82 struct gpu_internal_s internal;
83};
84
85/* Initialise gpu service. Returns its interface number. This initialises
86 the host side of the interface, it does not send anything to VideoCore. */
87
88VCHPRE_ int32_t VCHPOST_ vc_gpuserv_init(void);
89
90VCHPRE_ void VCHPOST_ vc_gpuserv_deinit(void);
91
92VCHPRE_ int32_t VCHPOST_ vc_gpuserv_execute_code(int num_jobs, struct gpu_job_s jobs[]);
93
94#endif
95