xref: /aosp_15_r20/external/android-nn-driver/1.3/ArmnnDriver.hpp (revision 3e777be0405cee09af5d5785ff37f7cfb5bee59a)
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