[RFC 1/3] drm/xe: Introduce force-wake guard class

Michal Wajdeczko michal.wajdeczko at intel.com
Mon Jun 17 14:34:28 UTC 2024


There is support for 'classes' with constructor and destructor
semantics that can be used for any scope-based resource management,
like device force-wake management.

Add necessary definitions explicitly, since existing macros from
linux/cleanup.h can't deal with our specific requirements yet.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
Cc: Lucas De Marchi <lucas.demarchi at intel.com>
---
 drivers/gpu/drm/xe/xe_force_wake.h       | 48 ++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_force_wake_types.h | 12 ++++++
 2 files changed, 60 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_force_wake.h b/drivers/gpu/drm/xe/xe_force_wake.h
index a2577672f4e3..0a09018b2a89 100644
--- a/drivers/gpu/drm/xe/xe_force_wake.h
+++ b/drivers/gpu/drm/xe/xe_force_wake.h
@@ -6,6 +6,8 @@
 #ifndef _XE_FORCE_WAKE_H_
 #define _XE_FORCE_WAKE_H_
 
+#include <linux/cleanup.h>
+
 #include "xe_assert.h"
 #include "xe_force_wake_types.h"
 
@@ -46,4 +48,50 @@ xe_force_wake_assert_held(struct xe_force_wake *fw,
 	xe_gt_assert(fw->gt, fw->awake_domains & domain);
 }
 
+/**
+ * class_xe_fw_constructor - The FW guard constructor
+ * @fw : the &xe_force_wake which manages domains
+ * @domain: force wake domain to wake
+ *
+ * Implements constructor semantics for the FW guard.
+ * See scoped_guard() for more details.
+ */
+static inline class_xe_fw_t class_xe_fw_constructor(struct xe_force_wake *fw,
+						    enum xe_force_wake_domains domain)
+{
+	class_xe_fw_t guard = {
+		.fw = fw,
+		.domain = domain,
+	};
+
+	if (fw && xe_force_wake_get(fw, domain))
+		guard.fw = NULL;
+
+	return guard;
+}
+
+/**
+ * class_xe_fw_destructor - The FW guard destructor
+ * @guard : the &class_xe_fw_t to cleanup
+ *
+ * Implements destructor semantics for the FW guard.
+ * See scoped_guard() for more details.
+ */
+static inline void class_xe_fw_destructor(class_xe_fw_t *guard)
+{
+	if (guard->fw)
+		xe_force_wake_put(guard->fw, guard->domain);
+}
+
+/**
+ * class_xe_fw_lock_ptr - The FW guard helper
+ * @guard : the &class_xe_fw_t
+ *
+ * See scoped_guard() for more details.
+ */
+static inline void *class_xe_fw_lock_ptr(class_xe_fw_t *guard)
+{
+	return guard->fw;
+}
+
 #endif
diff --git a/drivers/gpu/drm/xe/xe_force_wake_types.h b/drivers/gpu/drm/xe/xe_force_wake_types.h
index ed0edc2cdf9f..39220d5fe0f7 100644
--- a/drivers/gpu/drm/xe/xe_force_wake_types.h
+++ b/drivers/gpu/drm/xe/xe_force_wake_types.h
@@ -83,4 +83,16 @@ struct xe_force_wake {
 	struct xe_force_wake_domain domains[XE_FW_DOMAIN_ID_COUNT];
 };
 
+/**
+ * struct xe_force_wake_guard - Xe force wake guard class
+ */
+struct xe_force_wake_guard {
+	/** @fw: force wake manager */
+	struct xe_force_wake *fw;
+	/** @domain: awake domain under guard */
+	enum xe_force_wake_domains domain;
+};
+
+typedef struct xe_force_wake_guard class_xe_fw_t;
+
 #endif
-- 
2.43.0



More information about the Intel-xe mailing list