xref: /dpdk/drivers/dma/ioat/ioat_hw_defs.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1866e46bcSConor Walsh /* SPDX-License-Identifier: BSD-3-Clause
2866e46bcSConor Walsh  * Copyright(c) 2021 Intel Corporation
3866e46bcSConor Walsh  */
4866e46bcSConor Walsh 
5866e46bcSConor Walsh #ifndef IOAT_HW_DEFS_H
6866e46bcSConor Walsh #define IOAT_HW_DEFS_H
7866e46bcSConor Walsh 
8719834a6SMattias Rönnblom #include <stdint.h>
9719834a6SMattias Rönnblom 
10866e46bcSConor Walsh #ifdef __cplusplus
11866e46bcSConor Walsh extern "C" {
12866e46bcSConor Walsh #endif
13866e46bcSConor Walsh 
1413859ab7SConor Walsh #define IOAT_PCI_CHANERR_INT_OFFSET	0x180
1513859ab7SConor Walsh 
16866e46bcSConor Walsh #define IOAT_VER_3_0	0x30
17866e46bcSConor Walsh #define IOAT_VER_3_3	0x33
184ffd2247SConor Walsh #define IOAT_VER_3_4	0x34
19866e46bcSConor Walsh 
20866e46bcSConor Walsh #define IOAT_VENDOR_ID		0x8086
21866e46bcSConor Walsh #define IOAT_DEVICE_ID_SKX	0x2021
22866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX0	0x6f20
23866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX1	0x6f21
24866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX2	0x6f22
25866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX3	0x6f23
26866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX4	0x6f24
27866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX5	0x6f25
28866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX6	0x6f26
29866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDX7	0x6f27
30866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDXE	0x6f2E
31866e46bcSConor Walsh #define IOAT_DEVICE_ID_BDXF	0x6f2F
32866e46bcSConor Walsh #define IOAT_DEVICE_ID_ICX	0x0b00
33866e46bcSConor Walsh 
3413859ab7SConor Walsh #define IOAT_COMP_UPDATE_SHIFT	3
3513859ab7SConor Walsh #define IOAT_CMD_OP_SHIFT	24
3613859ab7SConor Walsh 
3713859ab7SConor Walsh /* DMA Channel Registers */
3813859ab7SConor Walsh #define IOAT_CHANCTRL_CHANNEL_PRIORITY_MASK		0xF000
3913859ab7SConor Walsh #define IOAT_CHANCTRL_COMPL_DCA_EN			0x0200
4013859ab7SConor Walsh #define IOAT_CHANCTRL_CHANNEL_IN_USE			0x0100
4113859ab7SConor Walsh #define IOAT_CHANCTRL_DESCRIPTOR_ADDR_SNOOP_CONTROL	0x0020
4213859ab7SConor Walsh #define IOAT_CHANCTRL_ERR_INT_EN			0x0010
4313859ab7SConor Walsh #define IOAT_CHANCTRL_ANY_ERR_ABORT_EN			0x0008
4413859ab7SConor Walsh #define IOAT_CHANCTRL_ERR_COMPLETION_EN			0x0004
4513859ab7SConor Walsh #define IOAT_CHANCTRL_INT_REARM				0x0001
4613859ab7SConor Walsh 
474ffd2247SConor Walsh /* DMA Channel Capabilities */
484ffd2247SConor Walsh #define	IOAT_DMACAP_PB		(1 << 0)
494ffd2247SConor Walsh #define	IOAT_DMACAP_DCA		(1 << 4)
504ffd2247SConor Walsh #define	IOAT_DMACAP_BFILL	(1 << 6)
514ffd2247SConor Walsh #define	IOAT_DMACAP_XOR		(1 << 8)
524ffd2247SConor Walsh #define	IOAT_DMACAP_PQ		(1 << 9)
534ffd2247SConor Walsh #define	IOAT_DMACAP_DMA_DIF	(1 << 10)
544ffd2247SConor Walsh 
55*e7750639SAndre Muezerie struct __rte_packed_begin ioat_registers {
5613859ab7SConor Walsh 	uint8_t		chancnt;
5713859ab7SConor Walsh 	uint8_t		xfercap;
5813859ab7SConor Walsh 	uint8_t		genctrl;
5913859ab7SConor Walsh 	uint8_t		intrctrl;
6013859ab7SConor Walsh 	uint32_t	attnstatus;
6113859ab7SConor Walsh 	uint8_t		cbver;		/* 0x08 */
6213859ab7SConor Walsh 	uint8_t		reserved4[0x3]; /* 0x09 */
6313859ab7SConor Walsh 	uint16_t	intrdelay;	/* 0x0C */
6413859ab7SConor Walsh 	uint16_t	cs_status;	/* 0x0E */
6513859ab7SConor Walsh 	uint32_t	dmacapability;	/* 0x10 */
6613859ab7SConor Walsh 	uint8_t		reserved5[0x6C]; /* 0x14 */
6713859ab7SConor Walsh 	uint16_t	chanctrl;	/* 0x80 */
6813859ab7SConor Walsh 	uint8_t		reserved6[0x2];	/* 0x82 */
6913859ab7SConor Walsh 	uint8_t		chancmd;	/* 0x84 */
7013859ab7SConor Walsh 	uint8_t		reserved3[1];	/* 0x85 */
7113859ab7SConor Walsh 	uint16_t	dmacount;	/* 0x86 */
7213859ab7SConor Walsh 	uint64_t	chansts;	/* 0x88 */
7313859ab7SConor Walsh 	uint64_t	chainaddr;	/* 0x90 */
7413859ab7SConor Walsh 	uint64_t	chancmp;	/* 0x98 */
7513859ab7SConor Walsh 	uint8_t		reserved2[0x8];	/* 0xA0 */
7613859ab7SConor Walsh 	uint32_t	chanerr;	/* 0xA8 */
7713859ab7SConor Walsh 	uint32_t	chanerrmask;	/* 0xAC */
78*e7750639SAndre Muezerie } __rte_packed_end;
7913859ab7SConor Walsh 
8013859ab7SConor Walsh #define IOAT_CHANCMD_RESET	0x20
8113859ab7SConor Walsh #define IOAT_CHANCMD_SUSPEND	0x04
8213859ab7SConor Walsh 
834ffd2247SConor Walsh #define IOAT_CHANSTS_STATUS	0x7ULL
844ffd2247SConor Walsh #define IOAT_CHANSTS_ACTIVE	0x0
854ffd2247SConor Walsh #define IOAT_CHANSTS_IDLE	0x1
864ffd2247SConor Walsh #define IOAT_CHANSTS_SUSPENDED	0x2
874ffd2247SConor Walsh #define IOAT_CHANSTS_HALTED	0x3
884ffd2247SConor Walsh #define IOAT_CHANSTS_ARMED	0x4
894ffd2247SConor Walsh 
904ffd2247SConor Walsh #define IOAT_CHANERR_INVALID_SRC_ADDR_MASK		(1 << 0)
914ffd2247SConor Walsh #define IOAT_CHANERR_INVALID_DST_ADDR_MASK		(1 << 1)
924ffd2247SConor Walsh #define IOAT_CHANERR_DESCRIPTOR_READ_ERROR_MASK		(1 << 8)
934ffd2247SConor Walsh #define IOAT_CHANERR_INVALID_LENGTH_MASK		(1 << 10)
944ffd2247SConor Walsh 
954ffd2247SConor Walsh const char *chansts_readable[] = {
964ffd2247SConor Walsh 	"ACTIVE",	/* 0x0 */
974ffd2247SConor Walsh 	"IDLE",		/* 0x1 */
984ffd2247SConor Walsh 	"SUSPENDED",	/* 0x2 */
994ffd2247SConor Walsh 	"HALTED",	/* 0x3 */
1004ffd2247SConor Walsh 	"ARMED"		/* 0x4 */
1014ffd2247SConor Walsh };
1024ffd2247SConor Walsh 
1034ffd2247SConor Walsh #define IOAT_CHANSTS_UNAFFILIATED_ERROR	0x8ULL
1044ffd2247SConor Walsh #define IOAT_CHANSTS_SOFT_ERROR		0x10ULL
1054ffd2247SConor Walsh 
1064ffd2247SConor Walsh #define IOAT_CHANSTS_COMPLETED_DESCRIPTOR_MASK	(~0x3FULL)
1074ffd2247SConor Walsh 
10813859ab7SConor Walsh #define IOAT_CHANCMP_ALIGN	8 /* CHANCMP address must be 64-bit aligned */
10913859ab7SConor Walsh 
1104ffd2247SConor Walsh struct ioat_dma_hw_desc {
1114ffd2247SConor Walsh 	uint32_t size;
1124ffd2247SConor Walsh 	union {
1134ffd2247SConor Walsh 		uint32_t control_raw;
1144ffd2247SConor Walsh 		struct {
1154ffd2247SConor Walsh 			uint32_t int_enable: 1;
1164ffd2247SConor Walsh 			uint32_t src_snoop_disable: 1;
1174ffd2247SConor Walsh 			uint32_t dest_snoop_disable: 1;
1184ffd2247SConor Walsh 			uint32_t completion_update: 1;
1194ffd2247SConor Walsh 			uint32_t fence: 1;
1204ffd2247SConor Walsh 			uint32_t null: 1;
1214ffd2247SConor Walsh 			uint32_t src_page_break: 1;
1224ffd2247SConor Walsh 			uint32_t dest_page_break: 1;
1234ffd2247SConor Walsh 			uint32_t bundle: 1;
1244ffd2247SConor Walsh 			uint32_t dest_dca: 1;
1254ffd2247SConor Walsh 			uint32_t hint: 1;
1264ffd2247SConor Walsh 			uint32_t reserved: 13;
1274ffd2247SConor Walsh #define IOAT_OP_COPY 0x00
1284ffd2247SConor Walsh 			uint32_t op: 8;
1294ffd2247SConor Walsh 		} control;
1304ffd2247SConor Walsh 	} u;
1314ffd2247SConor Walsh 	uint64_t src_addr;
1324ffd2247SConor Walsh 	uint64_t dest_addr;
1334ffd2247SConor Walsh 	uint64_t next;
1344ffd2247SConor Walsh 	uint64_t reserved;
1354ffd2247SConor Walsh 	uint64_t reserved2;
1364ffd2247SConor Walsh 	uint64_t user1;
1374ffd2247SConor Walsh 	uint64_t user2;
1384ffd2247SConor Walsh };
1394ffd2247SConor Walsh 
1404ffd2247SConor Walsh struct ioat_fill_hw_desc {
1414ffd2247SConor Walsh 	uint32_t size;
1424ffd2247SConor Walsh 	union {
1434ffd2247SConor Walsh 		uint32_t control_raw;
1444ffd2247SConor Walsh 		struct {
1454ffd2247SConor Walsh 			uint32_t int_enable: 1;
1464ffd2247SConor Walsh 			uint32_t reserved: 1;
1474ffd2247SConor Walsh 			uint32_t dest_snoop_disable: 1;
1484ffd2247SConor Walsh 			uint32_t completion_update: 1;
1494ffd2247SConor Walsh 			uint32_t fence: 1;
1504ffd2247SConor Walsh 			uint32_t reserved2: 2;
1514ffd2247SConor Walsh 			uint32_t dest_page_break: 1;
1524ffd2247SConor Walsh 			uint32_t bundle: 1;
1534ffd2247SConor Walsh 			uint32_t reserved3: 15;
1544ffd2247SConor Walsh #define IOAT_OP_FILL 0x01
1554ffd2247SConor Walsh 			uint32_t op: 8;
1564ffd2247SConor Walsh 		} control;
1574ffd2247SConor Walsh 	} u;
1584ffd2247SConor Walsh 	uint64_t src_data;
1594ffd2247SConor Walsh 	uint64_t dest_addr;
1604ffd2247SConor Walsh 	uint64_t next;
1614ffd2247SConor Walsh 	uint64_t reserved;
1624ffd2247SConor Walsh 	uint64_t next_dest_addr;
1634ffd2247SConor Walsh 	uint64_t user1;
1644ffd2247SConor Walsh 	uint64_t user2;
1654ffd2247SConor Walsh };
1664ffd2247SConor Walsh 
1674ffd2247SConor Walsh struct ioat_xor_hw_desc {
1684ffd2247SConor Walsh 	uint32_t size;
1694ffd2247SConor Walsh 	union {
1704ffd2247SConor Walsh 		uint32_t control_raw;
1714ffd2247SConor Walsh 		struct {
1724ffd2247SConor Walsh 			uint32_t int_enable: 1;
1734ffd2247SConor Walsh 			uint32_t src_snoop_disable: 1;
1744ffd2247SConor Walsh 			uint32_t dest_snoop_disable: 1;
1754ffd2247SConor Walsh 			uint32_t completion_update: 1;
1764ffd2247SConor Walsh 			uint32_t fence: 1;
1774ffd2247SConor Walsh 			uint32_t src_count: 3;
1784ffd2247SConor Walsh 			uint32_t bundle: 1;
1794ffd2247SConor Walsh 			uint32_t dest_dca: 1;
1804ffd2247SConor Walsh 			uint32_t hint: 1;
1814ffd2247SConor Walsh 			uint32_t reserved: 13;
1824ffd2247SConor Walsh #define IOAT_OP_XOR 0x87
1834ffd2247SConor Walsh #define IOAT_OP_XOR_VAL 0x88
1844ffd2247SConor Walsh 			uint32_t op: 8;
1854ffd2247SConor Walsh 		} control;
1864ffd2247SConor Walsh 	} u;
1874ffd2247SConor Walsh 	uint64_t src_addr;
1884ffd2247SConor Walsh 	uint64_t dest_addr;
1894ffd2247SConor Walsh 	uint64_t next;
1904ffd2247SConor Walsh 	uint64_t src_addr2;
1914ffd2247SConor Walsh 	uint64_t src_addr3;
1924ffd2247SConor Walsh 	uint64_t src_addr4;
1934ffd2247SConor Walsh 	uint64_t src_addr5;
1944ffd2247SConor Walsh };
1954ffd2247SConor Walsh 
1964ffd2247SConor Walsh struct ioat_xor_ext_hw_desc {
1974ffd2247SConor Walsh 	uint64_t src_addr6;
1984ffd2247SConor Walsh 	uint64_t src_addr7;
1994ffd2247SConor Walsh 	uint64_t src_addr8;
2004ffd2247SConor Walsh 	uint64_t next;
2014ffd2247SConor Walsh 	uint64_t reserved[4];
2024ffd2247SConor Walsh };
2034ffd2247SConor Walsh 
2044ffd2247SConor Walsh struct ioat_pq_hw_desc {
2054ffd2247SConor Walsh 	uint32_t size;
2064ffd2247SConor Walsh 	union {
2074ffd2247SConor Walsh 		uint32_t control_raw;
2084ffd2247SConor Walsh 		struct {
2094ffd2247SConor Walsh 			uint32_t int_enable: 1;
2104ffd2247SConor Walsh 			uint32_t src_snoop_disable: 1;
2114ffd2247SConor Walsh 			uint32_t dest_snoop_disable: 1;
2124ffd2247SConor Walsh 			uint32_t completion_update: 1;
2134ffd2247SConor Walsh 			uint32_t fence: 1;
2144ffd2247SConor Walsh 			uint32_t src_count: 3;
2154ffd2247SConor Walsh 			uint32_t bundle: 1;
2164ffd2247SConor Walsh 			uint32_t dest_dca: 1;
2174ffd2247SConor Walsh 			uint32_t hint: 1;
2184ffd2247SConor Walsh 			uint32_t p_disable: 1;
2194ffd2247SConor Walsh 			uint32_t q_disable: 1;
2204ffd2247SConor Walsh 			uint32_t reserved: 11;
2214ffd2247SConor Walsh #define IOAT_OP_PQ 0x89
2224ffd2247SConor Walsh #define IOAT_OP_PQ_VAL 0x8a
2234ffd2247SConor Walsh 			uint32_t op: 8;
2244ffd2247SConor Walsh 		} control;
2254ffd2247SConor Walsh 	} u;
2264ffd2247SConor Walsh 	uint64_t src_addr;
2274ffd2247SConor Walsh 	uint64_t p_addr;
2284ffd2247SConor Walsh 	uint64_t next;
2294ffd2247SConor Walsh 	uint64_t src_addr2;
2304ffd2247SConor Walsh 	uint64_t src_addr3;
2314ffd2247SConor Walsh 	uint8_t  coef[8];
2324ffd2247SConor Walsh 	uint64_t q_addr;
2334ffd2247SConor Walsh };
2344ffd2247SConor Walsh 
2354ffd2247SConor Walsh struct ioat_pq_ext_hw_desc {
2364ffd2247SConor Walsh 	uint64_t src_addr4;
2374ffd2247SConor Walsh 	uint64_t src_addr5;
2384ffd2247SConor Walsh 	uint64_t src_addr6;
2394ffd2247SConor Walsh 	uint64_t next;
2404ffd2247SConor Walsh 	uint64_t src_addr7;
2414ffd2247SConor Walsh 	uint64_t src_addr8;
2424ffd2247SConor Walsh 	uint64_t reserved[2];
2434ffd2247SConor Walsh };
2444ffd2247SConor Walsh 
2454ffd2247SConor Walsh struct ioat_pq_update_hw_desc {
2464ffd2247SConor Walsh 	uint32_t size;
2474ffd2247SConor Walsh 	union {
2484ffd2247SConor Walsh 		uint32_t control_raw;
2494ffd2247SConor Walsh 		struct {
2504ffd2247SConor Walsh 			uint32_t int_enable: 1;
2514ffd2247SConor Walsh 			uint32_t src_snoop_disable: 1;
2524ffd2247SConor Walsh 			uint32_t dest_snoop_disable: 1;
2534ffd2247SConor Walsh 			uint32_t completion_update: 1;
2544ffd2247SConor Walsh 			uint32_t fence: 1;
2554ffd2247SConor Walsh 			uint32_t src_cnt: 3;
2564ffd2247SConor Walsh 			uint32_t bundle: 1;
2574ffd2247SConor Walsh 			uint32_t dest_dca: 1;
2584ffd2247SConor Walsh 			uint32_t hint: 1;
2594ffd2247SConor Walsh 			uint32_t p_disable: 1;
2604ffd2247SConor Walsh 			uint32_t q_disable: 1;
2614ffd2247SConor Walsh 			uint32_t reserved: 3;
2624ffd2247SConor Walsh 			uint32_t coef: 8;
2634ffd2247SConor Walsh #define IOAT_OP_PQ_UP 0x8b
2644ffd2247SConor Walsh 			uint32_t op: 8;
2654ffd2247SConor Walsh 		} control;
2664ffd2247SConor Walsh 	} u;
2674ffd2247SConor Walsh 	uint64_t src_addr;
2684ffd2247SConor Walsh 	uint64_t p_addr;
2694ffd2247SConor Walsh 	uint64_t next;
2704ffd2247SConor Walsh 	uint64_t src_addr2;
2714ffd2247SConor Walsh 	uint64_t p_src;
2724ffd2247SConor Walsh 	uint64_t q_src;
2734ffd2247SConor Walsh 	uint64_t q_addr;
2744ffd2247SConor Walsh };
2754ffd2247SConor Walsh 
2764ffd2247SConor Walsh union ioat_hw_desc {
2774ffd2247SConor Walsh 	struct ioat_dma_hw_desc dma;
2784ffd2247SConor Walsh 	struct ioat_fill_hw_desc fill;
2794ffd2247SConor Walsh 	struct ioat_xor_hw_desc xor_desc;
2804ffd2247SConor Walsh 	struct ioat_xor_ext_hw_desc xor_ext;
2814ffd2247SConor Walsh 	struct ioat_pq_hw_desc pq;
2824ffd2247SConor Walsh 	struct ioat_pq_ext_hw_desc pq_ext;
2834ffd2247SConor Walsh 	struct ioat_pq_update_hw_desc pq_update;
2844ffd2247SConor Walsh };
2854ffd2247SConor Walsh 
2864ffd2247SConor Walsh #define GENSTS_DEV_STATE_MASK 0x03
2874ffd2247SConor Walsh #define CMDSTATUS_ACTIVE_SHIFT 31
2884ffd2247SConor Walsh #define CMDSTATUS_ACTIVE_MASK (1 << 31)
2894ffd2247SConor Walsh #define CMDSTATUS_ERR_MASK 0xFF
2904ffd2247SConor Walsh 
291866e46bcSConor Walsh #ifdef __cplusplus
292866e46bcSConor Walsh }
293866e46bcSConor Walsh #endif
294866e46bcSConor Walsh 
295866e46bcSConor Walsh #endif /* IOAT_HW_DEFS_H */
296