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