diff options
author | Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> | 2017-05-17 16:05:40 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 18:07:17 -0400 |
commit | 430ef426bc43b59a7444c08d664e24a7cf89710e (patch) | |
tree | 1e820da524f9e5fc49906c79e46ed72eb80324e6 | |
parent | ccaf31ec714b596d1edb92b1ed4ccc4abf1f645c (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>
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 | ||
656 | static 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 | |||
690 | struct validate_context *dc_get_validate_context( | 656 | struct 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 | ||
711 | context_alloc_fail: | 672 | context_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 | ||
1390 | static void calculate_phy_pix_clks( | 1390 | static 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 | ||
1411 | enum dc_status resource_map_pool_resources( | 1409 | enum 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 | ||
2204 | enum dc_status resource_map_clock_resources( | 2203 | enum 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 | ||
654 | static enum dc_status validate_mapped_resource( | 654 | static 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 | ||
770 | static enum dc_status validate_mapped_resource( | 770 | static 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 | ||
723 | static enum dc_status validate_mapped_resource( | 723 | static 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 | ||
855 | enum dc_status resource_map_phy_clock_resources( | 856 | enum 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 | ||
44 | enum dc_status dce112_validate_guaranteed( | 45 | enum 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 | ||
670 | static enum dc_status validate_mapped_resource( | 670 | static 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 | ||
854 | static enum dc_status validate_mapped_resource( | 854 | static 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 | ||
81 | enum dc_status resource_map_pool_resources( | 81 | enum 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 | ||
85 | bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx); | 86 | bool 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 | ||
151 | enum dc_status resource_map_clock_resources( | 152 | enum 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 | ||
155 | enum dc_status resource_map_phy_clock_resources( | 157 | enum 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 | ||
159 | bool pipe_need_reprogram( | 162 | bool pipe_need_reprogram( |
160 | struct pipe_ctx *pipe_ctx_old, | 163 | struct pipe_ctx *pipe_ctx_old, |