[PATCH 06/10] drm/xe/display: Dont poke into GGTT internals to fill a DPT

Juha-Pekka Heikkilä juhapekka.heikkila at gmail.com
Tue May 20 13:06:00 UTC 2025


Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>

On Mon, May 5, 2025 at 3:20 PM Maarten Lankhorst <dev at lankhorst.se> wrote:
>
> For DPT, it is sufficient to get the GGTT encode flags to fill the DPT.
> Create a function to return the encode flags, and then encode using the
> BO address.
>
> Signed-off-by: Maarten Lankhorst <dev at lankhorst.se>
> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 20 +++++++++-----------
>  drivers/gpu/drm/xe/xe_ggtt.c           | 15 +++++++++++++++
>  drivers/gpu/drm/xe/xe_ggtt.h           |  2 ++
>  3 files changed, 26 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index d509def82b134..5392e46a3a134 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -23,6 +23,7 @@ write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs, u32 bo_
>         struct xe_device *xe = xe_bo_device(bo);
>         struct xe_ggtt *ggtt = xe_device_get_root_tile(xe)->mem.ggtt;
>         u32 column, row;
> +       u64 pte = xe_ggtt_encode_pte_flags(ggtt, bo, xe->pat.idx[XE_CACHE_NONE]);
>
>         /* TODO: Maybe rewrite so we can traverse the bo addresses sequentially,
>          * by writing dpt/ggtt in a different order?
> @@ -32,10 +33,9 @@ write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs, u32 bo_
>                 u32 src_idx = src_stride * (height - 1) + column + bo_ofs;
>
>                 for (row = 0; row < height; row++) {
> -                       u64 pte = ggtt->pt_ops->pte_encode_bo(bo, src_idx * XE_PAGE_SIZE,
> -                                                             xe->pat.idx[XE_CACHE_NONE]);
> +                       u64 addr = xe_bo_addr(bo, src_idx * XE_PAGE_SIZE, XE_PAGE_SIZE);
>
> -                       iosys_map_wr(map, *dpt_ofs, u64, pte);
> +                       iosys_map_wr(map, *dpt_ofs, u64, pte | addr);
>                         *dpt_ofs += 8;
>                         src_idx -= src_stride;
>                 }
> @@ -55,17 +55,15 @@ write_dpt_remapped(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs,
>  {
>         struct xe_device *xe = xe_bo_device(bo);
>         struct xe_ggtt *ggtt = xe_device_get_root_tile(xe)->mem.ggtt;
> -       u64 (*pte_encode_bo)(struct xe_bo *bo, u64 bo_offset, u16 pat_index)
> -               = ggtt->pt_ops->pte_encode_bo;
>         u32 column, row;
> +       u64 pte = xe_ggtt_encode_pte_flags(ggtt, bo, xe->pat.idx[XE_CACHE_NONE]);
>
>         for (row = 0; row < height; row++) {
>                 u32 src_idx = src_stride * row + bo_ofs;
>
>                 for (column = 0; column < width; column++) {
> -                       iosys_map_wr(map, *dpt_ofs, u64,
> -                                    pte_encode_bo(bo, src_idx * XE_PAGE_SIZE,
> -                                    xe->pat.idx[XE_CACHE_NONE]));
> +                       u64 addr = xe_bo_addr(bo, src_idx * XE_PAGE_SIZE, XE_PAGE_SIZE);
> +                       iosys_map_wr(map, *dpt_ofs, u64, pte | addr);
>
>                         *dpt_ofs += 8;
>                         src_idx++;
> @@ -129,13 +127,13 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
>                 return PTR_ERR(dpt);
>
>         if (view->type == I915_GTT_VIEW_NORMAL) {
> +               u64 pte = xe_ggtt_encode_pte_flags(ggtt, bo, xe->pat.idx[XE_CACHE_NONE]);
>                 u32 x;
>
>                 for (x = 0; x < size / XE_PAGE_SIZE; x++) {
> -                       u64 pte = ggtt->pt_ops->pte_encode_bo(bo, x * XE_PAGE_SIZE,
> -                                                             xe->pat.idx[XE_CACHE_NONE]);
> +                       u64 addr = xe_bo_addr(bo, x * XE_PAGE_SIZE, XE_PAGE_SIZE);
>
> -                       iosys_map_wr(&dpt->vmap, x * 8, u64, pte);
> +                       iosys_map_wr(&dpt->vmap, x * 8, u64, pte | addr);
>                 }
>         } else if (view->type == I915_GTT_VIEW_REMAPPED) {
>                 const struct intel_remapped_info *remap_info = &view->remapped;
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 7526739034ea0..59097c7a494b2 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -911,3 +911,18 @@ u64 xe_ggtt_print_holes(struct xe_ggtt *ggtt, u64 alignment, struct drm_printer
>
>         return total;
>  }
> +
> +/**
> + * xe_ggtt_encode_pte_flags - Get PTE encoding flags for BO
> + * @ggtt: &xe_ggtt
> + * @bo: &xe_bo
> + * @pat_index: The pat_index for the PTE.
> + *
> + * This function returns the pte_flags for a given BO, without  address.
> + * It's used for DPT to fill a GGTT mapped BO with a linear lookup table.
> + */
> +u64 xe_ggtt_encode_pte_flags(struct xe_ggtt *ggtt,
> +                            struct xe_bo *bo, u16 pat_index)
> +{
> +       return ggtt->pt_ops->pte_encode_flags(bo, pat_index);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
> index c48da99908848..437ba65f33860 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.h
> +++ b/drivers/gpu/drm/xe/xe_ggtt.h
> @@ -49,4 +49,6 @@ static inline void xe_ggtt_might_lock(struct xe_ggtt *ggtt)
>  void xe_ggtt_might_lock(struct xe_ggtt *ggtt);
>  #endif
>
> +u64 xe_ggtt_encode_pte_flags(struct xe_ggtt *ggtt, struct xe_bo *bo, u16 pat_index);
> +
>  #endif
> --
> 2.45.2
>


More information about the Intel-xe mailing list