aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
diff options
context:
space:
mode:
authorAnthony Koo <Anthony.Koo@amd.com>2017-01-12 14:24:11 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:09:52 -0400
commit7a1c37e00a660b380fe258fed54fd5af6735814e (patch)
treed4059d008711702805bd66c152e3c3acf6c462d3 /drivers/gpu/drm/amd/display/modules/freesync/freesync.c
parentfcd2f4bf8bbe73ac860d1be275a22a54a8d8d385 (diff)
drm/amd/display: Disable Modules at Runtime
Add NULL check in modules Signed-off-by: Anthony Koo <anthony.koo@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync/freesync.c')
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c94
1 files changed, 65 insertions, 29 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 6f4d169f4e4e..e0703c588e47 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -205,11 +205,16 @@ static unsigned int map_index_from_stream(struct core_freesync *core_freesync,
205bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, 205bool mod_freesync_add_stream(struct mod_freesync *mod_freesync,
206 const struct dc_stream *stream, struct mod_freesync_caps *caps) 206 const struct dc_stream *stream, struct mod_freesync_caps *caps)
207{ 207{
208 struct core_freesync *core_freesync = 208 struct core_stream *core_stream = NULL;
209 MOD_FREESYNC_TO_CORE(mod_freesync); 209 struct core_dc *core_dc = NULL;
210 struct core_stream *core_stream = 210 struct core_freesync *core_freesync = NULL;
211 DC_STREAM_TO_CORE(stream); 211
212 struct core_dc *core_dc = DC_TO_CORE(core_freesync->dc); 212 if (mod_freesync == NULL)
213 return false;
214
215 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
216 core_stream = DC_STREAM_TO_CORE(stream);
217 core_dc = DC_TO_CORE(core_freesync->dc);
213 218
214 int persistent_freesync_enable = 0; 219 int persistent_freesync_enable = 0;
215 struct persistent_data_flag flag; 220 struct persistent_data_flag flag;
@@ -270,11 +275,16 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync,
270bool mod_freesync_remove_stream(struct mod_freesync *mod_freesync, 275bool mod_freesync_remove_stream(struct mod_freesync *mod_freesync,
271 const struct dc_stream *stream) 276 const struct dc_stream *stream)
272{ 277{
273 struct core_freesync *core_freesync =
274 MOD_FREESYNC_TO_CORE(mod_freesync);
275
276 int i = 0; 278 int i = 0;
277 unsigned int index = map_index_from_stream(core_freesync, stream); 279 struct core_freesync *core_freesync = NULL;
280 unsigned int index = 0;
281
282 if (mod_freesync == NULL)
283 return false;
284
285 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
286 index = map_index_from_stream(core_freesync, stream);
287
278 dc_stream_release(core_freesync->map[index].stream); 288 dc_stream_release(core_freesync->map[index].stream);
279 core_freesync->map[index].stream = NULL; 289 core_freesync->map[index].stream = NULL;
280 /* To remove this entity, shift everything after down */ 290 /* To remove this entity, shift everything after down */
@@ -621,11 +631,14 @@ static void set_static_ramp_variables(struct core_freesync *core_freesync,
621void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync, 631void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync,
622 const struct dc_stream **streams, int num_streams) 632 const struct dc_stream **streams, int num_streams)
623{ 633{
624 struct core_freesync *core_freesync =
625 MOD_FREESYNC_TO_CORE(mod_freesync);
626
627 unsigned int index, v_total = 0; 634 unsigned int index, v_total = 0;
628 struct freesync_state *state; 635 struct freesync_state *state;
636 struct core_freesync *core_freesync = NULL;
637
638 if (mod_freesync == NULL)
639 return;
640
641 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
629 642
630 if (core_freesync->num_entities == 0) 643 if (core_freesync->num_entities == 0)
631 return; 644 return;
@@ -691,11 +704,15 @@ void mod_freesync_update_state(struct mod_freesync *mod_freesync,
691 const struct dc_stream **streams, int num_streams, 704 const struct dc_stream **streams, int num_streams,
692 struct mod_freesync_params *freesync_params) 705 struct mod_freesync_params *freesync_params)
693{ 706{
694 struct core_freesync *core_freesync =
695 MOD_FREESYNC_TO_CORE(mod_freesync);
696 bool freesync_program_required = false; 707 bool freesync_program_required = false;
697 unsigned int stream_index; 708 unsigned int stream_index;
698 struct freesync_state *state; 709 struct freesync_state *state;
710 struct core_freesync *core_freesync = NULL;
711
712 if (mod_freesync == NULL)
713 return;
714
715 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
699 716
700 if (core_freesync->num_entities == 0) 717 if (core_freesync->num_entities == 0)
701 return; 718 return;
@@ -762,10 +779,14 @@ bool mod_freesync_get_state(struct mod_freesync *mod_freesync,
762 const struct dc_stream *stream, 779 const struct dc_stream *stream,
763 struct mod_freesync_params *freesync_params) 780 struct mod_freesync_params *freesync_params)
764{ 781{
765 struct core_freesync *core_freesync = 782 unsigned int index = NULL;
766 MOD_FREESYNC_TO_CORE(mod_freesync); 783 struct core_freesync *core_freesync = NULL;
767 784
768 unsigned int index = map_index_from_stream(core_freesync, stream); 785 if (mod_freesync == NULL)
786 return false;
787
788 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
789 index = map_index_from_stream(core_freesync, stream);
769 790
770 if (core_freesync->map[index].state.fullscreen) { 791 if (core_freesync->map[index].state.fullscreen) {
771 freesync_params->state = FREESYNC_STATE_FULLSCREEN; 792 freesync_params->state = FREESYNC_STATE_FULLSCREEN;
@@ -794,13 +815,17 @@ bool mod_freesync_set_user_enable(struct mod_freesync *mod_freesync,
794 const struct dc_stream **streams, int num_streams, 815 const struct dc_stream **streams, int num_streams,
795 struct mod_freesync_user_enable *user_enable) 816 struct mod_freesync_user_enable *user_enable)
796{ 817{
797 struct core_freesync *core_freesync =
798 MOD_FREESYNC_TO_CORE(mod_freesync);
799 struct core_dc *core_dc = DC_TO_CORE(core_freesync->dc);
800
801 unsigned int stream_index, map_index; 818 unsigned int stream_index, map_index;
802 int persistent_data = 0; 819 int persistent_data = 0;
803 struct persistent_data_flag flag; 820 struct persistent_data_flag flag;
821 struct core_dc *core_dc = NULL;
822 struct core_freesync *core_freesync = NULL;
823
824 if (mod_freesync == NULL)
825 return false;
826
827 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
828 core_dc = DC_TO_CORE(core_freesync->dc);
804 829
805 flag.save_per_edid = true; 830 flag.save_per_edid = true;
806 flag.save_per_link = false; 831 flag.save_per_link = false;
@@ -842,10 +867,14 @@ bool mod_freesync_get_user_enable(struct mod_freesync *mod_freesync,
842 const struct dc_stream *stream, 867 const struct dc_stream *stream,
843 struct mod_freesync_user_enable *user_enable) 868 struct mod_freesync_user_enable *user_enable)
844{ 869{
845 struct core_freesync *core_freesync = 870 unsigned int index = 0;
846 MOD_FREESYNC_TO_CORE(mod_freesync); 871 struct core_freesync *core_freesync = NULL;
847 872
848 unsigned int index = map_index_from_stream(core_freesync, stream); 873 if (mod_freesync == NULL)
874 return false;
875
876 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
877 index = map_index_from_stream(core_freesync, stream);
849 878
850 *user_enable = core_freesync->map[index].user_enable; 879 *user_enable = core_freesync->map[index].user_enable;
851 880
@@ -855,12 +884,15 @@ bool mod_freesync_get_user_enable(struct mod_freesync *mod_freesync,
855void mod_freesync_notify_mode_change(struct mod_freesync *mod_freesync, 884void mod_freesync_notify_mode_change(struct mod_freesync *mod_freesync,
856 const struct dc_stream **streams, int num_streams) 885 const struct dc_stream **streams, int num_streams)
857{ 886{
858 struct core_freesync *core_freesync =
859 MOD_FREESYNC_TO_CORE(mod_freesync);
860
861 unsigned int stream_index, map_index; 887 unsigned int stream_index, map_index;
862 unsigned min_frame_duration_in_ns, max_frame_duration_in_ns; 888 unsigned min_frame_duration_in_ns, max_frame_duration_in_ns;
863 struct freesync_state *state; 889 struct freesync_state *state;
890 struct core_freesync *core_freesync = NULL;
891
892 if (mod_freesync == NULL)
893 return;
894
895 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
864 896
865 for (stream_index = 0; stream_index < num_streams; stream_index++) { 897 for (stream_index = 0; stream_index < num_streams; stream_index++) {
866 898
@@ -1121,8 +1153,12 @@ void mod_freesync_pre_update_plane_addresses(struct mod_freesync *mod_freesync,
1121 unsigned int curr_time_stamp_in_us) 1153 unsigned int curr_time_stamp_in_us)
1122{ 1154{
1123 unsigned int stream_index, map_index, last_render_time_in_us = 0; 1155 unsigned int stream_index, map_index, last_render_time_in_us = 0;
1124 struct core_freesync *core_freesync = 1156 struct core_freesync *core_freesync = NULL;
1125 MOD_FREESYNC_TO_CORE(mod_freesync); 1157
1158 if (mod_freesync == NULL)
1159 return;
1160
1161 core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
1126 1162
1127 for (stream_index = 0; stream_index < num_streams; stream_index++) { 1163 for (stream_index = 0; stream_index < num_streams; stream_index++) {
1128 1164