diff options
Diffstat (limited to 'sdm/libs/core')
-rw-r--r-- | sdm/libs/core/display_hdmi.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.cpp | 6 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/display_virtual.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_peripheral_drm.cpp | 16 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_peripheral_drm.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_device.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/hw_interface.h | 1 |
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() { } |