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

Commit 27e3ce4c authored by Michael Butler's avatar Michael Butler Committed by Automerger Merge Worker
Browse files

Merge "Clamp NNAPI HAL Version to runtime version -- hal" am: b66f1308

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/1985406

Change-Id: Ifebccd1297cef08bdc1974eebea11bc7712a7061
parents 31e7dfc4 b66f1308
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);