[igt-dev] [v4 i-g-t 01/14] lib/igt_kms: helper to override the mode on all connectors
Nautiyal, Ankit K
ankit.k.nautiyal at intel.com
Fri May 7 12:37:39 UTC 2021
Hi Bhanu,
I realized that the helper given is also called for tests which use
legacy commit. Currently it tries igt_display_try_commit_atomic()
For legacy commit support, can we make use of igt_display_try_commit2( )
which takes commit style also as argument.
the function igt_display_try_commit_2() for legacy commit will do
drmModesetcrtc for each pipe with the given mode individually and return
false if any of them fail.
Another suggestion which I missed earlier: perhaps we can drop 'link' in
the name igt_override_all_active_output_modes_to_fit_link_bw(), as its
not only for MST but in general.
Regards,
Ankit
On 5/5/2021 4:34 PM, Nautiyal, Ankit K wrote:
> LGTM.
>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
>
> On 5/4/2021 6:13 AM, Bhanuprakash Modem wrote:
>> This helper will iterate through all connectors those have a
>> pending_pipe != PIPE_NONE set by the test upto the point of
>> calling this helper. And find the combination by using
>> ATOMIC_TEST_ONLY then return to the test.
>>
>> This helper would override the mode on all connectors that will
>> be modeset by the next igt_display_commit() call in the test.
>>
>> V2:
>> * Remove MST specific logic (Daniel)
>> V3:
>> * Sort connector modes in descending order
>> V4:
>> * Fine tune the logic to reduce #of interations (Ankit)
>> * Update the documentation (Ankit)
>>
>> Cc: Imre Deak <imre.deak at intel.com>
>> Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
>> Cc: Petri Latvala <petri.latvala at intel.com>
>> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
>> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
>> ---
>> lib/igt_kms.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++
>> lib/igt_kms.h | 1 +
>> 2 files changed, 73 insertions(+)
>>
>> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
>> index 47b829b0c..d604c1b38 100644
>> --- a/lib/igt_kms.c
>> +++ b/lib/igt_kms.c
>> @@ -4048,6 +4048,78 @@ void igt_output_set_pipe(igt_output_t *output,
>> enum pipe pipe)
>> }
>> }
>> +#define for_each_connector_mode(output) \
>> + for (int i__ = 0; i__ < output->config.connector->count_modes;
>> i__++)
>> +
>> +static int sort_drm_modes(const void *a, const void *b)
>> +{
>> + const drmModeModeInfo *mode1 = a, *mode2 = b;
>> +
>> + return (mode1->clock < mode2->clock) - (mode2->clock <
>> mode1->clock);
>> +}
>> +
>> +static
>> +bool __override_all_active_output_modes_to_fit_link_bw(igt_display_t
>> *display,
>> + igt_output_t *outputs[IGT_MAX_PIPES],
>> + const int n_outputs,
>> + int base)
>> +{
>> + igt_output_t *output = NULL;
>> +
>> + if (base >= n_outputs)
>> + return false;
>> +
>> + output = outputs[base];
>> +
>> + for_each_connector_mode(output) {
>> + igt_output_override_mode(output,
>> &output->config.connector->modes[i__]);
>> +
>> + if
>> (__override_all_active_output_modes_to_fit_link_bw(display, outputs,
>> n_outputs, base + 1))
>> + return true;
>> +
>> + if (igt_display_try_commit_atomic(display,
>> + DRM_MODE_ATOMIC_TEST_ONLY |
>> + DRM_MODE_ATOMIC_ALLOW_MODESET,
>> + NULL) == 0)
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +/**
>> + * igt_override_all_active_output_modes_to_fit_link_bw:
>> + * @display: a pointer to an #igt_display_t structure
>> + *
>> + * Override the mode on all active outputs (i.e. pending_pipe !=
>> PIPE_NONE)
>> + * on basis of bandwidth.
>> + *
>> + * Returns: true if a valid connector mode combo found, else false
>> + */
>> +bool
>> igt_override_all_active_output_modes_to_fit_link_bw(igt_display_t
>> *display)
>> +{
>> + int i, n_outputs = 0;
>> + igt_output_t *outputs[IGT_MAX_PIPES];
>> +
>> + for (i = 0 ; i < display->n_outputs; i++) {
>> + igt_output_t *output = &display->outputs[i];
>> +
>> + if (output->pending_pipe == PIPE_NONE)
>> + continue;
>> +
>> + /* Sort the modes in descending order by clock freq. */
>> + qsort(output->config.connector->modes,
>> + output->config.connector->count_modes,
>> + sizeof(drmModeModeInfo),
>> + sort_drm_modes);
>> +
>> + outputs[n_outputs++] = output;
>> + }
>> + igt_require_f(n_outputs, "No active outputs found.\n");
>> +
>> + return
>> __override_all_active_output_modes_to_fit_link_bw(display, outputs,
>> n_outputs, 0);
>> +}
>> +
>> /*
>> * igt_pipe_refresh:
>> * @display: a pointer to an #igt_display_t structure
>> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
>> index 85f0769c9..95463b1c5 100644
>> --- a/lib/igt_kms.h
>> +++ b/lib/igt_kms.h
>> @@ -915,5 +915,6 @@ void igt_require_pipe(igt_display_t *display,
>> void igt_dump_connectors_fd(int drmfd);
>> void igt_dump_crtcs_fd(int drmfd);
>> +bool
>> igt_override_all_active_output_modes_to_fit_link_bw(igt_display_t
>> *display);
>> #endif /* __IGT_KMS_H__ */
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
More information about the igt-dev
mailing list