1*3e777be0SXin Li // 2*3e777be0SXin Li // Copyright © 2017 Arm Ltd. All rights reserved. 3*3e777be0SXin Li // SPDX-License-Identifier: MIT 4*3e777be0SXin Li // 5*3e777be0SXin Li 6*3e777be0SXin Li #pragma once 7*3e777be0SXin Li 8*3e777be0SXin Li #include <HalInterfaces.h> 9*3e777be0SXin Li 10*3e777be0SXin Li #include "../ArmnnDevice.hpp" 11*3e777be0SXin Li #include "ArmnnDriverImpl.hpp" 12*3e777be0SXin Li #include "HalPolicy.hpp" 13*3e777be0SXin Li 14*3e777be0SXin Li #include "../ArmnnDriverImpl.hpp" 15*3e777be0SXin Li #include "../1.2/ArmnnDriverImpl.hpp" 16*3e777be0SXin Li #include "../1.2/HalPolicy.hpp" 17*3e777be0SXin Li #include "../1.1/ArmnnDriverImpl.hpp" 18*3e777be0SXin Li #include "../1.1/HalPolicy.hpp" 19*3e777be0SXin Li #include "../1.0/ArmnnDriverImpl.hpp" 20*3e777be0SXin Li #include "../1.0/HalPolicy.hpp" 21*3e777be0SXin Li 22*3e777be0SXin Li #include <armnn/BackendHelper.hpp> 23*3e777be0SXin Li 24*3e777be0SXin Li #include <log/log.h> 25*3e777be0SXin Li 26*3e777be0SXin Li namespace armnn_driver 27*3e777be0SXin Li { 28*3e777be0SXin Li namespace hal_1_2 29*3e777be0SXin Li { 30*3e777be0SXin Li 31*3e777be0SXin Li class ArmnnDriver : public ArmnnDevice, public V1_2::IDevice 32*3e777be0SXin Li { 33*3e777be0SXin Li public: 34*3e777be0SXin Li ArmnnDriver(DriverOptions options)35*3e777be0SXin Li ArmnnDriver(DriverOptions options) 36*3e777be0SXin Li : ArmnnDevice(std::move(options)) 37*3e777be0SXin Li { 38*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::ArmnnDriver()"); 39*3e777be0SXin Li } ~ArmnnDriver()40*3e777be0SXin Li ~ArmnnDriver() {} 41*3e777be0SXin Li 42*3e777be0SXin Li using HidlToken = android::hardware::hidl_array<uint8_t, ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN>; 43*3e777be0SXin Li 44*3e777be0SXin Li public: getCapabilities(V1_0::IDevice::getCapabilities_cb cb)45*3e777be0SXin Li Return<void> getCapabilities(V1_0::IDevice::getCapabilities_cb cb) override 46*3e777be0SXin Li { 47*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getCapabilities()"); 48*3e777be0SXin Li 49*3e777be0SXin Li return hal_1_0::ArmnnDriverImpl::getCapabilities(m_Runtime, cb); 50*3e777be0SXin Li } 51*3e777be0SXin Li getSupportedOperations(const V1_0::Model & model,V1_0::IDevice::getSupportedOperations_cb cb)52*3e777be0SXin Li Return<void> getSupportedOperations(const V1_0::Model& model, 53*3e777be0SXin Li V1_0::IDevice::getSupportedOperations_cb cb) override 54*3e777be0SXin Li { 55*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()"); 56*3e777be0SXin Li 57*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::getSupportedOperations(m_Runtime, 58*3e777be0SXin Li m_Options, 59*3e777be0SXin Li model, 60*3e777be0SXin Li cb); 61*3e777be0SXin Li } 62*3e777be0SXin Li prepareModel(const V1_0::Model & model,const android::sp<V1_0::IPreparedModelCallback> & cb)63*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel(const V1_0::Model& model, 64*3e777be0SXin Li const android::sp<V1_0::IPreparedModelCallback>& cb) override 65*3e777be0SXin Li { 66*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModel()"); 67*3e777be0SXin Li 68*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::prepareModel(m_Runtime, 69*3e777be0SXin Li m_ClTunedParameters, 70*3e777be0SXin Li m_Options, 71*3e777be0SXin Li model, 72*3e777be0SXin Li cb); 73*3e777be0SXin Li } 74*3e777be0SXin Li getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb)75*3e777be0SXin Li Return<void> getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb) override 76*3e777be0SXin Li { 77*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getCapabilities_1_1()"); 78*3e777be0SXin Li 79*3e777be0SXin Li return hal_1_1::ArmnnDriverImpl::getCapabilities_1_1(m_Runtime, cb); 80*3e777be0SXin Li } 81*3e777be0SXin Li getSupportedOperations_1_1(const V1_1::Model & model,V1_1::IDevice::getSupportedOperations_1_1_cb cb)82*3e777be0SXin Li Return<void> getSupportedOperations_1_1(const V1_1::Model& model, 83*3e777be0SXin Li V1_1::IDevice::getSupportedOperations_1_1_cb cb) override 84*3e777be0SXin Li { 85*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations_1_1()"); 86*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::getSupportedOperations(m_Runtime, 87*3e777be0SXin Li m_Options, 88*3e777be0SXin Li model, 89*3e777be0SXin Li cb); 90*3e777be0SXin Li } 91*3e777be0SXin Li prepareModel_1_1(const V1_1::Model & model,V1_1::ExecutionPreference preference,const android::sp<V1_0::IPreparedModelCallback> & cb)92*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel_1_1(const V1_1::Model& model, 93*3e777be0SXin Li V1_1::ExecutionPreference preference, 94*3e777be0SXin Li const android::sp<V1_0::IPreparedModelCallback>& cb) override 95*3e777be0SXin Li { 96*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1()"); 97*3e777be0SXin Li 98*3e777be0SXin Li if (!(preference == V1_1::ExecutionPreference::LOW_POWER || 99*3e777be0SXin Li preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER || 100*3e777be0SXin Li preference == V1_1::ExecutionPreference::SUSTAINED_SPEED)) 101*3e777be0SXin Li { 102*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1: Invalid execution preference"); 103*3e777be0SXin Li cb->notify(V1_0::ErrorStatus::INVALID_ARGUMENT, nullptr); 104*3e777be0SXin Li return V1_0::ErrorStatus::INVALID_ARGUMENT; 105*3e777be0SXin Li } 106*3e777be0SXin Li 107*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::prepareModel(m_Runtime, 108*3e777be0SXin Li m_ClTunedParameters, 109*3e777be0SXin Li m_Options, 110*3e777be0SXin Li model, 111*3e777be0SXin Li cb, 112*3e777be0SXin Li model.relaxComputationFloat32toFloat16 113*3e777be0SXin Li && m_Options.GetFp16Enabled()); 114*3e777be0SXin Li } 115*3e777be0SXin Li getStatus()116*3e777be0SXin Li Return<V1_0::DeviceStatus> getStatus() override 117*3e777be0SXin Li { 118*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getStatus()"); 119*3e777be0SXin Li 120*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_2::HalPolicy>::getStatus(); 121*3e777be0SXin Li } 122*3e777be0SXin Li getVersionString(getVersionString_cb cb)123*3e777be0SXin Li Return<void> getVersionString(getVersionString_cb cb) 124*3e777be0SXin Li { 125*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getVersionString()"); 126*3e777be0SXin Li 127*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, "ArmNN"); 128*3e777be0SXin Li return Void(); 129*3e777be0SXin Li } 130*3e777be0SXin Li getType(getType_cb cb)131*3e777be0SXin Li Return<void> getType(getType_cb cb) 132*3e777be0SXin Li { 133*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getType()"); 134*3e777be0SXin Li const auto device_type = hal_1_2::HalPolicy::GetDeviceTypeFromOptions(this->m_Options); 135*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, device_type); 136*3e777be0SXin Li return Void(); 137*3e777be0SXin Li } 138*3e777be0SXin Li prepareModelFromCache(const android::hardware::hidl_vec<android::hardware::hidl_handle> & modelCacheHandle,const android::hardware::hidl_vec<android::hardware::hidl_handle> & dataCacheHandle,const HidlToken & token,const android::sp<V1_2::IPreparedModelCallback> & cb)139*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModelFromCache( 140*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCacheHandle, 141*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCacheHandle, 142*3e777be0SXin Li const HidlToken& token, 143*3e777be0SXin Li const android::sp<V1_2::IPreparedModelCallback>& cb) 144*3e777be0SXin Li { 145*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModelFromCache()"); 146*3e777be0SXin Li return ArmnnDriverImpl::prepareModelFromCache(m_Runtime, 147*3e777be0SXin Li m_Options, 148*3e777be0SXin Li modelCacheHandle, 149*3e777be0SXin Li dataCacheHandle, 150*3e777be0SXin Li token, 151*3e777be0SXin Li cb); 152*3e777be0SXin Li } 153*3e777be0SXin Li prepareModel_1_2(const V1_2::Model & model,V1_1::ExecutionPreference preference,const android::hardware::hidl_vec<android::hardware::hidl_handle> & modelCacheHandle,const android::hardware::hidl_vec<android::hardware::hidl_handle> & dataCacheHandle,const HidlToken & token,const android::sp<V1_2::IPreparedModelCallback> & cb)154*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel_1_2( 155*3e777be0SXin Li const V1_2::Model& model, V1_1::ExecutionPreference preference, 156*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCacheHandle, 157*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCacheHandle, 158*3e777be0SXin Li const HidlToken& token, 159*3e777be0SXin Li const android::sp<V1_2::IPreparedModelCallback>& cb) 160*3e777be0SXin Li { 161*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_2()"); 162*3e777be0SXin Li 163*3e777be0SXin Li if (!(preference == V1_1::ExecutionPreference::LOW_POWER || 164*3e777be0SXin Li preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER || 165*3e777be0SXin Li preference == V1_1::ExecutionPreference::SUSTAINED_SPEED)) 166*3e777be0SXin Li { 167*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_2: Invalid execution preference"); 168*3e777be0SXin Li cb->notify(V1_0::ErrorStatus::INVALID_ARGUMENT, nullptr); 169*3e777be0SXin Li return V1_0::ErrorStatus::INVALID_ARGUMENT; 170*3e777be0SXin Li } 171*3e777be0SXin Li 172*3e777be0SXin Li return ArmnnDriverImpl::prepareArmnnModel_1_2(m_Runtime, 173*3e777be0SXin Li m_ClTunedParameters, 174*3e777be0SXin Li m_Options, 175*3e777be0SXin Li model, 176*3e777be0SXin Li modelCacheHandle, 177*3e777be0SXin Li dataCacheHandle, 178*3e777be0SXin Li token, 179*3e777be0SXin Li cb, 180*3e777be0SXin Li model.relaxComputationFloat32toFloat16 181*3e777be0SXin Li && m_Options.GetFp16Enabled()); 182*3e777be0SXin Li } 183*3e777be0SXin Li getSupportedExtensions(getSupportedExtensions_cb cb)184*3e777be0SXin Li Return<void> getSupportedExtensions(getSupportedExtensions_cb cb) 185*3e777be0SXin Li { 186*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()"); 187*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, {/* No extensions. */}); 188*3e777be0SXin Li return Void(); 189*3e777be0SXin Li } 190*3e777be0SXin Li getCapabilities_1_2(getCapabilities_1_2_cb cb)191*3e777be0SXin Li Return<void> getCapabilities_1_2(getCapabilities_1_2_cb cb) 192*3e777be0SXin Li { 193*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getCapabilities()"); 194*3e777be0SXin Li 195*3e777be0SXin Li return hal_1_2::ArmnnDriverImpl::getCapabilities_1_2(m_Runtime, cb); 196*3e777be0SXin Li } 197*3e777be0SXin Li getSupportedOperations_1_2(const V1_2::Model & model,getSupportedOperations_1_2_cb cb)198*3e777be0SXin Li Return<void> getSupportedOperations_1_2(const V1_2::Model& model, 199*3e777be0SXin Li getSupportedOperations_1_2_cb cb) 200*3e777be0SXin Li { 201*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()"); 202*3e777be0SXin Li 203*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_2::HalPolicy>::getSupportedOperations(m_Runtime, 204*3e777be0SXin Li m_Options, 205*3e777be0SXin Li model, 206*3e777be0SXin Li cb); 207*3e777be0SXin Li } 208*3e777be0SXin Li getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb)209*3e777be0SXin Li Return<void> getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb) 210*3e777be0SXin Li { 211*3e777be0SXin Li ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()"); 212*3e777be0SXin Li unsigned int numberOfCachedModelFiles = 0; 213*3e777be0SXin Li for (auto& backend : m_Options.GetBackends()) 214*3e777be0SXin Li { 215*3e777be0SXin Li numberOfCachedModelFiles += GetNumberOfCacheFiles(backend); 216*3e777be0SXin Li } 217*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, numberOfCachedModelFiles, 1ul); 218*3e777be0SXin Li return Void(); 219*3e777be0SXin Li } 220*3e777be0SXin Li }; 221*3e777be0SXin Li 222*3e777be0SXin Li } // namespace hal_1_2 223*3e777be0SXin Li } // namespace armnn_driver 224