162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 262306a36Sopenharmony_ci/* Copyright (C) 2016-2018 Netronome Systems, Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __NFP_ASM_H__ 562306a36Sopenharmony_ci#define __NFP_ASM_H__ 1 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/bitfield.h> 862306a36Sopenharmony_ci#include <linux/bug.h> 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define REG_NONE 0 1262306a36Sopenharmony_ci#define REG_WIDTH 4 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define RE_REG_NO_DST 0x020 1562306a36Sopenharmony_ci#define RE_REG_IMM 0x020 1662306a36Sopenharmony_ci#define RE_REG_IMM_encode(x) \ 1762306a36Sopenharmony_ci (RE_REG_IMM | ((x) & 0x1f) | (((x) & 0x60) << 1)) 1862306a36Sopenharmony_ci#define RE_REG_IMM_MAX 0x07fULL 1962306a36Sopenharmony_ci#define RE_REG_LM 0x050 2062306a36Sopenharmony_ci#define RE_REG_LM_IDX 0x008 2162306a36Sopenharmony_ci#define RE_REG_LM_IDX_MAX 0x7 2262306a36Sopenharmony_ci#define RE_REG_XFR 0x080 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define UR_REG_XFR 0x180 2562306a36Sopenharmony_ci#define UR_REG_LM 0x200 2662306a36Sopenharmony_ci#define UR_REG_LM_IDX 0x020 2762306a36Sopenharmony_ci#define UR_REG_LM_POST_MOD 0x010 2862306a36Sopenharmony_ci#define UR_REG_LM_POST_MOD_DEC 0x001 2962306a36Sopenharmony_ci#define UR_REG_LM_IDX_MAX 0xf 3062306a36Sopenharmony_ci#define UR_REG_NN 0x280 3162306a36Sopenharmony_ci#define UR_REG_NO_DST 0x300 3262306a36Sopenharmony_ci#define UR_REG_IMM UR_REG_NO_DST 3362306a36Sopenharmony_ci#define UR_REG_IMM_encode(x) (UR_REG_IMM | (x)) 3462306a36Sopenharmony_ci#define UR_REG_IMM_MAX 0x0ffULL 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define OP_BR_BASE 0x0d800000020ULL 3762306a36Sopenharmony_ci#define OP_BR_BASE_MASK 0x0f8000c3ce0ULL 3862306a36Sopenharmony_ci#define OP_BR_MASK 0x0000000001fULL 3962306a36Sopenharmony_ci#define OP_BR_EV_PIP 0x00000000300ULL 4062306a36Sopenharmony_ci#define OP_BR_CSS 0x0000003c000ULL 4162306a36Sopenharmony_ci#define OP_BR_DEFBR 0x00000300000ULL 4262306a36Sopenharmony_ci#define OP_BR_ADDR_LO 0x007ffc00000ULL 4362306a36Sopenharmony_ci#define OP_BR_ADDR_HI 0x10000000000ULL 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define OP_BR_BIT_BASE 0x0d000000000ULL 4662306a36Sopenharmony_ci#define OP_BR_BIT_BASE_MASK 0x0f800080300ULL 4762306a36Sopenharmony_ci#define OP_BR_BIT_A_SRC 0x000000000ffULL 4862306a36Sopenharmony_ci#define OP_BR_BIT_B_SRC 0x0000003fc00ULL 4962306a36Sopenharmony_ci#define OP_BR_BIT_BV 0x00000040000ULL 5062306a36Sopenharmony_ci#define OP_BR_BIT_SRC_LMEXTN 0x40000000000ULL 5162306a36Sopenharmony_ci#define OP_BR_BIT_DEFBR OP_BR_DEFBR 5262306a36Sopenharmony_ci#define OP_BR_BIT_ADDR_LO OP_BR_ADDR_LO 5362306a36Sopenharmony_ci#define OP_BR_BIT_ADDR_HI OP_BR_ADDR_HI 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define OP_BR_ALU_BASE 0x0e800000000ULL 5662306a36Sopenharmony_ci#define OP_BR_ALU_BASE_MASK 0x0ff80000000ULL 5762306a36Sopenharmony_ci#define OP_BR_ALU_A_SRC 0x000000003ffULL 5862306a36Sopenharmony_ci#define OP_BR_ALU_B_SRC 0x000000ffc00ULL 5962306a36Sopenharmony_ci#define OP_BR_ALU_DEFBR 0x00000300000ULL 6062306a36Sopenharmony_ci#define OP_BR_ALU_IMM_HI 0x0007fc00000ULL 6162306a36Sopenharmony_ci#define OP_BR_ALU_SRC_LMEXTN 0x40000000000ULL 6262306a36Sopenharmony_ci#define OP_BR_ALU_DST_LMEXTN 0x80000000000ULL 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic inline bool nfp_is_br(u64 insn) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci return (insn & OP_BR_BASE_MASK) == OP_BR_BASE || 6762306a36Sopenharmony_ci (insn & OP_BR_BIT_BASE_MASK) == OP_BR_BIT_BASE; 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cienum br_mask { 7162306a36Sopenharmony_ci BR_BEQ = 0x00, 7262306a36Sopenharmony_ci BR_BNE = 0x01, 7362306a36Sopenharmony_ci BR_BMI = 0x02, 7462306a36Sopenharmony_ci BR_BHS = 0x04, 7562306a36Sopenharmony_ci BR_BCC = 0x05, 7662306a36Sopenharmony_ci BR_BLO = 0x05, 7762306a36Sopenharmony_ci BR_BGE = 0x08, 7862306a36Sopenharmony_ci BR_BLT = 0x09, 7962306a36Sopenharmony_ci BR_UNC = 0x18, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cienum br_ev_pip { 8362306a36Sopenharmony_ci BR_EV_PIP_UNCOND = 0, 8462306a36Sopenharmony_ci BR_EV_PIP_COND = 1, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cienum br_ctx_signal_state { 8862306a36Sopenharmony_ci BR_CSS_NONE = 2, 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciu16 br_get_offset(u64 instr); 9262306a36Sopenharmony_civoid br_set_offset(u64 *instr, u16 offset); 9362306a36Sopenharmony_civoid br_add_offset(u64 *instr, u16 offset); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define OP_BBYTE_BASE 0x0c800000000ULL 9662306a36Sopenharmony_ci#define OP_BB_A_SRC 0x000000000ffULL 9762306a36Sopenharmony_ci#define OP_BB_BYTE 0x00000000300ULL 9862306a36Sopenharmony_ci#define OP_BB_B_SRC 0x0000003fc00ULL 9962306a36Sopenharmony_ci#define OP_BB_I8 0x00000040000ULL 10062306a36Sopenharmony_ci#define OP_BB_EQ 0x00000080000ULL 10162306a36Sopenharmony_ci#define OP_BB_DEFBR 0x00000300000ULL 10262306a36Sopenharmony_ci#define OP_BB_ADDR_LO 0x007ffc00000ULL 10362306a36Sopenharmony_ci#define OP_BB_ADDR_HI 0x10000000000ULL 10462306a36Sopenharmony_ci#define OP_BB_SRC_LMEXTN 0x40000000000ULL 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define OP_BALU_BASE 0x0e800000000ULL 10762306a36Sopenharmony_ci#define OP_BA_A_SRC 0x000000003ffULL 10862306a36Sopenharmony_ci#define OP_BA_B_SRC 0x000000ffc00ULL 10962306a36Sopenharmony_ci#define OP_BA_DEFBR 0x00000300000ULL 11062306a36Sopenharmony_ci#define OP_BA_ADDR_HI 0x0007fc00000ULL 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#define OP_IMMED_A_SRC 0x000000003ffULL 11362306a36Sopenharmony_ci#define OP_IMMED_B_SRC 0x000000ffc00ULL 11462306a36Sopenharmony_ci#define OP_IMMED_IMM 0x0000ff00000ULL 11562306a36Sopenharmony_ci#define OP_IMMED_WIDTH 0x00060000000ULL 11662306a36Sopenharmony_ci#define OP_IMMED_INV 0x00080000000ULL 11762306a36Sopenharmony_ci#define OP_IMMED_SHIFT 0x00600000000ULL 11862306a36Sopenharmony_ci#define OP_IMMED_BASE 0x0f000000000ULL 11962306a36Sopenharmony_ci#define OP_IMMED_WR_AB 0x20000000000ULL 12062306a36Sopenharmony_ci#define OP_IMMED_SRC_LMEXTN 0x40000000000ULL 12162306a36Sopenharmony_ci#define OP_IMMED_DST_LMEXTN 0x80000000000ULL 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cienum immed_width { 12462306a36Sopenharmony_ci IMMED_WIDTH_ALL = 0, 12562306a36Sopenharmony_ci IMMED_WIDTH_BYTE = 1, 12662306a36Sopenharmony_ci IMMED_WIDTH_WORD = 2, 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cienum immed_shift { 13062306a36Sopenharmony_ci IMMED_SHIFT_0B = 0, 13162306a36Sopenharmony_ci IMMED_SHIFT_1B = 1, 13262306a36Sopenharmony_ci IMMED_SHIFT_2B = 2, 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciu16 immed_get_value(u64 instr); 13662306a36Sopenharmony_civoid immed_set_value(u64 *instr, u16 immed); 13762306a36Sopenharmony_civoid immed_add_value(u64 *instr, u16 offset); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define OP_SHF_BASE 0x08000000000ULL 14062306a36Sopenharmony_ci#define OP_SHF_A_SRC 0x000000000ffULL 14162306a36Sopenharmony_ci#define OP_SHF_SC 0x00000000300ULL 14262306a36Sopenharmony_ci#define OP_SHF_B_SRC 0x0000003fc00ULL 14362306a36Sopenharmony_ci#define OP_SHF_I8 0x00000040000ULL 14462306a36Sopenharmony_ci#define OP_SHF_SW 0x00000080000ULL 14562306a36Sopenharmony_ci#define OP_SHF_DST 0x0000ff00000ULL 14662306a36Sopenharmony_ci#define OP_SHF_SHIFT 0x001f0000000ULL 14762306a36Sopenharmony_ci#define OP_SHF_OP 0x00e00000000ULL 14862306a36Sopenharmony_ci#define OP_SHF_DST_AB 0x01000000000ULL 14962306a36Sopenharmony_ci#define OP_SHF_WR_AB 0x20000000000ULL 15062306a36Sopenharmony_ci#define OP_SHF_SRC_LMEXTN 0x40000000000ULL 15162306a36Sopenharmony_ci#define OP_SHF_DST_LMEXTN 0x80000000000ULL 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cienum shf_op { 15462306a36Sopenharmony_ci SHF_OP_NONE = 0, 15562306a36Sopenharmony_ci SHF_OP_AND = 2, 15662306a36Sopenharmony_ci SHF_OP_OR = 5, 15762306a36Sopenharmony_ci SHF_OP_ASHR = 6, 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cienum shf_sc { 16162306a36Sopenharmony_ci SHF_SC_R_ROT = 0, 16262306a36Sopenharmony_ci SHF_SC_NONE = SHF_SC_R_ROT, 16362306a36Sopenharmony_ci SHF_SC_R_SHF = 1, 16462306a36Sopenharmony_ci SHF_SC_L_SHF = 2, 16562306a36Sopenharmony_ci SHF_SC_R_DSHF = 3, 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#define OP_ALU_A_SRC 0x000000003ffULL 16962306a36Sopenharmony_ci#define OP_ALU_B_SRC 0x000000ffc00ULL 17062306a36Sopenharmony_ci#define OP_ALU_DST 0x0003ff00000ULL 17162306a36Sopenharmony_ci#define OP_ALU_SW 0x00040000000ULL 17262306a36Sopenharmony_ci#define OP_ALU_OP 0x00f80000000ULL 17362306a36Sopenharmony_ci#define OP_ALU_DST_AB 0x01000000000ULL 17462306a36Sopenharmony_ci#define OP_ALU_BASE 0x0a000000000ULL 17562306a36Sopenharmony_ci#define OP_ALU_WR_AB 0x20000000000ULL 17662306a36Sopenharmony_ci#define OP_ALU_SRC_LMEXTN 0x40000000000ULL 17762306a36Sopenharmony_ci#define OP_ALU_DST_LMEXTN 0x80000000000ULL 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cienum alu_op { 18062306a36Sopenharmony_ci ALU_OP_NONE = 0x00, 18162306a36Sopenharmony_ci ALU_OP_ADD = 0x01, 18262306a36Sopenharmony_ci ALU_OP_NOT = 0x04, 18362306a36Sopenharmony_ci ALU_OP_ADD_2B = 0x05, 18462306a36Sopenharmony_ci ALU_OP_AND = 0x08, 18562306a36Sopenharmony_ci ALU_OP_AND_NOT_A = 0x0c, 18662306a36Sopenharmony_ci ALU_OP_SUB_C = 0x0d, 18762306a36Sopenharmony_ci ALU_OP_AND_NOT_B = 0x10, 18862306a36Sopenharmony_ci ALU_OP_ADD_C = 0x11, 18962306a36Sopenharmony_ci ALU_OP_OR = 0x14, 19062306a36Sopenharmony_ci ALU_OP_SUB = 0x15, 19162306a36Sopenharmony_ci ALU_OP_XOR = 0x18, 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cienum alu_dst_ab { 19562306a36Sopenharmony_ci ALU_DST_A = 0, 19662306a36Sopenharmony_ci ALU_DST_B = 1, 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci#define OP_LDF_BASE 0x0c000000000ULL 20062306a36Sopenharmony_ci#define OP_LDF_A_SRC 0x000000000ffULL 20162306a36Sopenharmony_ci#define OP_LDF_SC 0x00000000300ULL 20262306a36Sopenharmony_ci#define OP_LDF_B_SRC 0x0000003fc00ULL 20362306a36Sopenharmony_ci#define OP_LDF_I8 0x00000040000ULL 20462306a36Sopenharmony_ci#define OP_LDF_SW 0x00000080000ULL 20562306a36Sopenharmony_ci#define OP_LDF_ZF 0x00000100000ULL 20662306a36Sopenharmony_ci#define OP_LDF_BMASK 0x0000f000000ULL 20762306a36Sopenharmony_ci#define OP_LDF_SHF 0x001f0000000ULL 20862306a36Sopenharmony_ci#define OP_LDF_WR_AB 0x20000000000ULL 20962306a36Sopenharmony_ci#define OP_LDF_SRC_LMEXTN 0x40000000000ULL 21062306a36Sopenharmony_ci#define OP_LDF_DST_LMEXTN 0x80000000000ULL 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#define OP_CMD_A_SRC 0x000000000ffULL 21362306a36Sopenharmony_ci#define OP_CMD_CTX 0x00000000300ULL 21462306a36Sopenharmony_ci#define OP_CMD_B_SRC 0x0000003fc00ULL 21562306a36Sopenharmony_ci#define OP_CMD_TOKEN 0x000000c0000ULL 21662306a36Sopenharmony_ci#define OP_CMD_XFER 0x00001f00000ULL 21762306a36Sopenharmony_ci#define OP_CMD_CNT 0x0000e000000ULL 21862306a36Sopenharmony_ci#define OP_CMD_SIG 0x000f0000000ULL 21962306a36Sopenharmony_ci#define OP_CMD_TGT_CMD 0x07f00000000ULL 22062306a36Sopenharmony_ci#define OP_CMD_INDIR 0x20000000000ULL 22162306a36Sopenharmony_ci#define OP_CMD_MODE 0x1c0000000000ULL 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistruct cmd_tgt_act { 22462306a36Sopenharmony_ci u8 token; 22562306a36Sopenharmony_ci u8 tgt_cmd; 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cienum cmd_tgt_map { 22962306a36Sopenharmony_ci CMD_TGT_READ8, 23062306a36Sopenharmony_ci CMD_TGT_WRITE8_SWAP, 23162306a36Sopenharmony_ci CMD_TGT_WRITE32_SWAP, 23262306a36Sopenharmony_ci CMD_TGT_READ32, 23362306a36Sopenharmony_ci CMD_TGT_READ32_LE, 23462306a36Sopenharmony_ci CMD_TGT_READ32_SWAP, 23562306a36Sopenharmony_ci CMD_TGT_READ_LE, 23662306a36Sopenharmony_ci CMD_TGT_READ_SWAP_LE, 23762306a36Sopenharmony_ci CMD_TGT_ADD, 23862306a36Sopenharmony_ci CMD_TGT_ADD_IMM, 23962306a36Sopenharmony_ci __CMD_TGT_MAP_SIZE, 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ciextern const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE]; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cienum cmd_mode { 24562306a36Sopenharmony_ci CMD_MODE_40b_AB = 0, 24662306a36Sopenharmony_ci CMD_MODE_40b_BA = 1, 24762306a36Sopenharmony_ci CMD_MODE_32b = 4, 24862306a36Sopenharmony_ci}; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cienum cmd_ctx_swap { 25162306a36Sopenharmony_ci CMD_CTX_SWAP = 0, 25262306a36Sopenharmony_ci CMD_CTX_SWAP_DEFER1 = 1, 25362306a36Sopenharmony_ci CMD_CTX_SWAP_DEFER2 = 2, 25462306a36Sopenharmony_ci CMD_CTX_NO_SWAP = 3, 25562306a36Sopenharmony_ci}; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#define CMD_OVE_DATA GENMASK(5, 3) 25862306a36Sopenharmony_ci#define CMD_OVE_LEN BIT(7) 25962306a36Sopenharmony_ci#define CMD_OV_LEN GENMASK(12, 8) 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci#define OP_LCSR_BASE 0x0fc00000000ULL 26262306a36Sopenharmony_ci#define OP_LCSR_A_SRC 0x000000003ffULL 26362306a36Sopenharmony_ci#define OP_LCSR_B_SRC 0x000000ffc00ULL 26462306a36Sopenharmony_ci#define OP_LCSR_WRITE 0x00000200000ULL 26562306a36Sopenharmony_ci#define OP_LCSR_ADDR 0x001ffc00000ULL 26662306a36Sopenharmony_ci#define OP_LCSR_SRC_LMEXTN 0x40000000000ULL 26762306a36Sopenharmony_ci#define OP_LCSR_DST_LMEXTN 0x80000000000ULL 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_cienum lcsr_wr_src { 27062306a36Sopenharmony_ci LCSR_WR_AREG, 27162306a36Sopenharmony_ci LCSR_WR_BREG, 27262306a36Sopenharmony_ci LCSR_WR_IMM, 27362306a36Sopenharmony_ci}; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci#define OP_CARB_BASE 0x0e000000000ULL 27662306a36Sopenharmony_ci#define OP_CARB_OR 0x00000010000ULL 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci#define NFP_CSR_CTX_PTR 0x20 27962306a36Sopenharmony_ci#define NFP_CSR_ACT_LM_ADDR0 0x64 28062306a36Sopenharmony_ci#define NFP_CSR_ACT_LM_ADDR1 0x6c 28162306a36Sopenharmony_ci#define NFP_CSR_ACT_LM_ADDR2 0x94 28262306a36Sopenharmony_ci#define NFP_CSR_ACT_LM_ADDR3 0x9c 28362306a36Sopenharmony_ci#define NFP_CSR_PSEUDO_RND_NUM 0x148 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci/* Software register representation, independent of operand type */ 28662306a36Sopenharmony_ci#define NN_REG_TYPE GENMASK(31, 24) 28762306a36Sopenharmony_ci#define NN_REG_LM_IDX GENMASK(23, 22) 28862306a36Sopenharmony_ci#define NN_REG_LM_IDX_HI BIT(23) 28962306a36Sopenharmony_ci#define NN_REG_LM_IDX_LO BIT(22) 29062306a36Sopenharmony_ci#define NN_REG_LM_MOD GENMASK(21, 20) 29162306a36Sopenharmony_ci#define NN_REG_VAL GENMASK(7, 0) 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cienum nfp_bpf_reg_type { 29462306a36Sopenharmony_ci NN_REG_GPR_A = BIT(0), 29562306a36Sopenharmony_ci NN_REG_GPR_B = BIT(1), 29662306a36Sopenharmony_ci NN_REG_GPR_BOTH = NN_REG_GPR_A | NN_REG_GPR_B, 29762306a36Sopenharmony_ci NN_REG_NNR = BIT(2), 29862306a36Sopenharmony_ci NN_REG_XFER = BIT(3), 29962306a36Sopenharmony_ci NN_REG_IMM = BIT(4), 30062306a36Sopenharmony_ci NN_REG_NONE = BIT(5), 30162306a36Sopenharmony_ci NN_REG_LMEM = BIT(6), 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cienum nfp_bpf_lm_mode { 30562306a36Sopenharmony_ci NN_LM_MOD_NONE = 0, 30662306a36Sopenharmony_ci NN_LM_MOD_INC, 30762306a36Sopenharmony_ci NN_LM_MOD_DEC, 30862306a36Sopenharmony_ci}; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#define reg_both(x) __enc_swreg((x), NN_REG_GPR_BOTH) 31162306a36Sopenharmony_ci#define reg_a(x) __enc_swreg((x), NN_REG_GPR_A) 31262306a36Sopenharmony_ci#define reg_b(x) __enc_swreg((x), NN_REG_GPR_B) 31362306a36Sopenharmony_ci#define reg_nnr(x) __enc_swreg((x), NN_REG_NNR) 31462306a36Sopenharmony_ci#define reg_xfer(x) __enc_swreg((x), NN_REG_XFER) 31562306a36Sopenharmony_ci#define reg_imm(x) __enc_swreg((x), NN_REG_IMM) 31662306a36Sopenharmony_ci#define reg_none() __enc_swreg(0, NN_REG_NONE) 31762306a36Sopenharmony_ci#define reg_lm(x, off) __enc_swreg_lm((x), NN_LM_MOD_NONE, (off)) 31862306a36Sopenharmony_ci#define reg_lm_inc(x) __enc_swreg_lm((x), NN_LM_MOD_INC, 0) 31962306a36Sopenharmony_ci#define reg_lm_dec(x) __enc_swreg_lm((x), NN_LM_MOD_DEC, 0) 32062306a36Sopenharmony_ci#define __reg_lm(x, mod, off) __enc_swreg_lm((x), (mod), (off)) 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_citypedef __u32 __bitwise swreg; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic inline swreg __enc_swreg(u16 id, u8 type) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci return (__force swreg)(id | FIELD_PREP(NN_REG_TYPE, type)); 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic inline swreg __enc_swreg_lm(u8 id, enum nfp_bpf_lm_mode mode, u8 off) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci WARN_ON(id > 3 || (off && mode != NN_LM_MOD_NONE)); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci return (__force swreg)(FIELD_PREP(NN_REG_TYPE, NN_REG_LMEM) | 33462306a36Sopenharmony_ci FIELD_PREP(NN_REG_LM_IDX, id) | 33562306a36Sopenharmony_ci FIELD_PREP(NN_REG_LM_MOD, mode) | 33662306a36Sopenharmony_ci off); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic inline u32 swreg_raw(swreg reg) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci return (__force u32)reg; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic inline enum nfp_bpf_reg_type swreg_type(swreg reg) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci return FIELD_GET(NN_REG_TYPE, swreg_raw(reg)); 34762306a36Sopenharmony_ci} 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistatic inline u16 swreg_value(swreg reg) 35062306a36Sopenharmony_ci{ 35162306a36Sopenharmony_ci return FIELD_GET(NN_REG_VAL, swreg_raw(reg)); 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic inline bool swreg_lm_idx(swreg reg) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci return FIELD_GET(NN_REG_LM_IDX_LO, swreg_raw(reg)); 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistatic inline bool swreg_lmextn(swreg reg) 36062306a36Sopenharmony_ci{ 36162306a36Sopenharmony_ci return FIELD_GET(NN_REG_LM_IDX_HI, swreg_raw(reg)); 36262306a36Sopenharmony_ci} 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic inline enum nfp_bpf_lm_mode swreg_lm_mode(swreg reg) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci return FIELD_GET(NN_REG_LM_MOD, swreg_raw(reg)); 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct nfp_insn_ur_regs { 37062306a36Sopenharmony_ci enum alu_dst_ab dst_ab; 37162306a36Sopenharmony_ci u16 dst; 37262306a36Sopenharmony_ci u16 areg, breg; 37362306a36Sopenharmony_ci bool swap; 37462306a36Sopenharmony_ci bool wr_both; 37562306a36Sopenharmony_ci bool dst_lmextn; 37662306a36Sopenharmony_ci bool src_lmextn; 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistruct nfp_insn_re_regs { 38062306a36Sopenharmony_ci enum alu_dst_ab dst_ab; 38162306a36Sopenharmony_ci u8 dst; 38262306a36Sopenharmony_ci u8 areg, breg; 38362306a36Sopenharmony_ci bool swap; 38462306a36Sopenharmony_ci bool wr_both; 38562306a36Sopenharmony_ci bool i8; 38662306a36Sopenharmony_ci bool dst_lmextn; 38762306a36Sopenharmony_ci bool src_lmextn; 38862306a36Sopenharmony_ci}; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ciint swreg_to_unrestricted(swreg dst, swreg lreg, swreg rreg, 39162306a36Sopenharmony_ci struct nfp_insn_ur_regs *reg); 39262306a36Sopenharmony_ciint swreg_to_restricted(swreg dst, swreg lreg, swreg rreg, 39362306a36Sopenharmony_ci struct nfp_insn_re_regs *reg, bool has_imm8); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci#define NFP_USTORE_PREFETCH_WINDOW 8 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ciint nfp_ustore_check_valid_no_ecc(u64 insn); 39862306a36Sopenharmony_ciu64 nfp_ustore_calc_ecc_insn(u64 insn); 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci#define NFP_IND_ME_REFL_WR_SIG_INIT 3 40162306a36Sopenharmony_ci#define NFP_IND_ME_CTX_PTR_BASE_MASK GENMASK(9, 0) 40262306a36Sopenharmony_ci#define NFP_IND_NUM_CONTEXTS 8 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic inline u32 nfp_get_ind_csr_ctx_ptr_offs(u32 read_offset) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci return (read_offset & ~NFP_IND_ME_CTX_PTR_BASE_MASK) | NFP_CSR_CTX_PTR; 40762306a36Sopenharmony_ci} 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cienum mul_type { 41062306a36Sopenharmony_ci MUL_TYPE_START = 0x00, 41162306a36Sopenharmony_ci MUL_TYPE_STEP_24x8 = 0x01, 41262306a36Sopenharmony_ci MUL_TYPE_STEP_16x16 = 0x02, 41362306a36Sopenharmony_ci MUL_TYPE_STEP_32x32 = 0x03, 41462306a36Sopenharmony_ci}; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_cienum mul_step { 41762306a36Sopenharmony_ci MUL_STEP_1 = 0x00, 41862306a36Sopenharmony_ci MUL_STEP_NONE = MUL_STEP_1, 41962306a36Sopenharmony_ci MUL_STEP_2 = 0x01, 42062306a36Sopenharmony_ci MUL_STEP_3 = 0x02, 42162306a36Sopenharmony_ci MUL_STEP_4 = 0x03, 42262306a36Sopenharmony_ci MUL_LAST = 0x04, 42362306a36Sopenharmony_ci MUL_LAST_2 = 0x05, 42462306a36Sopenharmony_ci}; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci#define OP_MUL_BASE 0x0f800000000ULL 42762306a36Sopenharmony_ci#define OP_MUL_A_SRC 0x000000003ffULL 42862306a36Sopenharmony_ci#define OP_MUL_B_SRC 0x000000ffc00ULL 42962306a36Sopenharmony_ci#define OP_MUL_STEP 0x00000700000ULL 43062306a36Sopenharmony_ci#define OP_MUL_DST_AB 0x00000800000ULL 43162306a36Sopenharmony_ci#define OP_MUL_SW 0x00040000000ULL 43262306a36Sopenharmony_ci#define OP_MUL_TYPE 0x00180000000ULL 43362306a36Sopenharmony_ci#define OP_MUL_WR_AB 0x20000000000ULL 43462306a36Sopenharmony_ci#define OP_MUL_SRC_LMEXTN 0x40000000000ULL 43562306a36Sopenharmony_ci#define OP_MUL_DST_LMEXTN 0x80000000000ULL 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci#endif 438