[Intel-xe] [PATCH v3 18/20] drm/xe/guc: Allocate GuC data structures in system memory for initial load

Lucas De Marchi lucas.demarchi at intel.com
Mon Nov 20 20:20:22 UTC 2023


On Tue, Nov 14, 2023 at 02:02:29PM +0100, Michał Winiarski wrote:
>GuC load will need to happen at an earlier point in probe, where local
>memory is not yet available. Use system memory for GuC data structures
>used for initial "hwconfig" load, and realloc at a later,
>"post-hwconfig" load, when local memory is available.
>
>Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
>---
> drivers/gpu/drm/xe/xe_guc.c     | 45 +++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_guc_ads.c |  2 +-
> drivers/gpu/drm/xe/xe_guc_ct.c  |  2 +-
> drivers/gpu/drm/xe/xe_guc_log.c |  2 +-
> 4 files changed, 48 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
>index d1181ddf4bdae..3f430d5bc1051 100644
>--- a/drivers/gpu/drm/xe/xe_guc.c
>+++ b/drivers/gpu/drm/xe/xe_guc.c
>@@ -251,6 +251,45 @@ static void guc_fini(struct drm_device *drm, void *arg)
> 	xe_force_wake_put(gt_to_fw(guc_to_gt(guc)), XE_FORCEWAKE_ALL);
> }
>
>+static int __guc_bo_reinit(struct xe_guc *guc, struct xe_bo **src)
>+{
>+	struct xe_tile *tile = gt_to_tile(guc_to_gt(guc));
>+	struct xe_device *xe = guc_to_xe(guc);
>+	struct xe_bo *bo;
>+
>+	bo = xe_bo_create_from_data(xe, tile, &(*src)->vmap.vaddr, (*src)->size, ttm_bo_type_kernel,

in general we should not access a iosys_map like that. Maybe add an
assert above this line:

	xe_assert(xe, !(*src)->vmap.is_iomem);

>+				    XE_BO_CREATE_VRAM_IF_DGFX(tile));

humn... maybe we are missing a XE_BO_CREATE_VRAM(tile)?

Lucas De Marchi

>+	if (IS_ERR(bo))
>+		return PTR_ERR(bo);
>+
>+	xchg(src, bo);
>+	xe_bo_unpin_map_no_vm(bo);
>+
>+	return 0;
>+}
>+
>+static int xe_guc_realloc_post_hwconfig(struct xe_guc *guc)
>+{
>+	int ret;
>+
>+	if (!IS_DGFX(guc_to_xe(guc)))
>+		return 0;
>+
>+	ret = __guc_bo_reinit(guc, &guc->log.bo);
>+	if (ret)
>+		return ret;
>+
>+	ret = __guc_bo_reinit(guc, &guc->ads.bo);
>+	if (ret)
>+		return ret;
>+
>+	ret = __guc_bo_reinit(guc, &guc->ct.bo);
>+	if (ret)
>+		return ret;
>+
>+	return 0;
>+}
>+
> int xe_guc_init(struct xe_guc *guc)
> {
> 	struct xe_device *xe = guc_to_xe(guc);
>@@ -309,6 +348,12 @@ int xe_guc_init(struct xe_guc *guc)
>  */
> int xe_guc_init_post_hwconfig(struct xe_guc *guc)
> {
>+	int ret;
>+
>+	ret = xe_guc_realloc_post_hwconfig(guc);
>+	if (ret)
>+		return ret;
>+
> 	guc_init_params_post_hwconfig(guc);
>
> 	return xe_guc_ads_init_post_hwconfig(&guc->ads);
>diff --git a/drivers/gpu/drm/xe/xe_guc_ads.c b/drivers/gpu/drm/xe/xe_guc_ads.c
>index 88789826e7817..88514d09303d0 100644
>--- a/drivers/gpu/drm/xe/xe_guc_ads.c
>+++ b/drivers/gpu/drm/xe/xe_guc_ads.c
>@@ -282,7 +282,7 @@ int xe_guc_ads_init(struct xe_guc_ads *ads)
> 	bo = xe_bo_create_pin_map(xe, tile, NULL, guc_ads_size(ads) +
> 				  MAX_GOLDEN_LRC_SIZE,
> 				  ttm_bo_type_kernel,
>-				  XE_BO_CREATE_VRAM_IF_DGFX(tile) |
>+				  XE_BO_CREATE_SYSTEM_BIT |
> 				  XE_BO_CREATE_GGTT_BIT);
> 	if (IS_ERR(bo))
> 		return PTR_ERR(bo);
>diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
>index a84e111bb36ad..8f190cc0e5527 100644
>--- a/drivers/gpu/drm/xe/xe_guc_ct.c
>+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
>@@ -148,7 +148,7 @@ int xe_guc_ct_init(struct xe_guc_ct *ct)
>
> 	bo = xe_bo_create_pin_map(xe, tile, NULL, guc_ct_size(),
> 				  ttm_bo_type_kernel,
>-				  XE_BO_CREATE_VRAM_IF_DGFX(tile) |
>+				  XE_BO_CREATE_SYSTEM_BIT |
> 				  XE_BO_CREATE_GGTT_BIT);
> 	if (IS_ERR(bo))
> 		return PTR_ERR(bo);
>diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
>index 45c60a9c631c3..6334311a56e63 100644
>--- a/drivers/gpu/drm/xe/xe_guc_log.c
>+++ b/drivers/gpu/drm/xe/xe_guc_log.c
>@@ -93,7 +93,7 @@ int xe_guc_log_init(struct xe_guc_log *log)
>
> 	bo = xe_bo_create_pin_map(xe, tile, NULL, guc_log_size(),
> 				  ttm_bo_type_kernel,
>-				  XE_BO_CREATE_VRAM_IF_DGFX(tile) |
>+				  XE_BO_CREATE_SYSTEM_BIT |
> 				  XE_BO_CREATE_GGTT_BIT);
> 	if (IS_ERR(bo))
> 		return PTR_ERR(bo);
>-- 
>2.42.1
>


More information about the Intel-xe mailing list