176cd09d0b73928883aed607dd1348a2359bab241Michael Butler/*
276cd09d0b73928883aed607dd1348a2359bab241Michael Butler * Copyright (C) 2017 The Android Open Source Project
376cd09d0b73928883aed607dd1348a2359bab241Michael Butler *
476cd09d0b73928883aed607dd1348a2359bab241Michael Butler * Licensed under the Apache License, Version 2.0 (the "License");
576cd09d0b73928883aed607dd1348a2359bab241Michael Butler * you may not use this file except in compliance with the License.
676cd09d0b73928883aed607dd1348a2359bab241Michael Butler * You may obtain a copy of the License at
776cd09d0b73928883aed607dd1348a2359bab241Michael Butler *
876cd09d0b73928883aed607dd1348a2359bab241Michael Butler *      http://www.apache.org/licenses/LICENSE-2.0
976cd09d0b73928883aed607dd1348a2359bab241Michael Butler *
1076cd09d0b73928883aed607dd1348a2359bab241Michael Butler * Unless required by applicable law or agreed to in writing, software
1176cd09d0b73928883aed607dd1348a2359bab241Michael Butler * distributed under the License is distributed on an "AS IS" BASIS,
1276cd09d0b73928883aed607dd1348a2359bab241Michael Butler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376cd09d0b73928883aed607dd1348a2359bab241Michael Butler * See the License for the specific language governing permissions and
1476cd09d0b73928883aed607dd1348a2359bab241Michael Butler * limitations under the License.
1576cd09d0b73928883aed607dd1348a2359bab241Michael Butler */
1676cd09d0b73928883aed607dd1348a2359bab241Michael Butler
1776cd09d0b73928883aed607dd1348a2359bab241Michael Butler#define LOG_TAG "android.hardware.neuralnetworks@1.0-impl-hvx"
1876cd09d0b73928883aed607dd1348a2359bab241Michael Butler
1976cd09d0b73928883aed607dd1348a2359bab241Michael Butler#include "HexagonController.h"
2076cd09d0b73928883aed607dd1348a2359bab241Michael Butler
2176cd09d0b73928883aed607dd1348a2359bab241Michael Butler#define LOAD_HEXAGON_FUNCTION(name) \
22a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler    mFn_##name = loadFunction<hexagon_nn_controller_##name##_fn>("hexagon_nn_controller_" #name);
2376cd09d0b73928883aed607dd1348a2359bab241Michael Butler
240f4cdac298cbf691540154154c223db02425b3d0Michael Butler#define CLOSE_HEXAGON_FUNCTION(name) mFn_##name = nullptr;
250f4cdac298cbf691540154154c223db02425b3d0Michael Butler
260f4cdac298cbf691540154154c223db02425b3d0Michael Butler#define FOR_EACH_FUNCTION(MACRO)   \
270f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(init)                    \
280f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(getlog)                  \
290f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(snpprint)                \
300f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(set_debug_level)         \
310f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(prepare)                 \
320f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(append_node)             \
330f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(append_const_node)       \
340f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(execute_new)             \
350f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(execute)                 \
360f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(teardown)                \
370f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(get_perfinfo)            \
380f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(reset_perfinfo)          \
390f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(version)                 \
400f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(last_execution_cycles)   \
410f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(GetHexagonBinaryVersion) \
420f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(PrintLog)                \
430f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(op_name_to_id)           \
440f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(op_id_to_name)           \
450f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(disable_dcvs)            \
460f4cdac298cbf691540154154c223db02425b3d0Michael Butler    MACRO(set_powersave_level)     \
47aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler    MACRO(config)                  \
4868118ed73abd2c50f8b455fae328c38673d96654Michael Butler    MACRO(get_dsp_offset)          \
49aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler    MACRO(boost)                   \
50aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler    MACRO(slow)
510f4cdac298cbf691540154154c223db02425b3d0Michael Butler
520f4cdac298cbf691540154154c223db02425b3d0Michael Butler#define CONTROLLER_CHECK(function, ...)    \
5325d8e8714c120716b2982790818dad502693e2f4Michael Butler    if (mFn_##function == nullptr) {       \
5425d8e8714c120716b2982790818dad502693e2f4Michael Butler        return -1;                         \
5525d8e8714c120716b2982790818dad502693e2f4Michael Butler    }                                      \
560f4cdac298cbf691540154154c223db02425b3d0Michael Butler    int err = mFn_##function(__VA_ARGS__); \
570f4cdac298cbf691540154154c223db02425b3d0Michael Butler    if (err != 0) {                        \
580f4cdac298cbf691540154154c223db02425b3d0Michael Butler        return err;                        \
5925d8e8714c120716b2982790818dad502693e2f4Michael Butler    }                                      \
6025d8e8714c120716b2982790818dad502693e2f4Michael Butler    return 0;
6176cd09d0b73928883aed607dd1348a2359bab241Michael Butler
6276cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace android {
6376cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace hardware {
6476cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace neuralnetworks {
6576cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace V1_0 {
6676cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace implementation {
6776cd09d0b73928883aed607dd1348a2359bab241Michael Butlernamespace hexagon {
6876cd09d0b73928883aed607dd1348a2359bab241Michael Butler
690f4cdac298cbf691540154154c223db02425b3d0Michael Butlerconst char Controller::kFilename[] = "libhexagon_nn_controller.so";
700f4cdac298cbf691540154154c223db02425b3d0Michael Butler
7176cd09d0b73928883aed607dd1348a2359bab241Michael ButlerController::Controller() {
720f4cdac298cbf691540154154c223db02425b3d0Michael Butler    openNnlib();
730f4cdac298cbf691540154154c223db02425b3d0Michael Butler}
7476cd09d0b73928883aed607dd1348a2359bab241Michael Butler
750f4cdac298cbf691540154154c223db02425b3d0Michael ButlerController::~Controller() {
760f4cdac298cbf691540154154c223db02425b3d0Michael Butler    closeNnlib();
770f4cdac298cbf691540154154c223db02425b3d0Michael Butler}
7876cd09d0b73928883aed607dd1348a2359bab241Michael Butler
790f4cdac298cbf691540154154c223db02425b3d0Michael Butlerbool Controller::openNnlib() {
800f4cdac298cbf691540154154c223db02425b3d0Michael Butler    mHandle = dlopen(kFilename, RTLD_LAZY | RTLD_LOCAL);
81a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler    HEXAGON_SOFT_ASSERT_NE(mHandle, 0,
82a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                           "FAILED TO LOAD LIBRARY " /* << kFilename << ": " << dlerror()*/);
830f4cdac298cbf691540154154c223db02425b3d0Michael Butler    FOR_EACH_FUNCTION(LOAD_HEXAGON_FUNCTION)
840f4cdac298cbf691540154154c223db02425b3d0Michael Butler    return true;
8576cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
8676cd09d0b73928883aed607dd1348a2359bab241Michael Butler
870f4cdac298cbf691540154154c223db02425b3d0Michael Butlerbool Controller::closeNnlib() {
880f4cdac298cbf691540154154c223db02425b3d0Michael Butler    FOR_EACH_FUNCTION(CLOSE_HEXAGON_FUNCTION)
8976cd09d0b73928883aed607dd1348a2359bab241Michael Butler    if (mHandle != nullptr) {
900f4cdac298cbf691540154154c223db02425b3d0Michael Butler        int err = dlclose(mHandle);
910f4cdac298cbf691540154154c223db02425b3d0Michael Butler        mHandle = nullptr;
920f4cdac298cbf691540154154c223db02425b3d0Michael Butler        HEXAGON_SOFT_ASSERT_EQ(err, 0, "FAILED TO CLOSE LIBRARY " << kFilename);
9376cd09d0b73928883aed607dd1348a2359bab241Michael Butler    }
940f4cdac298cbf691540154154c223db02425b3d0Michael Butler    return true;
950f4cdac298cbf691540154154c223db02425b3d0Michael Butler}
960f4cdac298cbf691540154154c223db02425b3d0Michael Butler
970f4cdac298cbf691540154154c223db02425b3d0Michael Butlerbool Controller::resetNnlib() {
980f4cdac298cbf691540154154c223db02425b3d0Michael Butler    return closeNnlib() && openNnlib();
9976cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
10076cd09d0b73928883aed607dd1348a2359bab241Michael Butler
10176cd09d0b73928883aed607dd1348a2359bab241Michael ButlerController& Controller::getInstance() {
10276cd09d0b73928883aed607dd1348a2359bab241Michael Butler    static Controller instance{};
10376cd09d0b73928883aed607dd1348a2359bab241Michael Butler    return instance;
10476cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
10576cd09d0b73928883aed607dd1348a2359bab241Michael Butler
10625d8e8714c120716b2982790818dad502693e2f4Michael Butlerint Controller::init(hexagon_nn_nn_id* g) {
10725d8e8714c120716b2982790818dad502693e2f4Michael Butler    CONTROLLER_CHECK(init, g);
10876cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
10976cd09d0b73928883aed607dd1348a2359bab241Michael Butler
110a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::getlog(hexagon_nn_nn_id id, unsigned char* buf, uint32_t length) {
11176cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(getlog, id, buf, length);
11276cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
11376cd09d0b73928883aed607dd1348a2359bab241Michael Butler
114a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::snpprint(hexagon_nn_nn_id id, unsigned char* buf, uint32_t length) {
11576cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(snpprint, id, buf, length);
11676cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
11776cd09d0b73928883aed607dd1348a2359bab241Michael Butler
11876cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::set_debug_level(hexagon_nn_nn_id id, int level) {
11976cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(set_debug_level, id, level);
12076cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
12176cd09d0b73928883aed607dd1348a2359bab241Michael Butler
12276cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::prepare(hexagon_nn_nn_id id) {
12376cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(prepare, id);
12476cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
12576cd09d0b73928883aed607dd1348a2359bab241Michael Butler
126a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::append_node(hexagon_nn_nn_id id, uint32_t node_id, op_type operation,
127a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                            hexagon_nn_padding_type padding, const hexagon_nn_input* inputs,
128a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                            uint32_t num_inputs, const hexagon_nn_output* outputs,
129a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                            uint32_t num_outputs) {
130a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler    CONTROLLER_CHECK(append_node, id, node_id, operation, padding, inputs, num_inputs, outputs,
131a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                     num_outputs);
13276cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
13376cd09d0b73928883aed607dd1348a2359bab241Michael Butler
134a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::append_const_node(hexagon_nn_nn_id id, uint32_t node_id, uint32_t batches,
135a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                                  uint32_t height, uint32_t width, uint32_t depth,
136a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                                  const uint8_t* data, uint32_t data_len) {
137a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler    CONTROLLER_CHECK(append_const_node, id, node_id, batches, height, width, depth, data, data_len);
13876cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
13976cd09d0b73928883aed607dd1348a2359bab241Michael Butler
140a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::execute_new(hexagon_nn_nn_id id, const hexagon_nn_tensordef* inputs,
141a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                            uint32_t n_inputs, hexagon_nn_tensordef* outputs, uint32_t n_outputs) {
14276cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(execute_new, id, inputs, n_inputs, outputs, n_outputs);
14376cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
14476cd09d0b73928883aed607dd1348a2359bab241Michael Butler
145a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::execute(hexagon_nn_nn_id id, uint32_t batches_in, uint32_t height_in,
146a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                        uint32_t width_in, uint32_t depth_in, const uint8_t* data_in,
147a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                        uint32_t data_len_in, uint32_t* batches_out, uint32_t* height_out,
148a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                        uint32_t* width_out, uint32_t* depth_out, uint8_t* data_out,
149a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                        uint32_t data_out_max, uint32_t* data_out_size) {
15076cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(execute, id, batches_in, height_in, width_in, depth_in, data_in, data_len_in,
15176cd09d0b73928883aed607dd1348a2359bab241Michael Butler                     batches_out, height_out, width_out, depth_out, data_out, data_out_max,
15276cd09d0b73928883aed607dd1348a2359bab241Michael Butler                     data_out_size);
15376cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
15476cd09d0b73928883aed607dd1348a2359bab241Michael Butler
15576cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::teardown(hexagon_nn_nn_id id) {
15676cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(teardown, id);
15776cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
15876cd09d0b73928883aed607dd1348a2359bab241Michael Butler
159a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::get_perfinfo(hexagon_nn_nn_id id, hexagon_nn_perfinfo* info_out,
160a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                             unsigned int info_out_len, unsigned int* n_items_out) {
16176cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(get_perfinfo, id, info_out, info_out_len, n_items_out);
16276cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
16376cd09d0b73928883aed607dd1348a2359bab241Michael Butler
16476cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::reset_perfinfo(hexagon_nn_nn_id id, uint32_t event) {
16576cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(reset_perfinfo, id, event);
16676cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
16776cd09d0b73928883aed607dd1348a2359bab241Michael Butler
168a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::version(int* ver) {
16976cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(version, ver);
17076cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
17176cd09d0b73928883aed607dd1348a2359bab241Michael Butler
172a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::last_execution_cycles(hexagon_nn_nn_id id, unsigned int* cycles_lo,
173a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler                                      unsigned int* cycles_hi) {
17476cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(last_execution_cycles, id, cycles_lo, cycles_hi);
17576cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
17676cd09d0b73928883aed607dd1348a2359bab241Michael Butler
177a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::GetHexagonBinaryVersion(int* ver) {
17876cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(GetHexagonBinaryVersion, ver);
17976cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
18076cd09d0b73928883aed607dd1348a2359bab241Michael Butler
181a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::PrintLog(const uint8_t* data_in, unsigned int data_in_len) {
18276cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(PrintLog, data_in, data_in_len);
18376cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
18476cd09d0b73928883aed607dd1348a2359bab241Michael Butler
185a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::op_name_to_id(const char* name, unsigned int* id) {
18676cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(op_name_to_id, name, id);
18776cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
18876cd09d0b73928883aed607dd1348a2359bab241Michael Butler
189a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butlerint Controller::op_id_to_name(const unsigned int id, char* name, int name_len) {
19076cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(op_id_to_name, id, name, name_len);
19176cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
19276cd09d0b73928883aed607dd1348a2359bab241Michael Butler
19376cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::disable_dcvs() {
19476cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(disable_dcvs);
19576cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
19676cd09d0b73928883aed607dd1348a2359bab241Michael Butler
19776cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::set_powersave_level(unsigned int level) {
19876cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(set_powersave_level, level);
19976cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
20076cd09d0b73928883aed607dd1348a2359bab241Michael Butler
20176cd09d0b73928883aed607dd1348a2359bab241Michael Butlerint Controller::config() {
20276cd09d0b73928883aed607dd1348a2359bab241Michael Butler    CONTROLLER_CHECK(config);
20376cd09d0b73928883aed607dd1348a2359bab241Michael Butler}
20476cd09d0b73928883aed607dd1348a2359bab241Michael Butler
20568118ed73abd2c50f8b455fae328c38673d96654Michael Butlerunsigned int Controller::get_dsp_offset() {
20668118ed73abd2c50f8b455fae328c38673d96654Michael Butler    CONTROLLER_CHECK(get_dsp_offset);
20768118ed73abd2c50f8b455fae328c38673d96654Michael Butler}
20868118ed73abd2c50f8b455fae328c38673d96654Michael Butler
209aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butlerint Controller::boost(int bus_usage) {
210aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler    CONTROLLER_CHECK(boost, bus_usage);
211aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler}
212aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler
213aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butlerint Controller::slow() {
214aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler    CONTROLLER_CHECK(slow);
215aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler}
216aff6eb8d0fae092ce5f694e1bfb252dd0a99ccbfMichael Butler
217a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace hexagon
218a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace implementation
219a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace V1_0
220a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace neuralnetworks
221a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace hardware
222a6e68df59d64fceb115b91c69d472f0eebbe6400Michael Butler}  // namespace android
223