[SF] Kernel idle timer configuration
This change configures the kernel idle timer using the composer3 HAL APIs.
BUG: 198808492
Test: atest libsurfaceflinger_unittest
Change-Id: I7de140c3094cb84c8efe782c19c98e126cb4c60b
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
index 80e2d99..92592f7 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -248,6 +248,7 @@
case OptionalFeature::ExpectedPresentTime:
case OptionalFeature::DisplayBrightnessCommand:
case OptionalFeature::BootDisplayConfig:
+ case OptionalFeature::KernelIdleTimer:
return true;
}
}
@@ -475,6 +476,19 @@
return Error::NONE;
}
+Error AidlComposer::hasDisplayIdleTimerCapability(Display display, bool* outSupport) {
+ std::vector<AidlDisplayCapability> capabilities;
+ const auto status =
+ mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
+ if (!status.isOk()) {
+ ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
+ return static_cast<Error>(status.getServiceSpecificError());
+ }
+ *outSupport = std::find(capabilities.begin(), capabilities.end(),
+ AidlDisplayCapability::DISPLAY_IDLE_TIMER) != capabilities.end();
+ return Error::NONE;
+}
+
Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
float* outMaxLuminance, float* outMaxAverageLuminance,
float* outMinLuminance) {
@@ -1100,5 +1114,17 @@
}
return Error::NONE;
}
+
+Error AidlComposer::setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) {
+ const auto status =
+ mAidlComposerClient->setIdleTimerEnabled(translate<int64_t>(displayId),
+ translate<int32_t>(timeout.count()));
+ if (!status.isOk()) {
+ ALOGE("setIdleTimerEnabled failed %s", status.getDescription().c_str());
+ return static_cast<Error>(status.getServiceSpecificError());
+ }
+ return Error::NONE;
+}
+
} // namespace Hwc2
} // namespace android
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
index 80ca8da..6c0f636 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
@@ -100,6 +100,7 @@
std::vector<uint32_t>* outLayerRequestMasks) override;
Error getDozeSupport(Display display, bool* outSupport) override;
+ Error hasDisplayIdleTimerCapability(Display display, bool* outSupport) override;
Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
float* outMaxAverageLuminance, float* outMinLuminance) override;
@@ -220,6 +221,7 @@
Error getPreferredBootDisplayConfig(Display displayId, Config*) override;
Error getDisplayDecorationSupport(Display display,
std::optional<DisplayDecorationSupport>* support) override;
+ Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override;
private:
// Many public functions above simply write a command into the command
diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h
index 23886d4..6abe7d1 100644
--- a/services/surfaceflinger/DisplayHardware/ComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h
@@ -93,6 +93,7 @@
// Whether setDisplayBrightness is able to be applied as part of a display command.
DisplayBrightnessCommand,
BootDisplayConfig,
+ KernelIdleTimer,
};
virtual bool isSupported(OptionalFeature) const = 0;
@@ -134,6 +135,7 @@
std::vector<uint32_t>* outLayerRequestMasks) = 0;
virtual Error getDozeSupport(Display display, bool* outSupport) = 0;
+ virtual Error hasDisplayIdleTimerCapability(Display display, bool* outSupport) = 0;
virtual Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
float* outMaxLuminance, float* outMaxAverageLuminance,
float* outMinLuminance) = 0;
@@ -274,6 +276,7 @@
Display display,
std::optional<::aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) = 0;
+ virtual Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) = 0;
};
} // namespace Hwc2
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index a1b663c..6501276 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -148,6 +148,12 @@
return mComposer.isSupported(android::Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
}
+bool Display::hasDisplayIdleTimerCapability() const {
+ bool isCapabilitySupported = false;
+ return mComposer.hasDisplayIdleTimerCapability(mId, &isCapabilitySupported) == Error::NONE &&
+ isCapabilitySupported;
+}
+
Error Display::getChangedCompositionTypes(std::unordered_map<HWC2::Layer*, Composition>* outTypes) {
std::vector<Hwc2::Layer> layerIds;
std::vector<Composition> types;
@@ -588,6 +594,11 @@
return static_cast<Error>(error);
}
+Error Display::setIdleTimerEnabled(std::chrono::milliseconds timeout) {
+ const auto error = mComposer.setIdleTimerEnabled(mId, timeout);
+ return static_cast<Error>(error);
+}
+
// For use by Device
void Display::setConnected(bool connected) {
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h
index 334d6ec..c03cede 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2.h
@@ -91,6 +91,7 @@
virtual bool hasCapability(
aidl::android::hardware::graphics::composer3::DisplayCapability) const = 0;
virtual bool isVsyncPeriodSwitchSupported() const = 0;
+ virtual bool hasDisplayIdleTimerCapability() const = 0;
virtual void onLayerDestroyed(hal::HWLayerId layerId) = 0;
[[clang::warn_unused_result]] virtual hal::Error acceptChanges() = 0;
@@ -166,6 +167,8 @@
[[clang::warn_unused_result]] virtual hal::Error getDisplayDecorationSupport(
std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) = 0;
+ [[clang::warn_unused_result]] virtual hal::Error setIdleTimerEnabled(
+ std::chrono::milliseconds timeout) = 0;
};
namespace impl {
@@ -242,6 +245,7 @@
hal::Error getDisplayDecorationSupport(
std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) override;
+ hal::Error setIdleTimerEnabled(std::chrono::milliseconds timeout) override;
// Other Display methods
hal::HWDisplayId getId() const override { return mId; }
@@ -250,6 +254,7 @@
bool hasCapability(aidl::android::hardware::graphics::composer3::DisplayCapability)
const override EXCLUDES(mDisplayCapabilitiesMutex);
bool isVsyncPeriodSwitchSupported() const override;
+ bool hasDisplayIdleTimerCapability() const override;
void onLayerDestroyed(hal::HWLayerId layerId) override;
private:
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index ed6e4b0..02b3772 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -971,6 +971,26 @@
}
}
+status_t HWComposer::setIdleTimerEnabled(PhysicalDisplayId displayId,
+ std::chrono::milliseconds timeout) {
+ ATRACE_CALL();
+ RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX);
+ const auto error = mDisplayData[displayId].hwcDisplay->setIdleTimerEnabled(timeout);
+ if (error == hal::Error::UNSUPPORTED) {
+ RETURN_IF_HWC_ERROR(error, displayId, INVALID_OPERATION);
+ }
+ if (error == hal::Error::BAD_PARAMETER) {
+ RETURN_IF_HWC_ERROR(error, displayId, BAD_VALUE);
+ }
+ RETURN_IF_HWC_ERROR(error, displayId, UNKNOWN_ERROR);
+ return NO_ERROR;
+}
+
+bool HWComposer::hasDisplayIdleTimerCapability(PhysicalDisplayId displayId) {
+ RETURN_IF_INVALID_DISPLAY(displayId, false);
+ return mDisplayData[displayId].hwcDisplay->hasDisplayIdleTimerCapability();
+}
+
void HWComposer::loadLayerMetadataSupport() {
mSupportedLayerGenericMetadata.clear();
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index 5b2e265..f9637f0 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -267,6 +267,8 @@
PhysicalDisplayId,
std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) = 0;
+ virtual status_t setIdleTimerEnabled(PhysicalDisplayId, std::chrono::milliseconds timeout) = 0;
+ virtual bool hasDisplayIdleTimerCapability(PhysicalDisplayId) = 0;
};
namespace impl {
@@ -402,6 +404,8 @@
PhysicalDisplayId,
std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) override;
+ status_t setIdleTimerEnabled(PhysicalDisplayId, std::chrono::milliseconds timeout) override;
+ bool hasDisplayIdleTimerCapability(PhysicalDisplayId) override;
// for debugging ----------------------------------------------------------
void dump(std::string& out) const override;
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
index f735bba..33adceb 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
@@ -236,6 +236,7 @@
case OptionalFeature::ExpectedPresentTime:
case OptionalFeature::DisplayBrightnessCommand:
case OptionalFeature::BootDisplayConfig:
+ case OptionalFeature::KernelIdleTimer:
return false;
}
}
@@ -487,6 +488,11 @@
return error;
}
+Error HidlComposer::hasDisplayIdleTimerCapability(Display, bool*) {
+ LOG_ALWAYS_FATAL("hasDisplayIdleTimerCapability should have never been called on this as "
+ "OptionalFeature::KernelIdleTimer is not supported on HIDL");
+}
+
Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
float* outMaxLuminance, float* outMaxAverageLuminance,
float* outMinLuminance) {
@@ -1320,6 +1326,11 @@
return Error::UNSUPPORTED;
}
+Error HidlComposer::setIdleTimerEnabled(Display, std::chrono::milliseconds) {
+ LOG_ALWAYS_FATAL("setIdleTimerEnabled should have never been called on this as "
+ "OptionalFeature::KernelIdleTimer is not supported on HIDL");
+}
+
void HidlComposer::registerCallback(ComposerCallback& callback) {
const bool vsyncSwitchingSupported =
isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
index c2b60cb..a1ea4f2 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
@@ -208,6 +208,7 @@
std::vector<uint32_t>* outLayerRequestMasks) override;
Error getDozeSupport(Display display, bool* outSupport) override;
+ Error hasDisplayIdleTimerCapability(Display display, bool* outSupport) override;
Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
float* outMaxAverageLuminance, float* outMinLuminance) override;
@@ -331,6 +332,7 @@
Display display,
std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
support) override;
+ Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override;
private:
class CommandWriter : public CommandWriterBase {