xe_force_wake.o \
xe_ggtt.o \
xe_gpu_scheduler.o \
+ xe_gsc.o \
xe_gt.o \
xe_gt_clock.o \
xe_gt_debugfs.o \
--- /dev/null
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include "xe_gsc.h"
+
+#include "xe_device.h"
+#include "xe_gt.h"
+#include "xe_gt_printk.h"
+#include "xe_uc_fw.h"
+
+static struct xe_gt *
+gsc_to_gt(struct xe_gsc *gsc)
+{
+ return container_of(gsc, struct xe_gt, uc.gsc);
+}
+
+int xe_gsc_init(struct xe_gsc *gsc)
+{
+ struct xe_gt *gt = gsc_to_gt(gsc);
+ struct xe_tile *tile = gt_to_tile(gt);
+ int ret;
+
+ gsc->fw.type = XE_UC_FW_TYPE_GSC;
+
+ /* The GSC uC is only available on the media GT */
+ if (tile->media_gt && (gt != tile->media_gt)) {
+ xe_uc_fw_change_status(&gsc->fw, XE_UC_FIRMWARE_NOT_SUPPORTED);
+ return 0;
+ }
+
+ /*
+ * Some platforms can have GuC but not GSC. That would cause
+ * xe_uc_fw_init(gsc) to return a "not supported" failure code and abort
+ * all firmware loading. So check for GSC being enabled before
+ * propagating the failure back up. That way the higher level will keep
+ * going and load GuC as appropriate.
+ */
+ ret = xe_uc_fw_init(&gsc->fw);
+ if (!xe_uc_fw_is_enabled(&gsc->fw))
+ return 0;
+ else if (ret)
+ goto out;
+
+ return 0;
+
+out:
+ xe_gt_err(gt, "GSC init failed with %d", ret);
+ return ret;
+}
+
--- /dev/null
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_GSC_H_
+#define _XE_GSC_H_
+
+#include "xe_gsc_types.h"
+
+int xe_gsc_init(struct xe_gsc *gsc);
+
+#endif
--- /dev/null
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_GSC_TYPES_H_
+#define _XE_GSC_TYPES_H_
+
+#include "xe_uc_fw_types.h"
+
+/**
+ * struct xe_gsc - GSC
+ */
+struct xe_gsc {
+ /** @fw: Generic uC firmware management */
+ struct xe_uc_fw fw;
+};
+
+#endif
#include "xe_uc.h"
#include "xe_device.h"
+#include "xe_gsc.h"
#include "xe_gt.h"
#include "xe_guc.h"
#include "xe_guc_pc.h"
int ret;
/*
- * We call the GuC/HuC init functions even if GuC submission is off to
- * correctly move our tracking of the FW state to "disabled".
+ * We call the GuC/HuC/GSC init functions even if GuC submission is off
+ * to correctly move our tracking of the FW state to "disabled".
*/
ret = xe_guc_init(&uc->guc);
if (ret)
goto err;
+ ret = xe_gsc_init(&uc->gsc);
+ if (ret)
+ goto err;
+
if (!xe_device_uc_enabled(uc_to_xe(uc)))
return 0;
static struct xe_gt *
__uc_fw_to_gt(struct xe_uc_fw *uc_fw, enum xe_uc_fw_type type)
{
- if (type == XE_UC_FW_TYPE_GUC)
- return container_of(uc_fw, struct xe_gt, uc.guc.fw);
+ XE_WARN_ON(type >= XE_UC_FW_NUM_TYPES);
- XE_WARN_ON(type != XE_UC_FW_TYPE_HUC);
- return container_of(uc_fw, struct xe_gt, uc.huc.fw);
+ switch (type) {
+ case XE_UC_FW_TYPE_GUC:
+ return container_of(uc_fw, struct xe_gt, uc.guc.fw);
+ case XE_UC_FW_TYPE_HUC:
+ return container_of(uc_fw, struct xe_gt, uc.huc.fw);
+ case XE_UC_FW_TYPE_GSC:
+ return container_of(uc_fw, struct xe_gt, uc.gsc.fw);
+ default:
+ return NULL;
+ }
}
static struct xe_gt *uc_fw_to_gt(struct xe_uc_fw *uc_fw)
u32 count;
int i;
+ /*
+ * GSC FW support is still not fully in place, so we're not defining
+ * the FW blob yet because we don't want the driver to attempt to load
+ * it until we're ready for it.
+ */
+ if (uc_fw->type == XE_UC_FW_TYPE_GSC)
+ return;
+
xe_assert(xe, uc_fw->type < ARRAY_SIZE(blobs_all));
entries = blobs_all[uc_fw->type].entries;
count = blobs_all[uc_fw->type].count;
return "GuC";
case XE_UC_FW_TYPE_HUC:
return "HuC";
+ case XE_UC_FW_TYPE_GSC:
+ return "GSC";
+ default:
+ return "uC";
}
- return "uC";
}
static inline enum xe_uc_fw_status
enum xe_uc_fw_type {
XE_UC_FW_TYPE_GUC = 0,
- XE_UC_FW_TYPE_HUC
+ XE_UC_FW_TYPE_HUC,
+ XE_UC_FW_TYPE_GSC,
+ XE_UC_FW_NUM_TYPES
};
-#define XE_UC_FW_NUM_TYPES 2
/**
* struct xe_uc_fw_version - Version for XE micro controller firmware
#ifndef _XE_UC_TYPES_H_
#define _XE_UC_TYPES_H_
+#include "xe_gsc_types.h"
#include "xe_guc_types.h"
#include "xe_huc_types.h"
#include "xe_wopcm_types.h"
struct xe_guc guc;
/** @huc: HuC */
struct xe_huc huc;
+ /** @gsc: Graphics Security Controller */
+ struct xe_gsc gsc;
/** @wopcm: WOPCM */
struct xe_wopcm wopcm;
};