[Pdbg] [PATCH 24/29] htm: Check that nodes aren't disabled

Cyril Bur cyrilbur at gmail.com
Fri Feb 9 15:38:52 AEDT 2018


Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
---
 libpdbg/device.c | 10 ++++++++
 libpdbg/device.h |  3 +++
 src/htm.c        | 75 ++++++++++++++++++++++++++++++++++++++++++--------------
 src/main.h       |  5 ++++
 4 files changed, 75 insertions(+), 18 deletions(-)

diff --git a/libpdbg/device.c b/libpdbg/device.c
index e7b8ee0..55c6ea7 100644
--- a/libpdbg/device.c
+++ b/libpdbg/device.c
@@ -942,3 +942,13 @@ bool dt_node_is_enabled(struct dt_node *node)
 
 	return p->len > 1 && p->prop[0] == 'o' && p->prop[1] == 'k';
 }
+
+bool dt_node_is_disabled(struct dt_node *node)
+{
+	const struct dt_property *p = dt_find_property(node, "status");
+
+	if (!p)
+		return false;
+
+	return strcmp(p->prop, "disabled") == 0;
+}
diff --git a/libpdbg/device.h b/libpdbg/device.h
index 4bc60a7..0033288 100644
--- a/libpdbg/device.h
+++ b/libpdbg/device.h
@@ -167,6 +167,9 @@ struct dt_node *dt_find_compatible_node_on_chip(struct dt_node *root,
 /* Check status property */
 bool dt_node_is_enabled(struct dt_node *node);
 
+/* Check status property */
+bool dt_node_is_disabled(struct dt_node *node);
+
 /* Build the full path for a node. Return a new block of memory, caller
  * shall free() it
  */
diff --git a/src/htm.c b/src/htm.c
index b03aca0..d6638ea 100644
--- a/src/htm.c
+++ b/src/htm.c
@@ -23,6 +23,8 @@
 #include <target.h>
 #include <operations.h>
 
+#include "main.h"
+
 #define HTM_DUMP_BASENAME "htm.dump"
 
 static char *get_htm_dump_filename(void)
@@ -50,11 +52,15 @@ int run_htm_start(int optind, int argc, char *argv[])
 	struct pdbg_target *target;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
 
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
+		index = pdbg_target_index(target);
 		printf("Starting HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_start(target) != 1)
 			printf("Couldn't start HTM@%" PRIu64 "#%d\n", chip_id, index);
@@ -69,10 +75,14 @@ int run_htm_stop(int optind, int argc, char *argv[])
 	struct pdbg_target *target;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
 
+		if (target_is_disabled(target))
+			continue;
+
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("Stopping HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_stop(target) != 1)
@@ -88,10 +98,14 @@ int run_htm_status(int optind, int argc, char *argv[])
 	struct pdbg_target *target;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
 
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_status(target) != 1)
@@ -109,10 +123,14 @@ int run_htm_reset(int optind, int argc, char *argv[])
 	struct pdbg_target *target;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
 
+		if (target_is_disabled(target))
+			continue;
+
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("Resetting HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_reset(target, &base, &size) != 1)
@@ -143,10 +161,14 @@ int run_htm_dump(int optind, int argc, char *argv[])
 
 	/* size = 0 will dump everything */
 	printf("Dumping HTM trace to file [chip].[#]%s\n", filename);
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
 
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("Dumping HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_dump(target, 0, filename) == 1)
@@ -164,15 +186,20 @@ int run_htm_trace(int optind, int argc, char *argv[])
 	struct pdbg_target *target;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
+
+		index = pdbg_target_index(target);
+		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 
 		/*
 		 * Don't mind if stop fails, it will fail if it wasn't
 		 * running, if anything bad is happening reset will fail
 		 */
-		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		htm_stop(target);
 		printf("Resetting HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_reset(target, &base, &size) != 1)
@@ -187,10 +214,14 @@ int run_htm_trace(int optind, int argc, char *argv[])
 		old_base = base;
 	}
 
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
 
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("Starting HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_start(target) != 1)
@@ -207,18 +238,26 @@ int run_htm_analyse(int optind, int argc, char *argv[])
 	char *filename;
 	int rc = 0;
 
-	pdbg_for_each_class_target("htm", target)
+	pdbg_for_each_class_target("nhtm", target) {
+		if (target_is_disabled(target))
+			continue;
+
 		htm_stop(target);
+	}
 
 	filename = get_htm_dump_filename();
 	if (!filename)
 		return 0;
 
 	printf("Dumping HTM trace to file [chip].[#]%s\n", filename);
-	pdbg_for_each_class_target("htm", target) {
-		uint32_t index = pdbg_target_index(target);
+	pdbg_for_each_class_target("nhtm", target) {
 		uint64_t chip_id;
+		uint32_t index;
+
+		if (target_is_disabled(target))
+			continue;
 
+		index = pdbg_target_index(target);
 		assert(!pdbg_get_u64_property(target, "chip-id", &chip_id));
 		printf("Dumping HTM@%" PRIu64 "#%d\n", chip_id, index);
 		if (htm_dump(target, 0, filename) != 1)
diff --git a/src/main.h b/src/main.h
index e47d3dc..1bfdd99 100644
--- a/src/main.h
+++ b/src/main.h
@@ -17,6 +17,11 @@
 
 #include <target.h>
 
+static inline bool target_is_disabled(struct pdbg_target *target)
+{
+	return pdbg_target_index(target) == PDBG_TARGET_DISABLED;
+}
+
 /* Returns the sum of return codes. This can be used to count how many targets the callback was run on. */
 int for_each_child_target(char *class, struct pdbg_target *parent,
 				 int (*cb)(struct pdbg_target *, uint32_t, uint64_t *, uint64_t *),
-- 
2.16.1



More information about the Pdbg mailing list