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