2006-05-24 04:35:34 +04:00
/*
2009-02-26 13:05:43 +03:00
* Copyright ( c ) 2004 - 2009 Intel Corporation . All rights reserved .
2006-05-24 04:35:34 +04:00
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* The full GNU General Public License is included in this distribution in the
* file called COPYING .
*/
# ifndef _IOAT_HW_H_
# define _IOAT_HW_H_
/* PCI Configuration Space Values */
2009-09-09 04:29:44 +04:00
# define IOAT_MMIO_BAR 0
2007-11-15 03:59:51 +03:00
/* CB device ID's */
2012-12-04 03:08:37 +04:00
# define PCI_DEVICE_ID_INTEL_IOAT_IVB0 0x0e20
# define PCI_DEVICE_ID_INTEL_IOAT_IVB1 0x0e21
# define PCI_DEVICE_ID_INTEL_IOAT_IVB2 0x0e22
# define PCI_DEVICE_ID_INTEL_IOAT_IVB3 0x0e23
# define PCI_DEVICE_ID_INTEL_IOAT_IVB4 0x0e24
# define PCI_DEVICE_ID_INTEL_IOAT_IVB5 0x0e25
# define PCI_DEVICE_ID_INTEL_IOAT_IVB6 0x0e26
# define PCI_DEVICE_ID_INTEL_IOAT_IVB7 0x0e27
# define PCI_DEVICE_ID_INTEL_IOAT_IVB8 0x0e2e
# define PCI_DEVICE_ID_INTEL_IOAT_IVB9 0x0e2f
2013-03-26 01:37:31 +04:00
# define PCI_DEVICE_ID_INTEL_IOAT_HSW0 0x2f20
# define PCI_DEVICE_ID_INTEL_IOAT_HSW1 0x2f21
# define PCI_DEVICE_ID_INTEL_IOAT_HSW2 0x2f22
# define PCI_DEVICE_ID_INTEL_IOAT_HSW3 0x2f23
# define PCI_DEVICE_ID_INTEL_IOAT_HSW4 0x2f24
# define PCI_DEVICE_ID_INTEL_IOAT_HSW5 0x2f25
# define PCI_DEVICE_ID_INTEL_IOAT_HSW6 0x2f26
# define PCI_DEVICE_ID_INTEL_IOAT_HSW7 0x2f27
# define PCI_DEVICE_ID_INTEL_IOAT_HSW8 0x2f2e
# define PCI_DEVICE_ID_INTEL_IOAT_HSW9 0x2f2f
2013-03-27 02:42:35 +04:00
# define PCI_DEVICE_ID_INTEL_IOAT_BWD0 0x0C50
# define PCI_DEVICE_ID_INTEL_IOAT_BWD1 0x0C51
# define PCI_DEVICE_ID_INTEL_IOAT_BWD2 0x0C52
# define PCI_DEVICE_ID_INTEL_IOAT_BWD3 0x0C53
2015-01-31 01:06:01 +03:00
# define PCI_DEVICE_ID_INTEL_IOAT_BDXDE0 0x6f50
# define PCI_DEVICE_ID_INTEL_IOAT_BDXDE1 0x6f51
# define PCI_DEVICE_ID_INTEL_IOAT_BDXDE2 0x6f52
# define PCI_DEVICE_ID_INTEL_IOAT_BDXDE3 0x6f53
2015-08-27 00:16:27 +03:00
# define PCI_DEVICE_ID_INTEL_IOAT_BDX0 0x6f20
# define PCI_DEVICE_ID_INTEL_IOAT_BDX1 0x6f21
# define PCI_DEVICE_ID_INTEL_IOAT_BDX2 0x6f22
# define PCI_DEVICE_ID_INTEL_IOAT_BDX3 0x6f23
# define PCI_DEVICE_ID_INTEL_IOAT_BDX4 0x6f24
# define PCI_DEVICE_ID_INTEL_IOAT_BDX5 0x6f25
# define PCI_DEVICE_ID_INTEL_IOAT_BDX6 0x6f26
# define PCI_DEVICE_ID_INTEL_IOAT_BDX7 0x6f27
# define PCI_DEVICE_ID_INTEL_IOAT_BDX8 0x6f2e
# define PCI_DEVICE_ID_INTEL_IOAT_BDX9 0x6f2f
2016-12-13 21:15:21 +03:00
# define PCI_DEVICE_ID_INTEL_IOAT_SKX 0x2021
2019-02-22 19:59:54 +03:00
# define PCI_DEVICE_ID_INTEL_IOAT_ICX 0x0b00
2013-03-26 01:37:31 +04:00
# define IOAT_VER_1_2 0x12 /* Version 1.2 */
# define IOAT_VER_2_0 0x20 /* Version 2.0 */
# define IOAT_VER_3_0 0x30 /* Version 3.0 */
# define IOAT_VER_3_2 0x32 /* Version 3.2 */
2013-03-27 02:42:35 +04:00
# define IOAT_VER_3_3 0x33 /* Version 3.3 */
2013-03-26 01:37:31 +04:00
2009-11-20 03:07:10 +03:00
int system_has_dca_enabled ( struct pci_dev * pdev ) ;
2016-02-11 01:00:32 +03:00
# define IOAT_DESC_SZ 64
2006-05-24 04:35:34 +04:00
struct ioat_dma_descriptor {
uint32_t size ;
2009-07-29 01:44:04 +04:00
union {
uint32_t ctl ;
struct {
unsigned int int_en : 1 ;
unsigned int src_snoop_dis : 1 ;
unsigned int dest_snoop_dis : 1 ;
unsigned int compl_write : 1 ;
unsigned int fence : 1 ;
unsigned int null : 1 ;
unsigned int src_brk : 1 ;
unsigned int dest_brk : 1 ;
unsigned int bundle : 1 ;
unsigned int dest_dca : 1 ;
unsigned int hint : 1 ;
unsigned int rsvd2 : 13 ;
2009-09-09 04:42:54 +04:00
# define IOAT_OP_COPY 0x00
2009-07-29 01:44:04 +04:00
unsigned int op : 8 ;
} ctl_f ;
} ;
2006-05-24 04:35:34 +04:00
uint64_t src_addr ;
uint64_t dst_addr ;
uint64_t next ;
uint64_t rsv1 ;
uint64_t rsv2 ;
2009-09-08 23:01:38 +04:00
/* store some driver data in an unused portion of the descriptor */
union {
uint64_t user1 ;
uint64_t tx_cnt ;
} ;
2006-05-24 04:35:34 +04:00
uint64_t user2 ;
} ;
2009-09-09 04:42:54 +04:00
struct ioat_xor_descriptor {
uint32_t size ;
union {
uint32_t ctl ;
struct {
unsigned int int_en : 1 ;
unsigned int src_snoop_dis : 1 ;
unsigned int dest_snoop_dis : 1 ;
unsigned int compl_write : 1 ;
unsigned int fence : 1 ;
unsigned int src_cnt : 3 ;
unsigned int bundle : 1 ;
unsigned int dest_dca : 1 ;
unsigned int hint : 1 ;
unsigned int rsvd : 13 ;
# define IOAT_OP_XOR 0x87
# define IOAT_OP_XOR_VAL 0x88
unsigned int op : 8 ;
} ctl_f ;
} ;
uint64_t src_addr ;
uint64_t dst_addr ;
uint64_t next ;
uint64_t src_addr2 ;
uint64_t src_addr3 ;
uint64_t src_addr4 ;
uint64_t src_addr5 ;
} ;
struct ioat_xor_ext_descriptor {
uint64_t src_addr6 ;
uint64_t src_addr7 ;
uint64_t src_addr8 ;
uint64_t next ;
uint64_t rsvd [ 4 ] ;
} ;
struct ioat_pq_descriptor {
2013-04-11 03:44:39 +04:00
union {
uint32_t size ;
uint32_t dwbes ;
struct {
unsigned int rsvd : 25 ;
unsigned int p_val_err : 1 ;
unsigned int q_val_err : 1 ;
unsigned int rsvd1 : 4 ;
unsigned int wbes : 1 ;
} dwbes_f ;
} ;
2009-09-09 04:42:54 +04:00
union {
uint32_t ctl ;
struct {
unsigned int int_en : 1 ;
unsigned int src_snoop_dis : 1 ;
unsigned int dest_snoop_dis : 1 ;
unsigned int compl_write : 1 ;
unsigned int fence : 1 ;
unsigned int src_cnt : 3 ;
unsigned int bundle : 1 ;
unsigned int dest_dca : 1 ;
unsigned int hint : 1 ;
unsigned int p_disable : 1 ;
unsigned int q_disable : 1 ;
2013-04-11 03:44:39 +04:00
unsigned int rsvd2 : 2 ;
unsigned int wb_en : 1 ;
unsigned int prl_en : 1 ;
unsigned int rsvd3 : 7 ;
2009-09-09 04:42:54 +04:00
# define IOAT_OP_PQ 0x89
# define IOAT_OP_PQ_VAL 0x8a
2013-04-15 21:25:56 +04:00
# define IOAT_OP_PQ_16S 0xa0
# define IOAT_OP_PQ_VAL_16S 0xa1
2009-09-09 04:42:54 +04:00
unsigned int op : 8 ;
} ctl_f ;
} ;
uint64_t src_addr ;
uint64_t p_addr ;
uint64_t next ;
uint64_t src_addr2 ;
2013-04-15 21:25:56 +04:00
union {
uint64_t src_addr3 ;
uint64_t sed_addr ;
} ;
2009-09-09 04:42:54 +04:00
uint8_t coef [ 8 ] ;
uint64_t q_addr ;
} ;
struct ioat_pq_ext_descriptor {
uint64_t src_addr4 ;
uint64_t src_addr5 ;
uint64_t src_addr6 ;
uint64_t next ;
uint64_t src_addr7 ;
uint64_t src_addr8 ;
uint64_t rsvd [ 2 ] ;
} ;
struct ioat_pq_update_descriptor {
uint32_t size ;
union {
uint32_t ctl ;
struct {
unsigned int int_en : 1 ;
unsigned int src_snoop_dis : 1 ;
unsigned int dest_snoop_dis : 1 ;
unsigned int compl_write : 1 ;
unsigned int fence : 1 ;
unsigned int src_cnt : 3 ;
unsigned int bundle : 1 ;
unsigned int dest_dca : 1 ;
unsigned int hint : 1 ;
unsigned int p_disable : 1 ;
unsigned int q_disable : 1 ;
unsigned int rsvd : 3 ;
unsigned int coef : 8 ;
# define IOAT_OP_PQ_UP 0x8b
unsigned int op : 8 ;
} ctl_f ;
} ;
uint64_t src_addr ;
uint64_t p_addr ;
uint64_t next ;
uint64_t src_addr2 ;
uint64_t p_src ;
uint64_t q_src ;
uint64_t q_addr ;
} ;
struct ioat_raw_descriptor {
uint64_t field [ 8 ] ;
} ;
2013-04-15 21:25:56 +04:00
struct ioat_pq16a_descriptor {
uint8_t coef [ 8 ] ;
uint64_t src_addr3 ;
uint64_t src_addr4 ;
uint64_t src_addr5 ;
uint64_t src_addr6 ;
uint64_t src_addr7 ;
uint64_t src_addr8 ;
uint64_t src_addr9 ;
} ;
struct ioat_pq16b_descriptor {
uint64_t src_addr10 ;
uint64_t src_addr11 ;
uint64_t src_addr12 ;
uint64_t src_addr13 ;
uint64_t src_addr14 ;
uint64_t src_addr15 ;
uint64_t src_addr16 ;
uint64_t rsvd ;
} ;
union ioat_sed_pq_descriptor {
struct ioat_pq16a_descriptor a ;
struct ioat_pq16b_descriptor b ;
} ;
# define SED_SIZE 64
struct ioat_sed_raw_descriptor {
uint64_t a [ 8 ] ;
uint64_t b [ 8 ] ;
uint64_t c [ 8 ] ;
} ;
2006-05-24 04:35:34 +04:00
# endif