summaryrefslogtreecommitdiff
path: root/drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h')
-rw-r--r--drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h b/drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h
new file mode 100644
index 000000000000..8bf90fc18bf5
--- /dev/null
+++ b/drivers/misc/habanalabs/include/gaudi2/gaudi2_packets.h
@@ -0,0 +1,197 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright 2020 HabanaLabs, Ltd.
+ * All Rights Reserved.
+ *
+ */
+
+#ifndef GAUDI2_PACKETS_H
+#define GAUDI2_PACKETS_H
+
+#include <linux/types.h>
+
+#define PACKET_HEADER_PACKET_ID_SHIFT 56
+#define PACKET_HEADER_PACKET_ID_MASK 0x1F00000000000000ull
+
+enum packet_id {
+ PACKET_WREG_32 = 0x1,
+ PACKET_WREG_BULK = 0x2,
+ PACKET_MSG_LONG = 0x3,
+ PACKET_MSG_SHORT = 0x4,
+ PACKET_CP_DMA = 0x5,
+ PACKET_REPEAT = 0x6,
+ PACKET_MSG_PROT = 0x7,
+ PACKET_FENCE = 0x8,
+ PACKET_LIN_DMA = 0x9,
+ PACKET_NOP = 0xA,
+ PACKET_STOP = 0xB,
+ PACKET_ARB_POINT = 0xC,
+ PACKET_WAIT = 0xD,
+ PACKET_CB_LIST = 0xE,
+ PACKET_LOAD_AND_EXE = 0xF,
+ PACKET_WRITE_ARC_STREAM = 0x10,
+ PACKET_LAST_READ_FROM_ARC = 0x11,
+ PACKET_WREG_64_SHORT = 0x12,
+ PACKET_WREG_64_LONG = 0x13,
+ MAX_PACKET_ID = (PACKET_HEADER_PACKET_ID_MASK >>
+ PACKET_HEADER_PACKET_ID_SHIFT) + 1
+};
+
+#define GAUDI2_PKT_CTL_OPCODE_SHIFT 24
+#define GAUDI2_PKT_CTL_OPCODE_MASK 0x1F000000
+
+#define GAUDI2_PKT_CTL_EB_SHIFT 29
+#define GAUDI2_PKT_CTL_EB_MASK 0x20000000
+
+#define GAUDI2_PKT_CTL_RB_SHIFT 30
+#define GAUDI2_PKT_CTL_RB_MASK 0x40000000
+
+#define GAUDI2_PKT_CTL_MB_SHIFT 31
+#define GAUDI2_PKT_CTL_MB_MASK 0x80000000
+
+/* All packets have, at least, an 8-byte header, which contains
+ * the packet type. The kernel driver uses the packet header for packet
+ * validation and to perform any necessary required preparation before
+ * sending them off to the hardware.
+ */
+struct gaudi2_packet {
+ __le64 header;
+ /* The rest of the packet data follows. Use the corresponding
+ * packet_XXX struct to deference the data, based on packet type
+ */
+ u8 contents[0];
+};
+
+struct packet_nop {
+ __le32 reserved;
+ __le32 ctl;
+};
+
+struct packet_stop {
+ __le32 reserved;
+ __le32 ctl;
+};
+
+struct packet_wreg32 {
+ __le32 value;
+ __le32 ctl;
+};
+
+struct packet_wreg_bulk {
+ __le32 size64;
+ __le32 ctl;
+ __le64 values[0]; /* data starts here */
+};
+
+struct packet_msg_long {
+ __le32 value;
+ __le32 ctl;
+ __le64 addr;
+};
+
+#define GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_SHIFT 0
+#define GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK 0x00007FFF
+
+#define GAUDI2_PKT_SHORT_VAL_SOB_MOD_SHIFT 31
+#define GAUDI2_PKT_SHORT_VAL_SOB_MOD_MASK 0x80000000
+
+#define GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_SHIFT 0
+#define GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_MASK 0x000000FF
+
+#define GAUDI2_PKT_SHORT_VAL_MON_MASK_SHIFT 8
+#define GAUDI2_PKT_SHORT_VAL_MON_MASK_MASK 0x0000FF00
+
+#define GAUDI2_PKT_SHORT_VAL_MON_MODE_SHIFT 16
+#define GAUDI2_PKT_SHORT_VAL_MON_MODE_MASK 0x00010000
+
+#define GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_SHIFT 17
+#define GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_MASK 0xFFFE0000
+
+#define GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT 0
+#define GAUDI2_PKT_SHORT_CTL_ADDR_MASK 0x0000FFFF
+
+#define GAUDI2_PKT_SHORT_CTL_BASE_SHIFT 22
+#define GAUDI2_PKT_SHORT_CTL_BASE_MASK 0x00C00000
+
+struct packet_msg_short {
+ __le32 value;
+ __le32 ctl;
+};
+
+struct packet_msg_prot {
+ __le32 value;
+ __le32 ctl;
+ __le64 addr;
+};
+
+#define GAUDI2_PKT_FENCE_CFG_DEC_VAL_SHIFT 0
+#define GAUDI2_PKT_FENCE_CFG_DEC_VAL_MASK 0x0000000F
+
+#define GAUDI2_PKT_FENCE_CFG_TARGET_VAL_SHIFT 16
+#define GAUDI2_PKT_FENCE_CFG_TARGET_VAL_MASK 0x00FF0000
+
+#define GAUDI2_PKT_FENCE_CFG_ID_SHIFT 30
+#define GAUDI2_PKT_FENCE_CFG_ID_MASK 0xC0000000
+
+#define GAUDI2_PKT_FENCE_CTL_PRED_SHIFT 0
+#define GAUDI2_PKT_FENCE_CTL_PRED_MASK 0x0000001F
+
+struct packet_fence {
+ __le32 cfg;
+ __le32 ctl;
+};
+
+#define GAUDI2_PKT_LIN_DMA_CTL_WRCOMP_SHIFT 0
+#define GAUDI2_PKT_LIN_DMA_CTL_WRCOMP_MASK 0x00000001
+
+#define GAUDI2_PKT_LIN_DMA_CTL_ENDIAN_SHIFT 1
+#define GAUDI2_PKT_LIN_DMA_CTL_ENDIAN_MASK 0x00000006
+
+#define GAUDI2_PKT_LIN_DMA_CTL_MEMSET_SHIFT 4
+#define GAUDI2_PKT_LIN_DMA_CTL_MEMSET_MASK 0x00000010
+
+#define GAUDI2_PKT_LIN_DMA_CTL_CONTEXT_ID_SHIFT 8
+#define GAUDI2_PKT_LIN_DMA_CTL_CONTEXT_ID_MASK 0x00FFFF00
+
+struct packet_lin_dma {
+ __le32 tsize;
+ __le32 ctl;
+ __le64 src_addr;
+ __le64 dst_addr;
+};
+
+struct packet_arb_point {
+ __le32 cfg;
+ __le32 ctl;
+};
+
+struct packet_repeat {
+ __le32 cfg;
+ __le32 ctl;
+};
+
+struct packet_wait {
+ __le32 cfg;
+ __le32 ctl;
+};
+
+struct packet_cb_list {
+ __le32 reserved;
+ __le32 ctl;
+ __le64 index_addr;
+ __le64 table_addr;
+};
+
+struct packet_load_and_exe {
+ __le32 cfg;
+ __le32 ctl;
+ __le64 src_addr;
+};
+
+struct packet_cp_dma {
+ __le32 tsize;
+ __le32 ctl;
+ __le64 src_addr;
+};
+
+#endif /* GAUDI2_PACKETS_H */