|
@@ -4708,7 +4708,7 @@ void sde_cp_crtc_disable(struct drm_crtc *drm_crtc)
|
|
|
kfree(info);
|
|
|
}
|
|
|
|
|
|
-void sde_cp_clear_state_info(struct drm_crtc_state *state, bool free_mem)
|
|
|
+void sde_cp_clear_state_info(struct drm_crtc_state *state)
|
|
|
{
|
|
|
struct sde_crtc_state *crtc_state;
|
|
|
int i;
|
|
@@ -4722,15 +4722,46 @@ void sde_cp_clear_state_info(struct drm_crtc_state *state, bool free_mem)
|
|
|
}
|
|
|
SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY);
|
|
|
for (i = 0; i < ARRAY_SIZE(crtc_state->cp_range_payload); i++) {
|
|
|
- if (free_mem)
|
|
|
- kfree((void *)crtc_state->cp_range_payload[i].addr);
|
|
|
-
|
|
|
+ kfree((void *)crtc_state->cp_range_payload[i].addr);
|
|
|
crtc_state->cp_range_payload[i].addr = 0;
|
|
|
crtc_state->cp_range_payload[i].len = 0;
|
|
|
}
|
|
|
- memset(&crtc_state->cp_dirty_list, 0,
|
|
|
- sizeof(crtc_state->cp_dirty_list));
|
|
|
- memset(&crtc_state->cp_prop_values, 0,
|
|
|
- sizeof(crtc_state->cp_prop_values));
|
|
|
- crtc_state->cp_prop_cnt = 0;
|
|
|
+}
|
|
|
+
|
|
|
+void sde_cp_duplicate_state_info(struct drm_crtc_state *drm_old_state,
|
|
|
+ struct drm_crtc_state *drm_state)
|
|
|
+{
|
|
|
+ struct sde_crtc_state *old_state, *curr_state;
|
|
|
+ u32 len, i;
|
|
|
+
|
|
|
+ if (!drm_old_state || !drm_state)
|
|
|
+ return;
|
|
|
+
|
|
|
+ old_state = to_sde_crtc_state(drm_old_state);
|
|
|
+ curr_state = to_sde_crtc_state(drm_state);
|
|
|
+ if (!old_state || !curr_state)
|
|
|
+ return;
|
|
|
+
|
|
|
+ SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY);
|
|
|
+ for (i = 0; i < ARRAY_SIZE(old_state->cp_range_payload); i++) {
|
|
|
+ /* heap address copied from old state should be cleared, each state should have
|
|
|
+ * its own heap allocation.
|
|
|
+ */
|
|
|
+ curr_state->cp_range_payload[i].addr = 0;
|
|
|
+ curr_state->cp_range_payload[i].len = 0;
|
|
|
+ if (!old_state->cp_range_payload[i].addr || !old_state->cp_range_payload[i].len)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ len = old_state->cp_range_payload[i].len;
|
|
|
+ curr_state->cp_range_payload[i].addr = (u64)kmalloc(len, GFP_KERNEL);
|
|
|
+ if (!curr_state->cp_range_payload[i].addr) {
|
|
|
+ SDE_EVT32(curr_state->cp_range_payload[i].addr);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ memcpy((u8 *)curr_state->cp_range_payload[i].addr,
|
|
|
+ (u8 *)old_state->cp_range_payload[i].addr, len);
|
|
|
+ curr_state->cp_range_payload[i].len = len;
|
|
|
+ SDE_EVT32(curr_state->cp_range_payload[i].addr,
|
|
|
+ curr_state->cp_range_payload[i].len);
|
|
|
+ }
|
|
|
}
|