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

Michał Winiarski michal.winiarski at intel.com
Tue Nov 21 13:42:20 UTC 2023


On Mon, Nov 20, 2023 at 02:20:22PM -0600, Lucas De Marchi wrote:
> 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);

Makes sense - I'll add the assert.

> 
> > +				    XE_BO_CREATE_VRAM_IF_DGFX(tile));
> 

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

It's only called for "IS_DGFX", so I think we're fine for now.

Thanks,
-Michał

> 
> 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