1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _IOAT_HW_H_ 6*4882a593Smuzhiyun #define _IOAT_HW_H_ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* PCI Configuration Space Values */ 9*4882a593Smuzhiyun #define IOAT_MMIO_BAR 0 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* CB device ID's */ 12*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB0 0x0e20 13*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB1 0x0e21 14*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB2 0x0e22 15*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB3 0x0e23 16*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB4 0x0e24 17*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB5 0x0e25 18*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB6 0x0e26 19*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB7 0x0e27 20*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB8 0x0e2e 21*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_IVB9 0x0e2f 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW0 0x2f20 24*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW1 0x2f21 25*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW2 0x2f22 26*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW3 0x2f23 27*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW4 0x2f24 28*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW5 0x2f25 29*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW6 0x2f26 30*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW7 0x2f27 31*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW8 0x2f2e 32*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_HSW9 0x2f2f 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BWD0 0x0C50 35*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BWD1 0x0C51 36*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BWD2 0x0C52 37*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BWD3 0x0C53 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE0 0x6f50 40*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE1 0x6f51 41*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE2 0x6f52 42*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE3 0x6f53 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX0 0x6f20 45*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX1 0x6f21 46*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX2 0x6f22 47*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX3 0x6f23 48*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX4 0x6f24 49*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX5 0x6f25 50*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX6 0x6f26 51*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX7 0x6f27 52*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX8 0x6f2e 53*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_BDX9 0x6f2f 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_SKX 0x2021 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_IOAT_ICX 0x0b00 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define IOAT_VER_1_2 0x12 /* Version 1.2 */ 60*4882a593Smuzhiyun #define IOAT_VER_2_0 0x20 /* Version 2.0 */ 61*4882a593Smuzhiyun #define IOAT_VER_3_0 0x30 /* Version 3.0 */ 62*4882a593Smuzhiyun #define IOAT_VER_3_2 0x32 /* Version 3.2 */ 63*4882a593Smuzhiyun #define IOAT_VER_3_3 0x33 /* Version 3.3 */ 64*4882a593Smuzhiyun #define IOAT_VER_3_4 0x34 /* Version 3.4 */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun int system_has_dca_enabled(struct pci_dev *pdev); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define IOAT_DESC_SZ 64 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct ioat_dma_descriptor { 72*4882a593Smuzhiyun uint32_t size; 73*4882a593Smuzhiyun union { 74*4882a593Smuzhiyun uint32_t ctl; 75*4882a593Smuzhiyun struct { 76*4882a593Smuzhiyun unsigned int int_en:1; 77*4882a593Smuzhiyun unsigned int src_snoop_dis:1; 78*4882a593Smuzhiyun unsigned int dest_snoop_dis:1; 79*4882a593Smuzhiyun unsigned int compl_write:1; 80*4882a593Smuzhiyun unsigned int fence:1; 81*4882a593Smuzhiyun unsigned int null:1; 82*4882a593Smuzhiyun unsigned int src_brk:1; 83*4882a593Smuzhiyun unsigned int dest_brk:1; 84*4882a593Smuzhiyun unsigned int bundle:1; 85*4882a593Smuzhiyun unsigned int dest_dca:1; 86*4882a593Smuzhiyun unsigned int hint:1; 87*4882a593Smuzhiyun unsigned int rsvd2:13; 88*4882a593Smuzhiyun #define IOAT_OP_COPY 0x00 89*4882a593Smuzhiyun unsigned int op:8; 90*4882a593Smuzhiyun } ctl_f; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun uint64_t src_addr; 93*4882a593Smuzhiyun uint64_t dst_addr; 94*4882a593Smuzhiyun uint64_t next; 95*4882a593Smuzhiyun uint64_t rsv1; 96*4882a593Smuzhiyun uint64_t rsv2; 97*4882a593Smuzhiyun /* store some driver data in an unused portion of the descriptor */ 98*4882a593Smuzhiyun union { 99*4882a593Smuzhiyun uint64_t user1; 100*4882a593Smuzhiyun uint64_t tx_cnt; 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun uint64_t user2; 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct ioat_xor_descriptor { 106*4882a593Smuzhiyun uint32_t size; 107*4882a593Smuzhiyun union { 108*4882a593Smuzhiyun uint32_t ctl; 109*4882a593Smuzhiyun struct { 110*4882a593Smuzhiyun unsigned int int_en:1; 111*4882a593Smuzhiyun unsigned int src_snoop_dis:1; 112*4882a593Smuzhiyun unsigned int dest_snoop_dis:1; 113*4882a593Smuzhiyun unsigned int compl_write:1; 114*4882a593Smuzhiyun unsigned int fence:1; 115*4882a593Smuzhiyun unsigned int src_cnt:3; 116*4882a593Smuzhiyun unsigned int bundle:1; 117*4882a593Smuzhiyun unsigned int dest_dca:1; 118*4882a593Smuzhiyun unsigned int hint:1; 119*4882a593Smuzhiyun unsigned int rsvd:13; 120*4882a593Smuzhiyun #define IOAT_OP_XOR 0x87 121*4882a593Smuzhiyun #define IOAT_OP_XOR_VAL 0x88 122*4882a593Smuzhiyun unsigned int op:8; 123*4882a593Smuzhiyun } ctl_f; 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun uint64_t src_addr; 126*4882a593Smuzhiyun uint64_t dst_addr; 127*4882a593Smuzhiyun uint64_t next; 128*4882a593Smuzhiyun uint64_t src_addr2; 129*4882a593Smuzhiyun uint64_t src_addr3; 130*4882a593Smuzhiyun uint64_t src_addr4; 131*4882a593Smuzhiyun uint64_t src_addr5; 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct ioat_xor_ext_descriptor { 135*4882a593Smuzhiyun uint64_t src_addr6; 136*4882a593Smuzhiyun uint64_t src_addr7; 137*4882a593Smuzhiyun uint64_t src_addr8; 138*4882a593Smuzhiyun uint64_t next; 139*4882a593Smuzhiyun uint64_t rsvd[4]; 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct ioat_pq_descriptor { 143*4882a593Smuzhiyun union { 144*4882a593Smuzhiyun uint32_t size; 145*4882a593Smuzhiyun uint32_t dwbes; 146*4882a593Smuzhiyun struct { 147*4882a593Smuzhiyun unsigned int rsvd:25; 148*4882a593Smuzhiyun unsigned int p_val_err:1; 149*4882a593Smuzhiyun unsigned int q_val_err:1; 150*4882a593Smuzhiyun unsigned int rsvd1:4; 151*4882a593Smuzhiyun unsigned int wbes:1; 152*4882a593Smuzhiyun } dwbes_f; 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun union { 155*4882a593Smuzhiyun uint32_t ctl; 156*4882a593Smuzhiyun struct { 157*4882a593Smuzhiyun unsigned int int_en:1; 158*4882a593Smuzhiyun unsigned int src_snoop_dis:1; 159*4882a593Smuzhiyun unsigned int dest_snoop_dis:1; 160*4882a593Smuzhiyun unsigned int compl_write:1; 161*4882a593Smuzhiyun unsigned int fence:1; 162*4882a593Smuzhiyun unsigned int src_cnt:3; 163*4882a593Smuzhiyun unsigned int bundle:1; 164*4882a593Smuzhiyun unsigned int dest_dca:1; 165*4882a593Smuzhiyun unsigned int hint:1; 166*4882a593Smuzhiyun unsigned int p_disable:1; 167*4882a593Smuzhiyun unsigned int q_disable:1; 168*4882a593Smuzhiyun unsigned int rsvd2:2; 169*4882a593Smuzhiyun unsigned int wb_en:1; 170*4882a593Smuzhiyun unsigned int prl_en:1; 171*4882a593Smuzhiyun unsigned int rsvd3:7; 172*4882a593Smuzhiyun #define IOAT_OP_PQ 0x89 173*4882a593Smuzhiyun #define IOAT_OP_PQ_VAL 0x8a 174*4882a593Smuzhiyun #define IOAT_OP_PQ_16S 0xa0 175*4882a593Smuzhiyun #define IOAT_OP_PQ_VAL_16S 0xa1 176*4882a593Smuzhiyun unsigned int op:8; 177*4882a593Smuzhiyun } ctl_f; 178*4882a593Smuzhiyun }; 179*4882a593Smuzhiyun uint64_t src_addr; 180*4882a593Smuzhiyun uint64_t p_addr; 181*4882a593Smuzhiyun uint64_t next; 182*4882a593Smuzhiyun uint64_t src_addr2; 183*4882a593Smuzhiyun union { 184*4882a593Smuzhiyun uint64_t src_addr3; 185*4882a593Smuzhiyun uint64_t sed_addr; 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun uint8_t coef[8]; 188*4882a593Smuzhiyun uint64_t q_addr; 189*4882a593Smuzhiyun }; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun struct ioat_pq_ext_descriptor { 192*4882a593Smuzhiyun uint64_t src_addr4; 193*4882a593Smuzhiyun uint64_t src_addr5; 194*4882a593Smuzhiyun uint64_t src_addr6; 195*4882a593Smuzhiyun uint64_t next; 196*4882a593Smuzhiyun uint64_t src_addr7; 197*4882a593Smuzhiyun uint64_t src_addr8; 198*4882a593Smuzhiyun uint64_t rsvd[2]; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun struct ioat_pq_update_descriptor { 202*4882a593Smuzhiyun uint32_t size; 203*4882a593Smuzhiyun union { 204*4882a593Smuzhiyun uint32_t ctl; 205*4882a593Smuzhiyun struct { 206*4882a593Smuzhiyun unsigned int int_en:1; 207*4882a593Smuzhiyun unsigned int src_snoop_dis:1; 208*4882a593Smuzhiyun unsigned int dest_snoop_dis:1; 209*4882a593Smuzhiyun unsigned int compl_write:1; 210*4882a593Smuzhiyun unsigned int fence:1; 211*4882a593Smuzhiyun unsigned int src_cnt:3; 212*4882a593Smuzhiyun unsigned int bundle:1; 213*4882a593Smuzhiyun unsigned int dest_dca:1; 214*4882a593Smuzhiyun unsigned int hint:1; 215*4882a593Smuzhiyun unsigned int p_disable:1; 216*4882a593Smuzhiyun unsigned int q_disable:1; 217*4882a593Smuzhiyun unsigned int rsvd:3; 218*4882a593Smuzhiyun unsigned int coef:8; 219*4882a593Smuzhiyun #define IOAT_OP_PQ_UP 0x8b 220*4882a593Smuzhiyun unsigned int op:8; 221*4882a593Smuzhiyun } ctl_f; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun uint64_t src_addr; 224*4882a593Smuzhiyun uint64_t p_addr; 225*4882a593Smuzhiyun uint64_t next; 226*4882a593Smuzhiyun uint64_t src_addr2; 227*4882a593Smuzhiyun uint64_t p_src; 228*4882a593Smuzhiyun uint64_t q_src; 229*4882a593Smuzhiyun uint64_t q_addr; 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun struct ioat_raw_descriptor { 233*4882a593Smuzhiyun uint64_t field[8]; 234*4882a593Smuzhiyun }; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun struct ioat_pq16a_descriptor { 237*4882a593Smuzhiyun uint8_t coef[8]; 238*4882a593Smuzhiyun uint64_t src_addr3; 239*4882a593Smuzhiyun uint64_t src_addr4; 240*4882a593Smuzhiyun uint64_t src_addr5; 241*4882a593Smuzhiyun uint64_t src_addr6; 242*4882a593Smuzhiyun uint64_t src_addr7; 243*4882a593Smuzhiyun uint64_t src_addr8; 244*4882a593Smuzhiyun uint64_t src_addr9; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun struct ioat_pq16b_descriptor { 248*4882a593Smuzhiyun uint64_t src_addr10; 249*4882a593Smuzhiyun uint64_t src_addr11; 250*4882a593Smuzhiyun uint64_t src_addr12; 251*4882a593Smuzhiyun uint64_t src_addr13; 252*4882a593Smuzhiyun uint64_t src_addr14; 253*4882a593Smuzhiyun uint64_t src_addr15; 254*4882a593Smuzhiyun uint64_t src_addr16; 255*4882a593Smuzhiyun uint64_t rsvd; 256*4882a593Smuzhiyun }; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun union ioat_sed_pq_descriptor { 259*4882a593Smuzhiyun struct ioat_pq16a_descriptor a; 260*4882a593Smuzhiyun struct ioat_pq16b_descriptor b; 261*4882a593Smuzhiyun }; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun #define SED_SIZE 64 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun struct ioat_sed_raw_descriptor { 266*4882a593Smuzhiyun uint64_t a[8]; 267*4882a593Smuzhiyun uint64_t b[8]; 268*4882a593Smuzhiyun uint64_t c[8]; 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #endif 272