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