162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright(c) 2019 Intel Corporation. All rights rsvd. */ 362306a36Sopenharmony_ci#ifndef _IDXD_REGISTERS_H_ 462306a36Sopenharmony_ci#define _IDXD_REGISTERS_H_ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <uapi/linux/idxd.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* PCI Config */ 962306a36Sopenharmony_ci#define PCI_DEVICE_ID_INTEL_DSA_SPR0 0x0b25 1062306a36Sopenharmony_ci#define PCI_DEVICE_ID_INTEL_IAX_SPR0 0x0cfe 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define DEVICE_VERSION_1 0x100 1362306a36Sopenharmony_ci#define DEVICE_VERSION_2 0x200 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define IDXD_MMIO_BAR 0 1662306a36Sopenharmony_ci#define IDXD_WQ_BAR 2 1762306a36Sopenharmony_ci#define IDXD_PORTAL_SIZE PAGE_SIZE 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* MMIO Device BAR0 Registers */ 2062306a36Sopenharmony_ci#define IDXD_VER_OFFSET 0x00 2162306a36Sopenharmony_ci#define IDXD_VER_MAJOR_MASK 0xf0 2262306a36Sopenharmony_ci#define IDXD_VER_MINOR_MASK 0x0f 2362306a36Sopenharmony_ci#define GET_IDXD_VER_MAJOR(x) (((x) & IDXD_VER_MAJOR_MASK) >> 4) 2462306a36Sopenharmony_ci#define GET_IDXD_VER_MINOR(x) ((x) & IDXD_VER_MINOR_MASK) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciunion gen_cap_reg { 2762306a36Sopenharmony_ci struct { 2862306a36Sopenharmony_ci u64 block_on_fault:1; 2962306a36Sopenharmony_ci u64 overlap_copy:1; 3062306a36Sopenharmony_ci u64 cache_control_mem:1; 3162306a36Sopenharmony_ci u64 cache_control_cache:1; 3262306a36Sopenharmony_ci u64 cmd_cap:1; 3362306a36Sopenharmony_ci u64 rsvd:3; 3462306a36Sopenharmony_ci u64 dest_readback:1; 3562306a36Sopenharmony_ci u64 drain_readback:1; 3662306a36Sopenharmony_ci u64 rsvd2:3; 3762306a36Sopenharmony_ci u64 evl_support:2; 3862306a36Sopenharmony_ci u64 batch_continuation:1; 3962306a36Sopenharmony_ci u64 max_xfer_shift:5; 4062306a36Sopenharmony_ci u64 max_batch_shift:4; 4162306a36Sopenharmony_ci u64 max_ims_mult:6; 4262306a36Sopenharmony_ci u64 config_en:1; 4362306a36Sopenharmony_ci u64 rsvd3:32; 4462306a36Sopenharmony_ci }; 4562306a36Sopenharmony_ci u64 bits; 4662306a36Sopenharmony_ci} __packed; 4762306a36Sopenharmony_ci#define IDXD_GENCAP_OFFSET 0x10 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciunion wq_cap_reg { 5062306a36Sopenharmony_ci struct { 5162306a36Sopenharmony_ci u64 total_wq_size:16; 5262306a36Sopenharmony_ci u64 num_wqs:8; 5362306a36Sopenharmony_ci u64 wqcfg_size:4; 5462306a36Sopenharmony_ci u64 rsvd:20; 5562306a36Sopenharmony_ci u64 shared_mode:1; 5662306a36Sopenharmony_ci u64 dedicated_mode:1; 5762306a36Sopenharmony_ci u64 wq_ats_support:1; 5862306a36Sopenharmony_ci u64 priority:1; 5962306a36Sopenharmony_ci u64 occupancy:1; 6062306a36Sopenharmony_ci u64 occupancy_int:1; 6162306a36Sopenharmony_ci u64 op_config:1; 6262306a36Sopenharmony_ci u64 wq_prs_support:1; 6362306a36Sopenharmony_ci u64 rsvd4:8; 6462306a36Sopenharmony_ci }; 6562306a36Sopenharmony_ci u64 bits; 6662306a36Sopenharmony_ci} __packed; 6762306a36Sopenharmony_ci#define IDXD_WQCAP_OFFSET 0x20 6862306a36Sopenharmony_ci#define IDXD_WQCFG_MIN 5 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciunion group_cap_reg { 7162306a36Sopenharmony_ci struct { 7262306a36Sopenharmony_ci u64 num_groups:8; 7362306a36Sopenharmony_ci u64 total_rdbufs:8; /* formerly total_tokens */ 7462306a36Sopenharmony_ci u64 rdbuf_ctrl:1; /* formerly token_en */ 7562306a36Sopenharmony_ci u64 rdbuf_limit:1; /* formerly token_limit */ 7662306a36Sopenharmony_ci u64 progress_limit:1; /* descriptor and batch descriptor */ 7762306a36Sopenharmony_ci u64 rsvd:45; 7862306a36Sopenharmony_ci }; 7962306a36Sopenharmony_ci u64 bits; 8062306a36Sopenharmony_ci} __packed; 8162306a36Sopenharmony_ci#define IDXD_GRPCAP_OFFSET 0x30 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciunion engine_cap_reg { 8462306a36Sopenharmony_ci struct { 8562306a36Sopenharmony_ci u64 num_engines:8; 8662306a36Sopenharmony_ci u64 rsvd:56; 8762306a36Sopenharmony_ci }; 8862306a36Sopenharmony_ci u64 bits; 8962306a36Sopenharmony_ci} __packed; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define IDXD_ENGCAP_OFFSET 0x38 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define IDXD_OPCAP_NOOP 0x0001 9462306a36Sopenharmony_ci#define IDXD_OPCAP_BATCH 0x0002 9562306a36Sopenharmony_ci#define IDXD_OPCAP_MEMMOVE 0x0008 9662306a36Sopenharmony_cistruct opcap { 9762306a36Sopenharmony_ci u64 bits[4]; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define IDXD_MAX_OPCAP_BITS 256U 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define IDXD_OPCAP_OFFSET 0x40 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#define IDXD_TABLE_OFFSET 0x60 10562306a36Sopenharmony_ciunion offsets_reg { 10662306a36Sopenharmony_ci struct { 10762306a36Sopenharmony_ci u64 grpcfg:16; 10862306a36Sopenharmony_ci u64 wqcfg:16; 10962306a36Sopenharmony_ci u64 msix_perm:16; 11062306a36Sopenharmony_ci u64 ims:16; 11162306a36Sopenharmony_ci u64 perfmon:16; 11262306a36Sopenharmony_ci u64 rsvd:48; 11362306a36Sopenharmony_ci }; 11462306a36Sopenharmony_ci u64 bits[2]; 11562306a36Sopenharmony_ci} __packed; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define IDXD_TABLE_MULT 0x100 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define IDXD_GENCFG_OFFSET 0x80 12062306a36Sopenharmony_ciunion gencfg_reg { 12162306a36Sopenharmony_ci struct { 12262306a36Sopenharmony_ci u32 rdbuf_limit:8; 12362306a36Sopenharmony_ci u32 rsvd:4; 12462306a36Sopenharmony_ci u32 user_int_en:1; 12562306a36Sopenharmony_ci u32 evl_en:1; 12662306a36Sopenharmony_ci u32 rsvd2:18; 12762306a36Sopenharmony_ci }; 12862306a36Sopenharmony_ci u32 bits; 12962306a36Sopenharmony_ci} __packed; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define IDXD_GENCTRL_OFFSET 0x88 13262306a36Sopenharmony_ciunion genctrl_reg { 13362306a36Sopenharmony_ci struct { 13462306a36Sopenharmony_ci u32 softerr_int_en:1; 13562306a36Sopenharmony_ci u32 halt_int_en:1; 13662306a36Sopenharmony_ci u32 evl_int_en:1; 13762306a36Sopenharmony_ci u32 rsvd:29; 13862306a36Sopenharmony_ci }; 13962306a36Sopenharmony_ci u32 bits; 14062306a36Sopenharmony_ci} __packed; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#define IDXD_GENSTATS_OFFSET 0x90 14362306a36Sopenharmony_ciunion gensts_reg { 14462306a36Sopenharmony_ci struct { 14562306a36Sopenharmony_ci u32 state:2; 14662306a36Sopenharmony_ci u32 reset_type:2; 14762306a36Sopenharmony_ci u32 rsvd:28; 14862306a36Sopenharmony_ci }; 14962306a36Sopenharmony_ci u32 bits; 15062306a36Sopenharmony_ci} __packed; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cienum idxd_device_status_state { 15362306a36Sopenharmony_ci IDXD_DEVICE_STATE_DISABLED = 0, 15462306a36Sopenharmony_ci IDXD_DEVICE_STATE_ENABLED, 15562306a36Sopenharmony_ci IDXD_DEVICE_STATE_DRAIN, 15662306a36Sopenharmony_ci IDXD_DEVICE_STATE_HALT, 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cienum idxd_device_reset_type { 16062306a36Sopenharmony_ci IDXD_DEVICE_RESET_SOFTWARE = 0, 16162306a36Sopenharmony_ci IDXD_DEVICE_RESET_FLR, 16262306a36Sopenharmony_ci IDXD_DEVICE_RESET_WARM, 16362306a36Sopenharmony_ci IDXD_DEVICE_RESET_COLD, 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define IDXD_INTCAUSE_OFFSET 0x98 16762306a36Sopenharmony_ci#define IDXD_INTC_ERR 0x01 16862306a36Sopenharmony_ci#define IDXD_INTC_CMD 0x02 16962306a36Sopenharmony_ci#define IDXD_INTC_OCCUPY 0x04 17062306a36Sopenharmony_ci#define IDXD_INTC_PERFMON_OVFL 0x08 17162306a36Sopenharmony_ci#define IDXD_INTC_HALT_STATE 0x10 17262306a36Sopenharmony_ci#define IDXD_INTC_EVL 0x20 17362306a36Sopenharmony_ci#define IDXD_INTC_INT_HANDLE_REVOKED 0x80000000 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci#define IDXD_CMD_OFFSET 0xa0 17662306a36Sopenharmony_ciunion idxd_command_reg { 17762306a36Sopenharmony_ci struct { 17862306a36Sopenharmony_ci u32 operand:20; 17962306a36Sopenharmony_ci u32 cmd:5; 18062306a36Sopenharmony_ci u32 rsvd:6; 18162306a36Sopenharmony_ci u32 int_req:1; 18262306a36Sopenharmony_ci }; 18362306a36Sopenharmony_ci u32 bits; 18462306a36Sopenharmony_ci} __packed; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cienum idxd_cmd { 18762306a36Sopenharmony_ci IDXD_CMD_ENABLE_DEVICE = 1, 18862306a36Sopenharmony_ci IDXD_CMD_DISABLE_DEVICE, 18962306a36Sopenharmony_ci IDXD_CMD_DRAIN_ALL, 19062306a36Sopenharmony_ci IDXD_CMD_ABORT_ALL, 19162306a36Sopenharmony_ci IDXD_CMD_RESET_DEVICE, 19262306a36Sopenharmony_ci IDXD_CMD_ENABLE_WQ, 19362306a36Sopenharmony_ci IDXD_CMD_DISABLE_WQ, 19462306a36Sopenharmony_ci IDXD_CMD_DRAIN_WQ, 19562306a36Sopenharmony_ci IDXD_CMD_ABORT_WQ, 19662306a36Sopenharmony_ci IDXD_CMD_RESET_WQ, 19762306a36Sopenharmony_ci IDXD_CMD_DRAIN_PASID, 19862306a36Sopenharmony_ci IDXD_CMD_ABORT_PASID, 19962306a36Sopenharmony_ci IDXD_CMD_REQUEST_INT_HANDLE, 20062306a36Sopenharmony_ci IDXD_CMD_RELEASE_INT_HANDLE, 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci#define CMD_INT_HANDLE_IMS 0x10000 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci#define IDXD_CMDSTS_OFFSET 0xa8 20662306a36Sopenharmony_ciunion cmdsts_reg { 20762306a36Sopenharmony_ci struct { 20862306a36Sopenharmony_ci u8 err; 20962306a36Sopenharmony_ci u16 result; 21062306a36Sopenharmony_ci u8 rsvd:7; 21162306a36Sopenharmony_ci u8 active:1; 21262306a36Sopenharmony_ci }; 21362306a36Sopenharmony_ci u32 bits; 21462306a36Sopenharmony_ci} __packed; 21562306a36Sopenharmony_ci#define IDXD_CMDSTS_ACTIVE 0x80000000 21662306a36Sopenharmony_ci#define IDXD_CMDSTS_ERR_MASK 0xff 21762306a36Sopenharmony_ci#define IDXD_CMDSTS_RES_SHIFT 8 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cienum idxd_cmdsts_err { 22062306a36Sopenharmony_ci IDXD_CMDSTS_SUCCESS = 0, 22162306a36Sopenharmony_ci IDXD_CMDSTS_INVAL_CMD, 22262306a36Sopenharmony_ci IDXD_CMDSTS_INVAL_WQIDX, 22362306a36Sopenharmony_ci IDXD_CMDSTS_HW_ERR, 22462306a36Sopenharmony_ci /* enable device errors */ 22562306a36Sopenharmony_ci IDXD_CMDSTS_ERR_DEV_ENABLED = 0x10, 22662306a36Sopenharmony_ci IDXD_CMDSTS_ERR_CONFIG, 22762306a36Sopenharmony_ci IDXD_CMDSTS_ERR_BUSMASTER_EN, 22862306a36Sopenharmony_ci IDXD_CMDSTS_ERR_PASID_INVAL, 22962306a36Sopenharmony_ci IDXD_CMDSTS_ERR_WQ_SIZE_ERANGE, 23062306a36Sopenharmony_ci IDXD_CMDSTS_ERR_GRP_CONFIG, 23162306a36Sopenharmony_ci IDXD_CMDSTS_ERR_GRP_CONFIG2, 23262306a36Sopenharmony_ci IDXD_CMDSTS_ERR_GRP_CONFIG3, 23362306a36Sopenharmony_ci IDXD_CMDSTS_ERR_GRP_CONFIG4, 23462306a36Sopenharmony_ci /* enable wq errors */ 23562306a36Sopenharmony_ci IDXD_CMDSTS_ERR_DEV_NOTEN = 0x20, 23662306a36Sopenharmony_ci IDXD_CMDSTS_ERR_WQ_ENABLED, 23762306a36Sopenharmony_ci IDXD_CMDSTS_ERR_WQ_SIZE, 23862306a36Sopenharmony_ci IDXD_CMDSTS_ERR_WQ_PRIOR, 23962306a36Sopenharmony_ci IDXD_CMDSTS_ERR_WQ_MODE, 24062306a36Sopenharmony_ci IDXD_CMDSTS_ERR_BOF_EN, 24162306a36Sopenharmony_ci IDXD_CMDSTS_ERR_PASID_EN, 24262306a36Sopenharmony_ci IDXD_CMDSTS_ERR_MAX_BATCH_SIZE, 24362306a36Sopenharmony_ci IDXD_CMDSTS_ERR_MAX_XFER_SIZE, 24462306a36Sopenharmony_ci /* disable device errors */ 24562306a36Sopenharmony_ci IDXD_CMDSTS_ERR_DIS_DEV_EN = 0x31, 24662306a36Sopenharmony_ci /* disable WQ, drain WQ, abort WQ, reset WQ */ 24762306a36Sopenharmony_ci IDXD_CMDSTS_ERR_DEV_NOT_EN, 24862306a36Sopenharmony_ci /* request interrupt handle */ 24962306a36Sopenharmony_ci IDXD_CMDSTS_ERR_INVAL_INT_IDX = 0x41, 25062306a36Sopenharmony_ci IDXD_CMDSTS_ERR_NO_HANDLE, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci#define IDXD_CMDCAP_OFFSET 0xb0 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci#define IDXD_SWERR_OFFSET 0xc0 25662306a36Sopenharmony_ci#define IDXD_SWERR_VALID 0x00000001 25762306a36Sopenharmony_ci#define IDXD_SWERR_OVERFLOW 0x00000002 25862306a36Sopenharmony_ci#define IDXD_SWERR_ACK (IDXD_SWERR_VALID | IDXD_SWERR_OVERFLOW) 25962306a36Sopenharmony_ciunion sw_err_reg { 26062306a36Sopenharmony_ci struct { 26162306a36Sopenharmony_ci u64 valid:1; 26262306a36Sopenharmony_ci u64 overflow:1; 26362306a36Sopenharmony_ci u64 desc_valid:1; 26462306a36Sopenharmony_ci u64 wq_idx_valid:1; 26562306a36Sopenharmony_ci u64 batch:1; 26662306a36Sopenharmony_ci u64 fault_rw:1; 26762306a36Sopenharmony_ci u64 priv:1; 26862306a36Sopenharmony_ci u64 rsvd:1; 26962306a36Sopenharmony_ci u64 error:8; 27062306a36Sopenharmony_ci u64 wq_idx:8; 27162306a36Sopenharmony_ci u64 rsvd2:8; 27262306a36Sopenharmony_ci u64 operation:8; 27362306a36Sopenharmony_ci u64 pasid:20; 27462306a36Sopenharmony_ci u64 rsvd3:4; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci u64 batch_idx:16; 27762306a36Sopenharmony_ci u64 rsvd4:16; 27862306a36Sopenharmony_ci u64 invalid_flags:32; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci u64 fault_addr; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci u64 rsvd5; 28362306a36Sopenharmony_ci }; 28462306a36Sopenharmony_ci u64 bits[4]; 28562306a36Sopenharmony_ci} __packed; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ciunion iaa_cap_reg { 28862306a36Sopenharmony_ci struct { 28962306a36Sopenharmony_ci u64 dec_aecs_format_ver:1; 29062306a36Sopenharmony_ci u64 drop_init_bits:1; 29162306a36Sopenharmony_ci u64 chaining:1; 29262306a36Sopenharmony_ci u64 force_array_output_mod:1; 29362306a36Sopenharmony_ci u64 load_part_aecs:1; 29462306a36Sopenharmony_ci u64 comp_early_abort:1; 29562306a36Sopenharmony_ci u64 nested_comp:1; 29662306a36Sopenharmony_ci u64 diction_comp:1; 29762306a36Sopenharmony_ci u64 header_gen:1; 29862306a36Sopenharmony_ci u64 crypto_gcm:1; 29962306a36Sopenharmony_ci u64 crypto_cfb:1; 30062306a36Sopenharmony_ci u64 crypto_xts:1; 30162306a36Sopenharmony_ci u64 rsvd:52; 30262306a36Sopenharmony_ci }; 30362306a36Sopenharmony_ci u64 bits; 30462306a36Sopenharmony_ci} __packed; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci#define IDXD_IAACAP_OFFSET 0x180 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#define IDXD_EVLCFG_OFFSET 0xe0 30962306a36Sopenharmony_ciunion evlcfg_reg { 31062306a36Sopenharmony_ci struct { 31162306a36Sopenharmony_ci u64 pasid_en:1; 31262306a36Sopenharmony_ci u64 priv:1; 31362306a36Sopenharmony_ci u64 rsvd:10; 31462306a36Sopenharmony_ci u64 base_addr:52; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci u64 size:16; 31762306a36Sopenharmony_ci u64 pasid:20; 31862306a36Sopenharmony_ci u64 rsvd2:28; 31962306a36Sopenharmony_ci }; 32062306a36Sopenharmony_ci u64 bits[2]; 32162306a36Sopenharmony_ci} __packed; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define IDXD_EVL_SIZE_MIN 0x0040 32462306a36Sopenharmony_ci#define IDXD_EVL_SIZE_MAX 0xffff 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciunion msix_perm { 32762306a36Sopenharmony_ci struct { 32862306a36Sopenharmony_ci u32 rsvd:2; 32962306a36Sopenharmony_ci u32 ignore:1; 33062306a36Sopenharmony_ci u32 pasid_en:1; 33162306a36Sopenharmony_ci u32 rsvd2:8; 33262306a36Sopenharmony_ci u32 pasid:20; 33362306a36Sopenharmony_ci }; 33462306a36Sopenharmony_ci u32 bits; 33562306a36Sopenharmony_ci} __packed; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ciunion group_flags { 33862306a36Sopenharmony_ci struct { 33962306a36Sopenharmony_ci u64 tc_a:3; 34062306a36Sopenharmony_ci u64 tc_b:3; 34162306a36Sopenharmony_ci u64 rsvd:1; 34262306a36Sopenharmony_ci u64 use_rdbuf_limit:1; 34362306a36Sopenharmony_ci u64 rdbufs_reserved:8; 34462306a36Sopenharmony_ci u64 rsvd2:4; 34562306a36Sopenharmony_ci u64 rdbufs_allowed:8; 34662306a36Sopenharmony_ci u64 rsvd3:4; 34762306a36Sopenharmony_ci u64 desc_progress_limit:2; 34862306a36Sopenharmony_ci u64 rsvd4:2; 34962306a36Sopenharmony_ci u64 batch_progress_limit:2; 35062306a36Sopenharmony_ci u64 rsvd5:26; 35162306a36Sopenharmony_ci }; 35262306a36Sopenharmony_ci u64 bits; 35362306a36Sopenharmony_ci} __packed; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cistruct grpcfg { 35662306a36Sopenharmony_ci u64 wqs[4]; 35762306a36Sopenharmony_ci u64 engines; 35862306a36Sopenharmony_ci union group_flags flags; 35962306a36Sopenharmony_ci} __packed; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ciunion wqcfg { 36262306a36Sopenharmony_ci struct { 36362306a36Sopenharmony_ci /* bytes 0-3 */ 36462306a36Sopenharmony_ci u16 wq_size; 36562306a36Sopenharmony_ci u16 rsvd; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci /* bytes 4-7 */ 36862306a36Sopenharmony_ci u16 wq_thresh; 36962306a36Sopenharmony_ci u16 rsvd1; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci /* bytes 8-11 */ 37262306a36Sopenharmony_ci u32 mode:1; /* shared or dedicated */ 37362306a36Sopenharmony_ci u32 bof:1; /* block on fault */ 37462306a36Sopenharmony_ci u32 wq_ats_disable:1; 37562306a36Sopenharmony_ci u32 wq_prs_disable:1; 37662306a36Sopenharmony_ci u32 priority:4; 37762306a36Sopenharmony_ci u32 pasid:20; 37862306a36Sopenharmony_ci u32 pasid_en:1; 37962306a36Sopenharmony_ci u32 priv:1; 38062306a36Sopenharmony_ci u32 rsvd3:2; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci /* bytes 12-15 */ 38362306a36Sopenharmony_ci u32 max_xfer_shift:5; 38462306a36Sopenharmony_ci u32 max_batch_shift:4; 38562306a36Sopenharmony_ci u32 rsvd4:23; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci /* bytes 16-19 */ 38862306a36Sopenharmony_ci u16 occupancy_inth; 38962306a36Sopenharmony_ci u16 occupancy_table_sel:1; 39062306a36Sopenharmony_ci u16 rsvd5:15; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* bytes 20-23 */ 39362306a36Sopenharmony_ci u16 occupancy_limit; 39462306a36Sopenharmony_ci u16 occupancy_int_en:1; 39562306a36Sopenharmony_ci u16 rsvd6:15; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci /* bytes 24-27 */ 39862306a36Sopenharmony_ci u16 occupancy; 39962306a36Sopenharmony_ci u16 occupancy_int:1; 40062306a36Sopenharmony_ci u16 rsvd7:12; 40162306a36Sopenharmony_ci u16 mode_support:1; 40262306a36Sopenharmony_ci u16 wq_state:2; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci /* bytes 28-31 */ 40562306a36Sopenharmony_ci u32 rsvd8; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci /* bytes 32-63 */ 40862306a36Sopenharmony_ci u64 op_config[4]; 40962306a36Sopenharmony_ci }; 41062306a36Sopenharmony_ci u32 bits[16]; 41162306a36Sopenharmony_ci} __packed; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci#define WQCFG_PASID_IDX 2 41462306a36Sopenharmony_ci#define WQCFG_PRIVL_IDX 2 41562306a36Sopenharmony_ci#define WQCFG_OCCUP_IDX 6 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#define WQCFG_OCCUP_MASK 0xffff 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci/* 42062306a36Sopenharmony_ci * This macro calculates the offset into the WQCFG register 42162306a36Sopenharmony_ci * idxd - struct idxd * 42262306a36Sopenharmony_ci * n - wq id 42362306a36Sopenharmony_ci * ofs - the index of the 32b dword for the config register 42462306a36Sopenharmony_ci * 42562306a36Sopenharmony_ci * The WQCFG register block is divided into groups per each wq. The n index 42662306a36Sopenharmony_ci * allows us to move to the register group that's for that particular wq. 42762306a36Sopenharmony_ci * Each register is 32bits. The ofs gives us the number of register to access. 42862306a36Sopenharmony_ci */ 42962306a36Sopenharmony_ci#define WQCFG_OFFSET(_idxd_dev, n, ofs) \ 43062306a36Sopenharmony_ci({\ 43162306a36Sopenharmony_ci typeof(_idxd_dev) __idxd_dev = (_idxd_dev); \ 43262306a36Sopenharmony_ci (__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs); \ 43362306a36Sopenharmony_ci}) 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci#define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32)) 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci#define GRPCFG_SIZE 64 43862306a36Sopenharmony_ci#define GRPWQCFG_STRIDES 4 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci/* 44162306a36Sopenharmony_ci * This macro calculates the offset into the GRPCFG register 44262306a36Sopenharmony_ci * idxd - struct idxd * 44362306a36Sopenharmony_ci * n - wq id 44462306a36Sopenharmony_ci * ofs - the index of the 32b dword for the config register 44562306a36Sopenharmony_ci * 44662306a36Sopenharmony_ci * The WQCFG register block is divided into groups per each wq. The n index 44762306a36Sopenharmony_ci * allows us to move to the register group that's for that particular wq. 44862306a36Sopenharmony_ci * Each register is 32bits. The ofs gives us the number of register to access. 44962306a36Sopenharmony_ci */ 45062306a36Sopenharmony_ci#define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\ 45162306a36Sopenharmony_ci (n) * GRPCFG_SIZE + sizeof(u64) * (ofs)) 45262306a36Sopenharmony_ci#define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32) 45362306a36Sopenharmony_ci#define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40) 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci/* Following is performance monitor registers */ 45662306a36Sopenharmony_ci#define IDXD_PERFCAP_OFFSET 0x0 45762306a36Sopenharmony_ciunion idxd_perfcap { 45862306a36Sopenharmony_ci struct { 45962306a36Sopenharmony_ci u64 num_perf_counter:6; 46062306a36Sopenharmony_ci u64 rsvd1:2; 46162306a36Sopenharmony_ci u64 counter_width:8; 46262306a36Sopenharmony_ci u64 num_event_category:4; 46362306a36Sopenharmony_ci u64 global_event_category:16; 46462306a36Sopenharmony_ci u64 filter:8; 46562306a36Sopenharmony_ci u64 rsvd2:8; 46662306a36Sopenharmony_ci u64 cap_per_counter:1; 46762306a36Sopenharmony_ci u64 writeable_counter:1; 46862306a36Sopenharmony_ci u64 counter_freeze:1; 46962306a36Sopenharmony_ci u64 overflow_interrupt:1; 47062306a36Sopenharmony_ci u64 rsvd3:8; 47162306a36Sopenharmony_ci }; 47262306a36Sopenharmony_ci u64 bits; 47362306a36Sopenharmony_ci} __packed; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci#define IDXD_EVNTCAP_OFFSET 0x80 47662306a36Sopenharmony_ciunion idxd_evntcap { 47762306a36Sopenharmony_ci struct { 47862306a36Sopenharmony_ci u64 events:28; 47962306a36Sopenharmony_ci u64 rsvd:36; 48062306a36Sopenharmony_ci }; 48162306a36Sopenharmony_ci u64 bits; 48262306a36Sopenharmony_ci} __packed; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_cistruct idxd_event { 48562306a36Sopenharmony_ci union { 48662306a36Sopenharmony_ci struct { 48762306a36Sopenharmony_ci u32 event_category:4; 48862306a36Sopenharmony_ci u32 events:28; 48962306a36Sopenharmony_ci }; 49062306a36Sopenharmony_ci u32 val; 49162306a36Sopenharmony_ci }; 49262306a36Sopenharmony_ci} __packed; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci#define IDXD_CNTRCAP_OFFSET 0x800 49562306a36Sopenharmony_cistruct idxd_cntrcap { 49662306a36Sopenharmony_ci union { 49762306a36Sopenharmony_ci struct { 49862306a36Sopenharmony_ci u32 counter_width:8; 49962306a36Sopenharmony_ci u32 rsvd:20; 50062306a36Sopenharmony_ci u32 num_events:4; 50162306a36Sopenharmony_ci }; 50262306a36Sopenharmony_ci u32 val; 50362306a36Sopenharmony_ci }; 50462306a36Sopenharmony_ci struct idxd_event events[]; 50562306a36Sopenharmony_ci} __packed; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci#define IDXD_PERFRST_OFFSET 0x10 50862306a36Sopenharmony_ciunion idxd_perfrst { 50962306a36Sopenharmony_ci struct { 51062306a36Sopenharmony_ci u32 perfrst_config:1; 51162306a36Sopenharmony_ci u32 perfrst_counter:1; 51262306a36Sopenharmony_ci u32 rsvd:30; 51362306a36Sopenharmony_ci }; 51462306a36Sopenharmony_ci u32 val; 51562306a36Sopenharmony_ci} __packed; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci#define IDXD_OVFSTATUS_OFFSET 0x30 51862306a36Sopenharmony_ci#define IDXD_PERFFRZ_OFFSET 0x20 51962306a36Sopenharmony_ci#define IDXD_CNTRCFG_OFFSET 0x100 52062306a36Sopenharmony_ciunion idxd_cntrcfg { 52162306a36Sopenharmony_ci struct { 52262306a36Sopenharmony_ci u64 enable:1; 52362306a36Sopenharmony_ci u64 interrupt_ovf:1; 52462306a36Sopenharmony_ci u64 global_freeze_ovf:1; 52562306a36Sopenharmony_ci u64 rsvd1:5; 52662306a36Sopenharmony_ci u64 event_category:4; 52762306a36Sopenharmony_ci u64 rsvd2:20; 52862306a36Sopenharmony_ci u64 events:28; 52962306a36Sopenharmony_ci u64 rsvd3:4; 53062306a36Sopenharmony_ci }; 53162306a36Sopenharmony_ci u64 val; 53262306a36Sopenharmony_ci} __packed; 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci#define IDXD_FLTCFG_OFFSET 0x300 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci#define IDXD_CNTRDATA_OFFSET 0x200 53762306a36Sopenharmony_ciunion idxd_cntrdata { 53862306a36Sopenharmony_ci struct { 53962306a36Sopenharmony_ci u64 event_count_value; 54062306a36Sopenharmony_ci }; 54162306a36Sopenharmony_ci u64 val; 54262306a36Sopenharmony_ci} __packed; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ciunion event_cfg { 54562306a36Sopenharmony_ci struct { 54662306a36Sopenharmony_ci u64 event_cat:4; 54762306a36Sopenharmony_ci u64 event_enc:28; 54862306a36Sopenharmony_ci }; 54962306a36Sopenharmony_ci u64 val; 55062306a36Sopenharmony_ci} __packed; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ciunion filter_cfg { 55362306a36Sopenharmony_ci struct { 55462306a36Sopenharmony_ci u64 wq:32; 55562306a36Sopenharmony_ci u64 tc:8; 55662306a36Sopenharmony_ci u64 pg_sz:4; 55762306a36Sopenharmony_ci u64 xfer_sz:8; 55862306a36Sopenharmony_ci u64 eng:8; 55962306a36Sopenharmony_ci }; 56062306a36Sopenharmony_ci u64 val; 56162306a36Sopenharmony_ci} __packed; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci#define IDXD_EVLSTATUS_OFFSET 0xf0 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ciunion evl_status_reg { 56662306a36Sopenharmony_ci struct { 56762306a36Sopenharmony_ci u32 head:16; 56862306a36Sopenharmony_ci u32 rsvd:16; 56962306a36Sopenharmony_ci u32 tail:16; 57062306a36Sopenharmony_ci u32 rsvd2:14; 57162306a36Sopenharmony_ci u32 int_pending:1; 57262306a36Sopenharmony_ci u32 rsvd3:1; 57362306a36Sopenharmony_ci }; 57462306a36Sopenharmony_ci struct { 57562306a36Sopenharmony_ci u32 bits_lower32; 57662306a36Sopenharmony_ci u32 bits_upper32; 57762306a36Sopenharmony_ci }; 57862306a36Sopenharmony_ci u64 bits; 57962306a36Sopenharmony_ci} __packed; 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci#define IDXD_MAX_BATCH_IDENT 256 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_cistruct __evl_entry { 58462306a36Sopenharmony_ci u64 rsvd:2; 58562306a36Sopenharmony_ci u64 desc_valid:1; 58662306a36Sopenharmony_ci u64 wq_idx_valid:1; 58762306a36Sopenharmony_ci u64 batch:1; 58862306a36Sopenharmony_ci u64 fault_rw:1; 58962306a36Sopenharmony_ci u64 priv:1; 59062306a36Sopenharmony_ci u64 err_info_valid:1; 59162306a36Sopenharmony_ci u64 error:8; 59262306a36Sopenharmony_ci u64 wq_idx:8; 59362306a36Sopenharmony_ci u64 batch_id:8; 59462306a36Sopenharmony_ci u64 operation:8; 59562306a36Sopenharmony_ci u64 pasid:20; 59662306a36Sopenharmony_ci u64 rsvd2:4; 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_ci u16 batch_idx; 59962306a36Sopenharmony_ci u16 rsvd3; 60062306a36Sopenharmony_ci union { 60162306a36Sopenharmony_ci /* Invalid Flags 0x11 */ 60262306a36Sopenharmony_ci u32 invalid_flags; 60362306a36Sopenharmony_ci /* Invalid Int Handle 0x19 */ 60462306a36Sopenharmony_ci /* Page fault 0x1a */ 60562306a36Sopenharmony_ci /* Page fault 0x06, 0x1f, only operand_id */ 60662306a36Sopenharmony_ci /* Page fault before drain or in batch, 0x26, 0x27 */ 60762306a36Sopenharmony_ci struct { 60862306a36Sopenharmony_ci u16 int_handle; 60962306a36Sopenharmony_ci u16 rci:1; 61062306a36Sopenharmony_ci u16 ims:1; 61162306a36Sopenharmony_ci u16 rcr:1; 61262306a36Sopenharmony_ci u16 first_err_in_batch:1; 61362306a36Sopenharmony_ci u16 rsvd4_2:9; 61462306a36Sopenharmony_ci u16 operand_id:3; 61562306a36Sopenharmony_ci }; 61662306a36Sopenharmony_ci }; 61762306a36Sopenharmony_ci u64 fault_addr; 61862306a36Sopenharmony_ci u64 rsvd5; 61962306a36Sopenharmony_ci} __packed; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_cistruct dsa_evl_entry { 62262306a36Sopenharmony_ci struct __evl_entry e; 62362306a36Sopenharmony_ci struct dsa_completion_record cr; 62462306a36Sopenharmony_ci} __packed; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_cistruct iax_evl_entry { 62762306a36Sopenharmony_ci struct __evl_entry e; 62862306a36Sopenharmony_ci u64 rsvd[4]; 62962306a36Sopenharmony_ci struct iax_completion_record cr; 63062306a36Sopenharmony_ci} __packed; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci#endif 633