Merge "sdm: Add API for SR and PU control from Dpps" into display.lnx.5.0
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 8f2a5f8..91d6194 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -643,6 +643,12 @@
kDppsFeaturesMax,
};
+struct DppsFeaturePayload {
+ uint32_t object_type;
+ uint32_t feature_id;
+ uint64_t value;
+};
+
struct DRMDppsFeatureInfo {
DRMDPPSFeatureID id;
uint32_t version;
diff --git a/sdm/include/core/dpps_interface.h b/sdm/include/core/dpps_interface.h
index d3d3d02..47b3e2b 100644
--- a/sdm/include/core/dpps_interface.h
+++ b/sdm/include/core/dpps_interface.h
@@ -34,11 +34,17 @@
namespace sdm {
+enum DppsOps {
+ kDppsSetFeature,
+ kDppsGetFeatureInfo,
+ kDppsScreenRefresh,
+ kDppsPartialUpdate,
+ kDppsOpMax,
+};
+
class DppsPropIntf {
public:
- virtual DisplayError SetDppsFeature(uint32_t object_type,
- uint32_t feature_id, uint64_t value) = 0;
- virtual DisplayError GetDppsFeatureInfo(void *info) = 0;
+ virtual DisplayError DppsProcessOps(enum DppsOps op, void *payload, size_t size) = 0;
protected:
virtual ~DppsPropIntf() { }
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index 4a42e18..2448fe7 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -436,13 +436,46 @@
}
}
-DisplayError DisplayPrimary::SetDppsFeature(uint32_t object_type,
- uint32_t feature_id, uint64_t value) {
- return hw_intf_->SetDppsFeature(object_type, feature_id, value);
-}
+DisplayError DisplayPrimary::DppsProcessOps(enum DppsOps op, void *payload, size_t size) {
+ DisplayError error = kErrorNone;
+ uint32_t pending;
+ bool enable = false;
-DisplayError DisplayPrimary::GetDppsFeatureInfo(void *info) {
- return hw_intf_->GetDppsFeatureInfo(info);
+ switch (op) {
+ case kDppsSetFeature:
+ if (!payload) {
+ DLOGE("Invalid payload parameter for op %d", op);
+ error = kErrorParameters;
+ break;
+ }
+ error = hw_intf_->SetDppsFeature(payload, size);
+ break;
+ case kDppsGetFeatureInfo:
+ if (!payload) {
+ DLOGE("Invalid payload parameter for op %d", op);
+ error = kErrorParameters;
+ break;
+ }
+ error = hw_intf_->GetDppsFeatureInfo(payload, size);
+ break;
+ case kDppsScreenRefresh:
+ event_handler_->Refresh();
+ break;
+ case kDppsPartialUpdate:
+ if (!payload) {
+ DLOGE("Invalid payload parameter for op %d", op);
+ error = kErrorParameters;
+ break;
+ }
+ enable = *((bool *)payload);
+ ControlPartialUpdate(enable, &pending);
+ break;
+ default:
+ DLOGE("Invalid input op %d", op);
+ error = kErrorParameters;
+ break;
+ }
+ return error;
}
void DppsInfo::Init(DppsPropIntf* intf) {
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index fcb2f19..541504b 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -81,9 +81,7 @@
virtual void HwRecovery(const HWRecoveryEvent sdm_event_code);
// Implement the DppsPropIntf
- virtual DisplayError SetDppsFeature(uint32_t object_type,
- uint32_t feature_id, uint64_t value);
- virtual DisplayError GetDppsFeatureInfo(void *info);
+ virtual DisplayError DppsProcessOps(enum DppsOps op, void *payload, size_t size);
private:
bool NeedsAVREnable();
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index f684394..51ba46a 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -105,9 +105,8 @@
virtual void InitializeConfigs();
virtual DisplayError DumpDebugData();
virtual void PopulateHWPanelInfo();
- virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
- uint64_t value) { return kErrorNotSupported; }
- virtual DisplayError GetDppsFeatureInfo(void *info) { return kErrorNotSupported; }
+ virtual DisplayError SetDppsFeature(void *payload, size_t size) { return kErrorNotSupported; }
+ virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) { return kErrorNotSupported; }
virtual DisplayError HandleSecureEvent(SecureEvent secure_event) { return kErrorNotSupported; }
enum {
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index df1149c..6420c13 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -37,6 +37,7 @@
using sde_drm::DRMDisplayType;
using sde_drm::DRMOps;
using sde_drm::DRMPowerMode;
+using sde_drm::DppsFeaturePayload;
using sde_drm::DRMDppsFeatureInfo;
using sde_drm::DRMSecureMode;
using sde_drm::DRMCWbCaptureMode;
@@ -143,10 +144,19 @@
return kErrorNone;
}
-DisplayError HWPeripheralDRM::SetDppsFeature(uint32_t object_type,
- uint32_t feature_id, uint64_t value) {
- uint32_t obj_id;
+DisplayError HWPeripheralDRM::SetDppsFeature(void *payload, size_t size) {
+ uint32_t obj_id = 0, object_type = 0, feature_id = 0;
+ uint64_t value = 0;
+ if (size != sizeof(DppsFeaturePayload)) {
+ DLOGE("invalid payload size %d, expected %d", size, sizeof(DppsFeaturePayload));
+ return kErrorParameters;
+ }
+
+ DppsFeaturePayload *feature_payload = reinterpret_cast<DppsFeaturePayload *>(payload);
+ object_type = feature_payload->object_type;
+ feature_id = feature_payload->feature_id;
+ value = feature_payload->value;
if (object_type == DRM_MODE_OBJECT_CRTC) {
obj_id = token_.crtc_id;
} else if (object_type == DRM_MODE_OBJECT_CONNECTOR) {
@@ -160,8 +170,12 @@
return kErrorNone;
}
-DisplayError HWPeripheralDRM::GetDppsFeatureInfo(void *info) {
- DRMDppsFeatureInfo *feature_info = reinterpret_cast<DRMDppsFeatureInfo *>(info);
+DisplayError HWPeripheralDRM::GetDppsFeatureInfo(void *payload, size_t size) {
+ if (size != sizeof(DRMDppsFeatureInfo)) {
+ DLOGE("invalid payload size %d, expected %d", size, sizeof(DRMDppsFeatureInfo));
+ return kErrorParameters;
+ }
+ DRMDppsFeatureInfo *feature_info = reinterpret_cast<DRMDppsFeatureInfo *>(payload);
drm_mgr_intf_->GetDppsFeatureInfo(feature_info);
return kErrorNone;
}
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.h b/sdm/libs/core/drm/hw_peripheral_drm.h
index f93d405..86af571 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.h
+++ b/sdm/libs/core/drm/hw_peripheral_drm.h
@@ -52,9 +52,8 @@
virtual DisplayError Validate(HWLayers *hw_layers);
virtual DisplayError Commit(HWLayers *hw_layers);
virtual DisplayError Flush();
- virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
- uint64_t value);
- virtual DisplayError GetDppsFeatureInfo(void *info);
+ virtual DisplayError SetDppsFeature(void *payload, size_t size);
+ virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size);
virtual DisplayError HandleSecureEvent(SecureEvent secure_event);
private:
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index d2a813f..7dd7f7a 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -98,9 +98,8 @@
virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes);
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
virtual DisplayError DumpDebugData();
- virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
- uint64_t value) { return kErrorNotSupported; }
- virtual DisplayError GetDppsFeatureInfo(void *info) { return kErrorNotSupported; }
+ virtual DisplayError SetDppsFeature(void *payload, size_t size) { return kErrorNotSupported; }
+ virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) { return kErrorNotSupported; }
virtual DisplayError DumpDebugData(DisplayType type) { return kErrorNone; }
virtual DisplayError HandleSecureEvent(SecureEvent secure_event) { return kErrorNotSupported; }
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 884c2c6..3cc483b 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -114,9 +114,8 @@
virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes) = 0;
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes) = 0;
virtual DisplayError DumpDebugData() = 0;
- virtual DisplayError SetDppsFeature(uint32_t object_type,
- uint32_t feature_id, uint64_t value) = 0;
- virtual DisplayError GetDppsFeatureInfo(void *info) = 0;
+ virtual DisplayError SetDppsFeature(void *payload, size_t size) = 0;
+ virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) = 0;
virtual DisplayError HandleSecureEvent(SecureEvent secure_event) = 0;
protected: