mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-18 06:33:43 -04:00
Merge tag 'drm-misc-next-2020-09-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 5.10:
UAPI Changes:
Cross-subsystem Changes:
- virtio: Merged a PR for patches that will affect drm/virtio
Core Changes:
- dev: More devm_drm convertions and removal of drm_dev_init
- atomic: Split out drm_atomic_helper_calc_timestamping_constants of
drm_atomic_helper_update_legacy_modeset_state
- ttm: More rework
Driver Changes:
- i915: selftests improvements
- panfrost: support for Amlogic SoC
- vc4: one fix
- tree-wide: conversions to devm_drm_dev_alloc,
- ast: simplifications of the atomic modesetting code
- panfrost: multiple fixes
- vc4: multiple fixes
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20200921152956.2gxnsdgxmwhvjyut@gilmour.lan
This commit is contained in:
@@ -33,49 +33,57 @@
|
||||
static const struct ttm_place vram_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static const struct ttm_place vram_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static const struct ttm_place sys_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_SYSTEM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static const struct ttm_place sys_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
.mem_type = TTM_PL_SYSTEM,
|
||||
.flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static const struct ttm_place gmr_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static const struct ttm_place gmr_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static const struct ttm_place mob_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_MOB,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static const struct ttm_place mob_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
.mem_type = VMW_PL_MOB,
|
||||
.flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
struct ttm_placement vmw_vram_placement = {
|
||||
@@ -89,11 +97,13 @@ static const struct ttm_place vram_gmr_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}
|
||||
};
|
||||
|
||||
@@ -101,11 +111,13 @@ static const struct ttm_place gmr_vram_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}
|
||||
};
|
||||
|
||||
@@ -120,12 +132,14 @@ static const struct ttm_place vram_gmr_ne_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED |
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED |
|
||||
TTM_PL_FLAG_NO_EVICT
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED |
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED |
|
||||
TTM_PL_FLAG_NO_EVICT
|
||||
}
|
||||
};
|
||||
@@ -169,19 +183,23 @@ static const struct ttm_place evictable_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_SYSTEM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_VRAM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_MOB,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}
|
||||
};
|
||||
|
||||
@@ -189,15 +207,18 @@ static const struct ttm_place nonfixed_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
|
||||
.mem_type = TTM_PL_SYSTEM,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_GMR,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}, {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
|
||||
.mem_type = VMW_PL_MOB,
|
||||
.flags = TTM_PL_FLAG_CACHED
|
||||
}
|
||||
};
|
||||
|
||||
@@ -246,6 +267,7 @@ struct vmw_ttm_tt {
|
||||
struct vmw_sg_table vsgt;
|
||||
uint64_t sg_alloc_size;
|
||||
bool mapped;
|
||||
bool bound;
|
||||
};
|
||||
|
||||
const size_t vmw_tt_size = sizeof(struct vmw_ttm_tt);
|
||||
@@ -530,11 +552,18 @@ const struct vmw_sg_table *vmw_bo_sg_table(struct ttm_buffer_object *bo)
|
||||
}
|
||||
|
||||
|
||||
static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_resource *bo_mem)
|
||||
static int vmw_ttm_bind(struct ttm_bo_device *bdev,
|
||||
struct ttm_tt *ttm, struct ttm_resource *bo_mem)
|
||||
{
|
||||
struct vmw_ttm_tt *vmw_be =
|
||||
container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (!bo_mem)
|
||||
return -EINVAL;
|
||||
|
||||
if (vmw_be->bound)
|
||||
return 0;
|
||||
|
||||
ret = vmw_ttm_map_dma(vmw_be);
|
||||
if (unlikely(ret != 0))
|
||||
@@ -545,8 +574,9 @@ static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_resource *bo_mem)
|
||||
|
||||
switch (bo_mem->mem_type) {
|
||||
case VMW_PL_GMR:
|
||||
return vmw_gmr_bind(vmw_be->dev_priv, &vmw_be->vsgt,
|
||||
ret = vmw_gmr_bind(vmw_be->dev_priv, &vmw_be->vsgt,
|
||||
ttm->num_pages, vmw_be->gmr_id);
|
||||
break;
|
||||
case VMW_PL_MOB:
|
||||
if (unlikely(vmw_be->mob == NULL)) {
|
||||
vmw_be->mob =
|
||||
@@ -555,20 +585,26 @@ static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_resource *bo_mem)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob,
|
||||
ret = vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob,
|
||||
&vmw_be->vsgt, ttm->num_pages,
|
||||
vmw_be->gmr_id);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
return 0;
|
||||
vmw_be->bound = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vmw_ttm_unbind(struct ttm_tt *ttm)
|
||||
static void vmw_ttm_unbind(struct ttm_bo_device *bdev,
|
||||
struct ttm_tt *ttm)
|
||||
{
|
||||
struct vmw_ttm_tt *vmw_be =
|
||||
container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
|
||||
|
||||
if (!vmw_be->bound)
|
||||
return;
|
||||
|
||||
switch (vmw_be->mem_type) {
|
||||
case VMW_PL_GMR:
|
||||
vmw_gmr_unbind(vmw_be->dev_priv, vmw_be->gmr_id);
|
||||
@@ -582,14 +618,17 @@ static void vmw_ttm_unbind(struct ttm_tt *ttm)
|
||||
|
||||
if (vmw_be->dev_priv->map_mode == vmw_dma_map_bind)
|
||||
vmw_ttm_unmap_dma(vmw_be);
|
||||
vmw_be->bound = false;
|
||||
}
|
||||
|
||||
|
||||
static void vmw_ttm_destroy(struct ttm_tt *ttm)
|
||||
static void vmw_ttm_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
||||
{
|
||||
struct vmw_ttm_tt *vmw_be =
|
||||
container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
|
||||
|
||||
vmw_ttm_unbind(bdev, ttm);
|
||||
ttm_tt_destroy_common(bdev, ttm);
|
||||
vmw_ttm_unmap_dma(vmw_be);
|
||||
if (vmw_be->dev_priv->map_mode == vmw_dma_alloc_coherent)
|
||||
ttm_dma_tt_fini(&vmw_be->dma_ttm);
|
||||
@@ -603,7 +642,8 @@ static void vmw_ttm_destroy(struct ttm_tt *ttm)
|
||||
}
|
||||
|
||||
|
||||
static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
|
||||
static int vmw_ttm_populate(struct ttm_bo_device *bdev,
|
||||
struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
|
||||
{
|
||||
struct vmw_ttm_tt *vmw_tt =
|
||||
container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
|
||||
@@ -611,7 +651,7 @@ static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
|
||||
struct ttm_mem_global *glob = vmw_mem_glob(dev_priv);
|
||||
int ret;
|
||||
|
||||
if (ttm->state != tt_unpopulated)
|
||||
if (ttm_tt_is_populated(ttm))
|
||||
return 0;
|
||||
|
||||
if (dev_priv->map_mode == vmw_dma_alloc_coherent) {
|
||||
@@ -631,7 +671,8 @@ static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vmw_ttm_unpopulate(struct ttm_tt *ttm)
|
||||
static void vmw_ttm_unpopulate(struct ttm_bo_device *bdev,
|
||||
struct ttm_tt *ttm)
|
||||
{
|
||||
struct vmw_ttm_tt *vmw_tt = container_of(ttm, struct vmw_ttm_tt,
|
||||
dma_ttm.ttm);
|
||||
@@ -655,12 +696,6 @@ static void vmw_ttm_unpopulate(struct ttm_tt *ttm)
|
||||
ttm_pool_unpopulate(ttm);
|
||||
}
|
||||
|
||||
static struct ttm_backend_func vmw_ttm_func = {
|
||||
.bind = vmw_ttm_bind,
|
||||
.unbind = vmw_ttm_unbind,
|
||||
.destroy = vmw_ttm_destroy,
|
||||
};
|
||||
|
||||
static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
|
||||
uint32_t page_flags)
|
||||
{
|
||||
@@ -671,7 +706,6 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
|
||||
if (!vmw_be)
|
||||
return NULL;
|
||||
|
||||
vmw_be->dma_ttm.ttm.func = &vmw_ttm_func;
|
||||
vmw_be->dev_priv = container_of(bo->bdev, struct vmw_private, bdev);
|
||||
vmw_be->mob = NULL;
|
||||
|
||||
@@ -712,8 +746,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:
|
||||
@@ -757,6 +791,9 @@ struct ttm_bo_driver vmw_bo_driver = {
|
||||
.ttm_tt_create = &vmw_ttm_tt_create,
|
||||
.ttm_tt_populate = &vmw_ttm_populate,
|
||||
.ttm_tt_unpopulate = &vmw_ttm_unpopulate,
|
||||
.ttm_tt_bind = &vmw_ttm_bind,
|
||||
.ttm_tt_unbind = &vmw_ttm_unbind,
|
||||
.ttm_tt_destroy = &vmw_ttm_destroy,
|
||||
.eviction_valuable = ttm_bo_eviction_valuable,
|
||||
.evict_flags = vmw_evict_flags,
|
||||
.move = NULL,
|
||||
@@ -787,7 +824,7 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
|
||||
|
||||
ret = ttm_bo_reserve(bo, false, true, NULL);
|
||||
BUG_ON(ret != 0);
|
||||
ret = vmw_ttm_populate(bo->ttm, &ctx);
|
||||
ret = vmw_ttm_populate(bo->bdev, bo->ttm, &ctx);
|
||||
if (likely(ret == 0)) {
|
||||
struct vmw_ttm_tt *vmw_tt =
|
||||
container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm);
|
||||
|
||||
Reference in New Issue
Block a user