1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef HEXAGON_NN_CONTROLLER_H
18 #define HEXAGON_NN_CONTROLLER_H
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 // includes
25 #include "hexagon_nn_ops.h"
26 
27 // hexagon types
28 
29 typedef struct hexagon_nn_input {
30     unsigned int src_id;
31     unsigned int output_idx;
32 } hexagon_nn_input;
33 
34 typedef struct hexagon_nn_output {
35     unsigned int rank;
36     unsigned int max_sizes[8];
37     unsigned int elementsize;
38     int zero_offset;
39     float stepsize;
40 } hexagon_nn_output;
41 
42 typedef struct hexagon_nn_perfinfo {
43     unsigned int node_id;
44     unsigned int executions;
45     unsigned int counter_lo;
46     unsigned int counter_hi;
47 } hexagon_nn_perfinfo;
48 
49 typedef int hexagon_nn_nn_id;
50 
51 typedef enum hexagon_nn_padding_type {
52     NN_PAD_NA,
53     NN_PAD_SAME,
54     NN_PAD_VALID,
55     NN_PAD_MIRROR_REFLECT,
56     NN_PAD_MIRROR_SYMMETRIC,
57     NN_PAD_SAME_CAFFE,
58     _32BIT_PLACEHOLDER_hexagon_nn_padding_type = 0x7fffffff
59 } hexagon_nn_padding_type;
60 
61 typedef struct hexagon_nn_tensordef {
62     unsigned int batches;
63     unsigned int height;
64     unsigned int width;
65     unsigned int depth;
66     unsigned char* data;
67     int dataLen;
68     unsigned int data_valid_len;
69     unsigned int unused;
70 } hexagon_nn_tensordef;
71 
72 // interface types
73 
74 typedef int (*hexagon_nn_controller_init_fn)(hexagon_nn_nn_id* g);
75 
76 typedef int (*hexagon_nn_controller_getlog_fn)(hexagon_nn_nn_id id, unsigned char* buf,
77                                                unsigned int length);
78 
79 typedef int (*hexagon_nn_controller_snpprint_fn)(hexagon_nn_nn_id id, unsigned char* buf,
80                                                  unsigned int length);
81 
82 typedef int (*hexagon_nn_controller_set_debug_level_fn)(hexagon_nn_nn_id id, int level);
83 
84 typedef int (*hexagon_nn_controller_prepare_fn)(hexagon_nn_nn_id id);
85 
86 typedef int (*hexagon_nn_controller_append_node_fn)(
87     hexagon_nn_nn_id id, unsigned int node_id, op_type operation, hexagon_nn_padding_type padding,
88     const hexagon_nn_input* inputs, unsigned int num_inputs, const hexagon_nn_output* outputs,
89     unsigned int num_outputs);
90 
91 typedef int (*hexagon_nn_controller_append_const_node_fn)(hexagon_nn_nn_id id, unsigned int node_id,
92                                                           unsigned int batches, unsigned int height,
93                                                           unsigned int width, unsigned int depth,
94                                                           const unsigned char* data,
95                                                           unsigned int data_len);
96 
97 typedef int (*hexagon_nn_controller_execute_new_fn)(hexagon_nn_nn_id id,
98                                                     const hexagon_nn_tensordef* inputs,
99                                                     unsigned int n_inputs,
100                                                     hexagon_nn_tensordef* outputs,
101                                                     unsigned int n_outputs);
102 
103 typedef int (*hexagon_nn_controller_execute_fn)(hexagon_nn_nn_id id, unsigned int batches_in,
104                                                 unsigned int height_in, unsigned int width_in,
105                                                 unsigned int depth_in, const unsigned char* data_in,
106                                                 unsigned int data_len_in, unsigned int* batches_out,
107                                                 unsigned int* height_out, unsigned int* width_out,
108                                                 unsigned int* depth_out, unsigned char* data_out,
109                                                 unsigned int data_out_max,
110                                                 unsigned int* data_out_size);
111 
112 typedef int (*hexagon_nn_controller_teardown_fn)(hexagon_nn_nn_id id);
113 
114 typedef int (*hexagon_nn_controller_get_perfinfo_fn)(hexagon_nn_nn_id id,
115                                                      hexagon_nn_perfinfo* info_out,
116                                                      unsigned int info_out_len,
117                                                      unsigned int* n_items_out);
118 
119 typedef int (*hexagon_nn_controller_reset_perfinfo_fn)(hexagon_nn_nn_id id, unsigned int event);
120 
121 typedef int (*hexagon_nn_controller_version_fn)(int* ver);
122 
123 typedef int (*hexagon_nn_controller_last_execution_cycles_fn)(hexagon_nn_nn_id id,
124                                                               unsigned int* cycles_lo,
125                                                               unsigned int* cycles_hi);
126 
127 typedef int (*hexagon_nn_controller_GetHexagonBinaryVersion_fn)(int* ver);
128 
129 typedef int (*hexagon_nn_controller_PrintLog_fn)(const unsigned char* data_in,
130                                                  unsigned int data_in_len);
131 
132 typedef int (*hexagon_nn_controller_op_name_to_id_fn)(const char* name, unsigned int* id);
133 
134 typedef int (*hexagon_nn_controller_op_id_to_name_fn)(const unsigned int id, char* name,
135                                                       int name_len);
136 
137 typedef int (*hexagon_nn_controller_disable_dcvs_fn)();
138 
139 typedef int (*hexagon_nn_controller_set_powersave_level_fn)(unsigned int level);
140 
141 typedef int (*hexagon_nn_controller_config_fn)();
142 
143 typedef unsigned int (*hexagon_nn_controller_get_dsp_offset_fn)();
144 
145 typedef int (*hexagon_nn_controller_boost_fn)(int bus_usage);
146 
147 typedef int (*hexagon_nn_controller_slow_fn)();
148 
149 #ifdef __cplusplus
150 }  // extern "C"
151 #endif
152 
153 #endif  // HEXAGON_NN_CONTROLLER_H
154