drm/i915: Add GuC ukernel logging related fields to fw interface file
authorSagar Arun Kamble <sagar.a.kamble@intel.com>
Wed, 12 Oct 2016 16:24:28 +0000 (21:54 +0530)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Tue, 25 Oct 2016 08:34:06 +0000 (09:34 +0100)
The first page of the GuC log buffer contains state info or meta data
which is required to parse the logs contained in the subsequent pages.
The structure representing the state info is added to interface file
as Driver would need to handle log buffer flush interrupts from GuC.
Added an enum for the different message/event types that can be send
by the GuC ukernel to Host.
Also added 2 new Host to GuC action types to inform GuC when Host has
flushed the log buffer and forcefuly cause the GuC to send a new
log buffer flush interrupt.

v2:
- Make documentation of log buffer state structure more elaborate &
  rename LOGBUFFERFLUSH action to LOG_BUFFER_FLUSH for consistency.(Tvrtko)

v3: Add GuC log buffer layout diagram for more clarity.

Signed-off-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Signed-off-by: Akash Goel <akash.goel@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
drivers/gpu/drm/i915/intel_guc_fwif.h

index e40db2d2ae994b81fe44041d13b63b9e5713acc8..adb1ffdc37c24dd86456ca8a551713293e9f37c6 100644 (file)
@@ -419,15 +419,87 @@ struct guc_ads {
        u32 reserved2[4];
 } __packed;
 
+/* GuC logging structures */
+
+enum guc_log_buffer_type {
+       GUC_ISR_LOG_BUFFER,
+       GUC_DPC_LOG_BUFFER,
+       GUC_CRASH_DUMP_LOG_BUFFER,
+       GUC_MAX_LOG_BUFFER
+};
+
+/**
+ * DOC: GuC Log buffer Layout
+ *
+ * Page0  +-------------------------------+
+ *        |   ISR state header (32 bytes) |
+ *        |      DPC state header         |
+ *        |   Crash dump state header     |
+ * Page1  +-------------------------------+
+ *        |           ISR logs            |
+ * Page5  +-------------------------------+
+ *        |           DPC logs            |
+ * Page9  +-------------------------------+
+ *        |         Crash Dump logs       |
+ *        +-------------------------------+
+ *
+ * Below state structure is used for coordination of retrieval of GuC firmware
+ * logs. Separate state is maintained for each log buffer type.
+ * read_ptr points to the location where i915 read last in log buffer and
+ * is read only for GuC firmware. write_ptr is incremented by GuC with number
+ * of bytes written for each log entry and is read only for i915.
+ * When any type of log buffer becomes half full, GuC sends a flush interrupt.
+ * GuC firmware expects that while it is writing to 2nd half of the buffer,
+ * first half would get consumed by Host and then get a flush completed
+ * acknowledgment from Host, so that it does not end up doing any overwrite
+ * causing loss of logs. So when buffer gets half filled & i915 has requested
+ * for interrupt, GuC will set flush_to_file field, set the sampled_write_ptr
+ * to the value of write_ptr and raise the interrupt.
+ * On receiving the interrupt i915 should read the buffer, clear flush_to_file
+ * field and also update read_ptr with the value of sample_write_ptr, before
+ * sending an acknowledgment to GuC. marker & version fields are for internal
+ * usage of GuC and opaque to i915. buffer_full_cnt field is incremented every
+ * time GuC detects the log buffer overflow.
+ */
+struct guc_log_buffer_state {
+       u32 marker[2];
+       u32 read_ptr;
+       u32 write_ptr;
+       u32 size;
+       u32 sampled_write_ptr;
+       union {
+               struct {
+                       u32 flush_to_file:1;
+                       u32 buffer_full_cnt:4;
+                       u32 reserved:27;
+               };
+               u32 flags;
+       };
+       u32 version;
+} __packed;
+
+union guc_log_control {
+       struct {
+               u32 logging_enabled:1;
+               u32 reserved1:3;
+               u32 verbosity:4;
+               u32 reserved2:24;
+       };
+       u32 value;
+} __packed;
+
 /* This Action will be programmed in C180 - SOFT_SCRATCH_O_REG */
 enum host2guc_action {
        HOST2GUC_ACTION_DEFAULT = 0x0,
        HOST2GUC_ACTION_SAMPLE_FORCEWAKE = 0x6,
        HOST2GUC_ACTION_ALLOCATE_DOORBELL = 0x10,
        HOST2GUC_ACTION_DEALLOCATE_DOORBELL = 0x20,
+       HOST2GUC_ACTION_LOG_BUFFER_FILE_FLUSH_COMPLETE = 0x30,
+       HOST2GUC_ACTION_FORCE_LOG_BUFFER_FLUSH = 0x302,
        HOST2GUC_ACTION_ENTER_S_STATE = 0x501,
        HOST2GUC_ACTION_EXIT_S_STATE = 0x502,
        HOST2GUC_ACTION_SLPC_REQUEST = 0x3003,
+       HOST2GUC_ACTION_UK_LOG_ENABLE_LOGGING = 0x0E000,
        HOST2GUC_ACTION_LIMIT
 };
 
@@ -449,4 +521,10 @@ enum guc2host_status {
        GUC2HOST_STATUS_GENERIC_FAIL = GUC2HOST_STATUS(0x0000F000)
 };
 
+/* This action will be programmed in C1BC - SOFT_SCRATCH_15_REG */
+enum guc2host_message {
+       GUC2HOST_MSG_CRASH_DUMP_POSTED = (1 << 1),
+       GUC2HOST_MSG_FLUSH_LOG_BUFFER = (1 << 3)
+};
+
 #endif