OSDN Git Service

drm/i915/guc: Move defines with size of GuC logs to intel_guc_log.h
authorPiotr Piorkowski <piotr.piorkowski@intel.com>
Tue, 5 Jun 2018 15:13:29 +0000 (17:13 +0200)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 12 Jun 2018 14:44:45 +0000 (15:44 +0100)
At this moment, we have defined GuC logs sizes in intel_guc_fwif.h, but
as these values are related directly to the GuC logs, and not to API of
GuC parameters, we should move these defines to intel_guc_log.h.

v2:
- change buffers size to more friendly (Michał Wajdeczko)
- remove GUC_LOG_SIZE define (Michał Wajdeczko)
v3:
- use SZ_* macros to define buffers sizes (Michał Wajdeczko)

Signed-off-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20180605151330.9954-1-piotr.piorkowski@intel.com
drivers/gpu/drm/i915/intel_guc.c
drivers/gpu/drm/i915/intel_guc_fwif.h
drivers/gpu/drm/i915/intel_guc_log.c
drivers/gpu/drm/i915/intel_guc_log.h

index dce475e..4101264 100644 (file)
@@ -263,13 +263,31 @@ static u32 guc_ctl_log_params_flags(struct intel_guc *guc)
        u32 offset = intel_guc_ggtt_offset(guc, guc->log.vma) >> PAGE_SHIFT;
        u32 flags;
 
-       /* each allocated unit is a page */
-       flags = GUC_LOG_VALID | GUC_LOG_NOTIFY_ON_HALF_FULL |
-               (GUC_LOG_CRASH_PAGES << GUC_LOG_CRASH_SHIFT) |
-               (GUC_LOG_DPC_PAGES << GUC_LOG_DPC_SHIFT) |
-               (GUC_LOG_ISR_PAGES << GUC_LOG_ISR_SHIFT) |
+       #define UNIT SZ_4K
+
+       BUILD_BUG_ON(!CRASH_BUFFER_SIZE);
+       BUILD_BUG_ON(!IS_ALIGNED(CRASH_BUFFER_SIZE, UNIT));
+       BUILD_BUG_ON(!DPC_BUFFER_SIZE);
+       BUILD_BUG_ON(!IS_ALIGNED(DPC_BUFFER_SIZE, UNIT));
+       BUILD_BUG_ON(!ISR_BUFFER_SIZE);
+       BUILD_BUG_ON(!IS_ALIGNED(ISR_BUFFER_SIZE, UNIT));
+
+       BUILD_BUG_ON((CRASH_BUFFER_SIZE / UNIT - 1) >
+                       (GUC_LOG_CRASH_MASK >> GUC_LOG_CRASH_SHIFT));
+       BUILD_BUG_ON((DPC_BUFFER_SIZE / UNIT - 1) >
+                       (GUC_LOG_DPC_MASK >> GUC_LOG_DPC_SHIFT));
+       BUILD_BUG_ON((ISR_BUFFER_SIZE / UNIT - 1) >
+                       (GUC_LOG_ISR_MASK >> GUC_LOG_ISR_SHIFT));
+
+       flags = GUC_LOG_VALID |
+               GUC_LOG_NOTIFY_ON_HALF_FULL |
+               ((CRASH_BUFFER_SIZE / UNIT - 1) << GUC_LOG_CRASH_SHIFT) |
+               ((DPC_BUFFER_SIZE / UNIT - 1) << GUC_LOG_DPC_SHIFT) |
+               ((ISR_BUFFER_SIZE / UNIT - 1) << GUC_LOG_ISR_SHIFT) |
                (offset << GUC_LOG_BUF_ADDR_SHIFT);
 
+       #undef UNIT
+
        return flags;
 }
 
index 0867ba7..1a0f2a3 100644 (file)
 #define   GUC_LOG_VALID                        (1 << 0)
 #define   GUC_LOG_NOTIFY_ON_HALF_FULL  (1 << 1)
 #define   GUC_LOG_ALLOC_IN_MEGABYTE    (1 << 3)
-#define   GUC_LOG_CRASH_PAGES          1
 #define   GUC_LOG_CRASH_SHIFT          4
-#define   GUC_LOG_DPC_PAGES            7
+#define   GUC_LOG_CRASH_MASK           (0x1 << GUC_LOG_CRASH_SHIFT)
 #define   GUC_LOG_DPC_SHIFT            6
-#define   GUC_LOG_ISR_PAGES            7
+#define   GUC_LOG_DPC_MASK             (0x7 << GUC_LOG_DPC_SHIFT)
 #define   GUC_LOG_ISR_SHIFT            9
+#define   GUC_LOG_ISR_MASK             (0x7 << GUC_LOG_ISR_SHIFT)
 #define   GUC_LOG_BUF_ADDR_SHIFT       12
 
 #define GUC_CTL_PAGE_FAULT_CONTROL     5
@@ -532,20 +532,6 @@ enum guc_log_buffer_type {
 };
 
 /**
- * DOC: GuC Log buffer Layout
- *
- * Page0  +-------------------------------+
- *        |   ISR state header (32 bytes) |
- *        |      DPC state header         |
- *        |   Crash dump state header     |
- * Page1  +-------------------------------+
- *        |           ISR logs            |
- * Page9  +-------------------------------+
- *        |           DPC logs            |
- * Page17 +-------------------------------+
- *        |         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
index b921c94..6da61a7 100644 (file)
@@ -215,11 +215,11 @@ static unsigned int guc_get_log_buffer_size(enum guc_log_buffer_type type)
 {
        switch (type) {
        case GUC_ISR_LOG_BUFFER:
-               return (GUC_LOG_ISR_PAGES + 1) * PAGE_SIZE;
+               return ISR_BUFFER_SIZE;
        case GUC_DPC_LOG_BUFFER:
-               return (GUC_LOG_DPC_PAGES + 1) * PAGE_SIZE;
+               return DPC_BUFFER_SIZE;
        case GUC_CRASH_DUMP_LOG_BUFFER:
-               return (GUC_LOG_CRASH_PAGES + 1) * PAGE_SIZE;
+               return CRASH_BUFFER_SIZE;
        default:
                MISSING_CASE(type);
        }
@@ -397,7 +397,7 @@ static int guc_log_relay_create(struct intel_guc_log *log)
        lockdep_assert_held(&log->relay.lock);
 
         /* Keep the size of sub buffers same as shared log buffer */
-       subbuf_size = GUC_LOG_SIZE;
+       subbuf_size = log->vma->size;
 
        /*
         * Store up to 8 snapshots, which is large enough to buffer sufficient
@@ -452,11 +452,34 @@ int intel_guc_log_create(struct intel_guc_log *log)
 {
        struct intel_guc *guc = log_to_guc(log);
        struct i915_vma *vma;
+       u32 guc_log_size;
        int ret;
 
        GEM_BUG_ON(log->vma);
 
-       vma = intel_guc_allocate_vma(guc, GUC_LOG_SIZE);
+       /*
+        *  GuC Log buffer Layout
+        *
+        *  +===============================+ 00B
+        *  |    Crash dump state header    |
+        *  +-------------------------------+ 32B
+        *  |       DPC state header        |
+        *  +-------------------------------+ 64B
+        *  |       ISR state header        |
+        *  +-------------------------------+ 96B
+        *  |                               |
+        *  +===============================+ PAGE_SIZE (4KB)
+        *  |        Crash Dump logs        |
+        *  +===============================+ + CRASH_SIZE
+        *  |           DPC logs            |
+        *  +===============================+ + DPC_SIZE
+        *  |           ISR logs            |
+        *  +===============================+ + ISR_SIZE
+        */
+       guc_log_size = PAGE_SIZE + CRASH_BUFFER_SIZE + DPC_BUFFER_SIZE +
+                       ISR_BUFFER_SIZE;
+
+       vma = intel_guc_allocate_vma(guc, guc_log_size);
        if (IS_ERR(vma)) {
                ret = PTR_ERR(vma);
                goto err;
index 196e219..dfc0721 100644 (file)
 
 struct intel_guc;
 
-/*
- * The first page is to save log buffer state. Allocate one
- * extra page for others in case for overlap
- */
-#define GUC_LOG_SIZE   ((1 + GUC_LOG_DPC_PAGES + 1 + GUC_LOG_ISR_PAGES + \
-                         1 + GUC_LOG_CRASH_PAGES + 1) << PAGE_SHIFT)
+#define CRASH_BUFFER_SIZE      SZ_8K
+#define DPC_BUFFER_SIZE                SZ_32K
+#define ISR_BUFFER_SIZE                SZ_32K
 
 /*
  * While we're using plain log level in i915, GuC controls are much more...