drm/amd/display: Refactor dc_validation_set array into single root struct

[Why]
dc_validate_with_context() took a C array of per-stream elements plus a
separate count. This flat array cannot be extended to carry global objects
without widening the signature further.

[How]
Rename the per-stream element to dc_validation_stream, and make
dc_validation_set a root struct holding streams[MAX_STREAMS] and
stream_count. Update dc_validate_with_context() to take a single
const dc_validation_set * and propagate the new shape through all DC-layer
callers and helpers. Remove the never-implemented
dce112_validate_with_context declaration and the orphaned dce100
forward-declare.

No behavior change.

Reviewed-by: Dominik Kaszewski <dominik.kaszewski@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Wenjing Liu 2026-06-17 10:30:29 -04:00 committed by Alex Deucher
parent a7e804e427
commit 2ab5a13778
6 changed files with 52 additions and 52 deletions

View File

@ -2479,7 +2479,7 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_commit_streams_params
unsigned int i, j;
struct dc_state *context;
enum dc_status res = DC_OK;
struct dc_validation_set set[MAX_STREAMS] = {0};
struct dc_validation_set set = {0};
struct pipe_ctx *pipe;
bool handle_exit_odm2to1 = false;
@ -2512,14 +2512,15 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_commit_streams_params
dc_stream_log(dc, stream);
set[i].stream = stream;
set.streams[i].stream = stream;
if (status) {
set[i].plane_count = (uint8_t)status->plane_count;
set.streams[i].plane_count = (uint8_t)status->plane_count;
for (j = 0; j < (unsigned int)status->plane_count; j++)
set[i].plane_states[j] = status->plane_states[j];
set.streams[i].plane_states[j] = status->plane_states[j];
}
}
set.stream_count = (uint8_t)params->stream_count;
/* ODM Combine 2:1 power optimization is only applied for single stream
* scenario, it uses extra pipes than needed to reduce power consumption
@ -2543,7 +2544,7 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_commit_streams_params
context->power_source = params->power_source;
res = dc_validate_with_context(dc, set, params->stream_count, context, DC_VALIDATE_MODE_AND_PROGRAMMING);
res = dc_validate_with_context(dc, &set, context, DC_VALIDATE_MODE_AND_PROGRAMMING);
/*
* Only update link encoder to stream assignment after bandwidth validation passed.

View File

@ -4325,8 +4325,7 @@ bool dc_resource_is_dsc_encoding_supported(const struct dc *dc)
static bool planes_changed_for_existing_stream(struct dc_state *context,
struct dc_stream_state *stream,
const struct dc_validation_set set[],
unsigned int set_count)
const struct dc_validation_set *set)
{
unsigned int i, j;
struct dc_stream_status *stream_status = NULL;
@ -4343,18 +4342,18 @@ static bool planes_changed_for_existing_stream(struct dc_state *context,
return false;
}
for (i = 0; i < set_count; i++)
if (set[i].stream == stream)
for (i = 0; i < set->stream_count; i++)
if (set->streams[i].stream == stream)
break;
if (i == set_count)
if (i == set->stream_count)
ASSERT(0);
if (set[i].plane_count != stream_status->plane_count)
if (set->streams[i].plane_count != stream_status->plane_count)
return true;
for (j = 0; j < set[i].plane_count; j++)
if (set[i].plane_states[j] != stream_status->plane_states[j])
for (j = 0; j < set->streams[i].plane_count; j++)
if (set->streams[i].plane_states[j] != stream_status->plane_states[j])
return true;
return false;
@ -4363,23 +4362,22 @@ static bool planes_changed_for_existing_stream(struct dc_state *context,
static bool add_all_planes_for_stream(
const struct dc *dc,
struct dc_stream_state *stream,
const struct dc_validation_set set[],
unsigned int set_count,
const struct dc_validation_set *set,
struct dc_state *state)
{
unsigned int i, j;
for (i = 0; i < set_count; i++)
if (set[i].stream == stream)
for (i = 0; i < set->stream_count; i++)
if (set->streams[i].stream == stream)
break;
if (i == set_count) {
if (i == set->stream_count) {
dm_error("Stream %p not found in set!\n", stream);
return false;
}
for (j = 0; j < set[i].plane_count; j++)
if (!dc_state_add_plane(dc, stream, set[i].plane_states[j], state))
for (j = 0; j < set->streams[i].plane_count; j++)
if (!dc_state_add_plane(dc, stream, set->streams[i].plane_states[j], state))
return false;
return true;
@ -4389,8 +4387,7 @@ static bool add_all_planes_for_stream(
* dc_validate_with_context - Validate and update the potential new stream in the context object
*
* @dc: Used to get the current state status
* @set: An array of dc_validation_set with all the current streams reference
* @set_count: Total of streams
* @set: Root validation object holding all streams and their planes
* @context: New context
* @validate_mode: identify the validation mode
*
@ -4404,8 +4401,7 @@ static bool add_all_planes_for_stream(
* In case of success, return DC_OK (1), otherwise, return a DC error.
*/
enum dc_status dc_validate_with_context(struct dc *dc,
const struct dc_validation_set set[],
unsigned int set_count,
const struct dc_validation_set *set,
struct dc_state *context,
enum dc_validate_mode validate_mode)
{
@ -4426,8 +4422,8 @@ enum dc_status dc_validate_with_context(struct dc *dc,
for (i = 0; i < old_stream_count; i++) {
struct dc_stream_state *stream = context->streams[i];
for (j = 0; j < set_count; j++) {
if (stream == set[j].stream) {
for (j = 0; j < set->stream_count; j++) {
if (stream == set->streams[j].stream) {
found = true;
break;
}
@ -4440,8 +4436,8 @@ enum dc_status dc_validate_with_context(struct dc *dc,
}
/* Second, build a list of new streams */
for (i = 0; i < set_count; i++) {
struct dc_stream_state *stream = set[i].stream;
for (i = 0; i < set->stream_count; i++) {
struct dc_stream_state *stream = set->streams[i].stream;
for (j = 0; j < old_stream_count; j++) {
if (stream == context->streams[j]) {
@ -4459,10 +4455,10 @@ enum dc_status dc_validate_with_context(struct dc *dc,
/* Build a list of unchanged streams which is necessary for handling
* planes change such as added, removed, and updated.
*/
for (i = 0; i < set_count; i++) {
for (i = 0; i < set->stream_count; i++) {
/* Check if stream is part of the delete list */
for (j = 0; j < del_streams_count; j++) {
if (set[i].stream == del_streams[j]) {
if (set->streams[i].stream == del_streams[j]) {
found = true;
break;
}
@ -4471,7 +4467,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
if (!found) {
/* Check if stream is part of the add list */
for (j = 0; j < add_streams_count; j++) {
if (set[i].stream == add_streams[j]) {
if (set->streams[i].stream == add_streams[j]) {
found = true;
break;
}
@ -4479,7 +4475,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
}
if (!found)
unchanged_streams[unchanged_streams_count++] = set[i].stream;
unchanged_streams[unchanged_streams_count++] = set->streams[i].stream;
found = false;
}
@ -4488,8 +4484,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
for (i = 0; i < unchanged_streams_count; i++) {
if (planes_changed_for_existing_stream(context,
unchanged_streams[i],
set,
set_count)) {
set)) {
if (!dc_state_rem_all_planes_for_stream(dc,
unchanged_streams[i],
@ -4557,7 +4552,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
if (res != DC_OK)
goto fail;
if (!add_all_planes_for_stream(dc, add_streams[i], set, set_count, context)) {
if (!add_all_planes_for_stream(dc, add_streams[i], set, context)) {
res = DC_FAIL_ATTACH_SURFACES;
goto fail;
}
@ -4567,9 +4562,8 @@ enum dc_status dc_validate_with_context(struct dc *dc,
for (i = 0; i < unchanged_streams_count; i++) {
if (planes_changed_for_existing_stream(context,
unchanged_streams[i],
set,
set_count)) {
if (!add_all_planes_for_stream(dc, unchanged_streams[i], set, set_count, context)) {
set)) {
if (!add_all_planes_for_stream(dc, unchanged_streams[i], set, context)) {
res = DC_FAIL_ATTACH_SURFACES;
goto fail;
}

View File

@ -2182,9 +2182,9 @@ void dc_post_update_surfaces_to_stream(
void dc_get_default_tiling_info(const struct dc *dc, struct dc_tiling_info *tiling_info);
/**
* struct dc_validation_set - Struct to store surface/stream associations for validation
* struct dc_validation_stream - Per-stream surface/stream association for validation
*/
struct dc_validation_set {
struct dc_validation_stream {
/**
* @stream: Stream state properties
*/
@ -2201,6 +2201,21 @@ struct dc_validation_set {
uint8_t plane_count;
};
/**
* struct dc_validation_set - Root validation input grouping all streams for a commit
*/
struct dc_validation_set {
/**
* @streams: Per-stream entries (stream + its planes)
*/
struct dc_validation_stream streams[MAX_STREAMS];
/**
* @stream_count: Number of active entries in @streams
*/
uint8_t stream_count;
};
bool dc_validate_boot_timing(const struct dc *dc,
const struct dc_sink *sink,
struct dc_crtc_timing *crtc_timing);
@ -2208,8 +2223,7 @@ bool dc_validate_boot_timing(const struct dc *dc,
enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state);
enum dc_status dc_validate_with_context(struct dc *dc,
const struct dc_validation_set set[],
unsigned int set_count,
const struct dc_validation_set *set,
struct dc_state *context,
enum dc_validate_mode validate_mode);

View File

@ -577,8 +577,7 @@ struct pipe_ctx *resource_find_free_secondary_pipe_legacy(
const struct pipe_ctx *primary_pipe);
bool resource_validate_attach_surfaces(
const struct dc_validation_set set[],
int set_count,
const struct dc_validation_set *set,
const struct dc_state *old_context,
struct dc_state *context,
const struct resource_pool *pool);

View File

@ -33,7 +33,6 @@
struct dc;
struct resource_pool;
struct dc_validation_set;
struct resource_pool *dce100_create_resource_pool(
uint8_t num_virtual_links,

View File

@ -35,13 +35,6 @@ struct resource_pool *dce112_create_resource_pool(
uint8_t num_virtual_links,
struct dc *dc);
enum dc_status dce112_validate_with_context(
struct dc *dc,
const struct dc_validation_set set[],
int set_count,
struct dc_state *context,
struct dc_state *old_context);
enum dc_status dce112_validate_bandwidth(
struct dc *dc,
struct dc_state *context,