[PATCH v6 3/4] drm/xe/guc: Introduce enum with offsets for multi-LRC register H2G
Lis, Tomasz
tomasz.lis at intel.com
Thu Apr 3 17:26:48 UTC 2025
On 01.04.2025 19:24, Michal Wajdeczko wrote:
> On 31.03.2025 15:21, Tomasz Lis wrote:
>> Some GuC messages are constructed with incrementing dword counter
>> rather than referencing specific DWORDs, as described in GuC interface
>> specification.
>>
>> This change introduces the definitions of DWORD numbers for parameters
>> which will need to be referenced in a CTB parser to be added in a
>> following patch. To ensure correctness of these DWORDs, verification
>> in form of asserts was added to the message construction code.
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis at intel.com>
>> ---
>> drivers/gpu/drm/xe/abi/guc_actions_abi.h | 7 +++++++
>> drivers/gpu/drm/xe/xe_guc_submit.c | 4 ++++
>> 2 files changed, 11 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/abi/guc_actions_abi.h b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
>> index 448afb86e05c..86bd4b092c7c 100644
>> --- a/drivers/gpu/drm/xe/abi/guc_actions_abi.h
>> +++ b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
>> @@ -161,6 +161,13 @@ enum xe_guc_preempt_options {
>> XE_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q = 0x8,
>> };
>>
>> +enum xe_guc_register_context_multi_lrc_param_offsets {
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_WQ_DESC = 5,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_WQ_BASE = 7,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_N_CHILDREN = 10,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_HWLRCA = 11
> while likely we only need those 4 indices, IMO it would cleaner to
> define all of them in ABI to reflect the whole message layout:
>
> enum xe_guc_register_context_multi_lrc_message {
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_0_MBZ = 0,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_1_FLAGS,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_2_PARENT_CONTEXT,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_3_ENGINE_CLASS,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_4_ENGINE_SUBMIT_MASK,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
> XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_6_WQ_DESC_ADDR_UPPER,
> ...
Will agree to all the propositions here as this whole patch isn't my idea.
-Tomasz
>> +};
>> +
>> enum xe_guc_report_status {
>> XE_GUC_REPORT_STATUS_UNKNOWN = 0x0,
>> XE_GUC_REPORT_STATUS_ACKED = 0x1,
>> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
>> index 31bc2022bfc2..3c8574e2c1f3 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
>> @@ -469,12 +469,16 @@ static void __register_mlrc_exec_queue(struct xe_guc *guc,
>> action[len++] = info->context_idx;
>> action[len++] = info->engine_class;
>> action[len++] = info->engine_submit_mask;
>> + xe_gt_assert(guc_to_gt(guc), len == XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_WQ_DESC);
>> action[len++] = info->wq_desc_lo;
>> action[len++] = info->wq_desc_hi;
>> + xe_gt_assert(guc_to_gt(guc), len == XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_WQ_BASE);
>> action[len++] = info->wq_base_lo;
>> action[len++] = info->wq_base_hi;
>> action[len++] = info->wq_size;
>> + xe_gt_assert(guc_to_gt(guc), len == XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_N_CHILDREN);
>> action[len++] = q->width;
>> + xe_gt_assert(guc_to_gt(guc), len == XE_GUC_REGISTER_CONTEXT_MULTI_LRC_OFFS_HWLRCA);
>> action[len++] = info->hwlrca_lo;
>> action[len++] = info->hwlrca_hi;
>>
> hmm, it looks little paranoid, and pollute otherwise clean code,
> so maybe either convert completely to index based message encoding:
>
> action[.._FLAGS] = info->flags;
> action[.._WQ_DESC_LO] = info->wq_desc_lo;
> action[.._WQ_DESC_HI] = info->wq_desc_hi;
> ...
> for (i = 0; i < q->width; ++i)
> action[.._HWLRCA_LO + 1 + i] = ..;
> action[.._HWLRCA_HI + 1 + i] = ..;
>
> or assert those important entries at the end:
>
> xe_gt_assert(gt, action[..WQ_DESC_LO] == info->wq_desc_lo);
> xe_gt_assert(gt, action[..HWLRCA_LO] == info->hwlrca_lo);
>
> @Matt, any other ideas or you don't care?
>
>
More information about the dri-devel
mailing list