diff options
author | Anthony Koo <Anthony.Koo@amd.com> | 2017-01-12 14:24:11 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 17:09:52 -0400 |
commit | 7a1c37e00a660b380fe258fed54fd5af6735814e (patch) | |
tree | d4059d008711702805bd66c152e3c3acf6c462d3 /drivers/gpu/drm/amd/display/modules/freesync/freesync.c | |
parent | fcd2f4bf8bbe73ac860d1be275a22a54a8d8d385 (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.c | 94 |
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, | |||
205 | bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, | 205 | bool 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, | |||
270 | bool mod_freesync_remove_stream(struct mod_freesync *mod_freesync, | 275 | bool 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, | |||
621 | void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync, | 631 | void 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, | |||
855 | void mod_freesync_notify_mode_change(struct mod_freesync *mod_freesync, | 884 | void 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 | ||