Make CTB Header explicit and separate from CTB Message. Signed-off-by: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx> Cc: Matthew Brost <matthew.brost@xxxxxxxxx> --- .../gt/uc/abi/guc_communication_ctb_abi.h | 51 +++++++++++-------- drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c | 24 ++++----- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h b/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h index e933ca02d0eb..90a86759e108 100644 --- a/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h +++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h @@ -56,8 +56,9 @@ struct guc_ct_buffer_desc { } __packed; static_assert(sizeof(struct guc_ct_buffer_desc) == 64); + /** - * DOC: CTB Message + * DOC: CTB Header * * +---+-------+--------------------------------------------------------------+ * | | Bits | Description | @@ -71,21 +72,34 @@ static_assert(sizeof(struct guc_ct_buffer_desc) == 64); * | +-------+--------------------------------------------------------------+ * | | 7:0 | **NUM_DWORDS** - length of the CTB message (w/o header) | * +---+-------+--------------------------------------------------------------+ - * | 1 | 31:0 | optional (depends on FORMAT) | - * +---+-------+ | - * |...| | | - * +---+-------+ | - * | n | 31:0 | | + */ + +#define GUC_CTB_HDR_LEN 1u +#define GUC_CTB_HDR_0_FENCE (0xffff << 16) +#define GUC_CTB_HDR_0_FORMAT (0xf << 12) +#define GUC_CTB_FORMAT_HXG 0u +#define GUC_CTB_HDR_0_RESERVED (0xf << 8) +#define GUC_CTB_HDR_0_NUM_DWORDS (0xff << 0) +#define GUC_CTB_MAX_DWORDS 255u + +/** + * DOC: CTB Message + * + * +---+-------+--------------------------------------------------------------+ + * | | Bits | Description | + * +===+=======+==============================================================+ + * | 0 | 31:0 | `CTB Header`_ | + * +---+-------+--------------------------------------------------------------+ + * | 1 | 31:0 | +--------------------------------------------------------+ | + * +---+-------+ | | | + * |...| | | optional payload (depends on FORMAT) | | + * +---+-------+ | | | + * | n | 31:0 | +--------------------------------------------------------+ | * +---+-------+--------------------------------------------------------------+ */ -#define GUC_CTB_MSG_MIN_LEN 1u -#define GUC_CTB_MSG_MAX_LEN 256u -#define GUC_CTB_MSG_0_FENCE (0xffff << 16) -#define GUC_CTB_MSG_0_FORMAT (0xf << 12) -#define GUC_CTB_FORMAT_HXG 0u -#define GUC_CTB_MSG_0_RESERVED (0xf << 8) -#define GUC_CTB_MSG_0_NUM_DWORDS (0xff << 0) +#define GUC_CTB_MSG_MIN_LEN GUC_CTB_HDR_LEN +#define GUC_CTB_MSG_MAX_LEN (GUC_CTB_HDR_LEN + GUC_CTB_MAX_DWORDS) /** * DOC: CTB HXG Message @@ -93,13 +107,10 @@ static_assert(sizeof(struct guc_ct_buffer_desc) == 64); * +---+-------+--------------------------------------------------------------+ * | | Bits | Description | * +===+=======+==============================================================+ - * | 0 | 31:16 | FENCE | - * | +-------+--------------------------------------------------------------+ - * | | 15:12 | FORMAT = GUC_CTB_FORMAT_HXG_ | - * | +-------+--------------------------------------------------------------+ - * | | 11:8 | RESERVED = MBZ | - * | +-------+--------------------------------------------------------------+ - * | | 7:0 | NUM_DWORDS = length (in dwords) of the embedded HXG message | + * | 0 | 31:0 | `CTB Header`_ with: | + * | | | | + * | | | - FORMAT = GUC_CTB_FORMAT_HXG_ | + * | | | - NUM_DWORDS = **n** | * +---+-------+--------------------------------------------------------------+ * | 1 | 31:0 | +--------------------------------------------------------+ | * +---+-------+ | | | diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c index 43409044528e..4236fc33d293 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c @@ -412,9 +412,9 @@ static int ct_write(struct intel_guc_ct *ct, * dw1: HXG header (including action code) * dw2+: action data */ - header = FIELD_PREP(GUC_CTB_MSG_0_FORMAT, GUC_CTB_FORMAT_HXG) | - FIELD_PREP(GUC_CTB_MSG_0_NUM_DWORDS, len) | - FIELD_PREP(GUC_CTB_MSG_0_FENCE, fence); + header = FIELD_PREP(GUC_CTB_HDR_0_FORMAT, GUC_CTB_FORMAT_HXG) | + FIELD_PREP(GUC_CTB_HDR_0_NUM_DWORDS, len) | + FIELD_PREP(GUC_CTB_HDR_0_FENCE, fence); hxg = FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) | FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION | @@ -646,7 +646,7 @@ static int ct_read(struct intel_guc_ct *ct, struct ct_incoming_msg **msg) head = (head + 1) % size; /* message len with header */ - len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, header) + GUC_CTB_MSG_MIN_LEN; + len = FIELD_GET(GUC_CTB_HDR_0_NUM_DWORDS, header) + GUC_CTB_HDR_LEN; if (unlikely(len > (u32)available)) { CT_ERROR(ct, "Incomplete message %*ph %*ph %*ph\n", 4, &header, @@ -691,9 +691,9 @@ static int ct_read(struct intel_guc_ct *ct, struct ct_incoming_msg **msg) static int ct_handle_response(struct intel_guc_ct *ct, struct ct_incoming_msg *response) { - u32 len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, response->msg[0]); - u32 fence = FIELD_GET(GUC_CTB_MSG_0_FENCE, response->msg[0]); - const u32 *hxg = &response->msg[GUC_CTB_MSG_MIN_LEN]; + u32 len = FIELD_GET(GUC_CTB_HDR_0_NUM_DWORDS, response->msg[0]); + u32 fence = FIELD_GET(GUC_CTB_HDR_0_FENCE, response->msg[0]); + const u32 *hxg = &response->msg[GUC_CTB_HDR_LEN]; const u32 *data = &hxg[GUC_HXG_MSG_MIN_LEN]; u32 datalen = len - GUC_HXG_MSG_MIN_LEN; struct ct_request *req; @@ -750,8 +750,8 @@ static int ct_process_request(struct intel_guc_ct *ct, struct ct_incoming_msg *r u32 hxg_len, action, len; int ret; - hxg = &request->msg[GUC_CTB_MSG_MIN_LEN]; - hxg_len = request->size - GUC_CTB_MSG_MIN_LEN; + hxg = &request->msg[GUC_CTB_HDR_LEN]; + hxg_len = request->size - GUC_CTB_HDR_LEN; payload = &hxg[GUC_HXG_MSG_MIN_LEN]; action = FIELD_GET(GUC_HXG_EVENT_MSG_0_ACTION, hxg[0]); len = hxg_len - GUC_HXG_MSG_MIN_LEN; @@ -818,7 +818,7 @@ static void ct_incoming_request_worker_func(struct work_struct *w) static int ct_handle_event(struct intel_guc_ct *ct, struct ct_incoming_msg *request) { - const u32 *hxg = &request->msg[GUC_CTB_MSG_MIN_LEN]; + const u32 *hxg = &request->msg[GUC_CTB_HDR_LEN]; unsigned long flags; GEM_BUG_ON(FIELD_GET(GUC_HXG_MSG_0_TYPE, hxg[0]) != GUC_HXG_TYPE_EVENT); @@ -840,7 +840,7 @@ static int ct_handle_hxg(struct intel_guc_ct *ct, struct ct_incoming_msg *msg) if (unlikely(msg->size < GUC_CTB_HXG_MSG_MIN_LEN)) return -EBADMSG; - hxg = &msg->msg[GUC_CTB_MSG_MIN_LEN]; + hxg = &msg->msg[GUC_CTB_HDR_LEN]; origin = FIELD_GET(GUC_HXG_MSG_0_ORIGIN, hxg[0]); if (unlikely(origin != GUC_HXG_ORIGIN_GUC)) { @@ -871,7 +871,7 @@ static int ct_handle_hxg(struct intel_guc_ct *ct, struct ct_incoming_msg *msg) static void ct_handle_msg(struct intel_guc_ct *ct, struct ct_incoming_msg *msg) { - u32 format = FIELD_GET(GUC_CTB_MSG_0_FORMAT, msg->msg[0]); + u32 format = FIELD_GET(GUC_CTB_HDR_0_FORMAT, msg->msg[0]); int err; if (format == GUC_CTB_FORMAT_HXG) -- 2.25.1