[Intel-xe] [PATCH 07/12] drm/xe/gsc: Implement WA 14015076503
John Harrison
john.c.harrison at intel.com
Wed Nov 8 22:22:27 UTC 2023
On 10/27/2023 15:29, Daniele Ceraolo Spurio wrote:
> When the GSC FW is loaded, we need to inform it when a GSCCS reset is
> coming and then wait 200ms for it to get ready to process the reset.
>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: John Harrison <john.c.harrison at intel.com>
> ---
> drivers/gpu/drm/xe/Makefile | 2 +-
> drivers/gpu/drm/xe/regs/xe_gsc_regs.h | 10 ++++++
> drivers/gpu/drm/xe/xe_gt.c | 44 +++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_wa_oob.rules | 1 +
> 4 files changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 474b6044d054..4a442dcf4d79 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -37,7 +37,7 @@ quiet_cmd_wa_oob = GEN $(notdir $(generated_oob))
> $(generated_oob) &: $(obj)/xe_gen_wa_oob $(srctree)/$(src)/xe_wa_oob.rules
> $(call cmd,wa_oob)
>
> -$(obj)/xe_guc.o $(obj)/xe_migrate.o $(obj)/xe_ring_ops.o $(obj)/xe_vm.o $(obj)/xe_wa.o: $(generated_oob)
> +$(obj)/xe_gt.o $(obj)/xe_guc.o $(obj)/xe_migrate.o $(obj)/xe_ring_ops.o $(obj)/xe_vm.o $(obj)/xe_wa.o: $(generated_oob)
Is it not worth splitting this into multiple lines?
>
> # Please keep these build lists sorted!
>
> diff --git a/drivers/gpu/drm/xe/regs/xe_gsc_regs.h b/drivers/gpu/drm/xe/regs/xe_gsc_regs.h
> index 22d2ad9cb64d..9a84b55d66ee 100644
> --- a/drivers/gpu/drm/xe/regs/xe_gsc_regs.h
> +++ b/drivers/gpu/drm/xe/regs/xe_gsc_regs.h
> @@ -16,6 +16,13 @@
> #define MTL_GSC_HECI1_BASE 0x00116000
> #define MTL_GSC_HECI2_BASE 0x00117000
>
> +#define HECI_H_CSR(base) XE_REG((base) + 0x4)
> +#define HECI_H_CSR_IE REG_BIT(0)
> +#define HECI_H_CSR_IS REG_BIT(1)
> +#define HECI_H_CSR_IG REG_BIT(2)
> +#define HECI_H_CSR_RDY REG_BIT(3)
> +#define HECI_H_CSR_RST REG_BIT(4)
> +
> /*
> * The FWSTS register values are FW defined and can be different between
> * HECI1 and HECI2
> @@ -26,4 +33,7 @@
> #define HECI1_FWSTS1_PROXY_STATE_NORMAL 5
> #define HECI1_FWSTS1_INIT_COMPLETE REG_BIT(9)
>
> +#define HECI_H_GS1(base) XE_REG((base) + 0xc4c)
> +#define HECI_H_GS1_ER_PREP REG_BIT(0)
> +
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
> index 73c090762771..0e8e24bded1c 100644
> --- a/drivers/gpu/drm/xe/xe_gt.c
> +++ b/drivers/gpu/drm/xe/xe_gt.c
> @@ -10,8 +10,10 @@
> #include <drm/drm_managed.h>
> #include <drm/xe_drm.h>
>
> +#include "generated/xe_wa_oob.h"
> #include "instructions/xe_gfxpipe_commands.h"
> #include "instructions/xe_mi_commands.h"
> +#include "regs/xe_gsc_regs.h"
> #include "regs/xe_gt_regs.h"
> #include "xe_assert.h"
> #include "xe_bb.h"
> @@ -504,16 +506,58 @@ int xe_gt_init(struct xe_gt *gt)
> return 0;
> }
>
> +static int gsc_fw_is_loaded(struct xe_gt *gt)
> +{
> + return xe_mmio_read32(gt, HECI_FWSTS1(MTL_GSC_HECI1_BASE)) &
> + HECI1_FWSTS1_INIT_COMPLETE;
> +}
This function is duplicated exactly in the GSC source file. That seems
bad. Either it should be exported and shared or the usage here should be
moved to the GSC specific file.
John.
> +
> +static void wa_14015076503_start(struct xe_gt *gt)
> +{
> + /* WA only applies if the GSC is loaded */
> + if (!XE_WA(gt, 14015076503) || !gsc_fw_is_loaded(gt))
> + return;
> +
> + /*
> + * wa_14015076503: if the GSC FW is loaded, we need to alert it that
> + * we're going to do a GSC engine reset and then wait for 200ms for the
> + * FW to get ready for it.
> + */
> + xe_mmio_rmw32(gt, HECI_H_GS1(MTL_GSC_HECI2_BASE),
> + 0, HECI_H_GS1_ER_PREP);
> +
> + /* make sure the reset bit is clear when writing the CSR reg */
> + xe_mmio_rmw32(gt, HECI_H_CSR(MTL_GSC_HECI2_BASE),
> + HECI_H_CSR_RST, HECI_H_CSR_IG);
> + msleep(200);
> +
> + return;
> +}
> +
> +static void
> +wa_14015076503_end(struct xe_gt *gt)
> +{
> + if (!XE_WA(gt, 14015076503))
> + return;
> +
> + xe_mmio_rmw32(gt, HECI_H_GS1(MTL_GSC_HECI2_BASE),
> + HECI_H_GS1_ER_PREP, 0);
> +}
> +
> static int do_gt_reset(struct xe_gt *gt)
> {
> int err;
>
> + wa_14015076503_start(gt);
> +
> xe_mmio_write32(gt, GDRST, GRDOM_FULL);
> err = xe_mmio_wait32(gt, GDRST, GRDOM_FULL, 0, 5000, NULL, false);
> if (err)
> xe_gt_err(gt, "failed to clear GEN11_GRDOM_FULL (%pe)\n",
> ERR_PTR(err));
>
> + wa_14015076503_end(gt);
> +
> return err;
> }
>
> diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
> index f3ff774dc4aa..132c35497f74 100644
> --- a/drivers/gpu/drm/xe/xe_wa_oob.rules
> +++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
> @@ -19,3 +19,4 @@
> SUBPLATFORM(DG2, G12)
> 16017236439 PLATFORM(PVC)
> 22010954014 PLATFORM(DG2)
> +14015076503 MEDIA_VERSION(1300)
More information about the Intel-xe
mailing list