blob: 6d2e0b7a53a1c4e0adeb5fdaa63dc93b27d61d90 [file] [log] [blame]
Kevin May42477c12020-03-26 13:34:14 +00001//
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
Sadik Armagan0a2dfab2021-10-06 16:41:44 +010024#include <armnn/BackendHelper.hpp>
25
Kevin May42477c12020-03-26 13:34:14 +000026#include <log/log.h>
27
28namespace armnn_driver
29{
30namespace hal_1_3
31{
32
33class ArmnnDriver : public ArmnnDevice, public V1_3::IDevice
34{
35public:
Sadik Armagan0a2dfab2021-10-06 16:41:44 +010036 using HidlToken = android::hardware::hidl_array<uint8_t, ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN>;
Kevin May42477c12020-03-26 13:34:14 +000037
38 ArmnnDriver(DriverOptions options)
39 : ArmnnDevice(std::move(options))
40 {
41 ALOGV("hal_1_3::ArmnnDriver::ArmnnDriver()");
42 }
43 ~ArmnnDriver() {}
44
Kevin May42477c12020-03-26 13:34:14 +000045
Kevin May42477c12020-03-26 13:34:14 +000046 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
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
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
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
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
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
Sadik Armagan188675f2021-02-12 17:16:42 +000099 if (!(preference == V1_1::ExecutionPreference::LOW_POWER ||
100 preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER ||
101 preference == V1_1::ExecutionPreference::SUSTAINED_SPEED))
Kevin May42477c12020-03-26 13:34:14 +0000102 {
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
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
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
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100135 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)
Kevin May42477c12020-03-26 13:34:14 +0000142 {
143 ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_2()");
144
Sadik Armagan188675f2021-02-12 17:16:42 +0000145 if (!(preference == V1_1::ExecutionPreference::LOW_POWER ||
146 preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER ||
147 preference == V1_1::ExecutionPreference::SUSTAINED_SPEED))
Kevin May42477c12020-03-26 13:34:14 +0000148 {
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,
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100158 modelCacheHandle,
159 dataCacheHandle,
160 token,
Kevin May42477c12020-03-26 13:34:14 +0000161 cb,
162 model.relaxComputationFloat32toFloat16
163 && m_Options.GetFp16Enabled());
164 }
165
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
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
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100184 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)
Kevin May42477c12020-03-26 13:34:14 +0000193 {
194 ALOGV("hal_1_3::ArmnnDriver::prepareModel_1_3()");
195
Sadik Armagan188675f2021-02-12 17:16:42 +0000196 if (!(preference == V1_1::ExecutionPreference::LOW_POWER ||
197 preference == V1_1::ExecutionPreference::FAST_SINGLE_ANSWER ||
198 preference == V1_1::ExecutionPreference::SUSTAINED_SPEED))
Kevin May42477c12020-03-26 13:34:14 +0000199 {
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
Kevin May42477c12020-03-26 13:34:14 +0000210 return ArmnnDriverImpl::prepareArmnnModel_1_3(m_Runtime,
211 m_ClTunedParameters,
212 m_Options,
213 model,
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100214 modelCache,
215 dataCache,
216 token,
Kevin May42477c12020-03-26 13:34:14 +0000217 cb,
218 model.relaxComputationFloat32toFloat16
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100219 && m_Options.GetFp16Enabled(),
220 priority);
Kevin May42477c12020-03-26 13:34:14 +0000221 }
222
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
230 Return<void> getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb)
231 {
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100232 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);
Kevin May42477c12020-03-26 13:34:14 +0000239 return Void();
240 }
241
Sadik Armagan188675f2021-02-12 17:16:42 +0000242 Return<V1_0::DeviceStatus> getStatus() override
Kevin May42477c12020-03-26 13:34:14 +0000243 {
244 ALOGV("hal_1_3::ArmnnDriver::getStatus()");
245
246 return armnn_driver::ArmnnDriverImpl<hal_1_3::HalPolicy>::getStatus();
247 }
248
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
257 Return<void> getType(getType_cb cb)
258 {
259 ALOGV("hal_1_3::ArmnnDriver::getType()");
Pablo Tello6bf3f432021-09-01 15:30:10 +0100260 const auto device_type = hal_1_2::HalPolicy::GetDeviceTypeFromOptions(this->m_Options);
261 cb(V1_0::ErrorStatus::NONE, device_type);
Kevin May42477c12020-03-26 13:34:14 +0000262 return Void();
263 }
264
265 Return<V1_0::ErrorStatus> prepareModelFromCache(
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100266 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)
Kevin May42477c12020-03-26 13:34:14 +0000270 {
271 ALOGV("hal_1_3::ArmnnDriver::prepareModelFromCache()");
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100272 return hal_1_2::ArmnnDriverImpl::prepareModelFromCache(m_Runtime,
273 m_Options,
274 modelCacheHandle,
275 dataCacheHandle,
276 token,
277 cb);
Kevin May42477c12020-03-26 13:34:14 +0000278 }
279
Sadik Armagan188675f2021-02-12 17:16:42 +0000280 Return<V1_3::ErrorStatus> prepareModelFromCache_1_3(
Kevin May42477c12020-03-26 13:34:14 +0000281 const V1_3::OptionalTimePoint&,
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100282 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)
Kevin May42477c12020-03-26 13:34:14 +0000286 {
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100287 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);
Kevin May42477c12020-03-26 13:34:14 +0000295 }
296
Kevin May42477c12020-03-26 13:34:14 +0000297 Return<void> allocate(const V1_3::BufferDesc& /*desc*/,
Sadik Armagan188675f2021-02-12 17:16:42 +0000298 const hidl_vec<android::sp<V1_3::IPreparedModel>>& /*preparedModels*/,
Kevin May42477c12020-03-26 13:34:14 +0000299 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()");
Sadik Armagan188675f2021-02-12 17:16:42 +0000303 cb(V1_3::ErrorStatus::GENERAL_FAILURE, nullptr, 0);
Kevin May42477c12020-03-26 13:34:14 +0000304 return Void();
305 }
306
307};
308
309} // namespace hal_1_3
310} // namespace armnn_driver