* [PATCH v3 0/7] drm/panthor: support repeated mappings
@ 2025-07-03 20:52 Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 1/7] drm/panthor: Add support for atomic page table updates Caterina Shablia
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
This patch series adds OP_MAP_REPEAT flag, which lets the user map a BO
region over an address range repeatedly with just one map operation.
Sparse resources in the Vulkan API let the user leave regions of a
resource unmapped (from the API perspective.) Accesses to such regions
must not result in program termination, but loads produce undefined
values.
To implement this feature on Mali hardware, Vulkan sparse unmap is
implemented by mapping the specified region to a "dummy bo" so that the
accesses do not fault. A newly created sparse resource starts off
unmapped, and therefore also has to be mapped to the "dummy bo". This
"dummy bo" is small (a page size) in comparison to the sizes of va
ranges that we might want to map to it, and a large number of vm_bind
ops can be necessary. For example, if the user were to create a
100e6-byte sparse resident resource, we'd have to poke VM_BIND with
ceil(100e6/0x1000)=24415 map operations.
OP_MAP_REPEAT addresses this particular inefficiency by letting us
implement a single Vulkan sparse unmap operation and sparse resident
resource initialization with just one map operation.
The panvk changes making use of this uapi can be found at
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35287
No changes in v3.
Changes in v2:
- Make panthor use this stuff.
- Make it possible to express a repeated mappina of any suitably sized
and aligned range of a BO, rather than strictly the page size -sized
prefix, generalizing the API. Rename DRM_GPUVA_SINGLE_PAGE to
DRM_GPUVA_REPEAT.
- Clean up parts of drm/gpuvm affected by these changes.
Link to v1: https://lore.kernel.org/lkml/20250202-gpuvm-single-page-v1-0-8cbd44fdcbd4@asahilina.net/
Asahi Lina (2):
drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map
drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic
Boris Brezillon (5):
drm/panthor: Add support for atomic page table updates
drm/gpuvm: Kill drm_gpuva_init()
drm/gpuvm: Pass map arguments through a struct
drm/gpuvm: Add a helper to check if two VA can be merged
drm/panthor: Add support for repeated mappings
drivers/gpu/drm/drm_gpuvm.c | 182 ++++++++++++++++++-------
drivers/gpu/drm/imagination/pvr_vm.c | 15 +-
drivers/gpu/drm/nouveau/nouveau_uvmm.c | 11 +-
drivers/gpu/drm/panthor/panthor_drv.c | 3 +-
drivers/gpu/drm/panthor/panthor_mmu.c | 154 +++++++++++++++++++--
drivers/gpu/drm/xe/xe_vm.c | 13 +-
include/drm/drm_gpuvm.h | 101 +++++++++++---
include/uapi/drm/panthor_drm.h | 23 ++++
8 files changed, 408 insertions(+), 94 deletions(-)
base-commit: 026a60e3c1c55845bd9fdaa202dad81c3f95ae6b
--
2.47.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/7] drm/panthor: Add support for atomic page table updates
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 2/7] drm/gpuvm: Kill drm_gpuva_init() Caterina Shablia
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Boris Brezillon <boris.brezillon@collabora.com>
Move the lock/flush_mem operations around the gpuvm_sm_map() calls so
we can implement true atomic page updates, where any access in the
locked range done by the GPU has to wait for the page table updates
to land before proceeding.
This is needed for vkQueueBindSparse(), so we can replace the dummy
page mapped over the entire object by actual BO backed pages in an atomic
way.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/panthor/panthor_mmu.c | 65 +++++++++++++++++++++++++--
1 file changed, 62 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
index b39ea6acc6a9..1e58948587a9 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor/panthor_mmu.c
@@ -387,6 +387,15 @@ struct panthor_vm {
* flagged as faulty as a result.
*/
bool unhandled_fault;
+
+ /** @locked_region: Information about the currently locked region currently. */
+ struct {
+ /** @locked_region.start: Start of the locked region. */
+ u64 start;
+
+ /** @locked_region.size: Size of the locked region. */
+ u64 size;
+ } locked_region;
};
/**
@@ -775,6 +784,10 @@ int panthor_vm_active(struct panthor_vm *vm)
}
ret = panthor_mmu_as_enable(vm->ptdev, vm->as.id, transtab, transcfg, vm->memattr);
+ if (!ret && vm->locked_region.size) {
+ lock_region(ptdev, vm->as.id, vm->locked_region.start, vm->locked_region.size);
+ ret = wait_ready(ptdev, vm->as.id);
+ }
out_make_active:
if (!ret) {
@@ -902,6 +915,9 @@ static int panthor_vm_unmap_pages(struct panthor_vm *vm, u64 iova, u64 size)
struct io_pgtable_ops *ops = vm->pgtbl_ops;
u64 offset = 0;
+ drm_WARN_ON(&ptdev->base,
+ (iova < vm->locked_region.start) ||
+ (iova + size > vm->locked_region.start + vm->locked_region.size));
drm_dbg(&ptdev->base, "unmap: as=%d, iova=%llx, len=%llx", vm->as.id, iova, size);
while (offset < size) {
@@ -915,13 +931,12 @@ static int panthor_vm_unmap_pages(struct panthor_vm *vm, u64 iova, u64 size)
iova + offset + unmapped_sz,
iova + offset + pgsize * pgcount,
iova, iova + size);
- panthor_vm_flush_range(vm, iova, offset + unmapped_sz);
return -EINVAL;
}
offset += unmapped_sz;
}
- return panthor_vm_flush_range(vm, iova, size);
+ return 0;
}
static int
@@ -938,6 +953,10 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, int prot,
if (!size)
return 0;
+ drm_WARN_ON(&ptdev->base,
+ (iova < vm->locked_region.start) ||
+ (iova + size > vm->locked_region.start + vm->locked_region.size));
+
for_each_sgtable_dma_sg(sgt, sgl, count) {
dma_addr_t paddr = sg_dma_address(sgl);
size_t len = sg_dma_len(sgl);
@@ -985,7 +1004,7 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, int prot,
offset = 0;
}
- return panthor_vm_flush_range(vm, start_iova, iova - start_iova);
+ return 0;
}
static int flags_to_prot(u32 flags)
@@ -1654,6 +1673,38 @@ static const char *access_type_name(struct panthor_device *ptdev,
}
}
+static int panthor_vm_lock_region(struct panthor_vm *vm, u64 start, u64 size)
+{
+ struct panthor_device *ptdev = vm->ptdev;
+ int ret;
+
+ mutex_lock(&ptdev->mmu->as.slots_lock);
+ drm_WARN_ON(&ptdev->base, vm->locked_region.start || vm->locked_region.size);
+ vm->locked_region.start = start;
+ vm->locked_region.size = size;
+ if (vm->as.id >= 0) {
+ lock_region(ptdev, vm->as.id, start, size);
+ ret = wait_ready(ptdev, vm->as.id);
+ }
+ mutex_unlock(&ptdev->mmu->as.slots_lock);
+
+ return ret;
+}
+
+static void panthor_vm_unlock_region(struct panthor_vm *vm)
+{
+ struct panthor_device *ptdev = vm->ptdev;
+
+ mutex_lock(&ptdev->mmu->as.slots_lock);
+ if (vm->as.id >= 0) {
+ write_cmd(ptdev, vm->as.id, AS_COMMAND_FLUSH_MEM);
+ drm_WARN_ON(&ptdev->base, wait_ready(ptdev, vm->as.id));
+ }
+ vm->locked_region.start = 0;
+ vm->locked_region.size = 0;
+ mutex_unlock(&ptdev->mmu->as.slots_lock);
+}
+
static void panthor_mmu_irq_handler(struct panthor_device *ptdev, u32 status)
{
bool has_unhandled_faults = false;
@@ -2179,6 +2230,11 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct panthor_vm_op_ctx *op,
mutex_lock(&vm->op_lock);
vm->op_ctx = op;
+
+ ret = panthor_vm_lock_region(vm, op->va.addr, op->va.range);
+ if (ret)
+ goto out;
+
switch (op_type) {
case DRM_PANTHOR_VM_BIND_OP_TYPE_MAP:
if (vm->unusable) {
@@ -2199,6 +2255,9 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct panthor_vm_op_ctx *op,
break;
}
+ panthor_vm_unlock_region(vm);
+
+out:
if (ret && flag_vm_unusable_on_failure)
vm->unusable = true;
base-commit: 026a60e3c1c55845bd9fdaa202dad81c3f95ae6b
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/7] drm/gpuvm: Kill drm_gpuva_init()
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 1/7] drm/panthor: Add support for atomic page table updates Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 3/7] drm/gpuvm: Pass map arguments through a struct Caterina Shablia
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Boris Brezillon <boris.brezillon@collabora.com>
drm_gpuva_init() only has one internal user, and given we are about to
add new optional fields, it only add maintenance burden for no real
benefit, so let's kill the thing now.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
include/drm/drm_gpuvm.h | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h
index 2a9629377633..6fdf2aff3e90 100644
--- a/include/drm/drm_gpuvm.h
+++ b/include/drm/drm_gpuvm.h
@@ -160,15 +160,6 @@ struct drm_gpuva *drm_gpuva_find_first(struct drm_gpuvm *gpuvm,
struct drm_gpuva *drm_gpuva_find_prev(struct drm_gpuvm *gpuvm, u64 start);
struct drm_gpuva *drm_gpuva_find_next(struct drm_gpuvm *gpuvm, u64 end);
-static inline void drm_gpuva_init(struct drm_gpuva *va, u64 addr, u64 range,
- struct drm_gem_object *obj, u64 offset)
-{
- va->va.addr = addr;
- va->va.range = range;
- va->gem.obj = obj;
- va->gem.offset = offset;
-}
-
/**
* drm_gpuva_invalidate() - sets whether the backing GEM of this &drm_gpuva is
* invalidated
@@ -1079,8 +1070,10 @@ void drm_gpuva_ops_free(struct drm_gpuvm *gpuvm,
static inline void drm_gpuva_init_from_op(struct drm_gpuva *va,
struct drm_gpuva_op_map *op)
{
- drm_gpuva_init(va, op->va.addr, op->va.range,
- op->gem.obj, op->gem.offset);
+ va->va.addr = op->va.addr;
+ va->va.range = op->va.range;
+ va->gem.obj = op->gem.obj;
+ va->gem.offset = op->gem.offset;
}
/**
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/7] drm/gpuvm: Pass map arguments through a struct
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 1/7] drm/panthor: Add support for atomic page table updates Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 2/7] drm/gpuvm: Kill drm_gpuva_init() Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 4/7] drm/gpuvm: Add a helper to check if two VA can be merged Caterina Shablia
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Boris Brezillon <boris.brezillon@collabora.com>
We are about to pass more arguments to drm_gpuvm_sm_map[_ops_create](),
so, before we do that, let's pass arguments through a struct instead
of changing each call site every time a new optional argument is added.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/drm_gpuvm.c | 77 +++++++++++---------------
drivers/gpu/drm/imagination/pvr_vm.c | 15 +++--
drivers/gpu/drm/nouveau/nouveau_uvmm.c | 11 ++--
drivers/gpu/drm/panthor/panthor_mmu.c | 13 ++++-
drivers/gpu/drm/xe/xe_vm.c | 13 ++++-
include/drm/drm_gpuvm.h | 34 ++++++++++--
6 files changed, 98 insertions(+), 65 deletions(-)
diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
index e89b932e987c..ae201d45e6b8 100644
--- a/drivers/gpu/drm/drm_gpuvm.c
+++ b/drivers/gpu/drm/drm_gpuvm.c
@@ -2054,16 +2054,15 @@ EXPORT_SYMBOL_GPL(drm_gpuva_unmap);
static int
op_map_cb(const struct drm_gpuvm_ops *fn, void *priv,
- u64 addr, u64 range,
- struct drm_gem_object *obj, u64 offset)
+ const struct drm_gpuvm_map_req *req)
{
struct drm_gpuva_op op = {};
op.op = DRM_GPUVA_OP_MAP;
- op.map.va.addr = addr;
- op.map.va.range = range;
- op.map.gem.obj = obj;
- op.map.gem.offset = offset;
+ op.map.va.addr = req->va.addr;
+ op.map.va.range = req->va.range;
+ op.map.gem.obj = req->gem.obj;
+ op.map.gem.offset = req->gem.offset;
return fn->sm_step_map(&op, priv);
}
@@ -2102,17 +2101,16 @@ op_unmap_cb(const struct drm_gpuvm_ops *fn, void *priv,
static int
__drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
const struct drm_gpuvm_ops *ops, void *priv,
- u64 req_addr, u64 req_range,
- struct drm_gem_object *req_obj, u64 req_offset)
+ const struct drm_gpuvm_map_req *req)
{
struct drm_gpuva *va, *next;
- u64 req_end = req_addr + req_range;
+ u64 req_end = req->va.addr + req->va.range;
int ret;
- if (unlikely(!drm_gpuvm_range_valid(gpuvm, req_addr, req_range)))
+ if (unlikely(!drm_gpuvm_range_valid(gpuvm, req->va.addr, req->va.range)))
return -EINVAL;
- drm_gpuvm_for_each_va_range_safe(va, next, gpuvm, req_addr, req_end) {
+ drm_gpuvm_for_each_va_range_safe(va, next, gpuvm, req->va.addr, req_end) {
struct drm_gem_object *obj = va->gem.obj;
u64 offset = va->gem.offset;
u64 addr = va->va.addr;
@@ -2120,9 +2118,9 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
u64 end = addr + range;
bool merge = !!va->gem.obj;
- if (addr == req_addr) {
- merge &= obj == req_obj &&
- offset == req_offset;
+ if (addr == req->va.addr) {
+ merge &= obj == req->gem.obj &&
+ offset == req->gem.offset;
if (end == req_end) {
ret = op_unmap_cb(ops, priv, va, merge);
@@ -2141,9 +2139,9 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
if (end > req_end) {
struct drm_gpuva_op_map n = {
.va.addr = req_end,
- .va.range = range - req_range,
+ .va.range = range - req->va.range,
.gem.obj = obj,
- .gem.offset = offset + req_range,
+ .gem.offset = offset + req->va.range,
};
struct drm_gpuva_op_unmap u = {
.va = va,
@@ -2155,8 +2153,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
return ret;
break;
}
- } else if (addr < req_addr) {
- u64 ls_range = req_addr - addr;
+ } else if (addr < req->va.addr) {
+ u64 ls_range = req->va.addr - addr;
struct drm_gpuva_op_map p = {
.va.addr = addr,
.va.range = ls_range,
@@ -2165,8 +2163,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
};
struct drm_gpuva_op_unmap u = { .va = va };
- merge &= obj == req_obj &&
- offset + ls_range == req_offset;
+ merge &= obj == req->gem.obj &&
+ offset + ls_range == req->gem.offset;
u.keep = merge;
if (end == req_end) {
@@ -2189,7 +2187,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.range = end - req_end,
.gem.obj = obj,
.gem.offset = offset + ls_range +
- req_range,
+ req->va.range,
};
ret = op_remap_cb(ops, priv, &p, &n, &u);
@@ -2197,10 +2195,10 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
return ret;
break;
}
- } else if (addr > req_addr) {
- merge &= obj == req_obj &&
- offset == req_offset +
- (addr - req_addr);
+ } else if (addr > req->va.addr) {
+ merge &= obj == req->gem.obj &&
+ offset == req->gem.offset +
+ (addr - req->va.addr);
if (end == req_end) {
ret = op_unmap_cb(ops, priv, va, merge);
@@ -2228,6 +2226,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.keep = merge,
};
+
ret = op_remap_cb(ops, priv, NULL, &n, &u);
if (ret)
return ret;
@@ -2236,9 +2235,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
}
}
- return op_map_cb(ops, priv,
- req_addr, req_range,
- req_obj, req_offset);
+ return op_map_cb(ops, priv, req);
}
static int
@@ -2302,11 +2299,8 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
/**
* drm_gpuvm_sm_map() - creates the &drm_gpuva_op split/merge steps
* @gpuvm: the &drm_gpuvm representing the GPU VA space
- * @req_addr: the start address of the new mapping
- * @req_range: the range of the new mapping
- * @req_obj: the &drm_gem_object to map
- * @req_offset: the offset within the &drm_gem_object
* @priv: pointer to a driver private data structure
+ * @req: map request information
*
* This function iterates the given range of the GPU VA space. It utilizes the
* &drm_gpuvm_ops to call back into the driver providing the split and merge
@@ -2333,8 +2327,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
*/
int
drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv,
- u64 req_addr, u64 req_range,
- struct drm_gem_object *req_obj, u64 req_offset)
+ const struct drm_gpuvm_map_req *req)
{
const struct drm_gpuvm_ops *ops = gpuvm->ops;
@@ -2343,9 +2336,7 @@ drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv,
ops->sm_step_unmap)))
return -EINVAL;
- return __drm_gpuvm_sm_map(gpuvm, ops, priv,
- req_addr, req_range,
- req_obj, req_offset);
+ return __drm_gpuvm_sm_map(gpuvm, ops, priv, req);
}
EXPORT_SYMBOL_GPL(drm_gpuvm_sm_map);
@@ -2485,10 +2476,7 @@ static const struct drm_gpuvm_ops gpuvm_list_ops = {
/**
* drm_gpuvm_sm_map_ops_create() - creates the &drm_gpuva_ops to split and merge
* @gpuvm: the &drm_gpuvm representing the GPU VA space
- * @req_addr: the start address of the new mapping
- * @req_range: the range of the new mapping
- * @req_obj: the &drm_gem_object to map
- * @req_offset: the offset within the &drm_gem_object
+ * @req: map request arguments
*
* This function creates a list of operations to perform splitting and merging
* of existent mapping(s) with the newly requested one.
@@ -2516,8 +2504,7 @@ static const struct drm_gpuvm_ops gpuvm_list_ops = {
*/
struct drm_gpuva_ops *
drm_gpuvm_sm_map_ops_create(struct drm_gpuvm *gpuvm,
- u64 req_addr, u64 req_range,
- struct drm_gem_object *req_obj, u64 req_offset)
+ const struct drm_gpuvm_map_req *req)
{
struct drm_gpuva_ops *ops;
struct {
@@ -2535,9 +2522,7 @@ drm_gpuvm_sm_map_ops_create(struct drm_gpuvm *gpuvm,
args.vm = gpuvm;
args.ops = ops;
- ret = __drm_gpuvm_sm_map(gpuvm, &gpuvm_list_ops, &args,
- req_addr, req_range,
- req_obj, req_offset);
+ ret = __drm_gpuvm_sm_map(gpuvm, &gpuvm_list_ops, &args, req);
if (ret)
goto err_free_ops;
diff --git a/drivers/gpu/drm/imagination/pvr_vm.c b/drivers/gpu/drm/imagination/pvr_vm.c
index 2896fa7501b1..abfdcd279363 100644
--- a/drivers/gpu/drm/imagination/pvr_vm.c
+++ b/drivers/gpu/drm/imagination/pvr_vm.c
@@ -185,12 +185,17 @@ struct pvr_vm_bind_op {
static int pvr_vm_bind_op_exec(struct pvr_vm_bind_op *bind_op)
{
switch (bind_op->type) {
- case PVR_VM_BIND_TYPE_MAP:
+ case PVR_VM_BIND_TYPE_MAP: {
+ const struct drm_gpuvm_map_req map_req = {
+ .va.addr = bind_op->device_addr,
+ .va.range = bind_op->size,
+ .gem.obj = gem_from_pvr_gem(bind_op->pvr_obj),
+ .gem.offset = bind_op->offset,
+ };
+
return drm_gpuvm_sm_map(&bind_op->vm_ctx->gpuvm_mgr,
- bind_op, bind_op->device_addr,
- bind_op->size,
- gem_from_pvr_gem(bind_op->pvr_obj),
- bind_op->offset);
+ bind_op, &map_req);
+ }
case PVR_VM_BIND_TYPE_UNMAP:
return drm_gpuvm_sm_unmap(&bind_op->vm_ctx->gpuvm_mgr,
diff --git a/drivers/gpu/drm/nouveau/nouveau_uvmm.c b/drivers/gpu/drm/nouveau/nouveau_uvmm.c
index 48f105239f42..b481700be666 100644
--- a/drivers/gpu/drm/nouveau/nouveau_uvmm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_uvmm.c
@@ -1276,6 +1276,12 @@ nouveau_uvmm_bind_job_submit(struct nouveau_job *job,
break;
case OP_MAP: {
struct nouveau_uvma_region *reg;
+ struct drm_gpuvm_map_req map_req = {
+ .va.addr = op->va.addr,
+ .va.range = op->va.range,
+ .gem.obj = op->gem.obj,
+ .gem.offset = op->gem.offset,
+ };
reg = nouveau_uvma_region_find_first(uvmm,
op->va.addr,
@@ -1301,10 +1307,7 @@ nouveau_uvmm_bind_job_submit(struct nouveau_job *job,
}
op->ops = drm_gpuvm_sm_map_ops_create(&uvmm->base,
- op->va.addr,
- op->va.range,
- op->gem.obj,
- op->gem.offset);
+ &map_req);
if (IS_ERR(op->ops)) {
ret = PTR_ERR(op->ops);
goto unwind_continue;
diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
index 1e58948587a9..a7852485e638 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor/panthor_mmu.c
@@ -2236,15 +2236,22 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct panthor_vm_op_ctx *op,
goto out;
switch (op_type) {
- case DRM_PANTHOR_VM_BIND_OP_TYPE_MAP:
+ case DRM_PANTHOR_VM_BIND_OP_TYPE_MAP: {
+ const struct drm_gpuvm_map_req map_req = {
+ .va.addr = op->va.addr,
+ .va.range = op->va.range,
+ .gem.obj = op->map.vm_bo->obj,
+ .gem.offset = op->map.bo_offset,
+ };
+
if (vm->unusable) {
ret = -EINVAL;
break;
}
- ret = drm_gpuvm_sm_map(&vm->base, vm, op->va.addr, op->va.range,
- op->map.vm_bo->obj, op->map.bo_offset);
+ ret = drm_gpuvm_sm_map(&vm->base, vm, &map_req);
break;
+ }
case DRM_PANTHOR_VM_BIND_OP_TYPE_UNMAP:
ret = drm_gpuvm_sm_unmap(&vm->base, vm, op->va.addr, op->va.range);
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 861577746929..80bc741bdb6b 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -2246,10 +2246,17 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
switch (operation) {
case DRM_XE_VM_BIND_OP_MAP:
- case DRM_XE_VM_BIND_OP_MAP_USERPTR:
- ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, addr, range,
- obj, bo_offset_or_userptr);
+ case DRM_XE_VM_BIND_OP_MAP_USERPTR: {
+ struct drm_gpuvm_map_req map_req = {
+ .va.addr = addr,
+ .va.range = range,
+ .gem.obj = obj,
+ .gem.offset = bo_offset_or_userptr,
+ };
+
+ ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, &map_req);
break;
+ }
case DRM_XE_VM_BIND_OP_UNMAP:
ops = drm_gpuvm_sm_unmap_ops_create(&vm->gpuvm, addr, range);
break;
diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h
index 6fdf2aff3e90..a6e6c33fc10b 100644
--- a/include/drm/drm_gpuvm.h
+++ b/include/drm/drm_gpuvm.h
@@ -1049,10 +1049,37 @@ struct drm_gpuva_ops {
*/
#define drm_gpuva_next_op(op) list_next_entry(op, entry)
+/**
+ * struct drm_gpuvm_map_req - arguments passed to drm_gpuvm_sm_map[_ops_create]()
+ */
+struct drm_gpuvm_map_req {
+ /** @va: virtual address related fields */
+ struct {
+ /** @va.addr: start of the virtual address range to map to */
+ u64 addr;
+
+ /** @va.size: size of the virtual address range to map to */
+ u64 range;
+ } va;
+
+ /** @gem: GEM related fields */
+ struct {
+ /**
+ * @obj: GEM object to map.
+ *
+ * Can be NULL if the virtual range is not backed by a GEM object.
+ */
+ struct drm_gem_object *obj;
+
+ /** @offset: offset in the GEM */
+ u64 offset;
+ } gem;
+};
+
struct drm_gpuva_ops *
drm_gpuvm_sm_map_ops_create(struct drm_gpuvm *gpuvm,
- u64 addr, u64 range,
- struct drm_gem_object *obj, u64 offset);
+ const struct drm_gpuvm_map_req *req);
+
struct drm_gpuva_ops *
drm_gpuvm_sm_unmap_ops_create(struct drm_gpuvm *gpuvm,
u64 addr, u64 range);
@@ -1198,8 +1225,7 @@ struct drm_gpuvm_ops {
};
int drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv,
- u64 addr, u64 range,
- struct drm_gem_object *obj, u64 offset);
+ const struct drm_gpuvm_map_req *req);
int drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm, void *priv,
u64 addr, u64 range);
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 4/7] drm/gpuvm: Add a helper to check if two VA can be merged
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (2 preceding siblings ...)
2025-07-03 20:52 ` [PATCH v3 3/7] drm/gpuvm: Pass map arguments through a struct Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 5/7] drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map Caterina Shablia
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Boris Brezillon <boris.brezillon@collabora.com>
We are going to add flags/properties that will impact the VA merging
ability. Instead of sprinkling tests all over the place in
__drm_gpuvm_sm_map(), let's add a helper aggregating all these checks
can call it for every existing VA we walk through in the
__drm_gpuvm_sm_map() loop.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/drm_gpuvm.c | 47 +++++++++++++++++++++++++++++--------
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
index ae201d45e6b8..2df04dfcb6ef 100644
--- a/drivers/gpu/drm/drm_gpuvm.c
+++ b/drivers/gpu/drm/drm_gpuvm.c
@@ -2098,12 +2098,48 @@ op_unmap_cb(const struct drm_gpuvm_ops *fn, void *priv,
return fn->sm_step_unmap(&op, priv);
}
+static bool can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva *a,
+ const struct drm_gpuva *b)
+{
+ /* Only GEM-based mappings can be merged, and they must point to
+ * the same GEM object.
+ */
+ if (a->gem.obj != b->gem.obj || !a->gem.obj)
+ return false;
+
+ /* Let's keep things simple for now and force all flags to match. */
+ if (a->flags != b->flags)
+ return false;
+
+ /* Order VAs for the rest of the checks. */
+ if (a->va.addr > b->va.addr)
+ swap(a, b);
+
+ /* We assume the caller already checked that VAs overlap or are
+ * contiguous.
+ */
+ if (drm_WARN_ON(gpuvm->drm, b->va.addr > a->va.addr + a->va.range))
+ return false;
+
+ /* We intentionally ignore u64 underflows because all we care about
+ * here is whether the VA diff matches the GEM offset diff.
+ */
+ return b->va.addr - a->va.addr == b->gem.offset - a->gem.offset;
+}
+
static int
__drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
const struct drm_gpuvm_ops *ops, void *priv,
const struct drm_gpuvm_map_req *req)
{
struct drm_gpuva *va, *next;
+ struct drm_gpuva reqva = {
+ .va.addr = req->va.addr,
+ .va.range = req->va.range,
+ .gem.offset = req->gem.offset,
+ .gem.obj = req->gem.obj,
+ .flags = req->flags,
+ };
u64 req_end = req->va.addr + req->va.range;
int ret;
@@ -2116,12 +2152,9 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
u64 addr = va->va.addr;
u64 range = va->va.range;
u64 end = addr + range;
- bool merge = !!va->gem.obj;
+ bool merge = can_merge(gpuvm, va, &reqva);
if (addr == req->va.addr) {
- merge &= obj == req->gem.obj &&
- offset == req->gem.offset;
-
if (end == req_end) {
ret = op_unmap_cb(ops, priv, va, merge);
if (ret)
@@ -2163,8 +2196,6 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
};
struct drm_gpuva_op_unmap u = { .va = va };
- merge &= obj == req->gem.obj &&
- offset + ls_range == req->gem.offset;
u.keep = merge;
if (end == req_end) {
@@ -2196,10 +2227,6 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
break;
}
} else if (addr > req->va.addr) {
- merge &= obj == req->gem.obj &&
- offset == req->gem.offset +
- (addr - req->va.addr);
-
if (end == req_end) {
ret = op_unmap_cb(ops, priv, va, merge);
if (ret)
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 5/7] drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (3 preceding siblings ...)
2025-07-03 20:52 ` [PATCH v3 4/7] drm/gpuvm: Add a helper to check if two VA can be merged Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 6/7] drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic Caterina Shablia
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Asahi Lina <lina@asahilina.net>
drm_gpuva objects have a flags field. Currently, this can be managed by
drivers out-of-band, without any special handling in drm_gpuvm.
To be able to introduce flags that do affect the logic in the drm_gpuvm
core, we need to plumb it through the map calls. This will allow the
core to check the flags on map and alter the merge/split logic depending
on the requested flags and the flags of the existing drm_gpuva ranges
that are being split.
Signed-off-by: Asahi Lina <lina@asahilina.net>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/drm_gpuvm.c | 7 +++++++
include/drm/drm_gpuvm.h | 9 +++++++++
2 files changed, 16 insertions(+)
diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
index 2df04dfcb6ef..a24b6159a0d4 100644
--- a/drivers/gpu/drm/drm_gpuvm.c
+++ b/drivers/gpu/drm/drm_gpuvm.c
@@ -2063,6 +2063,7 @@ op_map_cb(const struct drm_gpuvm_ops *fn, void *priv,
op.map.va.range = req->va.range;
op.map.gem.obj = req->gem.obj;
op.map.gem.offset = req->gem.offset;
+ op.map.flags = req->flags;
return fn->sm_step_map(&op, priv);
}
@@ -2175,6 +2176,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.range = range - req->va.range,
.gem.obj = obj,
.gem.offset = offset + req->va.range,
+ .flags = va->flags,
};
struct drm_gpuva_op_unmap u = {
.va = va,
@@ -2193,6 +2195,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.range = ls_range,
.gem.obj = obj,
.gem.offset = offset,
+ .flags = va->flags,
};
struct drm_gpuva_op_unmap u = { .va = va };
@@ -2219,6 +2222,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.gem.obj = obj,
.gem.offset = offset + ls_range +
req->va.range,
+ .flags = va->flags,
};
ret = op_remap_cb(ops, priv, &p, &n, &u);
@@ -2247,6 +2251,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.range = end - req_end,
.gem.obj = obj,
.gem.offset = offset + req_end - addr,
+ .flags = va->flags,
};
struct drm_gpuva_op_unmap u = {
.va = va,
@@ -2291,6 +2296,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
prev.va.range = req_addr - addr;
prev.gem.obj = obj;
prev.gem.offset = offset;
+ prev.flags = va->flags;
prev_split = true;
}
@@ -2300,6 +2306,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
next.va.range = end - req_end;
next.gem.obj = obj;
next.gem.offset = offset + (req_end - addr);
+ next.flags = va->flags;
next_split = true;
}
diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h
index a6e6c33fc10b..f77a89e791f1 100644
--- a/include/drm/drm_gpuvm.h
+++ b/include/drm/drm_gpuvm.h
@@ -847,6 +847,11 @@ struct drm_gpuva_op_map {
*/
struct drm_gem_object *obj;
} gem;
+
+ /**
+ * @flags: requested flags for the &drm_gpuva for this mapping
+ */
+ enum drm_gpuva_flags flags;
};
/**
@@ -1074,6 +1079,9 @@ struct drm_gpuvm_map_req {
/** @offset: offset in the GEM */
u64 offset;
} gem;
+
+ /** @flags: combination of DRM_GPUVA_ flags describing the mapping properties. */
+ enum drm_gpuva_flags flags;
};
struct drm_gpuva_ops *
@@ -1097,6 +1105,7 @@ void drm_gpuva_ops_free(struct drm_gpuvm *gpuvm,
static inline void drm_gpuva_init_from_op(struct drm_gpuva *va,
struct drm_gpuva_op_map *op)
{
+ va->flags = op->flags;
va->va.addr = op->va.addr;
va->va.range = op->va.range;
va->gem.obj = op->gem.obj;
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 6/7] drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (4 preceding siblings ...)
2025-07-03 20:52 ` [PATCH v3 5/7] drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 7/7] drm/panthor: Add support for repeated mappings Caterina Shablia
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Asahi Lina <lina@asahilina.net>
To be able to support "fake sparse" mappings without relying on GPU page
fault handling, drivers may need to create large (e.g. 4GiB) mappings of
the same page repeatedly (or same range of pages). Doing this through
individual mappings would be very wasteful. This can be handled better
by using a flag on map creation, but to do it safely, drm_gpuvm needs to
be aware of this special case.
Add a flag that signals that a given mapping is a page mapping, which is
repeated all over the entire requested VA range. This tweaks the
sm_map() logic to treat the GEM offsets differently when mappings are
a repeated ones so they are not incremented as they would be with regular
mappings.
The size of the GEM portion to repeat is passed through
drm_gpuva::gem::range. Most of the time it will be a page size, but
it can be bigger as long as it's less that drm_gpuva::va::range, and
drm_gpuva::gem::range is a multiple of drm_gpuva::va::range.
Signed-off-by: Asahi Lina <lina@asahilina.net>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/drm_gpuvm.c | 71 +++++++++++++++++++++++++++++++++----
include/drm/drm_gpuvm.h | 43 +++++++++++++++++++++-
2 files changed, 107 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
index a24b6159a0d4..7b0c90119d32 100644
--- a/drivers/gpu/drm/drm_gpuvm.c
+++ b/drivers/gpu/drm/drm_gpuvm.c
@@ -2063,6 +2063,7 @@ op_map_cb(const struct drm_gpuvm_ops *fn, void *priv,
op.map.va.range = req->va.range;
op.map.gem.obj = req->gem.obj;
op.map.gem.offset = req->gem.offset;
+ op.map.gem.range = req->gem.range;
op.map.flags = req->flags;
return fn->sm_step_map(&op, priv);
@@ -2122,12 +2123,53 @@ static bool can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva *a,
if (drm_WARN_ON(gpuvm->drm, b->va.addr > a->va.addr + a->va.range))
return false;
+ if (a->flags & DRM_GPUVA_REPEAT) {
+ u64 va_diff = b->va.addr - a->va.addr;
+
+ /* If this is a repeated mapping, both the GEM range
+ * and offset must match.
+ */
+ if (a->gem.range != b->gem.range ||
+ a->gem.offset != b->gem.offset)
+ return false;
+
+ /* The difference between the VA addresses must be a
+ * multiple of the repeated range, otherwise there's
+ * a shift.
+ */
+ if (do_div(va_diff, a->gem.range))
+ return false;
+
+ return true;
+ }
+
/* We intentionally ignore u64 underflows because all we care about
* here is whether the VA diff matches the GEM offset diff.
*/
return b->va.addr - a->va.addr == b->gem.offset - a->gem.offset;
}
+static int check_map_req(struct drm_gpuvm *gpuvm,
+ const struct drm_gpuvm_map_req *req)
+{
+ if (unlikely(!drm_gpuvm_range_valid(gpuvm, req->va.addr, req->va.range)))
+ return -EINVAL;
+
+ if (req->flags & DRM_GPUVA_REPEAT) {
+ u64 va_range = req->va.range;
+
+ /* For a repeated mapping, GEM range must be > 0
+ * and a multiple of the VA range.
+ */
+ if (unlikely(!req->gem.range ||
+ (va_range < req->gem.range) ||
+ do_div(va_range, req->gem.range)))
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int
__drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
const struct drm_gpuvm_ops *ops, void *priv,
@@ -2137,6 +2179,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
struct drm_gpuva reqva = {
.va.addr = req->va.addr,
.va.range = req->va.range,
+ .gem.range = req->gem.range,
.gem.offset = req->gem.offset,
.gem.obj = req->gem.obj,
.flags = req->flags,
@@ -2144,7 +2187,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
u64 req_end = req->va.addr + req->va.range;
int ret;
- if (unlikely(!drm_gpuvm_range_valid(gpuvm, req->va.addr, req->va.range)))
+ ret = check_map_req(gpuvm, req);
+ if (unlikely(ret))
return -EINVAL;
drm_gpuvm_for_each_va_range_safe(va, next, gpuvm, req->va.addr, req_end) {
@@ -2175,7 +2219,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.addr = req_end,
.va.range = range - req->va.range,
.gem.obj = obj,
- .gem.offset = offset + req->va.range,
+ .gem.range = va->gem.range,
+ .gem.offset = offset,
.flags = va->flags,
};
struct drm_gpuva_op_unmap u = {
@@ -2183,6 +2228,9 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.keep = merge,
};
+ if (!(va->flags & DRM_GPUVA_REPEAT))
+ n.gem.offset += req->va.range;
+
ret = op_remap_cb(ops, priv, NULL, &n, &u);
if (ret)
return ret;
@@ -2194,6 +2242,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.addr = addr,
.va.range = ls_range,
.gem.obj = obj,
+ .gem.range = va->gem.range,
.gem.offset = offset,
.flags = va->flags,
};
@@ -2220,11 +2269,14 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.addr = req_end,
.va.range = end - req_end,
.gem.obj = obj,
- .gem.offset = offset + ls_range +
- req->va.range,
+ .gem.range = va->gem.range,
+ .gem.offset = offset,
.flags = va->flags,
};
+ if (!(va->flags & DRM_GPUVA_REPEAT))
+ n.gem.offset += ls_range + req->va.range;
+
ret = op_remap_cb(ops, priv, &p, &n, &u);
if (ret)
return ret;
@@ -2250,7 +2302,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.va.addr = req_end,
.va.range = end - req_end,
.gem.obj = obj,
- .gem.offset = offset + req_end - addr,
+ .gem.range = va->gem.range,
+ .gem.offset = offset,
.flags = va->flags,
};
struct drm_gpuva_op_unmap u = {
@@ -2258,6 +2311,8 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
.keep = merge,
};
+ if (!(va->flags & DRM_GPUVA_REPEAT))
+ n.gem.offset += req_end - addr;
ret = op_remap_cb(ops, priv, NULL, &n, &u);
if (ret)
@@ -2295,6 +2350,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
prev.va.addr = addr;
prev.va.range = req_addr - addr;
prev.gem.obj = obj;
+ prev.gem.range = va->gem.range;
prev.gem.offset = offset;
prev.flags = va->flags;
@@ -2305,7 +2361,10 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
next.va.addr = req_end;
next.va.range = end - req_end;
next.gem.obj = obj;
- next.gem.offset = offset + (req_end - addr);
+ prev.gem.range = va->gem.range;
+ next.gem.offset = offset;
+ if (!(va->flags & DRM_GPUVA_REPEAT))
+ next.gem.offset += req_end - addr;
next.flags = va->flags;
next_split = true;
diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h
index f77a89e791f1..629e8508f99f 100644
--- a/include/drm/drm_gpuvm.h
+++ b/include/drm/drm_gpuvm.h
@@ -56,10 +56,19 @@ enum drm_gpuva_flags {
*/
DRM_GPUVA_SPARSE = (1 << 1),
+ /**
+ * @DRM_GPUVA_REPEAT:
+ *
+ * Flag indicating that the &drm_gpuva is a mapping of a GEM
+ * portion repeated multiple times to fill the virtual address
+ * range.
+ */
+ DRM_GPUVA_REPEAT = (1 << 2),
+
/**
* @DRM_GPUVA_USERBITS: user defined bits
*/
- DRM_GPUVA_USERBITS = (1 << 2),
+ DRM_GPUVA_USERBITS = (1 << 3),
};
/**
@@ -111,6 +120,18 @@ struct drm_gpuva {
*/
u64 offset;
+ /*
+ * @gem.range: the range of the GEM that is mapped
+ *
+ * When dealing with normal mappings, this must be zero.
+ * When flags has DRM_GPUVA_REPEAT set, this field must be
+ * smaller than va.range and va.range must be a multiple of
+ * gem.range.
+ * This is a u32 not a u64 because we expect repeated mappings
+ * to be pointing to relatively small portions of a GEM object.
+ */
+ u32 range;
+
/**
* @gem.obj: the mapped &drm_gem_object
*/
@@ -842,6 +863,17 @@ struct drm_gpuva_op_map {
*/
u64 offset;
+ /*
+ * @gem.range: the range of the GEM that is mapped
+ *
+ * When dealing with normal mappings, this must be zero.
+ * When flags has DRM_GPUVA_REPEAT set, it must be smaller
+ * and be a multiple of va.range. This is a u32 not a u64
+ * because we expect repeated mappings to be pointing to
+ * a relatively small portion of a GEM object.
+ */
+ u32 range;
+
/**
* @gem.obj: the &drm_gem_object to map
*/
@@ -1078,6 +1110,15 @@ struct drm_gpuvm_map_req {
/** @offset: offset in the GEM */
u64 offset;
+
+ /**
+ * @range: size of the range of the GEM object to map
+ *
+ * Must be zero unless flags has DRM_GPUVA_REPEAT set.
+ * If DRM_GPUVA_REPEAT is set, this field must be less than va.range,
+ * and va.range must be a multiple of gem.range.
+ */
+ u32 range;
} gem;
/** @flags: combination of DRM_GPUVA_ flags describing the mapping properties. */
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 7/7] drm/panthor: Add support for repeated mappings
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (5 preceding siblings ...)
2025-07-03 20:52 ` [PATCH v3 6/7] drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic Caterina Shablia
@ 2025-07-03 20:52 ` Caterina Shablia
2025-07-03 21:02 ` [PATCH v3 0/7] drm/panthor: support " Danilo Krummrich
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Caterina Shablia @ 2025-07-03 20:52 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Danilo Krummrich, Boris Brezillon, Steven Price, Liviu Dudau,
Lucas De Marchi, Thomas Hellström, Rodrigo Vivi
Cc: dri-devel, linux-kernel, nouveau, intel-xe, Asahi Lina,
Caterina Shablia
From: Boris Brezillon <boris.brezillon@collabora.com>
This allows us to optimize mapping of a relatively small
portion of a BO over and over in a large VA range, which
is useful to support Vulkan sparse bindings in an efficient
way.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Co-developed-by: Caterina Shablia <caterina.shablia@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
---
drivers/gpu/drm/panthor/panthor_drv.c | 3 +-
drivers/gpu/drm/panthor/panthor_mmu.c | 78 ++++++++++++++++++++++++---
include/uapi/drm/panthor_drm.h | 23 ++++++++
3 files changed, 95 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
index 1116f2d2826e..585c07b07c42 100644
--- a/drivers/gpu/drm/panthor/panthor_drv.c
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
@@ -1608,6 +1608,7 @@ static void panthor_debugfs_init(struct drm_minor *minor)
* - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
* - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
* - 1.5 - adds DRM_PANTHOR_SET_USER_MMIO_OFFSET ioctl
+ * - 1.6 - adds DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT flag
*/
static const struct drm_driver panthor_drm_driver = {
.driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
@@ -1621,7 +1622,7 @@ static const struct drm_driver panthor_drm_driver = {
.name = "panthor",
.desc = "Panthor DRM driver",
.major = 1,
- .minor = 5,
+ .minor = 6,
.gem_create_object = panthor_gem_create_object,
.gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table,
diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
index a7852485e638..adea26985c31 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor/panthor_mmu.c
@@ -202,6 +202,9 @@ struct panthor_vm_op_ctx {
/** @map.bo_offset: Offset in the buffer object. */
u64 bo_offset;
+ /** @bo_repeat_range: Repeated BO range. */
+ u32 bo_repeat_range;
+
/**
* @map.sgt: sg-table pointing to pages backing the GEM object.
*
@@ -1007,6 +1010,26 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, int prot,
return 0;
}
+static int
+panthor_vm_repeated_map_pages(struct panthor_vm *vm, u64 iova, int prot,
+ struct sg_table *sgt, u64 offset, u64 size,
+ u64 count)
+{
+ /* FIXME: we really need to optimize this at the io_pgtable level. */
+ for (u64 i = 0; i < count; i++) {
+ int ret;
+
+ ret = panthor_vm_map_pages(vm, iova + (size * i), prot,
+ sgt, offset, size);
+ if (ret) {
+ panthor_vm_unmap_pages(vm, iova, size * (i - 1));
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
static int flags_to_prot(u32 flags)
{
int prot = 0;
@@ -1203,12 +1226,14 @@ panthor_vm_op_ctx_prealloc_vmas(struct panthor_vm_op_ctx *op_ctx)
(DRM_PANTHOR_VM_BIND_OP_MAP_READONLY | \
DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | \
DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED | \
+ DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT | \
DRM_PANTHOR_VM_BIND_OP_TYPE_MASK)
static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx,
struct panthor_vm *vm,
struct panthor_gem_object *bo,
u64 offset,
+ u32 repeat_range,
u64 size, u64 va,
u32 flags)
{
@@ -1224,9 +1249,22 @@ static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx,
(flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) != DRM_PANTHOR_VM_BIND_OP_TYPE_MAP)
return -EINVAL;
- /* Make sure the VA and size are aligned and in-bounds. */
- if (size > bo->base.base.size || offset > bo->base.base.size - size)
- return -EINVAL;
+ if (!(flags & DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT)) {
+ /* Make sure the VA and size are aligned and in-bounds. */
+ if (size > bo->base.base.size || offset > bo->base.base.size - size)
+ return -EINVAL;
+ } else {
+ /* Make sure the repeat_range is in-bounds. */
+ if (repeat_range > bo->base.base.size || offset > bo->base.base.size - repeat_range)
+ return -EINVAL;
+
+ /* Make sure size is a multiple of repeat_range */
+
+ u64 repeat_count = size;
+
+ if (do_div(repeat_count, repeat_range))
+ return -EINVAL;
+ }
/* If the BO has an exclusive VM attached, it can't be mapped to other VMs. */
if (bo->exclusive_vm_root_gem &&
@@ -1295,6 +1333,7 @@ static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx,
drm_gem_shmem_unpin(&bo->base);
op_ctx->map.bo_offset = offset;
+ op_ctx->map.bo_repeat_range = repeat_range;
/* L1, L2 and L3 page tables.
* We could optimize L3 allocation by iterating over the sgt and merging
@@ -2112,9 +2151,22 @@ static int panthor_gpuva_sm_step_map(struct drm_gpuva_op *op, void *priv)
panthor_vma_init(vma, op_ctx->flags & PANTHOR_VM_MAP_FLAGS);
- ret = panthor_vm_map_pages(vm, op->map.va.addr, flags_to_prot(vma->flags),
- op_ctx->map.sgt, op->map.gem.offset,
- op->map.va.range);
+ if (op_ctx->flags & DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT) {
+ u64 repeat_count = op->map.va.range;
+
+ do_div(repeat_count, op->map.gem.range);
+ ret = panthor_vm_repeated_map_pages(vm, op->map.va.addr,
+ flags_to_prot(vma->flags),
+ op_ctx->map.sgt,
+ op->map.gem.offset,
+ op->map.gem.range,
+ repeat_count);
+ } else {
+ ret = panthor_vm_map_pages(vm, op->map.va.addr,
+ flags_to_prot(vma->flags),
+ op_ctx->map.sgt, op->map.gem.offset,
+ op->map.va.range);
+ }
if (ret)
return ret;
@@ -2237,7 +2289,7 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct panthor_vm_op_ctx *op,
switch (op_type) {
case DRM_PANTHOR_VM_BIND_OP_TYPE_MAP: {
- const struct drm_gpuvm_map_req map_req = {
+ struct drm_gpuvm_map_req map_req = {
.va.addr = op->va.addr,
.va.range = op->va.range,
.gem.obj = op->map.vm_bo->obj,
@@ -2249,6 +2301,11 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct panthor_vm_op_ctx *op,
break;
}
+ if (op->flags & DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT) {
+ map_req.flags |= DRM_GPUVA_REPEAT;
+ map_req.gem.range = op->map.bo_repeat_range;
+ }
+
ret = drm_gpuvm_sm_map(&vm->base, vm, &map_req);
break;
}
@@ -2497,6 +2554,7 @@ panthor_vm_bind_prepare_op_ctx(struct drm_file *file,
ret = panthor_vm_prepare_map_op_ctx(op_ctx, vm,
gem ? to_panthor_bo(gem) : NULL,
op->bo_offset,
+ op->bo_repeat_range,
op->size,
op->va,
op->flags);
@@ -2698,7 +2756,11 @@ int panthor_vm_map_bo_range(struct panthor_vm *vm, struct panthor_gem_object *bo
struct panthor_vm_op_ctx op_ctx;
int ret;
- ret = panthor_vm_prepare_map_op_ctx(&op_ctx, vm, bo, offset, size, va, flags);
+ /* TODO: would be nice to replace with assert instead */
+ if (flags & DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT)
+ return -EINVAL;
+
+ ret = panthor_vm_prepare_map_op_ctx(&op_ctx, vm, bo, offset, 0, size, va, flags);
if (ret)
return ret;
diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
index e1f43deb7eca..ad278bc234b0 100644
--- a/include/uapi/drm/panthor_drm.h
+++ b/include/uapi/drm/panthor_drm.h
@@ -496,6 +496,17 @@ enum drm_panthor_vm_bind_op_flags {
*/
DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED = 1 << 2,
+ /**
+ * @DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT: Repeat a BO range
+ *
+ * Only valid with DRM_PANTHOR_VM_BIND_OP_TYPE_MAP.
+ *
+ * When this is set, a BO range is repeated over the VA range.
+ * drm_panthor_vm_bind_op::bo_repeat_range defines the size of the
+ * BO range to repeat.
+ */
+ DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT = 1 << 3,
+
/**
* @DRM_PANTHOR_VM_BIND_OP_TYPE_MASK: Mask used to determine the type of operation.
*/
@@ -560,6 +571,18 @@ struct drm_panthor_vm_bind_op {
*/
struct drm_panthor_obj_array syncs;
+ /**
+ * @bo_repeat_range: The size of the range to be repeated.
+ *
+ * Must be zero if DRM_PANTHOR_VM_BIND_OP_MAP_REPEAT is not set in
+ * flags.
+ *
+ * Size must be a multiple of bo_repeat_range.
+ */
+ __u32 bo_repeat_range;
+
+ /** @pad: Padding field. MBZ. */
+ __u32 pad;
};
/**
--
2.47.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 0/7] drm/panthor: support repeated mappings
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (6 preceding siblings ...)
2025-07-03 20:52 ` [PATCH v3 7/7] drm/panthor: Add support for repeated mappings Caterina Shablia
@ 2025-07-03 21:02 ` Danilo Krummrich
2025-07-07 13:08 ` ✗ CI.checkpatch: warning for " Patchwork
2025-07-07 13:09 ` ✓ CI.KUnit: success " Patchwork
9 siblings, 0 replies; 11+ messages in thread
From: Danilo Krummrich @ 2025-07-03 21:02 UTC (permalink / raw)
To: Caterina Shablia
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Frank Binns, Matt Coster, Karol Herbst, Lyude Paul,
Boris Brezillon, Steven Price, Liviu Dudau, Lucas De Marchi,
Thomas Hellström, Rodrigo Vivi, dri-devel, linux-kernel,
nouveau, intel-xe, Asahi Lina
On 7/3/25 10:52 PM, Caterina Shablia wrote:
> This patch series adds OP_MAP_REPEAT flag, which lets the user map a BO
> region over an address range repeatedly with just one map operation.
Thanks for resending, will take a look soon!
^ permalink raw reply [flat|nested] 11+ messages in thread
* ✗ CI.checkpatch: warning for drm/panthor: support repeated mappings
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (7 preceding siblings ...)
2025-07-03 21:02 ` [PATCH v3 0/7] drm/panthor: support " Danilo Krummrich
@ 2025-07-07 13:08 ` Patchwork
2025-07-07 13:09 ` ✓ CI.KUnit: success " Patchwork
9 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2025-07-07 13:08 UTC (permalink / raw)
To: Caterina Shablia; +Cc: intel-xe
== Series Details ==
Series: drm/panthor: support repeated mappings
URL : https://patchwork.freedesktop.org/series/151264/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
43254c2aa575037fc031c7ac21b0d031c700b2bf
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit f492a9c282f0ef76731f0a8f99001eb80df0d77a
Author: Boris Brezillon <boris.brezillon@collabora.com>
Date: Thu Jul 3 20:52:59 2025 +0000
drm/panthor: Add support for repeated mappings
This allows us to optimize mapping of a relatively small
portion of a BO over and over in a large VA range, which
is useful to support Vulkan sparse bindings in an efficient
way.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Co-developed-by: Caterina Shablia <caterina.shablia@collabora.com>
Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
+ /mt/dim checkpatch 1e771eeb8454dcea561bff0df9ef9b83136c2461 drm-intel
32b0e527c4aa drm/panthor: Add support for atomic page table updates
eea5f2e68c5e drm/gpuvm: Kill drm_gpuva_init()
7c9a83e3a40f drm/gpuvm: Pass map arguments through a struct
-:136: CHECK:LINE_SPACING: Please don't use multiple blank lines
#136: FILE: drivers/gpu/drm/drm_gpuvm.c:2229:
+
total: 0 errors, 0 warnings, 1 checks, 323 lines checked
10003454aaf4 drm/gpuvm: Add a helper to check if two VA can be merged
f1b547ee0fdf drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map
41b814d4fd30 drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic
-:81: CHECK:UNNECESSARY_PARENTHESES: Unnecessary parentheses around 'va_range < req->gem.range'
#81: FILE: drivers/gpu/drm/drm_gpuvm.c:2164:
+ if (unlikely(!req->gem.range ||
+ (va_range < req->gem.range) ||
+ do_div(va_range, req->gem.range)))
total: 0 errors, 0 warnings, 1 checks, 222 lines checked
f492a9c282f0 drm/panthor: Add support for repeated mappings
^ permalink raw reply [flat|nested] 11+ messages in thread
* ✓ CI.KUnit: success for drm/panthor: support repeated mappings
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
` (8 preceding siblings ...)
2025-07-07 13:08 ` ✗ CI.checkpatch: warning for " Patchwork
@ 2025-07-07 13:09 ` Patchwork
9 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2025-07-07 13:09 UTC (permalink / raw)
To: Caterina Shablia; +Cc: intel-xe
== Series Details ==
Series: drm/panthor: support repeated mappings
URL : https://patchwork.freedesktop.org/series/151264/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[13:08:04] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:08:08] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:08:35] Starting KUnit Kernel (1/1)...
[13:08:35] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:08:35] ================== guc_buf (11 subtests) ===================
[13:08:35] [PASSED] test_smallest
[13:08:35] [PASSED] test_largest
[13:08:35] [PASSED] test_granular
[13:08:35] [PASSED] test_unique
[13:08:35] [PASSED] test_overlap
[13:08:35] [PASSED] test_reusable
[13:08:35] [PASSED] test_too_big
[13:08:35] [PASSED] test_flush
[13:08:35] [PASSED] test_lookup
[13:08:35] [PASSED] test_data
[13:08:35] [PASSED] test_class
[13:08:35] ===================== [PASSED] guc_buf =====================
[13:08:35] =================== guc_dbm (7 subtests) ===================
[13:08:35] [PASSED] test_empty
[13:08:35] [PASSED] test_default
[13:08:35] ======================== test_size ========================
[13:08:35] [PASSED] 4
[13:08:35] [PASSED] 8
[13:08:35] [PASSED] 32
[13:08:35] [PASSED] 256
[13:08:35] ==================== [PASSED] test_size ====================
[13:08:35] ======================= test_reuse ========================
[13:08:35] [PASSED] 4
[13:08:35] [PASSED] 8
[13:08:35] [PASSED] 32
[13:08:35] [PASSED] 256
[13:08:35] =================== [PASSED] test_reuse ====================
[13:08:35] =================== test_range_overlap ====================
[13:08:35] [PASSED] 4
[13:08:35] [PASSED] 8
[13:08:35] [PASSED] 32
[13:08:35] [PASSED] 256
[13:08:35] =============== [PASSED] test_range_overlap ================
[13:08:35] =================== test_range_compact ====================
[13:08:35] [PASSED] 4
[13:08:35] [PASSED] 8
[13:08:35] [PASSED] 32
[13:08:35] [PASSED] 256
[13:08:35] =============== [PASSED] test_range_compact ================
[13:08:35] ==================== test_range_spare =====================
[13:08:35] [PASSED] 4
[13:08:35] [PASSED] 8
[13:08:35] [PASSED] 32
[13:08:35] [PASSED] 256
[13:08:35] ================ [PASSED] test_range_spare =================
[13:08:35] ===================== [PASSED] guc_dbm =====================
[13:08:35] =================== guc_idm (6 subtests) ===================
[13:08:35] [PASSED] bad_init
[13:08:35] [PASSED] no_init
[13:08:35] [PASSED] init_fini
[13:08:35] [PASSED] check_used
[13:08:35] [PASSED] check_quota
[13:08:35] [PASSED] check_all
[13:08:35] ===================== [PASSED] guc_idm =====================
[13:08:35] ================== no_relay (3 subtests) ===================
[13:08:35] [PASSED] xe_drops_guc2pf_if_not_ready
[13:08:35] [PASSED] xe_drops_guc2vf_if_not_ready
[13:08:35] [PASSED] xe_rejects_send_if_not_ready
[13:08:35] ==================== [PASSED] no_relay =====================
[13:08:35] ================== pf_relay (14 subtests) ==================
[13:08:35] [PASSED] pf_rejects_guc2pf_too_short
[13:08:35] [PASSED] pf_rejects_guc2pf_too_long
[13:08:35] [PASSED] pf_rejects_guc2pf_no_payload
[13:08:35] [PASSED] pf_fails_no_payload
[13:08:35] [PASSED] pf_fails_bad_origin
[13:08:35] [PASSED] pf_fails_bad_type
[13:08:35] [PASSED] pf_txn_reports_error
[13:08:35] [PASSED] pf_txn_sends_pf2guc
[13:08:35] [PASSED] pf_sends_pf2guc
[13:08:35] [SKIPPED] pf_loopback_nop
[13:08:35] [SKIPPED] pf_loopback_echo
[13:08:35] [SKIPPED] pf_loopback_fail
[13:08:35] [SKIPPED] pf_loopback_busy
[13:08:35] [SKIPPED] pf_loopback_retry
[13:08:35] ==================== [PASSED] pf_relay =====================
[13:08:35] ================== vf_relay (3 subtests) ===================
[13:08:35] [PASSED] vf_rejects_guc2vf_too_short
[13:08:35] [PASSED] vf_rejects_guc2vf_too_long
[13:08:35] [PASSED] vf_rejects_guc2vf_no_payload
[13:08:35] ==================== [PASSED] vf_relay =====================
[13:08:35] ================= pf_service (11 subtests) =================
[13:08:35] [PASSED] pf_negotiate_any
[13:08:35] [PASSED] pf_negotiate_base_match
[13:08:35] [PASSED] pf_negotiate_base_newer
[13:08:35] [PASSED] pf_negotiate_base_next
[13:08:35] [SKIPPED] pf_negotiate_base_older
[13:08:35] [PASSED] pf_negotiate_base_prev
[13:08:35] [PASSED] pf_negotiate_latest_match
[13:08:35] [PASSED] pf_negotiate_latest_newer
[13:08:35] [PASSED] pf_negotiate_latest_next
[13:08:35] [SKIPPED] pf_negotiate_latest_older
[13:08:35] [SKIPPED] pf_negotiate_latest_prev
[13:08:35] =================== [PASSED] pf_service ====================
[13:08:35] ===================== lmtt (1 subtest) =====================
[13:08:35] ======================== test_ops =========================
[13:08:35] [PASSED] 2-level
[13:08:35] [PASSED] multi-level
[13:08:35] ==================== [PASSED] test_ops =====================
[13:08:35] ====================== [PASSED] lmtt =======================
[13:08:35] =================== xe_mocs (2 subtests) ===================
[13:08:35] ================ xe_live_mocs_kernel_kunit ================
[13:08:35] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[13:08:35] ================ xe_live_mocs_reset_kunit =================
[13:08:35] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[13:08:35] ==================== [SKIPPED] xe_mocs =====================
[13:08:35] ================= xe_migrate (2 subtests) ==================
[13:08:35] ================= xe_migrate_sanity_kunit =================
[13:08:35] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[13:08:35] ================== xe_validate_ccs_kunit ==================
[13:08:35] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[13:08:35] =================== [SKIPPED] xe_migrate ===================
[13:08:35] ================== xe_dma_buf (1 subtest) ==================
[13:08:35] ==================== xe_dma_buf_kunit =====================
[13:08:35] ================ [SKIPPED] xe_dma_buf_kunit ================
[13:08:35] =================== [SKIPPED] xe_dma_buf ===================
[13:08:35] ================= xe_bo_shrink (1 subtest) =================
[13:08:35] =================== xe_bo_shrink_kunit ====================
[13:08:35] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[13:08:35] ================== [SKIPPED] xe_bo_shrink ==================
[13:08:35] ==================== xe_bo (2 subtests) ====================
[13:08:35] ================== xe_ccs_migrate_kunit ===================
[13:08:35] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[13:08:35] ==================== xe_bo_evict_kunit ====================
[13:08:35] =============== [SKIPPED] xe_bo_evict_kunit ================
[13:08:35] ===================== [SKIPPED] xe_bo ======================
[13:08:35] ==================== args (11 subtests) ====================
[13:08:35] [PASSED] count_args_test
[13:08:35] [PASSED] call_args_example
[13:08:35] [PASSED] call_args_test
[13:08:35] [PASSED] drop_first_arg_example
[13:08:35] [PASSED] drop_first_arg_test
[13:08:35] [PASSED] first_arg_example
[13:08:35] [PASSED] first_arg_test
[13:08:35] [PASSED] last_arg_example
[13:08:35] [PASSED] last_arg_test
[13:08:35] [PASSED] pick_arg_example
[13:08:35] [PASSED] sep_comma_example
[13:08:35] ====================== [PASSED] args =======================
[13:08:35] =================== xe_pci (3 subtests) ====================
[13:08:35] ==================== check_graphics_ip ====================
[13:08:35] [PASSED] 12.70 Xe_LPG
[13:08:35] [PASSED] 12.71 Xe_LPG
[13:08:35] [PASSED] 12.74 Xe_LPG+
[13:08:35] [PASSED] 20.01 Xe2_HPG
[13:08:35] [PASSED] 20.02 Xe2_HPG
[13:08:35] [PASSED] 20.04 Xe2_LPG
[13:08:35] [PASSED] 30.00 Xe3_LPG
[13:08:35] [PASSED] 30.01 Xe3_LPG
[13:08:35] [PASSED] 30.03 Xe3_LPG
[13:08:35] ================ [PASSED] check_graphics_ip ================
[13:08:35] ===================== check_media_ip ======================
[13:08:35] [PASSED] 13.00 Xe_LPM+
[13:08:35] [PASSED] 13.01 Xe2_HPM
[13:08:35] [PASSED] 20.00 Xe2_LPM
[13:08:35] [PASSED] 30.00 Xe3_LPM
[13:08:35] [PASSED] 30.02 Xe3_LPM
[13:08:35] ================= [PASSED] check_media_ip ==================
[13:08:35] ================= check_platform_gt_count =================
[13:08:35] [PASSED] 0x9A60 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A68 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A70 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A40 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A49 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A59 (TIGERLAKE)
[13:08:35] [PASSED] 0x9A78 (TIGERLAKE)
[13:08:35] [PASSED] 0x9AC0 (TIGERLAKE)
[13:08:35] [PASSED] 0x9AC9 (TIGERLAKE)
[13:08:35] [PASSED] 0x9AD9 (TIGERLAKE)
[13:08:35] [PASSED] 0x9AF8 (TIGERLAKE)
[13:08:35] [PASSED] 0x4C80 (ROCKETLAKE)
[13:08:35] [PASSED] 0x4C8A (ROCKETLAKE)
[13:08:35] [PASSED] 0x4C8B (ROCKETLAKE)
[13:08:35] [PASSED] 0x4C8C (ROCKETLAKE)
[13:08:35] [PASSED] 0x4C90 (ROCKETLAKE)
[13:08:35] [PASSED] 0x4C9A (ROCKETLAKE)
[13:08:35] [PASSED] 0x4680 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4682 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4688 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x468A (ALDERLAKE_S)
[13:08:35] [PASSED] 0x468B (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4690 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4692 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4693 (ALDERLAKE_S)
[13:08:35] [PASSED] 0x46A0 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46A1 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46A2 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46A3 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46A6 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46A8 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46AA (ALDERLAKE_P)
[13:08:35] [PASSED] 0x462A (ALDERLAKE_P)
[13:08:35] [PASSED] 0x4626 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x4628 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46B0 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46B1 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46B2 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46B3 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46C0 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46C1 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46C2 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46C3 (ALDERLAKE_P)
[13:08:35] [PASSED] 0x46D0 (ALDERLAKE_N)
[13:08:35] [PASSED] 0x46D1 (ALDERLAKE_N)
[13:08:35] [PASSED] 0x46D2 (ALDERLAKE_N)
[13:08:35] [PASSED] 0x46D3 (ALDERLAKE_N)
[13:08:35] [PASSED] 0x46D4 (ALDERLAKE_N)
[13:08:35] [PASSED] 0xA721 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7A1 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7A9 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7AC (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7AD (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA720 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7A0 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7A8 (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7AA (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA7AB (ALDERLAKE_P)
[13:08:35] [PASSED] 0xA780 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA781 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA782 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA783 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA788 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA789 (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA78A (ALDERLAKE_S)
[13:08:35] [PASSED] 0xA78B (ALDERLAKE_S)
[13:08:35] [PASSED] 0x4905 (DG1)
[13:08:35] [PASSED] 0x4906 (DG1)
[13:08:35] [PASSED] 0x4907 (DG1)
[13:08:35] [PASSED] 0x4908 (DG1)
[13:08:35] [PASSED] 0x4909 (DG1)
[13:08:35] [PASSED] 0x56C0 (DG2)
[13:08:35] [PASSED] 0x56C2 (DG2)
[13:08:35] [PASSED] 0x56C1 (DG2)
[13:08:35] [PASSED] 0x7D51 (METEORLAKE)
[13:08:35] [PASSED] 0x7DD1 (METEORLAKE)
[13:08:35] [PASSED] 0x7D41 (METEORLAKE)
[13:08:35] [PASSED] 0x7D67 (METEORLAKE)
[13:08:35] [PASSED] 0xB640 (METEORLAKE)
[13:08:35] [PASSED] 0x56A0 (DG2)
[13:08:35] [PASSED] 0x56A1 (DG2)
[13:08:35] [PASSED] 0x56A2 (DG2)
[13:08:35] [PASSED] 0x56BE (DG2)
[13:08:35] [PASSED] 0x56BF (DG2)
[13:08:35] [PASSED] 0x5690 (DG2)
[13:08:35] [PASSED] 0x5691 (DG2)
[13:08:35] [PASSED] 0x5692 (DG2)
[13:08:35] [PASSED] 0x56A5 (DG2)
[13:08:35] [PASSED] 0x56A6 (DG2)
[13:08:35] [PASSED] 0x56B0 (DG2)
[13:08:35] [PASSED] 0x56B1 (DG2)
[13:08:35] [PASSED] 0x56BA (DG2)
[13:08:35] [PASSED] 0x56BB (DG2)
[13:08:35] [PASSED] 0x56BC (DG2)
[13:08:35] [PASSED] 0x56BD (DG2)
[13:08:35] [PASSED] 0x5693 (DG2)
[13:08:35] [PASSED] 0x5694 (DG2)
[13:08:35] [PASSED] 0x5695 (DG2)
[13:08:35] [PASSED] 0x56A3 (DG2)
[13:08:35] [PASSED] 0x56A4 (DG2)
[13:08:35] [PASSED] 0x56B2 (DG2)
[13:08:35] [PASSED] 0x56B3 (DG2)
[13:08:35] [PASSED] 0x5696 (DG2)
[13:08:35] [PASSED] 0x5697 (DG2)
[13:08:35] [PASSED] 0xB69 (PVC)
[13:08:35] [PASSED] 0xB6E (PVC)
[13:08:35] [PASSED] 0xBD4 (PVC)
[13:08:35] [PASSED] 0xBD5 (PVC)
[13:08:35] [PASSED] 0xBD6 (PVC)
[13:08:35] [PASSED] 0xBD7 (PVC)
[13:08:35] [PASSED] 0xBD8 (PVC)
[13:08:35] [PASSED] 0xBD9 (PVC)
[13:08:35] [PASSED] 0xBDA (PVC)
[13:08:35] [PASSED] 0xBDB (PVC)
[13:08:35] [PASSED] 0xBE0 (PVC)
[13:08:35] [PASSED] 0xBE1 (PVC)
[13:08:35] [PASSED] 0xBE5 (PVC)
[13:08:35] [PASSED] 0x7D40 (METEORLAKE)
[13:08:35] [PASSED] 0x7D45 (METEORLAKE)
[13:08:35] [PASSED] 0x7D55 (METEORLAKE)
[13:08:35] [PASSED] 0x7D60 (METEORLAKE)
[13:08:35] [PASSED] 0x7DD5 (METEORLAKE)
[13:08:35] [PASSED] 0x6420 (LUNARLAKE)
[13:08:35] [PASSED] 0x64A0 (LUNARLAKE)
[13:08:35] [PASSED] 0x64B0 (LUNARLAKE)
[13:08:35] [PASSED] 0xE202 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE209 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE20B (BATTLEMAGE)
[13:08:35] [PASSED] 0xE20C (BATTLEMAGE)
[13:08:35] [PASSED] 0xE20D (BATTLEMAGE)
[13:08:35] [PASSED] 0xE210 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE211 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE212 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE216 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE220 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE221 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE222 (BATTLEMAGE)
[13:08:35] [PASSED] 0xE223 (BATTLEMAGE)
[13:08:35] [PASSED] 0xB080 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB081 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB082 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB083 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB084 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB085 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB086 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB087 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB08F (PANTHERLAKE)
[13:08:35] [PASSED] 0xB090 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB0A0 (PANTHERLAKE)
[13:08:35] [PASSED] 0xB0B0 (PANTHERLAKE)
[13:08:35] [PASSED] 0xFD80 (PANTHERLAKE)
[13:08:35] [PASSED] 0xFD81 (PANTHERLAKE)
[13:08:35] ============= [PASSED] check_platform_gt_count =============
[13:08:35] ===================== [PASSED] xe_pci ======================
[13:08:35] =================== xe_rtp (2 subtests) ====================
[13:08:35] =============== xe_rtp_process_to_sr_tests ================
[13:08:35] [PASSED] coalesce-same-reg
[13:08:35] [PASSED] no-match-no-add
[13:08:35] [PASSED] match-or
[13:08:35] [PASSED] match-or-xfail
[13:08:35] [PASSED] no-match-no-add-multiple-rules
[13:08:35] [PASSED] two-regs-two-entries
[13:08:35] [PASSED] clr-one-set-other
[13:08:35] [PASSED] set-field
[13:08:35] [PASSED] conflict-duplicate
[13:08:35] [PASSED] conflict-not-disjoint
[13:08:35] [PASSED] conflict-reg-type
[13:08:35] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[13:08:35] ================== xe_rtp_process_tests ===================
[13:08:35] [PASSED] active1
[13:08:35] [PASSED] active2
[13:08:35] [PASSED] active-inactive
[13:08:35] [PASSED] inactive-active
[13:08:35] [PASSED] inactive-1st_or_active-inactive
[13:08:35] [PASSED] inactive-2nd_or_active-inactive
[13:08:35] [PASSED] inactive-last_or_active-inactive
[13:08:35] [PASSED] inactive-no_or_active-inactive
[13:08:35] ============== [PASSED] xe_rtp_process_tests ===============
[13:08:35] ===================== [PASSED] xe_rtp ======================
[13:08:35] ==================== xe_wa (1 subtest) =====================
[13:08:35] ======================== xe_wa_gt =========================
[13:08:35] [PASSED] TIGERLAKE (B0)
[13:08:35] [PASSED] DG1 (A0)
[13:08:35] [PASSED] DG1 (B0)
[13:08:35] [PASSED] ALDERLAKE_S (A0)
[13:08:35] [PASSED] ALDERLAKE_S (B0)
[13:08:35] [PASSED] ALDERLAKE_S (C0)
[13:08:35] [PASSED] ALDERLAKE_S (D0)
[13:08:35] [PASSED] ALDERLAKE_P (A0)
[13:08:35] [PASSED] ALDERLAKE_P (B0)
[13:08:35] [PASSED] ALDERLAKE_P (C0)
[13:08:35] [PASSED] ALDERLAKE_S_RPLS (D0)
[13:08:35] [PASSED] ALDERLAKE_P_RPLU (E0)
[13:08:35] [PASSED] DG2_G10 (C0)
[13:08:35] [PASSED] DG2_G11 (B1)
[13:08:35] [PASSED] DG2_G12 (A1)
[13:08:35] [PASSED] METEORLAKE (g:A0, m:A0)
[13:08:35] [PASSED] METEORLAKE (g:A0, m:A0)
[13:08:35] [PASSED] METEORLAKE (g:A0, m:A0)
[13:08:35] [PASSED] LUNARLAKE (g:A0, m:A0)
[13:08:35] [PASSED] LUNARLAKE (g:B0, m:A0)
stty: 'standard input': Inappropriate ioctl for device
[13:08:35] [PASSED] BATTLEMAGE (g:A0, m:A1)
[13:08:35] ==================== [PASSED] xe_wa_gt =====================
[13:08:35] ====================== [PASSED] xe_wa ======================
[13:08:35] ============================================================
[13:08:35] Testing complete. Ran 297 tests: passed: 281, skipped: 16
[13:08:35] Elapsed time: 31.278s total, 4.213s configuring, 26.748s building, 0.306s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[13:08:36] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:08:37] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:08:59] Starting KUnit Kernel (1/1)...
[13:08:59] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:08:59] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[13:08:59] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[13:08:59] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[13:08:59] =========== drm_validate_clone_mode (2 subtests) ===========
[13:08:59] ============== drm_test_check_in_clone_mode ===============
[13:08:59] [PASSED] in_clone_mode
[13:08:59] [PASSED] not_in_clone_mode
[13:08:59] ========== [PASSED] drm_test_check_in_clone_mode ===========
[13:08:59] =============== drm_test_check_valid_clones ===============
[13:08:59] [PASSED] not_in_clone_mode
[13:08:59] [PASSED] valid_clone
[13:08:59] [PASSED] invalid_clone
[13:08:59] =========== [PASSED] drm_test_check_valid_clones ===========
[13:08:59] ============= [PASSED] drm_validate_clone_mode =============
[13:08:59] ============= drm_validate_modeset (1 subtest) =============
[13:08:59] [PASSED] drm_test_check_connector_changed_modeset
[13:08:59] ============== [PASSED] drm_validate_modeset ===============
[13:08:59] ====== drm_test_bridge_get_current_state (2 subtests) ======
[13:08:59] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[13:08:59] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[13:08:59] ======== [PASSED] drm_test_bridge_get_current_state ========
[13:08:59] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[13:08:59] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[13:08:59] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[13:08:59] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[13:08:59] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[13:08:59] ============== drm_bridge_alloc (2 subtests) ===============
[13:08:59] [PASSED] drm_test_drm_bridge_alloc_basic
[13:08:59] [PASSED] drm_test_drm_bridge_alloc_get_put
[13:08:59] ================ [PASSED] drm_bridge_alloc =================
[13:08:59] ================== drm_buddy (7 subtests) ==================
[13:08:59] [PASSED] drm_test_buddy_alloc_limit
[13:08:59] [PASSED] drm_test_buddy_alloc_optimistic
[13:08:59] [PASSED] drm_test_buddy_alloc_pessimistic
[13:08:59] [PASSED] drm_test_buddy_alloc_pathological
[13:08:59] [PASSED] drm_test_buddy_alloc_contiguous
[13:08:59] [PASSED] drm_test_buddy_alloc_clear
[13:08:59] [PASSED] drm_test_buddy_alloc_range_bias
[13:08:59] ==================== [PASSED] drm_buddy ====================
[13:08:59] ============= drm_cmdline_parser (40 subtests) =============
[13:08:59] [PASSED] drm_test_cmdline_force_d_only
[13:08:59] [PASSED] drm_test_cmdline_force_D_only_dvi
[13:08:59] [PASSED] drm_test_cmdline_force_D_only_hdmi
[13:08:59] [PASSED] drm_test_cmdline_force_D_only_not_digital
[13:08:59] [PASSED] drm_test_cmdline_force_e_only
[13:08:59] [PASSED] drm_test_cmdline_res
[13:08:59] [PASSED] drm_test_cmdline_res_vesa
[13:08:59] [PASSED] drm_test_cmdline_res_vesa_rblank
[13:08:59] [PASSED] drm_test_cmdline_res_rblank
[13:08:59] [PASSED] drm_test_cmdline_res_bpp
[13:08:59] [PASSED] drm_test_cmdline_res_refresh
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[13:08:59] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[13:08:59] [PASSED] drm_test_cmdline_res_margins_force_on
[13:08:59] [PASSED] drm_test_cmdline_res_vesa_margins
[13:08:59] [PASSED] drm_test_cmdline_name
[13:08:59] [PASSED] drm_test_cmdline_name_bpp
[13:08:59] [PASSED] drm_test_cmdline_name_option
[13:08:59] [PASSED] drm_test_cmdline_name_bpp_option
[13:08:59] [PASSED] drm_test_cmdline_rotate_0
[13:08:59] [PASSED] drm_test_cmdline_rotate_90
[13:08:59] [PASSED] drm_test_cmdline_rotate_180
[13:08:59] [PASSED] drm_test_cmdline_rotate_270
[13:08:59] [PASSED] drm_test_cmdline_hmirror
[13:08:59] [PASSED] drm_test_cmdline_vmirror
[13:08:59] [PASSED] drm_test_cmdline_margin_options
[13:08:59] [PASSED] drm_test_cmdline_multiple_options
[13:08:59] [PASSED] drm_test_cmdline_bpp_extra_and_option
[13:08:59] [PASSED] drm_test_cmdline_extra_and_option
[13:08:59] [PASSED] drm_test_cmdline_freestanding_options
[13:08:59] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[13:08:59] [PASSED] drm_test_cmdline_panel_orientation
[13:08:59] ================ drm_test_cmdline_invalid =================
[13:08:59] [PASSED] margin_only
[13:08:59] [PASSED] interlace_only
[13:08:59] [PASSED] res_missing_x
[13:08:59] [PASSED] res_missing_y
[13:08:59] [PASSED] res_bad_y
[13:08:59] [PASSED] res_missing_y_bpp
[13:08:59] [PASSED] res_bad_bpp
[13:08:59] [PASSED] res_bad_refresh
[13:08:59] [PASSED] res_bpp_refresh_force_on_off
[13:08:59] [PASSED] res_invalid_mode
[13:08:59] [PASSED] res_bpp_wrong_place_mode
[13:08:59] [PASSED] name_bpp_refresh
[13:08:59] [PASSED] name_refresh
[13:08:59] [PASSED] name_refresh_wrong_mode
[13:08:59] [PASSED] name_refresh_invalid_mode
[13:08:59] [PASSED] rotate_multiple
[13:08:59] [PASSED] rotate_invalid_val
[13:08:59] [PASSED] rotate_truncated
[13:08:59] [PASSED] invalid_option
[13:08:59] [PASSED] invalid_tv_option
[13:08:59] [PASSED] truncated_tv_option
[13:08:59] ============ [PASSED] drm_test_cmdline_invalid =============
[13:08:59] =============== drm_test_cmdline_tv_options ===============
[13:08:59] [PASSED] NTSC
[13:08:59] [PASSED] NTSC_443
[13:08:59] [PASSED] NTSC_J
[13:08:59] [PASSED] PAL
[13:08:59] [PASSED] PAL_M
[13:08:59] [PASSED] PAL_N
[13:08:59] [PASSED] SECAM
[13:08:59] [PASSED] MONO_525
[13:08:59] [PASSED] MONO_625
[13:08:59] =========== [PASSED] drm_test_cmdline_tv_options ===========
[13:08:59] =============== [PASSED] drm_cmdline_parser ================
[13:08:59] ========== drmm_connector_hdmi_init (20 subtests) ==========
[13:08:59] [PASSED] drm_test_connector_hdmi_init_valid
[13:08:59] [PASSED] drm_test_connector_hdmi_init_bpc_8
[13:08:59] [PASSED] drm_test_connector_hdmi_init_bpc_10
[13:08:59] [PASSED] drm_test_connector_hdmi_init_bpc_12
[13:08:59] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[13:08:59] [PASSED] drm_test_connector_hdmi_init_bpc_null
[13:08:59] [PASSED] drm_test_connector_hdmi_init_formats_empty
[13:08:59] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[13:08:59] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[13:08:59] [PASSED] supported_formats=0x9 yuv420_allowed=1
[13:08:59] [PASSED] supported_formats=0x9 yuv420_allowed=0
[13:08:59] [PASSED] supported_formats=0x3 yuv420_allowed=1
[13:08:59] [PASSED] supported_formats=0x3 yuv420_allowed=0
[13:08:59] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[13:08:59] [PASSED] drm_test_connector_hdmi_init_null_ddc
[13:08:59] [PASSED] drm_test_connector_hdmi_init_null_product
[13:08:59] [PASSED] drm_test_connector_hdmi_init_null_vendor
[13:08:59] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[13:08:59] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[13:08:59] [PASSED] drm_test_connector_hdmi_init_product_valid
[13:08:59] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[13:08:59] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[13:08:59] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[13:08:59] ========= drm_test_connector_hdmi_init_type_valid =========
[13:08:59] [PASSED] HDMI-A
[13:08:59] [PASSED] HDMI-B
[13:08:59] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[13:08:59] ======== drm_test_connector_hdmi_init_type_invalid ========
[13:08:59] [PASSED] Unknown
[13:08:59] [PASSED] VGA
[13:08:59] [PASSED] DVI-I
[13:08:59] [PASSED] DVI-D
[13:08:59] [PASSED] DVI-A
[13:08:59] [PASSED] Composite
[13:08:59] [PASSED] SVIDEO
[13:08:59] [PASSED] LVDS
[13:08:59] [PASSED] Component
[13:08:59] [PASSED] DIN
[13:08:59] [PASSED] DP
[13:08:59] [PASSED] TV
[13:08:59] [PASSED] eDP
[13:08:59] [PASSED] Virtual
[13:08:59] [PASSED] DSI
[13:08:59] [PASSED] DPI
[13:08:59] [PASSED] Writeback
[13:08:59] [PASSED] SPI
[13:08:59] [PASSED] USB
[13:08:59] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[13:08:59] ============ [PASSED] drmm_connector_hdmi_init =============
[13:08:59] ============= drmm_connector_init (3 subtests) =============
[13:08:59] [PASSED] drm_test_drmm_connector_init
[13:08:59] [PASSED] drm_test_drmm_connector_init_null_ddc
[13:08:59] ========= drm_test_drmm_connector_init_type_valid =========
[13:08:59] [PASSED] Unknown
[13:08:59] [PASSED] VGA
[13:08:59] [PASSED] DVI-I
[13:08:59] [PASSED] DVI-D
[13:08:59] [PASSED] DVI-A
[13:08:59] [PASSED] Composite
[13:08:59] [PASSED] SVIDEO
[13:08:59] [PASSED] LVDS
[13:08:59] [PASSED] Component
[13:08:59] [PASSED] DIN
[13:08:59] [PASSED] DP
[13:08:59] [PASSED] HDMI-A
[13:08:59] [PASSED] HDMI-B
[13:08:59] [PASSED] TV
[13:08:59] [PASSED] eDP
[13:08:59] [PASSED] Virtual
[13:08:59] [PASSED] DSI
[13:08:59] [PASSED] DPI
[13:08:59] [PASSED] Writeback
[13:08:59] [PASSED] SPI
[13:08:59] [PASSED] USB
[13:08:59] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[13:08:59] =============== [PASSED] drmm_connector_init ===============
[13:08:59] ========= drm_connector_dynamic_init (6 subtests) ==========
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_init
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_init_properties
[13:08:59] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[13:08:59] [PASSED] Unknown
[13:08:59] [PASSED] VGA
[13:08:59] [PASSED] DVI-I
[13:08:59] [PASSED] DVI-D
[13:08:59] [PASSED] DVI-A
[13:08:59] [PASSED] Composite
[13:08:59] [PASSED] SVIDEO
[13:08:59] [PASSED] LVDS
[13:08:59] [PASSED] Component
[13:08:59] [PASSED] DIN
[13:08:59] [PASSED] DP
[13:08:59] [PASSED] HDMI-A
[13:08:59] [PASSED] HDMI-B
[13:08:59] [PASSED] TV
[13:08:59] [PASSED] eDP
[13:08:59] [PASSED] Virtual
[13:08:59] [PASSED] DSI
[13:08:59] [PASSED] DPI
[13:08:59] [PASSED] Writeback
[13:08:59] [PASSED] SPI
[13:08:59] [PASSED] USB
[13:08:59] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[13:08:59] ======== drm_test_drm_connector_dynamic_init_name =========
[13:08:59] [PASSED] Unknown
[13:08:59] [PASSED] VGA
[13:08:59] [PASSED] DVI-I
[13:08:59] [PASSED] DVI-D
[13:08:59] [PASSED] DVI-A
[13:08:59] [PASSED] Composite
[13:08:59] [PASSED] SVIDEO
[13:08:59] [PASSED] LVDS
[13:08:59] [PASSED] Component
[13:08:59] [PASSED] DIN
[13:08:59] [PASSED] DP
[13:08:59] [PASSED] HDMI-A
[13:08:59] [PASSED] HDMI-B
[13:08:59] [PASSED] TV
[13:08:59] [PASSED] eDP
[13:08:59] [PASSED] Virtual
[13:08:59] [PASSED] DSI
[13:08:59] [PASSED] DPI
[13:08:59] [PASSED] Writeback
[13:08:59] [PASSED] SPI
[13:08:59] [PASSED] USB
[13:08:59] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[13:08:59] =========== [PASSED] drm_connector_dynamic_init ============
[13:08:59] ==== drm_connector_dynamic_register_early (4 subtests) =====
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[13:08:59] ====== [PASSED] drm_connector_dynamic_register_early =======
[13:08:59] ======= drm_connector_dynamic_register (7 subtests) ========
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[13:08:59] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[13:08:59] ========= [PASSED] drm_connector_dynamic_register ==========
[13:08:59] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[13:08:59] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[13:08:59] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[13:08:59] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[13:08:59] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[13:08:59] ========== drm_test_get_tv_mode_from_name_valid ===========
[13:08:59] [PASSED] NTSC
[13:08:59] [PASSED] NTSC-443
[13:08:59] [PASSED] NTSC-J
[13:08:59] [PASSED] PAL
[13:08:59] [PASSED] PAL-M
[13:08:59] [PASSED] PAL-N
[13:08:59] [PASSED] SECAM
[13:08:59] [PASSED] Mono
[13:08:59] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[13:08:59] [PASSED] drm_test_get_tv_mode_from_name_truncated
[13:08:59] ============ [PASSED] drm_get_tv_mode_from_name ============
[13:08:59] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[13:08:59] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[13:08:59] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[13:08:59] [PASSED] VIC 96
[13:08:59] [PASSED] VIC 97
[13:08:59] [PASSED] VIC 101
[13:08:59] [PASSED] VIC 102
[13:08:59] [PASSED] VIC 106
[13:08:59] [PASSED] VIC 107
[13:08:59] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[13:08:59] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[13:08:59] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[13:08:59] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[13:08:59] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[13:08:59] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[13:08:59] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[13:08:59] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[13:08:59] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[13:08:59] [PASSED] Automatic
[13:08:59] [PASSED] Full
[13:08:59] [PASSED] Limited 16:235
[13:08:59] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[13:08:59] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[13:08:59] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[13:08:59] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[13:08:59] === drm_test_drm_hdmi_connector_get_output_format_name ====
[13:08:59] [PASSED] RGB
[13:08:59] [PASSED] YUV 4:2:0
[13:08:59] [PASSED] YUV 4:2:2
[13:08:59] [PASSED] YUV 4:4:4
[13:08:59] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[13:08:59] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[13:08:59] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[13:08:59] ============= drm_damage_helper (21 subtests) ==============
[13:08:59] [PASSED] drm_test_damage_iter_no_damage
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_src_moved
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_not_visible
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[13:08:59] [PASSED] drm_test_damage_iter_no_damage_no_fb
[13:08:59] [PASSED] drm_test_damage_iter_simple_damage
[13:08:59] [PASSED] drm_test_damage_iter_single_damage
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_outside_src
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_src_moved
[13:08:59] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[13:08:59] [PASSED] drm_test_damage_iter_damage
[13:08:59] [PASSED] drm_test_damage_iter_damage_one_intersect
[13:08:59] [PASSED] drm_test_damage_iter_damage_one_outside
[13:08:59] [PASSED] drm_test_damage_iter_damage_src_moved
[13:08:59] [PASSED] drm_test_damage_iter_damage_not_visible
[13:08:59] ================ [PASSED] drm_damage_helper ================
[13:08:59] ============== drm_dp_mst_helper (3 subtests) ==============
[13:08:59] ============== drm_test_dp_mst_calc_pbn_mode ==============
[13:08:59] [PASSED] Clock 154000 BPP 30 DSC disabled
[13:08:59] [PASSED] Clock 234000 BPP 30 DSC disabled
[13:08:59] [PASSED] Clock 297000 BPP 24 DSC disabled
[13:08:59] [PASSED] Clock 332880 BPP 24 DSC enabled
[13:08:59] [PASSED] Clock 324540 BPP 24 DSC enabled
[13:08:59] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[13:08:59] ============== drm_test_dp_mst_calc_pbn_div ===============
[13:08:59] [PASSED] Link rate 2000000 lane count 4
[13:08:59] [PASSED] Link rate 2000000 lane count 2
[13:08:59] [PASSED] Link rate 2000000 lane count 1
[13:08:59] [PASSED] Link rate 1350000 lane count 4
[13:08:59] [PASSED] Link rate 1350000 lane count 2
[13:08:59] [PASSED] Link rate 1350000 lane count 1
[13:08:59] [PASSED] Link rate 1000000 lane count 4
[13:08:59] [PASSED] Link rate 1000000 lane count 2
[13:08:59] [PASSED] Link rate 1000000 lane count 1
[13:08:59] [PASSED] Link rate 810000 lane count 4
[13:08:59] [PASSED] Link rate 810000 lane count 2
[13:08:59] [PASSED] Link rate 810000 lane count 1
[13:08:59] [PASSED] Link rate 540000 lane count 4
[13:08:59] [PASSED] Link rate 540000 lane count 2
[13:08:59] [PASSED] Link rate 540000 lane count 1
[13:08:59] [PASSED] Link rate 270000 lane count 4
[13:08:59] [PASSED] Link rate 270000 lane count 2
[13:08:59] [PASSED] Link rate 270000 lane count 1
[13:08:59] [PASSED] Link rate 162000 lane count 4
[13:08:59] [PASSED] Link rate 162000 lane count 2
[13:08:59] [PASSED] Link rate 162000 lane count 1
[13:08:59] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[13:08:59] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[13:08:59] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[13:08:59] [PASSED] DP_POWER_UP_PHY with port number
[13:08:59] [PASSED] DP_POWER_DOWN_PHY with port number
[13:08:59] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[13:08:59] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[13:08:59] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[13:08:59] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[13:08:59] [PASSED] DP_QUERY_PAYLOAD with port number
[13:08:59] [PASSED] DP_QUERY_PAYLOAD with VCPI
[13:08:59] [PASSED] DP_REMOTE_DPCD_READ with port number
[13:08:59] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[13:08:59] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[13:08:59] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[13:08:59] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[13:08:59] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[13:08:59] [PASSED] DP_REMOTE_I2C_READ with port number
[13:08:59] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[13:08:59] [PASSED] DP_REMOTE_I2C_READ with transactions array
[13:08:59] [PASSED] DP_REMOTE_I2C_WRITE with port number
[13:08:59] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[13:08:59] [PASSED] DP_REMOTE_I2C_WRITE with data array
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[13:08:59] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[13:08:59] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[13:08:59] ================ [PASSED] drm_dp_mst_helper ================
[13:08:59] ================== drm_exec (7 subtests) ===================
[13:08:59] [PASSED] sanitycheck
[13:08:59] [PASSED] test_lock
[13:08:59] [PASSED] test_lock_unlock
[13:08:59] [PASSED] test_duplicates
[13:08:59] [PASSED] test_prepare
[13:08:59] [PASSED] test_prepare_array
[13:08:59] [PASSED] test_multiple_loops
[13:08:59] ==================== [PASSED] drm_exec =====================
[13:08:59] =========== drm_format_helper_test (17 subtests) ===========
[13:08:59] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[13:08:59] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[13:08:59] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[13:08:59] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[13:08:59] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[13:08:59] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[13:08:59] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[13:08:59] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[13:08:59] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[13:08:59] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[13:08:59] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[13:08:59] ============== drm_test_fb_xrgb8888_to_mono ===============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[13:08:59] ==================== drm_test_fb_swab =====================
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ================ [PASSED] drm_test_fb_swab =================
[13:08:59] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[13:08:59] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[13:08:59] [PASSED] single_pixel_source_buffer
[13:08:59] [PASSED] single_pixel_clip_rectangle
[13:08:59] [PASSED] well_known_colors
[13:08:59] [PASSED] destination_pitch
[13:08:59] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[13:08:59] ================= drm_test_fb_clip_offset =================
[13:08:59] [PASSED] pass through
[13:08:59] [PASSED] horizontal offset
[13:08:59] [PASSED] vertical offset
[13:08:59] [PASSED] horizontal and vertical offset
[13:08:59] [PASSED] horizontal offset (custom pitch)
[13:08:59] [PASSED] vertical offset (custom pitch)
[13:08:59] [PASSED] horizontal and vertical offset (custom pitch)
[13:08:59] ============= [PASSED] drm_test_fb_clip_offset =============
[13:08:59] =================== drm_test_fb_memcpy ====================
[13:08:59] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[13:08:59] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[13:08:59] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[13:08:59] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[13:08:59] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[13:08:59] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[13:08:59] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[13:08:59] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[13:08:59] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[13:08:59] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[13:08:59] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[13:08:59] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[13:08:59] =============== [PASSED] drm_test_fb_memcpy ================
[13:08:59] ============= [PASSED] drm_format_helper_test ==============
[13:08:59] ================= drm_format (18 subtests) =================
[13:08:59] [PASSED] drm_test_format_block_width_invalid
[13:08:59] [PASSED] drm_test_format_block_width_one_plane
[13:08:59] [PASSED] drm_test_format_block_width_two_plane
[13:08:59] [PASSED] drm_test_format_block_width_three_plane
[13:08:59] [PASSED] drm_test_format_block_width_tiled
[13:08:59] [PASSED] drm_test_format_block_height_invalid
[13:08:59] [PASSED] drm_test_format_block_height_one_plane
[13:08:59] [PASSED] drm_test_format_block_height_two_plane
[13:08:59] [PASSED] drm_test_format_block_height_three_plane
[13:08:59] [PASSED] drm_test_format_block_height_tiled
[13:08:59] [PASSED] drm_test_format_min_pitch_invalid
[13:08:59] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[13:08:59] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[13:08:59] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[13:08:59] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[13:08:59] [PASSED] drm_test_format_min_pitch_two_plane
[13:08:59] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[13:08:59] [PASSED] drm_test_format_min_pitch_tiled
[13:08:59] =================== [PASSED] drm_format ====================
[13:08:59] ============== drm_framebuffer (10 subtests) ===============
[13:08:59] ========== drm_test_framebuffer_check_src_coords ==========
[13:08:59] [PASSED] Success: source fits into fb
[13:08:59] [PASSED] Fail: overflowing fb with x-axis coordinate
[13:08:59] [PASSED] Fail: overflowing fb with y-axis coordinate
[13:08:59] [PASSED] Fail: overflowing fb with source width
[13:08:59] [PASSED] Fail: overflowing fb with source height
[13:08:59] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[13:08:59] [PASSED] drm_test_framebuffer_cleanup
[13:08:59] =============== drm_test_framebuffer_create ===============
[13:08:59] [PASSED] ABGR8888 normal sizes
[13:08:59] [PASSED] ABGR8888 max sizes
[13:08:59] [PASSED] ABGR8888 pitch greater than min required
[13:08:59] [PASSED] ABGR8888 pitch less than min required
[13:08:59] [PASSED] ABGR8888 Invalid width
[13:08:59] [PASSED] ABGR8888 Invalid buffer handle
[13:08:59] [PASSED] No pixel format
[13:08:59] [PASSED] ABGR8888 Width 0
[13:08:59] [PASSED] ABGR8888 Height 0
[13:08:59] [PASSED] ABGR8888 Out of bound height * pitch combination
[13:08:59] [PASSED] ABGR8888 Large buffer offset
[13:08:59] [PASSED] ABGR8888 Buffer offset for inexistent plane
[13:08:59] [PASSED] ABGR8888 Invalid flag
[13:08:59] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[13:08:59] [PASSED] ABGR8888 Valid buffer modifier
[13:08:59] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[13:08:59] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] NV12 Normal sizes
[13:08:59] [PASSED] NV12 Max sizes
[13:08:59] [PASSED] NV12 Invalid pitch
[13:08:59] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[13:08:59] [PASSED] NV12 different modifier per-plane
[13:08:59] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[13:08:59] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] NV12 Modifier for inexistent plane
[13:08:59] [PASSED] NV12 Handle for inexistent plane
[13:08:59] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[13:08:59] [PASSED] YVU420 Normal sizes
[13:08:59] [PASSED] YVU420 Max sizes
[13:08:59] [PASSED] YVU420 Invalid pitch
[13:08:59] [PASSED] YVU420 Different pitches
[13:08:59] [PASSED] YVU420 Different buffer offsets/pitches
[13:08:59] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[13:08:59] [PASSED] YVU420 Valid modifier
[13:08:59] [PASSED] YVU420 Different modifiers per plane
[13:08:59] [PASSED] YVU420 Modifier for inexistent plane
[13:08:59] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[13:08:59] [PASSED] X0L2 Normal sizes
[13:08:59] [PASSED] X0L2 Max sizes
[13:08:59] [PASSED] X0L2 Invalid pitch
[13:08:59] [PASSED] X0L2 Pitch greater than minimum required
[13:08:59] [PASSED] X0L2 Handle for inexistent plane
[13:08:59] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[13:08:59] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[13:08:59] [PASSED] X0L2 Valid modifier
[13:08:59] [PASSED] X0L2 Modifier for inexistent plane
[13:08:59] =========== [PASSED] drm_test_framebuffer_create ===========
[13:08:59] [PASSED] drm_test_framebuffer_free
[13:08:59] [PASSED] drm_test_framebuffer_init
[13:08:59] [PASSED] drm_test_framebuffer_init_bad_format
[13:08:59] [PASSED] drm_test_framebuffer_init_dev_mismatch
[13:08:59] [PASSED] drm_test_framebuffer_lookup
[13:08:59] [PASSED] drm_test_framebuffer_lookup_inexistent
[13:08:59] [PASSED] drm_test_framebuffer_modifiers_not_supported
[13:08:59] ================= [PASSED] drm_framebuffer =================
[13:08:59] ================ drm_gem_shmem (8 subtests) ================
[13:08:59] [PASSED] drm_gem_shmem_test_obj_create
[13:08:59] [PASSED] drm_gem_shmem_test_obj_create_private
[13:08:59] [PASSED] drm_gem_shmem_test_pin_pages
[13:08:59] [PASSED] drm_gem_shmem_test_vmap
[13:08:59] [PASSED] drm_gem_shmem_test_get_pages_sgt
[13:08:59] [PASSED] drm_gem_shmem_test_get_sg_table
[13:08:59] [PASSED] drm_gem_shmem_test_madvise
[13:08:59] [PASSED] drm_gem_shmem_test_purge
[13:08:59] ================== [PASSED] drm_gem_shmem ==================
[13:08:59] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[13:08:59] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[13:08:59] [PASSED] Automatic
[13:08:59] [PASSED] Full
[13:08:59] [PASSED] Limited 16:235
[13:08:59] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[13:08:59] [PASSED] drm_test_check_disable_connector
[13:08:59] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[13:08:59] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[13:08:59] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[13:08:59] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[13:08:59] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[13:08:59] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[13:08:59] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[13:08:59] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[13:08:59] [PASSED] drm_test_check_output_bpc_dvi
[13:08:59] [PASSED] drm_test_check_output_bpc_format_vic_1
[13:08:59] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[13:08:59] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[13:08:59] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[13:08:59] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[13:08:59] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[13:08:59] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[13:08:59] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[13:08:59] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[13:08:59] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[13:08:59] [PASSED] drm_test_check_broadcast_rgb_value
[13:08:59] [PASSED] drm_test_check_bpc_8_value
[13:08:59] [PASSED] drm_test_check_bpc_10_value
[13:08:59] [PASSED] drm_test_check_bpc_12_value
[13:08:59] [PASSED] drm_test_check_format_value
[13:08:59] [PASSED] drm_test_check_tmds_char_value
[13:08:59] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[13:08:59] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[13:08:59] [PASSED] drm_test_check_mode_valid
[13:08:59] [PASSED] drm_test_check_mode_valid_reject
[13:08:59] [PASSED] drm_test_check_mode_valid_reject_rate
[13:08:59] [PASSED] drm_test_check_mode_valid_reject_max_clock
[13:08:59] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[13:08:59] ================= drm_managed (2 subtests) =================
[13:08:59] [PASSED] drm_test_managed_release_action
[13:08:59] [PASSED] drm_test_managed_run_action
[13:08:59] =================== [PASSED] drm_managed ===================
[13:08:59] =================== drm_mm (6 subtests) ====================
[13:08:59] [PASSED] drm_test_mm_init
[13:08:59] [PASSED] drm_test_mm_debug
[13:08:59] [PASSED] drm_test_mm_align32
[13:08:59] [PASSED] drm_test_mm_align64
[13:08:59] [PASSED] drm_test_mm_lowest
[13:08:59] [PASSED] drm_test_mm_highest
[13:08:59] ===================== [PASSED] drm_mm ======================
[13:08:59] ============= drm_modes_analog_tv (5 subtests) =============
[13:08:59] [PASSED] drm_test_modes_analog_tv_mono_576i
[13:08:59] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[13:08:59] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[13:08:59] [PASSED] drm_test_modes_analog_tv_pal_576i
[13:08:59] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[13:08:59] =============== [PASSED] drm_modes_analog_tv ===============
[13:08:59] ============== drm_plane_helper (2 subtests) ===============
[13:08:59] =============== drm_test_check_plane_state ================
[13:08:59] [PASSED] clipping_simple
[13:08:59] [PASSED] clipping_rotate_reflect
[13:08:59] [PASSED] positioning_simple
[13:08:59] [PASSED] upscaling
[13:08:59] [PASSED] downscaling
[13:08:59] [PASSED] rounding1
[13:08:59] [PASSED] rounding2
[13:08:59] [PASSED] rounding3
[13:08:59] [PASSED] rounding4
[13:08:59] =========== [PASSED] drm_test_check_plane_state ============
[13:08:59] =========== drm_test_check_invalid_plane_state ============
[13:08:59] [PASSED] positioning_invalid
[13:08:59] [PASSED] upscaling_invalid
[13:08:59] [PASSED] downscaling_invalid
[13:08:59] ======= [PASSED] drm_test_check_invalid_plane_state ========
[13:08:59] ================ [PASSED] drm_plane_helper =================
[13:08:59] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[13:08:59] ====== drm_test_connector_helper_tv_get_modes_check =======
[13:08:59] [PASSED] None
[13:08:59] [PASSED] PAL
[13:08:59] [PASSED] NTSC
[13:08:59] [PASSED] Both, NTSC Default
[13:08:59] [PASSED] Both, PAL Default
[13:08:59] [PASSED] Both, NTSC Default, with PAL on command-line
[13:08:59] [PASSED] Both, PAL Default, with NTSC on command-line
[13:08:59] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[13:08:59] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[13:08:59] ================== drm_rect (9 subtests) ===================
[13:08:59] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[13:08:59] [PASSED] drm_test_rect_clip_scaled_not_clipped
[13:08:59] [PASSED] drm_test_rect_clip_scaled_clipped
[13:08:59] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[13:08:59] ================= drm_test_rect_intersect =================
[13:08:59] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[13:08:59] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[13:08:59] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[13:08:59] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[13:08:59] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[13:08:59] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[13:08:59] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[13:08:59] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[13:08:59] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[13:08:59] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[13:08:59] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[13:08:59] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[13:08:59] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[13:08:59] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[13:08:59] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[13:08:59] ============= [PASSED] drm_test_rect_intersect =============
[13:08:59] ================ drm_test_rect_calc_hscale ================
[13:08:59] [PASSED] normal use
[13:08:59] [PASSED] out of max range
[13:08:59] [PASSED] out of min range
[13:08:59] [PASSED] zero dst
[13:08:59] [PASSED] negative src
[13:08:59] [PASSED] negative dst
[13:08:59] ============ [PASSED] drm_test_rect_calc_hscale ============
[13:08:59] ================ drm_test_rect_calc_vscale ================
[13:08:59] [PASSED] normal use
[13:08:59] [PASSED] out of max range
[13:08:59] [PASSED] out of min range
[13:08:59] [PASSED] zero dst
[13:08:59] [PASSED] negative src
[13:08:59] [PASSED] negative dst
[13:08:59] ============ [PASSED] drm_test_rect_calc_vscale ============
[13:08:59] ================== drm_test_rect_rotate ===================
[13:08:59] [PASSED] reflect-x
[13:08:59] [PASSED] reflect-y
[13:08:59] [PASSED] rotate-0
[13:08:59] [PASSED] rotate-90
[13:08:59] [PASSED] rotate-180
[13:08:59] [PASSED] rotate-270
stty: 'standard input': Inappropriate ioctl for device
[13:08:59] ============== [PASSED] drm_test_rect_rotate ===============
[13:08:59] ================ drm_test_rect_rotate_inv =================
[13:08:59] [PASSED] reflect-x
[13:08:59] [PASSED] reflect-y
[13:08:59] [PASSED] rotate-0
[13:08:59] [PASSED] rotate-90
[13:08:59] [PASSED] rotate-180
[13:08:59] [PASSED] rotate-270
[13:08:59] ============ [PASSED] drm_test_rect_rotate_inv =============
[13:08:59] ==================== [PASSED] drm_rect =====================
[13:08:59] ============ drm_sysfb_modeset_test (1 subtest) ============
[13:08:59] ============ drm_test_sysfb_build_fourcc_list =============
[13:08:59] [PASSED] no native formats
[13:08:59] [PASSED] XRGB8888 as native format
[13:08:59] [PASSED] remove duplicates
[13:08:59] [PASSED] convert alpha formats
[13:08:59] [PASSED] random formats
[13:08:59] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[13:08:59] ============= [PASSED] drm_sysfb_modeset_test ==============
[13:08:59] ============================================================
[13:08:59] Testing complete. Ran 616 tests: passed: 616
[13:08:59] Elapsed time: 23.166s total, 1.738s configuring, 21.258s building, 0.141s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[13:08:59] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:09:01] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:09:08] Starting KUnit Kernel (1/1)...
[13:09:08] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:09:08] ================= ttm_device (5 subtests) ==================
[13:09:08] [PASSED] ttm_device_init_basic
[13:09:08] [PASSED] ttm_device_init_multiple
[13:09:08] [PASSED] ttm_device_fini_basic
[13:09:08] [PASSED] ttm_device_init_no_vma_man
[13:09:08] ================== ttm_device_init_pools ==================
[13:09:08] [PASSED] No DMA allocations, no DMA32 required
[13:09:08] [PASSED] DMA allocations, DMA32 required
[13:09:08] [PASSED] No DMA allocations, DMA32 required
[13:09:08] [PASSED] DMA allocations, no DMA32 required
[13:09:08] ============== [PASSED] ttm_device_init_pools ==============
[13:09:08] =================== [PASSED] ttm_device ====================
[13:09:08] ================== ttm_pool (8 subtests) ===================
[13:09:08] ================== ttm_pool_alloc_basic ===================
[13:09:08] [PASSED] One page
[13:09:08] [PASSED] More than one page
[13:09:08] [PASSED] Above the allocation limit
[13:09:08] [PASSED] One page, with coherent DMA mappings enabled
[13:09:08] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:09:08] ============== [PASSED] ttm_pool_alloc_basic ===============
[13:09:08] ============== ttm_pool_alloc_basic_dma_addr ==============
[13:09:08] [PASSED] One page
[13:09:08] [PASSED] More than one page
[13:09:08] [PASSED] Above the allocation limit
[13:09:08] [PASSED] One page, with coherent DMA mappings enabled
[13:09:08] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:09:08] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[13:09:08] [PASSED] ttm_pool_alloc_order_caching_match
[13:09:08] [PASSED] ttm_pool_alloc_caching_mismatch
[13:09:08] [PASSED] ttm_pool_alloc_order_mismatch
[13:09:08] [PASSED] ttm_pool_free_dma_alloc
[13:09:08] [PASSED] ttm_pool_free_no_dma_alloc
[13:09:08] [PASSED] ttm_pool_fini_basic
[13:09:08] ==================== [PASSED] ttm_pool =====================
[13:09:08] ================ ttm_resource (8 subtests) =================
[13:09:08] ================= ttm_resource_init_basic =================
[13:09:08] [PASSED] Init resource in TTM_PL_SYSTEM
[13:09:08] [PASSED] Init resource in TTM_PL_VRAM
[13:09:08] [PASSED] Init resource in a private placement
[13:09:08] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[13:09:08] ============= [PASSED] ttm_resource_init_basic =============
[13:09:08] [PASSED] ttm_resource_init_pinned
[13:09:08] [PASSED] ttm_resource_fini_basic
[13:09:08] [PASSED] ttm_resource_manager_init_basic
[13:09:08] [PASSED] ttm_resource_manager_usage_basic
[13:09:08] [PASSED] ttm_resource_manager_set_used_basic
[13:09:08] [PASSED] ttm_sys_man_alloc_basic
[13:09:08] [PASSED] ttm_sys_man_free_basic
[13:09:08] ================== [PASSED] ttm_resource ===================
[13:09:08] =================== ttm_tt (15 subtests) ===================
[13:09:08] ==================== ttm_tt_init_basic ====================
[13:09:08] [PASSED] Page-aligned size
[13:09:08] [PASSED] Extra pages requested
[13:09:08] ================ [PASSED] ttm_tt_init_basic ================
[13:09:08] [PASSED] ttm_tt_init_misaligned
[13:09:08] [PASSED] ttm_tt_fini_basic
[13:09:08] [PASSED] ttm_tt_fini_sg
[13:09:08] [PASSED] ttm_tt_fini_shmem
[13:09:08] [PASSED] ttm_tt_create_basic
[13:09:08] [PASSED] ttm_tt_create_invalid_bo_type
[13:09:08] [PASSED] ttm_tt_create_ttm_exists
[13:09:08] [PASSED] ttm_tt_create_failed
[13:09:08] [PASSED] ttm_tt_destroy_basic
[13:09:08] [PASSED] ttm_tt_populate_null_ttm
[13:09:08] [PASSED] ttm_tt_populate_populated_ttm
[13:09:08] [PASSED] ttm_tt_unpopulate_basic
[13:09:08] [PASSED] ttm_tt_unpopulate_empty_ttm
[13:09:08] [PASSED] ttm_tt_swapin_basic
[13:09:08] ===================== [PASSED] ttm_tt ======================
[13:09:08] =================== ttm_bo (14 subtests) ===================
[13:09:08] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[13:09:08] [PASSED] Cannot be interrupted and sleeps
[13:09:08] [PASSED] Cannot be interrupted, locks straight away
[13:09:08] [PASSED] Can be interrupted, sleeps
[13:09:08] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[13:09:08] [PASSED] ttm_bo_reserve_locked_no_sleep
[13:09:08] [PASSED] ttm_bo_reserve_no_wait_ticket
[13:09:08] [PASSED] ttm_bo_reserve_double_resv
[13:09:08] [PASSED] ttm_bo_reserve_interrupted
[13:09:08] [PASSED] ttm_bo_reserve_deadlock
[13:09:08] [PASSED] ttm_bo_unreserve_basic
[13:09:08] [PASSED] ttm_bo_unreserve_pinned
[13:09:08] [PASSED] ttm_bo_unreserve_bulk
[13:09:08] [PASSED] ttm_bo_put_basic
[13:09:08] [PASSED] ttm_bo_put_shared_resv
[13:09:08] [PASSED] ttm_bo_pin_basic
[13:09:08] [PASSED] ttm_bo_pin_unpin_resource
[13:09:08] [PASSED] ttm_bo_multiple_pin_one_unpin
[13:09:08] ===================== [PASSED] ttm_bo ======================
[13:09:08] ============== ttm_bo_validate (22 subtests) ===============
[13:09:08] ============== ttm_bo_init_reserved_sys_man ===============
[13:09:08] [PASSED] Buffer object for userspace
[13:09:08] [PASSED] Kernel buffer object
[13:09:08] [PASSED] Shared buffer object
[13:09:08] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[13:09:08] ============== ttm_bo_init_reserved_mock_man ==============
[13:09:08] [PASSED] Buffer object for userspace
[13:09:08] [PASSED] Kernel buffer object
[13:09:08] [PASSED] Shared buffer object
[13:09:08] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[13:09:08] [PASSED] ttm_bo_init_reserved_resv
[13:09:08] ================== ttm_bo_validate_basic ==================
[13:09:08] [PASSED] Buffer object for userspace
[13:09:08] [PASSED] Kernel buffer object
[13:09:08] [PASSED] Shared buffer object
[13:09:08] ============== [PASSED] ttm_bo_validate_basic ==============
[13:09:08] [PASSED] ttm_bo_validate_invalid_placement
[13:09:08] ============= ttm_bo_validate_same_placement ==============
[13:09:08] [PASSED] System manager
[13:09:08] [PASSED] VRAM manager
[13:09:08] ========= [PASSED] ttm_bo_validate_same_placement ==========
[13:09:08] [PASSED] ttm_bo_validate_failed_alloc
[13:09:08] [PASSED] ttm_bo_validate_pinned
[13:09:08] [PASSED] ttm_bo_validate_busy_placement
[13:09:08] ================ ttm_bo_validate_multihop =================
[13:09:08] [PASSED] Buffer object for userspace
[13:09:08] [PASSED] Kernel buffer object
[13:09:08] [PASSED] Shared buffer object
[13:09:08] ============ [PASSED] ttm_bo_validate_multihop =============
[13:09:08] ========== ttm_bo_validate_no_placement_signaled ==========
[13:09:08] [PASSED] Buffer object in system domain, no page vector
[13:09:08] [PASSED] Buffer object in system domain with an existing page vector
[13:09:08] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[13:09:08] ======== ttm_bo_validate_no_placement_not_signaled ========
[13:09:08] [PASSED] Buffer object for userspace
[13:09:08] [PASSED] Kernel buffer object
[13:09:08] [PASSED] Shared buffer object
[13:09:08] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[13:09:08] [PASSED] ttm_bo_validate_move_fence_signaled
[13:09:09] ========= ttm_bo_validate_move_fence_not_signaled =========
[13:09:09] [PASSED] Waits for GPU
[13:09:09] [PASSED] Tries to lock straight away
[13:09:09] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[13:09:09] [PASSED] ttm_bo_validate_swapout
[13:09:09] [PASSED] ttm_bo_validate_happy_evict
[13:09:09] [PASSED] ttm_bo_validate_all_pinned_evict
[13:09:09] [PASSED] ttm_bo_validate_allowed_only_evict
[13:09:09] [PASSED] ttm_bo_validate_deleted_evict
[13:09:09] [PASSED] ttm_bo_validate_busy_domain_evict
[13:09:09] [PASSED] ttm_bo_validate_evict_gutting
[13:09:09] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[13:09:09] ================= [PASSED] ttm_bo_validate =================
[13:09:09] ============================================================
[13:09:09] Testing complete. Ran 102 tests: passed: 102
[13:09:09] Elapsed time: 10.083s total, 1.660s configuring, 7.806s building, 0.516s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-07-07 13:09 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-03 20:52 [PATCH v3 0/7] drm/panthor: support repeated mappings Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 1/7] drm/panthor: Add support for atomic page table updates Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 2/7] drm/gpuvm: Kill drm_gpuva_init() Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 3/7] drm/gpuvm: Pass map arguments through a struct Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 4/7] drm/gpuvm: Add a helper to check if two VA can be merged Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 5/7] drm/gpuvm: Add a flags field to drm_gpuvm_map_req/drm_gpuva_op_map Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 6/7] drm/gpuvm: Add DRM_GPUVA_REPEAT flag and logic Caterina Shablia
2025-07-03 20:52 ` [PATCH v3 7/7] drm/panthor: Add support for repeated mappings Caterina Shablia
2025-07-03 21:02 ` [PATCH v3 0/7] drm/panthor: support " Danilo Krummrich
2025-07-07 13:08 ` ✗ CI.checkpatch: warning for " Patchwork
2025-07-07 13:09 ` ✓ CI.KUnit: success " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox