From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Matt Roper <matthew.d.roper@intel.com>, intel-gfx@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org,
Tvrtko Ursulin <tvrtko.ursulin@intel.com>,
Matthew Auld <matthew.auld@intel.com>,
Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>,
Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
Paulo Zanoni <paulo.r.zanoni@intel.com>,
Andi Shyti <andi.shyti@intel.com>,
Michal Wajdeczko <michal.wajdeczko@intel.com>
Subject: Re: [Intel-gfx] [PATCH v2 11/11] drm/i915/xehpsdv: Initialize multi-tiles
Date: Mon, 11 Oct 2021 08:51:37 +0100 [thread overview]
Message-ID: <0ea25648-2c43-b8fc-af1d-67bd47a492db@linux.intel.com> (raw)
In-Reply-To: <20211008233310.2034639-1-matthew.d.roper@intel.com>
On 09/10/2021 00:33, Matt Roper wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Check how many extra GT tiles are available on the system and setup
> register access for all of them. We can detect how may GT tiles are
> available by reading a register on the root tile. The same register
> returns the tile ID on all tiles.
>
> v2:
> - Include some additional refactor that didn't get squashed in properly
> on v1.
With v2 we should probably add Co-authored-by since, by a quick look,
seems half of the patch is no longer mine?
Regards,
Tvrtko
> Bspec: 33407
> Original-author: Abdiel Janulgue
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Andi Shyti <andi.shyti@intel.com>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 2 +-
> drivers/gpu/drm/i915/gt/intel_gt.c | 83 +++++++++++++++++++++--
> drivers/gpu/drm/i915/gt/intel_gt.h | 4 +-
> drivers/gpu/drm/i915/gt/intel_gt_types.h | 3 +
> drivers/gpu/drm/i915/i915_drv.h | 7 +-
> drivers/gpu/drm/i915/i915_pci.c | 40 +++++++++--
> drivers/gpu/drm/i915/i915_reg.h | 4 ++
> drivers/gpu/drm/i915/intel_device_info.h | 15 ++++
> 8 files changed, 145 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index 2ae57e4656a3..1d9fcf9572ca 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -525,7 +525,7 @@ static intel_engine_mask_t init_engine_mask(struct intel_gt *gt)
> u16 vdbox_mask;
> u16 vebox_mask;
>
> - info->engine_mask = INTEL_INFO(i915)->platform_engine_mask;
> + GEM_BUG_ON(!info->engine_mask);
>
> if (GRAPHICS_VER(i915) < 11)
> return info->engine_mask;
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/intel_gt.c
> index 6528d21e68eb..0879e30ace7c 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt.c
> +++ b/drivers/gpu/drm/i915/gt/intel_gt.c
> @@ -912,14 +912,17 @@ u32 intel_gt_read_register_fw(struct intel_gt *gt, i915_reg_t reg)
> return intel_uncore_read_fw(gt->uncore, reg);
> }
>
> -static int
> -tile_setup(struct intel_gt *gt, unsigned int id, phys_addr_t phys_addr)
> +int intel_tile_setup(struct intel_gt *gt, unsigned int id, phys_addr_t phys_addr)
> {
> struct drm_i915_private *i915 = gt->i915;
> struct intel_uncore *uncore;
> struct intel_uncore_mmio_debug *mmio_debug;
> int ret;
>
> + /* For Modern GENs size of GTTMMADR is 16MB (for each tile) */
> + if (GEM_WARN_ON(pci_resource_len(to_pci_dev(i915->drm.dev), 0) < (id + 1) * SZ_16M))
> + return -EINVAL;
> +
> if (id) {
> uncore = kzalloc(sizeof(*uncore), GFP_KERNEL);
> if (!uncore)
> @@ -943,6 +946,16 @@ tile_setup(struct intel_gt *gt, unsigned int id, phys_addr_t phys_addr)
> if (ret)
> return ret;
>
> + /* Which tile am I? default to zero on single tile systems */
> + if (HAS_REMOTE_TILES(i915)) {
> + u32 instance =
> + __raw_uncore_read32(gt->uncore, XEHPSDV_MTCFG_ADDR) &
> + TILE_NUMBER;
> +
> + if (GEM_WARN_ON(instance != id))
> + return -ENXIO;
> + }
> +
> gt->phys_addr = phys_addr;
>
> return 0;
> @@ -958,25 +971,87 @@ static void tile_cleanup(struct intel_gt *gt)
> }
> }
>
> +static unsigned int tile_count(struct drm_i915_private *i915)
> +{
> + u32 mtcfg;
> +
> + /*
> + * We use raw MMIO reads at this point since the
> + * MMIO vfuncs are not setup yet
> + */
> + mtcfg = __raw_uncore_read32(&i915->uncore, XEHPSDV_MTCFG_ADDR);
> + return REG_FIELD_GET(TILE_COUNT, mtcfg) + 1;
> +}
> +
> int intel_probe_gts(struct drm_i915_private *i915)
> {
> struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> + const struct intel_gt_definition *gtdef;
> + struct intel_gt *gt;
> phys_addr_t phys_addr;
> unsigned int mmio_bar;
> + unsigned int i, tiles;
> int ret;
>
> mmio_bar = GRAPHICS_VER(i915) == 2 ? 1 : 0;
> phys_addr = pci_resource_start(pdev, mmio_bar);
>
> /* We always have at least one primary GT on any device */
> - ret = tile_setup(&i915->gt, 0, phys_addr);
> + gt = &i915->gt;
> + gt->name = "Primary GT";
> + gt->info.engine_mask = INTEL_INFO(i915)->platform_engine_mask;
> +
> + drm_dbg(&i915->drm, "Setting up %s %u\n", gt->name, gt->info.id);
> + ret = intel_tile_setup(gt, 0, phys_addr);
> if (ret)
> return ret;
>
> i915->gts[0] = &i915->gt;
>
> - /* TODO: add more tiles */
> + tiles = tile_count(i915);
> + drm_dbg(&i915->drm, "Tile count: %u\n", tiles);
> +
> + for (gtdef = INTEL_INFO(i915)->extra_gts, i = 1;
> + gtdef && i < tiles;
> + gtdef++, i++) {
> + if (GEM_WARN_ON(i >= I915_MAX_GTS)) {
> + ret = -EINVAL;
> + goto err;
> + }
> +
> + gt = kzalloc(sizeof(*gt), GFP_KERNEL);
> + if (!gt) {
> + ret = -ENOMEM;
> + goto err;
> + }
> +
> + gt->i915 = i915;
> + gt->name = gtdef->name;
> + gt->type = gtdef->type;
> + gt->info.engine_mask = gtdef->engine_mask;
> + gt->info.id = i;
> +
> + drm_dbg(&i915->drm, "Setting up %s %u\n", gt->name, gt->info.id);
> + ret = intel_tile_setup(gt, i, phys_addr + gtdef->mapping_base);
> + if (ret)
> + goto err;
> +
> + i915->gts[i] = gt;
> + }
> +
> + i915->remote_tiles = tiles - 1;
> +
> return 0;
> +
> +err:
> + drm_err(&i915->drm, "Failed to initialize %s %u! (%d)\n", gtdef->name, i, ret);
> +
> + for_each_gt(i915, i, gt) {
> + tile_cleanup(gt);
> + i915->gts[i] = NULL;
> + }
> +
> + return ret;
> }
>
> int intel_gt_tiles_init(struct drm_i915_private *i915)
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt.h b/drivers/gpu/drm/i915/gt/intel_gt.h
> index f9dc55adfc4a..00d483db8eb1 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gt.h
> @@ -49,6 +49,8 @@ void intel_gt_driver_late_release(struct intel_gt *gt);
>
> int intel_gt_wait_for_idle(struct intel_gt *gt, long timeout);
>
> +int intel_tile_setup(struct intel_gt *gt, unsigned int id, phys_addr_t phys_addr);
> +
> void intel_gt_check_and_clear_faults(struct intel_gt *gt);
> void intel_gt_clear_error_registers(struct intel_gt *gt,
> intel_engine_mask_t engine_mask);
> @@ -90,7 +92,7 @@ void intel_gts_release(struct drm_i915_private *i915);
>
> #define for_each_gt(i915__, id__, gt__) \
> for ((id__) = 0; \
> - (id__) < I915_MAX_TILES; \
> + (id__) < I915_MAX_GTS; \
> (id__)++) \
> for_each_if (((gt__) = (i915__)->gts[(id__)]))
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> index 7311e485faae..345090e2bafd 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
> @@ -68,6 +68,9 @@ enum intel_submission_method {
>
> struct intel_gt {
> struct drm_i915_private *i915;
> + const char *name;
> + enum intel_gt_type type;
> +
> struct intel_uncore *uncore;
> struct i915_ggtt *ggtt;
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 3a26a21ffb3a..97920340b5e0 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -865,6 +865,8 @@ struct drm_i915_private {
> */
> resource_size_t stolen_usable_size; /* Total size minus reserved ranges */
>
> + unsigned int remote_tiles;
> +
> struct intel_uncore uncore;
> struct intel_uncore_mmio_debug mmio_debug;
>
> @@ -1196,8 +1198,8 @@ struct drm_i915_private {
> /*
> * i915->gts[0] == &i915->gt
> */
> -#define I915_MAX_TILES 4
> - struct intel_gt *gts[I915_MAX_TILES];
> +#define I915_MAX_GTS 4
> + struct intel_gt *gts[I915_MAX_GTS];
>
> struct {
> struct i915_gem_contexts {
> @@ -1724,6 +1726,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
>
> #define HAS_REGION(i915, i) (INTEL_INFO(i915)->memory_regions & (i))
> #define HAS_LMEM(i915) HAS_REGION(i915, REGION_LMEM)
> +#define HAS_REMOTE_TILES(dev_priv) (INTEL_INFO(dev_priv)->has_remote_tiles)
>
> #define HAS_GT_UC(dev_priv) (INTEL_INFO(dev_priv)->has_gt_uc)
>
> diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
> index 169837de395d..2fd45321318a 100644
> --- a/drivers/gpu/drm/i915/i915_pci.c
> +++ b/drivers/gpu/drm/i915/i915_pci.c
> @@ -29,6 +29,7 @@
>
> #include "i915_drv.h"
> #include "i915_pci.h"
> +#include "gt/intel_gt.h"
>
> #define PLATFORM(x) .platform = (x)
> #define GEN(x) \
> @@ -1008,6 +1009,37 @@ static const struct intel_device_info adl_p_info = {
> .media_ver = 12, \
> .media_rel = 50
>
> +#define XE_HP_SDV_ENGINES \
> + BIT(BCS0) | \
> + BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) | \
> + BIT(VCS0) | BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | \
> + BIT(VCS4) | BIT(VCS5) | BIT(VCS6) | BIT(VCS7)
> +
> +static const struct intel_gt_definition xehp_sdv_gts[] = {
> + {
> + .type = GT_TILE,
> + .name = "Remote Tile GT",
> + .mapping_base = SZ_16M,
> + .engine_mask = XE_HP_SDV_ENGINES,
> +
> + },
> + {
> + .type = GT_TILE,
> + .name = "Remote Tile GT",
> + .mapping_base = SZ_16M * 2,
> + .engine_mask = XE_HP_SDV_ENGINES,
> +
> + },
> + {
> + .type = GT_TILE,
> + .name = "Remote Tile GT",
> + .mapping_base = SZ_16M * 3,
> + .engine_mask = XE_HP_SDV_ENGINES,
> +
> + },
> + {}
> +};
> +
> __maybe_unused
> static const struct intel_device_info xehpsdv_info = {
> XE_HP_FEATURES,
> @@ -1015,12 +1047,10 @@ static const struct intel_device_info xehpsdv_info = {
> DGFX_FEATURES,
> PLATFORM(INTEL_XEHPSDV),
> .display = { },
> + .extra_gts = xehp_sdv_gts,
> + .has_remote_tiles = 1,
> .pipe_mask = 0,
> - .platform_engine_mask =
> - BIT(RCS0) | BIT(BCS0) |
> - BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) |
> - BIT(VCS0) | BIT(VCS1) | BIT(VCS2) | BIT(VCS3) |
> - BIT(VCS4) | BIT(VCS5) | BIT(VCS6) | BIT(VCS7),
> + .platform_engine_mask = XE_HP_SDV_ENGINES,
> .require_force_probe = 1,
> };
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index a897f4abea0c..5d13c19e14aa 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -12477,6 +12477,10 @@ enum skl_power_gate {
>
> #define GEN12_GLOBAL_MOCS(i) _MMIO(0x4000 + (i) * 4) /* Global MOCS regs */
>
> +#define XEHPSDV_MTCFG_ADDR _MMIO(0x101800)
> +#define TILE_COUNT REG_GENMASK(15, 8)
> +#define TILE_NUMBER REG_GENMASK(7, 0)
> +
> #define GEN12_GSMBASE _MMIO(0x108100)
> #define GEN12_DSMBASE _MMIO(0x1080C0)
>
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index 8e6f48d1eb7b..e0b8758b4085 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -136,6 +136,7 @@ enum intel_ppgtt_type {
> func(has_pxp); \
> func(has_rc6); \
> func(has_rc6p); \
> + func(has_remote_tiles); \
> func(has_rps); \
> func(has_runtime_pm); \
> func(has_snoop); \
> @@ -166,6 +167,18 @@ enum intel_ppgtt_type {
> func(overlay_needs_physical); \
> func(supports_tv);
>
> +enum intel_gt_type {
> + GT_PRIMARY,
> + GT_TILE,
> +};
> +
> +struct intel_gt_definition {
> + enum intel_gt_type type;
> + char *name;
> + u32 mapping_base;
> + intel_engine_mask_t engine_mask;
> +};
> +
> struct intel_device_info {
> u8 graphics_ver;
> u8 graphics_rel;
> @@ -185,6 +198,8 @@ struct intel_device_info {
>
> u32 memory_regions; /* regions supported by the HW */
>
> + const struct intel_gt_definition *extra_gts;
> +
> u32 display_mmio_offset;
>
> u8 gt; /* GT number, 0 if undefined */
>
next prev parent reply other threads:[~2021-10-11 7:51 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-08 21:56 [Intel-gfx] [PATCH 00/11] i915: Initial multi-tile support Matt Roper
2021-10-08 21:56 ` [Intel-gfx] [PATCH 01/11] drm/i915: rework some irq functions to take intel_gt as argument Matt Roper
2021-10-27 6:22 ` Lucas De Marchi
2021-10-28 14:13 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 02/11] drm/i915: split general MMIO setup from per-GT uncore init Matt Roper
2021-10-27 6:26 ` Lucas De Marchi
2021-10-28 14:17 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 03/11] drm/i915: Restructure probe to handle multi-tile platforms Matt Roper
2021-10-13 12:12 ` Jani Nikula
2021-10-27 6:57 ` Lucas De Marchi
2021-10-27 7:58 ` Jani Nikula
2021-10-08 21:56 ` [Intel-gfx] [PATCH 04/11] drm/i915: Store backpointer to GT in uncore Matt Roper
2021-10-28 14:26 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 05/11] drm/i915: Prepare for multiple gts Matt Roper
2021-10-27 7:01 ` Lucas De Marchi
2021-10-08 21:56 ` [Intel-gfx] [PATCH 06/11] drm/i915: Initial support for per-tile uncore Matt Roper
2021-10-28 15:41 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 07/11] drm/i915/xehp: Determine which tile raised an interrupt Matt Roper
2021-10-08 23:48 ` Matt Roper
2021-10-13 0:55 ` Andi Shyti
2021-10-27 7:13 ` Lucas De Marchi
2021-10-08 21:56 ` [Intel-gfx] [PATCH 08/11] drm/i915/xehp: Make IRQ reset and postinstall multi-tile aware Matt Roper
2021-10-28 16:30 ` Andi Shyti
2021-10-28 23:20 ` Matt Roper
2021-10-29 0:16 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 09/11] drm/i915/guc: Update CT debug macro for multi-tile Matt Roper
2021-10-08 21:56 ` [Intel-gfx] [PATCH 10/11] drm/i915: Release per-gt resources allocated Matt Roper
2021-10-28 16:33 ` Andi Shyti
2021-10-08 21:56 ` [Intel-gfx] [PATCH 11/11] drm/i915/xehpsdv: Initialize multi-tiles Matt Roper
2021-10-08 23:33 ` [Intel-gfx] [PATCH v2 " Matt Roper
2021-10-11 7:51 ` Tvrtko Ursulin [this message]
2021-10-12 23:11 ` Andi Shyti
2021-10-08 22:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for i915: Initial multi-tile support Patchwork
2021-10-08 23:01 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-10-09 0:05 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for i915: Initial multi-tile support (rev2) Patchwork
2021-10-09 0:36 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2021-10-09 2:54 ` [Intel-gfx] ✗ Fi.CI.IGT: failure for i915: Initial multi-tile support Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0ea25648-2c43-b8fc-af1d-67bd47a492db@linux.intel.com \
--to=tvrtko.ursulin@linux.intel.com \
--cc=andi.shyti@intel.com \
--cc=daniele.ceraolospurio@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=joonas.lahtinen@linux.intel.com \
--cc=matthew.auld@intel.com \
--cc=matthew.d.roper@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=paulo.r.zanoni@intel.com \
--cc=tvrtko.ursulin@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox