blob: 40116c8aa6ec41f81e0b0190b43f2603255721d6 [file] [log] [blame]
Mike Kellyb5fdf382019-06-11 16:35:25 +01001//
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
24namespace armnn_driver
25{
26namespace hal_1_2
27{
28
29class ArmnnDriver : public ArmnnDevice, public V1_2::IDevice
30{
31public:
32 ArmnnDriver(DriverOptions options)
33 : ArmnnDevice(std::move(options))
34 {
35 ALOGV("hal_1_2::ArmnnDriver::ArmnnDriver()");
36 }
37 ~ArmnnDriver() {}
38
39 using HidlToken = android::hardware::hidl_array<uint8_t, ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN>;
40
41public:
42 Return<void> getCapabilities(V1_0::IDevice::getCapabilities_cb cb) override
43 {
44 ALOGV("hal_1_2::ArmnnDriver::getCapabilities()");
45
46 return hal_1_0::ArmnnDriverImpl::getCapabilities(m_Runtime, cb);
47 }
48
49 Return<void> getSupportedOperations(const V1_0::Model& model,
50 V1_0::IDevice::getSupportedOperations_cb cb) override
51 {
52 ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()");
53
54 return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::getSupportedOperations(m_Runtime,
55 m_Options,
56 model,
57 cb);
58 }
59
60 Return<ErrorStatus> prepareModel(const V1_0::Model& model,
61 const android::sp<V1_0::IPreparedModelCallback>& cb) override
62 {
63 ALOGV("hal_1_2::ArmnnDriver::prepareModel()");
64
65 return armnn_driver::ArmnnDriverImpl<hal_1_0::HalPolicy>::prepareModel(m_Runtime,
66 m_ClTunedParameters,
67 m_Options,
68 model,
69 cb);
70 }
71
72 Return<void> getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb) override
73 {
74 ALOGV("hal_1_2::ArmnnDriver::getCapabilities_1_1()");
75
76 return hal_1_1::ArmnnDriverImpl::getCapabilities_1_1(m_Runtime, cb);
77 }
78
79 Return<void> getSupportedOperations_1_1(const V1_1::Model& model,
80 V1_1::IDevice::getSupportedOperations_1_1_cb cb) override
81 {
82 ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations_1_1()");
83 return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::getSupportedOperations(m_Runtime,
84 m_Options,
85 model,
86 cb);
87 }
88
89 Return<ErrorStatus> prepareModel_1_1(const V1_1::Model& model,
90 V1_1::ExecutionPreference preference,
91 const android::sp<V1_0::IPreparedModelCallback>& cb) override
92 {
93 ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1()");
94
95 if (!(preference == ExecutionPreference::LOW_POWER ||
96 preference == ExecutionPreference::FAST_SINGLE_ANSWER ||
97 preference == ExecutionPreference::SUSTAINED_SPEED))
98 {
99 ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1: Invalid execution preference");
100 cb->notify(ErrorStatus::INVALID_ARGUMENT, nullptr);
101 return ErrorStatus::INVALID_ARGUMENT;
102 }
103
104 return armnn_driver::ArmnnDriverImpl<hal_1_1::HalPolicy>::prepareModel(m_Runtime,
105 m_ClTunedParameters,
106 m_Options,
107 model,
108 cb,
109 model.relaxComputationFloat32toFloat16
110 && m_Options.GetFp16Enabled());
111 }
112
113 Return<DeviceStatus> getStatus() override
114 {
115 ALOGV("hal_1_2::ArmnnDriver::getStatus()");
116
117 return armnn_driver::ArmnnDriverImpl<hal_1_2::HalPolicy>::getStatus();
118 }
119
120 Return<void> getVersionString(getVersionString_cb cb)
121 {
122 ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()");
123
124 cb(ErrorStatus::NONE, "ArmNN");
125 return Void();
126 }
127
128 Return<void> getType(getType_cb cb)
129 {
130 ALOGV("hal_1_2::ArmnnDriver::getType()");
131
132 cb(ErrorStatus::NONE, V1_2::DeviceType::CPU);
133 return Void();
134 }
135
136 Return<ErrorStatus> prepareModelFromCache(
137 const android::hardware::hidl_vec<android::hardware::hidl_handle>&,
138 const android::hardware::hidl_vec<android::hardware::hidl_handle>&,
139 const HidlToken&,
140 const sp<V1_2::IPreparedModelCallback>& callback)
141 {
142 ALOGV("hal_1_2::ArmnnDriver::prepareModelFromCache()");
143 callback->notify_1_2(ErrorStatus::GENERAL_FAILURE, nullptr);
144 return ErrorStatus::GENERAL_FAILURE;
145 }
146
147 Return<ErrorStatus> prepareModel_1_2(const V1_2::Model& model, V1_1::ExecutionPreference preference,
148 const android::hardware::hidl_vec<android::hardware::hidl_handle>&,
149 const android::hardware::hidl_vec<android::hardware::hidl_handle>&, const HidlToken&,
150 const android::sp<V1_2::IPreparedModelCallback>& cb)
151 {
Aron Virginas-Tar9f0693b2019-11-06 14:32:30 +0000152 ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_2()");
Mike Kellyb5fdf382019-06-11 16:35:25 +0100153
154 if (!(preference == ExecutionPreference::LOW_POWER ||
155 preference == ExecutionPreference::FAST_SINGLE_ANSWER ||
156 preference == ExecutionPreference::SUSTAINED_SPEED))
157 {
Aron Virginas-Tar9f0693b2019-11-06 14:32:30 +0000158 ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_2: Invalid execution preference");
Mike Kellyb5fdf382019-06-11 16:35:25 +0100159 cb->notify(ErrorStatus::INVALID_ARGUMENT, nullptr);
160 return ErrorStatus::INVALID_ARGUMENT;
161 }
162
163 return ArmnnDriverImpl::prepareArmnnModel_1_2(m_Runtime,
164 m_ClTunedParameters,
165 m_Options,
166 model,
167 cb,
168 model.relaxComputationFloat32toFloat16
169 && m_Options.GetFp16Enabled());
170 }
171
172 Return<void> getSupportedExtensions(getSupportedExtensions_cb cb)
173 {
174 ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()");
175 cb(ErrorStatus::NONE, {/* No extensions. */});
176 return Void();
177 }
178
179 Return<void> getCapabilities_1_2(getCapabilities_1_2_cb cb)
180 {
181 ALOGV("hal_1_2::ArmnnDriver::getCapabilities()");
182
183 return hal_1_2::ArmnnDriverImpl::getCapabilities_1_2(m_Runtime, cb);
184 }
185
186 Return<void> getSupportedOperations_1_2(const V1_2::Model& model,
187 getSupportedOperations_1_2_cb cb)
188 {
189 ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()");
190
191 return armnn_driver::ArmnnDriverImpl<hal_1_2::HalPolicy>::getSupportedOperations(m_Runtime,
192 m_Options,
193 model,
194 cb);
195 }
196
197 Return<void> getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb)
198 {
199 ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()");
200
201 // Set both numbers to be 0 for cache not supported.
202 cb(ErrorStatus::NONE, 0, 0);
203 return Void();
204 }
205};
206
207} // namespace hal_1_2
Aron Virginas-Tar9f0693b2019-11-06 14:32:30 +0000208} // namespace armnn_driver