[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