[Intel-xe] [CI 10/14] drm/xe/device: Introduce xe_device_probe_early
Michał Winiarski
michal.winiarski at intel.com
Tue Dec 5 01:14:14 UTC 2023
On Fri, Dec 01, 2023 at 03:28:15PM +0100, Michal Wajdeczko wrote:
>
>
> On 29.11.2023 22:45, Michał Winiarski wrote:
> > SR-IOV VF doesn't have access to MMIO registers used to determine
> > graphics/media ID. It can however communicate with GuC.
> > Introduce xe_device_probe_early, which initializes enough HW to use
> > MMIO GuC communication.
> > This will allow both VF and PF/native driver to have unified probe
> > ordering.
> >
> > Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
> > Reviewed-by: Matt Roper <matthew.d.roper at intel.com>
> > Reviewed-by: Matthew Brost <matthew.brost at intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_device.c | 22 ++++++++++++++++++----
> > drivers/gpu/drm/xe/xe_device.h | 5 +++++
> > drivers/gpu/drm/xe/xe_mmio.c | 16 ++++++++++------
> > drivers/gpu/drm/xe/xe_mmio.h | 1 +
> > drivers/gpu/drm/xe/xe_pci.c | 26 +++++++++++++++++++++-----
> > 5 files changed, 55 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > index 5e1f73c8c77ad..f4be4b13a506e 100644
> > --- a/drivers/gpu/drm/xe/xe_device.c
> > +++ b/drivers/gpu/drm/xe/xe_device.c
> > @@ -375,6 +375,24 @@ static int xe_set_dma_info(struct xe_device *xe)
> > return err;
> > }
> >
> > +/*
> > + * Initialize MMIO resources that don't require any knowledge about tile count.
> > + */
> > +int xe_device_probe_early(struct xe_device *xe)
> > +{
> > + int err;
> > +
> > + err = xe_mmio_init(xe);
> > + if (err)
> > + return err;
> > +
> > + err = xe_mmio_root_tile_init(xe);
> > + if (err)
> > + return err;
> > +
> > + return 0;
> > +}
> > +
> > int xe_device_probe(struct xe_device *xe)
> > {
> > struct xe_tile *tile;
> > @@ -393,10 +411,6 @@ int xe_device_probe(struct xe_device *xe)
> > if (err)
> > return err;
> >
> > - err = xe_mmio_init(xe);
> > - if (err)
> > - return err;
> > -
> > xe_mmio_probe_tiles(xe);
> >
> > err = drmm_add_action_or_reset(&xe->drm, xe_driver_flr_fini, xe);
> > diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
> > index 54694f98c91a2..3da83b2332063 100644
> > --- a/drivers/gpu/drm/xe/xe_device.h
> > +++ b/drivers/gpu/drm/xe/xe_device.h
> > @@ -37,6 +37,7 @@ static inline struct xe_device *ttm_to_xe_device(struct ttm_device *ttm)
> >
> > struct xe_device *xe_device_create(struct pci_dev *pdev,
> > const struct pci_device_id *ent);
> > +int xe_device_probe_early(struct xe_device *xe);
> > int xe_device_probe(struct xe_device *xe);
> > void xe_device_remove(struct xe_device *xe);
> > void xe_device_shutdown(struct xe_device *xe);
> > @@ -123,6 +124,10 @@ static inline bool xe_device_uc_enabled(struct xe_device *xe)
> > for ((id__) = 0; (id__) < (xe__)->info.tile_count; (id__)++) \
> > for_each_if((tile__) = &(xe__)->tiles[(id__)])
> >
> > +#define for_each_remote_tile(tile__, xe__, id__) \
> > + for ((id__) = 1; (id__) < (xe__)->info.tile_count; (id__)++) \
> > + for_each_if((tile__) = &(xe__)->tiles[(id__)])
> > +
> > /*
> > * FIXME: This only works for now since multi-tile and standalone media
> > * happen to be mutually exclusive. Future platforms may change this...
> > diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
> > index d1b59021c9712..6148c9da4f64e 100644
> > --- a/drivers/gpu/drm/xe/xe_mmio.c
> > +++ b/drivers/gpu/drm/xe/xe_mmio.c
> > @@ -15,10 +15,12 @@
> > #include "regs/xe_regs.h"
> > #include "xe_bo.h"
> > #include "xe_device.h"
> > +#include "xe_ggtt.h"
> > #include "xe_gt.h"
> > #include "xe_gt_mcr.h"
> > #include "xe_macros.h"
> > #include "xe_module.h"
> > +#include "xe_tile.h"
> >
> > #define XEHP_MTCFG_ADDR XE_REG(0x101800)
> > #define TILE_COUNT REG_GENMASK(15, 8)
> > @@ -376,10 +378,8 @@ static int xe_verify_lmem_ready(struct xe_device *xe)
> >
> > int xe_mmio_init(struct xe_device *xe)
> > {
> > - struct xe_tile *root_tile = xe_device_get_root_tile(xe);
> > struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> > const int mmio_bar = 0;
> > - int err;
> >
> > /*
> > * Map the entire BAR.
> > @@ -393,12 +393,16 @@ int xe_mmio_init(struct xe_device *xe)
> > return -EIO;
> > }
> >
> > - err = drmm_add_action_or_reset(&xe->drm, mmio_fini, xe);
> > - if (err)
> > - return err;
> > + return drmm_add_action_or_reset(&xe->drm, mmio_fini, xe);
> > +}
> > +
> > +int xe_mmio_root_tile_init(struct xe_device *xe)
> > +{
> > + struct xe_tile *root_tile = xe_device_get_root_tile(xe);
> > + int err;
> >
> > /* Setup first tile; other tiles (if present) will be setup later. */
> > - root_tile->mmio.size = xe->mmio.size;
> > + root_tile->mmio.size = SZ_16M;
> > root_tile->mmio.regs = xe->mmio.regs;
> >
> > err = xe_verify_lmem_ready(xe);
> > diff --git a/drivers/gpu/drm/xe/xe_mmio.h b/drivers/gpu/drm/xe/xe_mmio.h
> > index c054c27f6925d..98de5c13c89ba 100644
> > --- a/drivers/gpu/drm/xe/xe_mmio.h
> > +++ b/drivers/gpu/drm/xe/xe_mmio.h
> > @@ -21,6 +21,7 @@ struct xe_device;
> > #define LMEM_BAR 2
> >
> > int xe_mmio_init(struct xe_device *xe);
> > +int xe_mmio_root_tile_init(struct xe_device *xe);
> > void xe_mmio_probe_tiles(struct xe_device *xe);
> >
> > static inline u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg)
> > diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> > index d9a3b20179cc2..889f60fa2e7cf 100644
> > --- a/drivers/gpu/drm/xe/xe_pci.c
> > +++ b/drivers/gpu/drm/xe/xe_pci.c
> > @@ -540,10 +540,12 @@ static void handle_gmdid(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)
> > +static int xe_info_init_early(struct xe_device *xe,
> > + const struct xe_device_desc *desc,
> > + const struct xe_subplatform_desc *subplatform_desc)
> > {
> > + int err;
> > +
> > xe->info.platform = desc->platform;
> > xe->info.subplatform = subplatform_desc ?
> > subplatform_desc->subplatform : XE_SUBPLATFORM_NONE;
> > @@ -558,6 +560,12 @@ static void xe_info_init_early(struct xe_device *xe,
> > xe->info.enable_display = IS_ENABLED(CONFIG_DRM_XE_DISPLAY) &&
> > xe_modparam.enable_display &&
> > desc->has_display;
> > +
> > + err = xe_tile_init_early(xe_device_get_root_tile(xe), xe, 0);
> > + if (err)
> > + return err;
>
> why this is inside xe_info_init_early() ?
> can we call it separately, as xe_info_init_early() suggests that "info"
> will touched, while xe_tile_init_early() does much more
>
> as a bonus you will avoid changing signature of xe_info_init_early()
> from void to int
Before this change, it was called in xe_info_init() for all tiles.
After the change, root tile is initiaized in xe_info_init_early() where
as remote tiles get initialized in xe_info_init().
Both touch things outside of "info".
Note that xe_info_init() could be split further (and perhaps we would be
able to find a better place for root tile xe_tile_init_early then), but
I would prefer to avoid doing it as part of this series.
-Michał
>
> > +
> > + return 0;
> > }
> >
> > /*
> > @@ -626,13 +634,15 @@ static int xe_info_init(struct xe_device *xe,
> > */
> > xe->info.tile_count = 1 + graphics_desc->max_remote_tiles;
> >
> > - for_each_tile(tile, xe, id) {
> > + for_each_remote_tile(tile, xe, id) {
> > int err;
> >
> > err = xe_tile_init_early(tile, xe, id);
> > if (err)
> > return err;
> > + }
> >
> > + for_each_tile(tile, xe, id) {
> > gt = tile->primary_gt;
> > gt->info.id = xe->info.gt_count++;
> > gt->info.type = XE_GT_TYPE_MAIN;
> > @@ -726,10 +736,16 @@ 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);
> > + err = xe_info_init_early(xe, desc, subplatform_desc);
> > + if (err)
> > + return err;
> >
> > xe_sriov_probe_early(xe, desc->has_sriov);
> >
> > + err = xe_device_probe_early(xe);
> > + if (err)
> > + return err;
> > +
> > err = xe_info_init(xe, desc, subplatform_desc);
> > if (err)
> > return err;
More information about the Intel-xe
mailing list