diff --git a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Service.h b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Service.h index cb6ff4b1cd..f229165b59 100644 --- a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Service.h +++ b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Service.h @@ -25,7 +25,8 @@ namespace aidl::android::hardware::neuralnetworks::utils { -::android::nn::GeneralResult<::android::nn::SharedDevice> getDevice(const std::string& name); +::android::nn::GeneralResult<::android::nn::SharedDevice> getDevice( + const std::string& name, ::android::nn::Version::Level maxFeatureLevelAllowed); } // namespace aidl::android::hardware::neuralnetworks::utils diff --git a/neuralnetworks/aidl/utils/src/Service.cpp b/neuralnetworks/aidl/utils/src/Service.cpp index e48593c38e..24fbb5309b 100644 --- a/neuralnetworks/aidl/utils/src/Service.cpp +++ b/neuralnetworks/aidl/utils/src/Service.cpp @@ -55,11 +55,12 @@ nn::GeneralResult getAidlServiceFeatureLevel(IDevice* service) { } // namespace -nn::GeneralResult getDevice(const std::string& instanceName) { +nn::GeneralResult getDevice( + const std::string& instanceName, ::android::nn::Version::Level maxFeatureLevelAllowed) { auto fullName = std::string(IDevice::descriptor) + "/" + instanceName; hal::utils::ResilientDevice::Factory makeDevice = - [instanceName, - name = std::move(fullName)](bool blocking) -> nn::GeneralResult { + [instanceName, name = std::move(fullName), + maxFeatureLevelAllowed](bool blocking) -> nn::GeneralResult { std::add_pointer_t getService; if (blocking) { if (__builtin_available(android __NNAPI_AIDL_MIN_ANDROID_API__, *)) { @@ -79,7 +80,8 @@ nn::GeneralResult getDevice(const std::string& instanceName) { << " returned nullptr"; } ABinderProcess_startThreadPool(); - const auto featureLevel = NN_TRY(getAidlServiceFeatureLevel(service.get())); + auto featureLevel = NN_TRY(getAidlServiceFeatureLevel(service.get())); + featureLevel.level = std::min(featureLevel.level, maxFeatureLevelAllowed); return Device::create(instanceName, std::move(service), featureLevel); }; diff --git a/neuralnetworks/utils/service/include/nnapi/hal/Service.h b/neuralnetworks/utils/service/include/nnapi/hal/Service.h index 2fd523728d..e8b9c10d77 100644 --- a/neuralnetworks/utils/service/include/nnapi/hal/Service.h +++ b/neuralnetworks/utils/service/include/nnapi/hal/Service.h @@ -29,7 +29,18 @@ struct SharedDeviceAndUpdatability { bool isDeviceUpdatable = false; }; -std::vector getDevices(bool includeUpdatableDrivers); +/** + * @brief Get the NNAPI sAIDL and HIDL services declared in the VINTF. + * + * @pre maxFeatureLevelAllowed >= Version::Level::FEATURE_LEVEL_5 + * + * @param includeUpdatableDrivers Allow updatable drivers to be used. + * @param maxFeatureLevelAllowed Maximum version of driver allowed to be used. Any driver version + * exceeding this must be clamped to `maxFeatureLevelAllowed`. + * @return A list of devices and whether each device is updatable or not. + */ +std::vector getDevices(bool includeUpdatableDrivers, + nn::Version::Level maxFeatureLevelAllowed); } // namespace android::hardware::neuralnetworks::service diff --git a/neuralnetworks/utils/service/src/Service.cpp b/neuralnetworks/utils/service/src/Service.cpp index 2286288c41..e0d5f8240c 100644 --- a/neuralnetworks/utils/service/src/Service.cpp +++ b/neuralnetworks/utils/service/src/Service.cpp @@ -74,7 +74,7 @@ void getHidlDevicesForVersion(const std::string& descriptor, getDeviceFn getDevi void getAidlDevices(std::vector* devices, std::unordered_set* registeredDevices, - bool includeUpdatableDrivers) { + bool includeUpdatableDrivers, nn::Version::Level maxFeatureLevelAllowed) { CHECK(devices != nullptr); CHECK(registeredDevices != nullptr); @@ -100,7 +100,7 @@ void getAidlDevices(std::vector* devices, continue; } if (const auto [it, unregistered] = registeredDevices->insert(name); unregistered) { - auto maybeDevice = aidl_hal::utils::getDevice(name); + auto maybeDevice = aidl_hal::utils::getDevice(name, maxFeatureLevelAllowed); if (maybeDevice.has_value()) { auto device = std::move(maybeDevice).value(); CHECK(device != nullptr); @@ -116,11 +116,14 @@ void getAidlDevices(std::vector* devices, } // namespace -std::vector getDevices(bool includeUpdatableDrivers) { +std::vector getDevices(bool includeUpdatableDrivers, + nn::Version::Level maxFeatureLevelAllowed) { std::vector devices; std::unordered_set registeredDevices; - getAidlDevices(&devices, ®isteredDevices, includeUpdatableDrivers); + CHECK_GE(maxFeatureLevelAllowed, nn::Version::Level::FEATURE_LEVEL_5); + + getAidlDevices(&devices, ®isteredDevices, includeUpdatableDrivers, maxFeatureLevelAllowed); getHidlDevicesForVersion(V1_3::IDevice::descriptor, &V1_3::utils::getDevice, &devices, ®isteredDevices);