aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>2017-05-17 16:05:40 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 18:07:17 -0400
commit430ef426bc43b59a7444c08d664e24a7cf89710e (patch)
tree1e820da524f9e5fc49906c79e46ed72eb80324e6
parentccaf31ec714b596d1edb92b1ed4ccc4abf1f645c (diff)
drm/amd/display: make dc_get_validate_context re-entrant
Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c44
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_resource.c30
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c22
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c22
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c27
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c22
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c24
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/core_types.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/resource.h9
10 files changed, 92 insertions, 114 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index b5ba822df55e..0aafcc088284 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -653,40 +653,6 @@ void dc_destroy(struct dc **dc)
653 *dc = NULL; 653 *dc = NULL;
654} 654}
655 655
656static bool is_validation_required(
657 const struct core_dc *dc,
658 const struct dc_validation_set set[],
659 int set_count)
660{
661 const struct validate_context *context = dc->current_context;
662 int i, j;
663
664 if (context->stream_count != set_count)
665 return true;
666
667 for (i = 0; i < set_count; i++) {
668
669 if (set[i].surface_count != context->stream_status[i].surface_count)
670 return true;
671 if (!is_stream_unchanged(DC_STREAM_TO_CORE(set[i].stream), context->streams[i]))
672 return true;
673
674 for (j = 0; j < set[i].surface_count; j++) {
675 struct dc_surface temp_surf = { 0 };
676
677 temp_surf = *context->stream_status[i].surfaces[j];
678 temp_surf.clip_rect = set[i].surfaces[j]->clip_rect;
679 temp_surf.dst_rect.x = set[i].surfaces[j]->dst_rect.x;
680 temp_surf.dst_rect.y = set[i].surfaces[j]->dst_rect.y;
681
682 if (memcmp(&temp_surf, set[i].surfaces[j], sizeof(temp_surf)) != 0)
683 return true;
684 }
685 }
686
687 return false;
688}
689
690struct validate_context *dc_get_validate_context( 656struct validate_context *dc_get_validate_context(
691 const struct dc *dc, 657 const struct dc *dc,
692 const struct dc_validation_set set[], 658 const struct dc_validation_set set[],
@@ -700,13 +666,8 @@ struct validate_context *dc_get_validate_context(
700 if(context == NULL) 666 if(context == NULL)
701 goto context_alloc_fail; 667 goto context_alloc_fail;
702 668
703 if (!is_validation_required(core_dc, set, set_count)) {
704 dc_resource_validate_ctx_copy_construct(core_dc->current_context, context);
705 return context;
706 }
707
708 result = core_dc->res_pool->funcs->validate_with_context( 669 result = core_dc->res_pool->funcs->validate_with_context(
709 core_dc, set, set_count, context); 670 core_dc, set, set_count, context, NULL);
710 671
711context_alloc_fail: 672context_alloc_fail:
712 if (result != DC_OK) { 673 if (result != DC_OK) {
@@ -903,7 +864,8 @@ bool dc_commit_streams(
903 if (context == NULL) 864 if (context == NULL)
904 goto context_alloc_fail; 865 goto context_alloc_fail;
905 866
906 result = core_dc->res_pool->funcs->validate_with_context(core_dc, set, stream_count, context); 867 result = core_dc->res_pool->funcs->validate_with_context(
868 core_dc, set, stream_count, context, core_dc->current_context);
907 if (result != DC_OK){ 869 if (result != DC_OK){
908 dm_logger_write(core_dc->ctx->logger, LOG_ERROR, 870 dm_logger_write(core_dc->ctx->logger, LOG_ERROR,
909 "%s: Context validation failed! dc_status:%d\n", 871 "%s: Context validation failed! dc_status:%d\n",
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 7ca03d1ad163..ec5045734378 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1148,7 +1148,7 @@ bool resource_validate_attach_surfaces(
1148 int i, j; 1148 int i, j;
1149 1149
1150 for (i = 0; i < set_count; i++) { 1150 for (i = 0; i < set_count; i++) {
1151 for (j = 0; j < old_context->stream_count; j++) 1151 for (j = 0; old_context && j < old_context->stream_count; j++)
1152 if (is_stream_unchanged( 1152 if (is_stream_unchanged(
1153 old_context->streams[j], 1153 old_context->streams[j],
1154 context->streams[i])) { 1154 context->streams[i])) {
@@ -1387,9 +1387,7 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
1387 return normalized_pix_clk; 1387 return normalized_pix_clk;
1388} 1388}
1389 1389
1390static void calculate_phy_pix_clks( 1390static void calculate_phy_pix_clks(struct validate_context *context)
1391 const struct core_dc *dc,
1392 struct validate_context *context)
1393{ 1391{
1394 int i; 1392 int i;
1395 1393
@@ -1410,21 +1408,22 @@ static void calculate_phy_pix_clks(
1410 1408
1411enum dc_status resource_map_pool_resources( 1409enum dc_status resource_map_pool_resources(
1412 const struct core_dc *dc, 1410 const struct core_dc *dc,
1413 struct validate_context *context) 1411 struct validate_context *context,
1412 struct validate_context *old_context)
1414{ 1413{
1415 const struct resource_pool *pool = dc->res_pool; 1414 const struct resource_pool *pool = dc->res_pool;
1416 int i, j; 1415 int i, j;
1417 1416
1418 calculate_phy_pix_clks(dc, context); 1417 calculate_phy_pix_clks(context);
1419 1418
1420 for (i = 0; i < context->stream_count; i++) { 1419 for (i = 0; old_context && i < context->stream_count; i++) {
1421 struct core_stream *stream = context->streams[i]; 1420 struct core_stream *stream = context->streams[i];
1422 1421
1423 if (!resource_is_stream_unchanged(dc->current_context, stream)) { 1422 if (!resource_is_stream_unchanged(old_context, stream)) {
1424 if (stream != NULL && dc->current_context->streams[i] != NULL) { 1423 if (stream != NULL && old_context->streams[i] != NULL) {
1425 stream->bit_depth_params = 1424 stream->bit_depth_params =
1426 dc->current_context->streams[i]->bit_depth_params; 1425 old_context->streams[i]->bit_depth_params;
1427 stream->clamping = dc->current_context->streams[i]->clamping; 1426 stream->clamping = old_context->streams[i]->clamping;
1428 continue; 1427 continue;
1429 } 1428 }
1430 } 1429 }
@@ -1434,7 +1433,7 @@ enum dc_status resource_map_pool_resources(
1434 struct pipe_ctx *pipe_ctx = 1433 struct pipe_ctx *pipe_ctx =
1435 &context->res_ctx.pipe_ctx[j]; 1434 &context->res_ctx.pipe_ctx[j];
1436 const struct pipe_ctx *old_pipe_ctx = 1435 const struct pipe_ctx *old_pipe_ctx =
1437 &dc->current_context->res_ctx.pipe_ctx[j]; 1436 &old_context->res_ctx.pipe_ctx[j];
1438 1437
1439 if (!are_stream_backends_same(old_pipe_ctx->stream, stream)) 1438 if (!are_stream_backends_same(old_pipe_ctx->stream, stream))
1440 continue; 1439 continue;
@@ -1475,7 +1474,7 @@ enum dc_status resource_map_pool_resources(
1475 struct pipe_ctx *pipe_ctx = NULL; 1474 struct pipe_ctx *pipe_ctx = NULL;
1476 int pipe_idx = -1; 1475 int pipe_idx = -1;
1477 1476
1478 if (resource_is_stream_unchanged(dc->current_context, stream)) 1477 if (old_context && resource_is_stream_unchanged(old_context, stream))
1479 continue; 1478 continue;
1480 /* acquire new resources */ 1479 /* acquire new resources */
1481 pipe_idx = acquire_first_free_pipe( 1480 pipe_idx = acquire_first_free_pipe(
@@ -2203,7 +2202,8 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)
2203 2202
2204enum dc_status resource_map_clock_resources( 2203enum dc_status resource_map_clock_resources(
2205 const struct core_dc *dc, 2204 const struct core_dc *dc,
2206 struct validate_context *context) 2205 struct validate_context *context,
2206 struct validate_context *old_context)
2207{ 2207{
2208 int i, j; 2208 int i, j;
2209 const struct resource_pool *pool = dc->res_pool; 2209 const struct resource_pool *pool = dc->res_pool;
@@ -2212,7 +2212,7 @@ enum dc_status resource_map_clock_resources(
2212 for (i = 0; i < context->stream_count; i++) { 2212 for (i = 0; i < context->stream_count; i++) {
2213 const struct core_stream *stream = context->streams[i]; 2213 const struct core_stream *stream = context->streams[i];
2214 2214
2215 if (resource_is_stream_unchanged(dc->current_context, stream)) 2215 if (old_context && resource_is_stream_unchanged(old_context, stream))
2216 continue; 2216 continue;
2217 2217
2218 for (j = 0; j < MAX_PIPES; j++) { 2218 for (j = 0; j < MAX_PIPES; j++) {
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
index 8f1fe95dd76c..716f664f40ce 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
@@ -653,7 +653,8 @@ static void destruct(struct dce110_resource_pool *pool)
653 653
654static enum dc_status validate_mapped_resource( 654static enum dc_status validate_mapped_resource(
655 const struct core_dc *dc, 655 const struct core_dc *dc,
656 struct validate_context *context) 656 struct validate_context *context,
657 struct validate_context *old_context)
657{ 658{
658 enum dc_status status = DC_OK; 659 enum dc_status status = DC_OK;
659 uint8_t i, j; 660 uint8_t i, j;
@@ -662,7 +663,7 @@ static enum dc_status validate_mapped_resource(
662 struct core_stream *stream = context->streams[i]; 663 struct core_stream *stream = context->streams[i];
663 struct core_link *link = stream->sink->link; 664 struct core_link *link = stream->sink->link;
664 665
665 if (resource_is_stream_unchanged(dc->current_context, stream)) 666 if (old_context && resource_is_stream_unchanged(old_context, stream))
666 continue; 667 continue;
667 668
668 for (j = 0; j < MAX_PIPES; j++) { 669 for (j = 0; j < MAX_PIPES; j++) {
@@ -740,7 +741,8 @@ enum dc_status dce100_validate_with_context(
740 const struct core_dc *dc, 741 const struct core_dc *dc,
741 const struct dc_validation_set set[], 742 const struct dc_validation_set set[],
742 int set_count, 743 int set_count,
743 struct validate_context *context) 744 struct validate_context *context,
745 struct validate_context *old_context)
744{ 746{
745 struct dc_context *dc_ctx = dc->ctx; 747 struct dc_context *dc_ctx = dc->ctx;
746 enum dc_status result = DC_ERROR_UNEXPECTED; 748 enum dc_status result = DC_ERROR_UNEXPECTED;
@@ -755,19 +757,19 @@ enum dc_status dce100_validate_with_context(
755 context->stream_count++; 757 context->stream_count++;
756 } 758 }
757 759
758 result = resource_map_pool_resources(dc, context); 760 result = resource_map_pool_resources(dc, context, old_context);
759 761
760 if (result == DC_OK) 762 if (result == DC_OK)
761 result = resource_map_clock_resources(dc, context); 763 result = resource_map_clock_resources(dc, context, old_context);
762 764
763 if (!resource_validate_attach_surfaces(set, set_count, 765 if (!resource_validate_attach_surfaces(set, set_count,
764 dc->current_context, context, dc->res_pool)) { 766 old_context, context, dc->res_pool)) {
765 DC_ERROR("Failed to attach surface to stream!\n"); 767 DC_ERROR("Failed to attach surface to stream!\n");
766 return DC_FAIL_ATTACH_SURFACES; 768 return DC_FAIL_ATTACH_SURFACES;
767 } 769 }
768 770
769 if (result == DC_OK) 771 if (result == DC_OK)
770 result = validate_mapped_resource(dc, context); 772 result = validate_mapped_resource(dc, context, old_context);
771 773
772 if (result == DC_OK) 774 if (result == DC_OK)
773 result = resource_build_scaling_params_for_context(dc, context); 775 result = resource_build_scaling_params_for_context(dc, context);
@@ -790,13 +792,13 @@ enum dc_status dce100_validate_guaranteed(
790 dc_stream_retain(&context->streams[0]->public); 792 dc_stream_retain(&context->streams[0]->public);
791 context->stream_count++; 793 context->stream_count++;
792 794
793 result = resource_map_pool_resources(dc, context); 795 result = resource_map_pool_resources(dc, context, NULL);
794 796
795 if (result == DC_OK) 797 if (result == DC_OK)
796 result = resource_map_clock_resources(dc, context); 798 result = resource_map_clock_resources(dc, context, NULL);
797 799
798 if (result == DC_OK) 800 if (result == DC_OK)
799 result = validate_mapped_resource(dc, context); 801 result = validate_mapped_resource(dc, context, NULL);
800 802
801 if (result == DC_OK) { 803 if (result == DC_OK) {
802 validate_guaranteed_copy_streams( 804 validate_guaranteed_copy_streams(
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
index 3ed5b9445535..45759b9f15e5 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
@@ -769,7 +769,8 @@ static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigne
769 769
770static enum dc_status validate_mapped_resource( 770static enum dc_status validate_mapped_resource(
771 const struct core_dc *dc, 771 const struct core_dc *dc,
772 struct validate_context *context) 772 struct validate_context *context,
773 struct validate_context *old_context)
773{ 774{
774 enum dc_status status = DC_OK; 775 enum dc_status status = DC_OK;
775 uint8_t i, j; 776 uint8_t i, j;
@@ -778,7 +779,7 @@ static enum dc_status validate_mapped_resource(
778 struct core_stream *stream = context->streams[i]; 779 struct core_stream *stream = context->streams[i];
779 struct core_link *link = stream->sink->link; 780 struct core_link *link = stream->sink->link;
780 781
781 if (resource_is_stream_unchanged(dc->current_context, stream)) 782 if (old_context && resource_is_stream_unchanged(old_context, stream))
782 continue; 783 continue;
783 784
784 for (j = 0; j < MAX_PIPES; j++) { 785 for (j = 0; j < MAX_PIPES; j++) {
@@ -943,7 +944,8 @@ enum dc_status dce110_validate_with_context(
943 const struct core_dc *dc, 944 const struct core_dc *dc,
944 const struct dc_validation_set set[], 945 const struct dc_validation_set set[],
945 int set_count, 946 int set_count,
946 struct validate_context *context) 947 struct validate_context *context,
948 struct validate_context *old_context)
947{ 949{
948 struct dc_context *dc_ctx = dc->ctx; 950 struct dc_context *dc_ctx = dc->ctx;
949 enum dc_status result = DC_ERROR_UNEXPECTED; 951 enum dc_status result = DC_ERROR_UNEXPECTED;
@@ -958,19 +960,19 @@ enum dc_status dce110_validate_with_context(
958 context->stream_count++; 960 context->stream_count++;
959 } 961 }
960 962
961 result = resource_map_pool_resources(dc, context); 963 result = resource_map_pool_resources(dc, context, old_context);
962 964
963 if (result == DC_OK) 965 if (result == DC_OK)
964 result = resource_map_clock_resources(dc, context); 966 result = resource_map_clock_resources(dc, context, old_context);
965 967
966 if (!resource_validate_attach_surfaces(set, set_count, 968 if (!resource_validate_attach_surfaces(set, set_count,
967 dc->current_context, context, dc->res_pool)) { 969 old_context, context, dc->res_pool)) {
968 DC_ERROR("Failed to attach surface to stream!\n"); 970 DC_ERROR("Failed to attach surface to stream!\n");
969 return DC_FAIL_ATTACH_SURFACES; 971 return DC_FAIL_ATTACH_SURFACES;
970 } 972 }
971 973
972 if (result == DC_OK) 974 if (result == DC_OK)
973 result = validate_mapped_resource(dc, context); 975 result = validate_mapped_resource(dc, context, old_context);
974 976
975 if (result == DC_OK) 977 if (result == DC_OK)
976 result = resource_build_scaling_params_for_context(dc, context); 978 result = resource_build_scaling_params_for_context(dc, context);
@@ -993,13 +995,13 @@ enum dc_status dce110_validate_guaranteed(
993 dc_stream_retain(&context->streams[0]->public); 995 dc_stream_retain(&context->streams[0]->public);
994 context->stream_count++; 996 context->stream_count++;
995 997
996 result = resource_map_pool_resources(dc, context); 998 result = resource_map_pool_resources(dc, context, NULL);
997 999
998 if (result == DC_OK) 1000 if (result == DC_OK)
999 result = resource_map_clock_resources(dc, context); 1001 result = resource_map_clock_resources(dc, context, NULL);
1000 1002
1001 if (result == DC_OK) 1003 if (result == DC_OK)
1002 result = validate_mapped_resource(dc, context); 1004 result = validate_mapped_resource(dc, context, NULL);
1003 1005
1004 if (result == DC_OK) { 1006 if (result == DC_OK) {
1005 validate_guaranteed_copy_streams( 1007 validate_guaranteed_copy_streams(
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
index f405d6eecaa5..80f067343a91 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
@@ -722,7 +722,8 @@ static struct clock_source *find_matching_pll(
722 722
723static enum dc_status validate_mapped_resource( 723static enum dc_status validate_mapped_resource(
724 const struct core_dc *dc, 724 const struct core_dc *dc,
725 struct validate_context *context) 725 struct validate_context *context,
726 struct validate_context *old_context)
726{ 727{
727 enum dc_status status = DC_OK; 728 enum dc_status status = DC_OK;
728 uint8_t i, j; 729 uint8_t i, j;
@@ -731,7 +732,7 @@ static enum dc_status validate_mapped_resource(
731 struct core_stream *stream = context->streams[i]; 732 struct core_stream *stream = context->streams[i];
732 struct core_link *link = stream->sink->link; 733 struct core_link *link = stream->sink->link;
733 734
734 if (resource_is_stream_unchanged(dc->current_context, stream)) 735 if (old_context && resource_is_stream_unchanged(old_context, stream))
735 continue; 736 continue;
736 737
737 for (j = 0; j < MAX_PIPES; j++) { 738 for (j = 0; j < MAX_PIPES; j++) {
@@ -854,7 +855,8 @@ bool dce112_validate_bandwidth(
854 855
855enum dc_status resource_map_phy_clock_resources( 856enum dc_status resource_map_phy_clock_resources(
856 const struct core_dc *dc, 857 const struct core_dc *dc,
857 struct validate_context *context) 858 struct validate_context *context,
859 struct validate_context *old_context)
858{ 860{
859 uint8_t i, j; 861 uint8_t i, j;
860 862
@@ -862,7 +864,7 @@ enum dc_status resource_map_phy_clock_resources(
862 for (i = 0; i < context->stream_count; i++) { 864 for (i = 0; i < context->stream_count; i++) {
863 struct core_stream *stream = context->streams[i]; 865 struct core_stream *stream = context->streams[i];
864 866
865 if (resource_is_stream_unchanged(dc->current_context, stream)) 867 if (old_context && resource_is_stream_unchanged(old_context, stream))
866 continue; 868 continue;
867 869
868 for (j = 0; j < MAX_PIPES; j++) { 870 for (j = 0; j < MAX_PIPES; j++) {
@@ -922,7 +924,8 @@ enum dc_status dce112_validate_with_context(
922 const struct core_dc *dc, 924 const struct core_dc *dc,
923 const struct dc_validation_set set[], 925 const struct dc_validation_set set[],
924 int set_count, 926 int set_count,
925 struct validate_context *context) 927 struct validate_context *context,
928 struct validate_context *old_context)
926{ 929{
927 struct dc_context *dc_ctx = dc->ctx; 930 struct dc_context *dc_ctx = dc->ctx;
928 enum dc_status result = DC_ERROR_UNEXPECTED; 931 enum dc_status result = DC_ERROR_UNEXPECTED;
@@ -937,19 +940,19 @@ enum dc_status dce112_validate_with_context(
937 context->stream_count++; 940 context->stream_count++;
938 } 941 }
939 942
940 result = resource_map_pool_resources(dc, context); 943 result = resource_map_pool_resources(dc, context, old_context);
941 944
942 if (result == DC_OK) 945 if (result == DC_OK)
943 result = resource_map_phy_clock_resources(dc, context); 946 result = resource_map_phy_clock_resources(dc, context, old_context);
944 947
945 if (!resource_validate_attach_surfaces(set, set_count, 948 if (!resource_validate_attach_surfaces(set, set_count,
946 dc->current_context, context, dc->res_pool)) { 949 old_context, context, dc->res_pool)) {
947 DC_ERROR("Failed to attach surface to stream!\n"); 950 DC_ERROR("Failed to attach surface to stream!\n");
948 return DC_FAIL_ATTACH_SURFACES; 951 return DC_FAIL_ATTACH_SURFACES;
949 } 952 }
950 953
951 if (result == DC_OK) 954 if (result == DC_OK)
952 result = validate_mapped_resource(dc, context); 955 result = validate_mapped_resource(dc, context, old_context);
953 956
954 if (result == DC_OK) 957 if (result == DC_OK)
955 result = resource_build_scaling_params_for_context(dc, context); 958 result = resource_build_scaling_params_for_context(dc, context);
@@ -972,13 +975,13 @@ enum dc_status dce112_validate_guaranteed(
972 dc_stream_retain(&context->streams[0]->public); 975 dc_stream_retain(&context->streams[0]->public);
973 context->stream_count++; 976 context->stream_count++;
974 977
975 result = resource_map_pool_resources(dc, context); 978 result = resource_map_pool_resources(dc, context, NULL);
976 979
977 if (result == DC_OK) 980 if (result == DC_OK)
978 result = resource_map_phy_clock_resources(dc, context); 981 result = resource_map_phy_clock_resources(dc, context, NULL);
979 982
980 if (result == DC_OK) 983 if (result == DC_OK)
981 result = validate_mapped_resource(dc, context); 984 result = validate_mapped_resource(dc, context, NULL);
982 985
983 if (result == DC_OK) { 986 if (result == DC_OK) {
984 validate_guaranteed_copy_streams( 987 validate_guaranteed_copy_streams(
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
index dc842aace766..c6c0bbac5335 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
@@ -39,7 +39,8 @@ enum dc_status dce112_validate_with_context(
39 const struct core_dc *dc, 39 const struct core_dc *dc,
40 const struct dc_validation_set set[], 40 const struct dc_validation_set set[],
41 int set_count, 41 int set_count,
42 struct validate_context *context); 42 struct validate_context *context,
43 struct validate_context *old_context);
43 44
44enum dc_status dce112_validate_guaranteed( 45enum dc_status dce112_validate_guaranteed(
45 const struct core_dc *dc, 46 const struct core_dc *dc,
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
index 095e437ce112..5861b3fdf7d2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
@@ -669,7 +669,8 @@ static void destruct(struct dce110_resource_pool *pool)
669 669
670static enum dc_status validate_mapped_resource( 670static enum dc_status validate_mapped_resource(
671 const struct core_dc *dc, 671 const struct core_dc *dc,
672 struct validate_context *context) 672 struct validate_context *context,
673 struct validate_context *old_context)
673{ 674{
674 enum dc_status status = DC_OK; 675 enum dc_status status = DC_OK;
675 uint8_t i, j; 676 uint8_t i, j;
@@ -678,7 +679,7 @@ static enum dc_status validate_mapped_resource(
678 struct core_stream *stream = context->streams[i]; 679 struct core_stream *stream = context->streams[i];
679 struct core_link *link = stream->sink->link; 680 struct core_link *link = stream->sink->link;
680 681
681 if (resource_is_stream_unchanged(dc->current_context, stream)) 682 if (old_context && resource_is_stream_unchanged(old_context, stream))
682 continue; 683 continue;
683 684
684 for (j = 0; j < MAX_PIPES; j++) { 685 for (j = 0; j < MAX_PIPES; j++) {
@@ -757,7 +758,8 @@ enum dc_status dce80_validate_with_context(
757 const struct core_dc *dc, 758 const struct core_dc *dc,
758 const struct dc_validation_set set[], 759 const struct dc_validation_set set[],
759 int set_count, 760 int set_count,
760 struct validate_context *context) 761 struct validate_context *context,
762 struct validate_context *old_context)
761{ 763{
762 struct dc_context *dc_ctx = dc->ctx; 764 struct dc_context *dc_ctx = dc->ctx;
763 enum dc_status result = DC_ERROR_UNEXPECTED; 765 enum dc_status result = DC_ERROR_UNEXPECTED;
@@ -772,19 +774,19 @@ enum dc_status dce80_validate_with_context(
772 context->stream_count++; 774 context->stream_count++;
773 } 775 }
774 776
775 result = resource_map_pool_resources(dc, context); 777 result = resource_map_pool_resources(dc, context, old_context);
776 778
777 if (result == DC_OK) 779 if (result == DC_OK)
778 result = resource_map_clock_resources(dc, context); 780 result = resource_map_clock_resources(dc, context, old_context);
779 781
780 if (!resource_validate_attach_surfaces(set, set_count, 782 if (!resource_validate_attach_surfaces(set, set_count,
781 dc->current_context, context, dc->res_pool)) { 783 old_context, context, dc->res_pool)) {
782 DC_ERROR("Failed to attach surface to stream!\n"); 784 DC_ERROR("Failed to attach surface to stream!\n");
783 return DC_FAIL_ATTACH_SURFACES; 785 return DC_FAIL_ATTACH_SURFACES;
784 } 786 }
785 787
786 if (result == DC_OK) 788 if (result == DC_OK)
787 result = validate_mapped_resource(dc, context); 789 result = validate_mapped_resource(dc, context, old_context);
788 790
789 if (result == DC_OK) 791 if (result == DC_OK)
790 result = resource_build_scaling_params_for_context(dc, context); 792 result = resource_build_scaling_params_for_context(dc, context);
@@ -806,13 +808,13 @@ enum dc_status dce80_validate_guaranteed(
806 dc_stream_retain(&context->streams[0]->public); 808 dc_stream_retain(&context->streams[0]->public);
807 context->stream_count++; 809 context->stream_count++;
808 810
809 result = resource_map_pool_resources(dc, context); 811 result = resource_map_pool_resources(dc, context, NULL);
810 812
811 if (result == DC_OK) 813 if (result == DC_OK)
812 result = resource_map_clock_resources(dc, context); 814 result = resource_map_clock_resources(dc, context, NULL);
813 815
814 if (result == DC_OK) 816 if (result == DC_OK)
815 result = validate_mapped_resource(dc, context); 817 result = validate_mapped_resource(dc, context, NULL);
816 818
817 if (result == DC_OK) { 819 if (result == DC_OK) {
818 validate_guaranteed_copy_streams( 820 validate_guaranteed_copy_streams(
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
index 7fdc5860857b..94cd7a9b0b19 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
@@ -853,7 +853,8 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
853 853
854static enum dc_status validate_mapped_resource( 854static enum dc_status validate_mapped_resource(
855 const struct core_dc *dc, 855 const struct core_dc *dc,
856 struct validate_context *context) 856 struct validate_context *context,
857 struct validate_context *old_context)
857{ 858{
858 enum dc_status status = DC_OK; 859 enum dc_status status = DC_OK;
859 uint8_t i, j; 860 uint8_t i, j;
@@ -862,8 +863,8 @@ static enum dc_status validate_mapped_resource(
862 struct core_stream *stream = context->streams[i]; 863 struct core_stream *stream = context->streams[i];
863 struct core_link *link = stream->sink->link; 864 struct core_link *link = stream->sink->link;
864 865
865 if (resource_is_stream_unchanged(dc->current_context, stream)) { 866 if (old_context && resource_is_stream_unchanged(old_context, stream)) {
866 if (stream != NULL && dc->current_context->streams[i] != NULL) { 867 if (stream != NULL && old_context->streams[i] != NULL) {
867 /* todo: shouldn't have to copy missing parameter here */ 868 /* todo: shouldn't have to copy missing parameter here */
868 resource_build_bit_depth_reduction_params(stream, 869 resource_build_bit_depth_reduction_params(stream,
869 &stream->bit_depth_params); 870 &stream->bit_depth_params);
@@ -920,7 +921,8 @@ enum dc_status dcn10_validate_with_context(
920 const struct core_dc *dc, 921 const struct core_dc *dc,
921 const struct dc_validation_set set[], 922 const struct dc_validation_set set[],
922 int set_count, 923 int set_count,
923 struct validate_context *context) 924 struct validate_context *context,
925 struct validate_context *old_context)
924{ 926{
925 enum dc_status result = DC_OK; 927 enum dc_status result = DC_OK;
926 int i; 928 int i;
@@ -934,20 +936,20 @@ enum dc_status dcn10_validate_with_context(
934 context->stream_count++; 936 context->stream_count++;
935 } 937 }
936 938
937 result = resource_map_pool_resources(dc, context); 939 result = resource_map_pool_resources(dc, context, old_context);
938 if (result != DC_OK) 940 if (result != DC_OK)
939 return result; 941 return result;
940 942
941 result = resource_map_phy_clock_resources(dc, context); 943 result = resource_map_phy_clock_resources(dc, context, old_context);
942 if (result != DC_OK) 944 if (result != DC_OK)
943 return result; 945 return result;
944 946
945 result = validate_mapped_resource(dc, context); 947 result = validate_mapped_resource(dc, context, old_context);
946 if (result != DC_OK) 948 if (result != DC_OK)
947 return result; 949 return result;
948 950
949 if (!resource_validate_attach_surfaces(set, set_count, 951 if (!resource_validate_attach_surfaces(set, set_count,
950 dc->current_context, context, dc->res_pool)) 952 old_context, context, dc->res_pool))
951 return DC_FAIL_ATTACH_SURFACES; 953 return DC_FAIL_ATTACH_SURFACES;
952 954
953 result = resource_build_scaling_params_for_context(dc, context); 955 result = resource_build_scaling_params_for_context(dc, context);
@@ -971,13 +973,13 @@ enum dc_status dcn10_validate_guaranteed(
971 dc_stream_retain(&context->streams[0]->public); 973 dc_stream_retain(&context->streams[0]->public);
972 context->stream_count++; 974 context->stream_count++;
973 975
974 result = resource_map_pool_resources(dc, context); 976 result = resource_map_pool_resources(dc, context, NULL);
975 977
976 if (result == DC_OK) 978 if (result == DC_OK)
977 result = resource_map_phy_clock_resources(dc, context); 979 result = resource_map_phy_clock_resources(dc, context, NULL);
978 980
979 if (result == DC_OK) 981 if (result == DC_OK)
980 result = validate_mapped_resource(dc, context); 982 result = validate_mapped_resource(dc, context, NULL);
981 983
982 if (result == DC_OK) { 984 if (result == DC_OK) {
983 validate_guaranteed_copy_streams( 985 validate_guaranteed_copy_streams(
diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
index 46bd0318e6be..d8a378dabb43 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
@@ -203,7 +203,8 @@ struct resource_funcs {
203 const struct core_dc *dc, 203 const struct core_dc *dc,
204 const struct dc_validation_set set[], 204 const struct dc_validation_set set[],
205 int set_count, 205 int set_count,
206 struct validate_context *context); 206 struct validate_context *context,
207 struct validate_context *old_context);
207 208
208 enum dc_status (*validate_guaranteed)( 209 enum dc_status (*validate_guaranteed)(
209 const struct core_dc *dc, 210 const struct core_dc *dc,
diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h
index 4e07b9fea669..7cac24d4ae86 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/resource.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h
@@ -80,7 +80,8 @@ void dc_destroy_resource_pool(struct core_dc *dc);
80 80
81enum dc_status resource_map_pool_resources( 81enum dc_status resource_map_pool_resources(
82 const struct core_dc *dc, 82 const struct core_dc *dc,
83 struct validate_context *context); 83 struct validate_context *context,
84 struct validate_context *old_context);
84 85
85bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx); 86bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx);
86 87
@@ -150,11 +151,13 @@ void resource_validate_ctx_update_pointer_after_copy(
150 151
151enum dc_status resource_map_clock_resources( 152enum dc_status resource_map_clock_resources(
152 const struct core_dc *dc, 153 const struct core_dc *dc,
153 struct validate_context *context); 154 struct validate_context *context,
155 struct validate_context *old_context);
154 156
155enum dc_status resource_map_phy_clock_resources( 157enum dc_status resource_map_phy_clock_resources(
156 const struct core_dc *dc, 158 const struct core_dc *dc,
157 struct validate_context *context); 159 struct validate_context *context,
160 struct validate_context *old_context);
158 161
159bool pipe_need_reprogram( 162bool pipe_need_reprogram(
160 struct pipe_ctx *pipe_ctx_old, 163 struct pipe_ctx *pipe_ctx_old,