162306a36Sopenharmony_ci/********************************************************************** 262306a36Sopenharmony_ci * Author: Cavium, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Contact: support@cavium.com 562306a36Sopenharmony_ci * Please include "LiquidIO" in the subject. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2003-2016 Cavium, Inc. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * This file is free software; you can redistribute it and/or modify 1062306a36Sopenharmony_ci * it under the terms of the GNU General Public License, Version 2, as 1162306a36Sopenharmony_ci * published by the Free Software Foundation. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * This file is distributed in the hope that it will be useful, but 1462306a36Sopenharmony_ci * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty 1562306a36Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 1662306a36Sopenharmony_ci * NONINFRINGEMENT. See the GNU General Public License for more details. 1762306a36Sopenharmony_ci ***********************************************************************/ 1862306a36Sopenharmony_ci/*! \file liquidio_common.h 1962306a36Sopenharmony_ci * \brief Common: Structures and macros used in PCI-NIC package by core and 2062306a36Sopenharmony_ci * host driver. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#ifndef __LIQUIDIO_COMMON_H__ 2462306a36Sopenharmony_ci#define __LIQUIDIO_COMMON_H__ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include "octeon_config.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define LIQUIDIO_BASE_MAJOR_VERSION 1 2962306a36Sopenharmony_ci#define LIQUIDIO_BASE_MINOR_VERSION 7 3062306a36Sopenharmony_ci#define LIQUIDIO_BASE_MICRO_VERSION 2 3162306a36Sopenharmony_ci#define LIQUIDIO_BASE_VERSION __stringify(LIQUIDIO_BASE_MAJOR_VERSION) "." \ 3262306a36Sopenharmony_ci __stringify(LIQUIDIO_BASE_MINOR_VERSION) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct lio_version { 3562306a36Sopenharmony_ci u16 major; 3662306a36Sopenharmony_ci u16 minor; 3762306a36Sopenharmony_ci u16 micro; 3862306a36Sopenharmony_ci u16 reserved; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define CONTROL_IQ 0 4262306a36Sopenharmony_ci/** Tag types used by Octeon cores in its work. */ 4362306a36Sopenharmony_cienum octeon_tag_type { 4462306a36Sopenharmony_ci ORDERED_TAG = 0, 4562306a36Sopenharmony_ci ATOMIC_TAG = 1, 4662306a36Sopenharmony_ci NULL_TAG = 2, 4762306a36Sopenharmony_ci NULL_NULL_TAG = 3 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* pre-defined host->NIC tag values */ 5162306a36Sopenharmony_ci#define LIO_CONTROL (0x11111110) 5262306a36Sopenharmony_ci#define LIO_DATA(i) (0x11111111 + (i)) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Opcodes used by host driver/apps to perform operations on the core. 5562306a36Sopenharmony_ci * These are used to identify the major subsystem that the operation 5662306a36Sopenharmony_ci * is for. 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci#define OPCODE_CORE 0 /* used for generic core operations */ 5962306a36Sopenharmony_ci#define OPCODE_NIC 1 /* used for NIC operations */ 6062306a36Sopenharmony_ci/* Subcodes are used by host driver/apps to identify the sub-operation 6162306a36Sopenharmony_ci * for the core. They only need to by unique for a given subsystem. 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_ci#define OPCODE_SUBCODE(op, sub) ((((op) & 0x0f) << 8) | ((sub) & 0x7f)) 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/** OPCODE_CORE subcodes. For future use. */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/** OPCODE_NIC subcodes */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* This subcode is sent by core PCI driver to indicate cores are ready. */ 7062306a36Sopenharmony_ci#define OPCODE_NIC_CORE_DRV_ACTIVE 0x01 7162306a36Sopenharmony_ci#define OPCODE_NIC_NW_DATA 0x02 /* network packet data */ 7262306a36Sopenharmony_ci#define OPCODE_NIC_CMD 0x03 7362306a36Sopenharmony_ci#define OPCODE_NIC_INFO 0x04 7462306a36Sopenharmony_ci#define OPCODE_NIC_PORT_STATS 0x05 7562306a36Sopenharmony_ci#define OPCODE_NIC_MDIO45 0x06 7662306a36Sopenharmony_ci#define OPCODE_NIC_TIMESTAMP 0x07 7762306a36Sopenharmony_ci#define OPCODE_NIC_INTRMOD_CFG 0x08 7862306a36Sopenharmony_ci#define OPCODE_NIC_IF_CFG 0x09 7962306a36Sopenharmony_ci#define OPCODE_NIC_VF_DRV_NOTICE 0x0A 8062306a36Sopenharmony_ci#define OPCODE_NIC_INTRMOD_PARAMS 0x0B 8162306a36Sopenharmony_ci#define OPCODE_NIC_QCOUNT_UPDATE 0x12 8262306a36Sopenharmony_ci#define OPCODE_NIC_SET_TRUSTED_VF 0x13 8362306a36Sopenharmony_ci#define OPCODE_NIC_SYNC_OCTEON_TIME 0x14 8462306a36Sopenharmony_ci#define VF_DRV_LOADED 1 8562306a36Sopenharmony_ci#define VF_DRV_REMOVED -1 8662306a36Sopenharmony_ci#define VF_DRV_MACADDR_CHANGED 2 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define OPCODE_NIC_VF_REP_PKT 0x15 8962306a36Sopenharmony_ci#define OPCODE_NIC_VF_REP_CMD 0x16 9062306a36Sopenharmony_ci#define OPCODE_NIC_UBOOT_CTL 0x17 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define CORE_DRV_TEST_SCATTER_OP 0xFFF5 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Application codes advertised by the core driver initialization packet. */ 9562306a36Sopenharmony_ci#define CVM_DRV_APP_START 0x0 9662306a36Sopenharmony_ci#define CVM_DRV_NO_APP 0 9762306a36Sopenharmony_ci#define CVM_DRV_APP_COUNT 0x2 9862306a36Sopenharmony_ci#define CVM_DRV_BASE_APP (CVM_DRV_APP_START + 0x0) 9962306a36Sopenharmony_ci#define CVM_DRV_NIC_APP (CVM_DRV_APP_START + 0x1) 10062306a36Sopenharmony_ci#define CVM_DRV_INVALID_APP (CVM_DRV_APP_START + 0x2) 10162306a36Sopenharmony_ci#define CVM_DRV_APP_END (CVM_DRV_INVALID_APP - 1) 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define BYTES_PER_DHLEN_UNIT 8 10462306a36Sopenharmony_ci#define MAX_REG_CNT 2000000U 10562306a36Sopenharmony_ci#define INTRNAMSIZ 32 10662306a36Sopenharmony_ci#define IRQ_NAME_OFF(i) ((i) * INTRNAMSIZ) 10762306a36Sopenharmony_ci#define MAX_IOQ_INTERRUPTS_PER_PF (64 * 2) 10862306a36Sopenharmony_ci#define MAX_IOQ_INTERRUPTS_PER_VF (8 * 2) 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define SCR2_BIT_FW_LOADED 63 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* App specific capabilities from firmware to pf driver */ 11362306a36Sopenharmony_ci#define LIQUIDIO_TIME_SYNC_CAP 0x1 11462306a36Sopenharmony_ci#define LIQUIDIO_SWITCHDEV_CAP 0x2 11562306a36Sopenharmony_ci#define LIQUIDIO_SPOOFCHK_CAP 0x4 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* error status return from firmware */ 11862306a36Sopenharmony_ci#define OCTEON_REQUEST_NO_PERMISSION 0xc 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistatic inline u32 incr_index(u32 index, u32 count, u32 max) 12162306a36Sopenharmony_ci{ 12262306a36Sopenharmony_ci if ((index + count) >= max) 12362306a36Sopenharmony_ci index = index + count - max; 12462306a36Sopenharmony_ci else 12562306a36Sopenharmony_ci index += count; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci return index; 12862306a36Sopenharmony_ci} 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define OCT_BOARD_NAME 32 13162306a36Sopenharmony_ci#define OCT_SERIAL_LEN 64 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* Structure used by core driver to send indication that the Octeon 13462306a36Sopenharmony_ci * application is ready. 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_cistruct octeon_core_setup { 13762306a36Sopenharmony_ci u64 corefreq; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci char boardname[OCT_BOARD_NAME]; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci char board_serial_number[OCT_SERIAL_LEN]; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci u64 board_rev_major; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci u64 board_rev_minor; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/*--------------------------- SCATTER GATHER ENTRY -----------------------*/ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* The Scatter-Gather List Entry. The scatter or gather component used with 15262306a36Sopenharmony_ci * a Octeon input instruction has this format. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_cistruct octeon_sg_entry { 15562306a36Sopenharmony_ci /** The first 64 bit gives the size of data in each dptr.*/ 15662306a36Sopenharmony_ci union { 15762306a36Sopenharmony_ci u16 size[4]; 15862306a36Sopenharmony_ci u64 size64; 15962306a36Sopenharmony_ci } u; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci /** The 4 dptr pointers for this entry. */ 16262306a36Sopenharmony_ci u64 ptr[4]; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define OCT_SG_ENTRY_SIZE (sizeof(struct octeon_sg_entry)) 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* \brief Add size to gather list 16962306a36Sopenharmony_ci * @param sg_entry scatter/gather entry 17062306a36Sopenharmony_ci * @param size size to add 17162306a36Sopenharmony_ci * @param pos position to add it. 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_cistatic inline void add_sg_size(struct octeon_sg_entry *sg_entry, 17462306a36Sopenharmony_ci u16 size, 17562306a36Sopenharmony_ci u32 pos) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 17862306a36Sopenharmony_ci sg_entry->u.size[pos] = size; 17962306a36Sopenharmony_ci#else 18062306a36Sopenharmony_ci sg_entry->u.size[3 - pos] = size; 18162306a36Sopenharmony_ci#endif 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/*------------------------- End Scatter/Gather ---------------------------*/ 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#define OCTNET_FRM_LENGTH_SIZE 8 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#define OCTNET_FRM_PTP_HEADER_SIZE 8 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci#define OCTNET_FRM_HEADER_SIZE 22 /* VLAN + Ethernet */ 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#define OCTNET_MIN_FRM_SIZE 64 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci#define OCTNET_MAX_FRM_SIZE (16000 + OCTNET_FRM_HEADER_SIZE) 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define OCTNET_DEFAULT_MTU (1500) 19762306a36Sopenharmony_ci#define OCTNET_DEFAULT_FRM_SIZE (OCTNET_DEFAULT_MTU + OCTNET_FRM_HEADER_SIZE) 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/** NIC Commands are sent using this Octeon Input Queue */ 20062306a36Sopenharmony_ci#define OCTNET_CMD_Q 0 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* NIC Command types */ 20362306a36Sopenharmony_ci#define OCTNET_CMD_CHANGE_MTU 0x1 20462306a36Sopenharmony_ci#define OCTNET_CMD_CHANGE_MACADDR 0x2 20562306a36Sopenharmony_ci#define OCTNET_CMD_CHANGE_DEVFLAGS 0x3 20662306a36Sopenharmony_ci#define OCTNET_CMD_RX_CTL 0x4 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci#define OCTNET_CMD_SET_MULTI_LIST 0x5 20962306a36Sopenharmony_ci#define OCTNET_CMD_CLEAR_STATS 0x6 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/* command for setting the speed, duplex & autoneg */ 21262306a36Sopenharmony_ci#define OCTNET_CMD_SET_SETTINGS 0x7 21362306a36Sopenharmony_ci#define OCTNET_CMD_SET_FLOW_CTL 0x8 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci#define OCTNET_CMD_MDIO_READ_WRITE 0x9 21662306a36Sopenharmony_ci#define OCTNET_CMD_GPIO_ACCESS 0xA 21762306a36Sopenharmony_ci#define OCTNET_CMD_LRO_ENABLE 0xB 21862306a36Sopenharmony_ci#define OCTNET_CMD_LRO_DISABLE 0xC 21962306a36Sopenharmony_ci#define OCTNET_CMD_SET_RSS 0xD 22062306a36Sopenharmony_ci#define OCTNET_CMD_WRITE_SA 0xE 22162306a36Sopenharmony_ci#define OCTNET_CMD_DELETE_SA 0xF 22262306a36Sopenharmony_ci#define OCTNET_CMD_UPDATE_SA 0x12 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci#define OCTNET_CMD_TNL_RX_CSUM_CTL 0x10 22562306a36Sopenharmony_ci#define OCTNET_CMD_TNL_TX_CSUM_CTL 0x11 22662306a36Sopenharmony_ci#define OCTNET_CMD_IPSECV2_AH_ESP_CTL 0x13 22762306a36Sopenharmony_ci#define OCTNET_CMD_VERBOSE_ENABLE 0x14 22862306a36Sopenharmony_ci#define OCTNET_CMD_VERBOSE_DISABLE 0x15 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define OCTNET_CMD_VLAN_FILTER_CTL 0x16 23162306a36Sopenharmony_ci#define OCTNET_CMD_ADD_VLAN_FILTER 0x17 23262306a36Sopenharmony_ci#define OCTNET_CMD_DEL_VLAN_FILTER 0x18 23362306a36Sopenharmony_ci#define OCTNET_CMD_VXLAN_PORT_CONFIG 0x19 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#define OCTNET_CMD_ID_ACTIVE 0x1a 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci#define OCTNET_CMD_SET_UC_LIST 0x1b 23862306a36Sopenharmony_ci#define OCTNET_CMD_SET_VF_LINKSTATE 0x1c 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci#define OCTNET_CMD_QUEUE_COUNT_CTL 0x1f 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define OCTNET_CMD_GROUP1 1 24362306a36Sopenharmony_ci#define OCTNET_CMD_SET_VF_SPOOFCHK 0x1 24462306a36Sopenharmony_ci#define OCTNET_GROUP1_LAST_CMD OCTNET_CMD_SET_VF_SPOOFCHK 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci#define OCTNET_CMD_VXLAN_PORT_ADD 0x0 24762306a36Sopenharmony_ci#define OCTNET_CMD_VXLAN_PORT_DEL 0x1 24862306a36Sopenharmony_ci#define OCTNET_CMD_RXCSUM_ENABLE 0x0 24962306a36Sopenharmony_ci#define OCTNET_CMD_RXCSUM_DISABLE 0x1 25062306a36Sopenharmony_ci#define OCTNET_CMD_TXCSUM_ENABLE 0x0 25162306a36Sopenharmony_ci#define OCTNET_CMD_TXCSUM_DISABLE 0x1 25262306a36Sopenharmony_ci#define OCTNET_CMD_VLAN_FILTER_ENABLE 0x1 25362306a36Sopenharmony_ci#define OCTNET_CMD_VLAN_FILTER_DISABLE 0x0 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci#define OCTNET_CMD_FAIL 0x1 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#define SEAPI_CMD_FEC_SET 0x0 25862306a36Sopenharmony_ci#define SEAPI_CMD_FEC_SET_DISABLE 0x0 25962306a36Sopenharmony_ci#define SEAPI_CMD_FEC_SET_RS 0x1 26062306a36Sopenharmony_ci#define SEAPI_CMD_FEC_GET 0x1 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci#define SEAPI_CMD_SPEED_SET 0x2 26362306a36Sopenharmony_ci#define SEAPI_CMD_SPEED_GET 0x3 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#define OPCODE_NIC_VF_PORT_STATS 0x22 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci#define LIO_CMD_WAIT_TM 100 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci/* RX(packets coming from wire) Checksum verification flags */ 27062306a36Sopenharmony_ci/* TCP/UDP csum */ 27162306a36Sopenharmony_ci#define CNNIC_L4SUM_VERIFIED 0x1 27262306a36Sopenharmony_ci#define CNNIC_IPSUM_VERIFIED 0x2 27362306a36Sopenharmony_ci#define CNNIC_TUN_CSUM_VERIFIED 0x4 27462306a36Sopenharmony_ci#define CNNIC_CSUM_VERIFIED (CNNIC_IPSUM_VERIFIED | CNNIC_L4SUM_VERIFIED) 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci/*LROIPV4 and LROIPV6 Flags*/ 27762306a36Sopenharmony_ci#define OCTNIC_LROIPV4 0x1 27862306a36Sopenharmony_ci#define OCTNIC_LROIPV6 0x2 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* Interface flags communicated between host driver and core app. */ 28162306a36Sopenharmony_cienum octnet_ifflags { 28262306a36Sopenharmony_ci OCTNET_IFFLAG_PROMISC = 0x01, 28362306a36Sopenharmony_ci OCTNET_IFFLAG_ALLMULTI = 0x02, 28462306a36Sopenharmony_ci OCTNET_IFFLAG_MULTICAST = 0x04, 28562306a36Sopenharmony_ci OCTNET_IFFLAG_BROADCAST = 0x08, 28662306a36Sopenharmony_ci OCTNET_IFFLAG_UNICAST = 0x10 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci/* wqe 29062306a36Sopenharmony_ci * --------------- 0 29162306a36Sopenharmony_ci * | wqe word0-3 | 29262306a36Sopenharmony_ci * --------------- 32 29362306a36Sopenharmony_ci * | PCI IH | 29462306a36Sopenharmony_ci * --------------- 40 29562306a36Sopenharmony_ci * | RPTR | 29662306a36Sopenharmony_ci * --------------- 48 29762306a36Sopenharmony_ci * | PCI IRH | 29862306a36Sopenharmony_ci * --------------- 56 29962306a36Sopenharmony_ci * | OCT_NET_CMD | 30062306a36Sopenharmony_ci * --------------- 64 30162306a36Sopenharmony_ci * | Addtl 8-BData | 30262306a36Sopenharmony_ci * | | 30362306a36Sopenharmony_ci * --------------- 30462306a36Sopenharmony_ci */ 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ciunion octnet_cmd { 30762306a36Sopenharmony_ci u64 u64; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci struct { 31062306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 31162306a36Sopenharmony_ci u64 cmd:5; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci u64 more:6; /* How many udd words follow the command */ 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci u64 cmdgroup:8; 31662306a36Sopenharmony_ci u64 reserved:21; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci u64 param1:16; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci u64 param2:8; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci#else 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci u64 param2:8; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci u64 param1:16; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci u64 reserved:21; 32962306a36Sopenharmony_ci u64 cmdgroup:8; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci u64 more:6; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci u64 cmd:5; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci#endif 33662306a36Sopenharmony_ci } s; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci#define OCTNET_CMD_SIZE (sizeof(union octnet_cmd)) 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci/*pkiih3 + irh + ossp[0] + ossp[1] + rdp + rptr = 40 bytes */ 34362306a36Sopenharmony_ci#define LIO_SOFTCMDRESP_IH2 40 34462306a36Sopenharmony_ci#define LIO_SOFTCMDRESP_IH3 (40 + 8) 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci#define LIO_PCICMD_O2 24 34762306a36Sopenharmony_ci#define LIO_PCICMD_O3 (24 + 8) 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/* Instruction Header(DPI) - for OCTEON-III models */ 35062306a36Sopenharmony_cistruct octeon_instr_ih3 { 35162306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci /** Reserved3 */ 35462306a36Sopenharmony_ci u64 reserved3:1; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci /** Gather indicator 1=gather*/ 35762306a36Sopenharmony_ci u64 gather:1; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci /** Data length OR no. of entries in gather list */ 36062306a36Sopenharmony_ci u64 dlengsz:14; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci /** Front Data size */ 36362306a36Sopenharmony_ci u64 fsz:6; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci /** Reserved2 */ 36662306a36Sopenharmony_ci u64 reserved2:4; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci /** PKI port kind - PKIND */ 36962306a36Sopenharmony_ci u64 pkind:6; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci /** Reserved1 */ 37262306a36Sopenharmony_ci u64 reserved1:32; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci#else 37562306a36Sopenharmony_ci /** Reserved1 */ 37662306a36Sopenharmony_ci u64 reserved1:32; 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci /** PKI port kind - PKIND */ 37962306a36Sopenharmony_ci u64 pkind:6; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci /** Reserved2 */ 38262306a36Sopenharmony_ci u64 reserved2:4; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci /** Front Data size */ 38562306a36Sopenharmony_ci u64 fsz:6; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci /** Data length OR no. of entries in gather list */ 38862306a36Sopenharmony_ci u64 dlengsz:14; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci /** Gather indicator 1=gather*/ 39162306a36Sopenharmony_ci u64 gather:1; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci /** Reserved3 */ 39462306a36Sopenharmony_ci u64 reserved3:1; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci#endif 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci/* Optional PKI Instruction Header(PKI IH) - for OCTEON-III models */ 40062306a36Sopenharmony_ci/** BIG ENDIAN format. */ 40162306a36Sopenharmony_cistruct octeon_instr_pki_ih3 { 40262306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci /** Wider bit */ 40562306a36Sopenharmony_ci u64 w:1; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci /** Raw mode indicator 1 = RAW */ 40862306a36Sopenharmony_ci u64 raw:1; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci /** Use Tag */ 41162306a36Sopenharmony_ci u64 utag:1; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci /** Use QPG */ 41462306a36Sopenharmony_ci u64 uqpg:1; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci /** Reserved2 */ 41762306a36Sopenharmony_ci u64 reserved2:1; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci /** Parse Mode */ 42062306a36Sopenharmony_ci u64 pm:3; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci /** Skip Length */ 42362306a36Sopenharmony_ci u64 sl:8; 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /** Use Tag Type */ 42662306a36Sopenharmony_ci u64 utt:1; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci /** Tag type */ 42962306a36Sopenharmony_ci u64 tagtype:2; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /** Reserved1 */ 43262306a36Sopenharmony_ci u64 reserved1:2; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci /** QPG Value */ 43562306a36Sopenharmony_ci u64 qpg:11; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci /** Tag Value */ 43862306a36Sopenharmony_ci u64 tag:32; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci#else 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci /** Tag Value */ 44362306a36Sopenharmony_ci u64 tag:32; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci /** QPG Value */ 44662306a36Sopenharmony_ci u64 qpg:11; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci /** Reserved1 */ 44962306a36Sopenharmony_ci u64 reserved1:2; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci /** Tag type */ 45262306a36Sopenharmony_ci u64 tagtype:2; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci /** Use Tag Type */ 45562306a36Sopenharmony_ci u64 utt:1; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci /** Skip Length */ 45862306a36Sopenharmony_ci u64 sl:8; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci /** Parse Mode */ 46162306a36Sopenharmony_ci u64 pm:3; 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci /** Reserved2 */ 46462306a36Sopenharmony_ci u64 reserved2:1; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci /** Use QPG */ 46762306a36Sopenharmony_ci u64 uqpg:1; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci /** Use Tag */ 47062306a36Sopenharmony_ci u64 utag:1; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci /** Raw mode indicator 1 = RAW */ 47362306a36Sopenharmony_ci u64 raw:1; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci /** Wider bit */ 47662306a36Sopenharmony_ci u64 w:1; 47762306a36Sopenharmony_ci#endif 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci}; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci/** Instruction Header */ 48262306a36Sopenharmony_cistruct octeon_instr_ih2 { 48362306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 48462306a36Sopenharmony_ci /** Raw mode indicator 1 = RAW */ 48562306a36Sopenharmony_ci u64 raw:1; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci /** Gather indicator 1=gather*/ 48862306a36Sopenharmony_ci u64 gather:1; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci /** Data length OR no. of entries in gather list */ 49162306a36Sopenharmony_ci u64 dlengsz:14; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci /** Front Data size */ 49462306a36Sopenharmony_ci u64 fsz:6; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci /** Packet Order / Work Unit selection (1 of 8)*/ 49762306a36Sopenharmony_ci u64 qos:3; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci /** Core group selection (1 of 16) */ 50062306a36Sopenharmony_ci u64 grp:4; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci /** Short Raw Packet Indicator 1=short raw pkt */ 50362306a36Sopenharmony_ci u64 rs:1; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci /** Tag type */ 50662306a36Sopenharmony_ci u64 tagtype:2; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci /** Tag Value */ 50962306a36Sopenharmony_ci u64 tag:32; 51062306a36Sopenharmony_ci#else 51162306a36Sopenharmony_ci /** Tag Value */ 51262306a36Sopenharmony_ci u64 tag:32; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci /** Tag type */ 51562306a36Sopenharmony_ci u64 tagtype:2; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci /** Short Raw Packet Indicator 1=short raw pkt */ 51862306a36Sopenharmony_ci u64 rs:1; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci /** Core group selection (1 of 16) */ 52162306a36Sopenharmony_ci u64 grp:4; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /** Packet Order / Work Unit selection (1 of 8)*/ 52462306a36Sopenharmony_ci u64 qos:3; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci /** Front Data size */ 52762306a36Sopenharmony_ci u64 fsz:6; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci /** Data length OR no. of entries in gather list */ 53062306a36Sopenharmony_ci u64 dlengsz:14; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci /** Gather indicator 1=gather*/ 53362306a36Sopenharmony_ci u64 gather:1; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci /** Raw mode indicator 1 = RAW */ 53662306a36Sopenharmony_ci u64 raw:1; 53762306a36Sopenharmony_ci#endif 53862306a36Sopenharmony_ci}; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci/** Input Request Header */ 54162306a36Sopenharmony_cistruct octeon_instr_irh { 54262306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 54362306a36Sopenharmony_ci u64 opcode:4; 54462306a36Sopenharmony_ci u64 rflag:1; 54562306a36Sopenharmony_ci u64 subcode:7; 54662306a36Sopenharmony_ci u64 vlan:12; 54762306a36Sopenharmony_ci u64 priority:3; 54862306a36Sopenharmony_ci u64 reserved:5; 54962306a36Sopenharmony_ci u64 ossp:32; /* opcode/subcode specific parameters */ 55062306a36Sopenharmony_ci#else 55162306a36Sopenharmony_ci u64 ossp:32; /* opcode/subcode specific parameters */ 55262306a36Sopenharmony_ci u64 reserved:5; 55362306a36Sopenharmony_ci u64 priority:3; 55462306a36Sopenharmony_ci u64 vlan:12; 55562306a36Sopenharmony_ci u64 subcode:7; 55662306a36Sopenharmony_ci u64 rflag:1; 55762306a36Sopenharmony_ci u64 opcode:4; 55862306a36Sopenharmony_ci#endif 55962306a36Sopenharmony_ci}; 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci/** Return Data Parameters */ 56262306a36Sopenharmony_cistruct octeon_instr_rdp { 56362306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 56462306a36Sopenharmony_ci u64 reserved:49; 56562306a36Sopenharmony_ci u64 pcie_port:3; 56662306a36Sopenharmony_ci u64 rlen:12; 56762306a36Sopenharmony_ci#else 56862306a36Sopenharmony_ci u64 rlen:12; 56962306a36Sopenharmony_ci u64 pcie_port:3; 57062306a36Sopenharmony_ci u64 reserved:49; 57162306a36Sopenharmony_ci#endif 57262306a36Sopenharmony_ci}; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci/** Receive Header */ 57562306a36Sopenharmony_ciunion octeon_rh { 57662306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 57762306a36Sopenharmony_ci u64 u64; 57862306a36Sopenharmony_ci struct { 57962306a36Sopenharmony_ci u64 opcode:4; 58062306a36Sopenharmony_ci u64 subcode:8; 58162306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 58262306a36Sopenharmony_ci u64 reserved:17; 58362306a36Sopenharmony_ci u64 ossp:32; /** opcode/subcode specific parameters */ 58462306a36Sopenharmony_ci } r; 58562306a36Sopenharmony_ci struct { 58662306a36Sopenharmony_ci u64 opcode:4; 58762306a36Sopenharmony_ci u64 subcode:8; 58862306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 58962306a36Sopenharmony_ci u64 extra:28; 59062306a36Sopenharmony_ci u64 vlan:12; 59162306a36Sopenharmony_ci u64 priority:3; 59262306a36Sopenharmony_ci u64 csum_verified:3; /** checksum verified. */ 59362306a36Sopenharmony_ci u64 has_hwtstamp:1; /** Has hardware timestamp. 1 = yes. */ 59462306a36Sopenharmony_ci u64 encap_on:1; 59562306a36Sopenharmony_ci u64 has_hash:1; /** Has hash (rth or rss). 1 = yes. */ 59662306a36Sopenharmony_ci } r_dh; 59762306a36Sopenharmony_ci struct { 59862306a36Sopenharmony_ci u64 opcode:4; 59962306a36Sopenharmony_ci u64 subcode:8; 60062306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 60162306a36Sopenharmony_ci u64 reserved:11; 60262306a36Sopenharmony_ci u64 num_gmx_ports:8; 60362306a36Sopenharmony_ci u64 max_nic_ports:10; 60462306a36Sopenharmony_ci u64 app_cap_flags:4; 60562306a36Sopenharmony_ci u64 app_mode:8; 60662306a36Sopenharmony_ci u64 pkind:8; 60762306a36Sopenharmony_ci } r_core_drv_init; 60862306a36Sopenharmony_ci struct { 60962306a36Sopenharmony_ci u64 opcode:4; 61062306a36Sopenharmony_ci u64 subcode:8; 61162306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 61262306a36Sopenharmony_ci u64 reserved:8; 61362306a36Sopenharmony_ci u64 extra:25; 61462306a36Sopenharmony_ci u64 gmxport:16; 61562306a36Sopenharmony_ci } r_nic_info; 61662306a36Sopenharmony_ci#else 61762306a36Sopenharmony_ci u64 u64; 61862306a36Sopenharmony_ci struct { 61962306a36Sopenharmony_ci u64 ossp:32; /** opcode/subcode specific parameters */ 62062306a36Sopenharmony_ci u64 reserved:17; 62162306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 62262306a36Sopenharmony_ci u64 subcode:8; 62362306a36Sopenharmony_ci u64 opcode:4; 62462306a36Sopenharmony_ci } r; 62562306a36Sopenharmony_ci struct { 62662306a36Sopenharmony_ci u64 has_hash:1; /** Has hash (rth or rss). 1 = yes. */ 62762306a36Sopenharmony_ci u64 encap_on:1; 62862306a36Sopenharmony_ci u64 has_hwtstamp:1; /** 1 = has hwtstamp */ 62962306a36Sopenharmony_ci u64 csum_verified:3; /** checksum verified. */ 63062306a36Sopenharmony_ci u64 priority:3; 63162306a36Sopenharmony_ci u64 vlan:12; 63262306a36Sopenharmony_ci u64 extra:28; 63362306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 63462306a36Sopenharmony_ci u64 subcode:8; 63562306a36Sopenharmony_ci u64 opcode:4; 63662306a36Sopenharmony_ci } r_dh; 63762306a36Sopenharmony_ci struct { 63862306a36Sopenharmony_ci u64 pkind:8; 63962306a36Sopenharmony_ci u64 app_mode:8; 64062306a36Sopenharmony_ci u64 app_cap_flags:4; 64162306a36Sopenharmony_ci u64 max_nic_ports:10; 64262306a36Sopenharmony_ci u64 num_gmx_ports:8; 64362306a36Sopenharmony_ci u64 reserved:11; 64462306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 64562306a36Sopenharmony_ci u64 subcode:8; 64662306a36Sopenharmony_ci u64 opcode:4; 64762306a36Sopenharmony_ci } r_core_drv_init; 64862306a36Sopenharmony_ci struct { 64962306a36Sopenharmony_ci u64 gmxport:16; 65062306a36Sopenharmony_ci u64 extra:25; 65162306a36Sopenharmony_ci u64 reserved:8; 65262306a36Sopenharmony_ci u64 len:3; /** additional 64-bit words */ 65362306a36Sopenharmony_ci u64 subcode:8; 65462306a36Sopenharmony_ci u64 opcode:4; 65562306a36Sopenharmony_ci } r_nic_info; 65662306a36Sopenharmony_ci#endif 65762306a36Sopenharmony_ci}; 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci#define OCT_RH_SIZE (sizeof(union octeon_rh)) 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ciunion octnic_packet_params { 66262306a36Sopenharmony_ci u32 u32; 66362306a36Sopenharmony_ci struct { 66462306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 66562306a36Sopenharmony_ci u32 reserved:24; 66662306a36Sopenharmony_ci u32 ip_csum:1; /* Perform IP header checksum(s) */ 66762306a36Sopenharmony_ci /* Perform Outer transport header checksum */ 66862306a36Sopenharmony_ci u32 transport_csum:1; 66962306a36Sopenharmony_ci /* Find tunnel, and perform transport csum. */ 67062306a36Sopenharmony_ci u32 tnl_csum:1; 67162306a36Sopenharmony_ci u32 tsflag:1; /* Timestamp this packet */ 67262306a36Sopenharmony_ci u32 ipsec_ops:4; /* IPsec operation */ 67362306a36Sopenharmony_ci#else 67462306a36Sopenharmony_ci u32 ipsec_ops:4; 67562306a36Sopenharmony_ci u32 tsflag:1; 67662306a36Sopenharmony_ci u32 tnl_csum:1; 67762306a36Sopenharmony_ci u32 transport_csum:1; 67862306a36Sopenharmony_ci u32 ip_csum:1; 67962306a36Sopenharmony_ci u32 reserved:24; 68062306a36Sopenharmony_ci#endif 68162306a36Sopenharmony_ci } s; 68262306a36Sopenharmony_ci}; 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci/** Status of a RGMII Link on Octeon as seen by core driver. */ 68562306a36Sopenharmony_ciunion oct_link_status { 68662306a36Sopenharmony_ci u64 u64; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci struct { 68962306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 69062306a36Sopenharmony_ci u64 duplex:8; 69162306a36Sopenharmony_ci u64 mtu:16; 69262306a36Sopenharmony_ci u64 speed:16; 69362306a36Sopenharmony_ci u64 link_up:1; 69462306a36Sopenharmony_ci u64 autoneg:1; 69562306a36Sopenharmony_ci u64 if_mode:5; 69662306a36Sopenharmony_ci u64 pause:1; 69762306a36Sopenharmony_ci u64 flashing:1; 69862306a36Sopenharmony_ci u64 phy_type:5; 69962306a36Sopenharmony_ci u64 reserved:10; 70062306a36Sopenharmony_ci#else 70162306a36Sopenharmony_ci u64 reserved:10; 70262306a36Sopenharmony_ci u64 phy_type:5; 70362306a36Sopenharmony_ci u64 flashing:1; 70462306a36Sopenharmony_ci u64 pause:1; 70562306a36Sopenharmony_ci u64 if_mode:5; 70662306a36Sopenharmony_ci u64 autoneg:1; 70762306a36Sopenharmony_ci u64 link_up:1; 70862306a36Sopenharmony_ci u64 speed:16; 70962306a36Sopenharmony_ci u64 mtu:16; 71062306a36Sopenharmony_ci u64 duplex:8; 71162306a36Sopenharmony_ci#endif 71262306a36Sopenharmony_ci } s; 71362306a36Sopenharmony_ci}; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_cienum lio_phy_type { 71662306a36Sopenharmony_ci LIO_PHY_PORT_TP = 0x0, 71762306a36Sopenharmony_ci LIO_PHY_PORT_FIBRE = 0x1, 71862306a36Sopenharmony_ci LIO_PHY_PORT_UNKNOWN, 71962306a36Sopenharmony_ci}; 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci/** The txpciq info passed to host from the firmware */ 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ciunion oct_txpciq { 72462306a36Sopenharmony_ci u64 u64; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci struct { 72762306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 72862306a36Sopenharmony_ci u64 q_no:8; 72962306a36Sopenharmony_ci u64 port:8; 73062306a36Sopenharmony_ci u64 pkind:6; 73162306a36Sopenharmony_ci u64 use_qpg:1; 73262306a36Sopenharmony_ci u64 qpg:11; 73362306a36Sopenharmony_ci u64 reserved0:10; 73462306a36Sopenharmony_ci u64 ctrl_qpg:11; 73562306a36Sopenharmony_ci u64 reserved:9; 73662306a36Sopenharmony_ci#else 73762306a36Sopenharmony_ci u64 reserved:9; 73862306a36Sopenharmony_ci u64 ctrl_qpg:11; 73962306a36Sopenharmony_ci u64 reserved0:10; 74062306a36Sopenharmony_ci u64 qpg:11; 74162306a36Sopenharmony_ci u64 use_qpg:1; 74262306a36Sopenharmony_ci u64 pkind:6; 74362306a36Sopenharmony_ci u64 port:8; 74462306a36Sopenharmony_ci u64 q_no:8; 74562306a36Sopenharmony_ci#endif 74662306a36Sopenharmony_ci } s; 74762306a36Sopenharmony_ci}; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci/** The rxpciq info passed to host from the firmware */ 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ciunion oct_rxpciq { 75262306a36Sopenharmony_ci u64 u64; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci struct { 75562306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 75662306a36Sopenharmony_ci u64 q_no:8; 75762306a36Sopenharmony_ci u64 reserved:56; 75862306a36Sopenharmony_ci#else 75962306a36Sopenharmony_ci u64 reserved:56; 76062306a36Sopenharmony_ci u64 q_no:8; 76162306a36Sopenharmony_ci#endif 76262306a36Sopenharmony_ci } s; 76362306a36Sopenharmony_ci}; 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci/** Information for a OCTEON ethernet interface shared between core & host. */ 76662306a36Sopenharmony_cistruct oct_link_info { 76762306a36Sopenharmony_ci union oct_link_status link; 76862306a36Sopenharmony_ci u64 hw_addr; 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 77162306a36Sopenharmony_ci u64 gmxport:16; 77262306a36Sopenharmony_ci u64 macaddr_is_admin_asgnd:1; 77362306a36Sopenharmony_ci u64 rsvd:13; 77462306a36Sopenharmony_ci u64 macaddr_spoofchk:1; 77562306a36Sopenharmony_ci u64 rsvd1:17; 77662306a36Sopenharmony_ci u64 num_txpciq:8; 77762306a36Sopenharmony_ci u64 num_rxpciq:8; 77862306a36Sopenharmony_ci#else 77962306a36Sopenharmony_ci u64 num_rxpciq:8; 78062306a36Sopenharmony_ci u64 num_txpciq:8; 78162306a36Sopenharmony_ci u64 rsvd1:17; 78262306a36Sopenharmony_ci u64 macaddr_spoofchk:1; 78362306a36Sopenharmony_ci u64 rsvd:13; 78462306a36Sopenharmony_ci u64 macaddr_is_admin_asgnd:1; 78562306a36Sopenharmony_ci u64 gmxport:16; 78662306a36Sopenharmony_ci#endif 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci union oct_txpciq txpciq[MAX_IOQS_PER_NICIF]; 78962306a36Sopenharmony_ci union oct_rxpciq rxpciq[MAX_IOQS_PER_NICIF]; 79062306a36Sopenharmony_ci}; 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_ci#define OCT_LINK_INFO_SIZE (sizeof(struct oct_link_info)) 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_cistruct liquidio_if_cfg_info { 79562306a36Sopenharmony_ci u64 iqmask; /** mask for IQs enabled for the port */ 79662306a36Sopenharmony_ci u64 oqmask; /** mask for OQs enabled for the port */ 79762306a36Sopenharmony_ci struct oct_link_info linfo; /** initial link information */ 79862306a36Sopenharmony_ci char liquidio_firmware_version[32]; 79962306a36Sopenharmony_ci}; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci/** Stats for each NIC port in RX direction. */ 80262306a36Sopenharmony_cistruct nic_rx_stats { 80362306a36Sopenharmony_ci /* link-level stats */ 80462306a36Sopenharmony_ci u64 total_rcvd; /* Received packets */ 80562306a36Sopenharmony_ci u64 bytes_rcvd; /* Octets of received packets */ 80662306a36Sopenharmony_ci u64 total_bcst; /* Number of non-dropped L2 broadcast packets */ 80762306a36Sopenharmony_ci u64 total_mcst; /* Number of non-dropped L2 multicast packets */ 80862306a36Sopenharmony_ci u64 runts; /* Packets shorter than allowed */ 80962306a36Sopenharmony_ci u64 ctl_rcvd; /* Received PAUSE packets */ 81062306a36Sopenharmony_ci u64 fifo_err; /* Packets dropped due to RX FIFO full */ 81162306a36Sopenharmony_ci u64 dmac_drop; /* Packets dropped by the DMAC filter */ 81262306a36Sopenharmony_ci u64 fcs_err; /* Sum of fragment, overrun, and FCS errors */ 81362306a36Sopenharmony_ci u64 jabber_err; /* Packets larger than allowed */ 81462306a36Sopenharmony_ci u64 l2_err; /* Sum of DMA, parity, PCAM access, no memory, 81562306a36Sopenharmony_ci * buffer overflow, malformed L2 header or 81662306a36Sopenharmony_ci * length, oversize errors 81762306a36Sopenharmony_ci **/ 81862306a36Sopenharmony_ci u64 frame_err; /* Sum of IPv4 and L4 checksum errors */ 81962306a36Sopenharmony_ci u64 red_drops; /* Packets dropped by RED due to buffer 82062306a36Sopenharmony_ci * exhaustion 82162306a36Sopenharmony_ci **/ 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci /* firmware stats */ 82462306a36Sopenharmony_ci u64 fw_total_rcvd; 82562306a36Sopenharmony_ci u64 fw_total_fwd; 82662306a36Sopenharmony_ci u64 fw_total_fwd_bytes; 82762306a36Sopenharmony_ci u64 fw_total_mcast; 82862306a36Sopenharmony_ci u64 fw_total_bcast; 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci u64 fw_err_pko; 83162306a36Sopenharmony_ci u64 fw_err_link; 83262306a36Sopenharmony_ci u64 fw_err_drop; 83362306a36Sopenharmony_ci u64 fw_rx_vxlan; 83462306a36Sopenharmony_ci u64 fw_rx_vxlan_err; 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci /* LRO */ 83762306a36Sopenharmony_ci u64 fw_lro_pkts; /* Number of packets that are LROed */ 83862306a36Sopenharmony_ci u64 fw_lro_octs; /* Number of octets that are LROed */ 83962306a36Sopenharmony_ci u64 fw_total_lro; /* Number of LRO packets formed */ 84062306a36Sopenharmony_ci u64 fw_lro_aborts; /* Number of times LRO of packet aborted */ 84162306a36Sopenharmony_ci u64 fw_lro_aborts_port; 84262306a36Sopenharmony_ci u64 fw_lro_aborts_seq; 84362306a36Sopenharmony_ci u64 fw_lro_aborts_tsval; 84462306a36Sopenharmony_ci u64 fw_lro_aborts_timer; /* Timer setting error */ 84562306a36Sopenharmony_ci /* intrmod: packet forward rate */ 84662306a36Sopenharmony_ci u64 fwd_rate; 84762306a36Sopenharmony_ci}; 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci/** Stats for each NIC port in RX direction. */ 85062306a36Sopenharmony_cistruct nic_tx_stats { 85162306a36Sopenharmony_ci /* link-level stats */ 85262306a36Sopenharmony_ci u64 total_pkts_sent; /* Total frames sent on the interface */ 85362306a36Sopenharmony_ci u64 total_bytes_sent; /* Total octets sent on the interface */ 85462306a36Sopenharmony_ci u64 mcast_pkts_sent; /* Packets sent to the multicast DMAC */ 85562306a36Sopenharmony_ci u64 bcast_pkts_sent; /* Packets sent to a broadcast DMAC */ 85662306a36Sopenharmony_ci u64 ctl_sent; /* Control/PAUSE packets sent */ 85762306a36Sopenharmony_ci u64 one_collision_sent; /* Packets sent that experienced a 85862306a36Sopenharmony_ci * single collision before successful 85962306a36Sopenharmony_ci * transmission 86062306a36Sopenharmony_ci **/ 86162306a36Sopenharmony_ci u64 multi_collision_sent; /* Packets sent that experienced 86262306a36Sopenharmony_ci * multiple collisions before successful 86362306a36Sopenharmony_ci * transmission 86462306a36Sopenharmony_ci **/ 86562306a36Sopenharmony_ci u64 max_collision_fail; /* Packets dropped due to excessive 86662306a36Sopenharmony_ci * collisions 86762306a36Sopenharmony_ci **/ 86862306a36Sopenharmony_ci u64 max_deferral_fail; /* Packets not sent due to max 86962306a36Sopenharmony_ci * deferrals 87062306a36Sopenharmony_ci **/ 87162306a36Sopenharmony_ci u64 fifo_err; /* Packets sent that experienced a 87262306a36Sopenharmony_ci * transmit underflow and were 87362306a36Sopenharmony_ci * truncated 87462306a36Sopenharmony_ci **/ 87562306a36Sopenharmony_ci u64 runts; /* Packets sent with an octet count 87662306a36Sopenharmony_ci * lessthan 64 87762306a36Sopenharmony_ci **/ 87862306a36Sopenharmony_ci u64 total_collisions; /* Packets dropped due to excessive 87962306a36Sopenharmony_ci * collisions 88062306a36Sopenharmony_ci **/ 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci /* firmware stats */ 88362306a36Sopenharmony_ci u64 fw_total_sent; 88462306a36Sopenharmony_ci u64 fw_total_fwd; 88562306a36Sopenharmony_ci u64 fw_total_fwd_bytes; 88662306a36Sopenharmony_ci u64 fw_total_mcast_sent; 88762306a36Sopenharmony_ci u64 fw_total_bcast_sent; 88862306a36Sopenharmony_ci u64 fw_err_pko; 88962306a36Sopenharmony_ci u64 fw_err_link; 89062306a36Sopenharmony_ci u64 fw_err_drop; 89162306a36Sopenharmony_ci u64 fw_err_tso; 89262306a36Sopenharmony_ci u64 fw_tso; /* number of tso requests */ 89362306a36Sopenharmony_ci u64 fw_tso_fwd; /* number of packets segmented in tso */ 89462306a36Sopenharmony_ci u64 fw_tx_vxlan; 89562306a36Sopenharmony_ci u64 fw_err_pki; 89662306a36Sopenharmony_ci}; 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_cistruct oct_link_stats { 89962306a36Sopenharmony_ci struct nic_rx_stats fromwire; 90062306a36Sopenharmony_ci struct nic_tx_stats fromhost; 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_ci}; 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_cistatic inline int opcode_slow_path(union octeon_rh *rh) 90562306a36Sopenharmony_ci{ 90662306a36Sopenharmony_ci u16 subcode1, subcode2; 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci subcode1 = OPCODE_SUBCODE((rh)->r.opcode, (rh)->r.subcode); 90962306a36Sopenharmony_ci subcode2 = OPCODE_SUBCODE(OPCODE_NIC, OPCODE_NIC_NW_DATA); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci return (subcode2 != subcode1); 91262306a36Sopenharmony_ci} 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci#define LIO68XX_LED_CTRL_ADDR 0x3501 91562306a36Sopenharmony_ci#define LIO68XX_LED_CTRL_CFGON 0x1f 91662306a36Sopenharmony_ci#define LIO68XX_LED_CTRL_CFGOFF 0x100 91762306a36Sopenharmony_ci#define LIO68XX_LED_BEACON_ADDR 0x3508 91862306a36Sopenharmony_ci#define LIO68XX_LED_BEACON_CFGON 0x47fd 91962306a36Sopenharmony_ci#define LIO68XX_LED_BEACON_CFGOFF 0x11fc 92062306a36Sopenharmony_ci#define VITESSE_PHY_GPIO_DRIVEON 0x1 92162306a36Sopenharmony_ci#define VITESSE_PHY_GPIO_CFG 0x8 92262306a36Sopenharmony_ci#define VITESSE_PHY_GPIO_DRIVEOFF 0x4 92362306a36Sopenharmony_ci#define VITESSE_PHY_GPIO_HIGH 0x2 92462306a36Sopenharmony_ci#define VITESSE_PHY_GPIO_LOW 0x3 92562306a36Sopenharmony_ci#define LED_IDENTIFICATION_ON 0x1 92662306a36Sopenharmony_ci#define LED_IDENTIFICATION_OFF 0x0 92762306a36Sopenharmony_ci#define LIO23XX_COPPERHEAD_LED_GPIO 0x2 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_cistruct oct_mdio_cmd { 93062306a36Sopenharmony_ci u64 op; 93162306a36Sopenharmony_ci u64 mdio_addr; 93262306a36Sopenharmony_ci u64 value1; 93362306a36Sopenharmony_ci u64 value2; 93462306a36Sopenharmony_ci u64 value3; 93562306a36Sopenharmony_ci}; 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci#define OCT_LINK_STATS_SIZE (sizeof(struct oct_link_stats)) 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_cistruct oct_intrmod_cfg { 94062306a36Sopenharmony_ci u64 rx_enable; 94162306a36Sopenharmony_ci u64 tx_enable; 94262306a36Sopenharmony_ci u64 check_intrvl; 94362306a36Sopenharmony_ci u64 maxpkt_ratethr; 94462306a36Sopenharmony_ci u64 minpkt_ratethr; 94562306a36Sopenharmony_ci u64 rx_maxcnt_trigger; 94662306a36Sopenharmony_ci u64 rx_mincnt_trigger; 94762306a36Sopenharmony_ci u64 rx_maxtmr_trigger; 94862306a36Sopenharmony_ci u64 rx_mintmr_trigger; 94962306a36Sopenharmony_ci u64 tx_mincnt_trigger; 95062306a36Sopenharmony_ci u64 tx_maxcnt_trigger; 95162306a36Sopenharmony_ci u64 rx_frames; 95262306a36Sopenharmony_ci u64 tx_frames; 95362306a36Sopenharmony_ci u64 rx_usecs; 95462306a36Sopenharmony_ci}; 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci#define BASE_QUEUE_NOT_REQUESTED 65535 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ciunion oct_nic_if_cfg { 95962306a36Sopenharmony_ci u64 u64; 96062306a36Sopenharmony_ci struct { 96162306a36Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 96262306a36Sopenharmony_ci u64 base_queue:16; 96362306a36Sopenharmony_ci u64 num_iqueues:16; 96462306a36Sopenharmony_ci u64 num_oqueues:16; 96562306a36Sopenharmony_ci u64 gmx_port_id:8; 96662306a36Sopenharmony_ci u64 vf_id:8; 96762306a36Sopenharmony_ci#else 96862306a36Sopenharmony_ci u64 vf_id:8; 96962306a36Sopenharmony_ci u64 gmx_port_id:8; 97062306a36Sopenharmony_ci u64 num_oqueues:16; 97162306a36Sopenharmony_ci u64 num_iqueues:16; 97262306a36Sopenharmony_ci u64 base_queue:16; 97362306a36Sopenharmony_ci#endif 97462306a36Sopenharmony_ci } s; 97562306a36Sopenharmony_ci}; 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_cistruct lio_trusted_vf { 97862306a36Sopenharmony_ci uint64_t active: 1; 97962306a36Sopenharmony_ci uint64_t id : 8; 98062306a36Sopenharmony_ci uint64_t reserved: 55; 98162306a36Sopenharmony_ci}; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_cistruct lio_time { 98462306a36Sopenharmony_ci s64 sec; /* seconds */ 98562306a36Sopenharmony_ci s64 nsec; /* nanoseconds */ 98662306a36Sopenharmony_ci}; 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_cistruct lio_vf_rep_stats { 98962306a36Sopenharmony_ci u64 tx_packets; 99062306a36Sopenharmony_ci u64 tx_bytes; 99162306a36Sopenharmony_ci u64 tx_dropped; 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_ci u64 rx_packets; 99462306a36Sopenharmony_ci u64 rx_bytes; 99562306a36Sopenharmony_ci u64 rx_dropped; 99662306a36Sopenharmony_ci}; 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cienum lio_vf_rep_req_type { 99962306a36Sopenharmony_ci LIO_VF_REP_REQ_NONE, 100062306a36Sopenharmony_ci LIO_VF_REP_REQ_STATE, 100162306a36Sopenharmony_ci LIO_VF_REP_REQ_MTU, 100262306a36Sopenharmony_ci LIO_VF_REP_REQ_STATS, 100362306a36Sopenharmony_ci LIO_VF_REP_REQ_DEVNAME 100462306a36Sopenharmony_ci}; 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_cienum { 100762306a36Sopenharmony_ci LIO_VF_REP_STATE_DOWN, 100862306a36Sopenharmony_ci LIO_VF_REP_STATE_UP 100962306a36Sopenharmony_ci}; 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci#define LIO_IF_NAME_SIZE 16 101262306a36Sopenharmony_cistruct lio_vf_rep_req { 101362306a36Sopenharmony_ci u8 req_type; 101462306a36Sopenharmony_ci u8 ifidx; 101562306a36Sopenharmony_ci u8 rsvd[6]; 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci union { 101862306a36Sopenharmony_ci struct lio_vf_rep_name { 101962306a36Sopenharmony_ci char name[LIO_IF_NAME_SIZE]; 102062306a36Sopenharmony_ci } rep_name; 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_ci struct lio_vf_rep_mtu { 102362306a36Sopenharmony_ci u32 mtu; 102462306a36Sopenharmony_ci u32 rsvd; 102562306a36Sopenharmony_ci } rep_mtu; 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci struct lio_vf_rep_state { 102862306a36Sopenharmony_ci u8 state; 102962306a36Sopenharmony_ci u8 rsvd[7]; 103062306a36Sopenharmony_ci } rep_state; 103162306a36Sopenharmony_ci }; 103262306a36Sopenharmony_ci}; 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_cistruct lio_vf_rep_resp { 103562306a36Sopenharmony_ci u64 rh; 103662306a36Sopenharmony_ci u8 status; 103762306a36Sopenharmony_ci u8 rsvd[7]; 103862306a36Sopenharmony_ci}; 103962306a36Sopenharmony_ci#endif 1040