Commit 4f5ee007 authored by Michał Winiarski's avatar Michał Winiarski Committed by Rodrigo Vivi
Browse files

drm/xe: Split xe_info_init



Parts of xe_info_init are only dealing with processing driver_data.
Extract it into xe_info_init_early to be able to use it earlier during
probe.

Signed-off-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent a754391f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -143,7 +143,8 @@ int xe_pci_fake_device_init(struct xe_device *xe, enum xe_platform platform,
		return -ENODEV;

done:
	xe_info_init(xe, desc, subplatform_desc);
	xe_info_init_early(xe, desc, subplatform_desc);
	xe_info_init(xe, desc->graphics, desc->media);

	return 0;
}
+46 −32
Original line number Diff line number Diff line
@@ -473,16 +473,13 @@ static void peek_gmdid(struct xe_device *xe, u32 gmdid_offset, u32 *ver, u32 *re
 * media is optional.
 */
static void handle_pre_gmdid(struct xe_device *xe,
			     const struct xe_device_desc *desc,
			     const struct xe_graphics_desc **graphics,
			     const struct xe_media_desc **media)
			     const struct xe_graphics_desc *graphics,
			     const struct xe_media_desc *media)
{
	*graphics = desc->graphics;
	xe->info.graphics_verx100 = (*graphics)->ver * 100 + (*graphics)->rel;
	xe->info.graphics_verx100 = graphics->ver * 100 + graphics->rel;

	*media = desc->media;
	if (*media)
		xe->info.media_verx100 = (*media)->ver * 100 + (*media)->rel;
	if (media)
		xe->info.media_verx100 = media->ver * 100 + media->rel;

}

@@ -491,7 +488,6 @@ static void handle_pre_gmdid(struct xe_device *xe,
 * based on the result.
 */
static void handle_gmdid(struct xe_device *xe,
			 const struct xe_device_desc *desc,
			 const struct xe_graphics_desc **graphics,
			 const struct xe_media_desc **media,
			 u32 *graphics_revid,
@@ -535,32 +531,59 @@ static void handle_gmdid(struct xe_device *xe,
	}
}

static int xe_info_init(struct xe_device *xe,
/*
 * Initialize device info content that only depends on static driver_data
 * passed to the driver at probe time from PCI ID table.
 */
static void xe_info_init_early(struct xe_device *xe,
			       const struct xe_device_desc *desc,
			       const struct xe_subplatform_desc *subplatform_desc)
{
	const struct xe_graphics_desc *graphics_desc = NULL;
	const struct xe_media_desc *media_desc = NULL;
	xe->info.platform = desc->platform;
	xe->info.subplatform = subplatform_desc ?
		subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;

	xe->info.is_dgfx = desc->is_dgfx;
	xe->info.has_heci_gscfi = desc->has_heci_gscfi;
	xe->info.has_llc = desc->has_llc;
	xe->info.has_sriov = desc->has_sriov;
	xe->info.skip_mtcfg = desc->skip_mtcfg;
	xe->info.skip_pcode = desc->skip_pcode;
	xe->info.supports_mmio_ext = desc->supports_mmio_ext;
	xe->info.skip_guc_pc = desc->skip_guc_pc;

	xe->info.enable_display = IS_ENABLED(CONFIG_DRM_XE_DISPLAY) &&
				  xe_modparam.enable_display &&
				  desc->has_display;
}

/*
 * Initialize device info content that does require knowledge about
 * graphics / media IP version.
 * Make sure that GT / tile structures allocated by the driver match the data
 * present in device info.
 */
static int xe_info_init(struct xe_device *xe,
			const struct xe_graphics_desc *graphics_desc,
			const struct xe_media_desc *media_desc)
{
	u32 graphics_gmdid_revid = 0, media_gmdid_revid = 0;
	struct xe_tile *tile;
	struct xe_gt *gt;
	u8 id;

	xe->info.platform = desc->platform;
	xe->info.subplatform = subplatform_desc ?
		subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;

	/*
	 * If this platform supports GMD_ID, we'll detect the proper IP
	 * descriptor to use from hardware registers. desc->graphics will only
	 * ever be set at this point for platforms before GMD_ID. In that case
	 * the IP descriptions and versions are simply derived from that.
	 */
	if (desc->graphics) {
		handle_pre_gmdid(xe, desc, &graphics_desc, &media_desc);
	if (graphics_desc) {
		handle_pre_gmdid(xe, graphics_desc, media_desc);
		xe->info.step = xe_step_pre_gmdid_get(xe);
	} else {
		handle_gmdid(xe, desc, &graphics_desc, &media_desc,
		xe_assert(xe, !media_desc);
		handle_gmdid(xe, &graphics_desc, &media_desc,
			     &graphics_gmdid_revid, &media_gmdid_revid);
		xe->info.step = xe_step_gmdid_get(xe,
						  graphics_gmdid_revid,
@@ -575,15 +598,8 @@ static int xe_info_init(struct xe_device *xe,
	if (!graphics_desc)
		return -ENODEV;

	xe->info.is_dgfx = desc->is_dgfx;
	xe->info.has_heci_gscfi = desc->has_heci_gscfi;
	xe->info.graphics_name = graphics_desc->name;
	xe->info.media_name = media_desc ? media_desc->name : "none";
	xe->info.has_llc = desc->has_llc;
	xe->info.has_sriov = desc->has_sriov;
	xe->info.skip_mtcfg = desc->skip_mtcfg;
	xe->info.skip_pcode = desc->skip_pcode;
	xe->info.supports_mmio_ext = desc->supports_mmio_ext;
	xe->info.tile_mmio_ext_size = graphics_desc->tile_mmio_ext_size;

	xe->info.dma_mask_size = graphics_desc->dma_mask_size;
@@ -594,11 +610,7 @@ static int xe_info_init(struct xe_device *xe,
	xe->info.has_asid = graphics_desc->has_asid;
	xe->info.has_flat_ccs = graphics_desc->has_flat_ccs;
	xe->info.has_range_tlb_invalidation = graphics_desc->has_range_tlb_invalidation;
	xe->info.skip_guc_pc = desc->skip_guc_pc;

	xe->info.enable_display = IS_ENABLED(CONFIG_DRM_XE_DISPLAY) &&
				  xe_modparam.enable_display &&
				  desc->has_display;
	/*
	 * All platforms have at least one primary GT.  Any platform with media
	 * version 13 or higher has an additional dedicated media GT.  And
@@ -711,9 +723,11 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)

	pci_set_master(pdev);

	xe_info_init_early(xe, desc, subplatform_desc);

	xe_sriov_probe_early(xe, desc->has_sriov);

	err = xe_info_init(xe, desc, subplatform_desc);
	err = xe_info_init(xe, desc->graphics, desc->media);
	if (err)
		return err;