From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v2 11/15] drm/i915: Split the smem and lmem plane readout apart
Date: Tue, 19 Dec 2023 14:47:21 +0200 [thread overview]
Message-ID: <ZYGQ2dsNixUQsTXa@intel.com> (raw)
In-Reply-To: <3c8692ea-ca7a-4a1b-8cdc-6128538a3375@intel.com>
On Tue, Dec 19, 2023 at 11:55:01AM +0100, Andrzej Hajda wrote:
> On 15.12.2023 11:59, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Declutter initial_plane_vma() a bit by pulling the lmem and smem
> > readout paths into their own functions.
> >
> > TODO: the smem path should still be fixed to get and validate
> > the dma address from the pte as well
> >
> > Cc: Paz Zcharya <pazz@chromium.org>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> I am not sure about this split, split suggests the paths significantly
> differs, but they differ just by 2 things:
> - mem region,
> - assumption about 1:1 mapping for older platforms.
That last one is a fairly major difference which needs
actual work since the PTEs will have a different layouts.
There's the obvious 8byte vs. 4byte difference for gen8+
vs. older, and also there are several variants of 4byte
PTEs (don't recall off the top of my head how many exactly).
>
> Btw I was wondering if wouldn't be good to abstract out pte retrieval,
> as the pattern "ggtt->gsm + offset / I915_GTT_PAGE_SIZE" is present in
> multiple places and depends on hw gen, but maybe it is another patch.
Yeah, I think I'd just prefer the gem/gt code provide a
function we can call with the ggtt address, and it'll spit
out the dma address for us. And if we want to go for belts
and suspenders we could also have it validate that the
dma addresses are contiguous.
But once we have that we should probably be able to collapse
this into just the single codepath.
>
> No strong feelings.
> Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
>
> Regards
> Andrzej
>
>
> Regards
> Andrzej
>
>
>
>
> > ---
> > .../drm/i915/display/intel_display_types.h | 2 +
> > .../drm/i915/display/intel_plane_initial.c | 145 +++++++++++-------
> > 2 files changed, 95 insertions(+), 52 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 341d80c2b9de..d2b0cc754667 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -782,6 +782,8 @@ struct intel_plane_state {
> >
> > struct intel_initial_plane_config {
> > struct intel_framebuffer *fb;
> > + struct intel_memory_region *mem;
> > + resource_size_t phys_base;
> > struct i915_vma *vma;
> > unsigned int tiling;
> > int size;
> > diff --git a/drivers/gpu/drm/i915/display/intel_plane_initial.c b/drivers/gpu/drm/i915/display/intel_plane_initial.c
> > index 48b74319f45c..78bff6181ceb 100644
> > --- a/drivers/gpu/drm/i915/display/intel_plane_initial.c
> > +++ b/drivers/gpu/drm/i915/display/intel_plane_initial.c
> > @@ -44,6 +44,93 @@ intel_reuse_initial_plane_obj(struct drm_i915_private *i915,
> > return false;
> > }
> >
> > +static bool
> > +initial_plane_phys_lmem(struct drm_i915_private *i915,
> > + struct intel_initial_plane_config *plane_config)
> > +{
> > + gen8_pte_t __iomem *gte = to_gt(i915)->ggtt->gsm;
> > + struct intel_memory_region *mem;
> > + dma_addr_t dma_addr;
> > + gen8_pte_t pte;
> > + u32 base;
> > +
> > + base = round_down(plane_config->base, I915_GTT_MIN_ALIGNMENT);
> > +
> > + gte += base / I915_GTT_PAGE_SIZE;
> > +
> > + pte = ioread64(gte);
> > + if (!(pte & GEN12_GGTT_PTE_LM)) {
> > + drm_err(&i915->drm,
> > + "Initial plane programming missing PTE_LM bit\n");
> > + return false;
> > + }
> > +
> > + dma_addr = pte & GEN12_GGTT_PTE_ADDR_MASK;
> > +
> > + if (IS_DGFX(i915))
> > + mem = i915->mm.regions[INTEL_REGION_LMEM_0];
> > + else
> > + mem = i915->mm.stolen_region;
> > + if (!mem) {
> > + drm_dbg_kms(&i915->drm,
> > + "Initial plane memory region not initialized\n");
> > + return false;
> > + }
> > +
> > + /*
> > + * On lmem we don't currently expect this to
> > + * ever be placed in the stolen portion.
> > + */
> > + if (dma_addr < mem->region.start || dma_addr > mem->region.end) {
> > + drm_err(&i915->drm,
> > + "Initial plane programming using invalid range, dma_addr=%pa (%s [%pa-%pa])\n",
> > + &dma_addr, mem->region.name, &mem->region.start, &mem->region.end);
> > + return false;
> > + }
> > +
> > + drm_dbg(&i915->drm,
> > + "Using dma_addr=%pa, based on initial plane programming\n",
> > + &dma_addr);
> > +
> > + plane_config->phys_base = dma_addr - mem->region.start;
> > + plane_config->mem = mem;
> > +
> > + return true;
> > +}
> > +
> > +static bool
> > +initial_plane_phys_smem(struct drm_i915_private *i915,
> > + struct intel_initial_plane_config *plane_config)
> > +{
> > + struct intel_memory_region *mem;
> > + u32 base;
> > +
> > + base = round_down(plane_config->base, I915_GTT_MIN_ALIGNMENT);
> > +
> > + mem = i915->mm.stolen_region;
> > + if (!mem) {
> > + drm_dbg_kms(&i915->drm,
> > + "Initial plane memory region not initialized\n");
> > + return false;
> > + }
> > +
> > + /* FIXME get and validate the dma_addr from the PTE */
> > + plane_config->phys_base = base;
> > + plane_config->mem = mem;
> > +
> > + return true;
> > +}
> > +
> > +static bool
> > +initial_plane_phys(struct drm_i915_private *i915,
> > + struct intel_initial_plane_config *plane_config)
> > +{
> > + if (IS_DGFX(i915) || HAS_LMEMBAR_SMEM_STOLEN(i915))
> > + return initial_plane_phys_lmem(i915, plane_config);
> > + else
> > + return initial_plane_phys_smem(i915, plane_config);
> > +}
> > +
> > static struct i915_vma *
> > initial_plane_vma(struct drm_i915_private *i915,
> > struct intel_initial_plane_config *plane_config)
> > @@ -58,59 +145,13 @@ initial_plane_vma(struct drm_i915_private *i915,
> > if (plane_config->size == 0)
> > return NULL;
> >
> > + if (!initial_plane_phys(i915, plane_config))
> > + return NULL;
> > +
> > + phys_base = plane_config->phys_base;
> > + mem = plane_config->mem;
> > +
> > base = round_down(plane_config->base, I915_GTT_MIN_ALIGNMENT);
> > - if (IS_DGFX(i915) || HAS_LMEMBAR_SMEM_STOLEN(i915)) {
> > - gen8_pte_t __iomem *gte = to_gt(i915)->ggtt->gsm;
> > - dma_addr_t dma_addr;
> > - gen8_pte_t pte;
> > -
> > - gte += base / I915_GTT_PAGE_SIZE;
> > -
> > - pte = ioread64(gte);
> > - if (!(pte & GEN12_GGTT_PTE_LM)) {
> > - drm_err(&i915->drm,
> > - "Initial plane programming missing PTE_LM bit\n");
> > - return NULL;
> > - }
> > -
> > - dma_addr = pte & GEN12_GGTT_PTE_ADDR_MASK;
> > -
> > - if (IS_DGFX(i915))
> > - mem = i915->mm.regions[INTEL_REGION_LMEM_0];
> > - else
> > - mem = i915->mm.stolen_region;
> > - if (!mem) {
> > - drm_dbg_kms(&i915->drm,
> > - "Initial plane memory region not initialized\n");
> > - return NULL;
> > - }
> > -
> > - /*
> > - * On lmem we don't currently expect this to
> > - * ever be placed in the stolen portion.
> > - */
> > - if (dma_addr < mem->region.start || dma_addr > mem->region.end) {
> > - drm_err(&i915->drm,
> > - "Initial plane programming using invalid range, dma_addr=%pa (%s [%pa-%pa])\n",
> > - &dma_addr, mem->region.name, &mem->region.start, &mem->region.end);
> > - return NULL;
> > - }
> > -
> > - drm_dbg(&i915->drm,
> > - "Using dma_addr=%pa, based on initial plane programming\n",
> > - &dma_addr);
> > -
> > - phys_base = dma_addr - mem->region.start;
> > - } else {
> > - phys_base = base;
> > - mem = i915->mm.stolen_region;
> > - if (!mem) {
> > - drm_dbg_kms(&i915->drm,
> > - "Initial plane memory region not initialized\n");
> > - return NULL;
> > - }
> > - }
> > -
> > size = round_up(plane_config->base + plane_config->size,
> > mem->min_page_size);
> > size -= base;
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2023-12-19 12:47 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-15 10:59 [PATCH v2 00/15] drm/i915: (stolen) memory region related fixes Ville Syrjala
2023-12-15 10:59 ` [PATCH v2 01/15] drm/i915: Use struct resource for memory region IO as well Ville Syrjala
2023-12-15 10:59 ` [PATCH v2 02/15] drm/i915: Print memory region info during probe Ville Syrjala
2023-12-15 10:59 ` [PATCH v2 03/15] drm/i915: Remove ad-hoc lmem/stolen debugs Ville Syrjala
2023-12-15 10:59 ` [PATCH v2 04/15] drm/i915: Bypass LMEMBAR/GTTMMADR for MTL stolen memory access Ville Syrjala
2023-12-15 21:58 ` Sripada, Radhakrishna
2024-01-10 9:13 ` Andrzej Hajda
2024-01-10 10:49 ` Nirmoy Das
2024-01-10 11:48 ` Nirmoy Das
2024-01-12 15:12 ` Ville Syrjälä
2024-01-12 16:31 ` Nirmoy Das
2024-01-12 16:55 ` Ville Syrjälä
2023-12-15 10:59 ` [PATCH v2 05/15] drm/i915: Disable the "binder" Ville Syrjala
2024-01-10 10:28 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 06/15] drm/i915: Rename the DSM/GSM registers Ville Syrjala
2023-12-15 13:56 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 07/15] drm/i915: Fix PTE decode during initial plane readout Ville Syrjala
2023-12-18 12:36 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 08/15] drm/i915: Fix region start " Ville Syrjala
2023-12-18 13:00 ` Andrzej Hajda
2023-12-19 0:01 ` Ville Syrjälä
2024-01-12 14:53 ` Ville Syrjälä
2023-12-15 10:59 ` [PATCH v2 09/15] drm/i915: Fix MTL " Ville Syrjala
2023-12-19 10:58 ` Andrzej Hajda
2024-01-12 14:52 ` Ville Syrjälä
2023-12-15 10:59 ` [PATCH v2 10/15] drm/i915: s/phys_base/dma_addr/ Ville Syrjala
2023-12-19 10:55 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 11/15] drm/i915: Split the smem and lmem plane readout apart Ville Syrjala
2023-12-19 10:55 ` Andrzej Hajda
2023-12-19 12:47 ` Ville Syrjälä [this message]
2023-12-15 10:59 ` [PATCH v2 12/15] drm/i915: Simplify intel_initial_plane_config() calling convention Ville Syrjala
2023-12-19 10:59 ` Andrzej Hajda
2024-01-13 0:55 ` kernel test robot
2024-01-13 6:27 ` kernel test robot
2023-12-15 10:59 ` [PATCH v2 13/15] drm/i915/fbdev: Fix smem_start for LMEMBAR stolen objects Ville Syrjala
2024-01-10 9:12 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 14/15] drm/i915: Tweak BIOS fb reuse check Ville Syrjala
2024-01-10 9:36 ` Andrzej Hajda
2023-12-15 10:59 ` [PATCH v2 15/15] drm/i915: Try to relocate the BIOS fb to the start of ggtt Ville Syrjala
2024-01-10 10:11 ` Andrzej Hajda
2024-01-11 13:42 ` Ville Syrjälä
2024-01-11 14:06 ` [PATCH v3 " Ville Syrjala
2023-12-15 15:45 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: (stolen) memory region related fixes (rev3) Patchwork
2023-12-15 15:45 ` ✗ Fi.CI.SPARSE: " Patchwork
2023-12-15 16:02 ` ✗ Fi.CI.BAT: failure " Patchwork
2024-01-11 17:08 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: (stolen) memory region related fixes (rev5) Patchwork
2024-01-11 17:08 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-01-11 17:22 ` ✓ Fi.CI.BAT: success " Patchwork
2024-01-11 22:46 ` ✓ Fi.CI.IGT: " 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=ZYGQ2dsNixUQsTXa@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=andrzej.hajda@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/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