[PATCH 2/2] drm/ttm: merge offset and base in ttm_bus_placement

Dave Airlie airlied at gmail.com
Mon Sep 7 18:57:20 UTC 2020


I'd written something similar but didn't finish it!

For the series,

Reviewed-by: Dave Airlie <airlied at redhat.com>

On Mon, 7 Sep 2020 at 23:29, Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> This is used by TTM to communicate the physical address
> which should be used with ioremap(), ioremap_wc(). We don't
> need to separate the base and offset in any way here.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c    |  7 ++++---
>  drivers/gpu/drm/drm_gem_ttm_helper.c       |  5 +----
>  drivers/gpu/drm/drm_gem_vram_helper.c      |  3 +--
>  drivers/gpu/drm/nouveau/nouveau_bo.c       |  9 ++++-----
>  drivers/gpu/drm/nouveau/nouveau_fbcon.c    |  3 +--
>  drivers/gpu/drm/qxl/qxl_ttm.c              |  7 +++----
>  drivers/gpu/drm/radeon/radeon_ttm.c        | 14 ++++++--------
>  drivers/gpu/drm/ttm/ttm_bo.c               |  3 ---
>  drivers/gpu/drm/ttm/ttm_bo_util.c          | 17 ++++++-----------
>  drivers/gpu/drm/ttm/ttm_bo_vm.c            |  3 +--
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  4 ++--
>  include/drm/ttm/ttm_resource.h             |  6 ++----
>  12 files changed, 31 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 46d620817482..b39d2a834340 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -773,7 +773,7 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>                         mem->bus.addr = (u8 *)adev->mman.aper_base_kaddr +
>                                         mem->bus.offset;
>
> -               mem->bus.base = adev->gmc.aper_base;
> +               mem->bus.offset += adev->gmc.aper_base;
>                 mem->bus.is_iomem = true;
>                 break;
>         default:
> @@ -785,12 +785,13 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>  static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
>                                            unsigned long page_offset)
>  {
> +       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
>         uint64_t offset = (page_offset << PAGE_SHIFT);
>         struct drm_mm_node *mm;
>
>         mm = amdgpu_find_mm_node(&bo->mem, &offset);
> -       return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start +
> -               (offset >> PAGE_SHIFT);
> +       offset += adev->gmc.aper_base;
> +       return mm->start + (offset >> PAGE_SHIFT);
>  }
>
>  /**
> diff --git a/drivers/gpu/drm/drm_gem_ttm_helper.c b/drivers/gpu/drm/drm_gem_ttm_helper.c
> index 892b2288a104..0e4fb9ba43ad 100644
> --- a/drivers/gpu/drm/drm_gem_ttm_helper.c
> +++ b/drivers/gpu/drm/drm_gem_ttm_helper.c
> @@ -43,12 +43,9 @@ void drm_gem_ttm_print_info(struct drm_printer *p, unsigned int indent,
>         drm_print_bits(p, bo->mem.placement, plname, ARRAY_SIZE(plname));
>         drm_printf(p, "\n");
>
> -       if (bo->mem.bus.is_iomem) {
> -               drm_printf_indent(p, indent, "bus.base=%lx\n",
> -                                 (unsigned long)bo->mem.bus.base);
> +       if (bo->mem.bus.is_iomem)
>                 drm_printf_indent(p, indent, "bus.offset=%lx\n",
>                                   (unsigned long)bo->mem.bus.offset);
> -       }
>  }
>  EXPORT_SYMBOL(drm_gem_ttm_print_info);
>
> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
> index 545a877406f4..255560591916 100644
> --- a/drivers/gpu/drm/drm_gem_vram_helper.c
> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
> @@ -1042,8 +1042,7 @@ static int bo_driver_io_mem_reserve(struct ttm_bo_device *bdev,
>         case TTM_PL_SYSTEM:     /* nothing to do */
>                 break;
>         case TTM_PL_VRAM:
> -               mem->bus.offset = mem->start << PAGE_SHIFT;
> -               mem->bus.base = vmm->vram_base;
> +               mem->bus.offset = (mem->start << PAGE_SHIFT) + vmm->vram_base;
>                 mem->bus.is_iomem = true;
>                 break;
>         default:
> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
> index f74988771ed8..4c2cc862eb19 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
> @@ -1081,8 +1081,8 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *reg)
>         case TTM_PL_TT:
>  #if IS_ENABLED(CONFIG_AGP)
>                 if (drm->agp.bridge) {
> -                       reg->bus.offset = reg->start << PAGE_SHIFT;
> -                       reg->bus.base = drm->agp.base;
> +                       reg->bus.offset = (reg->start << PAGE_SHIFT) +
> +                               drm->agp.base;
>                         reg->bus.is_iomem = !drm->agp.cma;
>                 }
>  #endif
> @@ -1094,8 +1094,8 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *reg)
>                 }
>                 fallthrough;    /* tiled memory */
>         case TTM_PL_VRAM:
> -               reg->bus.offset = reg->start << PAGE_SHIFT;
> -               reg->bus.base = device->func->resource_addr(device, 1);
> +               reg->bus.offset = (reg->start << PAGE_SHIFT) +
> +                       device->func->resource_addr(device, 1);
>                 reg->bus.is_iomem = true;
>                 if (drm->client.mem->oclass >= NVIF_CLASS_MEM_NV50) {
>                         union {
> @@ -1133,7 +1133,6 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *reg)
>                                 goto out;
>                         }
>
> -                       reg->bus.base = 0;
>                         reg->bus.offset = handle;
>                         ret = 0;
>                 }
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> index fad8030ec1f8..3159a2172db5 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> @@ -378,8 +378,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
>                               FBINFO_HWACCEL_FILLRECT |
>                               FBINFO_HWACCEL_IMAGEBLIT;
>         info->fbops = &nouveau_fbcon_sw_ops;
> -       info->fix.smem_start = nvbo->bo.mem.bus.base +
> -                              nvbo->bo.mem.bus.offset;
> +       info->fix.smem_start = nvbo->bo.mem.bus.offset;
>         info->fix.smem_len = nvbo->bo.mem.num_pages << PAGE_SHIFT;
>
>         info->screen_base = nvbo_kmap_obj_iovirtual(nvbo);
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index 7aae0a96f043..b20c356229c3 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -81,13 +81,12 @@ int qxl_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
>                 return 0;
>         case TTM_PL_VRAM:
>                 mem->bus.is_iomem = true;
> -               mem->bus.base = qdev->vram_base;
> -               mem->bus.offset = mem->start << PAGE_SHIFT;
> +               mem->bus.offset = (mem->start << PAGE_SHIFT) + qdev->vram_base;
>                 break;
>         case TTM_PL_PRIV:
>                 mem->bus.is_iomem = true;
> -               mem->bus.base = qdev->surfaceram_base;
> -               mem->bus.offset = mem->start << PAGE_SHIFT;
> +               mem->bus.offset = (mem->start << PAGE_SHIFT) +
> +                       qdev->surfaceram_base;
>                 break;
>         default:
>                 return -EINVAL;
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index 74ad50c7491c..4cfadda7be2b 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -372,8 +372,8 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>  #if IS_ENABLED(CONFIG_AGP)
>                 if (rdev->flags & RADEON_IS_AGP) {
>                         /* RADEON_IS_AGP is set only if AGP is active */
> -                       mem->bus.offset = mem->start << PAGE_SHIFT;
> -                       mem->bus.base = rdev->mc.agp_base;
> +                       mem->bus.offset = (mem->start << PAGE_SHIFT) +
> +                               rdev->mc.agp_base;
>                         mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
>                 }
>  #endif
> @@ -383,7 +383,7 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>                 /* check if it's visible */
>                 if ((mem->bus.offset + bus_size) > rdev->mc.visible_vram_size)
>                         return -EINVAL;
> -               mem->bus.base = rdev->mc.aper_base;
> +               mem->bus.offset += rdev->mc.aper_base;
>                 mem->bus.is_iomem = true;
>  #ifdef __alpha__
>                 /*
> @@ -392,12 +392,10 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>                  */
>                 if (mem->placement & TTM_PL_FLAG_WC)
>                         mem->bus.addr =
> -                               ioremap_wc(mem->bus.base + mem->bus.offset,
> -                                          bus_size);
> +                               ioremap_wc(mem->bus.offset, bus_size);
>                 else
>                         mem->bus.addr =
> -                               ioremap(mem->bus.base + mem->bus.offset,
> -                                       bus_size);
> +                               ioremap(mem->bus.offset, bus_size);
>                 if (!mem->bus.addr)
>                         return -ENOMEM;
>
> @@ -407,7 +405,7 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_reso
>                  * It then can be used to build PTEs for VRAM
>                  * access, as done in ttm_bo_vm_fault().
>                  */
> -               mem->bus.base = (mem->bus.base & 0x0ffffffffUL) +
> +               mem->bus.offset = (mem->bus.offset & 0x0ffffffffUL) +
>                         rdev->ddev->hose->dense_mem_base;
>  #endif
>                 break;
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 89d8ab6edd40..0812f4ce40db 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -641,7 +641,6 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,
>
>         evict_mem = bo->mem;
>         evict_mem.mm_node = NULL;
> -       evict_mem.bus.base = 0;
>         evict_mem.bus.offset = 0;
>         evict_mem.bus.addr = NULL;
>
> @@ -1076,7 +1075,6 @@ static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>         mem.num_pages = bo->num_pages;
>         mem.size = mem.num_pages << PAGE_SHIFT;
>         mem.page_alignment = bo->mem.page_alignment;
> -       mem.bus.base = 0;
>         mem.bus.offset = 0;
>         mem.bus.addr = NULL;
>         mem.mm_node = NULL;
> @@ -1235,7 +1233,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
>         bo->mem.num_pages = bo->num_pages;
>         bo->mem.mm_node = NULL;
>         bo->mem.page_alignment = page_alignment;
> -       bo->mem.bus.base = 0;
>         bo->mem.bus.offset = 0;
>         bo->mem.bus.addr = NULL;
>         bo->moving = NULL;
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 2c967607d485..85b670e7c20d 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -94,7 +94,7 @@ EXPORT_SYMBOL(ttm_bo_move_ttm);
>  int ttm_mem_io_reserve(struct ttm_bo_device *bdev,
>                        struct ttm_resource *mem)
>  {
> -       if (mem->bus.base || mem->bus.offset || mem->bus.addr)
> +       if (mem->bus.offset || mem->bus.addr)
>                 return 0;
>
>         mem->bus.is_iomem = false;
> @@ -107,13 +107,12 @@ int ttm_mem_io_reserve(struct ttm_bo_device *bdev,
>  void ttm_mem_io_free(struct ttm_bo_device *bdev,
>                      struct ttm_resource *mem)
>  {
> -       if (!mem->bus.base && !mem->bus.offset && !mem->bus.addr)
> +       if (!mem->bus.offset && !mem->bus.addr)
>                 return;
>
>         if (bdev->driver->io_mem_free)
>                 bdev->driver->io_mem_free(bdev, mem);
>
> -       mem->bus.base = 0;
>         mem->bus.offset = 0;
>         mem->bus.addr = NULL;
>  }
> @@ -136,11 +135,9 @@ static int ttm_resource_ioremap(struct ttm_bo_device *bdev,
>                 size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
>
>                 if (mem->placement & TTM_PL_FLAG_WC)
> -                       addr = ioremap_wc(mem->bus.base + mem->bus.offset,
> -                                         bus_size);
> +                       addr = ioremap_wc(mem->bus.offset, bus_size);
>                 else
> -                       addr = ioremap(mem->bus.base + mem->bus.offset,
> -                                      bus_size);
> +                       addr = ioremap(mem->bus.offset, bus_size);
>                 if (!addr) {
>                         ttm_mem_io_free(bdev, mem);
>                         return -ENOMEM;
> @@ -427,12 +424,10 @@ static int ttm_bo_ioremap(struct ttm_buffer_object *bo,
>         } else {
>                 map->bo_kmap_type = ttm_bo_map_iomap;
>                 if (mem->placement & TTM_PL_FLAG_WC)
> -                       map->virtual = ioremap_wc(bo->mem.bus.base +
> -                                                 bo->mem.bus.offset + offset,
> +                       map->virtual = ioremap_wc(bo->mem.bus.offset + offset,
>                                                   size);
>                 else
> -                       map->virtual = ioremap(bo->mem.bus.base +
> -                                              bo->mem.bus.offset + offset,
> +                       map->virtual = ioremap(bo->mem.bus.offset + offset,
>                                                size);
>         }
>         return (!map->virtual) ? -ENOMEM : 0;
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> index d3dc0682425c..eb1017af0710 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> @@ -101,8 +101,7 @@ static unsigned long ttm_bo_io_mem_pfn(struct ttm_buffer_object *bo,
>         if (bdev->driver->io_mem_pfn)
>                 return bdev->driver->io_mem_pfn(bo, page_offset);
>
> -       return ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT)
> -               + page_offset;
> +       return (bo->mem.bus.offset >> PAGE_SHIFT) + page_offset;
>  }
>
>  /**
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> index c7f10b2c93d2..0adbacd29066 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> @@ -721,8 +721,8 @@ static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resourc
>         case VMW_PL_MOB:
>                 return 0;
>         case TTM_PL_VRAM:
> -               mem->bus.offset = mem->start << PAGE_SHIFT;
> -               mem->bus.base = dev_priv->vram_start;
> +               mem->bus.offset = (mem->start << PAGE_SHIFT) +
> +                       dev_priv->vram_start;
>                 mem->bus.is_iomem = true;
>                 break;
>         default:
> diff --git a/include/drm/ttm/ttm_resource.h b/include/drm/ttm/ttm_resource.h
> index 406baa8f0068..7b8a3157fbb3 100644
> --- a/include/drm/ttm/ttm_resource.h
> +++ b/include/drm/ttm/ttm_resource.h
> @@ -148,16 +148,14 @@ struct ttm_resource_manager {
>   * struct ttm_bus_placement
>   *
>   * @addr:              mapped virtual address
> - * @base:              bus base address
> + * @offset:            physical addr
>   * @is_iomem:          is this io memory ?
> - * @offset:            offset from the base address
>   *
>   * Structure indicating the bus placement of an object.
>   */
>  struct ttm_bus_placement {
>         void            *addr;
> -       phys_addr_t     base;
> -       unsigned long   offset;
> +       phys_addr_t     offset;
>         bool            is_iomem;
>  };
>
> --
> 2.17.1
>


More information about the dri-devel mailing list