summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/xe/xe_guc_ct.c23
-rw-r--r--drivers/gpu/drm/xe/xe_page_reclaim.c20
-rw-r--r--drivers/gpu/drm/xe/xe_page_reclaim.h3
3 files changed, 31 insertions, 15 deletions
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index 3b1c03743f83..a11cff7a20be 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -31,6 +31,7 @@
#include "xe_guc_submit.h"
#include "xe_guc_tlb_inval.h"
#include "xe_map.h"
+#include "xe_page_reclaim.h"
#include "xe_pm.h"
#include "xe_sleep.h"
#include "xe_sriov_vf.h"
@@ -1630,17 +1631,11 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len)
ret = xe_guc_pagefault_handler(guc, payload, adj_len);
break;
case XE_GUC_ACTION_TLB_INVALIDATION_DONE:
- case XE_GUC_ACTION_PAGE_RECLAMATION_DONE:
- /*
- * Page reclamation is an extension of TLB invalidation. Both
- * operations share the same seqno and fence. When either
- * action completes, we need to signal the corresponding
- * fence. Since the handling logic (lookup fence by seqno,
- * fence signalling) is identical, we use the same handler
- * for both G2H events.
- */
ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len);
break;
+ case XE_GUC_ACTION_PAGE_RECLAMATION_DONE:
+ ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len);
+ break;
case XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF:
ret = xe_guc_relay_process_guc2pf(&guc->relay, hxg, hxg_len);
break;
@@ -1848,15 +1843,13 @@ static void g2h_fast_path(struct xe_guc_ct *ct, u32 *msg, u32 len)
ret = xe_guc_pagefault_handler(guc, payload, adj_len);
break;
case XE_GUC_ACTION_TLB_INVALIDATION_DONE:
- case XE_GUC_ACTION_PAGE_RECLAMATION_DONE:
- /*
- * Seqno and fence handling of page reclamation and TLB
- * invalidation is identical, so we can use the same handler
- * for both actions.
- */
__g2h_release_space(ct, len);
ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len);
break;
+ case XE_GUC_ACTION_PAGE_RECLAMATION_DONE:
+ __g2h_release_space(ct, len);
+ ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len);
+ break;
default:
xe_gt_warn(gt, "NOT_POSSIBLE\n");
}
diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.c b/drivers/gpu/drm/xe/xe_page_reclaim.c
index e13c71a89da2..60b0fda59ce3 100644
--- a/drivers/gpu/drm/xe/xe_page_reclaim.c
+++ b/drivers/gpu/drm/xe/xe_page_reclaim.c
@@ -11,6 +11,7 @@
#include "xe_page_reclaim.h"
#include "xe_gt_stats.h"
+#include "xe_guc_tlb_inval.h"
#include "xe_macros.h"
#include "xe_pat.h"
#include "xe_sa.h"
@@ -130,3 +131,22 @@ int xe_page_reclaim_list_alloc_entries(struct xe_page_reclaim_list *prl)
return page ? 0 : -ENOMEM;
}
+
+/**
+ * xe_guc_page_reclaim_done_handler() - Page reclaim done handler
+ * @guc: guc
+ * @msg: message indicating page reclamation done
+ * @len: length of message
+ *
+ * Page reclamation is an extension of TLB invalidation. Both
+ * operations share the same seqno and fence. When either
+ * action completes, we need to signal the corresponding
+ * fence. Since the handling logic is currently identical, this
+ * function delegates to the TLB invalidation handler.
+ *
+ * Return: 0 on success, -EPROTO for malformed messages.
+ */
+int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len)
+{
+ return xe_guc_tlb_inval_done_handler(guc, msg, len);
+}
diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h b/drivers/gpu/drm/xe/xe_page_reclaim.h
index 3dd103e37beb..0412611f3af7 100644
--- a/drivers/gpu/drm/xe/xe_page_reclaim.h
+++ b/drivers/gpu/drm/xe/xe_page_reclaim.h
@@ -20,6 +20,7 @@ struct xe_tlb_inval;
struct xe_tlb_inval_fence;
struct xe_tile;
struct xe_gt;
+struct xe_guc;
struct xe_vma;
struct xe_guc_page_reclaim_entry {
@@ -122,4 +123,6 @@ static inline void xe_page_reclaim_entries_put(struct xe_guc_page_reclaim_entry
put_page(virt_to_page(entries));
}
+int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len);
+
#endif /* _XE_PAGE_RECLAIM_H_ */