Merge tag 'for-5.3-rc8-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[linux-2.6-block.git] / drivers / misc / habanalabs / include / goya / goya_packets.h
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
16 enum 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
31 enum 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  */
60 struct 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
68 struct packet_nop {
69         __le32 reserved;
70         __le32 ctl;
71 };
72
73 struct 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
81 struct packet_wreg32 {
82         __le32 value;
83         __le32 ctl;
84 };
85
86 struct packet_wreg_bulk {
87         __le32 size64;
88         __le32 ctl;
89         __le64 values[0]; /* data starts here */
90 };
91
92 struct packet_msg_long {
93         __le32 value;
94         __le32 ctl;
95         __le64 addr;
96 };
97
98 struct packet_msg_short {
99         __le32 value;
100         __le32 ctl;
101 };
102
103 struct packet_msg_prot {
104         __le32 value;
105         __le32 ctl;
106         __le64 addr;
107 };
108
109 struct 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
129 struct packet_lin_dma {
130         __le32 tsize;
131         __le32 ctl;
132         __le64 src_addr;
133         __le64 dst_addr;
134 };
135
136 struct packet_cp_dma {
137         __le32 tsize;
138         __le32 ctl;
139         __le64 src_addr;
140 };
141
142 #endif /* GOYA_PACKETS_H */