* [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
@ 2025-04-09 21:13 ` Tomasz Lis
2025-04-10 16:54 ` Michal Wajdeczko
2025-04-09 21:13 ` [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration Tomasz Lis
` (10 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Tomasz Lis @ 2025-04-09 21:13 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski, Matthew Brost, Lucas De Marchi
The balloon nodes, which are used to fill areas of GGTT inaccessible
for a specific VF, were allocated and inserted into GGTT within one
function. To be able to re-use that insertion code during VF
migration recovery, we need to split it.
This patch separates allocation (init/fini functs) from the insertion
of balloons (balloon/deballoon functs). Locks are also moved to ensure
calls from post-migration recovery worker will not cause a deadlock.
v2: Moved declarations to proper header
v3: Rephrased description, introduced "_locked" versions of some
functs, more lockdep checks, some functions renamed, altered error
handling, added missing kerneldocs.
v4: Suffixed more functs with `_locked`, moved lockdep asserts,
fixed finalization in error path, added asserts
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
drivers/gpu/drm/xe/xe_ggtt.c | 34 ++++-----
drivers/gpu/drm/xe/xe_ggtt.h | 6 +-
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 109 +++++++++++++++++++++-------
drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
4 files changed, 103 insertions(+), 48 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 7062115909f2..e7d474bd0cfe 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: MIT
+/// SPDX-License-Identifier: MIT
/*
* Copyright © 2021 Intel Corporation
*/
@@ -429,16 +429,17 @@ static void xe_ggtt_dump_node(struct xe_ggtt *ggtt,
}
/**
- * xe_ggtt_node_insert_balloon - prevent allocation of specified GGTT addresses
+ * xe_ggtt_node_insert_balloon_locked - prevent allocation of specified GGTT addresses
* @node: the &xe_ggtt_node to hold reserved GGTT node
* @start: the starting GGTT address of the reserved region
* @end: then end GGTT address of the reserved region
*
- * Use xe_ggtt_node_remove_balloon() to release a reserved GGTT node.
+ * To be used in cases where ggtt->lock is already taken.
+ * Use xe_ggtt_node_remove_balloon_locked() to release a reserved GGTT node.
*
* Return: 0 on success or a negative error code on failure.
*/
-int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
+int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node, u64 start, u64 end)
{
struct xe_ggtt *ggtt = node->ggtt;
int err;
@@ -447,14 +448,13 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
xe_tile_assert(ggtt->tile, IS_ALIGNED(start, XE_PAGE_SIZE));
xe_tile_assert(ggtt->tile, IS_ALIGNED(end, XE_PAGE_SIZE));
xe_tile_assert(ggtt->tile, !drm_mm_node_allocated(&node->base));
+ lockdep_assert_held(&ggtt->lock);
node->base.color = 0;
node->base.start = start;
node->base.size = end - start;
- mutex_lock(&ggtt->lock);
err = drm_mm_reserve_node(&ggtt->mm, &node->base);
- mutex_unlock(&ggtt->lock);
if (xe_gt_WARN(ggtt->tile->primary_gt, err,
"Failed to balloon GGTT %#llx-%#llx (%pe)\n",
@@ -466,27 +466,25 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
}
/**
- * xe_ggtt_node_remove_balloon - release a reserved GGTT region
+ * xe_ggtt_node_remove_balloon_locked - release a reserved GGTT region
* @node: the &xe_ggtt_node with reserved GGTT region
*
- * See xe_ggtt_node_insert_balloon() for details.
+ * To be used in cases where ggtt->lock is already taken.
+ * See xe_ggtt_node_insert_balloon_locked() for details.
*/
-void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node)
+void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
{
+ lockdep_assert_held(&node->ggtt->lock);
+
if (!node || !node->ggtt)
return;
if (!drm_mm_node_allocated(&node->base))
- goto free_node;
+ return;
xe_ggtt_dump_node(node->ggtt, &node->base, "remove-balloon");
- mutex_lock(&node->ggtt->lock);
drm_mm_remove_node(&node->base);
- mutex_unlock(&node->ggtt->lock);
-
-free_node:
- xe_ggtt_node_fini(node);
}
/**
@@ -539,10 +537,10 @@ int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align)
*
* This function will allocated the struct %xe_ggtt_node and return it's pointer.
* This struct will then be freed after the node removal upon xe_ggtt_node_remove()
- * or xe_ggtt_node_remove_balloon().
+ * or xe_ggtt_node_remove_balloon_locked().
* Having %xe_ggtt_node struct allocated doesn't mean that the node is already allocated
* in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
- * xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT.
+ * xe_ggtt_node_insert_balloon_locked() will ensure the node is inserted or reserved in GGTT.
*
* Return: A pointer to %xe_ggtt_node struct on success. An ERR_PTR otherwise.
**/
@@ -564,7 +562,7 @@ struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt)
* @node: the &xe_ggtt_node to be freed
*
* If anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
- * or xe_ggtt_node_insert_balloon(); and this @node is not going to be reused, then,
+ * or xe_ggtt_node_insert_balloon_locked(); and this @node is not going to be reused, then,
* this function needs to be called to free the %xe_ggtt_node struct
**/
void xe_ggtt_node_fini(struct xe_ggtt_node *node)
diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
index 27e7d67de004..d468af96b465 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.h
+++ b/drivers/gpu/drm/xe/xe_ggtt.h
@@ -15,9 +15,9 @@ int xe_ggtt_init(struct xe_ggtt *ggtt);
struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt);
void xe_ggtt_node_fini(struct xe_ggtt_node *node);
-int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node,
- u64 start, u64 size);
-void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node);
+int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
+ u64 start, u64 size);
+void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index a439261bf4d7..d2f6bfb3aacf 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -560,35 +560,40 @@ u64 xe_gt_sriov_vf_lmem(struct xe_gt *gt)
return gt->sriov.vf.self_config.lmem_size;
}
-static struct xe_ggtt_node *
-vf_balloon_ggtt_node(struct xe_ggtt *ggtt, u64 start, u64 end)
+static int vf_init_ggtt_balloons(struct xe_gt *gt)
{
- struct xe_ggtt_node *node;
- int err;
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_ggtt *ggtt = tile->mem.ggtt;
- node = xe_ggtt_node_init(ggtt);
- if (IS_ERR(node))
- return node;
+ tile->sriov.vf.ggtt_balloon[0] = xe_ggtt_node_init(ggtt);
+ if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
+ return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
- err = xe_ggtt_node_insert_balloon(node, start, end);
- if (err) {
- xe_ggtt_node_fini(node);
- return ERR_PTR(err);
+ tile->sriov.vf.ggtt_balloon[1] = xe_ggtt_node_init(ggtt);
+ if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
+ xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
+ return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
}
- return node;
+ return 0;
}
-static int vf_balloon_ggtt(struct xe_gt *gt)
+/**
+ * xe_gt_sriov_vf_balloon_ggtt_locked - Insert balloon nodes to limit used GGTT address range.
+ * @gt: the &xe_gt struct instance
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt)
{
struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
struct xe_tile *tile = gt_to_tile(gt);
- struct xe_ggtt *ggtt = tile->mem.ggtt;
struct xe_device *xe = gt_to_xe(gt);
u64 start, end;
+ int err;
xe_gt_assert(gt, IS_SRIOV_VF(xe));
xe_gt_assert(gt, !xe_gt_is_media_type(gt));
+ lockdep_assert_held(&tile->mem.ggtt->lock);
if (!config->ggtt_size)
return -ENODATA;
@@ -611,31 +616,75 @@ static int vf_balloon_ggtt(struct xe_gt *gt)
start = xe_wopcm_size(xe);
end = config->ggtt_base;
if (end != start) {
- tile->sriov.vf.ggtt_balloon[0] = vf_balloon_ggtt_node(ggtt, start, end);
- if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
- return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], start, end);
+ if (err)
+ return err;
}
start = config->ggtt_base + config->ggtt_size;
end = GUC_GGTT_TOP;
if (end != start) {
- tile->sriov.vf.ggtt_balloon[1] = vf_balloon_ggtt_node(ggtt, start, end);
- if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
- xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
- return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[1], start, end);
+ if (err) {
+ xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
+ return err;
}
}
return 0;
}
-static void deballoon_ggtt(struct drm_device *drm, void *arg)
+static int vf_balloon_ggtt(struct xe_gt *gt)
{
- struct xe_tile *tile = arg;
+ struct xe_ggtt *ggtt = gt_to_tile(gt)->mem.ggtt;
+ int err;
+
+ mutex_lock(&ggtt->lock);
+ err = xe_gt_sriov_vf_balloon_ggtt_locked(gt);
+ mutex_unlock(&ggtt->lock);
+
+ return err;
+}
+
+/**
+ * xe_gt_sriov_vf_deballoon_ggtt_locked - Remove balloon nodes which limited used address renge.
+ * @gt: the &xe_gt struct instance
+ */
+void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
xe_tile_assert(tile, IS_SRIOV_VF(tile_to_xe(tile)));
- xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[1]);
- xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
+ xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[1]);
+ xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
+}
+
+static void vf_deballoon_ggtt(struct xe_gt *gt)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+
+ mutex_lock(&tile->mem.ggtt->lock);
+ xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
+ mutex_unlock(&tile->mem.ggtt->lock);
+}
+
+static void vf_balloon_fini(struct xe_gt *gt)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+
+ xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
+ xe_gt_assert(gt, !xe_gt_is_media_type(gt));
+
+ xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[1]);
+ xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
+}
+
+static void deballoon_and_fini_ggtt(struct drm_device *drm, void *arg)
+{
+ struct xe_tile *tile = arg;
+
+ vf_deballoon_ggtt(tile->primary_gt);
+ vf_balloon_fini(tile->primary_gt);
}
/**
@@ -655,11 +704,17 @@ int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt)
if (xe_gt_is_media_type(gt))
return 0;
- err = vf_balloon_ggtt(gt);
+ err = vf_init_ggtt_balloons(gt);
if (err)
return err;
- return drmm_add_action_or_reset(&xe->drm, deballoon_ggtt, tile);
+ err = vf_balloon_ggtt(gt);
+ if (err) {
+ vf_balloon_fini(gt);
+ return err;
+ }
+
+ return drmm_add_action_or_reset(&xe->drm, deballoon_and_fini_ggtt, tile);
}
static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32 *minor)
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
index ba6c5d74e326..d717deb8af91 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
@@ -18,6 +18,8 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
int xe_gt_sriov_vf_connect(struct xe_gt *gt);
int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
+int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
+void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion
2025-04-09 21:13 ` [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion Tomasz Lis
@ 2025-04-10 16:54 ` Michal Wajdeczko
2025-04-11 14:35 ` Lis, Tomasz
0 siblings, 1 reply; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-10 16:54 UTC (permalink / raw)
To: Tomasz Lis, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 09.04.2025 23:13, Tomasz Lis wrote:
> The balloon nodes, which are used to fill areas of GGTT inaccessible
> for a specific VF, were allocated and inserted into GGTT within one
> function. To be able to re-use that insertion code during VF
> migration recovery, we need to split it.
>
> This patch separates allocation (init/fini functs) from the insertion
> of balloons (balloon/deballoon functs). Locks are also moved to ensure
> calls from post-migration recovery worker will not cause a deadlock.
>
> v2: Moved declarations to proper header
> v3: Rephrased description, introduced "_locked" versions of some
> functs, more lockdep checks, some functions renamed, altered error
> handling, added missing kerneldocs.
> v4: Suffixed more functs with `_locked`, moved lockdep asserts,
> fixed finalization in error path, added asserts
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
> drivers/gpu/drm/xe/xe_ggtt.c | 34 ++++-----
> drivers/gpu/drm/xe/xe_ggtt.h | 6 +-
> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 109 +++++++++++++++++++++-------
> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
> 4 files changed, 103 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 7062115909f2..e7d474bd0cfe 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -1,4 +1,4 @@
> -// SPDX-License-Identifier: MIT
> +/// SPDX-License-Identifier: MIT
what's this?
> /*
> * Copyright © 2021 Intel Corporation
> */
> @@ -429,16 +429,17 @@ static void xe_ggtt_dump_node(struct xe_ggtt *ggtt,
> }
>
> /**
> - * xe_ggtt_node_insert_balloon - prevent allocation of specified GGTT addresses
> + * xe_ggtt_node_insert_balloon_locked - prevent allocation of specified GGTT addresses
> * @node: the &xe_ggtt_node to hold reserved GGTT node
> * @start: the starting GGTT address of the reserved region
> * @end: then end GGTT address of the reserved region
> *
> - * Use xe_ggtt_node_remove_balloon() to release a reserved GGTT node.
> + * To be used in cases where ggtt->lock is already taken.
> + * Use xe_ggtt_node_remove_balloon_locked() to release a reserved GGTT node.
> *
> * Return: 0 on success or a negative error code on failure.
> */
> -int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
> +int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node, u64 start, u64 end)
> {
> struct xe_ggtt *ggtt = node->ggtt;
> int err;
> @@ -447,14 +448,13 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
> xe_tile_assert(ggtt->tile, IS_ALIGNED(start, XE_PAGE_SIZE));
> xe_tile_assert(ggtt->tile, IS_ALIGNED(end, XE_PAGE_SIZE));
> xe_tile_assert(ggtt->tile, !drm_mm_node_allocated(&node->base));
> + lockdep_assert_held(&ggtt->lock);
>
> node->base.color = 0;
> node->base.start = start;
> node->base.size = end - start;
>
> - mutex_lock(&ggtt->lock);
> err = drm_mm_reserve_node(&ggtt->mm, &node->base);
> - mutex_unlock(&ggtt->lock);
>
> if (xe_gt_WARN(ggtt->tile->primary_gt, err,
> "Failed to balloon GGTT %#llx-%#llx (%pe)\n",
> @@ -466,27 +466,25 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
> }
>
> /**
> - * xe_ggtt_node_remove_balloon - release a reserved GGTT region
> + * xe_ggtt_node_remove_balloon_locked - release a reserved GGTT region
> * @node: the &xe_ggtt_node with reserved GGTT region
> *
> - * See xe_ggtt_node_insert_balloon() for details.
> + * To be used in cases where ggtt->lock is already taken.
> + * See xe_ggtt_node_insert_balloon_locked() for details.
> */
> -void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node)
> +void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
> {
> + lockdep_assert_held(&node->ggtt->lock);
> +
> if (!node || !node->ggtt)
> return;
>
> if (!drm_mm_node_allocated(&node->base))
nit: we should use xe_ggtt_node_allocated() instead
> - goto free_node;
> + return;
>
> xe_ggtt_dump_node(node->ggtt, &node->base, "remove-balloon");
>
> - mutex_lock(&node->ggtt->lock);
> drm_mm_remove_node(&node->base);
> - mutex_unlock(&node->ggtt->lock);
> -
> -free_node:
> - xe_ggtt_node_fini(node);
> }
>
> /**
> @@ -539,10 +537,10 @@ int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align)
> *
> * This function will allocated the struct %xe_ggtt_node and return it's pointer.
since you're around, can you fix above s/allocated/allocate
> * This struct will then be freed after the node removal upon xe_ggtt_node_remove()
> - * or xe_ggtt_node_remove_balloon().
> + * or xe_ggtt_node_remove_balloon_locked().
> * Having %xe_ggtt_node struct allocated doesn't mean that the node is already allocated
> * in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
> - * xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT.
> + * xe_ggtt_node_insert_balloon_locked() will ensure the node is inserted or reserved in GGTT.
> *
> * Return: A pointer to %xe_ggtt_node struct on success. An ERR_PTR otherwise.
> **/
> @@ -564,7 +562,7 @@ struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt)
> * @node: the &xe_ggtt_node to be freed
> *
> * If anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
> - * or xe_ggtt_node_insert_balloon(); and this @node is not going to be reused, then,
> + * or xe_ggtt_node_insert_balloon_locked(); and this @node is not going to be reused, then,
> * this function needs to be called to free the %xe_ggtt_node struct
> **/
> void xe_ggtt_node_fini(struct xe_ggtt_node *node)
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
> index 27e7d67de004..d468af96b465 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.h
> +++ b/drivers/gpu/drm/xe/xe_ggtt.h
> @@ -15,9 +15,9 @@ int xe_ggtt_init(struct xe_ggtt *ggtt);
>
> struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt);
> void xe_ggtt_node_fini(struct xe_ggtt_node *node);
> -int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node,
> - u64 start, u64 size);
> -void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node);
> +int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
> + u64 start, u64 size);
> +void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
>
> int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
> int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> index a439261bf4d7..d2f6bfb3aacf 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> @@ -560,35 +560,40 @@ u64 xe_gt_sriov_vf_lmem(struct xe_gt *gt)
> return gt->sriov.vf.self_config.lmem_size;
> }
>
> -static struct xe_ggtt_node *
> -vf_balloon_ggtt_node(struct xe_ggtt *ggtt, u64 start, u64 end)
> +static int vf_init_ggtt_balloons(struct xe_gt *gt)
> {
> - struct xe_ggtt_node *node;
> - int err;
> + struct xe_tile *tile = gt_to_tile(gt);
> + struct xe_ggtt *ggtt = tile->mem.ggtt;
>
> - node = xe_ggtt_node_init(ggtt);
> - if (IS_ERR(node))
> - return node;
> + tile->sriov.vf.ggtt_balloon[0] = xe_ggtt_node_init(ggtt);
> + if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
> + return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
as mentioned earlier in similar case, since you are accessing vf
specific fields we should have asserts in this function:
xe_gt_assert(gt, IS_SRIOV_VF(xe));
xe_gt_assert(gt, !xe_gt_is_media_type(gt));
>
> - err = xe_ggtt_node_insert_balloon(node, start, end);
> - if (err) {
> - xe_ggtt_node_fini(node);
> - return ERR_PTR(err);
> + tile->sriov.vf.ggtt_balloon[1] = xe_ggtt_node_init(ggtt);
> + if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
> + return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
> }
>
> - return node;
> + return 0;
> }
>
> -static int vf_balloon_ggtt(struct xe_gt *gt)
> +/**
> + * xe_gt_sriov_vf_balloon_ggtt_locked - Insert balloon nodes to limit used GGTT address range.
> + * @gt: the &xe_gt struct instance
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt)
> {
> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
> struct xe_tile *tile = gt_to_tile(gt);
> - struct xe_ggtt *ggtt = tile->mem.ggtt;
> struct xe_device *xe = gt_to_xe(gt);
> u64 start, end;
> + int err;
>
> xe_gt_assert(gt, IS_SRIOV_VF(xe));
> xe_gt_assert(gt, !xe_gt_is_media_type(gt));
> + lockdep_assert_held(&tile->mem.ggtt->lock);
>
> if (!config->ggtt_size)
> return -ENODATA;
> @@ -611,31 +616,75 @@ static int vf_balloon_ggtt(struct xe_gt *gt)
> start = xe_wopcm_size(xe);
> end = config->ggtt_base;
> if (end != start) {
> - tile->sriov.vf.ggtt_balloon[0] = vf_balloon_ggtt_node(ggtt, start, end);
> - if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
> - return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
> + err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], start, end);
> + if (err)
> + return err;
> }
>
> start = config->ggtt_base + config->ggtt_size;
> end = GUC_GGTT_TOP;
> if (end != start) {
> - tile->sriov.vf.ggtt_balloon[1] = vf_balloon_ggtt_node(ggtt, start, end);
> - if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
> - return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
> + err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[1], start, end);
> + if (err) {
> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
> + return err;
> }
> }
>
> return 0;
> }
>
> -static void deballoon_ggtt(struct drm_device *drm, void *arg)
> +static int vf_balloon_ggtt(struct xe_gt *gt)
> {
> - struct xe_tile *tile = arg;
> + struct xe_ggtt *ggtt = gt_to_tile(gt)->mem.ggtt;
> + int err;
> +
> + mutex_lock(&ggtt->lock);
> + err = xe_gt_sriov_vf_balloon_ggtt_locked(gt);
> + mutex_unlock(&ggtt->lock);
> +
> + return err;
> +}
> +
> +/**
> + * xe_gt_sriov_vf_deballoon_ggtt_locked - Remove balloon nodes which limited used address renge.
typo
hmm, but I'm not sure we need "which ..." part anyway
> + * @gt: the &xe_gt struct instance
> + */
> +void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
>
> xe_tile_assert(tile, IS_SRIOV_VF(tile_to_xe(tile)));
> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[1]);
> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[1]);
> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
> +}
> +
> +static void vf_deballoon_ggtt(struct xe_gt *gt)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + mutex_lock(&tile->mem.ggtt->lock);
> + xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
> + mutex_unlock(&tile->mem.ggtt->lock);
> +}
> +
> +static void vf_balloon_fini(struct xe_gt *gt)
naming... since this is a cleanup of the vf_init_ggtt_balloons() then it
should be named in matching fashion, so
s/vf_balloon_fini/vf_fini_ggtt_balloons
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
> + xe_gt_assert(gt, !xe_gt_is_media_type(gt));
> +
> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[1]);
> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
> +}
> +
> +static void deballoon_and_fini_ggtt(struct drm_device *drm, void *arg)
hmm, naming again...
as this is a cleanup action for the xe_gt_sriov_vf_prepare_ggtt() then maybe
s/deballoon_and_fini_ggtt/cleanup_ggtt
will suffice?
> +{
> + struct xe_tile *tile = arg;
> +
> + vf_deballoon_ggtt(tile->primary_gt);
> + vf_balloon_fini(tile->primary_gt);
> }
>
> /**
> @@ -655,11 +704,17 @@ int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt)
> if (xe_gt_is_media_type(gt))
> return 0;
>
> - err = vf_balloon_ggtt(gt);
> + err = vf_init_ggtt_balloons(gt);
> if (err)
> return err;
>
> - return drmm_add_action_or_reset(&xe->drm, deballoon_ggtt, tile);
> + err = vf_balloon_ggtt(gt);
> + if (err) {
> + vf_balloon_fini(gt);
> + return err;
> + }
> +
> + return drmm_add_action_or_reset(&xe->drm, deballoon_and_fini_ggtt, tile);
> }
>
> static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32 *minor)
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> index ba6c5d74e326..d717deb8af91 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> @@ -18,6 +18,8 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
> int xe_gt_sriov_vf_connect(struct xe_gt *gt);
> int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
> +int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
> +void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion
2025-04-10 16:54 ` Michal Wajdeczko
@ 2025-04-11 14:35 ` Lis, Tomasz
2025-04-11 16:32 ` Michal Wajdeczko
0 siblings, 1 reply; 22+ messages in thread
From: Lis, Tomasz @ 2025-04-11 14:35 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 10.04.2025 18:54, Michal Wajdeczko wrote:
> On 09.04.2025 23:13, Tomasz Lis wrote:
>> The balloon nodes, which are used to fill areas of GGTT inaccessible
>> for a specific VF, were allocated and inserted into GGTT within one
>> function. To be able to re-use that insertion code during VF
>> migration recovery, we need to split it.
>>
>> This patch separates allocation (init/fini functs) from the insertion
>> of balloons (balloon/deballoon functs). Locks are also moved to ensure
>> calls from post-migration recovery worker will not cause a deadlock.
>>
>> v2: Moved declarations to proper header
>> v3: Rephrased description, introduced "_locked" versions of some
>> functs, more lockdep checks, some functions renamed, altered error
>> handling, added missing kerneldocs.
>> v4: Suffixed more functs with `_locked`, moved lockdep asserts,
>> fixed finalization in error path, added asserts
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis@intel.com>
>> Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_ggtt.c | 34 ++++-----
>> drivers/gpu/drm/xe/xe_ggtt.h | 6 +-
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 109 +++++++++++++++++++++-------
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
>> 4 files changed, 103 insertions(+), 48 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>> index 7062115909f2..e7d474bd0cfe 100644
>> --- a/drivers/gpu/drm/xe/xe_ggtt.c
>> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
>> @@ -1,4 +1,4 @@
>> -// SPDX-License-Identifier: MIT
>> +/// SPDX-License-Identifier: MIT
> what's this?
happens when I have lagged connection to my dev machine. Will remove.
>> /*
>> * Copyright © 2021 Intel Corporation
>> */
>> @@ -429,16 +429,17 @@ static void xe_ggtt_dump_node(struct xe_ggtt *ggtt,
>> }
>>
>> /**
>> - * xe_ggtt_node_insert_balloon - prevent allocation of specified GGTT addresses
>> + * xe_ggtt_node_insert_balloon_locked - prevent allocation of specified GGTT addresses
>> * @node: the &xe_ggtt_node to hold reserved GGTT node
>> * @start: the starting GGTT address of the reserved region
>> * @end: then end GGTT address of the reserved region
>> *
>> - * Use xe_ggtt_node_remove_balloon() to release a reserved GGTT node.
>> + * To be used in cases where ggtt->lock is already taken.
>> + * Use xe_ggtt_node_remove_balloon_locked() to release a reserved GGTT node.
>> *
>> * Return: 0 on success or a negative error code on failure.
>> */
>> -int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
>> +int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node, u64 start, u64 end)
>> {
>> struct xe_ggtt *ggtt = node->ggtt;
>> int err;
>> @@ -447,14 +448,13 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
>> xe_tile_assert(ggtt->tile, IS_ALIGNED(start, XE_PAGE_SIZE));
>> xe_tile_assert(ggtt->tile, IS_ALIGNED(end, XE_PAGE_SIZE));
>> xe_tile_assert(ggtt->tile, !drm_mm_node_allocated(&node->base));
>> + lockdep_assert_held(&ggtt->lock);
>>
>> node->base.color = 0;
>> node->base.start = start;
>> node->base.size = end - start;
>>
>> - mutex_lock(&ggtt->lock);
>> err = drm_mm_reserve_node(&ggtt->mm, &node->base);
>> - mutex_unlock(&ggtt->lock);
>>
>> if (xe_gt_WARN(ggtt->tile->primary_gt, err,
>> "Failed to balloon GGTT %#llx-%#llx (%pe)\n",
>> @@ -466,27 +466,25 @@ int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)
>> }
>>
>> /**
>> - * xe_ggtt_node_remove_balloon - release a reserved GGTT region
>> + * xe_ggtt_node_remove_balloon_locked - release a reserved GGTT region
>> * @node: the &xe_ggtt_node with reserved GGTT region
>> *
>> - * See xe_ggtt_node_insert_balloon() for details.
>> + * To be used in cases where ggtt->lock is already taken.
>> + * See xe_ggtt_node_insert_balloon_locked() for details.
>> */
>> -void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node)
>> +void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
>> {
>> + lockdep_assert_held(&node->ggtt->lock);
>> +
>> if (!node || !node->ggtt)
>> return;
>>
>> if (!drm_mm_node_allocated(&node->base))
> nit: we should use xe_ggtt_node_allocated() instead
will switch.
>> - goto free_node;
>> + return;
>>
>> xe_ggtt_dump_node(node->ggtt, &node->base, "remove-balloon");
>>
>> - mutex_lock(&node->ggtt->lock);
>> drm_mm_remove_node(&node->base);
>> - mutex_unlock(&node->ggtt->lock);
>> -
>> -free_node:
>> - xe_ggtt_node_fini(node);
>> }
>>
>> /**
>> @@ -539,10 +537,10 @@ int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align)
>> *
>> * This function will allocated the struct %xe_ggtt_node and return it's pointer.
> since you're around, can you fix above s/allocated/allocate
ok. "it's" sounds dubious as well - we're not returning whether "it is
pointer" but just "its pointer".
>> * This struct will then be freed after the node removal upon xe_ggtt_node_remove()
>> - * or xe_ggtt_node_remove_balloon().
>> + * or xe_ggtt_node_remove_balloon_locked().
>> * Having %xe_ggtt_node struct allocated doesn't mean that the node is already allocated
>> * in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
>> - * xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT.
>> + * xe_ggtt_node_insert_balloon_locked() will ensure the node is inserted or reserved in GGTT.
>> *
>> * Return: A pointer to %xe_ggtt_node struct on success. An ERR_PTR otherwise.
>> **/
>> @@ -564,7 +562,7 @@ struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt)
>> * @node: the &xe_ggtt_node to be freed
>> *
>> * If anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(),
>> - * or xe_ggtt_node_insert_balloon(); and this @node is not going to be reused, then,
>> + * or xe_ggtt_node_insert_balloon_locked(); and this @node is not going to be reused, then,
>> * this function needs to be called to free the %xe_ggtt_node struct
>> **/
>> void xe_ggtt_node_fini(struct xe_ggtt_node *node)
>> diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
>> index 27e7d67de004..d468af96b465 100644
>> --- a/drivers/gpu/drm/xe/xe_ggtt.h
>> +++ b/drivers/gpu/drm/xe/xe_ggtt.h
>> @@ -15,9 +15,9 @@ int xe_ggtt_init(struct xe_ggtt *ggtt);
>>
>> struct xe_ggtt_node *xe_ggtt_node_init(struct xe_ggtt *ggtt);
>> void xe_ggtt_node_fini(struct xe_ggtt_node *node);
>> -int xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node,
>> - u64 start, u64 size);
>> -void xe_ggtt_node_remove_balloon(struct xe_ggtt_node *node);
>> +int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
>> + u64 start, u64 size);
>> +void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
>>
>> int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
>> int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> index a439261bf4d7..d2f6bfb3aacf 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> @@ -560,35 +560,40 @@ u64 xe_gt_sriov_vf_lmem(struct xe_gt *gt)
>> return gt->sriov.vf.self_config.lmem_size;
>> }
>>
>> -static struct xe_ggtt_node *
>> -vf_balloon_ggtt_node(struct xe_ggtt *ggtt, u64 start, u64 end)
>> +static int vf_init_ggtt_balloons(struct xe_gt *gt)
>> {
>> - struct xe_ggtt_node *node;
>> - int err;
>> + struct xe_tile *tile = gt_to_tile(gt);
>> + struct xe_ggtt *ggtt = tile->mem.ggtt;
>>
>> - node = xe_ggtt_node_init(ggtt);
>> - if (IS_ERR(node))
>> - return node;
>> + tile->sriov.vf.ggtt_balloon[0] = xe_ggtt_node_init(ggtt);
>> + if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
>> + return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
> as mentioned earlier in similar case, since you are accessing vf
> specific fields we should have asserts in this function:
>
> xe_gt_assert(gt, IS_SRIOV_VF(xe));
> xe_gt_assert(gt, !xe_gt_is_media_type(gt));
ack
>>
>> - err = xe_ggtt_node_insert_balloon(node, start, end);
>> - if (err) {
>> - xe_ggtt_node_fini(node);
>> - return ERR_PTR(err);
>> + tile->sriov.vf.ggtt_balloon[1] = xe_ggtt_node_init(ggtt);
>> + if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
>> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
>> + return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
>> }
>>
>> - return node;
>> + return 0;
>> }
>>
>> -static int vf_balloon_ggtt(struct xe_gt *gt)
>> +/**
>> + * xe_gt_sriov_vf_balloon_ggtt_locked - Insert balloon nodes to limit used GGTT address range.
>> + * @gt: the &xe_gt struct instance
>> + * Return: 0 on success or a negative error code on failure.
>> + */
>> +int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt)
>> {
>> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
>> struct xe_tile *tile = gt_to_tile(gt);
>> - struct xe_ggtt *ggtt = tile->mem.ggtt;
>> struct xe_device *xe = gt_to_xe(gt);
>> u64 start, end;
>> + int err;
>>
>> xe_gt_assert(gt, IS_SRIOV_VF(xe));
>> xe_gt_assert(gt, !xe_gt_is_media_type(gt));
>> + lockdep_assert_held(&tile->mem.ggtt->lock);
>>
>> if (!config->ggtt_size)
>> return -ENODATA;
>> @@ -611,31 +616,75 @@ static int vf_balloon_ggtt(struct xe_gt *gt)
>> start = xe_wopcm_size(xe);
>> end = config->ggtt_base;
>> if (end != start) {
>> - tile->sriov.vf.ggtt_balloon[0] = vf_balloon_ggtt_node(ggtt, start, end);
>> - if (IS_ERR(tile->sriov.vf.ggtt_balloon[0]))
>> - return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]);
>> + err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], start, end);
>> + if (err)
>> + return err;
>> }
>>
>> start = config->ggtt_base + config->ggtt_size;
>> end = GUC_GGTT_TOP;
>> if (end != start) {
>> - tile->sriov.vf.ggtt_balloon[1] = vf_balloon_ggtt_node(ggtt, start, end);
>> - if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) {
>> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
>> - return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]);
>> + err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[1], start, end);
>> + if (err) {
>> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
>> + return err;
>> }
>> }
>>
>> return 0;
>> }
>>
>> -static void deballoon_ggtt(struct drm_device *drm, void *arg)
>> +static int vf_balloon_ggtt(struct xe_gt *gt)
>> {
>> - struct xe_tile *tile = arg;
>> + struct xe_ggtt *ggtt = gt_to_tile(gt)->mem.ggtt;
>> + int err;
>> +
>> + mutex_lock(&ggtt->lock);
>> + err = xe_gt_sriov_vf_balloon_ggtt_locked(gt);
>> + mutex_unlock(&ggtt->lock);
>> +
>> + return err;
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_vf_deballoon_ggtt_locked - Remove balloon nodes which limited used address renge.
> typo
>
> hmm, but I'm not sure we need "which ..." part anyway
it is repeating the same from "balloon" co-function. Will shorten.
>> + * @gt: the &xe_gt struct instance
>> + */
>> +void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt)
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>>
>> xe_tile_assert(tile, IS_SRIOV_VF(tile_to_xe(tile)));
>> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[1]);
>> - xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]);
>> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[1]);
>> + xe_ggtt_node_remove_balloon_locked(tile->sriov.vf.ggtt_balloon[0]);
>> +}
>> +
>> +static void vf_deballoon_ggtt(struct xe_gt *gt)
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>> +
>> + mutex_lock(&tile->mem.ggtt->lock);
>> + xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
>> + mutex_unlock(&tile->mem.ggtt->lock);
>> +}
>> +
>> +static void vf_balloon_fini(struct xe_gt *gt)
> naming... since this is a cleanup of the vf_init_ggtt_balloons() then it
> should be named in matching fashion, so
>
> s/vf_balloon_fini/vf_fini_ggtt_balloons
ok
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>> +
>> + xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
>> + xe_gt_assert(gt, !xe_gt_is_media_type(gt));
>> +
>> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[1]);
>> + xe_ggtt_node_fini(tile->sriov.vf.ggtt_balloon[0]);
>> +}
>> +
>> +static void deballoon_and_fini_ggtt(struct drm_device *drm, void *arg)
> hmm, naming again...
>
> as this is a cleanup action for the xe_gt_sriov_vf_prepare_ggtt() then maybe
> s/deballoon_and_fini_ggtt/cleanup_ggtt
> will suffice?
Sounds less descriptive, but ok will rename.
-Tomasz
>> +{
>> + struct xe_tile *tile = arg;
>> +
>> + vf_deballoon_ggtt(tile->primary_gt);
>> + vf_balloon_fini(tile->primary_gt);
>> }
>>
>> /**
>> @@ -655,11 +704,17 @@ int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt)
>> if (xe_gt_is_media_type(gt))
>> return 0;
>>
>> - err = vf_balloon_ggtt(gt);
>> + err = vf_init_ggtt_balloons(gt);
>> if (err)
>> return err;
>>
>> - return drmm_add_action_or_reset(&xe->drm, deballoon_ggtt, tile);
>> + err = vf_balloon_ggtt(gt);
>> + if (err) {
>> + vf_balloon_fini(gt);
>> + return err;
>> + }
>> +
>> + return drmm_add_action_or_reset(&xe->drm, deballoon_and_fini_ggtt, tile);
>> }
>>
>> static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32 *minor)
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> index ba6c5d74e326..d717deb8af91 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> @@ -18,6 +18,8 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
>> int xe_gt_sriov_vf_connect(struct xe_gt *gt);
>> int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
>> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
>> +int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
>> +void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
>> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
>> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>>
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion
2025-04-11 14:35 ` Lis, Tomasz
@ 2025-04-11 16:32 ` Michal Wajdeczko
0 siblings, 0 replies; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-11 16:32 UTC (permalink / raw)
To: Lis, Tomasz, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 11.04.2025 16:35, Lis, Tomasz wrote:
>
> On 10.04.2025 18:54, Michal Wajdeczko wrote:
>> On 09.04.2025 23:13, Tomasz Lis wrote:
...
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>>> index 7062115909f2..e7d474bd0cfe 100644
>>> --- a/drivers/gpu/drm/xe/xe_ggtt.c
>>> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
>>> @@ -1,4 +1,4 @@
>>> -// SPDX-License-Identifier: MIT
>>> +/// SPDX-License-Identifier: MIT
>> what's this?
> happens when I have lagged connection to my dev machine. Will remove.
I really don't care when/how it was added
but it clearly shows that you don't check the diffs in patches before
sending them out and requesting a review
so asking again, please be more careful and mind the reviewers time
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
2025-04-09 21:13 ` [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion Tomasz Lis
@ 2025-04-09 21:13 ` Tomasz Lis
2025-04-10 17:13 ` Michal Wajdeczko
2025-04-09 21:13 ` [PATCH v8 3/4] drm/xe/guc: Introduce enum with offsets for context register H2Gs Tomasz Lis
` (9 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Tomasz Lis @ 2025-04-09 21:13 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski, Matthew Brost, Lucas De Marchi
We have only one GGTT for all IOV functions, with each VF having assigned
a range of addresses for its use. After migration, a VF can receive a
different range of addresses than it had initially.
This implements shifting GGTT addresses within drm_mm nodes, so that
VMAs stay valid after migration. This will make the driver use new
addresses when accessing GGTT from the moment the shifting ends.
By taking the ggtt->lock for the period of VMA fixups, this change
also adds constraint on that mutex. Any locks used during the recovery
cannot ever wait for hardware response - because after migration,
the hardware will not do anything until fixups are finished.
v2: Moved some functs to xe_ggtt.c; moved shift computation to just
after querying; improved documentation; switched some warns to asserts;
skipping fixups when GGTT shift eq 0; iterating through tiles (Michal)
v3: Updated kerneldocs, removed unused funct, properly allocate
balloning nodes if non existent
v4: Re-used ballooning functions from VF init, used bool in place of
standard error codes
v5: Renamed one function
v6: Subject tag change, several kerneldocs updated, some functions
renamed, some moved, added several asserts, shuffled declarations
of variables, revealed more detail in high level functions
v7: Fixed typos, added `_locked` suffix to some functs, improved
readability of asserts, removed unneeded conditional
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
drivers/gpu/drm/xe/xe_ggtt.c | 48 ++++++++++++
drivers/gpu/drm/xe/xe_ggtt.h | 1 +
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 96 +++++++++++++++++++++++
drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
drivers/gpu/drm/xe/xe_sriov_vf.c | 22 ++++++
6 files changed, 171 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index e7d474bd0cfe..d19878f6bd6b 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -487,6 +487,54 @@ void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
drm_mm_remove_node(&node->base);
}
+void xe_ggtt_assert_fit(struct xe_ggtt *ggtt, u64 start, u64 size)
+{
+ struct xe_tile *tile __maybe_unused = ggtt->tile;
+ struct xe_device *xe = tile_to_xe(tile);
+ u64 wopcm = xe_wopcm_size(xe);
+
+ xe_tile_assert(tile, start >= wopcm);
+ xe_tile_assert(tile, start + size < ggtt->size - wopcm);
+}
+
+/**
+ * xe_ggtt_shift_nodes_locked - Shift GGTT nodes to adjust for a change in usable address range.
+ * @ggtt: the &xe_ggtt struct instance
+ * @shift: change to the location of area provisioned for current VF
+ *
+ * This function moves all nodes from the GGTT VM, to a temp list. These nodes are expected
+ * to represent allocations in range formerly assigned to current VF, before the range changed.
+ * When the GGTT VM is completely clear of any nodes, they are re-added with shifted offsets.
+ *
+ * The function has no ability of failing - because it shifts existing nodes, without
+ * any additional processing. If the nodes were successfully existing at the old address,
+ * they will do the same at the new one. A fail inside this function would indicate that
+ * the list of nodes was either already damaged, or that the shift brings the address range
+ * outside of valid bounds. Both cases justify an assert rather than error code.
+ */
+void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift)
+{
+ struct xe_tile *tile __maybe_unused = ggtt->tile;
+ struct drm_mm_node *node, *tmpn;
+ LIST_HEAD(temp_list_head);
+ int err;
+
+ lockdep_assert_held(&ggtt->lock);
+
+ drm_mm_for_each_node_safe(node, tmpn, &ggtt->mm) {
+ drm_mm_remove_node(node);
+ list_add(&node->node_list, &temp_list_head);
+ }
+
+ list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
+ xe_ggtt_assert_fit(ggtt, node->start + shift, node->size);
+ list_del(&node->node_list);
+ node->start += shift;
+ err = drm_mm_reserve_node(&ggtt->mm, node);
+ xe_tile_assert(tile, !err);
+ }
+}
+
/**
* xe_ggtt_node_insert_locked - Locked version to insert a &xe_ggtt_node into the GGTT
* @node: the &xe_ggtt_node to be inserted
diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
index d468af96b465..4337a279ff3b 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.h
+++ b/drivers/gpu/drm/xe/xe_ggtt.h
@@ -18,6 +18,7 @@ void xe_ggtt_node_fini(struct xe_ggtt_node *node);
int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
u64 start, u64 size);
void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
+void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift);
int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index d2f6bfb3aacf..06f93bce2fa7 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -415,12 +415,25 @@ static int vf_get_ggtt_info(struct xe_gt *gt)
xe_gt_sriov_dbg_verbose(gt, "GGTT %#llx-%#llx = %lluK\n",
start, start + size - 1, size / SZ_1K);
+ config->ggtt_shift = start - (s64)config->ggtt_base;
config->ggtt_base = start;
config->ggtt_size = size;
return config->ggtt_size ? 0 : -ENODATA;
}
+/**
+ * xe_gt_sriov_vf_ggtt_shift - Return shift in GGTT range due to VF migration
+ * @gt: the &xe_gt struct instance
+ * Return: The shift value; could be negative
+ */
+s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt)
+{
+ struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
+
+ return config->ggtt_shift;
+}
+
static int vf_get_lmem_info(struct xe_gt *gt)
{
struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
@@ -812,6 +825,89 @@ int xe_gt_sriov_vf_connect(struct xe_gt *gt)
return err;
}
+/**
+ * DOC: GGTT nodes shifting during VF post-migration recovery
+ *
+ * The first fixup applied to the VF KMD structures as part of post-migration
+ * recovery is shifting nodes within &xe_ggtt instance. The nodes are moved
+ * from range previously assigned to this VF, into newly provisioned area.
+ * The changes include balloons, which are resized accordingly.
+ *
+ * The balloon nodes are there to eliminate unavailable ranges from use: one
+ * reserves the GGTT area below the range for current VF, and another one
+ * reserves area above.
+ *
+ * Below is a GGTT layout of example VF, with a certain address range assigned to
+ * said VF, and inaccessible areas above and below:
+ *
+ * 0 4GiB
+ * |<--------------------------- Total GGTT size ----------------------------->|
+ * WOPCM GUC_TOP
+ * |<-------------- Area mappable by xe_ggtt instance ---------------->|
+ *
+ * +---+---------------------------------+----------+----------------------+---+
+ * |\\\|/////////////////////////////////| VF mem |//////////////////////|\\\|
+ * +---+---------------------------------+----------+----------------------+---+
+ *
+ * Hardware enforced access rules before migration:
+ *
+ * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
+ *
+ * GGTT nodes used for tracking allocations:
+ *
+ * |<----------- balloon ------------>|<- nodes->|<----- balloon ------>|
+ *
+ * After the migration, GGTT area assigned to the VF might have shifted, either
+ * to lower or to higher address. But we expect the total size and extra areas to
+ * be identical, as migration can only happen between matching platforms.
+ * Below is an example of GGTT layout of the VF after migration. Content of the
+ * GGTT for VF has been moved to a new area, and we receive its address from GuC:
+ *
+ * +---+----------------------+----------+---------------------------------+---+
+ * |\\\|//////////////////////| VF mem |/////////////////////////////////|\\\|
+ * +---+----------------------+----------+---------------------------------+---+
+ *
+ * Hardware enforced access rules after migration:
+ *
+ * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
+ *
+ * So the VF has a new slice of GGTT assigned, and during migration process, the
+ * memory content was copied to that new area. But the drm_mm nodes within xe kmd
+ * are still tracking allocations using the old addresses. The nodes within VF
+ * owned area have to be shifted, and balloon nodes need to be resized to
+ * properly mask out areas not owned by the VF.
+ *
+ * Fixed drm_mm nodes used for tracking allocations:
+ *
+ * |<------ balloon ------>|<- nodes->|<----------- balloon ----------->|
+ *
+ * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
+ * overlap; but our node shifting will fix addresses properly regardless.
+ */
+
+/**
+ * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
+ * @gt: the &xe_gt struct instance
+ * @ggtt_shift: the shift value
+ *
+ * Since Global GTT is not virtualized, each VF has an assigned range
+ * within the global space. This range might have changed during migration,
+ * which requires all memory addresses pointing to GGTT to be shifted.
+ */
+void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_ggtt *ggtt = tile->mem.ggtt;
+
+ xe_gt_assert(gt, !xe_gt_is_media_type(gt));
+
+ mutex_lock(&ggtt->lock);
+ xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
+ xe_ggtt_shift_nodes_locked(ggtt, ggtt_shift);
+ xe_gt_sriov_vf_balloon_ggtt_locked(gt);
+ mutex_unlock(&ggtt->lock);
+}
+
/**
* xe_gt_sriov_vf_migrated_event_handler - Start a VF migration recovery,
* or just mark that a GuC is ready for it.
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
index d717deb8af91..904a600063e6 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
@@ -20,6 +20,8 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
+s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt);
+void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift);
int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
index a57f13b5afcd..5ccbdf8d08b6 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
@@ -40,6 +40,8 @@ struct xe_gt_sriov_vf_selfconfig {
u64 ggtt_base;
/** @ggtt_size: assigned size of the GGTT region. */
u64 ggtt_size;
+ /** @ggtt_shift: difference in ggtt_base on last migration */
+ s64 ggtt_shift;
/** @lmem_size: assigned size of the LMEM. */
u64 lmem_size;
/** @num_ctxs: assigned number of GuC submission context IDs. */
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index c1275e64aa9c..e70f1ceabbb3 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -7,6 +7,7 @@
#include "xe_assert.h"
#include "xe_device.h"
+#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
#include "xe_pm.h"
@@ -170,6 +171,25 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
work_pending(&xe->sriov.vf.migration.worker);
}
+static bool vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
+{
+ bool need_fixups = false;
+ struct xe_tile *tile;
+ unsigned int id;
+
+ for_each_tile(tile, xe, id) {
+ struct xe_gt *gt = tile->primary_gt;
+ s64 shift;
+
+ shift = xe_gt_sriov_vf_ggtt_shift(gt);
+ if (shift) {
+ need_fixups = true;
+ xe_gt_sriov_vf_fixup_ggtt_nodes(gt, shift);
+ }
+ }
+ return need_fixups;
+}
+
/*
* Notify all GuCs about resource fixups apply finished.
*/
@@ -191,6 +211,7 @@ static void vf_post_migration_notify_resfix_done(struct xe_device *xe)
static void vf_post_migration_recovery(struct xe_device *xe)
{
+ bool need_fixups;
int err;
drm_dbg(&xe->drm, "migration recovery in progress\n");
@@ -201,6 +222,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
if (unlikely(err))
goto fail;
+ need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
/* FIXME: add the recovery steps */
vf_post_migration_notify_resfix_done(xe);
xe_pm_runtime_put(xe);
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration
2025-04-09 21:13 ` [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration Tomasz Lis
@ 2025-04-10 17:13 ` Michal Wajdeczko
2025-04-11 14:37 ` Lis, Tomasz
0 siblings, 1 reply; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-10 17:13 UTC (permalink / raw)
To: Tomasz Lis, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 09.04.2025 23:13, Tomasz Lis wrote:
> We have only one GGTT for all IOV functions, with each VF having assigned
> a range of addresses for its use. After migration, a VF can receive a
> different range of addresses than it had initially.
>
> This implements shifting GGTT addresses within drm_mm nodes, so that
> VMAs stay valid after migration. This will make the driver use new
> addresses when accessing GGTT from the moment the shifting ends.
>
> By taking the ggtt->lock for the period of VMA fixups, this change
> also adds constraint on that mutex. Any locks used during the recovery
> cannot ever wait for hardware response - because after migration,
> the hardware will not do anything until fixups are finished.
>
> v2: Moved some functs to xe_ggtt.c; moved shift computation to just
> after querying; improved documentation; switched some warns to asserts;
> skipping fixups when GGTT shift eq 0; iterating through tiles (Michal)
> v3: Updated kerneldocs, removed unused funct, properly allocate
> balloning nodes if non existent
> v4: Re-used ballooning functions from VF init, used bool in place of
> standard error codes
> v5: Renamed one function
> v6: Subject tag change, several kerneldocs updated, some functions
> renamed, some moved, added several asserts, shuffled declarations
> of variables, revealed more detail in high level functions
> v7: Fixed typos, added `_locked` suffix to some functs, improved
> readability of asserts, removed unneeded conditional
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
> drivers/gpu/drm/xe/xe_ggtt.c | 48 ++++++++++++
> drivers/gpu/drm/xe/xe_ggtt.h | 1 +
> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 96 +++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
> drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
> drivers/gpu/drm/xe/xe_sriov_vf.c | 22 ++++++
> 6 files changed, 171 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index e7d474bd0cfe..d19878f6bd6b 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -487,6 +487,54 @@ void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
> drm_mm_remove_node(&node->base);
> }
>
> +void xe_ggtt_assert_fit(struct xe_ggtt *ggtt, u64 start, u64 size)
you can make it static for now
(and you will saved from writing kernel-doc for this)
> +{
> + struct xe_tile *tile __maybe_unused = ggtt->tile;
> + struct xe_device *xe = tile_to_xe(tile);
> + u64 wopcm = xe_wopcm_size(xe);
it's likely "wopcm" that requires __maybe_unused annotation
> +
> + xe_tile_assert(tile, start >= wopcm);
> + xe_tile_assert(tile, start + size < ggtt->size - wopcm);
> +}
> +
> +/**
> + * xe_ggtt_shift_nodes_locked - Shift GGTT nodes to adjust for a change in usable address range.
> + * @ggtt: the &xe_ggtt struct instance
> + * @shift: change to the location of area provisioned for current VF
> + *
> + * This function moves all nodes from the GGTT VM, to a temp list. These nodes are expected
> + * to represent allocations in range formerly assigned to current VF, before the range changed.
> + * When the GGTT VM is completely clear of any nodes, they are re-added with shifted offsets.
> + *
> + * The function has no ability of failing - because it shifts existing nodes, without
> + * any additional processing. If the nodes were successfully existing at the old address,
> + * they will do the same at the new one. A fail inside this function would indicate that
> + * the list of nodes was either already damaged, or that the shift brings the address range
> + * outside of valid bounds. Both cases justify an assert rather than error code.
> + */
> +void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift)
> +{
> + struct xe_tile *tile __maybe_unused = ggtt->tile;
> + struct drm_mm_node *node, *tmpn;
> + LIST_HEAD(temp_list_head);
> + int err;
> +
> + lockdep_assert_held(&ggtt->lock);
> +
> + drm_mm_for_each_node_safe(node, tmpn, &ggtt->mm) {
> + drm_mm_remove_node(node);
> + list_add(&node->node_list, &temp_list_head);
> + }
> +
> + list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
> + xe_ggtt_assert_fit(ggtt, node->start + shift, node->size);
> + list_del(&node->node_list);
> + node->start += shift;
> + err = drm_mm_reserve_node(&ggtt->mm, node);
> + xe_tile_assert(tile, !err);
> + }
> +}
> +
> /**
> * xe_ggtt_node_insert_locked - Locked version to insert a &xe_ggtt_node into the GGTT
> * @node: the &xe_ggtt_node to be inserted
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
> index d468af96b465..4337a279ff3b 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.h
> +++ b/drivers/gpu/drm/xe/xe_ggtt.h
> @@ -18,6 +18,7 @@ void xe_ggtt_node_fini(struct xe_ggtt_node *node);
> int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
> u64 start, u64 size);
> void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
> +void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift);
>
> int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
> int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> index d2f6bfb3aacf..06f93bce2fa7 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> @@ -415,12 +415,25 @@ static int vf_get_ggtt_info(struct xe_gt *gt)
> xe_gt_sriov_dbg_verbose(gt, "GGTT %#llx-%#llx = %lluK\n",
> start, start + size - 1, size / SZ_1K);
>
> + config->ggtt_shift = start - (s64)config->ggtt_base;
> config->ggtt_base = start;
> config->ggtt_size = size;
>
> return config->ggtt_size ? 0 : -ENODATA;
> }
>
> +/**
> + * xe_gt_sriov_vf_ggtt_shift - Return shift in GGTT range due to VF migration
> + * @gt: the &xe_gt struct instance
> + * Return: The shift value; could be negative
> + */
> +s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt)
this should be s64, right?
> +{
> + struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
> +
again, you're accessing vf specific fields, add proper asserts
> + return config->ggtt_shift;
> +}
> +
vf_get_ggtt_info
vf_get_lmem_info
vf_get_submission_cfg
..
are all helpers for the xe_gt_sriov_vf_query_config()
why are you placing xe_gt_sriov_vf_ggtt_shift() between them?
right after xe_gt_sriov_vf_query_config() there are some other public
functions of similar purpose like xe_gt_sriov_vf_ggtt_shift()
put it there
really please be more careful where you place your changes - it's not
the first time that your code is added to a random place, breaking
existing groups of related code
> static int vf_get_lmem_info(struct xe_gt *gt)
> {
> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
> @@ -812,6 +825,89 @@ int xe_gt_sriov_vf_connect(struct xe_gt *gt)
> return err;
> }
>
> +/**
> + * DOC: GGTT nodes shifting during VF post-migration recovery
> + *
> + * The first fixup applied to the VF KMD structures as part of post-migration
> + * recovery is shifting nodes within &xe_ggtt instance. The nodes are moved
> + * from range previously assigned to this VF, into newly provisioned area.
> + * The changes include balloons, which are resized accordingly.
> + *
> + * The balloon nodes are there to eliminate unavailable ranges from use: one
> + * reserves the GGTT area below the range for current VF, and another one
> + * reserves area above.
> + *
> + * Below is a GGTT layout of example VF, with a certain address range assigned to
> + * said VF, and inaccessible areas above and below:
> + *
> + * 0 4GiB
> + * |<--------------------------- Total GGTT size ----------------------------->|
> + * WOPCM GUC_TOP
> + * |<-------------- Area mappable by xe_ggtt instance ---------------->|
> + *
> + * +---+---------------------------------+----------+----------------------+---+
> + * |\\\|/////////////////////////////////| VF mem |//////////////////////|\\\|
> + * +---+---------------------------------+----------+----------------------+---+
> + *
> + * Hardware enforced access rules before migration:
> + *
> + * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
> + *
> + * GGTT nodes used for tracking allocations:
> + *
> + * |<----------- balloon ------------>|<- nodes->|<----- balloon ------>|
> + *
> + * After the migration, GGTT area assigned to the VF might have shifted, either
> + * to lower or to higher address. But we expect the total size and extra areas to
> + * be identical, as migration can only happen between matching platforms.
> + * Below is an example of GGTT layout of the VF after migration. Content of the
> + * GGTT for VF has been moved to a new area, and we receive its address from GuC:
> + *
> + * +---+----------------------+----------+---------------------------------+---+
> + * |\\\|//////////////////////| VF mem |/////////////////////////////////|\\\|
> + * +---+----------------------+----------+---------------------------------+---+
> + *
> + * Hardware enforced access rules after migration:
> + *
> + * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
> + *
> + * So the VF has a new slice of GGTT assigned, and during migration process, the
> + * memory content was copied to that new area. But the drm_mm nodes within xe kmd
"drm_mm nodes" is an implementation detail of the xe_ggtt
s/xe kmd/Xe driver
> + * are still tracking allocations using the old addresses. The nodes within VF
> + * owned area have to be shifted, and balloon nodes need to be resized to
> + * properly mask out areas not owned by the VF.
> + *
> + * Fixed drm_mm nodes used for tracking allocations:
> + *
> + * |<------ balloon ------>|<- nodes->|<----------- balloon ----------->|
> + *
> + * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
> + * overlap; but our node shifting will fix addresses properly regardless.
> + */
> +
> +/**
> + * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
> + * @gt: the &xe_gt struct instance
> + * @ggtt_shift: the shift value
> + *
> + * Since Global GTT is not virtualized, each VF has an assigned range
> + * within the global space. This range might have changed during migration,
> + * which requires all memory addresses pointing to GGTT to be shifted.
> + */
> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> + struct xe_ggtt *ggtt = tile->mem.ggtt;
> +
> + xe_gt_assert(gt, !xe_gt_is_media_type(gt));
> +
> + mutex_lock(&ggtt->lock);
> + xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
> + xe_ggtt_shift_nodes_locked(ggtt, ggtt_shift);
> + xe_gt_sriov_vf_balloon_ggtt_locked(gt);
> + mutex_unlock(&ggtt->lock);
> +}
> +
> /**
> * xe_gt_sriov_vf_migrated_event_handler - Start a VF migration recovery,
> * or just mark that a GuC is ready for it.
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> index d717deb8af91..904a600063e6 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> @@ -20,6 +20,8 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
> int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
> void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
> +s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt);
> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift);
> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> index a57f13b5afcd..5ccbdf8d08b6 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> @@ -40,6 +40,8 @@ struct xe_gt_sriov_vf_selfconfig {
> u64 ggtt_base;
> /** @ggtt_size: assigned size of the GGTT region. */
> u64 ggtt_size;
> + /** @ggtt_shift: difference in ggtt_base on last migration */
> + s64 ggtt_shift;
> /** @lmem_size: assigned size of the LMEM. */
> u64 lmem_size;
> /** @num_ctxs: assigned number of GuC submission context IDs. */
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
> index c1275e64aa9c..e70f1ceabbb3 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
> @@ -7,6 +7,7 @@
>
> #include "xe_assert.h"
> #include "xe_device.h"
> +#include "xe_gt.h"
> #include "xe_gt_sriov_printk.h"
> #include "xe_gt_sriov_vf.h"
> #include "xe_pm.h"
> @@ -170,6 +171,25 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
> work_pending(&xe->sriov.vf.migration.worker);
> }
>
> +static bool vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
> +{
> + bool need_fixups = false;
> + struct xe_tile *tile;
> + unsigned int id;
> +
> + for_each_tile(tile, xe, id) {
> + struct xe_gt *gt = tile->primary_gt;
> + s64 shift;
> +
> + shift = xe_gt_sriov_vf_ggtt_shift(gt);
> + if (shift) {
> + need_fixups = true;
> + xe_gt_sriov_vf_fixup_ggtt_nodes(gt, shift);
> + }
> + }
> + return need_fixups;
> +}
> +
> /*
> * Notify all GuCs about resource fixups apply finished.
> */
> @@ -191,6 +211,7 @@ static void vf_post_migration_notify_resfix_done(struct xe_device *xe)
>
> static void vf_post_migration_recovery(struct xe_device *xe)
> {
> + bool need_fixups;
> int err;
>
> drm_dbg(&xe->drm, "migration recovery in progress\n");
> @@ -201,6 +222,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
> if (unlikely(err))
> goto fail;
>
> + need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
> /* FIXME: add the recovery steps */
> vf_post_migration_notify_resfix_done(xe);
> xe_pm_runtime_put(xe);
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration
2025-04-10 17:13 ` Michal Wajdeczko
@ 2025-04-11 14:37 ` Lis, Tomasz
0 siblings, 0 replies; 22+ messages in thread
From: Lis, Tomasz @ 2025-04-11 14:37 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 10.04.2025 19:13, Michal Wajdeczko wrote:
> On 09.04.2025 23:13, Tomasz Lis wrote:
>> We have only one GGTT for all IOV functions, with each VF having assigned
>> a range of addresses for its use. After migration, a VF can receive a
>> different range of addresses than it had initially.
>>
>> This implements shifting GGTT addresses within drm_mm nodes, so that
>> VMAs stay valid after migration. This will make the driver use new
>> addresses when accessing GGTT from the moment the shifting ends.
>>
>> By taking the ggtt->lock for the period of VMA fixups, this change
>> also adds constraint on that mutex. Any locks used during the recovery
>> cannot ever wait for hardware response - because after migration,
>> the hardware will not do anything until fixups are finished.
>>
>> v2: Moved some functs to xe_ggtt.c; moved shift computation to just
>> after querying; improved documentation; switched some warns to asserts;
>> skipping fixups when GGTT shift eq 0; iterating through tiles (Michal)
>> v3: Updated kerneldocs, removed unused funct, properly allocate
>> balloning nodes if non existent
>> v4: Re-used ballooning functions from VF init, used bool in place of
>> standard error codes
>> v5: Renamed one function
>> v6: Subject tag change, several kerneldocs updated, some functions
>> renamed, some moved, added several asserts, shuffled declarations
>> of variables, revealed more detail in high level functions
>> v7: Fixed typos, added `_locked` suffix to some functs, improved
>> readability of asserts, removed unneeded conditional
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis@intel.com>
>> Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_ggtt.c | 48 ++++++++++++
>> drivers/gpu/drm/xe/xe_ggtt.h | 1 +
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 96 +++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 +
>> drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
>> drivers/gpu/drm/xe/xe_sriov_vf.c | 22 ++++++
>> 6 files changed, 171 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>> index e7d474bd0cfe..d19878f6bd6b 100644
>> --- a/drivers/gpu/drm/xe/xe_ggtt.c
>> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
>> @@ -487,6 +487,54 @@ void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
>> drm_mm_remove_node(&node->base);
>> }
>>
>> +void xe_ggtt_assert_fit(struct xe_ggtt *ggtt, u64 start, u64 size)
> you can make it static for now
> (and you will saved from writing kernel-doc for this)
yeah, I have to - this is what caused build fail (non-static without
previous declaration).
>> +{
>> + struct xe_tile *tile __maybe_unused = ggtt->tile;
>> + struct xe_device *xe = tile_to_xe(tile);
>> + u64 wopcm = xe_wopcm_size(xe);
> it's likely "wopcm" that requires __maybe_unused annotation
you're right, wopcm definitely needs it.
not sure how that may be affected by optimizations, but current
compilers can probably tell dependencies of optimized out locals, so
that shouldn't be a problem.
>> +
>> + xe_tile_assert(tile, start >= wopcm);
>> + xe_tile_assert(tile, start + size < ggtt->size - wopcm);
>> +}
>> +
>> +/**
>> + * xe_ggtt_shift_nodes_locked - Shift GGTT nodes to adjust for a change in usable address range.
>> + * @ggtt: the &xe_ggtt struct instance
>> + * @shift: change to the location of area provisioned for current VF
>> + *
>> + * This function moves all nodes from the GGTT VM, to a temp list. These nodes are expected
>> + * to represent allocations in range formerly assigned to current VF, before the range changed.
>> + * When the GGTT VM is completely clear of any nodes, they are re-added with shifted offsets.
>> + *
>> + * The function has no ability of failing - because it shifts existing nodes, without
>> + * any additional processing. If the nodes were successfully existing at the old address,
>> + * they will do the same at the new one. A fail inside this function would indicate that
>> + * the list of nodes was either already damaged, or that the shift brings the address range
>> + * outside of valid bounds. Both cases justify an assert rather than error code.
>> + */
>> +void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift)
>> +{
>> + struct xe_tile *tile __maybe_unused = ggtt->tile;
>> + struct drm_mm_node *node, *tmpn;
>> + LIST_HEAD(temp_list_head);
>> + int err;
>> +
>> + lockdep_assert_held(&ggtt->lock);
>> +
>> + drm_mm_for_each_node_safe(node, tmpn, &ggtt->mm) {
>> + drm_mm_remove_node(node);
>> + list_add(&node->node_list, &temp_list_head);
>> + }
>> +
>> + list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
>> + xe_ggtt_assert_fit(ggtt, node->start + shift, node->size);
>> + list_del(&node->node_list);
>> + node->start += shift;
>> + err = drm_mm_reserve_node(&ggtt->mm, node);
>> + xe_tile_assert(tile, !err);
>> + }
>> +}
>> +
>> /**
>> * xe_ggtt_node_insert_locked - Locked version to insert a &xe_ggtt_node into the GGTT
>> * @node: the &xe_ggtt_node to be inserted
>> diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h
>> index d468af96b465..4337a279ff3b 100644
>> --- a/drivers/gpu/drm/xe/xe_ggtt.h
>> +++ b/drivers/gpu/drm/xe/xe_ggtt.h
>> @@ -18,6 +18,7 @@ void xe_ggtt_node_fini(struct xe_ggtt_node *node);
>> int xe_ggtt_node_insert_balloon_locked(struct xe_ggtt_node *node,
>> u64 start, u64 size);
>> void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node);
>> +void xe_ggtt_shift_nodes_locked(struct xe_ggtt *ggtt, s64 shift);
>>
>> int xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align);
>> int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node,
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> index d2f6bfb3aacf..06f93bce2fa7 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> @@ -415,12 +415,25 @@ static int vf_get_ggtt_info(struct xe_gt *gt)
>> xe_gt_sriov_dbg_verbose(gt, "GGTT %#llx-%#llx = %lluK\n",
>> start, start + size - 1, size / SZ_1K);
>>
>> + config->ggtt_shift = start - (s64)config->ggtt_base;
>> config->ggtt_base = start;
>> config->ggtt_size = size;
>>
>> return config->ggtt_size ? 0 : -ENODATA;
>> }
>>
>> +/**
>> + * xe_gt_sriov_vf_ggtt_shift - Return shift in GGTT range due to VF migration
>> + * @gt: the &xe_gt struct instance
>> + * Return: The shift value; could be negative
>> + */
>> +s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt)
> this should be s64, right?
true. we have 64-bit value stored in config, so it makes no sense to
limit it here.
>> +{
>> + struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
>> +
> again, you're accessing vf specific fields, add proper asserts
ok
>> + return config->ggtt_shift;
>> +}
>> +
> vf_get_ggtt_info
> vf_get_lmem_info
> vf_get_submission_cfg
> ..
> are all helpers for the xe_gt_sriov_vf_query_config()
>
> why are you placing xe_gt_sriov_vf_ggtt_shift() between them?
I placed the getter you requested just after the function which sets the
value. Matching getters and setters is a well established trope.
> right after xe_gt_sriov_vf_query_config() there are some other public
> functions of similar purpose like xe_gt_sriov_vf_ggtt_shift()
> put it there
>
> really please be more careful where you place your changes - it's not
> the first time that your code is added to a random place, breaking
> existing groups of related code
will move as requested.
>> static int vf_get_lmem_info(struct xe_gt *gt)
>> {
>> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
>> @@ -812,6 +825,89 @@ int xe_gt_sriov_vf_connect(struct xe_gt *gt)
>> return err;
>> }
>>
>> +/**
>> + * DOC: GGTT nodes shifting during VF post-migration recovery
>> + *
>> + * The first fixup applied to the VF KMD structures as part of post-migration
>> + * recovery is shifting nodes within &xe_ggtt instance. The nodes are moved
>> + * from range previously assigned to this VF, into newly provisioned area.
>> + * The changes include balloons, which are resized accordingly.
>> + *
>> + * The balloon nodes are there to eliminate unavailable ranges from use: one
>> + * reserves the GGTT area below the range for current VF, and another one
>> + * reserves area above.
>> + *
>> + * Below is a GGTT layout of example VF, with a certain address range assigned to
>> + * said VF, and inaccessible areas above and below:
>> + *
>> + * 0 4GiB
>> + * |<--------------------------- Total GGTT size ----------------------------->|
>> + * WOPCM GUC_TOP
>> + * |<-------------- Area mappable by xe_ggtt instance ---------------->|
>> + *
>> + * +---+---------------------------------+----------+----------------------+---+
>> + * |\\\|/////////////////////////////////| VF mem |//////////////////////|\\\|
>> + * +---+---------------------------------+----------+----------------------+---+
>> + *
>> + * Hardware enforced access rules before migration:
>> + *
>> + * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
>> + *
>> + * GGTT nodes used for tracking allocations:
>> + *
>> + * |<----------- balloon ------------>|<- nodes->|<----- balloon ------>|
>> + *
>> + * After the migration, GGTT area assigned to the VF might have shifted, either
>> + * to lower or to higher address. But we expect the total size and extra areas to
>> + * be identical, as migration can only happen between matching platforms.
>> + * Below is an example of GGTT layout of the VF after migration. Content of the
>> + * GGTT for VF has been moved to a new area, and we receive its address from GuC:
>> + *
>> + * +---+----------------------+----------+---------------------------------+---+
>> + * |\\\|//////////////////////| VF mem |/////////////////////////////////|\\\|
>> + * +---+----------------------+----------+---------------------------------+---+
>> + *
>> + * Hardware enforced access rules after migration:
>> + *
>> + * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
>> + *
>> + * So the VF has a new slice of GGTT assigned, and during migration process, the
>> + * memory content was copied to that new area. But the drm_mm nodes within xe kmd
> "drm_mm nodes" is an implementation detail of the xe_ggtt
I assume your request is to remove that term, not to add a remark about
it being the implementation detail.
We've discussed that before, I don't think I have to repeat my POV.
Will change though, it doesn't matter to me that much since the doc
chapter was moved to this area.
> s/xe kmd/Xe driver
we use both terms in various comments within the driver. Let's be
sensitive to purpose of requests during the review.
Will just remove.
-Tomasz
>> + * are still tracking allocations using the old addresses. The nodes within VF
>> + * owned area have to be shifted, and balloon nodes need to be resized to
>> + * properly mask out areas not owned by the VF.
>> + *
>> + * Fixed drm_mm nodes used for tracking allocations:
>> + *
>> + * |<------ balloon ------>|<- nodes->|<----------- balloon ----------->|
>> + *
>> + * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
>> + * overlap; but our node shifting will fix addresses properly regardless.
>> + */
>> +
>> +/**
>> + * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
>> + * @gt: the &xe_gt struct instance
>> + * @ggtt_shift: the shift value
>> + *
>> + * Since Global GTT is not virtualized, each VF has an assigned range
>> + * within the global space. This range might have changed during migration,
>> + * which requires all memory addresses pointing to GGTT to be shifted.
>> + */
>> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift)
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>> + struct xe_ggtt *ggtt = tile->mem.ggtt;
>> +
>> + xe_gt_assert(gt, !xe_gt_is_media_type(gt));
>> +
>> + mutex_lock(&ggtt->lock);
>> + xe_gt_sriov_vf_deballoon_ggtt_locked(gt);
>> + xe_ggtt_shift_nodes_locked(ggtt, ggtt_shift);
>> + xe_gt_sriov_vf_balloon_ggtt_locked(gt);
>> + mutex_unlock(&ggtt->lock);
>> +}
>> +
>> /**
>> * xe_gt_sriov_vf_migrated_event_handler - Start a VF migration recovery,
>> * or just mark that a GuC is ready for it.
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> index d717deb8af91..904a600063e6 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> @@ -20,6 +20,8 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
>> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
>> int xe_gt_sriov_vf_balloon_ggtt_locked(struct xe_gt *gt);
>> void xe_gt_sriov_vf_deballoon_ggtt_locked(struct xe_gt *gt);
>> +s32 xe_gt_sriov_vf_ggtt_shift(struct xe_gt *gt);
>> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt, s64 ggtt_shift);
>> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
>> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> index a57f13b5afcd..5ccbdf8d08b6 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> @@ -40,6 +40,8 @@ struct xe_gt_sriov_vf_selfconfig {
>> u64 ggtt_base;
>> /** @ggtt_size: assigned size of the GGTT region. */
>> u64 ggtt_size;
>> + /** @ggtt_shift: difference in ggtt_base on last migration */
>> + s64 ggtt_shift;
>> /** @lmem_size: assigned size of the LMEM. */
>> u64 lmem_size;
>> /** @num_ctxs: assigned number of GuC submission context IDs. */
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> index c1275e64aa9c..e70f1ceabbb3 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> @@ -7,6 +7,7 @@
>>
>> #include "xe_assert.h"
>> #include "xe_device.h"
>> +#include "xe_gt.h"
>> #include "xe_gt_sriov_printk.h"
>> #include "xe_gt_sriov_vf.h"
>> #include "xe_pm.h"
>> @@ -170,6 +171,25 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
>> work_pending(&xe->sriov.vf.migration.worker);
>> }
>>
>> +static bool vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
>> +{
>> + bool need_fixups = false;
>> + struct xe_tile *tile;
>> + unsigned int id;
>> +
>> + for_each_tile(tile, xe, id) {
>> + struct xe_gt *gt = tile->primary_gt;
>> + s64 shift;
>> +
>> + shift = xe_gt_sriov_vf_ggtt_shift(gt);
>> + if (shift) {
>> + need_fixups = true;
>> + xe_gt_sriov_vf_fixup_ggtt_nodes(gt, shift);
>> + }
>> + }
>> + return need_fixups;
>> +}
>> +
>> /*
>> * Notify all GuCs about resource fixups apply finished.
>> */
>> @@ -191,6 +211,7 @@ static void vf_post_migration_notify_resfix_done(struct xe_device *xe)
>>
>> static void vf_post_migration_recovery(struct xe_device *xe)
>> {
>> + bool need_fixups;
>> int err;
>>
>> drm_dbg(&xe->drm, "migration recovery in progress\n");
>> @@ -201,6 +222,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>> if (unlikely(err))
>> goto fail;
>>
>> + need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
>> /* FIXME: add the recovery steps */
>> vf_post_migration_notify_resfix_done(xe);
>> xe_pm_runtime_put(xe);
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v8 3/4] drm/xe/guc: Introduce enum with offsets for context register H2Gs
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
2025-04-09 21:13 ` [PATCH v8 1/4] drm/xe/vf: Divide GGTT ballooning into allocation and insertion Tomasz Lis
2025-04-09 21:13 ` [PATCH v8 2/4] drm/xe/vf: Shifting GGTT area post migration Tomasz Lis
@ 2025-04-09 21:13 ` Tomasz Lis
2025-04-10 17:16 ` Michal Wajdeczko
2025-04-09 21:13 ` [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
` (8 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Tomasz Lis @ 2025-04-09 21:13 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski, Matthew Brost, Lucas De Marchi
Some GuC messages are constructed with incrementing dword counter
rather than referencing specific DWORDs, as described in GuC interface
specification.
This change introduces the definitions of DWORD numbers for parameters
which will need to be referenced in a CTB parser to be added in a
following patch. To ensure correctness of these DWORDs, verification
in form of asserts was added to the message construction code.
v2: Renamed enum members, added ones for single context registration,
modified asserts to check values rather than indexes.
v3: Reordered assert args to take less lines
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Suggested-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
drivers/gpu/drm/xe/abi/guc_actions_abi.h | 29 ++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_submit.c | 17 ++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/drivers/gpu/drm/xe/abi/guc_actions_abi.h b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
index 448afb86e05c..64c71526356e 100644
--- a/drivers/gpu/drm/xe/abi/guc_actions_abi.h
+++ b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
@@ -161,6 +161,35 @@ enum xe_guc_preempt_options {
XE_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q = 0x8,
};
+enum xe_guc_register_context_param_offsets {
+ XE_GUC_REGISTER_CONTEXT_DATA_0_MBZ = 0,
+ XE_GUC_REGISTER_CONTEXT_DATA_1_FLAGS,
+ XE_GUC_REGISTER_CONTEXT_DATA_2_CONTEXT_INDEX,
+ XE_GUC_REGISTER_CONTEXT_DATA_3_ENGINE_CLASS,
+ XE_GUC_REGISTER_CONTEXT_DATA_4_ENGINE_SUBMIT_MASK,
+ XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER,
+ XE_GUC_REGISTER_CONTEXT_DATA_6_WQ_DESC_ADDR_UPPER,
+ XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER,
+ XE_GUC_REGISTER_CONTEXT_DATA_8_WQ_BUF_BASE_UPPER,
+ XE_GUC_REGISTER_CONTEXT_DATA_9_WQ_BUF_SIZE,
+ XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR,
+};
+
+enum xe_guc_register_context_multi_lrc_param_offsets {
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_0_MBZ = 0,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_1_FLAGS,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_2_PARENT_CONTEXT,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_3_ENGINE_CLASS,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_4_ENGINE_SUBMIT_MASK,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_6_WQ_DESC_ADDR_UPPER,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_8_WQ_BUF_BASE_UPPER,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_9_WQ_BUF_SIZE,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR,
+};
+
enum xe_guc_report_status {
XE_GUC_REPORT_STATUS_UNKNOWN = 0x0,
XE_GUC_REPORT_STATUS_ACKED = 0x1,
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 813c3c0bb250..cfc65f21b2f7 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -487,6 +487,15 @@ static void __register_mlrc_exec_queue(struct xe_guc *guc,
action[len++] = upper_32_bits(xe_lrc_descriptor(lrc));
}
+ /* explicitly checks some fields that we might fixup later */
+ xe_gt_assert(guc_to_gt(guc), info->wq_desc_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER]);
+ xe_gt_assert(guc_to_gt(guc), info->wq_base_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER]);
+ xe_gt_assert(guc_to_gt(guc), q->width ==
+ action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS]);
+ xe_gt_assert(guc_to_gt(guc), info->hwlrca_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR]);
xe_gt_assert(guc_to_gt(guc), len <= MAX_MLRC_REG_SIZE);
#undef MAX_MLRC_REG_SIZE
@@ -511,6 +520,14 @@ static void __register_exec_queue(struct xe_guc *guc,
info->hwlrca_hi,
};
+ /* explicitly checks some fields that we might fixup later */
+ xe_gt_assert(guc_to_gt(guc), info->wq_desc_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER]);
+ xe_gt_assert(guc_to_gt(guc), info->wq_base_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER]);
+ xe_gt_assert(guc_to_gt(guc), info->hwlrca_lo ==
+ action[XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR]);
+
xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v8 3/4] drm/xe/guc: Introduce enum with offsets for context register H2Gs
2025-04-09 21:13 ` [PATCH v8 3/4] drm/xe/guc: Introduce enum with offsets for context register H2Gs Tomasz Lis
@ 2025-04-10 17:16 ` Michal Wajdeczko
0 siblings, 0 replies; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-10 17:16 UTC (permalink / raw)
To: Tomasz Lis, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 09.04.2025 23:13, Tomasz Lis wrote:
> Some GuC messages are constructed with incrementing dword counter
> rather than referencing specific DWORDs, as described in GuC interface
> specification.
>
> This change introduces the definitions of DWORD numbers for parameters
> which will need to be referenced in a CTB parser to be added in a
> following patch. To ensure correctness of these DWORDs, verification
> in form of asserts was added to the message construction code.
>
> v2: Renamed enum members, added ones for single context registration,
> modified asserts to check values rather than indexes.
> v3: Reordered assert args to take less lines
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> Suggested-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_actions_abi.h | 29 ++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_guc_submit.c | 17 ++++++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_actions_abi.h b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> index 448afb86e05c..64c71526356e 100644
> --- a/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> @@ -161,6 +161,35 @@ enum xe_guc_preempt_options {
> XE_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q = 0x8,
> };
>
> +enum xe_guc_register_context_param_offsets {
> + XE_GUC_REGISTER_CONTEXT_DATA_0_MBZ = 0,
> + XE_GUC_REGISTER_CONTEXT_DATA_1_FLAGS,
> + XE_GUC_REGISTER_CONTEXT_DATA_2_CONTEXT_INDEX,
> + XE_GUC_REGISTER_CONTEXT_DATA_3_ENGINE_CLASS,
> + XE_GUC_REGISTER_CONTEXT_DATA_4_ENGINE_SUBMIT_MASK,
> + XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER,
> + XE_GUC_REGISTER_CONTEXT_DATA_6_WQ_DESC_ADDR_UPPER,
> + XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER,
> + XE_GUC_REGISTER_CONTEXT_DATA_8_WQ_BUF_BASE_UPPER,
> + XE_GUC_REGISTER_CONTEXT_DATA_9_WQ_BUF_SIZE,
> + XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR,
> +};
> +
> +enum xe_guc_register_context_multi_lrc_param_offsets {
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_0_MBZ = 0,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_1_FLAGS,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_2_PARENT_CONTEXT,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_3_ENGINE_CLASS,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_4_ENGINE_SUBMIT_MASK,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_6_WQ_DESC_ADDR_UPPER,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_8_WQ_BUF_BASE_UPPER,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_9_WQ_BUF_SIZE,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR,
> +};
> +
> enum xe_guc_report_status {
> XE_GUC_REPORT_STATUS_UNKNOWN = 0x0,
> XE_GUC_REPORT_STATUS_ACKED = 0x1,
> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
> index 813c3c0bb250..cfc65f21b2f7 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
> @@ -487,6 +487,15 @@ static void __register_mlrc_exec_queue(struct xe_guc *guc,
> action[len++] = upper_32_bits(xe_lrc_descriptor(lrc));
> }
>
> + /* explicitly checks some fields that we might fixup later */
> + xe_gt_assert(guc_to_gt(guc), info->wq_desc_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER]);
> + xe_gt_assert(guc_to_gt(guc), info->wq_base_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER]);
> + xe_gt_assert(guc_to_gt(guc), q->width ==
> + action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS]);
> + xe_gt_assert(guc_to_gt(guc), info->hwlrca_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR]);
> xe_gt_assert(guc_to_gt(guc), len <= MAX_MLRC_REG_SIZE);
> #undef MAX_MLRC_REG_SIZE
>
> @@ -511,6 +520,14 @@ static void __register_exec_queue(struct xe_guc *guc,
> info->hwlrca_hi,
> };
>
> + /* explicitly checks some fields that we might fixup later */
> + xe_gt_assert(guc_to_gt(guc), info->wq_desc_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER]);
> + xe_gt_assert(guc_to_gt(guc), info->wq_base_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER]);
> + xe_gt_assert(guc_to_gt(guc), info->hwlrca_lo ==
> + action[XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR]);
> +
> xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
> }
>
LGTM,
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (2 preceding siblings ...)
2025-04-09 21:13 ` [PATCH v8 3/4] drm/xe/guc: Introduce enum with offsets for context register H2Gs Tomasz Lis
@ 2025-04-09 21:13 ` Tomasz Lis
2025-04-10 17:58 ` Michal Wajdeczko
2025-04-09 21:18 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7) Patchwork
` (7 subsequent siblings)
11 siblings, 1 reply; 22+ messages in thread
From: Tomasz Lis @ 2025-04-09 21:13 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski, Matthew Brost, Lucas De Marchi
During post-migration recovery of a VF, it is necessary to update
GGTT references included in messages which are going to be sent
to GuC. GuC will start consuming messages after VF KMD will inform
it about fixups being done; before that, the VF KMD is expected
to update any H2G messages which are already in send buffer but
were not consumed by GuC.
Only a small subset of messages allowed for VFs have GGTT references
in them. This patch adds the functionality to parse the CTB send
ring buffer and shift addresses contained within.
While fixing the CTB content, ct->lock is not taken. This means
the only barrier taken remains GGTT address lock - which is ok,
because only requests with GGTT addresses matter, but it also means
tail changes can happen during the CTB fixups execution (which may
be ignored as any new messages will not have anything to fix).
The GGTT address locking will be introduced in a future series.
v2: removed storing shift as that's now done in VMA nodes patch;
macros to inlines; warns to asserts; log messages fixes (Michal)
v3: removed inline keywords, enums for offsets in CTB messages,
less error messages, if return unused then made functs void (Michal)
v4: update the cached head before starting fixups
v5: removed/updated comments, wrapped lines, converted assert into
error, enums for offsets to separate patch, reused xe_map_rd
v6: define xe_map_*_array() macros, support CTB wrap which divides
a message, updated comments, moved one function to an earlier patch
v7: renamed few functions, wider use on previously introduced helper,
separate cases in parsing messges, documented a static funct
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
drivers/gpu/drm/xe/xe_guc_ct.c | 161 +++++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
drivers/gpu/drm/xe/xe_map.h | 12 +++
drivers/gpu/drm/xe/xe_sriov_vf.c | 18 ++++
4 files changed, 193 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index 0a4fef7d7225..66a1a14f45a5 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -84,6 +84,8 @@ struct g2h_fence {
bool done;
};
+#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
+
static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
{
g2h_fence->response_buffer = response_buffer;
@@ -1623,6 +1625,165 @@ static void g2h_worker_func(struct work_struct *w)
receive_g2h(ct);
}
+static void xe_ring_map_fixup_u64(struct xe_device *xe, struct iosys_map *cmds,
+ u32 size, u32 head, u32 pos, s64 shift)
+{
+ u32 hi, lo;
+ u64 offset;
+
+ lo = xe_map_rd_array_u32(xe, cmds, (head + pos) % size);
+ hi = xe_map_rd_array_u32(xe, cmds, (head + pos + 1) % size);
+ offset = make_u64(hi, lo);
+ offset += shift;
+ lo = lower_32_bits(offset);
+ hi = upper_32_bits(offset);
+ xe_map_wr_array_u32(xe, cmds, (head + pos) % size, lo);
+ xe_map_wr_array_u32(xe, cmds, (head + pos + 1) % size, hi);
+}
+
+/*
+ * Shift any GGTT addresses within a single message left within CTB from
+ * before post-migration recovery.
+ * @ct: pointer to CT struct of the target GuC
+ * @cmds: iomap buffer containing CT messages
+ * @head: start of the target message within the buffer
+ * @len: length of the target message
+ * @size: size of the commands buffer
+ * @shift: the address shift to be added to each GGTT reference
+ */
+static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
+ u32 len, u32 size, s64 shift)
+{
+ struct xe_device *xe = ct_to_xe(ct);
+ u32 action, i, n;
+ u32 msg[GUC_HXG_MSG_MIN_LEN];
+
+ msg[0] = xe_map_rd_array_u32(xe, cmds, head);
+ action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
+ switch (action) {
+ case XE_GUC_ACTION_REGISTER_CONTEXT:
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER,
+ shift);
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER,
+ shift);
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR, shift);
+ break;
+ case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
+ shift);
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER,
+ shift);
+ n = xe_map_rd_array_u32(xe, cmds, head +
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS);
+ for (i = 0; i < n; i++)
+ xe_ring_map_fixup_u64(xe, cmds, size, head,
+ XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR
+ + 2 * i, shift);
+ break;
+ default:
+ break;
+ }
+}
+
+/** Apply fixups to a single outgoing CT message within given CTB
+ * @ct: the &xe_guc_ct struct instance representing the target GuC
+ * @h2g: the &guc_ctb struct instance of the target buffer
+ * @shift: shift to be added to all GGTT addresses within the CTB
+ * @mhead: pointer to an integer storing message start position; the
+ * position is changed to next message before this function return
+ * @avail: size of the area available for parsing, that is length
+ * of all remaining messages stored within the CTB
+ * Return: size of the area available for parsing after one message
+ * has been parsed, that is length remaining from the updated mhead
+ */
+static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb *h2g,
+ s64 shift, u32 *mhead, s32 avail)
+{
+ struct xe_device *xe = ct_to_xe(ct);
+ u32 msg[GUC_HXG_MSG_MIN_LEN];
+ u32 size = h2g->info.size;
+ u32 head = *mhead;
+ u32 len;
+
+ xe_gt_assert(ct_to_gt(ct), avail >= (s32)GUC_CTB_MSG_MIN_LEN);
+
+ /* Read header */
+ msg[0] = xe_map_rd_array_u32(xe, &h2g->cmds, head);
+ len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
+
+ if (unlikely(len > (u32)avail)) {
+ xe_gt_err(ct_to_gt(ct), "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
+ avail, len);
+ return 0;
+ }
+
+ head = (head + GUC_CTB_MSG_MIN_LEN) % size;
+ ct_fixup_ggtt_in_message(ct, &h2g->cmds, head, msg_len_to_hxg_len(len), size, shift);
+ *mhead = (head + msg_len_to_hxg_len(len)) % size;
+
+ return avail - len;
+}
+
+/**
+ * xe_guc_ct_fixup_messages_with_ggtt - Fixup any pending H2G CTB messages
+ * @ct: pointer to CT struct of the target GuC
+ * @ggtt_shift: shift to be added to all GGTT addresses within the CTB
+ *
+ * Messages in guc-to-host CTB are owned by GuC and any fixups in them
+ * are made by GuC. But content of the host-to-guc CTB is owned by the
+ * KMD, so fixups to GGTT references in any pending messages need to be
+ * applied here.
+ * This function updates GGTT offsets in payloads of pending H2G CTB
+ * messages (messages which were not consumed by GuC before the VF got
+ * paused).
+ */
+void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift)
+{
+ struct xe_guc *guc = ct_to_guc(ct);
+ struct xe_gt *gt = guc_to_gt(guc);
+ struct guc_ctb *h2g = &ct->ctbs.h2g;
+ u32 head, tail, size;
+ s32 avail;
+
+ if (unlikely(h2g->info.broken))
+ return;
+
+ h2g->info.head = desc_read(ct_to_xe(ct), h2g, head);
+ head = h2g->info.head;
+ tail = READ_ONCE(h2g->info.tail);
+ size = h2g->info.size;
+
+ if (unlikely(head > size))
+ goto corrupted;
+
+ if (unlikely(tail >= size))
+ goto corrupted;
+
+ avail = tail - head;
+
+ /* beware of buffer wrap case */
+ if (unlikely(avail < 0))
+ avail += size;
+ xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
+ xe_gt_assert(gt, avail >= 0);
+
+ while (avail > 0)
+ avail = ct_fixup_ggtt_in_buffer(ct, h2g, ggtt_shift, &head, avail);
+
+ return;
+
+corrupted:
+ xe_gt_err(gt, "Corrupted H2G descriptor head=%u tail=%u size=%u, fixups not applied\n",
+ head, tail, size);
+ h2g->info.broken = true;
+}
+
static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
bool want_ctb)
{
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
index 82c4ae458dda..5649bda82823 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.h
+++ b/drivers/gpu/drm/xe/xe_guc_ct.h
@@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
+void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift);
+
static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
{
return ct->state == XE_GUC_CT_STATE_ENABLED;
diff --git a/drivers/gpu/drm/xe/xe_map.h b/drivers/gpu/drm/xe/xe_map.h
index f62e0c8b67ab..db98c8fb121f 100644
--- a/drivers/gpu/drm/xe/xe_map.h
+++ b/drivers/gpu/drm/xe/xe_map.h
@@ -78,6 +78,18 @@ static inline void xe_map_write32(struct xe_device *xe, struct iosys_map *map,
iosys_map_wr(map__, offset__, type__, val__); \
})
+#define xe_map_rd_array(xe__, map__, index__, type__) \
+ xe_map_rd(xe__, map__, (index__) * sizeof(type__), type__)
+
+#define xe_map_wr_array(xe__, map__, index__, type__, val__) \
+ xe_map_wr(xe__, map__, (index__) * sizeof(type__), type__, val__)
+
+#define xe_map_rd_array_u32(xe__, map__, index__) \
+ xe_map_rd_array(xe__, map__, index__, u32)
+
+#define xe_map_wr_array_u32(xe__, map__, index__, val__) \
+ xe_map_wr_array(xe__, map__, index__, u32, val__)
+
#define xe_map_rd_field(xe__, map__, struct_offset__, struct_type__, field__) ({ \
struct xe_device *__xe = xe__; \
xe_device_assert_mem_access(__xe); \
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index e70f1ceabbb3..2674fa948fda 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -10,6 +10,7 @@
#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
+#include "xe_guc_ct.h"
#include "xe_pm.h"
#include "xe_sriov.h"
#include "xe_sriov_printk.h"
@@ -158,6 +159,20 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
return ret;
}
+static void vf_post_migration_fixup_ctb(struct xe_device *xe)
+{
+ struct xe_gt *gt;
+ unsigned int id;
+
+ xe_assert(xe, IS_SRIOV_VF(xe));
+
+ for_each_gt(gt, xe, id) {
+ s32 shift = xe_gt_sriov_vf_ggtt_shift(gt);
+
+ xe_guc_ct_fixup_messages_with_ggtt(>->uc.guc.ct, shift);
+ }
+}
+
/*
* vf_post_migration_imminent - Check if post-restore recovery is coming.
* @xe: the &xe_device struct instance
@@ -224,6 +239,9 @@ static void vf_post_migration_recovery(struct xe_device *xe)
need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
/* FIXME: add the recovery steps */
+ if (need_fixups)
+ vf_post_migration_fixup_ctb(xe);
+
vf_post_migration_notify_resfix_done(xe);
xe_pm_runtime_put(xe);
drm_notice(&xe->drm, "migration recovery ended\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration
2025-04-09 21:13 ` [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
@ 2025-04-10 17:58 ` Michal Wajdeczko
2025-04-11 14:39 ` Lis, Tomasz
0 siblings, 1 reply; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-10 17:58 UTC (permalink / raw)
To: Tomasz Lis, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 09.04.2025 23:13, Tomasz Lis wrote:
> During post-migration recovery of a VF, it is necessary to update
> GGTT references included in messages which are going to be sent
> to GuC. GuC will start consuming messages after VF KMD will inform
> it about fixups being done; before that, the VF KMD is expected
> to update any H2G messages which are already in send buffer but
> were not consumed by GuC.
>
> Only a small subset of messages allowed for VFs have GGTT references
> in them. This patch adds the functionality to parse the CTB send
> ring buffer and shift addresses contained within.
>
> While fixing the CTB content, ct->lock is not taken. This means
> the only barrier taken remains GGTT address lock - which is ok,
> because only requests with GGTT addresses matter, but it also means
> tail changes can happen during the CTB fixups execution (which may
> be ignored as any new messages will not have anything to fix).
>
> The GGTT address locking will be introduced in a future series.
>
> v2: removed storing shift as that's now done in VMA nodes patch;
> macros to inlines; warns to asserts; log messages fixes (Michal)
> v3: removed inline keywords, enums for offsets in CTB messages,
> less error messages, if return unused then made functs void (Michal)
> v4: update the cached head before starting fixups
> v5: removed/updated comments, wrapped lines, converted assert into
> error, enums for offsets to separate patch, reused xe_map_rd
> v6: define xe_map_*_array() macros, support CTB wrap which divides
> a message, updated comments, moved one function to an earlier patch
> v7: renamed few functions, wider use on previously introduced helper,
> separate cases in parsing messges, documented a static funct
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_ct.c | 161 +++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
> drivers/gpu/drm/xe/xe_map.h | 12 +++
> drivers/gpu/drm/xe/xe_sriov_vf.c | 18 ++++
> 4 files changed, 193 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
> index 0a4fef7d7225..66a1a14f45a5 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ct.c
> +++ b/drivers/gpu/drm/xe/xe_guc_ct.c
> @@ -84,6 +84,8 @@ struct g2h_fence {
> bool done;
> };
>
> +#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
> +
> static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
> {
> g2h_fence->response_buffer = response_buffer;
> @@ -1623,6 +1625,165 @@ static void g2h_worker_func(struct work_struct *w)
> receive_g2h(ct);
> }
>
> +static void xe_ring_map_fixup_u64(struct xe_device *xe, struct iosys_map *cmds,
hmm, name is little ambiguous, as it is too similar to other xe_..._map
helpers where suffix is used for different purpose, maybe drop "map":
xe_fixup_u64_in_cmds()
> + u32 size, u32 head, u32 pos, s64 shift)
hmm, btw, do we really need to two separate params "head" and "pos"?
this function just do fixup at one specific location
> +{
> + u32 hi, lo;
> + u64 offset;
> +
> + lo = xe_map_rd_array_u32(xe, cmds, (head + pos) % size);
> + hi = xe_map_rd_array_u32(xe, cmds, (head + pos + 1) % size);
> + offset = make_u64(hi, lo);
> + offset += shift;
> + lo = lower_32_bits(offset);
> + hi = upper_32_bits(offset);
> + xe_map_wr_array_u32(xe, cmds, (head + pos) % size, lo);
> + xe_map_wr_array_u32(xe, cmds, (head + pos + 1) % size, hi);
> +}
> +
> +/*
> + * Shift any GGTT addresses within a single message left within CTB from
> + * before post-migration recovery.
> + * @ct: pointer to CT struct of the target GuC
> + * @cmds: iomap buffer containing CT messages
> + * @head: start of the target message within the buffer
> + * @len: length of the target message
> + * @size: size of the commands buffer
> + * @shift: the address shift to be added to each GGTT reference
> + */
> +static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
> + struct iosys_map *cmds, u32 head,
> + u32 len, u32 size, s64 shift)
-:84: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#84: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1655:
+static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
did you really run checkpatch.pl as promised ?
> +{
> + struct xe_device *xe = ct_to_xe(ct);
> + u32 action, i, n;
> + u32 msg[GUC_HXG_MSG_MIN_LEN];
again, please try to order vars in rev-xmas-tree
> +
> + msg[0] = xe_map_rd_array_u32(xe, cmds, head);
> + action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
> + switch (action) {
> + case XE_GUC_ACTION_REGISTER_CONTEXT:
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER,
> + shift);
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER,
> + shift);
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR, shift);
> + break;
> + case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
> + shift);
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER,
> + shift);
> + n = xe_map_rd_array_u32(xe, cmds, head +
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS);
head + DATA_10_NUM_CTXS could be > cmds.size
maybe it's time for
u32 xe_map_rd_ring_u32(xe, map, idx, size)
{
return xe_map_rd_array_u32(xe, map, idx % size);
}
it could be used in xe_ring_map_fixup_u64() above
> + for (i = 0; i < n; i++)
> + xe_ring_map_fixup_u64(xe, cmds, size, head,
> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR
> + + 2 * i, shift);
> + break;
> + default:
> + break;
> + }
> +}
> +
> +/** Apply fixups to a single outgoing CT message within given CTB
please put more attention to comment styles, here it should be:
/*
* Apply fixups to a single outgoing CT message within given CTB
> + * @ct: the &xe_guc_ct struct instance representing the target GuC
> + * @h2g: the &guc_ctb struct instance of the target buffer
> + * @shift: shift to be added to all GGTT addresses within the CTB
> + * @mhead: pointer to an integer storing message start position; the
> + * position is changed to next message before this function return
> + * @avail: size of the area available for parsing, that is length
> + * of all remaining messages stored within the CTB
> + * Return: size of the area available for parsing after one message
> + * has been parsed, that is length remaining from the updated mhead
> + */
> +static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb *h2g,
> + s64 shift, u32 *mhead, s32 avail)
-:135: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#135: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1706:
+static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb
*h2g,
+ s64 shift, u32 *mhead, s32 avail)
> +{
> + struct xe_device *xe = ct_to_xe(ct);
> + u32 msg[GUC_HXG_MSG_MIN_LEN];
> + u32 size = h2g->info.size;
> + u32 head = *mhead;
> + u32 len;
> +
> + xe_gt_assert(ct_to_gt(ct), avail >= (s32)GUC_CTB_MSG_MIN_LEN);
> +
> + /* Read header */
> + msg[0] = xe_map_rd_array_u32(xe, &h2g->cmds, head);
> + len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
> +
> + if (unlikely(len > (u32)avail)) {
> + xe_gt_err(ct_to_gt(ct), "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
> + avail, len);
> + return 0;
> + }
> +
> + head = (head + GUC_CTB_MSG_MIN_LEN) % size;
> + ct_fixup_ggtt_in_message(ct, &h2g->cmds, head, msg_len_to_hxg_len(len), size, shift);
> + *mhead = (head + msg_len_to_hxg_len(len)) % size;
> +
> + return avail - len;
> +}
> +
> +/**
> + * xe_guc_ct_fixup_messages_with_ggtt - Fixup any pending H2G CTB messages
> + * @ct: pointer to CT struct of the target GuC
> + * @ggtt_shift: shift to be added to all GGTT addresses within the CTB
> + *
> + * Messages in guc-to-host CTB are owned by GuC and any fixups in them
> + * are made by GuC. But content of the host-to-guc CTB is owned by the
> + * KMD, so fixups to GGTT references in any pending messages need to be
> + * applied here.
> + * This function updates GGTT offsets in payloads of pending H2G CTB
> + * messages (messages which were not consumed by GuC before the VF got
> + * paused).
> + */
> +void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift)
> +{
> + struct xe_guc *guc = ct_to_guc(ct);
> + struct xe_gt *gt = guc_to_gt(guc);
> + struct guc_ctb *h2g = &ct->ctbs.h2g;
> + u32 head, tail, size;
> + s32 avail;
> +
> + if (unlikely(h2g->info.broken))
> + return;
> +
> + h2g->info.head = desc_read(ct_to_xe(ct), h2g, head);
> + head = h2g->info.head;
> + tail = READ_ONCE(h2g->info.tail);
> + size = h2g->info.size;
> +
> + if (unlikely(head > size))
> + goto corrupted;
> +
> + if (unlikely(tail >= size))
> + goto corrupted;
> +
> + avail = tail - head;
> +
> + /* beware of buffer wrap case */
> + if (unlikely(avail < 0))
> + avail += size;
> + xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
> + xe_gt_assert(gt, avail >= 0);
> +
> + while (avail > 0)
> + avail = ct_fixup_ggtt_in_buffer(ct, h2g, ggtt_shift, &head, avail);
> +
> + return;
> +
> +corrupted:
> + xe_gt_err(gt, "Corrupted H2G descriptor head=%u tail=%u size=%u, fixups not applied\n",
> + head, tail, size);
> + h2g->info.broken = true;
> +}
> +
> static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
> bool want_ctb)
> {
> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
> index 82c4ae458dda..5649bda82823 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ct.h
> +++ b/drivers/gpu/drm/xe/xe_guc_ct.h
> @@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
> void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
> void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
>
> +void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift);
> +
> static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
> {
> return ct->state == XE_GUC_CT_STATE_ENABLED;
> diff --git a/drivers/gpu/drm/xe/xe_map.h b/drivers/gpu/drm/xe/xe_map.h
> index f62e0c8b67ab..db98c8fb121f 100644
> --- a/drivers/gpu/drm/xe/xe_map.h
> +++ b/drivers/gpu/drm/xe/xe_map.h
> @@ -78,6 +78,18 @@ static inline void xe_map_write32(struct xe_device *xe, struct iosys_map *map,
> iosys_map_wr(map__, offset__, type__, val__); \
> })
>
> +#define xe_map_rd_array(xe__, map__, index__, type__) \
> + xe_map_rd(xe__, map__, (index__) * sizeof(type__), type__)
> +
> +#define xe_map_wr_array(xe__, map__, index__, type__, val__) \
> + xe_map_wr(xe__, map__, (index__) * sizeof(type__), type__, val__)
> +
> +#define xe_map_rd_array_u32(xe__, map__, index__) \
> + xe_map_rd_array(xe__, map__, index__, u32)
> +
> +#define xe_map_wr_array_u32(xe__, map__, index__, val__) \
> + xe_map_wr_array(xe__, map__, index__, u32, val__)
> +
> #define xe_map_rd_field(xe__, map__, struct_offset__, struct_type__, field__) ({ \
> struct xe_device *__xe = xe__; \
> xe_device_assert_mem_access(__xe); \
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
> index e70f1ceabbb3..2674fa948fda 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
> @@ -10,6 +10,7 @@
> #include "xe_gt.h"
> #include "xe_gt_sriov_printk.h"
> #include "xe_gt_sriov_vf.h"
> +#include "xe_guc_ct.h"
> #include "xe_pm.h"
> #include "xe_sriov.h"
> #include "xe_sriov_printk.h"
> @@ -158,6 +159,20 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
> return ret;
> }
>
> +static void vf_post_migration_fixup_ctb(struct xe_device *xe)
> +{
> + struct xe_gt *gt;
> + unsigned int id;
> +
> + xe_assert(xe, IS_SRIOV_VF(xe));
> +
> + for_each_gt(gt, xe, id) {
> + s32 shift = xe_gt_sriov_vf_ggtt_shift(gt);
> +
> + xe_guc_ct_fixup_messages_with_ggtt(>->uc.guc.ct, shift);
> + }
> +}
> +
> /*
> * vf_post_migration_imminent - Check if post-restore recovery is coming.
> * @xe: the &xe_device struct instance
> @@ -224,6 +239,9 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>
> need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
> /* FIXME: add the recovery steps */
> + if (need_fixups)
> + vf_post_migration_fixup_ctb(xe);
> +
> vf_post_migration_notify_resfix_done(xe);
> xe_pm_runtime_put(xe);
> drm_notice(&xe->drm, "migration recovery ended\n");
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration
2025-04-10 17:58 ` Michal Wajdeczko
@ 2025-04-11 14:39 ` Lis, Tomasz
2025-04-11 16:45 ` Michal Wajdeczko
0 siblings, 1 reply; 22+ messages in thread
From: Lis, Tomasz @ 2025-04-11 14:39 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
[-- Attachment #1: Type: text/plain, Size: 13616 bytes --]
On 10.04.2025 19:58, Michal Wajdeczko wrote:
> On 09.04.2025 23:13, Tomasz Lis wrote:
>> During post-migration recovery of a VF, it is necessary to update
>> GGTT references included in messages which are going to be sent
>> to GuC. GuC will start consuming messages after VF KMD will inform
>> it about fixups being done; before that, the VF KMD is expected
>> to update any H2G messages which are already in send buffer but
>> were not consumed by GuC.
>>
>> Only a small subset of messages allowed for VFs have GGTT references
>> in them. This patch adds the functionality to parse the CTB send
>> ring buffer and shift addresses contained within.
>>
>> While fixing the CTB content, ct->lock is not taken. This means
>> the only barrier taken remains GGTT address lock - which is ok,
>> because only requests with GGTT addresses matter, but it also means
>> tail changes can happen during the CTB fixups execution (which may
>> be ignored as any new messages will not have anything to fix).
>>
>> The GGTT address locking will be introduced in a future series.
>>
>> v2: removed storing shift as that's now done in VMA nodes patch;
>> macros to inlines; warns to asserts; log messages fixes (Michal)
>> v3: removed inline keywords, enums for offsets in CTB messages,
>> less error messages, if return unused then made functs void (Michal)
>> v4: update the cached head before starting fixups
>> v5: removed/updated comments, wrapped lines, converted assert into
>> error, enums for offsets to separate patch, reused xe_map_rd
>> v6: define xe_map_*_array() macros, support CTB wrap which divides
>> a message, updated comments, moved one function to an earlier patch
>> v7: renamed few functions, wider use on previously introduced helper,
>> separate cases in parsing messges, documented a static funct
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis@intel.com>
>> Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_ct.c | 161 +++++++++++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
>> drivers/gpu/drm/xe/xe_map.h | 12 +++
>> drivers/gpu/drm/xe/xe_sriov_vf.c | 18 ++++
>> 4 files changed, 193 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
>> index 0a4fef7d7225..66a1a14f45a5 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_ct.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_ct.c
>> @@ -84,6 +84,8 @@ struct g2h_fence {
>> bool done;
>> };
>>
>> +#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
>> +
>> static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
>> {
>> g2h_fence->response_buffer = response_buffer;
>> @@ -1623,6 +1625,165 @@ static void g2h_worker_func(struct work_struct *w)
>> receive_g2h(ct);
>> }
>>
>> +static void xe_ring_map_fixup_u64(struct xe_device *xe, struct iosys_map *cmds,
> hmm, name is little ambiguous, as it is too similar to other xe_..._map
> helpers where suffix is used for different purpose, maybe drop "map":
>
> xe_fixup_u64_in_cmds()
ok
>> + u32 size, u32 head, u32 pos, s64 shift)
> hmm, btw, do we really need to two separate params "head" and "pos"?
> this function just do fixup at one specific location
I don't really want another complication around these ridiculously long
enum members.
But now that will match the calls to `xe_map_rd_ring_u32()`, so will do.
>> +{
>> + u32 hi, lo;
>> + u64 offset;
>> +
>> + lo = xe_map_rd_array_u32(xe, cmds, (head + pos) % size);
>> + hi = xe_map_rd_array_u32(xe, cmds, (head + pos + 1) % size);
>> + offset = make_u64(hi, lo);
>> + offset += shift;
>> + lo = lower_32_bits(offset);
>> + hi = upper_32_bits(offset);
>> + xe_map_wr_array_u32(xe, cmds, (head + pos) % size, lo);
>> + xe_map_wr_array_u32(xe, cmds, (head + pos + 1) % size, hi);
>> +}
>> +
>> +/*
>> + * Shift any GGTT addresses within a single message left within CTB from
>> + * before post-migration recovery.
>> + * @ct: pointer to CT struct of the target GuC
>> + * @cmds: iomap buffer containing CT messages
>> + * @head: start of the target message within the buffer
>> + * @len: length of the target message
>> + * @size: size of the commands buffer
>> + * @shift: the address shift to be added to each GGTT reference
>> + */
>> +static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
>> + struct iosys_map *cmds, u32 head,
>> + u32 len, u32 size, s64 shift)
> -:84: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
> #84: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1655:
> +static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
> + struct iosys_map *cmds, u32 head,
>
> did you really run checkpatch.pl as promised ?
Many functions got renamed on your request.
>> +{
>> + struct xe_device *xe = ct_to_xe(ct);
>> + u32 action, i, n;
>> + u32 msg[GUC_HXG_MSG_MIN_LEN];
> again, please try to order vars in rev-xmas-tree
ok
>> +
>> + msg[0] = xe_map_rd_array_u32(xe, cmds, head);
>> + action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
>> + switch (action) {
>> + case XE_GUC_ACTION_REGISTER_CONTEXT:
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_DATA_5_WQ_DESC_ADDR_LOWER,
>> + shift);
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_DATA_7_WQ_BUF_BASE_LOWER,
>> + shift);
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_DATA_10_HW_LRC_ADDR, shift);
>> + break;
>> + case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_5_WQ_DESC_ADDR_LOWER,
>> + shift);
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_7_WQ_BUF_BASE_LOWER,
>> + shift);
>> + n = xe_map_rd_array_u32(xe, cmds, head +
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_10_NUM_CTXS);
> head + DATA_10_NUM_CTXS could be > cmds.size
>
> maybe it's time for
>
> u32 xe_map_rd_ring_u32(xe, map, idx, size)
> {
> return xe_map_rd_array_u32(xe, map, idx % size);
> }
>
> it could be used in xe_ring_map_fixup_u64() above
Yes, that's a future bug. will add the helper function.
>> + for (i = 0; i < n; i++)
>> + xe_ring_map_fixup_u64(xe, cmds, size, head,
>> + XE_GUC_REGISTER_CONTEXT_MULTI_LRC_DATA_11_HW_LRC_ADDR
>> + + 2 * i, shift);
>> + break;
>> + default:
>> + break;
>> + }
>> +}
>> +
>> +/** Apply fixups to a single outgoing CT message within given CTB
> please put more attention to comment styles, here it should be:
>
> /*
> * Apply fixups to a single outgoing CT message within given CTB
right.
>> + * @ct: the &xe_guc_ct struct instance representing the target GuC
>> + * @h2g: the &guc_ctb struct instance of the target buffer
>> + * @shift: shift to be added to all GGTT addresses within the CTB
>> + * @mhead: pointer to an integer storing message start position; the
>> + * position is changed to next message before this function return
>> + * @avail: size of the area available for parsing, that is length
>> + * of all remaining messages stored within the CTB
>> + * Return: size of the area available for parsing after one message
>> + * has been parsed, that is length remaining from the updated mhead
>> + */
>> +static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb *h2g,
>> + s64 shift, u32 *mhead, s32 avail)
> -:135: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
> #135: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1706:
> +static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb
> *h2g,
> + s64 shift, u32 *mhead, s32 avail)
will fix. And do checkpatch again.
-Tomasz
>> +{
>> + struct xe_device *xe = ct_to_xe(ct);
>> + u32 msg[GUC_HXG_MSG_MIN_LEN];
>> + u32 size = h2g->info.size;
>> + u32 head = *mhead;
>> + u32 len;
>> +
>> + xe_gt_assert(ct_to_gt(ct), avail >= (s32)GUC_CTB_MSG_MIN_LEN);
>> +
>> + /* Read header */
>> + msg[0] = xe_map_rd_array_u32(xe, &h2g->cmds, head);
>> + len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
>> +
>> + if (unlikely(len > (u32)avail)) {
>> + xe_gt_err(ct_to_gt(ct), "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
>> + avail, len);
>> + return 0;
>> + }
>> +
>> + head = (head + GUC_CTB_MSG_MIN_LEN) % size;
>> + ct_fixup_ggtt_in_message(ct, &h2g->cmds, head, msg_len_to_hxg_len(len), size, shift);
>> + *mhead = (head + msg_len_to_hxg_len(len)) % size;
>> +
>> + return avail - len;
>> +}
>> +
>> +/**
>> + * xe_guc_ct_fixup_messages_with_ggtt - Fixup any pending H2G CTB messages
>> + * @ct: pointer to CT struct of the target GuC
>> + * @ggtt_shift: shift to be added to all GGTT addresses within the CTB
>> + *
>> + * Messages in guc-to-host CTB are owned by GuC and any fixups in them
>> + * are made by GuC. But content of the host-to-guc CTB is owned by the
>> + * KMD, so fixups to GGTT references in any pending messages need to be
>> + * applied here.
>> + * This function updates GGTT offsets in payloads of pending H2G CTB
>> + * messages (messages which were not consumed by GuC before the VF got
>> + * paused).
>> + */
>> +void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift)
>> +{
>> + struct xe_guc *guc = ct_to_guc(ct);
>> + struct xe_gt *gt = guc_to_gt(guc);
>> + struct guc_ctb *h2g = &ct->ctbs.h2g;
>> + u32 head, tail, size;
>> + s32 avail;
>> +
>> + if (unlikely(h2g->info.broken))
>> + return;
>> +
>> + h2g->info.head = desc_read(ct_to_xe(ct), h2g, head);
>> + head = h2g->info.head;
>> + tail = READ_ONCE(h2g->info.tail);
>> + size = h2g->info.size;
>> +
>> + if (unlikely(head > size))
>> + goto corrupted;
>> +
>> + if (unlikely(tail >= size))
>> + goto corrupted;
>> +
>> + avail = tail - head;
>> +
>> + /* beware of buffer wrap case */
>> + if (unlikely(avail < 0))
>> + avail += size;
>> + xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
>> + xe_gt_assert(gt, avail >= 0);
>> +
>> + while (avail > 0)
>> + avail = ct_fixup_ggtt_in_buffer(ct, h2g, ggtt_shift, &head, avail);
>> +
>> + return;
>> +
>> +corrupted:
>> + xe_gt_err(gt, "Corrupted H2G descriptor head=%u tail=%u size=%u, fixups not applied\n",
>> + head, tail, size);
>> + h2g->info.broken = true;
>> +}
>> +
>> static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
>> bool want_ctb)
>> {
>> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
>> index 82c4ae458dda..5649bda82823 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_ct.h
>> +++ b/drivers/gpu/drm/xe/xe_guc_ct.h
>> @@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
>> void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
>> void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
>>
>> +void xe_guc_ct_fixup_messages_with_ggtt(struct xe_guc_ct *ct, s64 ggtt_shift);
>> +
>> static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
>> {
>> return ct->state == XE_GUC_CT_STATE_ENABLED;
>> diff --git a/drivers/gpu/drm/xe/xe_map.h b/drivers/gpu/drm/xe/xe_map.h
>> index f62e0c8b67ab..db98c8fb121f 100644
>> --- a/drivers/gpu/drm/xe/xe_map.h
>> +++ b/drivers/gpu/drm/xe/xe_map.h
>> @@ -78,6 +78,18 @@ static inline void xe_map_write32(struct xe_device *xe, struct iosys_map *map,
>> iosys_map_wr(map__, offset__, type__, val__); \
>> })
>>
>> +#define xe_map_rd_array(xe__, map__, index__, type__) \
>> + xe_map_rd(xe__, map__, (index__) * sizeof(type__), type__)
>> +
>> +#define xe_map_wr_array(xe__, map__, index__, type__, val__) \
>> + xe_map_wr(xe__, map__, (index__) * sizeof(type__), type__, val__)
>> +
>> +#define xe_map_rd_array_u32(xe__, map__, index__) \
>> + xe_map_rd_array(xe__, map__, index__, u32)
>> +
>> +#define xe_map_wr_array_u32(xe__, map__, index__, val__) \
>> + xe_map_wr_array(xe__, map__, index__, u32, val__)
>> +
>> #define xe_map_rd_field(xe__, map__, struct_offset__, struct_type__, field__) ({ \
>> struct xe_device *__xe = xe__; \
>> xe_device_assert_mem_access(__xe); \
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> index e70f1ceabbb3..2674fa948fda 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> @@ -10,6 +10,7 @@
>> #include "xe_gt.h"
>> #include "xe_gt_sriov_printk.h"
>> #include "xe_gt_sriov_vf.h"
>> +#include "xe_guc_ct.h"
>> #include "xe_pm.h"
>> #include "xe_sriov.h"
>> #include "xe_sriov_printk.h"
>> @@ -158,6 +159,20 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
>> return ret;
>> }
>>
>> +static void vf_post_migration_fixup_ctb(struct xe_device *xe)
>> +{
>> + struct xe_gt *gt;
>> + unsigned int id;
>> +
>> + xe_assert(xe, IS_SRIOV_VF(xe));
>> +
>> + for_each_gt(gt, xe, id) {
>> + s32 shift = xe_gt_sriov_vf_ggtt_shift(gt);
>> +
>> + xe_guc_ct_fixup_messages_with_ggtt(>->uc.guc.ct, shift);
>> + }
>> +}
>> +
>> /*
>> * vf_post_migration_imminent - Check if post-restore recovery is coming.
>> * @xe: the &xe_device struct instance
>> @@ -224,6 +239,9 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>>
>> need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
>> /* FIXME: add the recovery steps */
>> + if (need_fixups)
>> + vf_post_migration_fixup_ctb(xe);
>> +
>> vf_post_migration_notify_resfix_done(xe);
>> xe_pm_runtime_put(xe);
>> drm_notice(&xe->drm, "migration recovery ended\n");
[-- Attachment #2: Type: text/html, Size: 15424 bytes --]
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration
2025-04-11 14:39 ` Lis, Tomasz
@ 2025-04-11 16:45 ` Michal Wajdeczko
0 siblings, 0 replies; 22+ messages in thread
From: Michal Wajdeczko @ 2025-04-11 16:45 UTC (permalink / raw)
To: Lis, Tomasz, intel-xe
Cc: Michał Winiarski, Piotr Piórkowski, Matthew Brost,
Lucas De Marchi
On 11.04.2025 16:39, Lis, Tomasz wrote:
>
> On 10.04.2025 19:58, Michal Wajdeczko wrote:
>> On 09.04.2025 23:13, Tomasz Lis wrote:
...
>>> + */
>>> +static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
>>> + struct iosys_map *cmds, u32 head,
>>> + u32 len, u32 size, s64 shift)
>> -:84: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open
>> parenthesis
>> #84: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1655:
>> +static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
>> + struct iosys_map *cmds, u32 head,
>>
>> did you really run checkpatch.pl as promised ?
> Many functions got renamed on your request.
so it's my fault?
...
>>> +static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct
>>> guc_ctb *h2g,
>>> + s64 shift, u32 *mhead, s32 avail)
>> -:135: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open
>> parenthesis
>> #135: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1706:
>> +static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb
>> *h2g,
>> + s64 shift, u32 *mhead, s32 avail)
>
> will fix. And do checkpatch again.
>
not just 'again' or this 'next' time
it has to be run *each* time you plan to submit patches [1] so you want
waste CI and/or reviewers time
[1]
https://docs.kernel.org/process/submitting-patches.html#style-check-your-changes
^ permalink raw reply [flat|nested] 22+ messages in thread
* ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (3 preceding siblings ...)
2025-04-09 21:13 ` [PATCH v8 4/4] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
@ 2025-04-09 21:18 ` Patchwork
2025-04-09 21:19 ` ✗ CI.checkpatch: warning " Patchwork
` (6 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-09 21:18 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: ef33117e4583 drm-tip: 2025y-04m-09d-16h-51m-14s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/vf: Divide GGTT ballooning into allocation and insertion
Applying: drm/xe/vf: Shifting GGTT area post migration
Applying: drm/xe/guc: Introduce enum with offsets for context register H2Gs
Applying: drm/xe/vf: Fixup CTB send buffer messages after migration
^ permalink raw reply [flat|nested] 22+ messages in thread* ✗ CI.checkpatch: warning for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (4 preceding siblings ...)
2025-04-09 21:18 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7) Patchwork
@ 2025-04-09 21:19 ` Patchwork
2025-04-09 21:20 ` ✓ CI.KUnit: success " Patchwork
` (5 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-09 21:19 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
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
13a92ce9fd458ebd6064f23cec8c39c53d02ed26
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 88bf30c22701e930d9fcb55c2a7d1f9dc6ccf5ab
Author: Tomasz Lis <tomasz.lis@intel.com>
Date: Wed Apr 9 23:13:40 2025 +0200
drm/xe/vf: Fixup CTB send buffer messages after migration
During post-migration recovery of a VF, it is necessary to update
GGTT references included in messages which are going to be sent
to GuC. GuC will start consuming messages after VF KMD will inform
it about fixups being done; before that, the VF KMD is expected
to update any H2G messages which are already in send buffer but
were not consumed by GuC.
Only a small subset of messages allowed for VFs have GGTT references
in them. This patch adds the functionality to parse the CTB send
ring buffer and shift addresses contained within.
While fixing the CTB content, ct->lock is not taken. This means
the only barrier taken remains GGTT address lock - which is ok,
because only requests with GGTT addresses matter, but it also means
tail changes can happen during the CTB fixups execution (which may
be ignored as any new messages will not have anything to fix).
The GGTT address locking will be introduced in a future series.
v2: removed storing shift as that's now done in VMA nodes patch;
macros to inlines; warns to asserts; log messages fixes (Michal)
v3: removed inline keywords, enums for offsets in CTB messages,
less error messages, if return unused then made functs void (Michal)
v4: update the cached head before starting fixups
v5: removed/updated comments, wrapped lines, converted assert into
error, enums for offsets to separate patch, reused xe_map_rd
v6: define xe_map_*_array() macros, support CTB wrap which divides
a message, updated comments, moved one function to an earlier patch
v7: renamed few functions, wider use on previously introduced helper,
separate cases in parsing messges, documented a static funct
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
+ /mt/dim checkpatch ef33117e4583fab700ac35903cf68dd5309fa947 drm-intel
f64b4885f074 drm/xe/vf: Divide GGTT ballooning into allocation and insertion
-:32: WARNING:SPDX_LICENSE_TAG: Missing or malformed SPDX-License-Identifier tag in line 1
#32: FILE: drivers/gpu/drm/xe/xe_ggtt.c:1:
+/// SPDX-License-Identifier: MIT
-:213: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#213: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:619:
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], start, end);
-:225: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#225: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:627:
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[1], start, end);
total: 0 errors, 3 warnings, 0 checks, 273 lines checked
8f84753c8eb8 drm/xe/vf: Shifting GGTT area post migration
d705307a4e4d drm/xe/guc: Introduce enum with offsets for context register H2Gs
88bf30c22701 drm/xe/vf: Fixup CTB send buffer messages after migration
-:84: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#84: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1655:
+static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
-:135: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#135: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1706:
+static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb *h2g,
+ s64 shift, u32 *mhead, s32 avail)
-:212: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#212: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1783:
+ xe_gt_err(gt, "Corrupted H2G descriptor head=%u tail=%u size=%u, fixups not applied\n",
+ head, tail, size);
total: 0 errors, 0 warnings, 3 checks, 235 lines checked
^ permalink raw reply [flat|nested] 22+ messages in thread* ✓ CI.KUnit: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (5 preceding siblings ...)
2025-04-09 21:19 ` ✗ CI.checkpatch: warning " Patchwork
@ 2025-04-09 21:20 ` Patchwork
2025-04-09 21:26 ` ✗ CI.Build: failure " Patchwork
` (4 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-09 21:20 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[21:19:16] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[21:19:20] 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
../drivers/gpu/drm/xe/xe_ggtt.c:490:6: warning: no previous prototype for ‘xe_ggtt_assert_fit’ [-Wmissing-prototypes]
490 | void xe_ggtt_assert_fit(struct xe_ggtt *ggtt, u64 start, u64 size)
| ^~~~~~~~~~~~~~~~~~
[21:19:46] Starting KUnit Kernel (1/1)...
[21:19:46] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[21:19:47] ================== guc_buf (11 subtests) ===================
[21:19:47] [PASSED] test_smallest
[21:19:47] [PASSED] test_largest
[21:19:47] [PASSED] test_granular
[21:19:47] [PASSED] test_unique
[21:19:47] [PASSED] test_overlap
[21:19:47] [PASSED] test_reusable
[21:19:47] [PASSED] test_too_big
[21:19:47] [PASSED] test_flush
[21:19:47] [PASSED] test_lookup
[21:19:47] [PASSED] test_data
[21:19:47] [PASSED] test_class
[21:19:47] ===================== [PASSED] guc_buf =====================
[21:19:47] =================== guc_dbm (7 subtests) ===================
[21:19:47] [PASSED] test_empty
[21:19:47] [PASSED] test_default
[21:19:47] ======================== test_size ========================
[21:19:47] [PASSED] 4
[21:19:47] [PASSED] 8
[21:19:47] [PASSED] 32
[21:19:47] [PASSED] 256
[21:19:47] ==================== [PASSED] test_size ====================
[21:19:47] ======================= test_reuse ========================
[21:19:47] [PASSED] 4
[21:19:47] [PASSED] 8
[21:19:47] [PASSED] 32
[21:19:47] [PASSED] 256
[21:19:47] =================== [PASSED] test_reuse ====================
[21:19:47] =================== test_range_overlap ====================
[21:19:47] [PASSED] 4
[21:19:47] [PASSED] 8
[21:19:47] [PASSED] 32
[21:19:47] [PASSED] 256
[21:19:47] =============== [PASSED] test_range_overlap ================
[21:19:47] =================== test_range_compact ====================
[21:19:47] [PASSED] 4
[21:19:47] [PASSED] 8
[21:19:47] [PASSED] 32
[21:19:47] [PASSED] 256
[21:19:47] =============== [PASSED] test_range_compact ================
[21:19:47] ==================== test_range_spare =====================
[21:19:47] [PASSED] 4
[21:19:47] [PASSED] 8
[21:19:47] [PASSED] 32
[21:19:47] [PASSED] 256
[21:19:47] ================ [PASSED] test_range_spare =================
[21:19:47] ===================== [PASSED] guc_dbm =====================
[21:19:47] =================== guc_idm (6 subtests) ===================
[21:19:47] [PASSED] bad_init
[21:19:47] [PASSED] no_init
[21:19:47] [PASSED] init_fini
[21:19:47] [PASSED] check_used
[21:19:47] [PASSED] check_quota
[21:19:47] [PASSED] check_all
[21:19:47] ===================== [PASSED] guc_idm =====================
[21:19:47] ================== no_relay (3 subtests) ===================
[21:19:47] [PASSED] xe_drops_guc2pf_if_not_ready
[21:19:47] [PASSED] xe_drops_guc2vf_if_not_ready
[21:19:47] [PASSED] xe_rejects_send_if_not_ready
[21:19:47] ==================== [PASSED] no_relay =====================
[21:19:47] ================== pf_relay (14 subtests) ==================
[21:19:47] [PASSED] pf_rejects_guc2pf_too_short
[21:19:47] [PASSED] pf_rejects_guc2pf_too_long
[21:19:47] [PASSED] pf_rejects_guc2pf_no_payload
[21:19:47] [PASSED] pf_fails_no_payload
[21:19:47] [PASSED] pf_fails_bad_origin
[21:19:47] [PASSED] pf_fails_bad_type
[21:19:47] [PASSED] pf_txn_reports_error
[21:19:47] [PASSED] pf_txn_sends_pf2guc
[21:19:47] [PASSED] pf_sends_pf2guc
[21:19:47] [SKIPPED] pf_loopback_nop
[21:19:47] [SKIPPED] pf_loopback_echo
[21:19:47] [SKIPPED] pf_loopback_fail
[21:19:47] [SKIPPED] pf_loopback_busy
[21:19:47] [SKIPPED] pf_loopback_retry
[21:19:47] ==================== [PASSED] pf_relay =====================
[21:19:47] ================== vf_relay (3 subtests) ===================
[21:19:47] [PASSED] vf_rejects_guc2vf_too_short
[21:19:47] [PASSED] vf_rejects_guc2vf_too_long
[21:19:47] [PASSED] vf_rejects_guc2vf_no_payload
[21:19:47] ==================== [PASSED] vf_relay =====================
[21:19:47] ================= pf_service (11 subtests) =================
[21:19:47] [PASSED] pf_negotiate_any
[21:19:47] [PASSED] pf_negotiate_base_match
[21:19:47] [PASSED] pf_negotiate_base_newer
[21:19:47] [PASSED] pf_negotiate_base_next
[21:19:47] [SKIPPED] pf_negotiate_base_older
[21:19:47] [PASSED] pf_negotiate_base_prev
[21:19:47] [PASSED] pf_negotiate_latest_match
[21:19:47] [PASSED] pf_negotiate_latest_newer
[21:19:47] [PASSED] pf_negotiate_latest_next
[21:19:47] [SKIPPED] pf_negotiate_latest_older
[21:19:47] [SKIPPED] pf_negotiate_latest_prev
[21:19:47] =================== [PASSED] pf_service ====================
[21:19:47] ===================== lmtt (1 subtest) =====================
[21:19:47] ======================== test_ops =========================
[21:19:47] [PASSED] 2-level
[21:19:47] [PASSED] multi-level
[21:19:47] ==================== [PASSED] test_ops =====================
[21:19:47] ====================== [PASSED] lmtt =======================
[21:19:47] =================== xe_mocs (2 subtests) ===================
[21:19:47] ================ xe_live_mocs_kernel_kunit ================
[21:19:47] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[21:19:47] ================ xe_live_mocs_reset_kunit =================
[21:19:47] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[21:19:47] ==================== [SKIPPED] xe_mocs =====================
[21:19:47] ================= xe_migrate (2 subtests) ==================
[21:19:47] ================= xe_migrate_sanity_kunit =================
[21:19:47] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[21:19:47] ================== xe_validate_ccs_kunit ==================
[21:19:47] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[21:19:47] =================== [SKIPPED] xe_migrate ===================
[21:19:47] ================== xe_dma_buf (1 subtest) ==================
[21:19:47] ==================== xe_dma_buf_kunit =====================
[21:19:47] ================ [SKIPPED] xe_dma_buf_kunit ================
[21:19:47] =================== [SKIPPED] xe_dma_buf ===================
[21:19:47] ================= xe_bo_shrink (1 subtest) =================
[21:19:47] =================== xe_bo_shrink_kunit ====================
[21:19:47] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[21:19:47] ================== [SKIPPED] xe_bo_shrink ==================
[21:19:47] ==================== xe_bo (2 subtests) ====================
[21:19:47] ================== xe_ccs_migrate_kunit ===================
[21:19:47] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[21:19:47] ==================== xe_bo_evict_kunit ====================
[21:19:47] =============== [SKIPPED] xe_bo_evict_kunit ================
[21:19:47] ===================== [SKIPPED] xe_bo ======================
[21:19:47] ==================== args (11 subtests) ====================
[21:19:47] [PASSED] count_args_test
[21:19:47] [PASSED] call_args_example
[21:19:47] [PASSED] call_args_test
[21:19:47] [PASSED] drop_first_arg_example
[21:19:47] [PASSED] drop_first_arg_test
[21:19:47] [PASSED] first_arg_example
[21:19:47] [PASSED] first_arg_test
[21:19:47] [PASSED] last_arg_example
[21:19:47] [PASSED] last_arg_test
[21:19:47] [PASSED] pick_arg_example
[21:19:47] [PASSED] sep_comma_example
[21:19:47] ====================== [PASSED] args =======================
[21:19:47] =================== xe_pci (2 subtests) ====================
[21:19:47] [PASSED] xe_gmdid_graphics_ip
[21:19:47] [PASSED] xe_gmdid_media_ip
[21:19:47] ===================== [PASSED] xe_pci ======================
[21:19:47] =================== xe_rtp (2 subtests) ====================
[21:19:47] =============== xe_rtp_process_to_sr_tests ================
[21:19:47] [PASSED] coalesce-same-reg
[21:19:47] [PASSED] no-match-no-add
[21:19:47] [PASSED] match-or
[21:19:47] [PASSED] match-or-xfail
stty: 'standard input': Inappropriate ioctl for device
[21:19:47] [PASSED] no-match-no-add-multiple-rules
[21:19:47] [PASSED] two-regs-two-entries
[21:19:47] [PASSED] clr-one-set-other
[21:19:47] [PASSED] set-field
[21:19:47] [PASSED] conflict-duplicate
[21:19:47] [PASSED] conflict-not-disjoint
[21:19:47] [PASSED] conflict-reg-type
[21:19:47] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[21:19:47] ================== xe_rtp_process_tests ===================
[21:19:47] [PASSED] active1
[21:19:47] [PASSED] active2
[21:19:47] [PASSED] active-inactive
[21:19:47] [PASSED] inactive-active
[21:19:47] [PASSED] inactive-1st_or_active-inactive
[21:19:47] [PASSED] inactive-2nd_or_active-inactive
[21:19:47] [PASSED] inactive-last_or_active-inactive
[21:19:47] [PASSED] inactive-no_or_active-inactive
[21:19:47] ============== [PASSED] xe_rtp_process_tests ===============
[21:19:47] ===================== [PASSED] xe_rtp ======================
[21:19:47] ==================== xe_wa (1 subtest) =====================
[21:19:47] ======================== xe_wa_gt =========================
[21:19:47] [PASSED] TIGERLAKE (B0)
[21:19:47] [PASSED] DG1 (A0)
[21:19:47] [PASSED] DG1 (B0)
[21:19:47] [PASSED] ALDERLAKE_S (A0)
[21:19:47] [PASSED] ALDERLAKE_S (B0)
[21:19:47] [PASSED] ALDERLAKE_S (C0)
[21:19:47] [PASSED] ALDERLAKE_S (D0)
[21:19:47] [PASSED] ALDERLAKE_P (A0)
[21:19:47] [PASSED] ALDERLAKE_P (B0)
[21:19:47] [PASSED] ALDERLAKE_P (C0)
[21:19:47] [PASSED] ALDERLAKE_S_RPLS (D0)
[21:19:47] [PASSED] ALDERLAKE_P_RPLU (E0)
[21:19:47] [PASSED] DG2_G10 (C0)
[21:19:47] [PASSED] DG2_G11 (B1)
[21:19:47] [PASSED] DG2_G12 (A1)
[21:19:47] [PASSED] METEORLAKE (g:A0, m:A0)
[21:19:47] [PASSED] METEORLAKE (g:A0, m:A0)
[21:19:47] [PASSED] METEORLAKE (g:A0, m:A0)
[21:19:47] [PASSED] LUNARLAKE (g:A0, m:A0)
[21:19:47] [PASSED] LUNARLAKE (g:B0, m:A0)
[21:19:47] [PASSED] BATTLEMAGE (g:A0, m:A1)
[21:19:47] ==================== [PASSED] xe_wa_gt =====================
[21:19:47] ====================== [PASSED] xe_wa ======================
[21:19:47] ============================================================
[21:19:47] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[21:19:47] Elapsed time: 30.875s total, 4.320s configuring, 26.238s building, 0.298s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[21:19:47] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[21:19:49] 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
[21:20:10] Starting KUnit Kernel (1/1)...
[21:20:10] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[21:20:10] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[21:20:10] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[21:20:10] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[21:20:10] =========== drm_validate_clone_mode (2 subtests) ===========
[21:20:10] ============== drm_test_check_in_clone_mode ===============
[21:20:10] [PASSED] in_clone_mode
[21:20:10] [PASSED] not_in_clone_mode
[21:20:10] ========== [PASSED] drm_test_check_in_clone_mode ===========
[21:20:10] =============== drm_test_check_valid_clones ===============
[21:20:10] [PASSED] not_in_clone_mode
[21:20:10] [PASSED] valid_clone
[21:20:10] [PASSED] invalid_clone
[21:20:10] =========== [PASSED] drm_test_check_valid_clones ===========
[21:20:10] ============= [PASSED] drm_validate_clone_mode =============
[21:20:10] ============= drm_validate_modeset (1 subtest) =============
[21:20:10] [PASSED] drm_test_check_connector_changed_modeset
[21:20:10] ============== [PASSED] drm_validate_modeset ===============
[21:20:10] ====== drm_test_bridge_get_current_state (2 subtests) ======
[21:20:10] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[21:20:10] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[21:20:10] ======== [PASSED] drm_test_bridge_get_current_state ========
[21:20:10] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[21:20:10] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[21:20:10] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[21:20:10] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[21:20:10] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[21:20:10] ================== drm_buddy (7 subtests) ==================
[21:20:10] [PASSED] drm_test_buddy_alloc_limit
[21:20:10] [PASSED] drm_test_buddy_alloc_optimistic
[21:20:10] [PASSED] drm_test_buddy_alloc_pessimistic
[21:20:10] [PASSED] drm_test_buddy_alloc_pathological
[21:20:10] [PASSED] drm_test_buddy_alloc_contiguous
[21:20:10] [PASSED] drm_test_buddy_alloc_clear
[21:20:10] [PASSED] drm_test_buddy_alloc_range_bias
[21:20:10] ==================== [PASSED] drm_buddy ====================
[21:20:10] ============= drm_cmdline_parser (40 subtests) =============
[21:20:10] [PASSED] drm_test_cmdline_force_d_only
[21:20:10] [PASSED] drm_test_cmdline_force_D_only_dvi
[21:20:10] [PASSED] drm_test_cmdline_force_D_only_hdmi
[21:20:10] [PASSED] drm_test_cmdline_force_D_only_not_digital
[21:20:10] [PASSED] drm_test_cmdline_force_e_only
[21:20:10] [PASSED] drm_test_cmdline_res
[21:20:10] [PASSED] drm_test_cmdline_res_vesa
[21:20:10] [PASSED] drm_test_cmdline_res_vesa_rblank
[21:20:10] [PASSED] drm_test_cmdline_res_rblank
[21:20:10] [PASSED] drm_test_cmdline_res_bpp
[21:20:10] [PASSED] drm_test_cmdline_res_refresh
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[21:20:10] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[21:20:10] [PASSED] drm_test_cmdline_res_margins_force_on
[21:20:10] [PASSED] drm_test_cmdline_res_vesa_margins
[21:20:10] [PASSED] drm_test_cmdline_name
[21:20:10] [PASSED] drm_test_cmdline_name_bpp
[21:20:10] [PASSED] drm_test_cmdline_name_option
[21:20:10] [PASSED] drm_test_cmdline_name_bpp_option
[21:20:10] [PASSED] drm_test_cmdline_rotate_0
[21:20:10] [PASSED] drm_test_cmdline_rotate_90
[21:20:10] [PASSED] drm_test_cmdline_rotate_180
[21:20:10] [PASSED] drm_test_cmdline_rotate_270
[21:20:10] [PASSED] drm_test_cmdline_hmirror
[21:20:10] [PASSED] drm_test_cmdline_vmirror
[21:20:10] [PASSED] drm_test_cmdline_margin_options
[21:20:10] [PASSED] drm_test_cmdline_multiple_options
[21:20:10] [PASSED] drm_test_cmdline_bpp_extra_and_option
[21:20:10] [PASSED] drm_test_cmdline_extra_and_option
[21:20:10] [PASSED] drm_test_cmdline_freestanding_options
[21:20:10] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[21:20:10] [PASSED] drm_test_cmdline_panel_orientation
[21:20:10] ================ drm_test_cmdline_invalid =================
[21:20:10] [PASSED] margin_only
[21:20:10] [PASSED] interlace_only
[21:20:10] [PASSED] res_missing_x
[21:20:10] [PASSED] res_missing_y
[21:20:10] [PASSED] res_bad_y
[21:20:10] [PASSED] res_missing_y_bpp
[21:20:10] [PASSED] res_bad_bpp
[21:20:10] [PASSED] res_bad_refresh
[21:20:10] [PASSED] res_bpp_refresh_force_on_off
[21:20:10] [PASSED] res_invalid_mode
[21:20:10] [PASSED] res_bpp_wrong_place_mode
[21:20:10] [PASSED] name_bpp_refresh
[21:20:10] [PASSED] name_refresh
[21:20:10] [PASSED] name_refresh_wrong_mode
[21:20:10] [PASSED] name_refresh_invalid_mode
[21:20:10] [PASSED] rotate_multiple
[21:20:10] [PASSED] rotate_invalid_val
[21:20:10] [PASSED] rotate_truncated
[21:20:10] [PASSED] invalid_option
[21:20:10] [PASSED] invalid_tv_option
[21:20:10] [PASSED] truncated_tv_option
[21:20:10] ============ [PASSED] drm_test_cmdline_invalid =============
[21:20:10] =============== drm_test_cmdline_tv_options ===============
[21:20:10] [PASSED] NTSC
[21:20:10] [PASSED] NTSC_443
[21:20:10] [PASSED] NTSC_J
[21:20:10] [PASSED] PAL
[21:20:10] [PASSED] PAL_M
[21:20:10] [PASSED] PAL_N
[21:20:10] [PASSED] SECAM
[21:20:10] [PASSED] MONO_525
[21:20:10] [PASSED] MONO_625
[21:20:10] =========== [PASSED] drm_test_cmdline_tv_options ===========
[21:20:10] =============== [PASSED] drm_cmdline_parser ================
[21:20:10] ========== drmm_connector_hdmi_init (20 subtests) ==========
[21:20:10] [PASSED] drm_test_connector_hdmi_init_valid
[21:20:10] [PASSED] drm_test_connector_hdmi_init_bpc_8
[21:20:10] [PASSED] drm_test_connector_hdmi_init_bpc_10
[21:20:10] [PASSED] drm_test_connector_hdmi_init_bpc_12
[21:20:10] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[21:20:10] [PASSED] drm_test_connector_hdmi_init_bpc_null
[21:20:10] [PASSED] drm_test_connector_hdmi_init_formats_empty
[21:20:10] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[21:20:10] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[21:20:10] [PASSED] supported_formats=0x9 yuv420_allowed=1
[21:20:10] [PASSED] supported_formats=0x9 yuv420_allowed=0
[21:20:10] [PASSED] supported_formats=0x3 yuv420_allowed=1
[21:20:10] [PASSED] supported_formats=0x3 yuv420_allowed=0
[21:20:10] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[21:20:10] [PASSED] drm_test_connector_hdmi_init_null_ddc
[21:20:10] [PASSED] drm_test_connector_hdmi_init_null_product
[21:20:10] [PASSED] drm_test_connector_hdmi_init_null_vendor
[21:20:10] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[21:20:10] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[21:20:10] [PASSED] drm_test_connector_hdmi_init_product_valid
[21:20:10] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[21:20:10] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[21:20:10] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[21:20:10] ========= drm_test_connector_hdmi_init_type_valid =========
[21:20:10] [PASSED] HDMI-A
[21:20:10] [PASSED] HDMI-B
[21:20:10] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[21:20:10] ======== drm_test_connector_hdmi_init_type_invalid ========
[21:20:10] [PASSED] Unknown
[21:20:10] [PASSED] VGA
[21:20:10] [PASSED] DVI-I
[21:20:10] [PASSED] DVI-D
[21:20:10] [PASSED] DVI-A
[21:20:10] [PASSED] Composite
[21:20:10] [PASSED] SVIDEO
[21:20:10] [PASSED] LVDS
[21:20:10] [PASSED] Component
[21:20:10] [PASSED] DIN
[21:20:10] [PASSED] DP
[21:20:10] [PASSED] TV
[21:20:10] [PASSED] eDP
[21:20:10] [PASSED] Virtual
[21:20:10] [PASSED] DSI
[21:20:10] [PASSED] DPI
[21:20:10] [PASSED] Writeback
[21:20:10] [PASSED] SPI
[21:20:10] [PASSED] USB
[21:20:10] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[21:20:10] ============ [PASSED] drmm_connector_hdmi_init =============
[21:20:10] ============= drmm_connector_init (3 subtests) =============
[21:20:10] [PASSED] drm_test_drmm_connector_init
[21:20:10] [PASSED] drm_test_drmm_connector_init_null_ddc
[21:20:10] ========= drm_test_drmm_connector_init_type_valid =========
[21:20:10] [PASSED] Unknown
[21:20:10] [PASSED] VGA
[21:20:10] [PASSED] DVI-I
[21:20:10] [PASSED] DVI-D
[21:20:10] [PASSED] DVI-A
[21:20:10] [PASSED] Composite
[21:20:10] [PASSED] SVIDEO
[21:20:10] [PASSED] LVDS
[21:20:10] [PASSED] Component
[21:20:10] [PASSED] DIN
[21:20:10] [PASSED] DP
[21:20:10] [PASSED] HDMI-A
[21:20:10] [PASSED] HDMI-B
[21:20:10] [PASSED] TV
[21:20:10] [PASSED] eDP
[21:20:10] [PASSED] Virtual
[21:20:10] [PASSED] DSI
[21:20:10] [PASSED] DPI
[21:20:10] [PASSED] Writeback
[21:20:10] [PASSED] SPI
[21:20:10] [PASSED] USB
[21:20:10] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[21:20:10] =============== [PASSED] drmm_connector_init ===============
[21:20:10] ========= drm_connector_dynamic_init (6 subtests) ==========
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_init
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_init_properties
[21:20:10] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[21:20:10] [PASSED] Unknown
[21:20:10] [PASSED] VGA
[21:20:10] [PASSED] DVI-I
[21:20:10] [PASSED] DVI-D
[21:20:10] [PASSED] DVI-A
[21:20:10] [PASSED] Composite
[21:20:10] [PASSED] SVIDEO
[21:20:10] [PASSED] LVDS
[21:20:10] [PASSED] Component
[21:20:10] [PASSED] DIN
[21:20:10] [PASSED] DP
[21:20:10] [PASSED] HDMI-A
[21:20:10] [PASSED] HDMI-B
[21:20:10] [PASSED] TV
[21:20:10] [PASSED] eDP
[21:20:10] [PASSED] Virtual
[21:20:10] [PASSED] DSI
[21:20:10] [PASSED] DPI
[21:20:10] [PASSED] Writeback
[21:20:10] [PASSED] SPI
[21:20:10] [PASSED] USB
[21:20:10] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[21:20:10] ======== drm_test_drm_connector_dynamic_init_name =========
[21:20:10] [PASSED] Unknown
[21:20:10] [PASSED] VGA
[21:20:10] [PASSED] DVI-I
[21:20:10] [PASSED] DVI-D
[21:20:10] [PASSED] DVI-A
[21:20:10] [PASSED] Composite
[21:20:10] [PASSED] SVIDEO
[21:20:10] [PASSED] LVDS
[21:20:10] [PASSED] Component
[21:20:10] [PASSED] DIN
[21:20:10] [PASSED] DP
[21:20:10] [PASSED] HDMI-A
[21:20:10] [PASSED] HDMI-B
[21:20:10] [PASSED] TV
[21:20:10] [PASSED] eDP
[21:20:10] [PASSED] Virtual
[21:20:10] [PASSED] DSI
[21:20:10] [PASSED] DPI
[21:20:10] [PASSED] Writeback
[21:20:10] [PASSED] SPI
[21:20:10] [PASSED] USB
[21:20:10] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[21:20:10] =========== [PASSED] drm_connector_dynamic_init ============
[21:20:10] ==== drm_connector_dynamic_register_early (4 subtests) =====
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[21:20:10] ====== [PASSED] drm_connector_dynamic_register_early =======
[21:20:10] ======= drm_connector_dynamic_register (7 subtests) ========
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[21:20:10] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[21:20:10] ========= [PASSED] drm_connector_dynamic_register ==========
[21:20:10] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[21:20:10] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[21:20:10] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[21:20:10] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[21:20:10] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[21:20:10] ========== drm_test_get_tv_mode_from_name_valid ===========
[21:20:10] [PASSED] NTSC
[21:20:10] [PASSED] NTSC-443
[21:20:10] [PASSED] NTSC-J
[21:20:10] [PASSED] PAL
[21:20:10] [PASSED] PAL-M
[21:20:10] [PASSED] PAL-N
[21:20:10] [PASSED] SECAM
[21:20:10] [PASSED] Mono
[21:20:10] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[21:20:10] [PASSED] drm_test_get_tv_mode_from_name_truncated
[21:20:10] ============ [PASSED] drm_get_tv_mode_from_name ============
[21:20:10] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[21:20:10] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[21:20:10] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[21:20:10] [PASSED] VIC 96
[21:20:10] [PASSED] VIC 97
[21:20:10] [PASSED] VIC 101
[21:20:10] [PASSED] VIC 102
[21:20:10] [PASSED] VIC 106
[21:20:10] [PASSED] VIC 107
[21:20:10] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[21:20:10] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[21:20:10] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[21:20:10] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[21:20:10] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[21:20:10] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[21:20:10] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[21:20:10] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[21:20:10] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[21:20:10] [PASSED] Automatic
[21:20:10] [PASSED] Full
[21:20:10] [PASSED] Limited 16:235
[21:20:10] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[21:20:10] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[21:20:10] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[21:20:10] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[21:20:10] === drm_test_drm_hdmi_connector_get_output_format_name ====
[21:20:10] [PASSED] RGB
[21:20:10] [PASSED] YUV 4:2:0
[21:20:10] [PASSED] YUV 4:2:2
[21:20:10] [PASSED] YUV 4:4:4
[21:20:10] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[21:20:10] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[21:20:10] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[21:20:10] ============= drm_damage_helper (21 subtests) ==============
[21:20:10] [PASSED] drm_test_damage_iter_no_damage
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_src_moved
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_not_visible
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[21:20:10] [PASSED] drm_test_damage_iter_no_damage_no_fb
[21:20:10] [PASSED] drm_test_damage_iter_simple_damage
[21:20:10] [PASSED] drm_test_damage_iter_single_damage
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_outside_src
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_src_moved
[21:20:10] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[21:20:10] [PASSED] drm_test_damage_iter_damage
[21:20:10] [PASSED] drm_test_damage_iter_damage_one_intersect
[21:20:10] [PASSED] drm_test_damage_iter_damage_one_outside
[21:20:10] [PASSED] drm_test_damage_iter_damage_src_moved
[21:20:10] [PASSED] drm_test_damage_iter_damage_not_visible
[21:20:10] ================ [PASSED] drm_damage_helper ================
[21:20:10] ============== drm_dp_mst_helper (3 subtests) ==============
[21:20:10] ============== drm_test_dp_mst_calc_pbn_mode ==============
[21:20:10] [PASSED] Clock 154000 BPP 30 DSC disabled
[21:20:10] [PASSED] Clock 234000 BPP 30 DSC disabled
[21:20:10] [PASSED] Clock 297000 BPP 24 DSC disabled
[21:20:10] [PASSED] Clock 332880 BPP 24 DSC enabled
[21:20:10] [PASSED] Clock 324540 BPP 24 DSC enabled
[21:20:10] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[21:20:10] ============== drm_test_dp_mst_calc_pbn_div ===============
[21:20:10] [PASSED] Link rate 2000000 lane count 4
[21:20:10] [PASSED] Link rate 2000000 lane count 2
[21:20:10] [PASSED] Link rate 2000000 lane count 1
[21:20:10] [PASSED] Link rate 1350000 lane count 4
[21:20:10] [PASSED] Link rate 1350000 lane count 2
[21:20:10] [PASSED] Link rate 1350000 lane count 1
[21:20:10] [PASSED] Link rate 1000000 lane count 4
[21:20:10] [PASSED] Link rate 1000000 lane count 2
[21:20:10] [PASSED] Link rate 1000000 lane count 1
[21:20:10] [PASSED] Link rate 810000 lane count 4
[21:20:10] [PASSED] Link rate 810000 lane count 2
[21:20:10] [PASSED] Link rate 810000 lane count 1
[21:20:10] [PASSED] Link rate 540000 lane count 4
[21:20:10] [PASSED] Link rate 540000 lane count 2
[21:20:10] [PASSED] Link rate 540000 lane count 1
[21:20:10] [PASSED] Link rate 270000 lane count 4
[21:20:10] [PASSED] Link rate 270000 lane count 2
[21:20:10] [PASSED] Link rate 270000 lane count 1
[21:20:10] [PASSED] Link rate 162000 lane count 4
[21:20:10] [PASSED] Link rate 162000 lane count 2
[21:20:10] [PASSED] Link rate 162000 lane count 1
[21:20:10] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[21:20:10] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[21:20:10] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[21:20:10] [PASSED] DP_POWER_UP_PHY with port number
[21:20:10] [PASSED] DP_POWER_DOWN_PHY with port number
[21:20:10] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[21:20:10] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[21:20:10] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[21:20:10] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[21:20:10] [PASSED] DP_QUERY_PAYLOAD with port number
[21:20:10] [PASSED] DP_QUERY_PAYLOAD with VCPI
[21:20:10] [PASSED] DP_REMOTE_DPCD_READ with port number
[21:20:10] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[21:20:10] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[21:20:10] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[21:20:10] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[21:20:10] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[21:20:10] [PASSED] DP_REMOTE_I2C_READ with port number
[21:20:10] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[21:20:10] [PASSED] DP_REMOTE_I2C_READ with transactions array
[21:20:10] [PASSED] DP_REMOTE_I2C_WRITE with port number
[21:20:10] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[21:20:10] [PASSED] DP_REMOTE_I2C_WRITE with data array
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[21:20:10] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[21:20:10] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[21:20:10] ================ [PASSED] drm_dp_mst_helper ================
[21:20:10] ================== drm_exec (7 subtests) ===================
[21:20:10] [PASSED] sanitycheck
[21:20:10] [PASSED] test_lock
[21:20:10] [PASSED] test_lock_unlock
[21:20:10] [PASSED] test_duplicates
[21:20:10] [PASSED] test_prepare
[21:20:10] [PASSED] test_prepare_array
[21:20:10] [PASSED] test_multiple_loops
[21:20:10] ==================== [PASSED] drm_exec =====================
[21:20:10] =========== drm_format_helper_test (18 subtests) ===========
[21:20:10] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[21:20:10] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[21:20:10] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[21:20:10] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[21:20:10] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[21:20:10] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[21:20:10] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[21:20:10] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[21:20:10] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[21:20:10] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[21:20:10] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[21:20:10] ============== drm_test_fb_xrgb8888_to_mono ===============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[21:20:10] ==================== drm_test_fb_swab =====================
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ================ [PASSED] drm_test_fb_swab =================
[21:20:10] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[21:20:10] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[21:20:10] [PASSED] single_pixel_source_buffer
[21:20:10] [PASSED] single_pixel_clip_rectangle
[21:20:10] [PASSED] well_known_colors
[21:20:10] [PASSED] destination_pitch
[21:20:10] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[21:20:10] ================= drm_test_fb_clip_offset =================
[21:20:10] [PASSED] pass through
[21:20:10] [PASSED] horizontal offset
[21:20:10] [PASSED] vertical offset
[21:20:10] [PASSED] horizontal and vertical offset
[21:20:10] [PASSED] horizontal offset (custom pitch)
[21:20:10] [PASSED] vertical offset (custom pitch)
[21:20:10] [PASSED] horizontal and vertical offset (custom pitch)
[21:20:10] ============= [PASSED] drm_test_fb_clip_offset =============
[21:20:10] ============== drm_test_fb_build_fourcc_list ==============
[21:20:10] [PASSED] no native formats
[21:20:10] [PASSED] XRGB8888 as native format
[21:20:10] [PASSED] remove duplicates
[21:20:10] [PASSED] convert alpha formats
[21:20:10] [PASSED] random formats
[21:20:10] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[21:20:10] =================== drm_test_fb_memcpy ====================
[21:20:10] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[21:20:10] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[21:20:10] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[21:20:10] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[21:20:10] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[21:20:10] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[21:20:10] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[21:20:10] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[21:20:10] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[21:20:10] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[21:20:10] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[21:20:10] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[21:20:10] =============== [PASSED] drm_test_fb_memcpy ================
[21:20:10] ============= [PASSED] drm_format_helper_test ==============
[21:20:10] ================= drm_format (18 subtests) =================
[21:20:10] [PASSED] drm_test_format_block_width_invalid
[21:20:10] [PASSED] drm_test_format_block_width_one_plane
[21:20:10] [PASSED] drm_test_format_block_width_two_plane
[21:20:10] [PASSED] drm_test_format_block_width_three_plane
[21:20:10] [PASSED] drm_test_format_block_width_tiled
[21:20:10] [PASSED] drm_test_format_block_height_invalid
[21:20:10] [PASSED] drm_test_format_block_height_one_plane
[21:20:10] [PASSED] drm_test_format_block_height_two_plane
[21:20:10] [PASSED] drm_test_format_block_height_three_plane
[21:20:10] [PASSED] drm_test_format_block_height_tiled
[21:20:10] [PASSED] drm_test_format_min_pitch_invalid
[21:20:10] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[21:20:10] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[21:20:10] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[21:20:10] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[21:20:10] [PASSED] drm_test_format_min_pitch_two_plane
[21:20:10] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[21:20:10] [PASSED] drm_test_format_min_pitch_tiled
[21:20:10] =================== [PASSED] drm_format ====================
[21:20:10] ============== drm_framebuffer (10 subtests) ===============
[21:20:10] ========== drm_test_framebuffer_check_src_coords ==========
[21:20:10] [PASSED] Success: source fits into fb
[21:20:10] [PASSED] Fail: overflowing fb with x-axis coordinate
[21:20:10] [PASSED] Fail: overflowing fb with y-axis coordinate
[21:20:10] [PASSED] Fail: overflowing fb with source width
[21:20:10] [PASSED] Fail: overflowing fb with source height
[21:20:10] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[21:20:10] [PASSED] drm_test_framebuffer_cleanup
[21:20:10] =============== drm_test_framebuffer_create ===============
[21:20:10] [PASSED] ABGR8888 normal sizes
[21:20:10] [PASSED] ABGR8888 max sizes
[21:20:10] [PASSED] ABGR8888 pitch greater than min required
[21:20:10] [PASSED] ABGR8888 pitch less than min required
[21:20:10] [PASSED] ABGR8888 Invalid width
[21:20:10] [PASSED] ABGR8888 Invalid buffer handle
[21:20:10] [PASSED] No pixel format
[21:20:10] [PASSED] ABGR8888 Width 0
[21:20:10] [PASSED] ABGR8888 Height 0
[21:20:10] [PASSED] ABGR8888 Out of bound height * pitch combination
[21:20:10] [PASSED] ABGR8888 Large buffer offset
[21:20:10] [PASSED] ABGR8888 Buffer offset for inexistent plane
[21:20:10] [PASSED] ABGR8888 Invalid flag
[21:20:10] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[21:20:10] [PASSED] ABGR8888 Valid buffer modifier
[21:20:10] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[21:20:10] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] NV12 Normal sizes
[21:20:10] [PASSED] NV12 Max sizes
[21:20:10] [PASSED] NV12 Invalid pitch
[21:20:10] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[21:20:10] [PASSED] NV12 different modifier per-plane
[21:20:10] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[21:20:10] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] NV12 Modifier for inexistent plane
[21:20:10] [PASSED] NV12 Handle for inexistent plane
[21:20:10] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[21:20:10] [PASSED] YVU420 Normal sizes
[21:20:10] [PASSED] YVU420 Max sizes
[21:20:10] [PASSED] YVU420 Invalid pitch
[21:20:10] [PASSED] YVU420 Different pitches
[21:20:10] [PASSED] YVU420 Different buffer offsets/pitches
[21:20:10] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[21:20:10] [PASSED] YVU420 Valid modifier
[21:20:10] [PASSED] YVU420 Different modifiers per plane
[21:20:10] [PASSED] YVU420 Modifier for inexistent plane
[21:20:10] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[21:20:10] [PASSED] X0L2 Normal sizes
[21:20:10] [PASSED] X0L2 Max sizes
[21:20:10] [PASSED] X0L2 Invalid pitch
[21:20:10] [PASSED] X0L2 Pitch greater than minimum required
[21:20:10] [PASSED] X0L2 Handle for inexistent plane
[21:20:10] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[21:20:10] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[21:20:10] [PASSED] X0L2 Valid modifier
[21:20:10] [PASSED] X0L2 Modifier for inexistent plane
[21:20:10] =========== [PASSED] drm_test_framebuffer_create ===========
[21:20:10] [PASSED] drm_test_framebuffer_free
[21:20:10] [PASSED] drm_test_framebuffer_init
[21:20:10] [PASSED] drm_test_framebuffer_init_bad_format
[21:20:10] [PASSED] drm_test_framebuffer_init_dev_mismatch
[21:20:10] [PASSED] drm_test_framebuffer_lookup
[21:20:10] [PASSED] drm_test_framebuffer_lookup_inexistent
[21:20:10] [PASSED] drm_test_framebuffer_modifiers_not_supported
[21:20:10] ================= [PASSED] drm_framebuffer =================
[21:20:10] ================ drm_gem_shmem (8 subtests) ================
[21:20:10] [PASSED] drm_gem_shmem_test_obj_create
[21:20:10] [PASSED] drm_gem_shmem_test_obj_create_private
[21:20:10] [PASSED] drm_gem_shmem_test_pin_pages
[21:20:10] [PASSED] drm_gem_shmem_test_vmap
[21:20:10] [PASSED] drm_gem_shmem_test_get_pages_sgt
[21:20:10] [PASSED] drm_gem_shmem_test_get_sg_table
[21:20:10] [PASSED] drm_gem_shmem_test_madvise
[21:20:10] [PASSED] drm_gem_shmem_test_purge
[21:20:10] ================== [PASSED] drm_gem_shmem ==================
[21:20:10] === drm_atomic_helper_connector_hdmi_check (23 subtests) ===
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[21:20:10] [PASSED] drm_test_check_disable_connector
[21:20:10] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[21:20:10] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback
[21:20:10] [PASSED] drm_test_check_max_tmds_rate_format_fallback
[21:20:10] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[21:20:10] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[21:20:10] [PASSED] drm_test_check_output_bpc_dvi
[21:20:10] [PASSED] drm_test_check_output_bpc_format_vic_1
[21:20:10] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[21:20:10] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[21:20:10] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[21:20:10] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[21:20:10] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[21:20:10] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[21:20:10] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[21:20:10] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[21:20:10] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[21:20:10] [PASSED] drm_test_check_broadcast_rgb_value
[21:20:10] [PASSED] drm_test_check_bpc_8_value
[21:20:10] [PASSED] drm_test_check_bpc_10_value
[21:20:10] [PASSED] drm_test_check_bpc_12_value
[21:20:10] [PASSED] drm_test_check_format_value
[21:20:10] [PASSED] drm_test_check_tmds_char_value
[21:20:10] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[21:20:10] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[21:20:10] [PASSED] drm_test_check_mode_valid
[21:20:10] [PASSED] drm_test_check_mode_valid_reject
[21:20:10] [PASSED] drm_test_check_mode_valid_reject_rate
[21:20:10] [PASSED] drm_test_check_mode_valid_reject_max_clock
[21:20:10] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[21:20:10] ================= drm_managed (2 subtests) =================
[21:20:10] [PASSED] drm_test_managed_release_action
[21:20:10] [PASSED] drm_test_managed_run_action
[21:20:10] =================== [PASSED] drm_managed ===================
[21:20:10] =================== drm_mm (6 subtests) ====================
[21:20:10] [PASSED] drm_test_mm_init
[21:20:10] [PASSED] drm_test_mm_debug
[21:20:10] [PASSED] drm_test_mm_align32
[21:20:10] [PASSED] drm_test_mm_align64
[21:20:10] [PASSED] drm_test_mm_lowest
[21:20:10] [PASSED] drm_test_mm_highest
[21:20:10] ===================== [PASSED] drm_mm ======================
[21:20:10] ============= drm_modes_analog_tv (5 subtests) =============
[21:20:10] [PASSED] drm_test_modes_analog_tv_mono_576i
[21:20:10] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[21:20:10] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[21:20:10] [PASSED] drm_test_modes_analog_tv_pal_576i
[21:20:10] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[21:20:10] =============== [PASSED] drm_modes_analog_tv ===============
[21:20:10] ============== drm_plane_helper (2 subtests) ===============
[21:20:10] =============== drm_test_check_plane_state ================
[21:20:10] [PASSED] clipping_simple
[21:20:10] [PASSED] clipping_rotate_reflect
[21:20:10] [PASSED] positioning_simple
[21:20:10] [PASSED] upscaling
[21:20:10] [PASSED] downscaling
[21:20:10] [PASSED] rounding1
[21:20:10] [PASSED] rounding2
[21:20:10] [PASSED] rounding3
[21:20:10] [PASSED] rounding4
[21:20:10] =========== [PASSED] drm_test_check_plane_state ============
[21:20:10] =========== drm_test_check_invalid_plane_state ============
[21:20:10] [PASSED] positioning_invalid
[21:20:10] [PASSED] upscaling_invalid
[21:20:10] [PASSED] downscaling_invalid
[21:20:10] ======= [PASSED] drm_test_check_invalid_plane_state ========
[21:20:10] ================ [PASSED] drm_plane_helper =================
[21:20:10] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[21:20:10] ====== drm_test_connector_helper_tv_get_modes_check =======
[21:20:10] [PASSED] None
[21:20:10] [PASSED] PAL
[21:20:10] [PASSED] NTSC
[21:20:10] [PASSED] Both, NTSC Default
[21:20:10] [PASSED] Both, PAL Default
[21:20:10] [PASSED] Both, NTSC Default, with PAL on command-line
[21:20:10] [PASSED] Both, PAL Default, with NTSC on command-line
[21:20:10] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[21:20:10] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[21:20:10] ================== drm_rect (9 subtests) ===================
[21:20:10] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[21:20:10] [PASSED] drm_test_rect_clip_scaled_not_clipped
[21:20:10] [PASSED] drm_test_rect_clip_scaled_clipped
[21:20:10] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[21:20:10] ================= drm_test_rect_intersect =================
[21:20:10] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[21:20:10] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[21:20:10] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[21:20:10] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[21:20:10] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[21:20:10] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[21:20:10] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[21:20:10] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[21:20:10] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[21:20:10] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[21:20:10] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[21:20:10] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[21:20:10] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[21:20:10] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[21:20:10] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[21:20:10] ============= [PASSED] drm_test_rect_intersect =============
[21:20:10] ================ drm_test_rect_calc_hscale ================
[21:20:10] [PASSED] normal use
[21:20:10] [PASSED] out of max range
[21:20:10] [PASSED] out of min range
[21:20:10] [PASSED] zero dst
[21:20:10] [PASSED] negative src
[21:20:10] [PASSED] negative dst
[21:20:10] ============ [PASSED] drm_test_rect_calc_hscale ============
[21:20:10] ================ drm_test_rect_calc_vscale ================
[21:20:10] [PASSED] normal use
[21:20:10] [PASSED] out of max range
[21:20:10] [PASSED] out of min range
[21:20:10] [PASSED] zero dst
[21:20:10] [PASSED] negative src
[21:20:10] [PASSED] negative dst
[21:20:10] ============ [PASSED] drm_test_rect_calc_vscale ============
[21:20:10] ================== drm_test_rect_rotate ===================
[21:20:10] [PASSED] reflect-x
[21:20:10] [PASSED] reflect-y
[21:20:10] [PASSED] rotate-0
[21:20:10] [PASSED] rotate-90
[21:20:10] [PASSED] rotate-180
[21:20:10] [PASSED] rotate-270
[21:20:10] ============== [PASSED] drm_test_rect_rotate ===============
[21:20:10] ================ drm_test_rect_rotate_inv =================
[21:20:10] [PASSED] reflect-x
[21:20:10] [PASSED] reflect-y
[21:20:10] [PASSED] rotate-0
[21:20:10] [PASSED] rotate-90
[21:20:10] [PASSED] rotate-180
[21:20:10] [PASSED] rotate-270
[21:20:10] ============ [PASSED] drm_test_rect_rotate_inv =============
stty: 'standard input': Inappropriate ioctl for device
[21:20:10] ==================== [PASSED] drm_rect =====================
[21:20:10] ============================================================
[21:20:10] Testing complete. Ran 608 tests: passed: 608
[21:20:10] Elapsed time: 23.159s total, 1.740s configuring, 21.248s building, 0.141s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[21:20:10] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[21:20:12] 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
[21:20:20] Starting KUnit Kernel (1/1)...
[21:20:20] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[21:20:20] ================= ttm_device (5 subtests) ==================
[21:20:20] [PASSED] ttm_device_init_basic
[21:20:20] [PASSED] ttm_device_init_multiple
[21:20:20] [PASSED] ttm_device_fini_basic
[21:20:20] [PASSED] ttm_device_init_no_vma_man
[21:20:20] ================== ttm_device_init_pools ==================
[21:20:20] [PASSED] No DMA allocations, no DMA32 required
[21:20:20] [PASSED] DMA allocations, DMA32 required
[21:20:20] [PASSED] No DMA allocations, DMA32 required
[21:20:20] [PASSED] DMA allocations, no DMA32 required
[21:20:20] ============== [PASSED] ttm_device_init_pools ==============
[21:20:20] =================== [PASSED] ttm_device ====================
[21:20:20] ================== ttm_pool (8 subtests) ===================
[21:20:20] ================== ttm_pool_alloc_basic ===================
[21:20:20] [PASSED] One page
[21:20:20] [PASSED] More than one page
[21:20:20] [PASSED] Above the allocation limit
[21:20:20] [PASSED] One page, with coherent DMA mappings enabled
[21:20:20] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[21:20:20] ============== [PASSED] ttm_pool_alloc_basic ===============
[21:20:20] ============== ttm_pool_alloc_basic_dma_addr ==============
[21:20:20] [PASSED] One page
[21:20:20] [PASSED] More than one page
[21:20:20] [PASSED] Above the allocation limit
[21:20:20] [PASSED] One page, with coherent DMA mappings enabled
[21:20:20] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[21:20:20] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[21:20:20] [PASSED] ttm_pool_alloc_order_caching_match
[21:20:20] [PASSED] ttm_pool_alloc_caching_mismatch
[21:20:20] [PASSED] ttm_pool_alloc_order_mismatch
[21:20:20] [PASSED] ttm_pool_free_dma_alloc
[21:20:20] [PASSED] ttm_pool_free_no_dma_alloc
[21:20:20] [PASSED] ttm_pool_fini_basic
[21:20:20] ==================== [PASSED] ttm_pool =====================
[21:20:20] ================ ttm_resource (8 subtests) =================
[21:20:20] ================= ttm_resource_init_basic =================
[21:20:20] [PASSED] Init resource in TTM_PL_SYSTEM
[21:20:20] [PASSED] Init resource in TTM_PL_VRAM
[21:20:20] [PASSED] Init resource in a private placement
[21:20:20] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[21:20:20] ============= [PASSED] ttm_resource_init_basic =============
[21:20:20] [PASSED] ttm_resource_init_pinned
[21:20:20] [PASSED] ttm_resource_fini_basic
[21:20:20] [PASSED] ttm_resource_manager_init_basic
[21:20:20] [PASSED] ttm_resource_manager_usage_basic
[21:20:20] [PASSED] ttm_resource_manager_set_used_basic
[21:20:20] [PASSED] ttm_sys_man_alloc_basic
[21:20:20] [PASSED] ttm_sys_man_free_basic
[21:20:20] ================== [PASSED] ttm_resource ===================
[21:20:20] =================== ttm_tt (15 subtests) ===================
[21:20:20] ==================== ttm_tt_init_basic ====================
[21:20:20] [PASSED] Page-aligned size
[21:20:20] [PASSED] Extra pages requested
[21:20:20] ================ [PASSED] ttm_tt_init_basic ================
[21:20:20] [PASSED] ttm_tt_init_misaligned
[21:20:20] [PASSED] ttm_tt_fini_basic
[21:20:20] [PASSED] ttm_tt_fini_sg
[21:20:20] [PASSED] ttm_tt_fini_shmem
[21:20:20] [PASSED] ttm_tt_create_basic
[21:20:20] [PASSED] ttm_tt_create_invalid_bo_type
[21:20:20] [PASSED] ttm_tt_create_ttm_exists
[21:20:20] [PASSED] ttm_tt_create_failed
[21:20:20] [PASSED] ttm_tt_destroy_basic
[21:20:20] [PASSED] ttm_tt_populate_null_ttm
[21:20:20] [PASSED] ttm_tt_populate_populated_ttm
[21:20:20] [PASSED] ttm_tt_unpopulate_basic
[21:20:20] [PASSED] ttm_tt_unpopulate_empty_ttm
[21:20:20] [PASSED] ttm_tt_swapin_basic
[21:20:20] ===================== [PASSED] ttm_tt ======================
[21:20:20] =================== ttm_bo (14 subtests) ===================
[21:20:20] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[21:20:20] [PASSED] Cannot be interrupted and sleeps
[21:20:20] [PASSED] Cannot be interrupted, locks straight away
[21:20:20] [PASSED] Can be interrupted, sleeps
[21:20:20] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[21:20:20] [PASSED] ttm_bo_reserve_locked_no_sleep
[21:20:20] [PASSED] ttm_bo_reserve_no_wait_ticket
[21:20:20] [PASSED] ttm_bo_reserve_double_resv
[21:20:20] [PASSED] ttm_bo_reserve_interrupted
[21:20:20] [PASSED] ttm_bo_reserve_deadlock
[21:20:20] [PASSED] ttm_bo_unreserve_basic
[21:20:20] [PASSED] ttm_bo_unreserve_pinned
[21:20:20] [PASSED] ttm_bo_unreserve_bulk
[21:20:20] [PASSED] ttm_bo_put_basic
[21:20:20] [PASSED] ttm_bo_put_shared_resv
[21:20:20] [PASSED] ttm_bo_pin_basic
[21:20:20] [PASSED] ttm_bo_pin_unpin_resource
[21:20:20] [PASSED] ttm_bo_multiple_pin_one_unpin
[21:20:20] ===================== [PASSED] ttm_bo ======================
[21:20:20] ============== ttm_bo_validate (22 subtests) ===============
[21:20:20] ============== ttm_bo_init_reserved_sys_man ===============
[21:20:20] [PASSED] Buffer object for userspace
[21:20:20] [PASSED] Kernel buffer object
[21:20:20] [PASSED] Shared buffer object
[21:20:20] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[21:20:20] ============== ttm_bo_init_reserved_mock_man ==============
[21:20:20] [PASSED] Buffer object for userspace
[21:20:20] [PASSED] Kernel buffer object
[21:20:20] [PASSED] Shared buffer object
[21:20:20] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[21:20:20] [PASSED] ttm_bo_init_reserved_resv
[21:20:20] ================== ttm_bo_validate_basic ==================
[21:20:20] [PASSED] Buffer object for userspace
[21:20:20] [PASSED] Kernel buffer object
[21:20:20] [PASSED] Shared buffer object
[21:20:20] ============== [PASSED] ttm_bo_validate_basic ==============
[21:20:20] [PASSED] ttm_bo_validate_invalid_placement
[21:20:20] ============= ttm_bo_validate_same_placement ==============
[21:20:20] [PASSED] System manager
[21:20:20] [PASSED] VRAM manager
[21:20:20] ========= [PASSED] ttm_bo_validate_same_placement ==========
[21:20:20] [PASSED] ttm_bo_validate_failed_alloc
[21:20:20] [PASSED] ttm_bo_validate_pinned
[21:20:20] [PASSED] ttm_bo_validate_busy_placement
[21:20:20] ================ ttm_bo_validate_multihop =================
[21:20:20] [PASSED] Buffer object for userspace
[21:20:20] [PASSED] Kernel buffer object
[21:20:20] [PASSED] Shared buffer object
[21:20:20] ============ [PASSED] ttm_bo_validate_multihop =============
[21:20:20] ========== ttm_bo_validate_no_placement_signaled ==========
[21:20:20] [PASSED] Buffer object in system domain, no page vector
[21:20:20] [PASSED] Buffer object in system domain with an existing page vector
[21:20:20] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[21:20:20] ======== ttm_bo_validate_no_placement_not_signaled ========
[21:20:20] [PASSED] Buffer object for userspace
[21:20:20] [PASSED] Kernel buffer object
[21:20:20] [PASSED] Shared buffer object
[21:20:20] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[21:20:20] [PASSED] ttm_bo_validate_move_fence_signaled
[21:20:20] ========= ttm_bo_validate_move_fence_not_signaled =========
[21:20:20] [PASSED] Waits for GPU
[21:20:20] [PASSED] Tries to lock straight away
[21:20:20] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[21:20:20] [PASSED] ttm_bo_validate_swapout
[21:20:20] [PASSED] ttm_bo_validate_happy_evict
[21:20:20] [PASSED] ttm_bo_validate_all_pinned_evict
[21:20:20] [PASSED] ttm_bo_validate_allowed_only_evict
[21:20:20] [PASSED] ttm_bo_validate_deleted_evict
[21:20:20] [PASSED] ttm_bo_validate_busy_domain_evict
[21:20:20] [PASSED] ttm_bo_validate_evict_gutting
[21:20:20] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[21:20:20] ================= [PASSED] ttm_bo_validate =================
[21:20:20] ============================================================
[21:20:20] Testing complete. Ran 102 tests: passed: 102
[21:20:20] Elapsed time: 10.192s total, 1.773s configuring, 7.803s building, 0.524s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 22+ messages in thread* ✗ CI.Build: failure for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (6 preceding siblings ...)
2025-04-09 21:20 ` ✓ CI.KUnit: success " Patchwork
@ 2025-04-09 21:26 ` Patchwork
2025-04-10 12:53 ` ✓ CI.Patch_applied: success " Patchwork
` (3 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-09 21:26 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : failure
== Summary ==
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o
HDRTEST drivers/gpu/drm/i915/soc/intel_rom.h
HDRTEST drivers/gpu/drm/i915/soc/intel_dram.h
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o
HDRTEST drivers/gpu/drm/i915/soc/intel_gmch.h
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o
HDRTEST drivers/gpu/drm/i915/vlv_sideband.h
HDRTEST drivers/gpu/drm/i915/vlv_sideband_reg.h
HDRTEST drivers/gpu/drm/i915/vlv_suspend.h
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_translation_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_wrapper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_utils.o
LD [M] drivers/gpu/drm/i915/i915.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce120/dce120_timing_generator.o
LD [M] drivers/gpu/drm/i915/kvmgt.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_compressor.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_compressor.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_regamma_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_csc_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_mem_input_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_transform_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce80/dce80_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_hw_sequencer.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_resource.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/hdcp/hdcp_msg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_easf_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_isharp_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_fixpt31_32.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_custom_float.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stat.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_resource.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_hw_sequencer.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_sink.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_surface.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_debug.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_enc_cfg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_exports.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_vm_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_dmub_srv.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_edid_parser.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_spl_translate.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/freesync/freesync.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_gamma.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_table.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/info_packet/info_packet.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/power/power_helpers.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv_stat.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_reg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn20.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn21.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn30.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn301.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn302.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn303.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn31.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn314.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn315.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn316.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn32.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn35.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn351.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn36.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn401.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_ddc.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_log.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_psp.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_execution.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_transition.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_execution.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_transition.o
CC [M] drivers/gpu/drm/amd/amdgpu/amdgpu_isp.o
CC [M] drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.o
CC [M] drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.o
LD [M] drivers/gpu/drm/amd/amdgpu/amdgpu.o
make[5]: *** [../scripts/Makefile.build:461: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:461: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:461: drivers] Error 2
make[2]: *** [/kernel/Makefile:2006: .] Error 2
make[1]: *** [/kernel/Makefile:248: __sub-make] Error 2
make[1]: Leaving directory '/kernel/build64-debug'
make: *** [Makefile:248: __sub-make] Error 2
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 22+ messages in thread* ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (7 preceding siblings ...)
2025-04-09 21:26 ` ✗ CI.Build: failure " Patchwork
@ 2025-04-10 12:53 ` Patchwork
2025-04-10 12:54 ` ✗ CI.checkpatch: warning " Patchwork
` (2 subsequent siblings)
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-10 12:53 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 85a6d35810c7 drm-tip: 2025y-04m-10d-12h-06m-19s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/vf: Divide GGTT ballooning into allocation and insertion
Applying: drm/xe/vf: Shifting GGTT area post migration
Applying: drm/xe/guc: Introduce enum with offsets for context register H2Gs
Applying: drm/xe/vf: Fixup CTB send buffer messages after migration
^ permalink raw reply [flat|nested] 22+ messages in thread* ✗ CI.checkpatch: warning for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (8 preceding siblings ...)
2025-04-10 12:53 ` ✓ CI.Patch_applied: success " Patchwork
@ 2025-04-10 12:54 ` Patchwork
2025-04-10 12:55 ` ✓ CI.KUnit: success " Patchwork
2025-04-10 13:09 ` ✗ CI.Build: failure " Patchwork
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-10 12:54 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
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
13a92ce9fd458ebd6064f23cec8c39c53d02ed26
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit c1a1f4763a24d572aa64229c6615424586cee8a0
Author: Tomasz Lis <tomasz.lis@intel.com>
Date: Wed Apr 9 23:13:40 2025 +0200
drm/xe/vf: Fixup CTB send buffer messages after migration
During post-migration recovery of a VF, it is necessary to update
GGTT references included in messages which are going to be sent
to GuC. GuC will start consuming messages after VF KMD will inform
it about fixups being done; before that, the VF KMD is expected
to update any H2G messages which are already in send buffer but
were not consumed by GuC.
Only a small subset of messages allowed for VFs have GGTT references
in them. This patch adds the functionality to parse the CTB send
ring buffer and shift addresses contained within.
While fixing the CTB content, ct->lock is not taken. This means
the only barrier taken remains GGTT address lock - which is ok,
because only requests with GGTT addresses matter, but it also means
tail changes can happen during the CTB fixups execution (which may
be ignored as any new messages will not have anything to fix).
The GGTT address locking will be introduced in a future series.
v2: removed storing shift as that's now done in VMA nodes patch;
macros to inlines; warns to asserts; log messages fixes (Michal)
v3: removed inline keywords, enums for offsets in CTB messages,
less error messages, if return unused then made functs void (Michal)
v4: update the cached head before starting fixups
v5: removed/updated comments, wrapped lines, converted assert into
error, enums for offsets to separate patch, reused xe_map_rd
v6: define xe_map_*_array() macros, support CTB wrap which divides
a message, updated comments, moved one function to an earlier patch
v7: renamed few functions, wider use on previously introduced helper,
separate cases in parsing messges, documented a static funct
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
+ /mt/dim checkpatch 85a6d35810c7e3b3db9a8c5191f12846f68620e9 drm-intel
1c44ee9b9941 drm/xe/vf: Divide GGTT ballooning into allocation and insertion
-:32: WARNING:SPDX_LICENSE_TAG: Missing or malformed SPDX-License-Identifier tag in line 1
#32: FILE: drivers/gpu/drm/xe/xe_ggtt.c:1:
+/// SPDX-License-Identifier: MIT
-:213: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#213: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:619:
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], start, end);
-:225: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#225: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:627:
+ err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[1], start, end);
total: 0 errors, 3 warnings, 0 checks, 273 lines checked
303a14d5716a drm/xe/vf: Shifting GGTT area post migration
e09a8cc8addc drm/xe/guc: Introduce enum with offsets for context register H2Gs
c1a1f4763a24 drm/xe/vf: Fixup CTB send buffer messages after migration
-:84: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#84: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1655:
+static void ct_fixup_ggtt_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
-:135: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#135: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1706:
+static int ct_fixup_ggtt_in_buffer(struct xe_guc_ct *ct, struct guc_ctb *h2g,
+ s64 shift, u32 *mhead, s32 avail)
-:212: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#212: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1783:
+ xe_gt_err(gt, "Corrupted H2G descriptor head=%u tail=%u size=%u, fixups not applied\n",
+ head, tail, size);
total: 0 errors, 0 warnings, 3 checks, 235 lines checked
^ permalink raw reply [flat|nested] 22+ messages in thread* ✓ CI.KUnit: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (9 preceding siblings ...)
2025-04-10 12:54 ` ✗ CI.checkpatch: warning " Patchwork
@ 2025-04-10 12:55 ` Patchwork
2025-04-10 13:09 ` ✗ CI.Build: failure " Patchwork
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-10 12:55 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[12:54:22] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:54:26] 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
../drivers/gpu/drm/xe/xe_ggtt.c:490:6: warning: no previous prototype for ‘xe_ggtt_assert_fit’ [-Wmissing-prototypes]
490 | void xe_ggtt_assert_fit(struct xe_ggtt *ggtt, u64 start, u64 size)
| ^~~~~~~~~~~~~~~~~~
[12:54:52] Starting KUnit Kernel (1/1)...
[12:54:52] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:54:53] ================== guc_buf (11 subtests) ===================
[12:54:53] [PASSED] test_smallest
[12:54:53] [PASSED] test_largest
[12:54:53] [PASSED] test_granular
[12:54:53] [PASSED] test_unique
[12:54:53] [PASSED] test_overlap
[12:54:53] [PASSED] test_reusable
[12:54:53] [PASSED] test_too_big
[12:54:53] [PASSED] test_flush
[12:54:53] [PASSED] test_lookup
[12:54:53] [PASSED] test_data
[12:54:53] [PASSED] test_class
[12:54:53] ===================== [PASSED] guc_buf =====================
[12:54:53] =================== guc_dbm (7 subtests) ===================
[12:54:53] [PASSED] test_empty
[12:54:53] [PASSED] test_default
[12:54:53] ======================== test_size ========================
[12:54:53] [PASSED] 4
[12:54:53] [PASSED] 8
[12:54:53] [PASSED] 32
[12:54:53] [PASSED] 256
[12:54:53] ==================== [PASSED] test_size ====================
[12:54:53] ======================= test_reuse ========================
[12:54:53] [PASSED] 4
[12:54:53] [PASSED] 8
[12:54:53] [PASSED] 32
[12:54:53] [PASSED] 256
[12:54:53] =================== [PASSED] test_reuse ====================
[12:54:53] =================== test_range_overlap ====================
[12:54:53] [PASSED] 4
[12:54:53] [PASSED] 8
[12:54:53] [PASSED] 32
[12:54:53] [PASSED] 256
[12:54:53] =============== [PASSED] test_range_overlap ================
[12:54:53] =================== test_range_compact ====================
[12:54:53] [PASSED] 4
[12:54:53] [PASSED] 8
[12:54:53] [PASSED] 32
[12:54:53] [PASSED] 256
[12:54:53] =============== [PASSED] test_range_compact ================
[12:54:53] ==================== test_range_spare =====================
[12:54:53] [PASSED] 4
[12:54:53] [PASSED] 8
[12:54:53] [PASSED] 32
[12:54:53] [PASSED] 256
[12:54:53] ================ [PASSED] test_range_spare =================
[12:54:53] ===================== [PASSED] guc_dbm =====================
[12:54:53] =================== guc_idm (6 subtests) ===================
[12:54:53] [PASSED] bad_init
[12:54:53] [PASSED] no_init
[12:54:53] [PASSED] init_fini
[12:54:53] [PASSED] check_used
[12:54:53] [PASSED] check_quota
[12:54:53] [PASSED] check_all
[12:54:53] ===================== [PASSED] guc_idm =====================
[12:54:53] ================== no_relay (3 subtests) ===================
[12:54:53] [PASSED] xe_drops_guc2pf_if_not_ready
[12:54:53] [PASSED] xe_drops_guc2vf_if_not_ready
[12:54:53] [PASSED] xe_rejects_send_if_not_ready
[12:54:53] ==================== [PASSED] no_relay =====================
[12:54:53] ================== pf_relay (14 subtests) ==================
[12:54:53] [PASSED] pf_rejects_guc2pf_too_short
[12:54:53] [PASSED] pf_rejects_guc2pf_too_long
[12:54:53] [PASSED] pf_rejects_guc2pf_no_payload
[12:54:53] [PASSED] pf_fails_no_payload
[12:54:53] [PASSED] pf_fails_bad_origin
[12:54:53] [PASSED] pf_fails_bad_type
[12:54:53] [PASSED] pf_txn_reports_error
[12:54:53] [PASSED] pf_txn_sends_pf2guc
[12:54:53] [PASSED] pf_sends_pf2guc
[12:54:53] [SKIPPED] pf_loopback_nop
[12:54:53] [SKIPPED] pf_loopback_echo
[12:54:53] [SKIPPED] pf_loopback_fail
[12:54:53] [SKIPPED] pf_loopback_busy
[12:54:53] [SKIPPED] pf_loopback_retry
[12:54:53] ==================== [PASSED] pf_relay =====================
[12:54:53] ================== vf_relay (3 subtests) ===================
[12:54:53] [PASSED] vf_rejects_guc2vf_too_short
[12:54:53] [PASSED] vf_rejects_guc2vf_too_long
[12:54:53] [PASSED] vf_rejects_guc2vf_no_payload
[12:54:53] ==================== [PASSED] vf_relay =====================
[12:54:53] ================= pf_service (11 subtests) =================
[12:54:53] [PASSED] pf_negotiate_any
[12:54:53] [PASSED] pf_negotiate_base_match
[12:54:53] [PASSED] pf_negotiate_base_newer
[12:54:53] [PASSED] pf_negotiate_base_next
[12:54:53] [SKIPPED] pf_negotiate_base_older
[12:54:53] [PASSED] pf_negotiate_base_prev
[12:54:53] [PASSED] pf_negotiate_latest_match
[12:54:53] [PASSED] pf_negotiate_latest_newer
[12:54:53] [PASSED] pf_negotiate_latest_next
[12:54:53] [SKIPPED] pf_negotiate_latest_older
[12:54:53] [SKIPPED] pf_negotiate_latest_prev
[12:54:53] =================== [PASSED] pf_service ====================
[12:54:53] ===================== lmtt (1 subtest) =====================
[12:54:53] ======================== test_ops =========================
[12:54:53] [PASSED] 2-level
[12:54:53] [PASSED] multi-level
[12:54:53] ==================== [PASSED] test_ops =====================
[12:54:53] ====================== [PASSED] lmtt =======================
[12:54:53] =================== xe_mocs (2 subtests) ===================
[12:54:53] ================ xe_live_mocs_kernel_kunit ================
[12:54:53] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[12:54:53] ================ xe_live_mocs_reset_kunit =================
[12:54:53] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[12:54:53] ==================== [SKIPPED] xe_mocs =====================
[12:54:53] ================= xe_migrate (2 subtests) ==================
[12:54:53] ================= xe_migrate_sanity_kunit =================
[12:54:53] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[12:54:53] ================== xe_validate_ccs_kunit ==================
[12:54:53] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[12:54:53] =================== [SKIPPED] xe_migrate ===================
[12:54:53] ================== xe_dma_buf (1 subtest) ==================
[12:54:53] ==================== xe_dma_buf_kunit =====================
[12:54:53] ================ [SKIPPED] xe_dma_buf_kunit ================
[12:54:53] =================== [SKIPPED] xe_dma_buf ===================
[12:54:53] ================= xe_bo_shrink (1 subtest) =================
[12:54:53] =================== xe_bo_shrink_kunit ====================
[12:54:53] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[12:54:53] ================== [SKIPPED] xe_bo_shrink ==================
[12:54:53] ==================== xe_bo (2 subtests) ====================
[12:54:53] ================== xe_ccs_migrate_kunit ===================
[12:54:53] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[12:54:53] ==================== xe_bo_evict_kunit ====================
[12:54:53] =============== [SKIPPED] xe_bo_evict_kunit ================
[12:54:53] ===================== [SKIPPED] xe_bo ======================
[12:54:53] ==================== args (11 subtests) ====================
[12:54:53] [PASSED] count_args_test
[12:54:53] [PASSED] call_args_example
[12:54:53] [PASSED] call_args_test
[12:54:53] [PASSED] drop_first_arg_example
[12:54:53] [PASSED] drop_first_arg_test
[12:54:53] [PASSED] first_arg_example
[12:54:53] [PASSED] first_arg_test
[12:54:53] [PASSED] last_arg_example
[12:54:53] [PASSED] last_arg_test
[12:54:53] [PASSED] pick_arg_example
[12:54:53] [PASSED] sep_comma_example
[12:54:53] ====================== [PASSED] args =======================
[12:54:53] =================== xe_pci (2 subtests) ====================
[12:54:53] [PASSED] xe_gmdid_graphics_ip
[12:54:53] [PASSED] xe_gmdid_media_ip
[12:54:53] ===================== [PASSED] xe_pci ======================
[12:54:53] =================== xe_rtp (2 subtests) ====================
[12:54:53] =============== xe_rtp_process_to_sr_tests ================
[12:54:53] [PASSED] coalesce-same-reg
[12:54:53] [PASSED] no-match-no-add
[12:54:53] [PASSED] match-or
[12:54:53] [PASSED] match-or-xfail
stty: 'standard input': Inappropriate ioctl for device
[12:54:53] [PASSED] no-match-no-add-multiple-rules
[12:54:53] [PASSED] two-regs-two-entries
[12:54:53] [PASSED] clr-one-set-other
[12:54:53] [PASSED] set-field
[12:54:53] [PASSED] conflict-duplicate
[12:54:53] [PASSED] conflict-not-disjoint
[12:54:53] [PASSED] conflict-reg-type
[12:54:53] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[12:54:53] ================== xe_rtp_process_tests ===================
[12:54:53] [PASSED] active1
[12:54:53] [PASSED] active2
[12:54:53] [PASSED] active-inactive
[12:54:53] [PASSED] inactive-active
[12:54:53] [PASSED] inactive-1st_or_active-inactive
[12:54:53] [PASSED] inactive-2nd_or_active-inactive
[12:54:53] [PASSED] inactive-last_or_active-inactive
[12:54:53] [PASSED] inactive-no_or_active-inactive
[12:54:53] ============== [PASSED] xe_rtp_process_tests ===============
[12:54:53] ===================== [PASSED] xe_rtp ======================
[12:54:53] ==================== xe_wa (1 subtest) =====================
[12:54:53] ======================== xe_wa_gt =========================
[12:54:53] [PASSED] TIGERLAKE (B0)
[12:54:53] [PASSED] DG1 (A0)
[12:54:53] [PASSED] DG1 (B0)
[12:54:53] [PASSED] ALDERLAKE_S (A0)
[12:54:53] [PASSED] ALDERLAKE_S (B0)
[12:54:53] [PASSED] ALDERLAKE_S (C0)
[12:54:53] [PASSED] ALDERLAKE_S (D0)
[12:54:53] [PASSED] ALDERLAKE_P (A0)
[12:54:53] [PASSED] ALDERLAKE_P (B0)
[12:54:53] [PASSED] ALDERLAKE_P (C0)
[12:54:53] [PASSED] ALDERLAKE_S_RPLS (D0)
[12:54:53] [PASSED] ALDERLAKE_P_RPLU (E0)
[12:54:53] [PASSED] DG2_G10 (C0)
[12:54:53] [PASSED] DG2_G11 (B1)
[12:54:53] [PASSED] DG2_G12 (A1)
[12:54:53] [PASSED] METEORLAKE (g:A0, m:A0)
[12:54:53] [PASSED] METEORLAKE (g:A0, m:A0)
[12:54:53] [PASSED] METEORLAKE (g:A0, m:A0)
[12:54:53] [PASSED] LUNARLAKE (g:A0, m:A0)
[12:54:53] [PASSED] LUNARLAKE (g:B0, m:A0)
[12:54:53] [PASSED] BATTLEMAGE (g:A0, m:A1)
[12:54:53] ==================== [PASSED] xe_wa_gt =====================
[12:54:53] ====================== [PASSED] xe_wa ======================
[12:54:53] ============================================================
[12:54:53] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[12:54:53] Elapsed time: 30.924s total, 4.269s configuring, 26.339s building, 0.285s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[12:54:53] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:54:55] 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
[12:55:16] Starting KUnit Kernel (1/1)...
[12:55:16] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:55:16] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[12:55:16] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[12:55:16] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[12:55:16] =========== drm_validate_clone_mode (2 subtests) ===========
[12:55:16] ============== drm_test_check_in_clone_mode ===============
[12:55:16] [PASSED] in_clone_mode
[12:55:16] [PASSED] not_in_clone_mode
[12:55:16] ========== [PASSED] drm_test_check_in_clone_mode ===========
[12:55:16] =============== drm_test_check_valid_clones ===============
[12:55:16] [PASSED] not_in_clone_mode
[12:55:16] [PASSED] valid_clone
[12:55:16] [PASSED] invalid_clone
[12:55:16] =========== [PASSED] drm_test_check_valid_clones ===========
[12:55:16] ============= [PASSED] drm_validate_clone_mode =============
[12:55:16] ============= drm_validate_modeset (1 subtest) =============
[12:55:16] [PASSED] drm_test_check_connector_changed_modeset
[12:55:16] ============== [PASSED] drm_validate_modeset ===============
[12:55:16] ====== drm_test_bridge_get_current_state (2 subtests) ======
[12:55:16] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[12:55:16] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[12:55:16] ======== [PASSED] drm_test_bridge_get_current_state ========
[12:55:16] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[12:55:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[12:55:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[12:55:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[12:55:16] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[12:55:16] ================== drm_buddy (7 subtests) ==================
[12:55:16] [PASSED] drm_test_buddy_alloc_limit
[12:55:16] [PASSED] drm_test_buddy_alloc_optimistic
[12:55:16] [PASSED] drm_test_buddy_alloc_pessimistic
[12:55:16] [PASSED] drm_test_buddy_alloc_pathological
[12:55:16] [PASSED] drm_test_buddy_alloc_contiguous
[12:55:16] [PASSED] drm_test_buddy_alloc_clear
[12:55:16] [PASSED] drm_test_buddy_alloc_range_bias
[12:55:16] ==================== [PASSED] drm_buddy ====================
[12:55:16] ============= drm_cmdline_parser (40 subtests) =============
[12:55:16] [PASSED] drm_test_cmdline_force_d_only
[12:55:16] [PASSED] drm_test_cmdline_force_D_only_dvi
[12:55:16] [PASSED] drm_test_cmdline_force_D_only_hdmi
[12:55:16] [PASSED] drm_test_cmdline_force_D_only_not_digital
[12:55:16] [PASSED] drm_test_cmdline_force_e_only
[12:55:16] [PASSED] drm_test_cmdline_res
[12:55:16] [PASSED] drm_test_cmdline_res_vesa
[12:55:16] [PASSED] drm_test_cmdline_res_vesa_rblank
[12:55:16] [PASSED] drm_test_cmdline_res_rblank
[12:55:16] [PASSED] drm_test_cmdline_res_bpp
[12:55:16] [PASSED] drm_test_cmdline_res_refresh
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[12:55:16] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[12:55:16] [PASSED] drm_test_cmdline_res_margins_force_on
[12:55:16] [PASSED] drm_test_cmdline_res_vesa_margins
[12:55:16] [PASSED] drm_test_cmdline_name
[12:55:16] [PASSED] drm_test_cmdline_name_bpp
[12:55:16] [PASSED] drm_test_cmdline_name_option
[12:55:16] [PASSED] drm_test_cmdline_name_bpp_option
[12:55:16] [PASSED] drm_test_cmdline_rotate_0
[12:55:16] [PASSED] drm_test_cmdline_rotate_90
[12:55:16] [PASSED] drm_test_cmdline_rotate_180
[12:55:16] [PASSED] drm_test_cmdline_rotate_270
[12:55:16] [PASSED] drm_test_cmdline_hmirror
[12:55:16] [PASSED] drm_test_cmdline_vmirror
[12:55:16] [PASSED] drm_test_cmdline_margin_options
[12:55:16] [PASSED] drm_test_cmdline_multiple_options
[12:55:16] [PASSED] drm_test_cmdline_bpp_extra_and_option
[12:55:16] [PASSED] drm_test_cmdline_extra_and_option
[12:55:16] [PASSED] drm_test_cmdline_freestanding_options
[12:55:16] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[12:55:16] [PASSED] drm_test_cmdline_panel_orientation
[12:55:16] ================ drm_test_cmdline_invalid =================
[12:55:16] [PASSED] margin_only
[12:55:16] [PASSED] interlace_only
[12:55:16] [PASSED] res_missing_x
[12:55:16] [PASSED] res_missing_y
[12:55:16] [PASSED] res_bad_y
[12:55:16] [PASSED] res_missing_y_bpp
[12:55:16] [PASSED] res_bad_bpp
[12:55:16] [PASSED] res_bad_refresh
[12:55:16] [PASSED] res_bpp_refresh_force_on_off
[12:55:16] [PASSED] res_invalid_mode
[12:55:16] [PASSED] res_bpp_wrong_place_mode
[12:55:16] [PASSED] name_bpp_refresh
[12:55:16] [PASSED] name_refresh
[12:55:16] [PASSED] name_refresh_wrong_mode
[12:55:16] [PASSED] name_refresh_invalid_mode
[12:55:16] [PASSED] rotate_multiple
[12:55:16] [PASSED] rotate_invalid_val
[12:55:16] [PASSED] rotate_truncated
[12:55:16] [PASSED] invalid_option
[12:55:16] [PASSED] invalid_tv_option
[12:55:16] [PASSED] truncated_tv_option
[12:55:16] ============ [PASSED] drm_test_cmdline_invalid =============
[12:55:16] =============== drm_test_cmdline_tv_options ===============
[12:55:16] [PASSED] NTSC
[12:55:16] [PASSED] NTSC_443
[12:55:16] [PASSED] NTSC_J
[12:55:16] [PASSED] PAL
[12:55:16] [PASSED] PAL_M
[12:55:16] [PASSED] PAL_N
[12:55:16] [PASSED] SECAM
[12:55:16] [PASSED] MONO_525
[12:55:16] [PASSED] MONO_625
[12:55:16] =========== [PASSED] drm_test_cmdline_tv_options ===========
[12:55:16] =============== [PASSED] drm_cmdline_parser ================
[12:55:16] ========== drmm_connector_hdmi_init (20 subtests) ==========
[12:55:16] [PASSED] drm_test_connector_hdmi_init_valid
[12:55:16] [PASSED] drm_test_connector_hdmi_init_bpc_8
[12:55:16] [PASSED] drm_test_connector_hdmi_init_bpc_10
[12:55:16] [PASSED] drm_test_connector_hdmi_init_bpc_12
[12:55:16] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[12:55:16] [PASSED] drm_test_connector_hdmi_init_bpc_null
[12:55:16] [PASSED] drm_test_connector_hdmi_init_formats_empty
[12:55:16] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[12:55:16] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[12:55:16] [PASSED] supported_formats=0x9 yuv420_allowed=1
[12:55:16] [PASSED] supported_formats=0x9 yuv420_allowed=0
[12:55:16] [PASSED] supported_formats=0x3 yuv420_allowed=1
[12:55:16] [PASSED] supported_formats=0x3 yuv420_allowed=0
[12:55:16] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[12:55:16] [PASSED] drm_test_connector_hdmi_init_null_ddc
[12:55:16] [PASSED] drm_test_connector_hdmi_init_null_product
[12:55:16] [PASSED] drm_test_connector_hdmi_init_null_vendor
[12:55:16] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[12:55:16] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[12:55:16] [PASSED] drm_test_connector_hdmi_init_product_valid
[12:55:16] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[12:55:16] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[12:55:16] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[12:55:16] ========= drm_test_connector_hdmi_init_type_valid =========
[12:55:16] [PASSED] HDMI-A
[12:55:16] [PASSED] HDMI-B
[12:55:16] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[12:55:16] ======== drm_test_connector_hdmi_init_type_invalid ========
[12:55:16] [PASSED] Unknown
[12:55:16] [PASSED] VGA
[12:55:16] [PASSED] DVI-I
[12:55:16] [PASSED] DVI-D
[12:55:16] [PASSED] DVI-A
[12:55:16] [PASSED] Composite
[12:55:16] [PASSED] SVIDEO
[12:55:16] [PASSED] LVDS
[12:55:16] [PASSED] Component
[12:55:16] [PASSED] DIN
[12:55:16] [PASSED] DP
[12:55:16] [PASSED] TV
[12:55:16] [PASSED] eDP
[12:55:16] [PASSED] Virtual
[12:55:16] [PASSED] DSI
[12:55:16] [PASSED] DPI
[12:55:16] [PASSED] Writeback
[12:55:16] [PASSED] SPI
[12:55:16] [PASSED] USB
[12:55:16] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[12:55:16] ============ [PASSED] drmm_connector_hdmi_init =============
[12:55:16] ============= drmm_connector_init (3 subtests) =============
[12:55:16] [PASSED] drm_test_drmm_connector_init
[12:55:16] [PASSED] drm_test_drmm_connector_init_null_ddc
[12:55:16] ========= drm_test_drmm_connector_init_type_valid =========
[12:55:16] [PASSED] Unknown
[12:55:16] [PASSED] VGA
[12:55:16] [PASSED] DVI-I
[12:55:16] [PASSED] DVI-D
[12:55:16] [PASSED] DVI-A
[12:55:16] [PASSED] Composite
[12:55:16] [PASSED] SVIDEO
[12:55:16] [PASSED] LVDS
[12:55:16] [PASSED] Component
[12:55:16] [PASSED] DIN
[12:55:16] [PASSED] DP
[12:55:16] [PASSED] HDMI-A
[12:55:16] [PASSED] HDMI-B
[12:55:16] [PASSED] TV
[12:55:16] [PASSED] eDP
[12:55:16] [PASSED] Virtual
[12:55:16] [PASSED] DSI
[12:55:16] [PASSED] DPI
[12:55:16] [PASSED] Writeback
[12:55:16] [PASSED] SPI
[12:55:16] [PASSED] USB
[12:55:16] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[12:55:16] =============== [PASSED] drmm_connector_init ===============
[12:55:16] ========= drm_connector_dynamic_init (6 subtests) ==========
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_init
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_init_properties
[12:55:16] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[12:55:16] [PASSED] Unknown
[12:55:16] [PASSED] VGA
[12:55:16] [PASSED] DVI-I
[12:55:16] [PASSED] DVI-D
[12:55:16] [PASSED] DVI-A
[12:55:16] [PASSED] Composite
[12:55:16] [PASSED] SVIDEO
[12:55:16] [PASSED] LVDS
[12:55:16] [PASSED] Component
[12:55:16] [PASSED] DIN
[12:55:16] [PASSED] DP
[12:55:16] [PASSED] HDMI-A
[12:55:16] [PASSED] HDMI-B
[12:55:16] [PASSED] TV
[12:55:16] [PASSED] eDP
[12:55:16] [PASSED] Virtual
[12:55:16] [PASSED] DSI
[12:55:16] [PASSED] DPI
[12:55:16] [PASSED] Writeback
[12:55:16] [PASSED] SPI
[12:55:16] [PASSED] USB
[12:55:16] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[12:55:16] ======== drm_test_drm_connector_dynamic_init_name =========
[12:55:16] [PASSED] Unknown
[12:55:16] [PASSED] VGA
[12:55:16] [PASSED] DVI-I
[12:55:16] [PASSED] DVI-D
[12:55:16] [PASSED] DVI-A
[12:55:16] [PASSED] Composite
[12:55:16] [PASSED] SVIDEO
[12:55:16] [PASSED] LVDS
[12:55:16] [PASSED] Component
[12:55:16] [PASSED] DIN
[12:55:16] [PASSED] DP
[12:55:16] [PASSED] HDMI-A
[12:55:16] [PASSED] HDMI-B
[12:55:16] [PASSED] TV
[12:55:16] [PASSED] eDP
[12:55:16] [PASSED] Virtual
[12:55:16] [PASSED] DSI
[12:55:16] [PASSED] DPI
[12:55:16] [PASSED] Writeback
[12:55:16] [PASSED] SPI
[12:55:16] [PASSED] USB
[12:55:16] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[12:55:16] =========== [PASSED] drm_connector_dynamic_init ============
[12:55:16] ==== drm_connector_dynamic_register_early (4 subtests) =====
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[12:55:16] ====== [PASSED] drm_connector_dynamic_register_early =======
[12:55:16] ======= drm_connector_dynamic_register (7 subtests) ========
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[12:55:16] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[12:55:16] ========= [PASSED] drm_connector_dynamic_register ==========
[12:55:16] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[12:55:16] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[12:55:16] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[12:55:16] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[12:55:16] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[12:55:16] ========== drm_test_get_tv_mode_from_name_valid ===========
[12:55:16] [PASSED] NTSC
[12:55:16] [PASSED] NTSC-443
[12:55:16] [PASSED] NTSC-J
[12:55:16] [PASSED] PAL
[12:55:16] [PASSED] PAL-M
[12:55:16] [PASSED] PAL-N
[12:55:16] [PASSED] SECAM
[12:55:16] [PASSED] Mono
[12:55:16] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[12:55:16] [PASSED] drm_test_get_tv_mode_from_name_truncated
[12:55:16] ============ [PASSED] drm_get_tv_mode_from_name ============
[12:55:16] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[12:55:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[12:55:16] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[12:55:16] [PASSED] VIC 96
[12:55:16] [PASSED] VIC 97
[12:55:16] [PASSED] VIC 101
[12:55:16] [PASSED] VIC 102
[12:55:16] [PASSED] VIC 106
[12:55:16] [PASSED] VIC 107
[12:55:16] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[12:55:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[12:55:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[12:55:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[12:55:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[12:55:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[12:55:16] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[12:55:16] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[12:55:16] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[12:55:16] [PASSED] Automatic
[12:55:16] [PASSED] Full
[12:55:16] [PASSED] Limited 16:235
[12:55:16] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[12:55:16] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[12:55:16] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[12:55:16] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[12:55:16] === drm_test_drm_hdmi_connector_get_output_format_name ====
[12:55:16] [PASSED] RGB
[12:55:16] [PASSED] YUV 4:2:0
[12:55:16] [PASSED] YUV 4:2:2
[12:55:16] [PASSED] YUV 4:4:4
[12:55:16] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[12:55:16] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[12:55:16] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[12:55:16] ============= drm_damage_helper (21 subtests) ==============
[12:55:16] [PASSED] drm_test_damage_iter_no_damage
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_src_moved
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_not_visible
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[12:55:16] [PASSED] drm_test_damage_iter_no_damage_no_fb
[12:55:16] [PASSED] drm_test_damage_iter_simple_damage
[12:55:16] [PASSED] drm_test_damage_iter_single_damage
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_outside_src
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_src_moved
[12:55:16] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[12:55:16] [PASSED] drm_test_damage_iter_damage
[12:55:16] [PASSED] drm_test_damage_iter_damage_one_intersect
[12:55:16] [PASSED] drm_test_damage_iter_damage_one_outside
[12:55:16] [PASSED] drm_test_damage_iter_damage_src_moved
[12:55:16] [PASSED] drm_test_damage_iter_damage_not_visible
[12:55:16] ================ [PASSED] drm_damage_helper ================
[12:55:16] ============== drm_dp_mst_helper (3 subtests) ==============
[12:55:16] ============== drm_test_dp_mst_calc_pbn_mode ==============
[12:55:16] [PASSED] Clock 154000 BPP 30 DSC disabled
[12:55:16] [PASSED] Clock 234000 BPP 30 DSC disabled
[12:55:16] [PASSED] Clock 297000 BPP 24 DSC disabled
[12:55:16] [PASSED] Clock 332880 BPP 24 DSC enabled
[12:55:16] [PASSED] Clock 324540 BPP 24 DSC enabled
[12:55:16] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[12:55:16] ============== drm_test_dp_mst_calc_pbn_div ===============
[12:55:16] [PASSED] Link rate 2000000 lane count 4
[12:55:16] [PASSED] Link rate 2000000 lane count 2
[12:55:16] [PASSED] Link rate 2000000 lane count 1
[12:55:16] [PASSED] Link rate 1350000 lane count 4
[12:55:16] [PASSED] Link rate 1350000 lane count 2
[12:55:16] [PASSED] Link rate 1350000 lane count 1
[12:55:16] [PASSED] Link rate 1000000 lane count 4
[12:55:16] [PASSED] Link rate 1000000 lane count 2
[12:55:16] [PASSED] Link rate 1000000 lane count 1
[12:55:16] [PASSED] Link rate 810000 lane count 4
[12:55:16] [PASSED] Link rate 810000 lane count 2
[12:55:16] [PASSED] Link rate 810000 lane count 1
[12:55:16] [PASSED] Link rate 540000 lane count 4
[12:55:16] [PASSED] Link rate 540000 lane count 2
[12:55:16] [PASSED] Link rate 540000 lane count 1
[12:55:16] [PASSED] Link rate 270000 lane count 4
[12:55:16] [PASSED] Link rate 270000 lane count 2
[12:55:16] [PASSED] Link rate 270000 lane count 1
[12:55:16] [PASSED] Link rate 162000 lane count 4
[12:55:16] [PASSED] Link rate 162000 lane count 2
[12:55:16] [PASSED] Link rate 162000 lane count 1
[12:55:16] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[12:55:16] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[12:55:16] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[12:55:16] [PASSED] DP_POWER_UP_PHY with port number
[12:55:16] [PASSED] DP_POWER_DOWN_PHY with port number
[12:55:16] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[12:55:16] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[12:55:16] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[12:55:16] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[12:55:16] [PASSED] DP_QUERY_PAYLOAD with port number
[12:55:16] [PASSED] DP_QUERY_PAYLOAD with VCPI
[12:55:16] [PASSED] DP_REMOTE_DPCD_READ with port number
[12:55:16] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[12:55:16] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[12:55:16] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[12:55:16] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[12:55:16] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[12:55:16] [PASSED] DP_REMOTE_I2C_READ with port number
[12:55:16] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[12:55:16] [PASSED] DP_REMOTE_I2C_READ with transactions array
[12:55:16] [PASSED] DP_REMOTE_I2C_WRITE with port number
[12:55:16] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[12:55:16] [PASSED] DP_REMOTE_I2C_WRITE with data array
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[12:55:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[12:55:16] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[12:55:16] ================ [PASSED] drm_dp_mst_helper ================
[12:55:16] ================== drm_exec (7 subtests) ===================
[12:55:16] [PASSED] sanitycheck
[12:55:16] [PASSED] test_lock
[12:55:16] [PASSED] test_lock_unlock
[12:55:16] [PASSED] test_duplicates
[12:55:16] [PASSED] test_prepare
[12:55:16] [PASSED] test_prepare_array
[12:55:16] [PASSED] test_multiple_loops
[12:55:16] ==================== [PASSED] drm_exec =====================
[12:55:16] =========== drm_format_helper_test (18 subtests) ===========
[12:55:16] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[12:55:16] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[12:55:16] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[12:55:16] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[12:55:16] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[12:55:16] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[12:55:16] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[12:55:16] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[12:55:16] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[12:55:16] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[12:55:16] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[12:55:16] ============== drm_test_fb_xrgb8888_to_mono ===============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[12:55:16] ==================== drm_test_fb_swab =====================
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ================ [PASSED] drm_test_fb_swab =================
[12:55:16] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[12:55:16] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[12:55:16] [PASSED] single_pixel_source_buffer
[12:55:16] [PASSED] single_pixel_clip_rectangle
[12:55:16] [PASSED] well_known_colors
[12:55:16] [PASSED] destination_pitch
[12:55:16] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[12:55:16] ================= drm_test_fb_clip_offset =================
[12:55:16] [PASSED] pass through
[12:55:16] [PASSED] horizontal offset
[12:55:16] [PASSED] vertical offset
[12:55:16] [PASSED] horizontal and vertical offset
[12:55:16] [PASSED] horizontal offset (custom pitch)
[12:55:16] [PASSED] vertical offset (custom pitch)
[12:55:16] [PASSED] horizontal and vertical offset (custom pitch)
[12:55:16] ============= [PASSED] drm_test_fb_clip_offset =============
[12:55:16] ============== drm_test_fb_build_fourcc_list ==============
[12:55:16] [PASSED] no native formats
[12:55:16] [PASSED] XRGB8888 as native format
[12:55:16] [PASSED] remove duplicates
[12:55:16] [PASSED] convert alpha formats
[12:55:16] [PASSED] random formats
[12:55:16] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[12:55:16] =================== drm_test_fb_memcpy ====================
[12:55:16] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[12:55:16] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[12:55:16] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[12:55:16] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[12:55:16] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[12:55:16] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[12:55:16] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[12:55:16] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[12:55:16] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[12:55:16] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[12:55:16] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[12:55:16] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[12:55:16] =============== [PASSED] drm_test_fb_memcpy ================
[12:55:16] ============= [PASSED] drm_format_helper_test ==============
[12:55:16] ================= drm_format (18 subtests) =================
[12:55:16] [PASSED] drm_test_format_block_width_invalid
[12:55:16] [PASSED] drm_test_format_block_width_one_plane
[12:55:16] [PASSED] drm_test_format_block_width_two_plane
[12:55:16] [PASSED] drm_test_format_block_width_three_plane
[12:55:16] [PASSED] drm_test_format_block_width_tiled
[12:55:16] [PASSED] drm_test_format_block_height_invalid
[12:55:16] [PASSED] drm_test_format_block_height_one_plane
[12:55:16] [PASSED] drm_test_format_block_height_two_plane
[12:55:16] [PASSED] drm_test_format_block_height_three_plane
[12:55:16] [PASSED] drm_test_format_block_height_tiled
[12:55:16] [PASSED] drm_test_format_min_pitch_invalid
[12:55:16] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[12:55:16] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[12:55:16] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[12:55:16] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[12:55:16] [PASSED] drm_test_format_min_pitch_two_plane
[12:55:16] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[12:55:16] [PASSED] drm_test_format_min_pitch_tiled
[12:55:16] =================== [PASSED] drm_format ====================
[12:55:16] ============== drm_framebuffer (10 subtests) ===============
[12:55:16] ========== drm_test_framebuffer_check_src_coords ==========
[12:55:16] [PASSED] Success: source fits into fb
[12:55:16] [PASSED] Fail: overflowing fb with x-axis coordinate
[12:55:16] [PASSED] Fail: overflowing fb with y-axis coordinate
[12:55:16] [PASSED] Fail: overflowing fb with source width
[12:55:16] [PASSED] Fail: overflowing fb with source height
[12:55:16] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[12:55:16] [PASSED] drm_test_framebuffer_cleanup
[12:55:16] =============== drm_test_framebuffer_create ===============
[12:55:16] [PASSED] ABGR8888 normal sizes
[12:55:16] [PASSED] ABGR8888 max sizes
[12:55:16] [PASSED] ABGR8888 pitch greater than min required
[12:55:16] [PASSED] ABGR8888 pitch less than min required
[12:55:16] [PASSED] ABGR8888 Invalid width
[12:55:16] [PASSED] ABGR8888 Invalid buffer handle
[12:55:16] [PASSED] No pixel format
[12:55:16] [PASSED] ABGR8888 Width 0
[12:55:16] [PASSED] ABGR8888 Height 0
[12:55:16] [PASSED] ABGR8888 Out of bound height * pitch combination
[12:55:16] [PASSED] ABGR8888 Large buffer offset
[12:55:16] [PASSED] ABGR8888 Buffer offset for inexistent plane
[12:55:16] [PASSED] ABGR8888 Invalid flag
[12:55:16] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[12:55:16] [PASSED] ABGR8888 Valid buffer modifier
[12:55:16] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[12:55:16] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] NV12 Normal sizes
[12:55:16] [PASSED] NV12 Max sizes
[12:55:16] [PASSED] NV12 Invalid pitch
[12:55:16] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[12:55:16] [PASSED] NV12 different modifier per-plane
[12:55:16] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[12:55:16] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] NV12 Modifier for inexistent plane
[12:55:16] [PASSED] NV12 Handle for inexistent plane
[12:55:16] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[12:55:16] [PASSED] YVU420 Normal sizes
[12:55:16] [PASSED] YVU420 Max sizes
[12:55:16] [PASSED] YVU420 Invalid pitch
[12:55:16] [PASSED] YVU420 Different pitches
[12:55:16] [PASSED] YVU420 Different buffer offsets/pitches
[12:55:16] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[12:55:16] [PASSED] YVU420 Valid modifier
[12:55:16] [PASSED] YVU420 Different modifiers per plane
[12:55:16] [PASSED] YVU420 Modifier for inexistent plane
[12:55:16] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[12:55:16] [PASSED] X0L2 Normal sizes
[12:55:16] [PASSED] X0L2 Max sizes
[12:55:16] [PASSED] X0L2 Invalid pitch
[12:55:16] [PASSED] X0L2 Pitch greater than minimum required
[12:55:16] [PASSED] X0L2 Handle for inexistent plane
[12:55:16] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[12:55:16] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[12:55:16] [PASSED] X0L2 Valid modifier
[12:55:16] [PASSED] X0L2 Modifier for inexistent plane
[12:55:16] =========== [PASSED] drm_test_framebuffer_create ===========
[12:55:16] [PASSED] drm_test_framebuffer_free
[12:55:16] [PASSED] drm_test_framebuffer_init
[12:55:16] [PASSED] drm_test_framebuffer_init_bad_format
[12:55:16] [PASSED] drm_test_framebuffer_init_dev_mismatch
[12:55:16] [PASSED] drm_test_framebuffer_lookup
[12:55:16] [PASSED] drm_test_framebuffer_lookup_inexistent
[12:55:16] [PASSED] drm_test_framebuffer_modifiers_not_supported
[12:55:16] ================= [PASSED] drm_framebuffer =================
[12:55:16] ================ drm_gem_shmem (8 subtests) ================
[12:55:16] [PASSED] drm_gem_shmem_test_obj_create
[12:55:16] [PASSED] drm_gem_shmem_test_obj_create_private
[12:55:16] [PASSED] drm_gem_shmem_test_pin_pages
[12:55:16] [PASSED] drm_gem_shmem_test_vmap
[12:55:16] [PASSED] drm_gem_shmem_test_get_pages_sgt
[12:55:16] [PASSED] drm_gem_shmem_test_get_sg_table
[12:55:16] [PASSED] drm_gem_shmem_test_madvise
[12:55:16] [PASSED] drm_gem_shmem_test_purge
[12:55:16] ================== [PASSED] drm_gem_shmem ==================
[12:55:16] === drm_atomic_helper_connector_hdmi_check (23 subtests) ===
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[12:55:16] [PASSED] drm_test_check_disable_connector
[12:55:16] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[12:55:16] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback
[12:55:16] [PASSED] drm_test_check_max_tmds_rate_format_fallback
[12:55:16] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[12:55:16] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[12:55:16] [PASSED] drm_test_check_output_bpc_dvi
[12:55:16] [PASSED] drm_test_check_output_bpc_format_vic_1
[12:55:16] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[12:55:16] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[12:55:16] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[12:55:16] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[12:55:16] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[12:55:16] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[12:55:16] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[12:55:16] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[12:55:16] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[12:55:16] [PASSED] drm_test_check_broadcast_rgb_value
[12:55:16] [PASSED] drm_test_check_bpc_8_value
[12:55:16] [PASSED] drm_test_check_bpc_10_value
[12:55:16] [PASSED] drm_test_check_bpc_12_value
[12:55:16] [PASSED] drm_test_check_format_value
[12:55:16] [PASSED] drm_test_check_tmds_char_value
[12:55:16] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[12:55:16] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[12:55:16] [PASSED] drm_test_check_mode_valid
[12:55:16] [PASSED] drm_test_check_mode_valid_reject
[12:55:16] [PASSED] drm_test_check_mode_valid_reject_rate
[12:55:16] [PASSED] drm_test_check_mode_valid_reject_max_clock
[12:55:16] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[12:55:16] ================= drm_managed (2 subtests) =================
[12:55:16] [PASSED] drm_test_managed_release_action
[12:55:16] [PASSED] drm_test_managed_run_action
[12:55:16] =================== [PASSED] drm_managed ===================
[12:55:16] =================== drm_mm (6 subtests) ====================
[12:55:16] [PASSED] drm_test_mm_init
[12:55:16] [PASSED] drm_test_mm_debug
[12:55:16] [PASSED] drm_test_mm_align32
[12:55:16] [PASSED] drm_test_mm_align64
[12:55:16] [PASSED] drm_test_mm_lowest
[12:55:16] [PASSED] drm_test_mm_highest
[12:55:16] ===================== [PASSED] drm_mm ======================
[12:55:16] ============= drm_modes_analog_tv (5 subtests) =============
[12:55:16] [PASSED] drm_test_modes_analog_tv_mono_576i
[12:55:16] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[12:55:16] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[12:55:16] [PASSED] drm_test_modes_analog_tv_pal_576i
[12:55:16] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[12:55:16] =============== [PASSED] drm_modes_analog_tv ===============
[12:55:16] ============== drm_plane_helper (2 subtests) ===============
[12:55:16] =============== drm_test_check_plane_state ================
[12:55:16] [PASSED] clipping_simple
[12:55:16] [PASSED] clipping_rotate_reflect
[12:55:16] [PASSED] positioning_simple
[12:55:16] [PASSED] upscaling
[12:55:16] [PASSED] downscaling
[12:55:16] [PASSED] rounding1
[12:55:16] [PASSED] rounding2
[12:55:16] [PASSED] rounding3
[12:55:16] [PASSED] rounding4
[12:55:16] =========== [PASSED] drm_test_check_plane_state ============
[12:55:16] =========== drm_test_check_invalid_plane_state ============
[12:55:16] [PASSED] positioning_invalid
[12:55:16] [PASSED] upscaling_invalid
[12:55:16] [PASSED] downscaling_invalid
[12:55:16] ======= [PASSED] drm_test_check_invalid_plane_state ========
[12:55:16] ================ [PASSED] drm_plane_helper =================
[12:55:16] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[12:55:16] ====== drm_test_connector_helper_tv_get_modes_check =======
[12:55:16] [PASSED] None
[12:55:16] [PASSED] PAL
[12:55:16] [PASSED] NTSC
[12:55:16] [PASSED] Both, NTSC Default
[12:55:16] [PASSED] Both, PAL Default
[12:55:16] [PASSED] Both, NTSC Default, with PAL on command-line
[12:55:16] [PASSED] Both, PAL Default, with NTSC on command-line
[12:55:16] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[12:55:16] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[12:55:16] ================== drm_rect (9 subtests) ===================
[12:55:16] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[12:55:16] [PASSED] drm_test_rect_clip_scaled_not_clipped
[12:55:16] [PASSED] drm_test_rect_clip_scaled_clipped
[12:55:16] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[12:55:16] ================= drm_test_rect_intersect =================
[12:55:16] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[12:55:16] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[12:55:16] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[12:55:16] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[12:55:16] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[12:55:16] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[12:55:16] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[12:55:16] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[12:55:16] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[12:55:16] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[12:55:16] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[12:55:16] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[12:55:16] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[12:55:16] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[12:55:16] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[12:55:16] ============= [PASSED] drm_test_rect_intersect =============
[12:55:16] ================ drm_test_rect_calc_hscale ================
[12:55:16] [PASSED] normal use
[12:55:16] [PASSED] out of max range
[12:55:16] [PASSED] out of min range
[12:55:16] [PASSED] zero dst
[12:55:16] [PASSED] negative src
[12:55:16] [PASSED] negative dst
[12:55:16] ============ [PASSED] drm_test_rect_calc_hscale ============
[12:55:16] ================ drm_test_rect_calc_vscale ================
[12:55:16] [PASSED] normal use
[12:55:16] [PASSED] out of max range
[12:55:16] [PASSED] out of min range
[12:55:16] [PASSED] zero dst
[12:55:16] [PASSED] negative src
[12:55:16] [PASSED] negative dst
[12:55:16] ============ [PASSED] drm_test_rect_calc_vscale ============
[12:55:16] ================== drm_test_rect_rotate ===================
[12:55:16] [PASSED] reflect-x
[12:55:16] [PASSED] reflect-y
[12:55:16] [PASSED] rotate-0
[12:55:16] [PASSED] rotate-90
[12:55:16] [PASSED] rotate-180
[12:55:16] [PASSED] rotate-270
[12:55:16] ============== [PASSED] drm_test_rect_rotate ===============
[12:55:16] ================ drm_test_rect_rotate_inv =================
[12:55:16] [PASSED] reflect-x
[12:55:16] [PASSED] reflect-y
[12:55:16] [PASSED] rotate-0
[12:55:16] [PASSED] rotate-90
[12:55:16] [PASSED] rotate-180
[12:55:16] [PASSED] rotate-270
[12:55:16] ============ [PASSED] drm_test_rect_rotate_inv =============
stty: 'standard input': Inappropriate ioctl for device
[12:55:16] ==================== [PASSED] drm_rect =====================
[12:55:16] ============================================================
[12:55:16] Testing complete. Ran 608 tests: passed: 608
[12:55:16] Elapsed time: 22.938s total, 1.721s configuring, 21.000s building, 0.178s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[12:55:16] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:55:18] 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
[12:55:25] Starting KUnit Kernel (1/1)...
[12:55:25] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:55:26] ================= ttm_device (5 subtests) ==================
[12:55:26] [PASSED] ttm_device_init_basic
[12:55:26] [PASSED] ttm_device_init_multiple
[12:55:26] [PASSED] ttm_device_fini_basic
[12:55:26] [PASSED] ttm_device_init_no_vma_man
[12:55:26] ================== ttm_device_init_pools ==================
[12:55:26] [PASSED] No DMA allocations, no DMA32 required
[12:55:26] [PASSED] DMA allocations, DMA32 required
[12:55:26] [PASSED] No DMA allocations, DMA32 required
[12:55:26] [PASSED] DMA allocations, no DMA32 required
[12:55:26] ============== [PASSED] ttm_device_init_pools ==============
[12:55:26] =================== [PASSED] ttm_device ====================
[12:55:26] ================== ttm_pool (8 subtests) ===================
[12:55:26] ================== ttm_pool_alloc_basic ===================
[12:55:26] [PASSED] One page
[12:55:26] [PASSED] More than one page
[12:55:26] [PASSED] Above the allocation limit
[12:55:26] [PASSED] One page, with coherent DMA mappings enabled
[12:55:26] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[12:55:26] ============== [PASSED] ttm_pool_alloc_basic ===============
[12:55:26] ============== ttm_pool_alloc_basic_dma_addr ==============
[12:55:26] [PASSED] One page
[12:55:26] [PASSED] More than one page
[12:55:26] [PASSED] Above the allocation limit
[12:55:26] [PASSED] One page, with coherent DMA mappings enabled
[12:55:26] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[12:55:26] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[12:55:26] [PASSED] ttm_pool_alloc_order_caching_match
[12:55:26] [PASSED] ttm_pool_alloc_caching_mismatch
[12:55:26] [PASSED] ttm_pool_alloc_order_mismatch
[12:55:26] [PASSED] ttm_pool_free_dma_alloc
[12:55:26] [PASSED] ttm_pool_free_no_dma_alloc
[12:55:26] [PASSED] ttm_pool_fini_basic
[12:55:26] ==================== [PASSED] ttm_pool =====================
[12:55:26] ================ ttm_resource (8 subtests) =================
[12:55:26] ================= ttm_resource_init_basic =================
[12:55:26] [PASSED] Init resource in TTM_PL_SYSTEM
[12:55:26] [PASSED] Init resource in TTM_PL_VRAM
[12:55:26] [PASSED] Init resource in a private placement
[12:55:26] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[12:55:26] ============= [PASSED] ttm_resource_init_basic =============
[12:55:26] [PASSED] ttm_resource_init_pinned
[12:55:26] [PASSED] ttm_resource_fini_basic
[12:55:26] [PASSED] ttm_resource_manager_init_basic
[12:55:26] [PASSED] ttm_resource_manager_usage_basic
[12:55:26] [PASSED] ttm_resource_manager_set_used_basic
[12:55:26] [PASSED] ttm_sys_man_alloc_basic
[12:55:26] [PASSED] ttm_sys_man_free_basic
[12:55:26] ================== [PASSED] ttm_resource ===================
[12:55:26] =================== ttm_tt (15 subtests) ===================
[12:55:26] ==================== ttm_tt_init_basic ====================
[12:55:26] [PASSED] Page-aligned size
[12:55:26] [PASSED] Extra pages requested
[12:55:26] ================ [PASSED] ttm_tt_init_basic ================
[12:55:26] [PASSED] ttm_tt_init_misaligned
[12:55:26] [PASSED] ttm_tt_fini_basic
[12:55:26] [PASSED] ttm_tt_fini_sg
[12:55:26] [PASSED] ttm_tt_fini_shmem
[12:55:26] [PASSED] ttm_tt_create_basic
[12:55:26] [PASSED] ttm_tt_create_invalid_bo_type
[12:55:26] [PASSED] ttm_tt_create_ttm_exists
[12:55:26] [PASSED] ttm_tt_create_failed
[12:55:26] [PASSED] ttm_tt_destroy_basic
[12:55:26] [PASSED] ttm_tt_populate_null_ttm
[12:55:26] [PASSED] ttm_tt_populate_populated_ttm
[12:55:26] [PASSED] ttm_tt_unpopulate_basic
[12:55:26] [PASSED] ttm_tt_unpopulate_empty_ttm
[12:55:26] [PASSED] ttm_tt_swapin_basic
[12:55:26] ===================== [PASSED] ttm_tt ======================
[12:55:26] =================== ttm_bo (14 subtests) ===================
[12:55:26] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[12:55:26] [PASSED] Cannot be interrupted and sleeps
[12:55:26] [PASSED] Cannot be interrupted, locks straight away
[12:55:26] [PASSED] Can be interrupted, sleeps
[12:55:26] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[12:55:26] [PASSED] ttm_bo_reserve_locked_no_sleep
[12:55:26] [PASSED] ttm_bo_reserve_no_wait_ticket
[12:55:26] [PASSED] ttm_bo_reserve_double_resv
[12:55:26] [PASSED] ttm_bo_reserve_interrupted
[12:55:26] [PASSED] ttm_bo_reserve_deadlock
[12:55:26] [PASSED] ttm_bo_unreserve_basic
[12:55:26] [PASSED] ttm_bo_unreserve_pinned
[12:55:26] [PASSED] ttm_bo_unreserve_bulk
[12:55:26] [PASSED] ttm_bo_put_basic
[12:55:26] [PASSED] ttm_bo_put_shared_resv
[12:55:26] [PASSED] ttm_bo_pin_basic
[12:55:26] [PASSED] ttm_bo_pin_unpin_resource
[12:55:26] [PASSED] ttm_bo_multiple_pin_one_unpin
[12:55:26] ===================== [PASSED] ttm_bo ======================
[12:55:26] ============== ttm_bo_validate (22 subtests) ===============
[12:55:26] ============== ttm_bo_init_reserved_sys_man ===============
[12:55:26] [PASSED] Buffer object for userspace
[12:55:26] [PASSED] Kernel buffer object
[12:55:26] [PASSED] Shared buffer object
[12:55:26] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[12:55:26] ============== ttm_bo_init_reserved_mock_man ==============
[12:55:26] [PASSED] Buffer object for userspace
[12:55:26] [PASSED] Kernel buffer object
[12:55:26] [PASSED] Shared buffer object
[12:55:26] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[12:55:26] [PASSED] ttm_bo_init_reserved_resv
[12:55:26] ================== ttm_bo_validate_basic ==================
[12:55:26] [PASSED] Buffer object for userspace
[12:55:26] [PASSED] Kernel buffer object
[12:55:26] [PASSED] Shared buffer object
[12:55:26] ============== [PASSED] ttm_bo_validate_basic ==============
[12:55:26] [PASSED] ttm_bo_validate_invalid_placement
[12:55:26] ============= ttm_bo_validate_same_placement ==============
[12:55:26] [PASSED] System manager
[12:55:26] [PASSED] VRAM manager
[12:55:26] ========= [PASSED] ttm_bo_validate_same_placement ==========
[12:55:26] [PASSED] ttm_bo_validate_failed_alloc
[12:55:26] [PASSED] ttm_bo_validate_pinned
[12:55:26] [PASSED] ttm_bo_validate_busy_placement
[12:55:26] ================ ttm_bo_validate_multihop =================
[12:55:26] [PASSED] Buffer object for userspace
[12:55:26] [PASSED] Kernel buffer object
[12:55:26] [PASSED] Shared buffer object
[12:55:26] ============ [PASSED] ttm_bo_validate_multihop =============
[12:55:26] ========== ttm_bo_validate_no_placement_signaled ==========
[12:55:26] [PASSED] Buffer object in system domain, no page vector
[12:55:26] [PASSED] Buffer object in system domain with an existing page vector
[12:55:26] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[12:55:26] ======== ttm_bo_validate_no_placement_not_signaled ========
[12:55:26] [PASSED] Buffer object for userspace
[12:55:26] [PASSED] Kernel buffer object
[12:55:26] [PASSED] Shared buffer object
[12:55:26] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[12:55:26] [PASSED] ttm_bo_validate_move_fence_signaled
[12:55:26] ========= ttm_bo_validate_move_fence_not_signaled =========
[12:55:26] [PASSED] Waits for GPU
[12:55:26] [PASSED] Tries to lock straight away
[12:55:26] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[12:55:26] [PASSED] ttm_bo_validate_swapout
[12:55:26] [PASSED] ttm_bo_validate_happy_evict
[12:55:26] [PASSED] ttm_bo_validate_all_pinned_evict
[12:55:26] [PASSED] ttm_bo_validate_allowed_only_evict
[12:55:26] [PASSED] ttm_bo_validate_deleted_evict
[12:55:26] [PASSED] ttm_bo_validate_busy_domain_evict
[12:55:26] [PASSED] ttm_bo_validate_evict_gutting
[12:55:26] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[12:55:26] ================= [PASSED] ttm_bo_validate =================
[12:55:26] ============================================================
[12:55:26] Testing complete. Ran 102 tests: passed: 102
[12:55:26] Elapsed time: 10.254s total, 1.745s configuring, 7.892s building, 0.532s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 22+ messages in thread* ✗ CI.Build: failure for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
2025-04-09 21:13 [PATCH v8 0/4] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (10 preceding siblings ...)
2025-04-10 12:55 ` ✓ CI.KUnit: success " Patchwork
@ 2025-04-10 13:09 ` Patchwork
11 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2025-04-10 13:09 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev7)
URL : https://patchwork.freedesktop.org/series/141439/
State : failure
== Summary ==
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_interfaces.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/inc/dml2_debug.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_translation_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_wrapper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_utils.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce120/dce120_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_compressor.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_compressor.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_regamma_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_csc_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_mem_input_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_transform_v.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce80/dce80_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_timing_generator.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_hw_sequencer.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_resource.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/hdcp/hdcp_msg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_easf_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_isharp_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_filters.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_fixpt31_32.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_custom_float.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stat.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_resource.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_hw_sequencer.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_sink.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_surface.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_debug.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_enc_cfg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_exports.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_vm_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_dmub_srv.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_edid_parser.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dc/dc_spl_translate.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/freesync/freesync.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_gamma.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_table.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/info_packet/info_packet.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/power/power_helpers.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv_stat.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_reg.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn20.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn21.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn30.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn301.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn302.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn303.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn31.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn314.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn315.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn316.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn32.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn35.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn351.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn36.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn401.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_ddc.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_log.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_psp.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_execution.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_transition.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_execution.o
CC [M] drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_transition.o
CC [M] drivers/gpu/drm/amd/amdgpu/amdgpu_isp.o
CC [M] drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.o
CC [M] drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.o
LD [M] drivers/gpu/drm/amd/amdgpu/amdgpu.o
make[5]: *** [../scripts/Makefile.build:461: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:461: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:461: drivers] Error 2
make[2]: *** [/kernel/Makefile:2006: .] Error 2
make[1]: *** [/kernel/Makefile:248: __sub-make] Error 2
make[1]: Leaving directory '/kernel/build64-debug'
make: *** [Makefile:248: __sub-make] Error 2
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 22+ messages in thread