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