Thread (9 messages) 9 messages, 2 authors, 2021-10-12
STALE1712d
Revisions (4)
  1. v1 current
  2. v1 [diff vs current]
  3. v1 [diff vs current]
  4. v1 [diff vs current]

[PATCH 2/2] lib: sbi: add priority for reset handler

From: Nikita Shubin <nikita.shubin@maquefel.me>
Date: 2021-10-01 08:31:17
Subsystem: library code, the rest · Maintainers: Andrew Morton, Linus Torvalds

From: Nikita Shubin <redacted>

Let's make system_reset_check returning priority instead of only
true/false. In that case 0 - means not supported, and anything above
means priority that makes existing reset handlers being used in first
place, unless it is decided to lower their priority.

The handler with the most priority wins.

Signed-off-by: Nikita Shubin <redacted>
---
rfc -> v0:
- changed priority meaning to classic, the more the more prioritized
- moved all checks to sbi_system_reset
---
 lib/sbi/sbi_system.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c
index 6e6bb80..177f130 100644
--- a/lib/sbi/sbi_system.c
+++ b/lib/sbi/sbi_system.c
@@ -22,18 +22,29 @@ static SBI_LIST_HEAD(reset_devices_list);
 
 const struct sbi_system_reset_device *sbi_system_reset_get_device(u32 reset_type, u32 reset_reason)
 {
-	struct sbi_system_reset_device *dev = 0;
+	struct sbi_system_reset_device *reset_dev = 0;
 	struct sbi_dlist *pos;
+	/** lowest priority - any non zero is our candidate */
+	int priority = 0;
 
 	/* Check each reset device registered for supported reset type */
 	sbi_list_for_each(pos, &(reset_devices_list)) {
-		dev = to_system_reset_device(pos);
-		if (dev->system_reset_check &&
-			dev->system_reset_check(reset_type, reset_reason))
-			break;
+		struct sbi_system_reset_device *dev =
+			to_system_reset_device(pos);
+		if (dev->system_reset_check) {
+			int status = dev->system_reset_check(reset_type, reset_reason);
+			/** reset_type not supported */
+			if (status == 0)
+				continue;
+
+			if (status > priority) {
+				reset_dev = dev;
+				priority = status;
+			}
+		}
 	}
 
-	return dev;
+	return reset_dev;
 }
 
 void sbi_system_reset_add_device(struct sbi_system_reset_device *dev)
-- 
2.31.1

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help