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