root/drivers/accel/habanalabs/include/gaudi2/gaudi2_packets.h
/* 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[];
};

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[]; /* 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 */