diff mbox series

[3/5] libsbefifo: Implement get dump chip-op

Message ID 20201211021356.414095-4-amitay@ozlabs.org
State Accepted
Headers show
Series Implement get dump chip-op | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch warning Failed to apply on branch master (41586bce6f00623d2d25a8483ee9187c2c0218af)
snowpatch_ozlabs/apply_patch fail Failed to apply to any branch

Commit Message

Amitay Isaacs Dec. 11, 2020, 2:13 a.m. UTC
Signed-off-by: Amitay Isaacs <amitay@ozlabs.org>
---
 Makefile.am                  |  1 +
 libsbefifo/cmd_dump.c        | 90 ++++++++++++++++++++++++++++++++++++
 libsbefifo/libsbefifo.h      | 11 +++++
 libsbefifo/sbefifo_private.h |  3 ++
 4 files changed, 105 insertions(+)
 create mode 100644 libsbefifo/cmd_dump.c
diff mbox series

Patch

diff --git a/Makefile.am b/Makefile.am
index fc7e2f6..5ae4cba 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -142,6 +142,7 @@  libcronus_la_SOURCES = \
 libsbefifo_la_SOURCES = \
 	libsbefifo/cmd_array.c \
 	libsbefifo/cmd_control.c \
+	libsbefifo/cmd_dump.c \
 	libsbefifo/cmd_generic.c \
 	libsbefifo/cmd_instruction.c \
 	libsbefifo/cmd_memory.c \
diff --git a/libsbefifo/cmd_dump.c b/libsbefifo/cmd_dump.c
new file mode 100644
index 0000000..b4e880c
--- /dev/null
+++ b/libsbefifo/cmd_dump.c
@@ -0,0 +1,90 @@ 
+/* Copyright 2020 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <endian.h>
+#include <errno.h>
+#include <string.h>
+
+#include "libsbefifo.h"
+#include "sbefifo_private.h"
+
+static int sbefifo_get_dump_push(uint8_t type, uint8_t clock, uint8_t **buf, uint32_t *buflen)
+{
+	uint32_t *msg;
+	uint32_t nwords, cmd;
+	uint32_t flags;
+
+	nwords =  3;
+	*buflen = nwords * sizeof(uint32_t);
+	msg = malloc(*buflen);
+	if (!msg)
+		return ENOMEM;
+
+	cmd = SBEFIFO_CMD_CLASS_DUMP | SBEFIFO_CMD_GET_DUMP;
+
+	flags = ((uint32_t)(clock & 0x3) << 8) |
+		 ((uint32_t)(type & 0xf));
+
+	msg[0] = htobe32(nwords);
+	msg[1] = htobe32(cmd);
+	msg[2] = htobe32(flags);
+
+	*buf = (uint8_t *)msg;
+	return 0;
+}
+
+static int sbefifo_get_dump_pull(uint8_t *buf, uint32_t buflen, uint8_t **data, uint32_t *data_len)
+{
+	if (buflen > 0) {
+		*data = malloc(buflen);
+		if (! *data)
+			return ENOMEM;
+
+		memcpy(*data, buf, buflen);
+		*data_len = buflen;
+	} else {
+		*data = NULL;
+		*data_len = 0;
+	}
+
+	return 0;
+}
+
+int sbefifo_get_dump(struct sbefifo_context *sctx, uint8_t type, uint8_t clock, uint8_t **data, uint32_t *data_len)
+{
+	uint8_t *msg, *out;
+	uint32_t msg_len, out_len;
+	int rc;
+
+	rc = sbefifo_get_dump_push(type, clock, &msg, &msg_len);
+	if (rc)
+		return rc;
+
+	/* dump size can be as large as 64MB */
+	out_len = 64 * 1024 * 1024;
+	rc = sbefifo_operation(sctx, msg, msg_len, &out, &out_len);
+	free(msg);
+	if (rc)
+		return rc;
+
+	rc = sbefifo_get_dump_pull(out, out_len, data, data_len);
+	if (out)
+		free(out);
+
+	return rc;
+}
diff --git a/libsbefifo/libsbefifo.h b/libsbefifo/libsbefifo.h
index 763051a..a039eea 100644
--- a/libsbefifo/libsbefifo.h
+++ b/libsbefifo/libsbefifo.h
@@ -191,4 +191,15 @@  int sbefifo_mpipl_continue(struct sbefifo_context *sctx);
 int sbefifo_mpipl_stopclocks(struct sbefifo_context *sctx, uint16_t target_type, uint8_t chiplet_id);
 int sbefifo_mpipl_get_ti_info(struct sbefifo_context *sctx, uint8_t **data, uint32_t *data_len);
 
+#define SBEFIFO_DUMP_TYPE_SCS            0x01
+#define SBEFIFO_DUMP_TYPE_MPIPL          0x02
+#define SBEFIFO_DUMP_TYPE_PERF           0x03
+#define SBEFIFO_DUMP_TYPE_CCS            0x04
+#define SBEFIFO_DUMP_TYPE_HB             0x05
+
+#define SBEFIFO_DUMP_CLOCK_ON            0x01
+#define SBEFIFO_DUMP_CLOCK_OFF           0x02
+
+int sbefifo_get_dump(struct sbefifo_context *sctx, uint8_t type, uint8_t clock, uint8_t **data, uint32_t *data_len);
+
 #endif /* __LIBSBEFIFO_H__ */
diff --git a/libsbefifo/sbefifo_private.h b/libsbefifo/sbefifo_private.h
index 4dd1c25..e9c487a 100644
--- a/libsbefifo/sbefifo_private.h
+++ b/libsbefifo/sbefifo_private.h
@@ -66,6 +66,9 @@ 
 #define   SBEFIFO_CMD_STOP_CLOCKS          0x03
 #define   SBEFIFO_CMD_GET_TI_INFO          0x04
 
+#define SBEFIFO_CMD_CLASS_DUMP           0xAA00
+#define   SBEFIFO_CMD_GET_DUMP             0x01
+
 struct sbefifo_context {
 	int fd;
 	int proc;