Re: [PATCH 01/12] drm/i915: Use struct resource for memory region IO as well
On Wed, Dec 13, 2023 at 02:59:07AM +0200, Ville Syrjälä wrote: > On Wed, Dec 13, 2023 at 02:42:26AM +0200, Ville Syrjala wrote: > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > index 717c3a3237c4..1ac05d90b2e8 100644 > > --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > @@ -78,7 +78,7 @@ int intel_fbdev_fb_fill_info(struct drm_i915_private > > *i915, struct fb_info *info > > > > /* Use fbdev's framebuffer from lmem for discrete */ > > info->fix.smem_start = > > - (unsigned long)(mem->io_start + > > + (unsigned long)(mem->io.start + > > i915_gem_object_get_dma_address(obj, > > 0)); > > Hmm. That looks wrong for MTL actually since dma address is relative > to the start of LMEMBAR but stolen io.start will be LMEMBAR+8MiB (or > just DSMBASE which points to the same place, with the w/a in place). > So we need to subtract mem->region.start from this to get the correct > value. I suppose this doesn't matter anymore as we have our own .fb_mmap() these days. So presumably we could just always leave this set to zero. -- Ville Syrjälä Intel
Re: [PATCH 01/12] drm/i915: Use struct resource for memory region IO as well
On Wed, Dec 13, 2023 at 04:52:54PM +0100, Andrzej Hajda wrote: > On 13.12.2023 01:42, Ville Syrjala wrote: > > From: Ville Syrjälä > > > > mem->region is a struct resource, but mem->io_start and > > mem->io_size are not for whatever reason. Let's unify this > > and convert the io stuff into a struct resource as well. > > Should make life a little less annoying when you don't have > > juggle between two different approaches all the time. > > > > Mostly done using cocci (with manual tweaks at all the > > places where we mutate io_size by hand): > > @@ > > struct intel_memory_region *M; > > expression START, SIZE; > > @@ > > - M->io_start = START; > > - M->io_size = SIZE; > > + M->io = DEFINE_RES_MEM(START, SIZE); > > > > @@ > > struct intel_memory_region *M; > > @@ > > - M->io_start > > + M->io.start > > > > @@ > > struct intel_memory_region M; > > @@ > > - M.io_start > > + M.io.start > > > > @@ > > expression M; > > @@ > > - M->io_size > > + resource_size(&M->io) > > > > @@ > > expression M; > > @@ > > - M.io_size > > + resource_size(&M.io) > > > > Signed-off-by: Ville Syrjälä > > > You can try to replace local vars and/or arguments as well: > In i915_gem_stolen_lmem_setup: > resource_size_t io_start, io_size; > > (intel_memory|mock)_region_create(struct drm_i915_private *i915, > resource_size_t start, > resource_size_t size, > resource_size_t min_page_size, > resource_size_t io_start, > resource_size_t io_size, > u16 type, > u16 instance, > const struct intel_memory_region_ops *ops); I think it's easier to let that guy deal with the size->end conversion. The callers are generally more interested in the size itself. > > With or without this change: > Reviewed-by: Andrzej Hajda Thanks > > Regards > Andrzej > > > > --- > > drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 2 +- > > drivers/gpu/drm/i915/gem/i915_gem_region.c | 2 +- > > drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 17 + > > drivers/gpu/drm/i915/gem/i915_gem_ttm.c| 8 > > .../gpu/drm/i915/gem/selftests/i915_gem_mman.c | 18 +- > > drivers/gpu/drm/i915/gt/intel_region_lmem.c| 11 +++ > > drivers/gpu/drm/i915/gt/selftest_tlb.c | 4 ++-- > > drivers/gpu/drm/i915/i915_gpu_error.c | 2 +- > > drivers/gpu/drm/i915/i915_query.c | 2 +- > > drivers/gpu/drm/i915/intel_memory_region.c | 15 +++ > > drivers/gpu/drm/i915/intel_memory_region.h | 3 +-- > > drivers/gpu/drm/i915/intel_region_ttm.c| 8 > > .../drm/i915/selftests/intel_memory_region.c | 4 ++-- > > 13 files changed, 45 insertions(+), 51 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > index 717c3a3237c4..1ac05d90b2e8 100644 > > --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > > @@ -78,7 +78,7 @@ int intel_fbdev_fb_fill_info(struct drm_i915_private > > *i915, struct fb_info *info > > > > /* Use fbdev's framebuffer from lmem for discrete */ > > info->fix.smem_start = > > - (unsigned long)(mem->io_start + > > + (unsigned long)(mem->io.start + > > i915_gem_object_get_dma_address(obj, > > 0)); > > info->fix.smem_len = obj->base.size; > > } else { > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c > > b/drivers/gpu/drm/i915/gem/i915_gem_region.c > > index a4fb577eceb4..b09b74a2448b 100644 > > --- a/drivers/gpu/drm/i915/gem/i915_gem_region.c > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c > > @@ -129,7 +129,7 @@ i915_gem_object_create_region_at(struct > > intel_memory_region *mem, > > return ERR_PTR(-EINVAL); > > > > if (!(flags & I915_BO_ALLOC_GPU_ONLY) && > > - offset + size > mem->io_size && > > + offset + size > resource_size(&mem->io) && > > !i915_ggtt_has_aperture(to_gt(mem->i915)->ggtt)) > > return ERR_PTR(-ENOSPC); > > > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > > b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > > index 8c88075eeab2..d2440c793f84 100644 > > --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > > @@ -541,7 +541,9 @@ static int i915_gem_init_stolen(struct > > intel_memory_region *mem) > > > > /* Exclude the reserved region from driver use */ > > mem->region.end = i915->dsm.reserved.start - 1; > > - mem->io_size = min(mem->io_size, resource_size(&mem->region)); > > + mem->io = DEFINE_RES_MEM(mem->io.start, > > +min(resource_size(&mem->io), > > +
Re: [PATCH 01/12] drm/i915: Use struct resource for memory region IO as well
On 13.12.2023 01:42, Ville Syrjala wrote: From: Ville Syrjälä mem->region is a struct resource, but mem->io_start and mem->io_size are not for whatever reason. Let's unify this and convert the io stuff into a struct resource as well. Should make life a little less annoying when you don't have juggle between two different approaches all the time. Mostly done using cocci (with manual tweaks at all the places where we mutate io_size by hand): @@ struct intel_memory_region *M; expression START, SIZE; @@ - M->io_start = START; - M->io_size = SIZE; + M->io = DEFINE_RES_MEM(START, SIZE); @@ struct intel_memory_region *M; @@ - M->io_start + M->io.start @@ struct intel_memory_region M; @@ - M.io_start + M.io.start @@ expression M; @@ - M->io_size + resource_size(&M->io) @@ expression M; @@ - M.io_size + resource_size(&M.io) Signed-off-by: Ville Syrjälä You can try to replace local vars and/or arguments as well: In i915_gem_stolen_lmem_setup: resource_size_t io_start, io_size; (intel_memory|mock)_region_create(struct drm_i915_private *i915, resource_size_t start, resource_size_t size, resource_size_t min_page_size, resource_size_t io_start, resource_size_t io_size, u16 type, u16 instance, const struct intel_memory_region_ops *ops); With or without this change: Reviewed-by: Andrzej Hajda Regards Andrzej --- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_region.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 17 + drivers/gpu/drm/i915/gem/i915_gem_ttm.c| 8 .../gpu/drm/i915/gem/selftests/i915_gem_mman.c | 18 +- drivers/gpu/drm/i915/gt/intel_region_lmem.c| 11 +++ drivers/gpu/drm/i915/gt/selftest_tlb.c | 4 ++-- drivers/gpu/drm/i915/i915_gpu_error.c | 2 +- drivers/gpu/drm/i915/i915_query.c | 2 +- drivers/gpu/drm/i915/intel_memory_region.c | 15 +++ drivers/gpu/drm/i915/intel_memory_region.h | 3 +-- drivers/gpu/drm/i915/intel_region_ttm.c| 8 .../drm/i915/selftests/intel_memory_region.c | 4 ++-- 13 files changed, 45 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c index 717c3a3237c4..1ac05d90b2e8 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c @@ -78,7 +78,7 @@ int intel_fbdev_fb_fill_info(struct drm_i915_private *i915, struct fb_info *info /* Use fbdev's framebuffer from lmem for discrete */ info->fix.smem_start = - (unsigned long)(mem->io_start + + (unsigned long)(mem->io.start + i915_gem_object_get_dma_address(obj, 0)); info->fix.smem_len = obj->base.size; } else { diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c index a4fb577eceb4..b09b74a2448b 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_region.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c @@ -129,7 +129,7 @@ i915_gem_object_create_region_at(struct intel_memory_region *mem, return ERR_PTR(-EINVAL); if (!(flags & I915_BO_ALLOC_GPU_ONLY) && - offset + size > mem->io_size && + offset + size > resource_size(&mem->io) && !i915_ggtt_has_aperture(to_gt(mem->i915)->ggtt)) return ERR_PTR(-ENOSPC); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index 8c88075eeab2..d2440c793f84 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -541,7 +541,9 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) /* Exclude the reserved region from driver use */ mem->region.end = i915->dsm.reserved.start - 1; - mem->io_size = min(mem->io_size, resource_size(&mem->region)); + mem->io = DEFINE_RES_MEM(mem->io.start, +min(resource_size(&mem->io), +resource_size(&mem->region))); i915->dsm.usable_size = resource_size(&mem->region); @@ -752,7 +754,7 @@ static int _i915_gem_object_stolen_init(struct intel_memory_region *mem, * With discrete devices, where we lack a mappable aperture there is no * possible way to ever access this memory on the CPU side. */ - if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !mem->io_size && + if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !resource_size(&mem->io) && !(flags & I915_BO_ALLOC_GPU_ONLY)) return -ENOS
Re: [PATCH 01/12] drm/i915: Use struct resource for memory region IO as well
On Wed, Dec 13, 2023 at 02:42:26AM +0200, Ville Syrjala wrote: > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > index 717c3a3237c4..1ac05d90b2e8 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c > @@ -78,7 +78,7 @@ int intel_fbdev_fb_fill_info(struct drm_i915_private *i915, > struct fb_info *info > > /* Use fbdev's framebuffer from lmem for discrete */ > info->fix.smem_start = > - (unsigned long)(mem->io_start + > + (unsigned long)(mem->io.start + > i915_gem_object_get_dma_address(obj, > 0)); Hmm. That looks wrong for MTL actually since dma address is relative to the start of LMEMBAR but stolen io.start will be LMEMBAR+8MiB (or just DSMBASE which points to the same place, with the w/a in place). So we need to subtract mem->region.start from this to get the correct value. -- Ville Syrjälä Intel
[PATCH 01/12] drm/i915: Use struct resource for memory region IO as well
From: Ville Syrjälä mem->region is a struct resource, but mem->io_start and mem->io_size are not for whatever reason. Let's unify this and convert the io stuff into a struct resource as well. Should make life a little less annoying when you don't have juggle between two different approaches all the time. Mostly done using cocci (with manual tweaks at all the places where we mutate io_size by hand): @@ struct intel_memory_region *M; expression START, SIZE; @@ - M->io_start = START; - M->io_size = SIZE; + M->io = DEFINE_RES_MEM(START, SIZE); @@ struct intel_memory_region *M; @@ - M->io_start + M->io.start @@ struct intel_memory_region M; @@ - M.io_start + M.io.start @@ expression M; @@ - M->io_size + resource_size(&M->io) @@ expression M; @@ - M.io_size + resource_size(&M.io) Signed-off-by: Ville Syrjälä --- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_region.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 17 + drivers/gpu/drm/i915/gem/i915_gem_ttm.c| 8 .../gpu/drm/i915/gem/selftests/i915_gem_mman.c | 18 +- drivers/gpu/drm/i915/gt/intel_region_lmem.c| 11 +++ drivers/gpu/drm/i915/gt/selftest_tlb.c | 4 ++-- drivers/gpu/drm/i915/i915_gpu_error.c | 2 +- drivers/gpu/drm/i915/i915_query.c | 2 +- drivers/gpu/drm/i915/intel_memory_region.c | 15 +++ drivers/gpu/drm/i915/intel_memory_region.h | 3 +-- drivers/gpu/drm/i915/intel_region_ttm.c| 8 .../drm/i915/selftests/intel_memory_region.c | 4 ++-- 13 files changed, 45 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c index 717c3a3237c4..1ac05d90b2e8 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev_fb.c @@ -78,7 +78,7 @@ int intel_fbdev_fb_fill_info(struct drm_i915_private *i915, struct fb_info *info /* Use fbdev's framebuffer from lmem for discrete */ info->fix.smem_start = - (unsigned long)(mem->io_start + + (unsigned long)(mem->io.start + i915_gem_object_get_dma_address(obj, 0)); info->fix.smem_len = obj->base.size; } else { diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c index a4fb577eceb4..b09b74a2448b 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_region.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c @@ -129,7 +129,7 @@ i915_gem_object_create_region_at(struct intel_memory_region *mem, return ERR_PTR(-EINVAL); if (!(flags & I915_BO_ALLOC_GPU_ONLY) && - offset + size > mem->io_size && + offset + size > resource_size(&mem->io) && !i915_ggtt_has_aperture(to_gt(mem->i915)->ggtt)) return ERR_PTR(-ENOSPC); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index 8c88075eeab2..d2440c793f84 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -541,7 +541,9 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) /* Exclude the reserved region from driver use */ mem->region.end = i915->dsm.reserved.start - 1; - mem->io_size = min(mem->io_size, resource_size(&mem->region)); + mem->io = DEFINE_RES_MEM(mem->io.start, +min(resource_size(&mem->io), +resource_size(&mem->region))); i915->dsm.usable_size = resource_size(&mem->region); @@ -752,7 +754,7 @@ static int _i915_gem_object_stolen_init(struct intel_memory_region *mem, * With discrete devices, where we lack a mappable aperture there is no * possible way to ever access this memory on the CPU side. */ - if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !mem->io_size && + if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !resource_size(&mem->io) && !(flags & I915_BO_ALLOC_GPU_ONLY)) return -ENOSPC; @@ -838,13 +840,12 @@ static int init_stolen_lmem(struct intel_memory_region *mem) return 0; } - if (mem->io_size && - !io_mapping_init_wc(&mem->iomap, mem->io_start, mem->io_size)) + if (resource_size(&mem->io) && + !io_mapping_init_wc(&mem->iomap, mem->io.start, resource_size(&mem->io))) goto err_cleanup; - drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", - &mem->io_start); - drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &mem->region.start); + drm_dbg(&i915->drm, "Stolen Local DSM: %pR\n", &mem->region); + drm_dbg(&i915->drm, "Stolen Local memory IO: %pR\n", &mem->io); return