162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _MLXSW_PCI_HW_H 562306a36Sopenharmony_ci#define _MLXSW_PCI_HW_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/bitops.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "item.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define MLXSW_PCI_BAR0_SIZE (1024 * 1024) /* 1MB */ 1262306a36Sopenharmony_ci#define MLXSW_PCI_PAGE_SIZE 4096 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define MLXSW_PCI_CIR_BASE 0x71000 1562306a36Sopenharmony_ci#define MLXSW_PCI_CIR_IN_PARAM_HI MLXSW_PCI_CIR_BASE 1662306a36Sopenharmony_ci#define MLXSW_PCI_CIR_IN_PARAM_LO (MLXSW_PCI_CIR_BASE + 0x04) 1762306a36Sopenharmony_ci#define MLXSW_PCI_CIR_IN_MODIFIER (MLXSW_PCI_CIR_BASE + 0x08) 1862306a36Sopenharmony_ci#define MLXSW_PCI_CIR_OUT_PARAM_HI (MLXSW_PCI_CIR_BASE + 0x0C) 1962306a36Sopenharmony_ci#define MLXSW_PCI_CIR_OUT_PARAM_LO (MLXSW_PCI_CIR_BASE + 0x10) 2062306a36Sopenharmony_ci#define MLXSW_PCI_CIR_TOKEN (MLXSW_PCI_CIR_BASE + 0x14) 2162306a36Sopenharmony_ci#define MLXSW_PCI_CIR_CTRL (MLXSW_PCI_CIR_BASE + 0x18) 2262306a36Sopenharmony_ci#define MLXSW_PCI_CIR_CTRL_GO_BIT BIT(23) 2362306a36Sopenharmony_ci#define MLXSW_PCI_CIR_CTRL_EVREQ_BIT BIT(22) 2462306a36Sopenharmony_ci#define MLXSW_PCI_CIR_CTRL_OPCODE_MOD_SHIFT 12 2562306a36Sopenharmony_ci#define MLXSW_PCI_CIR_CTRL_STATUS_SHIFT 24 2662306a36Sopenharmony_ci#define MLXSW_PCI_CIR_TIMEOUT_MSECS 1000 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS 900000 2962306a36Sopenharmony_ci#define MLXSW_PCI_SW_RESET_WAIT_MSECS 400 3062306a36Sopenharmony_ci#define MLXSW_PCI_FW_READY 0xA1844 3162306a36Sopenharmony_ci#define MLXSW_PCI_FW_READY_MASK 0xFFFF 3262306a36Sopenharmony_ci#define MLXSW_PCI_FW_READY_MAGIC 0x5E 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_SDQ_OFFSET 0x000 3562306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_RDQ_OFFSET 0x200 3662306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_CQ_OFFSET 0x400 3762306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_EQ_OFFSET 0x600 3862306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_ARM_CQ_OFFSET 0x800 3962306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL_ARM_EQ_OFFSET 0xA00 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define MLXSW_PCI_DOORBELL(offset, type_offset, num) \ 4262306a36Sopenharmony_ci ((offset) + (type_offset) + (num) * 4) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define MLXSW_PCI_CQS_MAX 96 4562306a36Sopenharmony_ci#define MLXSW_PCI_EQS_COUNT 2 4662306a36Sopenharmony_ci#define MLXSW_PCI_EQ_ASYNC_NUM 0 4762306a36Sopenharmony_ci#define MLXSW_PCI_EQ_COMP_NUM 1 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define MLXSW_PCI_SDQS_MIN 2 /* EMAD and control traffic */ 5062306a36Sopenharmony_ci#define MLXSW_PCI_SDQ_EMAD_INDEX 0 5162306a36Sopenharmony_ci#define MLXSW_PCI_SDQ_EMAD_TC 0 5262306a36Sopenharmony_ci#define MLXSW_PCI_SDQ_CTL_TC 3 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define MLXSW_PCI_AQ_PAGES 8 5562306a36Sopenharmony_ci#define MLXSW_PCI_AQ_SIZE (MLXSW_PCI_PAGE_SIZE * MLXSW_PCI_AQ_PAGES) 5662306a36Sopenharmony_ci#define MLXSW_PCI_WQE_SIZE 32 /* 32 bytes per element */ 5762306a36Sopenharmony_ci#define MLXSW_PCI_CQE01_SIZE 16 /* 16 bytes per element */ 5862306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_SIZE 32 /* 32 bytes per element */ 5962306a36Sopenharmony_ci#define MLXSW_PCI_CQE_SIZE_MAX MLXSW_PCI_CQE2_SIZE 6062306a36Sopenharmony_ci#define MLXSW_PCI_EQE_SIZE 16 /* 16 bytes per element */ 6162306a36Sopenharmony_ci#define MLXSW_PCI_WQE_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_WQE_SIZE) 6262306a36Sopenharmony_ci#define MLXSW_PCI_CQE01_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_CQE01_SIZE) 6362306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_CQE2_SIZE) 6462306a36Sopenharmony_ci#define MLXSW_PCI_EQE_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_EQE_SIZE) 6562306a36Sopenharmony_ci#define MLXSW_PCI_EQE_UPDATE_COUNT 0x80 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#define MLXSW_PCI_WQE_SG_ENTRIES 3 6862306a36Sopenharmony_ci#define MLXSW_PCI_WQE_TYPE_ETHERNET 0xA 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* pci_wqe_c 7162306a36Sopenharmony_ci * If set it indicates that a completion should be reported upon 7262306a36Sopenharmony_ci * execution of this descriptor. 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ciMLXSW_ITEM32(pci, wqe, c, 0x00, 31, 1); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* pci_wqe_lp 7762306a36Sopenharmony_ci * Local Processing, set if packet should be processed by the local 7862306a36Sopenharmony_ci * switch hardware: 7962306a36Sopenharmony_ci * For Ethernet EMAD (Direct Route and non Direct Route) - 8062306a36Sopenharmony_ci * must be set if packet destination is local device 8162306a36Sopenharmony_ci * For InfiniBand CTL - must be set if packet destination is local device 8262306a36Sopenharmony_ci * Otherwise it must be clear 8362306a36Sopenharmony_ci * Local Process packets must not exceed the size of 2K (including payload 8462306a36Sopenharmony_ci * and headers). 8562306a36Sopenharmony_ci */ 8662306a36Sopenharmony_ciMLXSW_ITEM32(pci, wqe, lp, 0x00, 30, 1); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* pci_wqe_type 8962306a36Sopenharmony_ci * Packet type. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_ciMLXSW_ITEM32(pci, wqe, type, 0x00, 23, 4); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* pci_wqe_byte_count 9462306a36Sopenharmony_ci * Size of i-th scatter/gather entry, 0 if entry is unused. 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_ciMLXSW_ITEM16_INDEXED(pci, wqe, byte_count, 0x02, 0, 14, 0x02, 0x00, false); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* pci_wqe_address 9962306a36Sopenharmony_ci * Physical address of i-th scatter/gather entry. 10062306a36Sopenharmony_ci * Gather Entries must be 2Byte aligned. 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_ciMLXSW_ITEM64_INDEXED(pci, wqe, address, 0x08, 0, 64, 0x8, 0x0, false); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cienum mlxsw_pci_cqe_v { 10562306a36Sopenharmony_ci MLXSW_PCI_CQE_V0, 10662306a36Sopenharmony_ci MLXSW_PCI_CQE_V1, 10762306a36Sopenharmony_ci MLXSW_PCI_CQE_V2, 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define mlxsw_pci_cqe_item_helpers(name, v0, v1, v2) \ 11162306a36Sopenharmony_cistatic inline u32 mlxsw_pci_cqe_##name##_get(enum mlxsw_pci_cqe_v v, char *cqe) \ 11262306a36Sopenharmony_ci{ \ 11362306a36Sopenharmony_ci switch (v) { \ 11462306a36Sopenharmony_ci default: \ 11562306a36Sopenharmony_ci case MLXSW_PCI_CQE_V0: \ 11662306a36Sopenharmony_ci return mlxsw_pci_cqe##v0##_##name##_get(cqe); \ 11762306a36Sopenharmony_ci case MLXSW_PCI_CQE_V1: \ 11862306a36Sopenharmony_ci return mlxsw_pci_cqe##v1##_##name##_get(cqe); \ 11962306a36Sopenharmony_ci case MLXSW_PCI_CQE_V2: \ 12062306a36Sopenharmony_ci return mlxsw_pci_cqe##v2##_##name##_get(cqe); \ 12162306a36Sopenharmony_ci } \ 12262306a36Sopenharmony_ci} \ 12362306a36Sopenharmony_cistatic inline void mlxsw_pci_cqe_##name##_set(enum mlxsw_pci_cqe_v v, \ 12462306a36Sopenharmony_ci char *cqe, u32 val) \ 12562306a36Sopenharmony_ci{ \ 12662306a36Sopenharmony_ci switch (v) { \ 12762306a36Sopenharmony_ci default: \ 12862306a36Sopenharmony_ci case MLXSW_PCI_CQE_V0: \ 12962306a36Sopenharmony_ci mlxsw_pci_cqe##v0##_##name##_set(cqe, val); \ 13062306a36Sopenharmony_ci break; \ 13162306a36Sopenharmony_ci case MLXSW_PCI_CQE_V1: \ 13262306a36Sopenharmony_ci mlxsw_pci_cqe##v1##_##name##_set(cqe, val); \ 13362306a36Sopenharmony_ci break; \ 13462306a36Sopenharmony_ci case MLXSW_PCI_CQE_V2: \ 13562306a36Sopenharmony_ci mlxsw_pci_cqe##v2##_##name##_set(cqe, val); \ 13662306a36Sopenharmony_ci break; \ 13762306a36Sopenharmony_ci } \ 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* pci_cqe_lag 14162306a36Sopenharmony_ci * Packet arrives from a port which is a LAG 14262306a36Sopenharmony_ci */ 14362306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, lag, 0x00, 23, 1); 14462306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, lag, 0x00, 24, 1); 14562306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(lag, 0, 12, 12); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* pci_cqe_system_port/lag_id 14862306a36Sopenharmony_ci * When lag=0: System port on which the packet was received 14962306a36Sopenharmony_ci * When lag=1: 15062306a36Sopenharmony_ci * bits [15:4] LAG ID on which the packet was received 15162306a36Sopenharmony_ci * bits [3:0] sub_port on which the packet was received 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe, system_port, 0x00, 0, 16); 15462306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, lag_id, 0x00, 4, 12); 15562306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, lag_id, 0x00, 0, 16); 15662306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(lag_id, 0, 12, 12); 15762306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, lag_subport, 0x00, 0, 4); 15862306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, lag_subport, 0x00, 16, 8); 15962306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(lag_subport, 0, 12, 12); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* pci_cqe_wqe_counter 16262306a36Sopenharmony_ci * WQE count of the WQEs completed on the associated dqn 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe, wqe_counter, 0x04, 16, 16); 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci/* pci_cqe_byte_count 16762306a36Sopenharmony_ci * Byte count of received packets including additional two 16862306a36Sopenharmony_ci * Reserved Bytes that are append to the end of the frame. 16962306a36Sopenharmony_ci * Reserved for Send CQE. 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe, byte_count, 0x04, 0, 14); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_MIRROR_CONG_INVALID 0xFFFF 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/* pci_cqe_mirror_cong_high 17662306a36Sopenharmony_ci * Congestion level in units of 8KB of the egress traffic class of the original 17762306a36Sopenharmony_ci * packet that does mirroring to the CPU. Value of 0xFFFF means that the 17862306a36Sopenharmony_ci * congestion level is invalid. 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, mirror_cong_high, 0x08, 16, 4); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* pci_cqe_trap_id 18362306a36Sopenharmony_ci * Trap ID that captured the packet. 18462306a36Sopenharmony_ci */ 18562306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe, trap_id, 0x08, 0, 10); 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* pci_cqe_crc 18862306a36Sopenharmony_ci * Length include CRC. Indicates the length field includes 18962306a36Sopenharmony_ci * the packet's CRC. 19062306a36Sopenharmony_ci */ 19162306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, crc, 0x0C, 8, 1); 19262306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, crc, 0x0C, 9, 1); 19362306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(crc, 0, 12, 12); 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* pci_cqe_e 19662306a36Sopenharmony_ci * CQE with Error. 19762306a36Sopenharmony_ci */ 19862306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, e, 0x0C, 7, 1); 19962306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, e, 0x00, 27, 1); 20062306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(e, 0, 12, 12); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* pci_cqe_sr 20362306a36Sopenharmony_ci * 1 - Send Queue 20462306a36Sopenharmony_ci * 0 - Receive Queue 20562306a36Sopenharmony_ci */ 20662306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, sr, 0x0C, 6, 1); 20762306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, sr, 0x00, 26, 1); 20862306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(sr, 0, 12, 12); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* pci_cqe_dqn 21162306a36Sopenharmony_ci * Descriptor Queue (DQ) Number. 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe0, dqn, 0x0C, 1, 5); 21462306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe12, dqn, 0x0C, 1, 6); 21562306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(dqn, 0, 12, 12); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/* pci_cqe_time_stamp_low 21862306a36Sopenharmony_ci * Time stamp of the CQE 21962306a36Sopenharmony_ci * Format according to time_stamp_type: 22062306a36Sopenharmony_ci * 0: uSec - 1.024uSec (default for devices which do not support 22162306a36Sopenharmony_ci * time_stamp_type). Only bits 15:0 are valid 22262306a36Sopenharmony_ci * 1: FRC - Free Running Clock - units of 1nSec 22362306a36Sopenharmony_ci * 2: UTC - time_stamp[37:30] = Sec 22462306a36Sopenharmony_ci * - time_stamp[29:0] = nSec 22562306a36Sopenharmony_ci * 3: Mirror_UTC. UTC time stamp of the original packet that has 22662306a36Sopenharmony_ci * MIRROR_SESSION traps 22762306a36Sopenharmony_ci * - time_stamp[37:30] = Sec 22862306a36Sopenharmony_ci * - time_stamp[29:0] = nSec 22962306a36Sopenharmony_ci * Formats 0..2 are configured by 23062306a36Sopenharmony_ci * CONFIG_PROFILE.cqe_time_stamp_type for PTP traps 23162306a36Sopenharmony_ci * Format 3 is used for MIRROR_SESSION traps 23262306a36Sopenharmony_ci * Note that Spectrum does not reveal FRC, UTC and Mirror_UTC 23362306a36Sopenharmony_ci */ 23462306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, time_stamp_low, 0x0C, 16, 16); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_MIRROR_TCLASS_INVALID 0x1F 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* pci_cqe_mirror_tclass 23962306a36Sopenharmony_ci * The egress traffic class of the original packet that does mirroring to the 24062306a36Sopenharmony_ci * CPU. Value of 0x1F means that the traffic class is invalid. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, mirror_tclass, 0x10, 27, 5); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci/* pci_cqe_tx_lag 24562306a36Sopenharmony_ci * The Tx port of a packet that is mirrored / sampled to the CPU is a LAG. 24662306a36Sopenharmony_ci */ 24762306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, tx_lag, 0x10, 24, 1); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci/* pci_cqe_tx_lag_subport 25062306a36Sopenharmony_ci * The port index within the LAG of a packet that is mirrored / sampled to the 25162306a36Sopenharmony_ci * CPU. Reserved when tx_lag is 0. 25262306a36Sopenharmony_ci */ 25362306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, tx_lag_subport, 0x10, 16, 8); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_TX_PORT_MULTI_PORT 0xFFFE 25662306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_TX_PORT_INVALID 0xFFFF 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/* pci_cqe_tx_lag_id 25962306a36Sopenharmony_ci * The Tx LAG ID of the original packet that is mirrored / sampled to the CPU. 26062306a36Sopenharmony_ci * Value of 0xFFFE means multi-port. Value fo 0xFFFF means that the Tx LAG ID 26162306a36Sopenharmony_ci * is invalid. Reserved when tx_lag is 0. 26262306a36Sopenharmony_ci */ 26362306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, tx_lag_id, 0x10, 0, 16); 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci/* pci_cqe_tx_system_port 26662306a36Sopenharmony_ci * The Tx port of the original packet that is mirrored / sampled to the CPU. 26762306a36Sopenharmony_ci * Value of 0xFFFE means multi-port. Value fo 0xFFFF means that the Tx port is 26862306a36Sopenharmony_ci * invalid. Reserved when tx_lag is 1. 26962306a36Sopenharmony_ci */ 27062306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, tx_system_port, 0x10, 0, 16); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/* pci_cqe_mirror_cong_low 27362306a36Sopenharmony_ci * Congestion level in units of 8KB of the egress traffic class of the original 27462306a36Sopenharmony_ci * packet that does mirroring to the CPU. Value of 0xFFFF means that the 27562306a36Sopenharmony_ci * congestion level is invalid. 27662306a36Sopenharmony_ci */ 27762306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, mirror_cong_low, 0x14, 20, 12); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_MIRROR_CONG_SHIFT 13 /* Units of 8KB. */ 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cistatic inline u16 mlxsw_pci_cqe2_mirror_cong_get(const char *cqe) 28262306a36Sopenharmony_ci{ 28362306a36Sopenharmony_ci u16 cong_high = mlxsw_pci_cqe2_mirror_cong_high_get(cqe); 28462306a36Sopenharmony_ci u16 cong_low = mlxsw_pci_cqe2_mirror_cong_low_get(cqe); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci return cong_high << 12 | cong_low; 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci/* pci_cqe_user_def_val_orig_pkt_len 29062306a36Sopenharmony_ci * When trap_id is an ACL: User defined value from policy engine action. 29162306a36Sopenharmony_ci */ 29262306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, user_def_val_orig_pkt_len, 0x14, 0, 20); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/* pci_cqe_mirror_reason 29562306a36Sopenharmony_ci * Mirror reason. 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, mirror_reason, 0x18, 24, 8); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cienum mlxsw_pci_cqe_time_stamp_type { 30062306a36Sopenharmony_ci MLXSW_PCI_CQE_TIME_STAMP_TYPE_USEC, 30162306a36Sopenharmony_ci MLXSW_PCI_CQE_TIME_STAMP_TYPE_FRC, 30262306a36Sopenharmony_ci MLXSW_PCI_CQE_TIME_STAMP_TYPE_UTC, 30362306a36Sopenharmony_ci MLXSW_PCI_CQE_TIME_STAMP_TYPE_MIRROR_UTC, 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/* pci_cqe_time_stamp_type 30762306a36Sopenharmony_ci * Time stamp type: 30862306a36Sopenharmony_ci * 0: uSec - 1.024uSec (default for devices which do not support 30962306a36Sopenharmony_ci * time_stamp_type) 31062306a36Sopenharmony_ci * 1: FRC - Free Running Clock - units of 1nSec 31162306a36Sopenharmony_ci * 2: UTC 31262306a36Sopenharmony_ci * 3: Mirror_UTC. UTC time stamp of the original packet that has 31362306a36Sopenharmony_ci * MIRROR_SESSION traps 31462306a36Sopenharmony_ci */ 31562306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, time_stamp_type, 0x18, 22, 2); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci#define MLXSW_PCI_CQE2_MIRROR_LATENCY_INVALID 0xFFFFFF 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci/* pci_cqe_time_stamp_high 32062306a36Sopenharmony_ci * Time stamp of the CQE 32162306a36Sopenharmony_ci * Format according to time_stamp_type: 32262306a36Sopenharmony_ci * 0: uSec - 1.024uSec (default for devices which do not support 32362306a36Sopenharmony_ci * time_stamp_type). Only bits 15:0 are valid 32462306a36Sopenharmony_ci * 1: FRC - Free Running Clock - units of 1nSec 32562306a36Sopenharmony_ci * 2: UTC - time_stamp[37:30] = Sec 32662306a36Sopenharmony_ci * - time_stamp[29:0] = nSec 32762306a36Sopenharmony_ci * 3: Mirror_UTC. UTC time stamp of the original packet that has 32862306a36Sopenharmony_ci * MIRROR_SESSION traps 32962306a36Sopenharmony_ci * - time_stamp[37:30] = Sec 33062306a36Sopenharmony_ci * - time_stamp[29:0] = nSec 33162306a36Sopenharmony_ci * Formats 0..2 are configured by 33262306a36Sopenharmony_ci * CONFIG_PROFILE.cqe_time_stamp_type for PTP traps 33362306a36Sopenharmony_ci * Format 3 is used for MIRROR_SESSION traps 33462306a36Sopenharmony_ci * Note that Spectrum does not reveal FRC, UTC and Mirror_UTC 33562306a36Sopenharmony_ci */ 33662306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, time_stamp_high, 0x18, 0, 22); 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic inline u64 mlxsw_pci_cqe2_time_stamp_get(const char *cqe) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci u64 ts_high = mlxsw_pci_cqe2_time_stamp_high_get(cqe); 34162306a36Sopenharmony_ci u64 ts_low = mlxsw_pci_cqe2_time_stamp_low_get(cqe); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci return ts_high << 16 | ts_low; 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic inline u8 mlxsw_pci_cqe2_time_stamp_sec_get(const char *cqe) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci u64 full_ts = mlxsw_pci_cqe2_time_stamp_get(cqe); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci return full_ts >> 30 & 0xFF; 35162306a36Sopenharmony_ci} 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic inline u32 mlxsw_pci_cqe2_time_stamp_nsec_get(const char *cqe) 35462306a36Sopenharmony_ci{ 35562306a36Sopenharmony_ci u64 full_ts = mlxsw_pci_cqe2_time_stamp_get(cqe); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci return full_ts & 0x3FFFFFFF; 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* pci_cqe_mirror_latency 36162306a36Sopenharmony_ci * End-to-end latency of the original packet that does mirroring to the CPU. 36262306a36Sopenharmony_ci * Value of 0xFFFFFF means that the latency is invalid. Units are according to 36362306a36Sopenharmony_ci * MOGCR.mirror_latency_units. 36462306a36Sopenharmony_ci */ 36562306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, mirror_latency, 0x1C, 8, 24); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/* pci_cqe_owner 36862306a36Sopenharmony_ci * Ownership bit. 36962306a36Sopenharmony_ci */ 37062306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe01, owner, 0x0C, 0, 1); 37162306a36Sopenharmony_ciMLXSW_ITEM32(pci, cqe2, owner, 0x1C, 0, 1); 37262306a36Sopenharmony_cimlxsw_pci_cqe_item_helpers(owner, 01, 01, 2); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci/* pci_eqe_event_type 37562306a36Sopenharmony_ci * Event type. 37662306a36Sopenharmony_ci */ 37762306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, event_type, 0x0C, 24, 8); 37862306a36Sopenharmony_ci#define MLXSW_PCI_EQE_EVENT_TYPE_COMP 0x00 37962306a36Sopenharmony_ci#define MLXSW_PCI_EQE_EVENT_TYPE_CMD 0x0A 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci/* pci_eqe_event_sub_type 38262306a36Sopenharmony_ci * Event type. 38362306a36Sopenharmony_ci */ 38462306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, event_sub_type, 0x0C, 16, 8); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci/* pci_eqe_cqn 38762306a36Sopenharmony_ci * Completion Queue that triggered this EQE. 38862306a36Sopenharmony_ci */ 38962306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, cqn, 0x0C, 8, 7); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci/* pci_eqe_owner 39262306a36Sopenharmony_ci * Ownership bit. 39362306a36Sopenharmony_ci */ 39462306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, owner, 0x0C, 0, 1); 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci/* pci_eqe_cmd_token 39762306a36Sopenharmony_ci * Command completion event - token 39862306a36Sopenharmony_ci */ 39962306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, cmd_token, 0x00, 16, 16); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci/* pci_eqe_cmd_status 40262306a36Sopenharmony_ci * Command completion event - status 40362306a36Sopenharmony_ci */ 40462306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, cmd_status, 0x00, 0, 8); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci/* pci_eqe_cmd_out_param_h 40762306a36Sopenharmony_ci * Command completion event - output parameter - higher part 40862306a36Sopenharmony_ci */ 40962306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, cmd_out_param_h, 0x04, 0, 32); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci/* pci_eqe_cmd_out_param_l 41262306a36Sopenharmony_ci * Command completion event - output parameter - lower part 41362306a36Sopenharmony_ci */ 41462306a36Sopenharmony_ciMLXSW_ITEM32(pci, eqe, cmd_out_param_l, 0x08, 0, 32); 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci#endif 417