Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f497d18 authored by Michael Butler's avatar Michael Butler
Browse files

Clamp NNAPI HAL Version to runtime version -- hal

The NNAPI is a Mainline Module, and its runtime version is determined by
an Android Feature Flag to remotely rollout and rollback Feature Levels
as needed. This change propagates the maximum feature level version
allowed by the runtime to the HAL utility code, and clamps the utility
code's version to the version allowed by the runtime.

Bug: N/A
Test: mma
Test: CtsNNAPITestCases
Test: NeuralNetworksTest_static
Test: logged driver version, set current_feature_level, and verified the
      driver version was clamped by current_feature_level
Change-Id: Ibaa895f8e35d36b2ddf9432b3ef9468e5886075f
parent 4673d5ab
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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

+6 −4
Original line number Diff line number Diff line
@@ -55,11 +55,12 @@ nn::GeneralResult<nn::Version> getAidlServiceFeatureLevel(IDevice* service) {

}  // namespace

nn::GeneralResult<nn::SharedDevice> getDevice(const std::string& instanceName) {
nn::GeneralResult<nn::SharedDevice> 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<nn::SharedDevice> {
            [instanceName, name = std::move(fullName),
             maxFeatureLevelAllowed](bool blocking) -> nn::GeneralResult<nn::SharedDevice> {
        std::add_pointer_t<AIBinder*(const char*)> getService;
        if (blocking) {
            if (__builtin_available(android __NNAPI_AIDL_MIN_ANDROID_API__, *)) {
@@ -79,7 +80,8 @@ nn::GeneralResult<nn::SharedDevice> 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);
    };

+12 −1
Original line number Diff line number Diff line
@@ -29,7 +29,18 @@ struct SharedDeviceAndUpdatability {
    bool isDeviceUpdatable = false;
};

std::vector<SharedDeviceAndUpdatability> 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<SharedDeviceAndUpdatability> getDevices(bool includeUpdatableDrivers,
                                                    nn::Version::Level maxFeatureLevelAllowed);

}  // namespace android::hardware::neuralnetworks::service

+7 −4
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ void getHidlDevicesForVersion(const std::string& descriptor, getDeviceFn getDevi

void getAidlDevices(std::vector<SharedDeviceAndUpdatability>* devices,
                    std::unordered_set<std::string>* registeredDevices,
                    bool includeUpdatableDrivers) {
                    bool includeUpdatableDrivers, nn::Version::Level maxFeatureLevelAllowed) {
    CHECK(devices != nullptr);
    CHECK(registeredDevices != nullptr);

@@ -100,7 +100,7 @@ void getAidlDevices(std::vector<SharedDeviceAndUpdatability>* 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<SharedDeviceAndUpdatability>* devices,

}  // namespace

std::vector<SharedDeviceAndUpdatability> getDevices(bool includeUpdatableDrivers) {
std::vector<SharedDeviceAndUpdatability> getDevices(bool includeUpdatableDrivers,
                                                    nn::Version::Level maxFeatureLevelAllowed) {
    std::vector<SharedDeviceAndUpdatability> devices;
    std::unordered_set<std::string> registeredDevices;

    getAidlDevices(&devices, &registeredDevices, includeUpdatableDrivers);
    CHECK_GE(maxFeatureLevelAllowed, nn::Version::Level::FEATURE_LEVEL_5);

    getAidlDevices(&devices, &registeredDevices, includeUpdatableDrivers, maxFeatureLevelAllowed);

    getHidlDevicesForVersion(V1_3::IDevice::descriptor, &V1_3::utils::getDevice, &devices,
                             &registeredDevices);