Merge "sdm: Disable rotator for non secure layer at the end of secure display"
diff --git a/sdm/include/private/resource_interface.h b/sdm/include/private/resource_interface.h
index 5bb2c4b..14f156b 100644
--- a/sdm/include/private/resource_interface.h
+++ b/sdm/include/private/resource_interface.h
@@ -35,6 +35,7 @@
enum ResourceCmd {
kCmdResetLUT,
kCmdGetDefaultClk,
+ kCmdDisableRotatorOneFrame,
kCmdMax,
};
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index 838de0c..9a9e75b 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -596,4 +596,17 @@
return kErrorNone;
}
+void CompManager::HandleSecureEvent(Handle display_ctx, SecureEvent secure_event) {
+ DisplayCompositionContext *display_comp_ctx =
+ reinterpret_cast<DisplayCompositionContext *>(display_ctx);
+ // Disable rotator for non secure layers at the end of secure display session, because scm call
+ // has been made to end secure display session during the display commit. Since then access to
+ // non secure memory is unavailable. So this results in smmu page fault when rotator tries to
+ // access the non secure memory.
+ if (secure_event == kSecureDisplayEnd) {
+ resource_intf_->Perform(ResourceInterface::kCmdDisableRotatorOneFrame,
+ display_comp_ctx->display_resource_ctx);
+ }
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 5814a67..7a5f77c 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -81,6 +81,7 @@
DisplayError SetColorModesInfo(Handle display_ctx,
const std::vector<PrimariesTransfer> &colormodes_cs);
DisplayError SetBlendSpace(Handle display_ctx, const PrimariesTransfer &blend_space);
+ void HandleSecureEvent(Handle display_ctx, SecureEvent secure_event);
private:
static const int kMaxThermalLevel = 3;
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index f93ac18..e4882b8 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -561,7 +561,13 @@
}
DisplayError DisplayBuiltIn::HandleSecureEvent(SecureEvent secure_event) {
- return hw_intf_->HandleSecureEvent(secure_event);
+ DisplayError err = hw_intf_->HandleSecureEvent(secure_event);
+ if (err != kErrorNone) {
+ return err;
+ }
+ comp_manager_->HandleSecureEvent(display_comp_ctx_, secure_event);
+
+ return kErrorNone;
}
DisplayError DisplayBuiltIn::SetQSyncMode(QSyncMode qsync_mode) {
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index 29a4660..f35b11e 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -225,6 +225,7 @@
}
}
secure_display_active_ = false;
+ synchronous_commit_ = true;
}
break;