Re: [PATCH v11 2/6] drm/i915: Implement dynamic GuC WOPCM offset and size calculation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 03/01/2018 04:56 AM, Michal Wajdeczko wrote:
On Thu, 01 Mar 2018 02:01:36 +0100, Jackie Li <yaodong.li@xxxxxxxxx> wrote:


+    if (guc_fw_size >= wopcm->size) {
+        DRM_ERROR("GuC FW (%uKiB) is too big to fit in WOPCM.",
+              guc_fw_size / 1024);
+        return -E2BIG;
+    }
+
+    if (huc_fw_size >= wopcm->size) {
+        DRM_ERROR("HuC FW (%uKiB) is too big to fit in WOPCM.",
+              huc_fw_size / 1024);
+        return -E2BIG;
+    }
+
+    /* Hardware requires GuC WOPCM base to be 16K aligned. */
+    guc_wopcm_base = ALIGN(huc_fw_size + WOPCM_RESERVED_SIZE,
+                   GUC_WOPCM_OFFSET_ALIGNMENT);
+    if ((guc_wopcm_base + ctx_rsvd) >= wopcm->size) {
+        DRM_ERROR("GuC WOPCM base(%uKiB) is too big.\n",
+              guc_wopcm_base / 1024);
+        return -E2BIG;
+    }

hmm, all above checks are very unlikely, and are also covered by the
next check below, so maybe we can drop them?
These checks make sure these values are in a known range. so that we
don't need to worry about wrap around issues. e.g.
guc_wopcm_size = wopcm->size - guc_wopcm_base - ctx_rsvd may
wrap around if we don't have (guc_wopcm_base + ctx_rsvd) >= wopcm->size.

+
+    guc_wopcm_size = wopcm->size - guc_wopcm_base - ctx_rsvd;
+    /*
+     * GuC WOPCM size must be multiple of 4K pages. We've got the maximum +     * WOPCM size available for GuC. Trim the size value to 4K boundary.
+     */
+    guc_wopcm_size &= GUC_WOPCM_SIZE_MASK;
+
+    DRM_DEBUG_DRIVER("Calculated GuC WOPCM Region: [%uKiB, %uKiB)\n",
+             guc_wopcm_base / 1024, guc_wopcm_size / 1024);
+

bikeshed: [n, m) notation suggests range n..m, so maybe better to use

    DRM_DEBUG_DRIVER("Calculated GuC WOPCM: base %uKiB size %uKiB\n",
I'd like to keep it as [n, m) to suggest it's a region and to align with other comments
in the code.

+    /*
+     * GuC WOPCM size needs to be big enough to include all GuC firmware,
+     * extra 8KiB stack for GuC firmware and GUC_WOPCM_RESERVED.
+     */
+    guc_wopcm_rsvd = GUC_WOPCM_RESERVED + GUC_WOPCM_STACK_RESERVED;
+    if ((guc_fw_size + guc_wopcm_rsvd) > guc_wopcm_size) {
+        DRM_ERROR("Need %uKiB WOPCM for GuC, %uKiB available.\n",
+              (guc_fw_size + guc_wopcm_rsvd) / 1024,
+              guc_wopcm_size / 1024);

hmm, maybe to simplify calculations (and match them directly with diagram)
we should introduce guc_wopcm_size_min:

guc_wopcm_size_min = GUC_WOPCM_RESERVED + GUC_WOPCM_STACK_RESERVED + guc_fw_size;
if (guc_wopcm_size_min > guc_wopcm_size) {
    DRM_ERROR("Need %uKiB WOPCM for GuC, %uKiB available.\n",
        guc_wopcm_size_min/1024, guc_wopcm_size/1024);

As we discussed, we need find the maximum size value to meet the HW requirement. So maybe
I need pass this comment as well.:-)
+        return -E2BIG;
+    }
+
+    err = check_hw_restriction(i915, guc_wopcm_base, guc_wopcm_size);
+    if (err) {
+        DRM_ERROR("Failed to meet HW restriction.\n");
+        return err;
+    }
+
+    wopcm->guc.base = guc_wopcm_base;
+    wopcm->guc.size = guc_wopcm_size;
+
+    return 0;
+}
diff --git a/drivers/gpu/drm/i915/intel_wopcm.h b/drivers/gpu/drm/i915/intel_wopcm.h
new file mode 100644
index 0000000..39d4847
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_wopcm.h
@@ -0,0 +1,34 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2017-2018 Intel Corporation
+ */
+
+#ifndef _INTEL_WOPCM_H_
+#define _INTEL_WOPCM_H_
+
+#include <linux/types.h>
+
+/**
+ * struct intel_wopcm - overall WOPCM info and WOPCM regions.
+ * @size: size of overall WOPCM.

bikeshed: maybe better to place this doc would be inside struct
to do not mix documentation style ?
Prefer to keep as it is now:-)

+ * @guc: GuC WOPCM Region info.
+ */
+struct intel_wopcm {
+    u32 size;
+    struct {
+        /**
+         * @base: GuC WOPCM base which is offset from WOPCM base.
+         */
+        u32 base;
+        /**
+         * @size: size of the GuC WOPCM region.
+         */
+        u32 size;
+    } guc;
+};
+
+void intel_wopcm_init_early(struct intel_wopcm *wopcm);
+int intel_wopcm_init(struct intel_wopcm *wopcm);
+
+#endif

only few bikesheds plus one suggestion, with that:

Reviewed-by: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx>
Thanks for the review.
-Jackie

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux