1*9ab65affSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2584ec227SDan Williams /* 3584ec227SDan Williams * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 4584ec227SDan Williams */ 5584ec227SDan Williams #ifndef _IOAT_HW_H_ 6584ec227SDan Williams #define _IOAT_HW_H_ 7584ec227SDan Williams 8584ec227SDan Williams /* PCI Configuration Space Values */ 9e6c0b69aSDan Williams #define IOAT_MMIO_BAR 0 10584ec227SDan Williams 11584ec227SDan Williams /* CB device ID's */ 121a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB0 0x0e20 131a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB1 0x0e21 141a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB2 0x0e22 151a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB3 0x0e23 161a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB4 0x0e24 171a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB5 0x0e25 181a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB6 0x0e26 191a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB7 0x0e27 201a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB8 0x0e2e 211a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB9 0x0e2f 221a363068SDave Jiang 23570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW0 0x2f20 24570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW1 0x2f21 25570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW2 0x2f22 26570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW3 0x2f23 27570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW4 0x2f24 28570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW5 0x2f25 29570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW6 0x2f26 30570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW7 0x2f27 31570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW8 0x2f2e 32570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW9 0x2f2f 33570727b5SDave Jiang 340132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD0 0x0C50 350132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD1 0x0C51 360132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD2 0x0C52 370132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD3 0x0C53 380132bcefSDave Jiang 3968a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE0 0x6f50 4068a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE1 0x6f51 4168a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE2 0x6f52 4268a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE3 0x6f53 4368a8cc9eSDave Jiang 44ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX0 0x6f20 45ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX1 0x6f21 46ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX2 0x6f22 47ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX3 0x6f23 48ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX4 0x6f24 49ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX5 0x6f25 50ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX6 0x6f26 51ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX7 0x6f27 52ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX8 0x6f2e 53ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX9 0x6f2f 54ab98193dSDave Jiang 551594c18fSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_SKX 0x2021 561594c18fSDave Jiang 574d75873fSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_ICX 0x0b00 584d75873fSDave Jiang 59570727b5SDave Jiang #define IOAT_VER_1_2 0x12 /* Version 1.2 */ 60570727b5SDave Jiang #define IOAT_VER_2_0 0x20 /* Version 2.0 */ 61570727b5SDave Jiang #define IOAT_VER_3_0 0x30 /* Version 3.0 */ 62570727b5SDave Jiang #define IOAT_VER_3_2 0x32 /* Version 3.2 */ 630132bcefSDave Jiang #define IOAT_VER_3_3 0x33 /* Version 3.3 */ 6411e31e28SDave Jiang #define IOAT_VER_3_4 0x34 /* Version 3.4 */ 65570727b5SDave Jiang 66570727b5SDave Jiang 67228c4f5cSDan Williams int system_has_dca_enabled(struct pci_dev *pdev); 68228c4f5cSDan Williams 69dd4645ebSDave Jiang #define IOAT_DESC_SZ 64 70dd4645ebSDave Jiang 71584ec227SDan Williams struct ioat_dma_descriptor { 72584ec227SDan Williams uint32_t size; 73c7984f4eSDan Williams union { 74584ec227SDan Williams uint32_t ctl; 75c7984f4eSDan Williams struct { 76c7984f4eSDan Williams unsigned int int_en:1; 77c7984f4eSDan Williams unsigned int src_snoop_dis:1; 78c7984f4eSDan Williams unsigned int dest_snoop_dis:1; 79c7984f4eSDan Williams unsigned int compl_write:1; 80c7984f4eSDan Williams unsigned int fence:1; 81c7984f4eSDan Williams unsigned int null:1; 82c7984f4eSDan Williams unsigned int src_brk:1; 83c7984f4eSDan Williams unsigned int dest_brk:1; 84c7984f4eSDan Williams unsigned int bundle:1; 85c7984f4eSDan Williams unsigned int dest_dca:1; 86c7984f4eSDan Williams unsigned int hint:1; 87c7984f4eSDan Williams unsigned int rsvd2:13; 882aec048cSDan Williams #define IOAT_OP_COPY 0x00 89c7984f4eSDan Williams unsigned int op:8; 90c7984f4eSDan Williams } ctl_f; 91c7984f4eSDan Williams }; 92584ec227SDan Williams uint64_t src_addr; 93584ec227SDan Williams uint64_t dst_addr; 94584ec227SDan Williams uint64_t next; 95584ec227SDan Williams uint64_t rsv1; 96584ec227SDan Williams uint64_t rsv2; 97ad643f54SDan Williams /* store some driver data in an unused portion of the descriptor */ 98ad643f54SDan Williams union { 99584ec227SDan Williams uint64_t user1; 100ad643f54SDan Williams uint64_t tx_cnt; 101ad643f54SDan Williams }; 102584ec227SDan Williams uint64_t user2; 103584ec227SDan Williams }; 1042aec048cSDan Williams 1052aec048cSDan Williams struct ioat_xor_descriptor { 1062aec048cSDan Williams uint32_t size; 1072aec048cSDan Williams union { 1082aec048cSDan Williams uint32_t ctl; 1092aec048cSDan Williams struct { 1102aec048cSDan Williams unsigned int int_en:1; 1112aec048cSDan Williams unsigned int src_snoop_dis:1; 1122aec048cSDan Williams unsigned int dest_snoop_dis:1; 1132aec048cSDan Williams unsigned int compl_write:1; 1142aec048cSDan Williams unsigned int fence:1; 1152aec048cSDan Williams unsigned int src_cnt:3; 1162aec048cSDan Williams unsigned int bundle:1; 1172aec048cSDan Williams unsigned int dest_dca:1; 1182aec048cSDan Williams unsigned int hint:1; 1192aec048cSDan Williams unsigned int rsvd:13; 1202aec048cSDan Williams #define IOAT_OP_XOR 0x87 1212aec048cSDan Williams #define IOAT_OP_XOR_VAL 0x88 1222aec048cSDan Williams unsigned int op:8; 1232aec048cSDan Williams } ctl_f; 1242aec048cSDan Williams }; 1252aec048cSDan Williams uint64_t src_addr; 1262aec048cSDan Williams uint64_t dst_addr; 1272aec048cSDan Williams uint64_t next; 1282aec048cSDan Williams uint64_t src_addr2; 1292aec048cSDan Williams uint64_t src_addr3; 1302aec048cSDan Williams uint64_t src_addr4; 1312aec048cSDan Williams uint64_t src_addr5; 1322aec048cSDan Williams }; 1332aec048cSDan Williams 1342aec048cSDan Williams struct ioat_xor_ext_descriptor { 1352aec048cSDan Williams uint64_t src_addr6; 1362aec048cSDan Williams uint64_t src_addr7; 1372aec048cSDan Williams uint64_t src_addr8; 1382aec048cSDan Williams uint64_t next; 1392aec048cSDan Williams uint64_t rsvd[4]; 1402aec048cSDan Williams }; 1412aec048cSDan Williams 1422aec048cSDan Williams struct ioat_pq_descriptor { 14375c6f0abSDave Jiang union { 1442aec048cSDan Williams uint32_t size; 14575c6f0abSDave Jiang uint32_t dwbes; 14675c6f0abSDave Jiang struct { 14775c6f0abSDave Jiang unsigned int rsvd:25; 14875c6f0abSDave Jiang unsigned int p_val_err:1; 14975c6f0abSDave Jiang unsigned int q_val_err:1; 15075c6f0abSDave Jiang unsigned int rsvd1:4; 15175c6f0abSDave Jiang unsigned int wbes:1; 15275c6f0abSDave Jiang } dwbes_f; 15375c6f0abSDave Jiang }; 1542aec048cSDan Williams union { 1552aec048cSDan Williams uint32_t ctl; 1562aec048cSDan Williams struct { 1572aec048cSDan Williams unsigned int int_en:1; 1582aec048cSDan Williams unsigned int src_snoop_dis:1; 1592aec048cSDan Williams unsigned int dest_snoop_dis:1; 1602aec048cSDan Williams unsigned int compl_write:1; 1612aec048cSDan Williams unsigned int fence:1; 1622aec048cSDan Williams unsigned int src_cnt:3; 1632aec048cSDan Williams unsigned int bundle:1; 1642aec048cSDan Williams unsigned int dest_dca:1; 1652aec048cSDan Williams unsigned int hint:1; 1662aec048cSDan Williams unsigned int p_disable:1; 1672aec048cSDan Williams unsigned int q_disable:1; 16875c6f0abSDave Jiang unsigned int rsvd2:2; 16975c6f0abSDave Jiang unsigned int wb_en:1; 17075c6f0abSDave Jiang unsigned int prl_en:1; 17175c6f0abSDave Jiang unsigned int rsvd3:7; 1722aec048cSDan Williams #define IOAT_OP_PQ 0x89 1732aec048cSDan Williams #define IOAT_OP_PQ_VAL 0x8a 1747727eaa4SDave Jiang #define IOAT_OP_PQ_16S 0xa0 1757727eaa4SDave Jiang #define IOAT_OP_PQ_VAL_16S 0xa1 1762aec048cSDan Williams unsigned int op:8; 1772aec048cSDan Williams } ctl_f; 1782aec048cSDan Williams }; 1792aec048cSDan Williams uint64_t src_addr; 1802aec048cSDan Williams uint64_t p_addr; 1812aec048cSDan Williams uint64_t next; 1822aec048cSDan Williams uint64_t src_addr2; 1837727eaa4SDave Jiang union { 1842aec048cSDan Williams uint64_t src_addr3; 1857727eaa4SDave Jiang uint64_t sed_addr; 1867727eaa4SDave Jiang }; 1872aec048cSDan Williams uint8_t coef[8]; 1882aec048cSDan Williams uint64_t q_addr; 1892aec048cSDan Williams }; 1902aec048cSDan Williams 1912aec048cSDan Williams struct ioat_pq_ext_descriptor { 1922aec048cSDan Williams uint64_t src_addr4; 1932aec048cSDan Williams uint64_t src_addr5; 1942aec048cSDan Williams uint64_t src_addr6; 1952aec048cSDan Williams uint64_t next; 1962aec048cSDan Williams uint64_t src_addr7; 1972aec048cSDan Williams uint64_t src_addr8; 1982aec048cSDan Williams uint64_t rsvd[2]; 1992aec048cSDan Williams }; 2002aec048cSDan Williams 2012aec048cSDan Williams struct ioat_pq_update_descriptor { 2022aec048cSDan Williams uint32_t size; 2032aec048cSDan Williams union { 2042aec048cSDan Williams uint32_t ctl; 2052aec048cSDan Williams struct { 2062aec048cSDan Williams unsigned int int_en:1; 2072aec048cSDan Williams unsigned int src_snoop_dis:1; 2082aec048cSDan Williams unsigned int dest_snoop_dis:1; 2092aec048cSDan Williams unsigned int compl_write:1; 2102aec048cSDan Williams unsigned int fence:1; 2112aec048cSDan Williams unsigned int src_cnt:3; 2122aec048cSDan Williams unsigned int bundle:1; 2132aec048cSDan Williams unsigned int dest_dca:1; 2142aec048cSDan Williams unsigned int hint:1; 2152aec048cSDan Williams unsigned int p_disable:1; 2162aec048cSDan Williams unsigned int q_disable:1; 2172aec048cSDan Williams unsigned int rsvd:3; 2182aec048cSDan Williams unsigned int coef:8; 2192aec048cSDan Williams #define IOAT_OP_PQ_UP 0x8b 2202aec048cSDan Williams unsigned int op:8; 2212aec048cSDan Williams } ctl_f; 2222aec048cSDan Williams }; 2232aec048cSDan Williams uint64_t src_addr; 2242aec048cSDan Williams uint64_t p_addr; 2252aec048cSDan Williams uint64_t next; 2262aec048cSDan Williams uint64_t src_addr2; 2272aec048cSDan Williams uint64_t p_src; 2282aec048cSDan Williams uint64_t q_src; 2292aec048cSDan Williams uint64_t q_addr; 2302aec048cSDan Williams }; 2312aec048cSDan Williams 2322aec048cSDan Williams struct ioat_raw_descriptor { 2332aec048cSDan Williams uint64_t field[8]; 2342aec048cSDan Williams }; 2357727eaa4SDave Jiang 2367727eaa4SDave Jiang struct ioat_pq16a_descriptor { 2377727eaa4SDave Jiang uint8_t coef[8]; 2387727eaa4SDave Jiang uint64_t src_addr3; 2397727eaa4SDave Jiang uint64_t src_addr4; 2407727eaa4SDave Jiang uint64_t src_addr5; 2417727eaa4SDave Jiang uint64_t src_addr6; 2427727eaa4SDave Jiang uint64_t src_addr7; 2437727eaa4SDave Jiang uint64_t src_addr8; 2447727eaa4SDave Jiang uint64_t src_addr9; 2457727eaa4SDave Jiang }; 2467727eaa4SDave Jiang 2477727eaa4SDave Jiang struct ioat_pq16b_descriptor { 2487727eaa4SDave Jiang uint64_t src_addr10; 2497727eaa4SDave Jiang uint64_t src_addr11; 2507727eaa4SDave Jiang uint64_t src_addr12; 2517727eaa4SDave Jiang uint64_t src_addr13; 2527727eaa4SDave Jiang uint64_t src_addr14; 2537727eaa4SDave Jiang uint64_t src_addr15; 2547727eaa4SDave Jiang uint64_t src_addr16; 2557727eaa4SDave Jiang uint64_t rsvd; 2567727eaa4SDave Jiang }; 2577727eaa4SDave Jiang 2587727eaa4SDave Jiang union ioat_sed_pq_descriptor { 2597727eaa4SDave Jiang struct ioat_pq16a_descriptor a; 2607727eaa4SDave Jiang struct ioat_pq16b_descriptor b; 2617727eaa4SDave Jiang }; 2627727eaa4SDave Jiang 2637727eaa4SDave Jiang #define SED_SIZE 64 2647727eaa4SDave Jiang 2657727eaa4SDave Jiang struct ioat_sed_raw_descriptor { 2667727eaa4SDave Jiang uint64_t a[8]; 2677727eaa4SDave Jiang uint64_t b[8]; 2687727eaa4SDave Jiang uint64_t c[8]; 2697727eaa4SDave Jiang }; 2707727eaa4SDave Jiang 271584ec227SDan Williams #endif 272