@@ -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 \
new file mode 100644
@@ -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;
+}
@@ -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__ */
@@ -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;
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