1*3e777be0SXin Li // 2*3e777be0SXin Li // Copyright © 2020 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.3/ArmnnDriverImpl.hpp" 16*3e777be0SXin Li #include "../1.3/HalPolicy.hpp" 17*3e777be0SXin Li #include "../1.2/ArmnnDriverImpl.hpp" 18*3e777be0SXin Li #include "../1.2/HalPolicy.hpp" 19*3e777be0SXin Li #include "../1.1/ArmnnDriverImpl.hpp" 20*3e777be0SXin Li #include "../1.1/HalPolicy.hpp" 21*3e777be0SXin Li #include "../1.0/ArmnnDriverImpl.hpp" 22*3e777be0SXin Li #include "../1.0/HalPolicy.hpp" 23*3e777be0SXin Li 24*3e777be0SXin Li #include <armnn/BackendHelper.hpp> 25*3e777be0SXin Li 26*3e777be0SXin Li #include <log/log.h> 27*3e777be0SXin Li 28*3e777be0SXin Li namespace armnn_driver 29*3e777be0SXin Li { 30*3e777be0SXin Li namespace hal_1_3 31*3e777be0SXin Li { 32*3e777be0SXin Li 33*3e777be0SXin Li class ArmnnDriver : public ArmnnDevice, public V1_3::IDevice 34*3e777be0SXin Li { 35*3e777be0SXin Li public: 36*3e777be0SXin Li using HidlToken = android::hardware::hidl_array<uint8_t, ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN>; 37*3e777be0SXin Li ArmnnDriver(DriverOptions options)38*3e777be0SXin Li ArmnnDriver(DriverOptions options) 39*3e777be0SXin Li : ArmnnDevice(std::move(options)) 40*3e777be0SXin Li { 41*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::ArmnnDriver()"); 42*3e777be0SXin Li } ~ArmnnDriver()43*3e777be0SXin Li ~ArmnnDriver() {} 44*3e777be0SXin Li 45*3e777be0SXin Li getCapabilities(V1_0::IDevice::getCapabilities_cb cb)46*3e777be0SXin Li Return<void> getCapabilities(V1_0::IDevice::getCapabilities_cb cb) override 47*3e777be0SXin Li { 48*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getCapabilities()"); 49*3e777be0SXin Li 50*3e777be0SXin Li return hal_1_0::ArmnnDriverImpl::getCapabilities(m_Runtime, cb); 51*3e777be0SXin Li } 52*3e777be0SXin Li getSupportedOperations(const V1_0::Model & model,V1_0::IDevice::getSupportedOperations_cb cb)53*3e777be0SXin Li Return<void> getSupportedOperations(const V1_0::Model& model, 54*3e777be0SXin Li V1_0::IDevice::getSupportedOperations_cb cb) override 55*3e777be0SXin Li { 56*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getSupportedOperations()"); 57*3e777be0SXin Li 58*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::getSupportedOperations(m_Runtime, 59*3e777be0SXin Li m_Options, 60*3e777be0SXin Li model, 61*3e777be0SXin Li cb); 62*3e777be0SXin Li } 63*3e777be0SXin Li prepareModel(const V1_0::Model & model,const android::sp<V1_0::IPreparedModelCallback> & cb)64*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel(const V1_0::Model& model, 65*3e777be0SXin Li const android::sp<V1_0::IPreparedModelCallback>& cb) override 66*3e777be0SXin Li { 67*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel()"); 68*3e777be0SXin Li 69*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::prepareModel(m_Runtime, 70*3e777be0SXin Li m_ClTunedParameters, 71*3e777be0SXin Li m_Options, 72*3e777be0SXin Li model, 73*3e777be0SXin Li cb); 74*3e777be0SXin Li } 75*3e777be0SXin Li getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb)76*3e777be0SXin Li Return<void> getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb) override 77*3e777be0SXin Li { 78*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getCapabilities_1_1()"); 79*3e777be0SXin Li 80*3e777be0SXin Li return hal_1_1::ArmnnDriverImpl::getCapabilities_1_1(m_Runtime, cb); 81*3e777be0SXin Li } 82*3e777be0SXin Li getSupportedOperations_1_1(const V1_1::Model & model,V1_1::IDevice::getSupportedOperations_1_1_cb cb)83*3e777be0SXin Li Return<void> getSupportedOperations_1_1(const V1_1::Model& model, 84*3e777be0SXin Li V1_1::IDevice::getSupportedOperations_1_1_cb cb) override 85*3e777be0SXin Li { 86*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getSupportedOperations_1_1()"); 87*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::getSupportedOperations(m_Runtime, 88*3e777be0SXin Li m_Options, 89*3e777be0SXin Li model, 90*3e777be0SXin Li cb); 91*3e777be0SXin Li } 92*3e777be0SXin Li prepareModel_1_1(const V1_1::Model & model,V1_1::ExecutionPreference preference,const android::sp<V1_0::IPreparedModelCallback> & cb)93*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel_1_1(const V1_1::Model& model, 94*3e777be0SXin Li V1_1::ExecutionPreference preference, 95*3e777be0SXin Li const android::sp<V1_0::IPreparedModelCallback>& cb) override 96*3e777be0SXin Li { 97*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_1()"); 98*3e777be0SXin Li 99*3e777be0SXin Li if (!(preference == V1_1::ExecutionPreference::LOW_POWER || 100*3e777be0SXin Li preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER || 101*3e777be0SXin Li preference == V1_1::ExecutionPreference::SUSTAINED_SPEED)) 102*3e777be0SXin Li { 103*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_1: Invalid execution preference"); 104*3e777be0SXin Li cb->notify(V1_0::ErrorStatus::INVALID_ARGUMENT, nullptr); 105*3e777be0SXin Li return V1_0::ErrorStatus::INVALID_ARGUMENT; 106*3e777be0SXin Li } 107*3e777be0SXin Li 108*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::prepareModel(m_Runtime, 109*3e777be0SXin Li m_ClTunedParameters, 110*3e777be0SXin Li m_Options, 111*3e777be0SXin Li model, 112*3e777be0SXin Li cb, 113*3e777be0SXin Li model.relaxComputationFloat32toFloat16 114*3e777be0SXin Li && m_Options.GetFp16Enabled()); 115*3e777be0SXin Li } 116*3e777be0SXin Li getCapabilities_1_2(getCapabilities_1_2_cb cb)117*3e777be0SXin Li Return<void> getCapabilities_1_2(getCapabilities_1_2_cb cb) 118*3e777be0SXin Li { 119*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getCapabilities()"); 120*3e777be0SXin Li 121*3e777be0SXin Li return hal_1_2::ArmnnDriverImpl::getCapabilities_1_2(m_Runtime, cb); 122*3e777be0SXin Li } 123*3e777be0SXin Li getSupportedOperations_1_2(const V1_2::Model & model,getSupportedOperations_1_2_cb cb)124*3e777be0SXin Li Return<void> getSupportedOperations_1_2(const V1_2::Model& model, 125*3e777be0SXin Li getSupportedOperations_1_2_cb cb) 126*3e777be0SXin Li { 127*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getSupportedOperations()"); 128*3e777be0SXin Li 129*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_2::HalPolicy>::getSupportedOperations(m_Runtime, 130*3e777be0SXin Li m_Options, 131*3e777be0SXin Li model, 132*3e777be0SXin Li cb); 133*3e777be0SXin Li } 134*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)135*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModel_1_2( 136*3e777be0SXin Li const V1_2::Model& model, 137*3e777be0SXin Li V1_1::ExecutionPreference preference, 138*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCacheHandle, 139*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCacheHandle, 140*3e777be0SXin Li const HidlToken& token, 141*3e777be0SXin Li const android::sp<V1_2::IPreparedModelCallback>& cb) 142*3e777be0SXin Li { 143*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_2()"); 144*3e777be0SXin Li 145*3e777be0SXin Li if (!(preference == V1_1::ExecutionPreference::LOW_POWER || 146*3e777be0SXin Li preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER || 147*3e777be0SXin Li preference == V1_1::ExecutionPreference::SUSTAINED_SPEED)) 148*3e777be0SXin Li { 149*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_2: Invalid execution preference"); 150*3e777be0SXin Li cb->notify(V1_0::ErrorStatus::INVALID_ARGUMENT, nullptr); 151*3e777be0SXin Li return V1_0::ErrorStatus::INVALID_ARGUMENT; 152*3e777be0SXin Li } 153*3e777be0SXin Li 154*3e777be0SXin Li return hal_1_2::ArmnnDriverImpl::prepareArmnnModel_1_2(m_Runtime, 155*3e777be0SXin Li m_ClTunedParameters, 156*3e777be0SXin Li m_Options, 157*3e777be0SXin Li model, 158*3e777be0SXin Li modelCacheHandle, 159*3e777be0SXin Li dataCacheHandle, 160*3e777be0SXin Li token, 161*3e777be0SXin Li cb, 162*3e777be0SXin Li model.relaxComputationFloat32toFloat16 163*3e777be0SXin Li && m_Options.GetFp16Enabled()); 164*3e777be0SXin Li } 165*3e777be0SXin Li getCapabilities_1_3(getCapabilities_1_3_cb cb)166*3e777be0SXin Li Return<void> getCapabilities_1_3(getCapabilities_1_3_cb cb) 167*3e777be0SXin Li { 168*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getCapabilities()"); 169*3e777be0SXin Li 170*3e777be0SXin Li return hal_1_3::ArmnnDriverImpl::getCapabilities_1_3(m_Runtime, cb); 171*3e777be0SXin Li } 172*3e777be0SXin Li getSupportedOperations_1_3(const V1_3::Model & model,getSupportedOperations_1_3_cb cb)173*3e777be0SXin Li Return<void> getSupportedOperations_1_3(const V1_3::Model& model, 174*3e777be0SXin Li getSupportedOperations_1_3_cb cb) 175*3e777be0SXin Li { 176*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getSupportedOperations()"); 177*3e777be0SXin Li 178*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_3::HalPolicy>::getSupportedOperations(m_Runtime, 179*3e777be0SXin Li m_Options, 180*3e777be0SXin Li model, 181*3e777be0SXin Li cb); 182*3e777be0SXin Li } 183*3e777be0SXin Li prepareModel_1_3(const V1_3::Model & model,V1_1::ExecutionPreference preference,V1_3::Priority priority,const V1_3::OptionalTimePoint &,const android::hardware::hidl_vec<android::hardware::hidl_handle> & modelCache,const android::hardware::hidl_vec<android::hardware::hidl_handle> & dataCache,const HidlToken & token,const android::sp<V1_3::IPreparedModelCallback> & cb)184*3e777be0SXin Li Return<V1_3::ErrorStatus> prepareModel_1_3( 185*3e777be0SXin Li const V1_3::Model& model, 186*3e777be0SXin Li V1_1::ExecutionPreference preference, 187*3e777be0SXin Li V1_3::Priority priority, 188*3e777be0SXin Li const V1_3::OptionalTimePoint&, 189*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCache, 190*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCache, 191*3e777be0SXin Li const HidlToken& token, 192*3e777be0SXin Li const android::sp<V1_3::IPreparedModelCallback>& cb) 193*3e777be0SXin Li { 194*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_3()"); 195*3e777be0SXin Li 196*3e777be0SXin Li if (!(preference == V1_1::ExecutionPreference::LOW_POWER || 197*3e777be0SXin Li preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER || 198*3e777be0SXin Li preference == V1_1::ExecutionPreference::SUSTAINED_SPEED)) 199*3e777be0SXin Li { 200*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_3: Invalid execution preference"); 201*3e777be0SXin Li cb->notify_1_3(V1_3::ErrorStatus::INVALID_ARGUMENT, nullptr); 202*3e777be0SXin Li return V1_3::ErrorStatus::INVALID_ARGUMENT; 203*3e777be0SXin Li } 204*3e777be0SXin Li 205*3e777be0SXin Li if (!android::nn::validatePriority(priority)) { 206*3e777be0SXin Li cb->notify_1_3(V1_3::ErrorStatus::INVALID_ARGUMENT, nullptr); 207*3e777be0SXin Li return V1_3::ErrorStatus::INVALID_ARGUMENT; 208*3e777be0SXin Li } 209*3e777be0SXin Li 210*3e777be0SXin Li return ArmnnDriverImpl::prepareArmnnModel_1_3(m_Runtime, 211*3e777be0SXin Li m_ClTunedParameters, 212*3e777be0SXin Li m_Options, 213*3e777be0SXin Li model, 214*3e777be0SXin Li modelCache, 215*3e777be0SXin Li dataCache, 216*3e777be0SXin Li token, 217*3e777be0SXin Li cb, 218*3e777be0SXin Li model.relaxComputationFloat32toFloat16 219*3e777be0SXin Li && m_Options.GetFp16Enabled(), 220*3e777be0SXin Li priority); 221*3e777be0SXin Li } 222*3e777be0SXin Li getSupportedExtensions(getSupportedExtensions_cb cb)223*3e777be0SXin Li Return<void> getSupportedExtensions(getSupportedExtensions_cb cb) 224*3e777be0SXin Li { 225*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getSupportedExtensions()"); 226*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, {/* No extensions. */}); 227*3e777be0SXin Li return Void(); 228*3e777be0SXin Li } 229*3e777be0SXin Li getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb)230*3e777be0SXin Li Return<void> getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb) 231*3e777be0SXin Li { 232*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getNumberOfCacheFilesNeeded()"); 233*3e777be0SXin Li unsigned int numberOfCachedModelFiles = 0; 234*3e777be0SXin Li for (auto& backend : m_Options.GetBackends()) 235*3e777be0SXin Li { 236*3e777be0SXin Li numberOfCachedModelFiles += GetNumberOfCacheFiles(backend); 237*3e777be0SXin Li } 238*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, numberOfCachedModelFiles, 1ul); 239*3e777be0SXin Li return Void(); 240*3e777be0SXin Li } 241*3e777be0SXin Li getStatus()242*3e777be0SXin Li Return<V1_0::DeviceStatus> getStatus() override 243*3e777be0SXin Li { 244*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getStatus()"); 245*3e777be0SXin Li 246*3e777be0SXin Li return armnn_driver::ArmnnDriverImpl<hal_1_3::HalPolicy>::getStatus(); 247*3e777be0SXin Li } 248*3e777be0SXin Li getVersionString(getVersionString_cb cb)249*3e777be0SXin Li Return<void> getVersionString(getVersionString_cb cb) 250*3e777be0SXin Li { 251*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getVersionString()"); 252*3e777be0SXin Li 253*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, "ArmNN"); 254*3e777be0SXin Li return Void(); 255*3e777be0SXin Li } 256*3e777be0SXin Li getType(getType_cb cb)257*3e777be0SXin Li Return<void> getType(getType_cb cb) 258*3e777be0SXin Li { 259*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::getType()"); 260*3e777be0SXin Li const auto device_type = hal_1_2::HalPolicy::GetDeviceTypeFromOptions(this->m_Options); 261*3e777be0SXin Li cb(V1_0::ErrorStatus::NONE, device_type); 262*3e777be0SXin Li return Void(); 263*3e777be0SXin Li } 264*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)265*3e777be0SXin Li Return<V1_0::ErrorStatus> prepareModelFromCache( 266*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCacheHandle, 267*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCacheHandle, 268*3e777be0SXin Li const HidlToken& token, 269*3e777be0SXin Li const android::sp<V1_2::IPreparedModelCallback>& cb) 270*3e777be0SXin Li { 271*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModelFromCache()"); 272*3e777be0SXin Li return hal_1_2::ArmnnDriverImpl::prepareModelFromCache(m_Runtime, 273*3e777be0SXin Li m_Options, 274*3e777be0SXin Li modelCacheHandle, 275*3e777be0SXin Li dataCacheHandle, 276*3e777be0SXin Li token, 277*3e777be0SXin Li cb); 278*3e777be0SXin Li } 279*3e777be0SXin Li prepareModelFromCache_1_3(const V1_3::OptionalTimePoint &,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_3::IPreparedModelCallback> & cb)280*3e777be0SXin Li Return<V1_3::ErrorStatus> prepareModelFromCache_1_3( 281*3e777be0SXin Li const V1_3::OptionalTimePoint&, 282*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& modelCacheHandle, 283*3e777be0SXin Li const android::hardware::hidl_vec<android::hardware::hidl_handle>& dataCacheHandle, 284*3e777be0SXin Li const HidlToken& token, 285*3e777be0SXin Li const android::sp<V1_3::IPreparedModelCallback>& cb) 286*3e777be0SXin Li { 287*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::prepareModelFromCache_1_3()"); 288*3e777be0SXin Li 289*3e777be0SXin Li return ArmnnDriverImpl::prepareModelFromCache_1_3(m_Runtime, 290*3e777be0SXin Li m_Options, 291*3e777be0SXin Li modelCacheHandle, 292*3e777be0SXin Li dataCacheHandle, 293*3e777be0SXin Li token, 294*3e777be0SXin Li cb); 295*3e777be0SXin Li } 296*3e777be0SXin Li allocate(const V1_3::BufferDesc &,const hidl_vec<android::sp<V1_3::IPreparedModel>> &,const hidl_vec<V1_3::BufferRole> &,const hidl_vec<V1_3::BufferRole> &,allocate_cb cb)297*3e777be0SXin Li Return<void> allocate(const V1_3::BufferDesc& /*desc*/, 298*3e777be0SXin Li const hidl_vec<android::sp<V1_3::IPreparedModel>>& /*preparedModels*/, 299*3e777be0SXin Li const hidl_vec<V1_3::BufferRole>& /*inputRoles*/, 300*3e777be0SXin Li const hidl_vec<V1_3::BufferRole>& /*outputRoles*/, 301*3e777be0SXin Li allocate_cb cb) { 302*3e777be0SXin Li ALOGV("hal_1_3::ArmnnDriver::allocate()"); 303*3e777be0SXin Li cb(V1_3::ErrorStatus::GENERAL_FAILURE, nullptr, 0); 304*3e777be0SXin Li return Void(); 305*3e777be0SXin Li } 306*3e777be0SXin Li 307*3e777be0SXin Li }; 308*3e777be0SXin Li 309*3e777be0SXin Li } // namespace hal_1_3 310*3e777be0SXin Li } // namespace armnn_driver 311