summaryrefslogtreecommitdiffstats
path: root/sdm/libs/core
diff options
context:
space:
mode:
Diffstat (limited to 'sdm/libs/core')
-rw-r--r--sdm/libs/core/display_hdmi.h1
-rw-r--r--sdm/libs/core/display_primary.cpp6
-rw-r--r--sdm/libs/core/display_primary.h1
-rw-r--r--sdm/libs/core/display_virtual.h1
-rw-r--r--sdm/libs/core/drm/hw_device_drm.h1
-rw-r--r--sdm/libs/core/drm/hw_peripheral_drm.cpp16
-rw-r--r--sdm/libs/core/drm/hw_peripheral_drm.h1
-rw-r--r--sdm/libs/core/fb/hw_device.h1
-rw-r--r--sdm/libs/core/hw_interface.h1
9 files changed, 26 insertions, 3 deletions
diff --git a/sdm/libs/core/display_hdmi.h b/sdm/libs/core/display_hdmi.h
index 64aa6c7c..cf480bff 100644
--- a/sdm/libs/core/display_hdmi.h
+++ b/sdm/libs/core/display_hdmi.h
@@ -46,6 +46,7 @@ class DisplayHDMI : public DisplayBase, HWEventHandler {
virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
virtual bool IsUnderscanSupported();
virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
+ virtual DisplayError TeardownConcurrentWriteback(void) { return kErrorNotSupported; }
// Implement the HWEventHandlers
virtual DisplayError VSync(int64_t timestamp);
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index 4326d8ea..14d2e89b 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -255,6 +255,12 @@ DisplayError DisplayPrimary::GetRefreshRateRange(uint32_t *min_refresh_rate,
return error;
}
+DisplayError DisplayPrimary::TeardownConcurrentWriteback(void) {
+ lock_guard<recursive_mutex> obj(recursive_mutex_);
+
+ return hw_intf_->TeardownConcurrentWriteback();
+}
+
DisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate, bool final_rate) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index 60dee5c7..df31daae 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -62,6 +62,7 @@ class DisplayPrimary : public DisplayBase, HWEventHandler {
virtual void IdlePowerCollapse();
virtual void PingPongTimeout();
virtual void PanelDead();
+ virtual DisplayError TeardownConcurrentWriteback(void);
private:
bool NeedsAVREnable();
diff --git a/sdm/libs/core/display_virtual.h b/sdm/libs/core/display_virtual.h
index ca154c44..c06e90db 100644
--- a/sdm/libs/core/display_virtual.h
+++ b/sdm/libs/core/display_virtual.h
@@ -64,6 +64,7 @@ class DisplayVirtual : public DisplayBase {
return kErrorNone;
}
virtual DisplayError GetColorModeCount(uint32_t *mode_count);
+ virtual DisplayError TeardownConcurrentWriteback(void) { return kErrorNotSupported; }
};
} // namespace sdm
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index c4f06c35..aaa46949 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -98,6 +98,7 @@ class HWDeviceDRM : public HWInterface {
virtual DisplayError SetScaleLutConfig(HWScaleLutInfo *lut_info);
virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes);
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
+ virtual DisplayError TeardownConcurrentWriteback(void) { return kErrorNotSupported; }
virtual void InitializeConfigs();
virtual DisplayError DumpDebugData() { return kErrorNone; }
virtual void PopulateHWPanelInfo();
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index 0e0aa9b0..01b0474d 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -172,6 +172,16 @@ void HWPeripheralDRM::SetupConcurrentWriteback(const HWLayersInfo &hw_layer_info
}
}
+DisplayError HWPeripheralDRM::TeardownConcurrentWriteback(void) {
+ if (cwb_config_.enabled) {
+ drm_mgr_intf_->UnregisterDisplay(cwb_config_.token);
+ cwb_config_.enabled = false;
+ registry_.Clear();
+ }
+
+ return kErrorNone;
+}
+
DisplayError HWPeripheralDRM::SetupConcurrentWritebackModes() {
// To setup Concurrent Writeback topology, get the Connector ID of Virtual display
if (drm_mgr_intf_->RegisterDisplay(DRMDisplayType::VIRTUAL, &cwb_config_.token)) {
@@ -243,9 +253,9 @@ void HWPeripheralDRM::PostCommitConcurrentWriteback(LayerBuffer *output_buffer)
// Get Concurrent Writeback fence
int *fence = &output_buffer->release_fence_fd;
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_GET_RETIRE_FENCE, cwb_config_.token.conn_id, fence);
- } else {
- drm_mgr_intf_->UnregisterDisplay(cwb_config_.token);
- cwb_config_.enabled = false;
+ }
+ else {
+ TeardownConcurrentWriteback();
}
}
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.h b/sdm/libs/core/drm/hw_peripheral_drm.h
index 365da42c..9523bd95 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.h
+++ b/sdm/libs/core/drm/hw_peripheral_drm.h
@@ -54,6 +54,7 @@ class HWPeripheralDRM : public HWDeviceDRM {
virtual DisplayError Flush();
virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous);
virtual DisplayError PowerOn(int *release_fence);
+ virtual DisplayError TeardownConcurrentWriteback(void);
private:
void SetDestScalarData(HWLayersInfo hw_layer_info);
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 636baa5b..fce6e18b 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -100,6 +100,7 @@ class HWDevice : public HWInterface {
virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous) {
return kErrorNotSupported;
}
+ virtual DisplayError TeardownConcurrentWriteback(void) { return kErrorNotSupported; }
enum {
kHWEventVSync,
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 143391c2..91eb66e7 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -113,6 +113,7 @@ class HWInterface {
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes) = 0;
virtual DisplayError DumpDebugData() = 0;
virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous) = 0;
+ virtual DisplayError TeardownConcurrentWriteback(void) = 0;
protected:
virtual ~HWInterface() { }