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