linux/drivers/misc/habanalabs/include/goya/goya_packets.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 *
   3 * Copyright 2017-2018 HabanaLabs, Ltd.
   4 * All Rights Reserved.
   5 *
   6 */
   7
   8#ifndef GOYA_PACKETS_H
   9#define GOYA_PACKETS_H
  10
  11#include <linux/types.h>
  12
  13#define PACKET_HEADER_PACKET_ID_SHIFT           56
  14#define PACKET_HEADER_PACKET_ID_MASK            0x1F00000000000000ull
  15
  16enum packet_id {
  17        PACKET_WREG_32 = 0x1,
  18        PACKET_WREG_BULK = 0x2,
  19        PACKET_MSG_LONG = 0x3,
  20        PACKET_MSG_SHORT = 0x4,
  21        PACKET_CP_DMA = 0x5,
  22        PACKET_MSG_PROT = 0x7,
  23        PACKET_FENCE = 0x8,
  24        PACKET_LIN_DMA = 0x9,
  25        PACKET_NOP = 0xA,
  26        PACKET_STOP = 0xB,
  27        MAX_PACKET_ID = (PACKET_HEADER_PACKET_ID_MASK >>
  28                                PACKET_HEADER_PACKET_ID_SHIFT) + 1
  29};
  30
  31enum goya_dma_direction {
  32        DMA_HOST_TO_DRAM,
  33        DMA_HOST_TO_SRAM,
  34        DMA_DRAM_TO_SRAM,
  35        DMA_SRAM_TO_DRAM,
  36        DMA_SRAM_TO_HOST,
  37        DMA_DRAM_TO_HOST,
  38        DMA_DRAM_TO_DRAM,
  39        DMA_SRAM_TO_SRAM,
  40        DMA_ENUM_MAX
  41};
  42
  43#define GOYA_PKT_CTL_OPCODE_SHIFT       24
  44#define GOYA_PKT_CTL_OPCODE_MASK        0x1F000000
  45
  46#define GOYA_PKT_CTL_EB_SHIFT           29
  47#define GOYA_PKT_CTL_EB_MASK            0x20000000
  48
  49#define GOYA_PKT_CTL_RB_SHIFT           30
  50#define GOYA_PKT_CTL_RB_MASK            0x40000000
  51
  52#define GOYA_PKT_CTL_MB_SHIFT           31
  53#define GOYA_PKT_CTL_MB_MASK            0x80000000
  54
  55/* All packets have, at least, an 8-byte header, which contains
  56 * the packet type. The kernel driver uses the packet header for packet
  57 * validation and to perform any necessary required preparation before
  58 * sending them off to the hardware.
  59 */
  60struct goya_packet {
  61        __le64 header;
  62        /* The rest of the packet data follows. Use the corresponding
  63         * packet_XXX struct to deference the data, based on packet type
  64         */
  65        u8 contents[0];
  66};
  67
  68struct packet_nop {
  69        __le32 reserved;
  70        __le32 ctl;
  71};
  72
  73struct packet_stop {
  74        __le32 reserved;
  75        __le32 ctl;
  76};
  77
  78#define GOYA_PKT_WREG32_CTL_REG_OFFSET_SHIFT    0
  79#define GOYA_PKT_WREG32_CTL_REG_OFFSET_MASK     0x0000FFFF
  80
  81struct packet_wreg32 {
  82        __le32 value;
  83        __le32 ctl;
  84};
  85
  86struct packet_wreg_bulk {
  87        __le32 size64;
  88        __le32 ctl;
  89        __le64 values[0]; /* data starts here */
  90};
  91
  92struct packet_msg_long {
  93        __le32 value;
  94        __le32 ctl;
  95        __le64 addr;
  96};
  97
  98struct packet_msg_short {
  99        __le32 value;
 100        __le32 ctl;
 101};
 102
 103struct packet_msg_prot {
 104        __le32 value;
 105        __le32 ctl;
 106        __le64 addr;
 107};
 108
 109struct packet_fence {
 110        __le32 cfg;
 111        __le32 ctl;
 112};
 113
 114#define GOYA_PKT_LIN_DMA_CTL_WO_SHIFT           0
 115#define GOYA_PKT_LIN_DMA_CTL_WO_MASK            0x00000001
 116
 117#define GOYA_PKT_LIN_DMA_CTL_RDCOMP_SHIFT       1
 118#define GOYA_PKT_LIN_DMA_CTL_RDCOMP_MASK        0x00000002
 119
 120#define GOYA_PKT_LIN_DMA_CTL_WRCOMP_SHIFT       2
 121#define GOYA_PKT_LIN_DMA_CTL_WRCOMP_MASK        0x00000004
 122
 123#define GOYA_PKT_LIN_DMA_CTL_MEMSET_SHIFT       6
 124#define GOYA_PKT_LIN_DMA_CTL_MEMSET_MASK        0x00000040
 125
 126#define GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT      20
 127#define GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK       0x00700000
 128
 129struct packet_lin_dma {
 130        __le32 tsize;
 131        __le32 ctl;
 132        __le64 src_addr;
 133        __le64 dst_addr;
 134};
 135
 136struct packet_cp_dma {
 137        __le32 tsize;
 138        __le32 ctl;
 139        __le64 src_addr;
 140};
 141
 142#endif /* GOYA_PACKETS_H */
 143