drm/i915/guc: Optimize CTB writes and reads
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gt / uc / intel_guc_ct.h
index cb222f2..edd1bba 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
+#include <linux/ktime.h>
 
 #include "intel_guc_fwif.h"
 
@@ -31,16 +32,23 @@ struct intel_guc;
  * @lock: protects access to the commands buffer and buffer descriptor
  * @desc: pointer to the buffer descriptor
  * @cmds: pointer to the commands buffer
- * @size: size of the commands buffer
+ * @size: size of the commands buffer in dwords
+ * @head: local shadow copy of head in dwords
+ * @tail: local shadow copy of tail in dwords
+ * @space: local shadow copy of space in dwords
+ * @broken: flag to indicate if descriptor data is broken
  */
 struct intel_guc_ct_buffer {
        spinlock_t lock;
        struct guc_ct_buffer_desc *desc;
        u32 *cmds;
        u32 size;
+       u32 tail;
+       u32 head;
+       u32 space;
+       bool broken;
 };
 
-
 /** Top-level structure for Command Transport related data
  *
  * Includes a pair of CT buffers for bi-directional communication and tracking
@@ -59,7 +67,7 @@ struct intel_guc_ct {
        struct tasklet_struct receive_tasklet;
 
        struct {
-               u32 last_fence; /* last fence used to send request */
+               u16 last_fence; /* last fence used to send request */
 
                spinlock_t lock; /* protects pending requests list */
                struct list_head pending; /* requests waiting for response */
@@ -67,6 +75,9 @@ struct intel_guc_ct {
                struct list_head incoming; /* incoming requests */
                struct work_struct worker; /* handler for incoming requests */
        } requests;
+
+       /** @stall_time: time of first time a CTB submission is stalled */
+       ktime_t stall_time;
 };
 
 void intel_guc_ct_init_early(struct intel_guc_ct *ct);
@@ -85,8 +96,9 @@ static inline bool intel_guc_ct_enabled(struct intel_guc_ct *ct)
        return ct->enabled;
 }
 
+#define INTEL_GUC_CT_SEND_NB           BIT(31)
 int intel_guc_ct_send(struct intel_guc_ct *ct, const u32 *action, u32 len,
-                     u32 *response_buf, u32 response_buf_size);
+                     u32 *response_buf, u32 response_buf_size, u32 flags);
 void intel_guc_ct_event_handler(struct intel_guc_ct *ct);
 
 #endif /* _INTEL_GUC_CT_H_ */