[Intel-gfx] [PATCH] drm/i915/guc: Improve GuC CTB ABI

Michal Wajdeczko michal.wajdeczko at intel.com
Thu Jul 1 16:53:21 UTC 2021


Make CTB Header explicit and separate from CTB Message.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Matthew Brost <matthew.brost at intel.com>
---
 .../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



More information about the Intel-gfx mailing list