[Intel-xe] [PATCH 6/6] drm/xe: Select graphics/media descriptors from GMD_ID
Balasubramani Vivekanandan
balasubramani.vivekanandan at intel.com
Wed Apr 5 13:32:08 UTC 2023
On 03.04.2023 13:17, Matt Roper wrote:
> Hook up dummy graphics_desc and media_desc structures on platforms that
> use GMD_ID. When such a platform is probed, the IP version will be read
> from the hardware's GMD_ID registers and that version number will be
> used to select a graphics/media descriptor with the appropriate settings
> for the detected IP.
>
> If a GMD_ID platform reports a graphics version the driver does not
> recognize and support, device probe will be aborted. If an unrecognized
> media version is reported the device probe will leave media
> uninitialized and continue.
>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
> drivers/gpu/drm/xe/regs/xe_gt_regs.h | 6 +
> drivers/gpu/drm/xe/xe_pci.c | 161 +++++++++++++++++++++------
> 2 files changed, 136 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> index f45251df5715..2d265dbb7651 100644
> --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> @@ -22,6 +22,12 @@
> #define FORCEWAKE_ACK_MEDIA_VDBOX_GEN11(n) _MMIO(0xd50 + (n) * 4)
> #define FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(n) _MMIO(0xd70 + (n) * 4)
> #define FORCEWAKE_ACK_RENDER_GEN9 _MMIO(0xd84)
> +
> +#define GMD_ID _MMIO(0xd8c)
> +#define GMD_ID_ARCH_MASK REG_GENMASK(31, 22)
> +#define GMD_ID_RELEASE_MASK REG_GENMASK(21, 14)
> +#define GMD_ID_STEP REG_GENMASK(5, 0)
> +
> #define FORCEWAKE_ACK_GT_MTL _MMIO(0xdfc)
>
> #define GEN9_LNCFCMOCS(i) _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index d634e781858a..62685b14257b 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -15,6 +15,7 @@
> #include <drm/xe_pciids.h>
>
> #include "regs/xe_regs.h"
> +#include "regs/xe_gt_regs.h"
> #include "xe_device.h"
> #include "xe_display.h"
> #include "xe_drv.h"
> @@ -99,6 +100,14 @@ __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
>
> #define NOP(x) x
>
> +static const struct xe_graphics_desc graphics_gmdid = {
> + /*
> + * Unset graphics version implies GMD_ID support; driver will read
> + * the IP version from hardware and then select a more appropriate
> + * graphics descriptor.
> + */
> +};
> +
> static const struct xe_graphics_desc graphics_xelp = {
> .ver = 12,
> .rel = 0,
> @@ -164,9 +173,6 @@ static const struct xe_graphics_desc graphics_xehpc = {
> };
>
> static const struct xe_graphics_desc graphics_xelpg = {
> - .ver = 12,
> - .rel = 70,
> -
> .hw_engine_mask =
> BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0) |
> BIT(XE_HW_ENGINE_CCS0),
> @@ -175,6 +181,14 @@ static const struct xe_graphics_desc graphics_xelpg = {
> .has_flat_ccs = 0,
> };
>
> +static const struct xe_media_desc media_gmdid = {
> + /*
> + * Unset graphics version implies GMD_ID support; driver will read
> + * the IP version from hardware and then select a more appropriate
> + * media descriptor.
> + */
> +};
> +
> static const struct xe_media_desc media_xelp = {
> .ver = 12,
> .rel = 0,
> @@ -194,9 +208,6 @@ static const struct xe_media_desc media_xehpm = {
> };
>
> static const struct xe_media_desc media_xelpmp = {
> - .ver = 13,
> - .rel = 0,
> -
> .hw_engine_mask =
> BIT(XE_HW_ENGINE_VCS0) | BIT(XE_HW_ENGINE_VCS2) |
> BIT(XE_HW_ENGINE_VECS0), /* TODO: add GSC0 */
> @@ -298,12 +309,8 @@ static const struct xe_gt_desc xelpmp_gts[] = {
> };
>
> static const struct xe_device_desc mtl_desc = {
> - /*
> - * FIXME: Real graphics/media IP will be mapped from hardware
> - * GMD_ID register. Hardcoded assignments here will go away soon.
> - */
> - .graphics = &graphics_xelpg,
> - .media = &media_xelpmp,
> + .graphics = &graphics_gmdid,
> + .media = &media_gmdid,
What's the need to assign a dummy structure instead or assigning a NULL?
Regards,
Bala
> .require_force_probe = true,
> PLATFORM(XE_METEORLAKE),
> .extra_gts = xelpmp_gts,
> @@ -414,9 +421,91 @@ static void xe_pci_remove(struct pci_dev *pdev)
> pci_set_drvdata(pdev, NULL);
> }
>
> +static u32 peek_gmdid(struct xe_device *xe, u32 gmdid_offset)
> +{
> + struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> + void __iomem *map = pci_iomap_range(pdev, 0, gmdid_offset, sizeof(u32));
> + u32 ver;
> +
> + if (!map) {
> + drm_err(&xe->drm, "Failed to read GMD_ID (%#x) from PCI BAR.\n",
> + gmdid_offset);
> + return 0;
> + }
> +
> + ver = ioread32(map);
> + pci_iounmap(pdev, map);
> +
> + return REG_FIELD_GET(GMD_ID_ARCH_MASK, ver) * 100 +
> + REG_FIELD_GET(GMD_ID_RELEASE_MASK, ver);
> +}
> +
> +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 ver;
> +
> + if (desc->graphics->ver) {
> + /*
> + * Pre-GMD_ID platform; device descriptor already points to
> + * the appropriate graphics descriptor.
> + */
> + *graphics = desc->graphics;
> + xe->info.graphics_verx100 = (*graphics)->ver * 100 + (*graphics)->rel;
> + } else {
> + /*
> + * GMD_ID platform; read IP version from hardware and select
> + * graphics descriptor based on the result.
> + */
> + ver = peek_gmdid(xe, GMD_ID.reg);
> + switch (ver) {
> + case 1270:
> + case 1271:
> + *graphics = &graphics_xelpg;
> + xe->info.graphics_verx100 = ver;
> + break;
> + default:
> + drm_err(&xe->drm, "Hardware reports unknown graphics version %u.%02u\n",
> + ver / 100, ver % 100);
> + }
> + }
> +
> + if (!desc->media)
> + /* No media support at all */
> + return;
> +
> + if (desc->media && desc->media->ver) {
> + /*
> + * Pre-GMD_ID platform; device descriptor already points to
> + * the appropriate media descriptor.
> + */
> + *media = desc->media;
> + xe->info.media_verx100 = (*media)->ver * 100 + (*media)->rel;
> + } else {
> + /*
> + * GMD_ID platform; read IP version from hardware and select
> + * media descriptor based on the result.
> + */
> + ver = peek_gmdid(xe, GMD_ID.reg + 0x380000);
> + switch (ver) {
> + case 1300:
> + *media = &media_xelpmp;
> + xe->info.media_verx100 = ver;
> + break;
> + default:
> + drm_err(&xe->drm, "Hardware reports unknown media version %u.%02u\n",
> + ver / 100, ver % 100);
> + }
> + }
> +}
> +
> static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> {
> const struct xe_device_desc *desc = (void *)ent->driver_data;
> + const struct xe_graphics_desc *graphics_desc = NULL;
> + const struct xe_media_desc *media_desc = NULL;
> const struct xe_subplatform_desc *spd;
> struct xe_device *xe;
> struct xe_gt *gt;
> @@ -445,22 +534,32 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> if (IS_ERR(xe))
> return PTR_ERR(xe);
>
> - xe->info.graphics_verx100 = desc->graphics->ver * 100 +
> - desc->graphics->rel;
> - if (desc->media)
> - xe->info.media_verx100 = desc->media->ver * 100 +
> - desc->media->rel;
> + /*
> + * If this platform supports GMD_ID, we'll detect the proper IP
> + * descriptor to use from hardware registers.
> + */
> + handle_gmdid(xe, desc, &graphics_desc, &media_desc);
> +
> + /*
> + * If we couldn't detect the graphics IP, that's considered a fatal
> + * error and we should abort driver load. Failing to detect media
> + * IP is non-fatal; we'll just proceed without enabling media support.
> + */
> + if (!graphics_desc)
> + return -ENODEV;
> +
> xe->info.is_dgfx = desc->is_dgfx;
> xe->info.platform = desc->platform;
> - xe->info.dma_mask_size = desc->graphics->dma_mask_size;
> - xe->info.vram_flags = desc->graphics->vram_flags;
> - xe->info.vm_max_level = desc->graphics->vm_max_level;
> - xe->info.supports_usm = desc->graphics->supports_usm;
> - xe->info.has_asid = desc->graphics->has_asid;
> - xe->info.has_flat_ccs = desc->graphics->has_flat_ccs;
> xe->info.has_4tile = desc->has_4tile;
> - xe->info.has_range_tlb_invalidation = desc->graphics->has_range_tlb_invalidation;
> - xe->info.has_link_copy_engine = desc->graphics->has_link_copy_engine;
> +
> + xe->info.dma_mask_size = graphics_desc->dma_mask_size;
> + xe->info.vram_flags = graphics_desc->vram_flags;
> + xe->info.vm_max_level = graphics_desc->vm_max_level;
> + xe->info.supports_usm = graphics_desc->supports_usm;
> + 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.has_link_copy_engine = graphics_desc->has_link_copy_engine;
>
> /*
> * All platforms have at least one primary GT. Any platform with media
> @@ -471,7 +570,7 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> * FIXME: 'tile_count' here is misnamed since the rest of the driver
> * treats it as the number of GTs rather than just the number of tiles.
> */
> - xe->info.tile_count = 1 + desc->graphics->max_remote_tiles;
> + xe->info.tile_count = 1 + graphics_desc->max_remote_tiles;
> if (MEDIA_VER(xe) >= 13)
> xe->info.tile_count++;
>
> @@ -488,9 +587,9 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> gt->info.type = XE_GT_TYPE_MAIN;
> gt->info.vram_id = id;
>
> - gt->info.__engine_mask = desc->graphics->hw_engine_mask;
> - if (MEDIA_VER(xe) < 13 && desc->media)
> - gt->info.__engine_mask |= desc->media->hw_engine_mask;
> + gt->info.__engine_mask = graphics_desc->hw_engine_mask;
> + if (MEDIA_VER(xe) < 13 && media_desc)
> + gt->info.__engine_mask |= media_desc->hw_engine_mask;
>
> gt->mmio.adj_limit = 0;
> gt->mmio.adj_offset = 0;
> @@ -498,8 +597,8 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> gt->info.type = desc->extra_gts[id - 1].type;
> gt->info.vram_id = desc->extra_gts[id - 1].vram_id;
> gt->info.__engine_mask = (gt->info.type == XE_GT_TYPE_MEDIA) ?
> - desc->media->hw_engine_mask :
> - desc->graphics->hw_engine_mask;
> + media_desc->hw_engine_mask :
> + graphics_desc->hw_engine_mask;
> gt->mmio.adj_limit =
> desc->extra_gts[id - 1].mmio_adj_limit;
> gt->mmio.adj_offset =
> --
> 2.39.2
>
More information about the Intel-xe
mailing list