1bfe1d560SDave Jiang /* SPDX-License-Identifier: GPL-2.0 */ 2bfe1d560SDave Jiang /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */ 3bfe1d560SDave Jiang #ifndef _IDXD_REGISTERS_H_ 4bfe1d560SDave Jiang #define _IDXD_REGISTERS_H_ 5bfe1d560SDave Jiang 6003e6fafSDavid Matlack #ifdef __KERNEL__ 7244da66cSDave Jiang #include <uapi/linux/idxd.h> 8003e6fafSDavid Matlack #else 9003e6fafSDavid Matlack #include <linux/idxd.h> 10003e6fafSDavid Matlack #endif 11244da66cSDave Jiang 12bfe1d560SDave Jiang /* PCI Config */ 133e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_DSA_GNRD 0x11fb 143e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_DSA_DMR 0x1212 153e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_IAA_DMR 0x1216 1680a9b50bSFenghua Yu #define PCI_DEVICE_ID_INTEL_IAA_PTL 0xb02d 17c937969aSAnil S Keshavamurthy #define PCI_DEVICE_ID_INTEL_IAA_WCL 0xfd2d 183e482e28SFenghua Yu 19ade8a86bSDave Jiang #define DEVICE_VERSION_1 0x100 20ade8a86bSDave Jiang #define DEVICE_VERSION_2 0x200 21ade8a86bSDave Jiang 22bfe1d560SDave Jiang #define IDXD_MMIO_BAR 0 23bfe1d560SDave Jiang #define IDXD_WQ_BAR 2 248326be9fSDave Jiang #define IDXD_PORTAL_SIZE PAGE_SIZE 25bfe1d560SDave Jiang 26bfe1d560SDave Jiang /* MMIO Device BAR0 Registers */ 27bfe1d560SDave Jiang #define IDXD_VER_OFFSET 0x00 28bfe1d560SDave Jiang #define IDXD_VER_MAJOR_MASK 0xf0 29bfe1d560SDave Jiang #define IDXD_VER_MINOR_MASK 0x0f 30bfe1d560SDave Jiang #define GET_IDXD_VER_MAJOR(x) (((x) & IDXD_VER_MAJOR_MASK) >> 4) 31bfe1d560SDave Jiang #define GET_IDXD_VER_MINOR(x) ((x) & IDXD_VER_MINOR_MASK) 32bfe1d560SDave Jiang 33bfe1d560SDave Jiang union gen_cap_reg { 34bfe1d560SDave Jiang struct { 35bfe1d560SDave Jiang u64 block_on_fault:1; 36bfe1d560SDave Jiang u64 overlap_copy:1; 37bfe1d560SDave Jiang u64 cache_control_mem:1; 38bfe1d560SDave Jiang u64 cache_control_cache:1; 39eb15e715SDave Jiang u64 cmd_cap:1; 40bfe1d560SDave Jiang u64 rsvd:3; 41bfe1d560SDave Jiang u64 dest_readback:1; 42bfe1d560SDave Jiang u64 drain_readback:1; 431649091fSDave Jiang u64 rsvd2:3; 441649091fSDave Jiang u64 evl_support:2; 452442b747SDave Jiang u64 batch_continuation:1; 46bfe1d560SDave Jiang u64 max_xfer_shift:5; 47bfe1d560SDave Jiang u64 max_batch_shift:4; 48bfe1d560SDave Jiang u64 max_ims_mult:6; 49bfe1d560SDave Jiang u64 config_en:1; 50c5b64b68SDave Jiang u64 rsvd3:32; 51bfe1d560SDave Jiang }; 52bfe1d560SDave Jiang u64 bits; 530044c5fcSYi Sun }; 54bfe1d560SDave Jiang #define IDXD_GENCAP_OFFSET 0x10 55bfe1d560SDave Jiang 56bfe1d560SDave Jiang union wq_cap_reg { 57bfe1d560SDave Jiang struct { 58bfe1d560SDave Jiang u64 total_wq_size:16; 59bfe1d560SDave Jiang u64 num_wqs:8; 60484f910eSDave Jiang u64 wqcfg_size:4; 61484f910eSDave Jiang u64 rsvd:20; 62bfe1d560SDave Jiang u64 shared_mode:1; 63bfe1d560SDave Jiang u64 dedicated_mode:1; 6492de5fa2SDave Jiang u64 wq_ats_support:1; 65bfe1d560SDave Jiang u64 priority:1; 66bfe1d560SDave Jiang u64 occupancy:1; 67bfe1d560SDave Jiang u64 occupancy_int:1; 68b0325aefSDave Jiang u64 op_config:1; 69f2dc3271SDave Jiang u64 wq_prs_support:1; 70f2dc3271SDave Jiang u64 rsvd4:8; 71bfe1d560SDave Jiang }; 72bfe1d560SDave Jiang u64 bits; 730044c5fcSYi Sun }; 74bfe1d560SDave Jiang #define IDXD_WQCAP_OFFSET 0x20 75484f910eSDave Jiang #define IDXD_WQCFG_MIN 5 76bfe1d560SDave Jiang 77bfe1d560SDave Jiang union group_cap_reg { 78bfe1d560SDave Jiang struct { 79bfe1d560SDave Jiang u64 num_groups:8; 807ed6f1b8SDave Jiang u64 total_rdbufs:8; /* formerly total_tokens */ 817ed6f1b8SDave Jiang u64 rdbuf_ctrl:1; /* formerly token_en */ 827ed6f1b8SDave Jiang u64 rdbuf_limit:1; /* formerly token_limit */ 831f273752SDave Jiang u64 progress_limit:1; /* descriptor and batch descriptor */ 841f273752SDave Jiang u64 rsvd:45; 85bfe1d560SDave Jiang }; 86bfe1d560SDave Jiang u64 bits; 870044c5fcSYi Sun }; 88bfe1d560SDave Jiang #define IDXD_GRPCAP_OFFSET 0x30 89bfe1d560SDave Jiang 90bfe1d560SDave Jiang union engine_cap_reg { 91bfe1d560SDave Jiang struct { 92bfe1d560SDave Jiang u64 num_engines:8; 93bfe1d560SDave Jiang u64 rsvd:56; 94bfe1d560SDave Jiang }; 95bfe1d560SDave Jiang u64 bits; 960044c5fcSYi Sun }; 97bfe1d560SDave Jiang 98bfe1d560SDave Jiang #define IDXD_ENGCAP_OFFSET 0x38 99bfe1d560SDave Jiang 100bfe1d560SDave Jiang #define IDXD_OPCAP_NOOP 0x0001 101bfe1d560SDave Jiang #define IDXD_OPCAP_BATCH 0x0002 102bfe1d560SDave Jiang #define IDXD_OPCAP_MEMMOVE 0x0008 103bfe1d560SDave Jiang struct opcap { 104bfe1d560SDave Jiang u64 bits[4]; 105bfe1d560SDave Jiang }; 106bfe1d560SDave Jiang 107a8563a33SDave Jiang #define IDXD_MAX_OPCAP_BITS 256U 108a8563a33SDave Jiang 109bfe1d560SDave Jiang #define IDXD_OPCAP_OFFSET 0x40 110bfe1d560SDave Jiang 111bfe1d560SDave Jiang #define IDXD_TABLE_OFFSET 0x60 112bfe1d560SDave Jiang union offsets_reg { 113bfe1d560SDave Jiang struct { 114bfe1d560SDave Jiang u64 grpcfg:16; 115bfe1d560SDave Jiang u64 wqcfg:16; 116bfe1d560SDave Jiang u64 msix_perm:16; 117bfe1d560SDave Jiang u64 ims:16; 118bfe1d560SDave Jiang u64 perfmon:16; 119bfe1d560SDave Jiang u64 rsvd:48; 120bfe1d560SDave Jiang }; 121bfe1d560SDave Jiang u64 bits[2]; 1220044c5fcSYi Sun }; 123bfe1d560SDave Jiang 1242f8417a9SDave Jiang #define IDXD_TABLE_MULT 0x100 1252f8417a9SDave Jiang 126bfe1d560SDave Jiang #define IDXD_GENCFG_OFFSET 0x80 127bfe1d560SDave Jiang union gencfg_reg { 128bfe1d560SDave Jiang struct { 1297ed6f1b8SDave Jiang u32 rdbuf_limit:8; 130bfe1d560SDave Jiang u32 rsvd:4; 131bfe1d560SDave Jiang u32 user_int_en:1; 132244da66cSDave Jiang u32 evl_en:1; 133244da66cSDave Jiang u32 rsvd2:18; 134bfe1d560SDave Jiang }; 135bfe1d560SDave Jiang u32 bits; 1360044c5fcSYi Sun }; 137bfe1d560SDave Jiang 138bfe1d560SDave Jiang #define IDXD_GENCTRL_OFFSET 0x88 139bfe1d560SDave Jiang union genctrl_reg { 140bfe1d560SDave Jiang struct { 141bfe1d560SDave Jiang u32 softerr_int_en:1; 1425b0c68c4SDave Jiang u32 halt_int_en:1; 143244da66cSDave Jiang u32 evl_int_en:1; 144244da66cSDave Jiang u32 rsvd:29; 145bfe1d560SDave Jiang }; 146bfe1d560SDave Jiang u32 bits; 1470044c5fcSYi Sun }; 148bfe1d560SDave Jiang 149bfe1d560SDave Jiang #define IDXD_GENSTATS_OFFSET 0x90 150bfe1d560SDave Jiang union gensts_reg { 151bfe1d560SDave Jiang struct { 152bfe1d560SDave Jiang u32 state:2; 153bfe1d560SDave Jiang u32 reset_type:2; 154bfe1d560SDave Jiang u32 rsvd:28; 155bfe1d560SDave Jiang }; 156bfe1d560SDave Jiang u32 bits; 1570044c5fcSYi Sun }; 158bfe1d560SDave Jiang 159bfe1d560SDave Jiang enum idxd_device_status_state { 160bfe1d560SDave Jiang IDXD_DEVICE_STATE_DISABLED = 0, 161bfe1d560SDave Jiang IDXD_DEVICE_STATE_ENABLED, 162bfe1d560SDave Jiang IDXD_DEVICE_STATE_DRAIN, 163bfe1d560SDave Jiang IDXD_DEVICE_STATE_HALT, 164bfe1d560SDave Jiang }; 165bfe1d560SDave Jiang 166bfe1d560SDave Jiang enum idxd_device_reset_type { 167bfe1d560SDave Jiang IDXD_DEVICE_RESET_SOFTWARE = 0, 168bfe1d560SDave Jiang IDXD_DEVICE_RESET_FLR, 169bfe1d560SDave Jiang IDXD_DEVICE_RESET_WARM, 170bfe1d560SDave Jiang IDXD_DEVICE_RESET_COLD, 171bfe1d560SDave Jiang }; 172bfe1d560SDave Jiang 173bfe1d560SDave Jiang #define IDXD_INTCAUSE_OFFSET 0x98 174bfe1d560SDave Jiang #define IDXD_INTC_ERR 0x01 175bfe1d560SDave Jiang #define IDXD_INTC_CMD 0x02 176bfe1d560SDave Jiang #define IDXD_INTC_OCCUPY 0x04 177bfe1d560SDave Jiang #define IDXD_INTC_PERFMON_OVFL 0x08 17888d97ea8SDave Jiang #define IDXD_INTC_HALT_STATE 0x10 1792f431ba9SDave Jiang #define IDXD_INTC_EVL 0x20 18056fc39f5SDave Jiang #define IDXD_INTC_INT_HANDLE_REVOKED 0x80000000 181bfe1d560SDave Jiang 182bfe1d560SDave Jiang #define IDXD_CMD_OFFSET 0xa0 183bfe1d560SDave Jiang union idxd_command_reg { 184bfe1d560SDave Jiang struct { 185bfe1d560SDave Jiang u32 operand:20; 186bfe1d560SDave Jiang u32 cmd:5; 187bfe1d560SDave Jiang u32 rsvd:6; 188bfe1d560SDave Jiang u32 int_req:1; 189bfe1d560SDave Jiang }; 190bfe1d560SDave Jiang u32 bits; 1910044c5fcSYi Sun }; 192bfe1d560SDave Jiang 193bfe1d560SDave Jiang enum idxd_cmd { 194bfe1d560SDave Jiang IDXD_CMD_ENABLE_DEVICE = 1, 195bfe1d560SDave Jiang IDXD_CMD_DISABLE_DEVICE, 196bfe1d560SDave Jiang IDXD_CMD_DRAIN_ALL, 197bfe1d560SDave Jiang IDXD_CMD_ABORT_ALL, 198bfe1d560SDave Jiang IDXD_CMD_RESET_DEVICE, 199bfe1d560SDave Jiang IDXD_CMD_ENABLE_WQ, 200bfe1d560SDave Jiang IDXD_CMD_DISABLE_WQ, 201bfe1d560SDave Jiang IDXD_CMD_DRAIN_WQ, 202bfe1d560SDave Jiang IDXD_CMD_ABORT_WQ, 203bfe1d560SDave Jiang IDXD_CMD_RESET_WQ, 204bfe1d560SDave Jiang IDXD_CMD_DRAIN_PASID, 205bfe1d560SDave Jiang IDXD_CMD_ABORT_PASID, 206bfe1d560SDave Jiang IDXD_CMD_REQUEST_INT_HANDLE, 207eb15e715SDave Jiang IDXD_CMD_RELEASE_INT_HANDLE, 208bfe1d560SDave Jiang }; 209bfe1d560SDave Jiang 210eb15e715SDave Jiang #define CMD_INT_HANDLE_IMS 0x10000 211eb15e715SDave Jiang 212bfe1d560SDave Jiang #define IDXD_CMDSTS_OFFSET 0xa8 213bfe1d560SDave Jiang union cmdsts_reg { 214bfe1d560SDave Jiang struct { 215bfe1d560SDave Jiang u8 err; 216bfe1d560SDave Jiang u16 result; 217bfe1d560SDave Jiang u8 rsvd:7; 218bfe1d560SDave Jiang u8 active:1; 219bfe1d560SDave Jiang }; 220bfe1d560SDave Jiang u32 bits; 2210044c5fcSYi Sun }; 222bfe1d560SDave Jiang #define IDXD_CMDSTS_ACTIVE 0x80000000 223eb15e715SDave Jiang #define IDXD_CMDSTS_ERR_MASK 0xff 224eb15e715SDave Jiang #define IDXD_CMDSTS_RES_SHIFT 8 225bfe1d560SDave Jiang 226bfe1d560SDave Jiang enum idxd_cmdsts_err { 227bfe1d560SDave Jiang IDXD_CMDSTS_SUCCESS = 0, 228bfe1d560SDave Jiang IDXD_CMDSTS_INVAL_CMD, 229bfe1d560SDave Jiang IDXD_CMDSTS_INVAL_WQIDX, 230bfe1d560SDave Jiang IDXD_CMDSTS_HW_ERR, 231bfe1d560SDave Jiang /* enable device errors */ 232bfe1d560SDave Jiang IDXD_CMDSTS_ERR_DEV_ENABLED = 0x10, 233bfe1d560SDave Jiang IDXD_CMDSTS_ERR_CONFIG, 234bfe1d560SDave Jiang IDXD_CMDSTS_ERR_BUSMASTER_EN, 235bfe1d560SDave Jiang IDXD_CMDSTS_ERR_PASID_INVAL, 236bfe1d560SDave Jiang IDXD_CMDSTS_ERR_WQ_SIZE_ERANGE, 237bfe1d560SDave Jiang IDXD_CMDSTS_ERR_GRP_CONFIG, 238bfe1d560SDave Jiang IDXD_CMDSTS_ERR_GRP_CONFIG2, 239bfe1d560SDave Jiang IDXD_CMDSTS_ERR_GRP_CONFIG3, 240bfe1d560SDave Jiang IDXD_CMDSTS_ERR_GRP_CONFIG4, 241bfe1d560SDave Jiang /* enable wq errors */ 242bfe1d560SDave Jiang IDXD_CMDSTS_ERR_DEV_NOTEN = 0x20, 243bfe1d560SDave Jiang IDXD_CMDSTS_ERR_WQ_ENABLED, 244bfe1d560SDave Jiang IDXD_CMDSTS_ERR_WQ_SIZE, 245bfe1d560SDave Jiang IDXD_CMDSTS_ERR_WQ_PRIOR, 246bfe1d560SDave Jiang IDXD_CMDSTS_ERR_WQ_MODE, 247bfe1d560SDave Jiang IDXD_CMDSTS_ERR_BOF_EN, 248bfe1d560SDave Jiang IDXD_CMDSTS_ERR_PASID_EN, 249bfe1d560SDave Jiang IDXD_CMDSTS_ERR_MAX_BATCH_SIZE, 250bfe1d560SDave Jiang IDXD_CMDSTS_ERR_MAX_XFER_SIZE, 251bfe1d560SDave Jiang /* disable device errors */ 252bfe1d560SDave Jiang IDXD_CMDSTS_ERR_DIS_DEV_EN = 0x31, 253bfe1d560SDave Jiang /* disable WQ, drain WQ, abort WQ, reset WQ */ 254bfe1d560SDave Jiang IDXD_CMDSTS_ERR_DEV_NOT_EN, 255bfe1d560SDave Jiang /* request interrupt handle */ 256bfe1d560SDave Jiang IDXD_CMDSTS_ERR_INVAL_INT_IDX = 0x41, 257bfe1d560SDave Jiang IDXD_CMDSTS_ERR_NO_HANDLE, 258bfe1d560SDave Jiang }; 259bfe1d560SDave Jiang 260eb15e715SDave Jiang #define IDXD_CMDCAP_OFFSET 0xb0 261eb15e715SDave Jiang 262bfe1d560SDave Jiang #define IDXD_SWERR_OFFSET 0xc0 263bfe1d560SDave Jiang #define IDXD_SWERR_VALID 0x00000001 264bfe1d560SDave Jiang #define IDXD_SWERR_OVERFLOW 0x00000002 265bfe1d560SDave Jiang #define IDXD_SWERR_ACK (IDXD_SWERR_VALID | IDXD_SWERR_OVERFLOW) 266bfe1d560SDave Jiang union sw_err_reg { 267bfe1d560SDave Jiang struct { 268bfe1d560SDave Jiang u64 valid:1; 269bfe1d560SDave Jiang u64 overflow:1; 270bfe1d560SDave Jiang u64 desc_valid:1; 271bfe1d560SDave Jiang u64 wq_idx_valid:1; 272bfe1d560SDave Jiang u64 batch:1; 273bfe1d560SDave Jiang u64 fault_rw:1; 274bfe1d560SDave Jiang u64 priv:1; 275bfe1d560SDave Jiang u64 rsvd:1; 276bfe1d560SDave Jiang u64 error:8; 277bfe1d560SDave Jiang u64 wq_idx:8; 278bfe1d560SDave Jiang u64 rsvd2:8; 279bfe1d560SDave Jiang u64 operation:8; 280bfe1d560SDave Jiang u64 pasid:20; 281bfe1d560SDave Jiang u64 rsvd3:4; 282bfe1d560SDave Jiang 283bfe1d560SDave Jiang u64 batch_idx:16; 284bfe1d560SDave Jiang u64 rsvd4:16; 285bfe1d560SDave Jiang u64 invalid_flags:32; 286bfe1d560SDave Jiang 287bfe1d560SDave Jiang u64 fault_addr; 288bfe1d560SDave Jiang 289bfe1d560SDave Jiang u64 rsvd5; 290bfe1d560SDave Jiang }; 291bfe1d560SDave Jiang u64 bits[4]; 2920044c5fcSYi Sun }; 293bfe1d560SDave Jiang 2949f0d99b3SDave Jiang union iaa_cap_reg { 2959f0d99b3SDave Jiang struct { 2969f0d99b3SDave Jiang u64 dec_aecs_format_ver:1; 2979f0d99b3SDave Jiang u64 drop_init_bits:1; 2989f0d99b3SDave Jiang u64 chaining:1; 2999f0d99b3SDave Jiang u64 force_array_output_mod:1; 3009f0d99b3SDave Jiang u64 load_part_aecs:1; 3019f0d99b3SDave Jiang u64 comp_early_abort:1; 3029f0d99b3SDave Jiang u64 nested_comp:1; 3039f0d99b3SDave Jiang u64 diction_comp:1; 3049f0d99b3SDave Jiang u64 header_gen:1; 3059f0d99b3SDave Jiang u64 crypto_gcm:1; 3069f0d99b3SDave Jiang u64 crypto_cfb:1; 3079f0d99b3SDave Jiang u64 crypto_xts:1; 3089f0d99b3SDave Jiang u64 rsvd:52; 3099f0d99b3SDave Jiang }; 3109f0d99b3SDave Jiang u64 bits; 3110044c5fcSYi Sun }; 3129f0d99b3SDave Jiang 3139f0d99b3SDave Jiang #define IDXD_IAACAP_OFFSET 0x180 3149f0d99b3SDave Jiang 315244da66cSDave Jiang #define IDXD_EVLCFG_OFFSET 0xe0 316244da66cSDave Jiang union evlcfg_reg { 317244da66cSDave Jiang struct { 318244da66cSDave Jiang u64 pasid_en:1; 319244da66cSDave Jiang u64 priv:1; 320244da66cSDave Jiang u64 rsvd:10; 321244da66cSDave Jiang u64 base_addr:52; 322244da66cSDave Jiang 323244da66cSDave Jiang u64 size:16; 324244da66cSDave Jiang u64 pasid:20; 325244da66cSDave Jiang u64 rsvd2:28; 326244da66cSDave Jiang }; 327244da66cSDave Jiang u64 bits[2]; 3280044c5fcSYi Sun }; 329244da66cSDave Jiang 3301649091fSDave Jiang #define IDXD_EVL_SIZE_MIN 0x0040 3311649091fSDave Jiang #define IDXD_EVL_SIZE_MAX 0xffff 3321649091fSDave Jiang 333bfe1d560SDave Jiang union msix_perm { 334bfe1d560SDave Jiang struct { 335bfe1d560SDave Jiang u32 rsvd:2; 336bfe1d560SDave Jiang u32 ignore:1; 337bfe1d560SDave Jiang u32 pasid_en:1; 338bfe1d560SDave Jiang u32 rsvd2:8; 339bfe1d560SDave Jiang u32 pasid:20; 340bfe1d560SDave Jiang }; 341bfe1d560SDave Jiang u32 bits; 3420044c5fcSYi Sun }; 343bfe1d560SDave Jiang 344bfe1d560SDave Jiang union group_flags { 345bfe1d560SDave Jiang struct { 3461f273752SDave Jiang u64 tc_a:3; 3471f273752SDave Jiang u64 tc_b:3; 3481f273752SDave Jiang u64 rsvd:1; 3491f273752SDave Jiang u64 use_rdbuf_limit:1; 3501f273752SDave Jiang u64 rdbufs_reserved:8; 3511f273752SDave Jiang u64 rsvd2:4; 3521f273752SDave Jiang u64 rdbufs_allowed:8; 3531f273752SDave Jiang u64 rsvd3:4; 3541f273752SDave Jiang u64 desc_progress_limit:2; 3557ca68fa3SDave Jiang u64 rsvd4:2; 3567ca68fa3SDave Jiang u64 batch_progress_limit:2; 3577ca68fa3SDave Jiang u64 rsvd5:26; 358bfe1d560SDave Jiang }; 3591f273752SDave Jiang u64 bits; 3600044c5fcSYi Sun }; 361bfe1d560SDave Jiang 362bfe1d560SDave Jiang struct grpcfg { 363bfe1d560SDave Jiang u64 wqs[4]; 364bfe1d560SDave Jiang u64 engines; 365bfe1d560SDave Jiang union group_flags flags; 3660044c5fcSYi Sun }; 367bfe1d560SDave Jiang 368bfe1d560SDave Jiang union wqcfg { 369bfe1d560SDave Jiang struct { 370bfe1d560SDave Jiang /* bytes 0-3 */ 371bfe1d560SDave Jiang u16 wq_size; 372bfe1d560SDave Jiang u16 rsvd; 373bfe1d560SDave Jiang 374bfe1d560SDave Jiang /* bytes 4-7 */ 375bfe1d560SDave Jiang u16 wq_thresh; 376bfe1d560SDave Jiang u16 rsvd1; 377bfe1d560SDave Jiang 378bfe1d560SDave Jiang /* bytes 8-11 */ 379bfe1d560SDave Jiang u32 mode:1; /* shared or dedicated */ 380bfe1d560SDave Jiang u32 bof:1; /* block on fault */ 38192de5fa2SDave Jiang u32 wq_ats_disable:1; 382f2dc3271SDave Jiang u32 wq_prs_disable:1; 383bfe1d560SDave Jiang u32 priority:4; 384bfe1d560SDave Jiang u32 pasid:20; 385bfe1d560SDave Jiang u32 pasid_en:1; 386bfe1d560SDave Jiang u32 priv:1; 387bfe1d560SDave Jiang u32 rsvd3:2; 388bfe1d560SDave Jiang 389bfe1d560SDave Jiang /* bytes 12-15 */ 390bfe1d560SDave Jiang u32 max_xfer_shift:5; 391bfe1d560SDave Jiang u32 max_batch_shift:4; 392bfe1d560SDave Jiang u32 rsvd4:23; 393bfe1d560SDave Jiang 394bfe1d560SDave Jiang /* bytes 16-19 */ 395bfe1d560SDave Jiang u16 occupancy_inth; 396bfe1d560SDave Jiang u16 occupancy_table_sel:1; 397bfe1d560SDave Jiang u16 rsvd5:15; 398bfe1d560SDave Jiang 399bfe1d560SDave Jiang /* bytes 20-23 */ 400bfe1d560SDave Jiang u16 occupancy_limit; 401bfe1d560SDave Jiang u16 occupancy_int_en:1; 402bfe1d560SDave Jiang u16 rsvd6:15; 403bfe1d560SDave Jiang 404bfe1d560SDave Jiang /* bytes 24-27 */ 405bfe1d560SDave Jiang u16 occupancy; 406bfe1d560SDave Jiang u16 occupancy_int:1; 407bfe1d560SDave Jiang u16 rsvd7:12; 408bfe1d560SDave Jiang u16 mode_support:1; 409bfe1d560SDave Jiang u16 wq_state:2; 410bfe1d560SDave Jiang 411bfe1d560SDave Jiang /* bytes 28-31 */ 412bfe1d560SDave Jiang u32 rsvd8; 413b0325aefSDave Jiang 414b0325aefSDave Jiang /* bytes 32-63 */ 415b0325aefSDave Jiang u64 op_config[4]; 416bfe1d560SDave Jiang }; 417b0325aefSDave Jiang u32 bits[16]; 4180044c5fcSYi Sun }; 419484f910eSDave Jiang 4208e50d392SDave Jiang #define WQCFG_PASID_IDX 2 4213157dd0aSDave Jiang #define WQCFG_PRIVL_IDX 2 422e753a64bSDave Jiang #define WQCFG_OCCUP_IDX 6 423e753a64bSDave Jiang 424e753a64bSDave Jiang #define WQCFG_OCCUP_MASK 0xffff 4258e50d392SDave Jiang 426484f910eSDave Jiang /* 427484f910eSDave Jiang * This macro calculates the offset into the WQCFG register 428484f910eSDave Jiang * idxd - struct idxd * 429484f910eSDave Jiang * n - wq id 430484f910eSDave Jiang * ofs - the index of the 32b dword for the config register 431484f910eSDave Jiang * 432484f910eSDave Jiang * The WQCFG register block is divided into groups per each wq. The n index 433484f910eSDave Jiang * allows us to move to the register group that's for that particular wq. 434484f910eSDave Jiang * Each register is 32bits. The ofs gives us the number of register to access. 435484f910eSDave Jiang */ 436484f910eSDave Jiang #define WQCFG_OFFSET(_idxd_dev, n, ofs) \ 437484f910eSDave Jiang ({\ 438484f910eSDave Jiang typeof(_idxd_dev) __idxd_dev = (_idxd_dev); \ 439484f910eSDave Jiang (__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs); \ 440484f910eSDave Jiang }) 441484f910eSDave Jiang 442484f910eSDave Jiang #define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32)) 443484f910eSDave Jiang 4445a712701SDave Jiang #define GRPCFG_SIZE 64 4455a712701SDave Jiang #define GRPWQCFG_STRIDES 4 4465a712701SDave Jiang 4475a712701SDave Jiang /* 4485a712701SDave Jiang * This macro calculates the offset into the GRPCFG register 4495a712701SDave Jiang * idxd - struct idxd * 4500c154698SGuanjun * n - group id 4510c154698SGuanjun * ofs - the index of the 64b qword for the config register 4525a712701SDave Jiang * 4530c154698SGuanjun * The GRPCFG register block is divided into three sub-registers, which 4540c154698SGuanjun * are GRPWQCFG, GRPENGCFG and GRPFLGCFG. The n index allows us to move 4550c154698SGuanjun * to the register block that contains the three sub-registers. 4560c154698SGuanjun * Each register block is 64bits. And the ofs gives us the offset 4570c154698SGuanjun * within the GRPWQCFG register to access. 4585a712701SDave Jiang */ 4595a712701SDave Jiang #define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\ 4605a712701SDave Jiang (n) * GRPCFG_SIZE + sizeof(u64) * (ofs)) 4615a712701SDave Jiang #define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32) 4625a712701SDave Jiang #define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40) 4635a712701SDave Jiang 46481dd4d4dSTom Zanussi /* Following is performance monitor registers */ 46581dd4d4dSTom Zanussi #define IDXD_PERFCAP_OFFSET 0x0 46681dd4d4dSTom Zanussi union idxd_perfcap { 46781dd4d4dSTom Zanussi struct { 46881dd4d4dSTom Zanussi u64 num_perf_counter:6; 46981dd4d4dSTom Zanussi u64 rsvd1:2; 47081dd4d4dSTom Zanussi u64 counter_width:8; 47181dd4d4dSTom Zanussi u64 num_event_category:4; 47281dd4d4dSTom Zanussi u64 global_event_category:16; 47381dd4d4dSTom Zanussi u64 filter:8; 47481dd4d4dSTom Zanussi u64 rsvd2:8; 47581dd4d4dSTom Zanussi u64 cap_per_counter:1; 47681dd4d4dSTom Zanussi u64 writeable_counter:1; 47781dd4d4dSTom Zanussi u64 counter_freeze:1; 47881dd4d4dSTom Zanussi u64 overflow_interrupt:1; 47981dd4d4dSTom Zanussi u64 rsvd3:8; 48081dd4d4dSTom Zanussi }; 48181dd4d4dSTom Zanussi u64 bits; 4820044c5fcSYi Sun }; 48381dd4d4dSTom Zanussi 48481dd4d4dSTom Zanussi #define IDXD_EVNTCAP_OFFSET 0x80 48581dd4d4dSTom Zanussi union idxd_evntcap { 48681dd4d4dSTom Zanussi struct { 48781dd4d4dSTom Zanussi u64 events:28; 48881dd4d4dSTom Zanussi u64 rsvd:36; 48981dd4d4dSTom Zanussi }; 49081dd4d4dSTom Zanussi u64 bits; 4910044c5fcSYi Sun }; 49281dd4d4dSTom Zanussi 49381dd4d4dSTom Zanussi struct idxd_event { 49481dd4d4dSTom Zanussi union { 49581dd4d4dSTom Zanussi struct { 49681dd4d4dSTom Zanussi u32 event_category:4; 49781dd4d4dSTom Zanussi u32 events:28; 49881dd4d4dSTom Zanussi }; 49981dd4d4dSTom Zanussi u32 val; 50081dd4d4dSTom Zanussi }; 5010044c5fcSYi Sun }; 50281dd4d4dSTom Zanussi 50381dd4d4dSTom Zanussi #define IDXD_CNTRCAP_OFFSET 0x800 50481dd4d4dSTom Zanussi struct idxd_cntrcap { 50581dd4d4dSTom Zanussi union { 50681dd4d4dSTom Zanussi struct { 50781dd4d4dSTom Zanussi u32 counter_width:8; 50881dd4d4dSTom Zanussi u32 rsvd:20; 50981dd4d4dSTom Zanussi u32 num_events:4; 51081dd4d4dSTom Zanussi }; 51181dd4d4dSTom Zanussi u32 val; 51281dd4d4dSTom Zanussi }; 51381dd4d4dSTom Zanussi struct idxd_event events[]; 5140044c5fcSYi Sun }; 51581dd4d4dSTom Zanussi 51681dd4d4dSTom Zanussi #define IDXD_PERFRST_OFFSET 0x10 51781dd4d4dSTom Zanussi union idxd_perfrst { 51881dd4d4dSTom Zanussi struct { 51981dd4d4dSTom Zanussi u32 perfrst_config:1; 52081dd4d4dSTom Zanussi u32 perfrst_counter:1; 52181dd4d4dSTom Zanussi u32 rsvd:30; 52281dd4d4dSTom Zanussi }; 52381dd4d4dSTom Zanussi u32 val; 5240044c5fcSYi Sun }; 52581dd4d4dSTom Zanussi 52681dd4d4dSTom Zanussi #define IDXD_OVFSTATUS_OFFSET 0x30 52781dd4d4dSTom Zanussi #define IDXD_PERFFRZ_OFFSET 0x20 52881dd4d4dSTom Zanussi #define IDXD_CNTRCFG_OFFSET 0x100 52981dd4d4dSTom Zanussi union idxd_cntrcfg { 53081dd4d4dSTom Zanussi struct { 53181dd4d4dSTom Zanussi u64 enable:1; 53281dd4d4dSTom Zanussi u64 interrupt_ovf:1; 53381dd4d4dSTom Zanussi u64 global_freeze_ovf:1; 53481dd4d4dSTom Zanussi u64 rsvd1:5; 53581dd4d4dSTom Zanussi u64 event_category:4; 53681dd4d4dSTom Zanussi u64 rsvd2:20; 53781dd4d4dSTom Zanussi u64 events:28; 53881dd4d4dSTom Zanussi u64 rsvd3:4; 53981dd4d4dSTom Zanussi }; 54081dd4d4dSTom Zanussi u64 val; 5410044c5fcSYi Sun }; 54281dd4d4dSTom Zanussi 54381dd4d4dSTom Zanussi #define IDXD_FLTCFG_OFFSET 0x300 54481dd4d4dSTom Zanussi 54581dd4d4dSTom Zanussi #define IDXD_CNTRDATA_OFFSET 0x200 54681dd4d4dSTom Zanussi union idxd_cntrdata { 54781dd4d4dSTom Zanussi struct { 54881dd4d4dSTom Zanussi u64 event_count_value; 54981dd4d4dSTom Zanussi }; 55081dd4d4dSTom Zanussi u64 val; 5510044c5fcSYi Sun }; 55281dd4d4dSTom Zanussi 55381dd4d4dSTom Zanussi union event_cfg { 55481dd4d4dSTom Zanussi struct { 55581dd4d4dSTom Zanussi u64 event_cat:4; 55681dd4d4dSTom Zanussi u64 event_enc:28; 55781dd4d4dSTom Zanussi }; 55881dd4d4dSTom Zanussi u64 val; 5590044c5fcSYi Sun }; 56081dd4d4dSTom Zanussi 56181dd4d4dSTom Zanussi union filter_cfg { 56281dd4d4dSTom Zanussi struct { 56381dd4d4dSTom Zanussi u64 wq:32; 56481dd4d4dSTom Zanussi u64 tc:8; 56581dd4d4dSTom Zanussi u64 pg_sz:4; 56681dd4d4dSTom Zanussi u64 xfer_sz:8; 56781dd4d4dSTom Zanussi u64 eng:8; 56881dd4d4dSTom Zanussi }; 56981dd4d4dSTom Zanussi u64 val; 5700044c5fcSYi Sun }; 57181dd4d4dSTom Zanussi 5722f431ba9SDave Jiang #define IDXD_EVLSTATUS_OFFSET 0xf0 5732f431ba9SDave Jiang 5742f431ba9SDave Jiang union evl_status_reg { 5752f431ba9SDave Jiang struct { 5762f431ba9SDave Jiang u32 head:16; 5772f431ba9SDave Jiang u32 rsvd:16; 5782f431ba9SDave Jiang u32 tail:16; 5792f431ba9SDave Jiang u32 rsvd2:14; 5802f431ba9SDave Jiang u32 int_pending:1; 5812f431ba9SDave Jiang u32 rsvd3:1; 5822f431ba9SDave Jiang }; 5832f431ba9SDave Jiang struct { 5842f431ba9SDave Jiang u32 bits_lower32; 5852f431ba9SDave Jiang u32 bits_upper32; 5862f431ba9SDave Jiang }; 5872f431ba9SDave Jiang u64 bits; 5880044c5fcSYi Sun }; 5892f431ba9SDave Jiang 5902442b747SDave Jiang #define IDXD_MAX_BATCH_IDENT 256 5912442b747SDave Jiang 592244da66cSDave Jiang struct __evl_entry { 593244da66cSDave Jiang u64 rsvd:2; 594244da66cSDave Jiang u64 desc_valid:1; 595244da66cSDave Jiang u64 wq_idx_valid:1; 596244da66cSDave Jiang u64 batch:1; 597244da66cSDave Jiang u64 fault_rw:1; 598244da66cSDave Jiang u64 priv:1; 599244da66cSDave Jiang u64 err_info_valid:1; 600244da66cSDave Jiang u64 error:8; 601244da66cSDave Jiang u64 wq_idx:8; 602244da66cSDave Jiang u64 batch_id:8; 603244da66cSDave Jiang u64 operation:8; 604244da66cSDave Jiang u64 pasid:20; 605244da66cSDave Jiang u64 rsvd2:4; 606244da66cSDave Jiang 607244da66cSDave Jiang u16 batch_idx; 608244da66cSDave Jiang u16 rsvd3; 609244da66cSDave Jiang union { 610244da66cSDave Jiang /* Invalid Flags 0x11 */ 611244da66cSDave Jiang u32 invalid_flags; 612244da66cSDave Jiang /* Invalid Int Handle 0x19 */ 613244da66cSDave Jiang /* Page fault 0x1a */ 614244da66cSDave Jiang /* Page fault 0x06, 0x1f, only operand_id */ 615244da66cSDave Jiang /* Page fault before drain or in batch, 0x26, 0x27 */ 616244da66cSDave Jiang struct { 617244da66cSDave Jiang u16 int_handle; 618244da66cSDave Jiang u16 rci:1; 619244da66cSDave Jiang u16 ims:1; 620244da66cSDave Jiang u16 rcr:1; 621244da66cSDave Jiang u16 first_err_in_batch:1; 622244da66cSDave Jiang u16 rsvd4_2:9; 623244da66cSDave Jiang u16 operand_id:3; 624244da66cSDave Jiang }; 625244da66cSDave Jiang }; 626244da66cSDave Jiang u64 fault_addr; 627244da66cSDave Jiang u64 rsvd5; 6280044c5fcSYi Sun }; 629244da66cSDave Jiang 630244da66cSDave Jiang struct dsa_evl_entry { 631244da66cSDave Jiang struct __evl_entry e; 632244da66cSDave Jiang struct dsa_completion_record cr; 6330044c5fcSYi Sun }; 634244da66cSDave Jiang 635244da66cSDave Jiang struct iax_evl_entry { 636244da66cSDave Jiang struct __evl_entry e; 637244da66cSDave Jiang u64 rsvd[4]; 638244da66cSDave Jiang struct iax_completion_record cr; 6390044c5fcSYi Sun }; 640244da66cSDave Jiang 641bfe1d560SDave Jiang #endif 642