• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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