diff --git a/cmake/AgentHwSwitchAsics.cmake b/cmake/AgentHwSwitchAsics.cmake index 35313c3ce32db..30ac0cefb8532 100644 --- a/cmake/AgentHwSwitchAsics.cmake +++ b/cmake/AgentHwSwitchAsics.cmake @@ -29,6 +29,7 @@ add_library(switch_asics fboss/agent/hw/switch_asics/ChenabAsic.cpp fboss/agent/hw/switch_asics/BroadcomXgsAsic.cpp fboss/agent/hw/switch_asics/G202xAsic.cpp + fboss/agent/hw/switch_asics/Q4DAsic.cpp ) target_link_libraries(switch_asics diff --git a/fboss/agent/ApplyThriftConfig.cpp b/fboss/agent/ApplyThriftConfig.cpp index ec0ed70bb3e31..e8449732e7288 100644 --- a/fboss/agent/ApplyThriftConfig.cpp +++ b/fboss/agent/ApplyThriftConfig.cpp @@ -1175,6 +1175,7 @@ void ThriftConfigApplier::processUpdatedDsfNodes() { asicCore = 1; break; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: if (isDualStage3Q2QMode()) { asicCore = 447; } else { diff --git a/fboss/agent/AsicUtils.cpp b/fboss/agent/AsicUtils.cpp index 31261bdabcd90..c3d0dc9f8b900 100644 --- a/fboss/agent/AsicUtils.cpp +++ b/fboss/agent/AsicUtils.cpp @@ -10,6 +10,7 @@ #include "fboss/agent/AsicUtils.h" #include "fboss/agent/hw/switch_asics/Jericho2Asic.h" #include "fboss/agent/hw/switch_asics/Jericho3Asic.h" +#include "fboss/agent/hw/switch_asics/Q4DAsic.h" #include "fboss/agent/hw/switch_asics/Ramon3Asic.h" #include "fboss/agent/hw/switch_asics/RamonAsic.h" @@ -39,6 +40,11 @@ const HwAsic& getHwAsicForAsicType(const cfg::AsicType& asicType) { static Jericho3Asic jericho3Asic{switchId, switchInfo}; return jericho3Asic; } + case cfg::AsicType::ASIC_TYPE_Q4D: { + switchInfo.switchType() = cfg::SwitchType::VOQ; + static Q4DAsic q4dAsic{switchId, switchInfo}; + return q4dAsic; + } case cfg::AsicType::ASIC_TYPE_RAMON: { switchInfo.switchType() = cfg::SwitchType::FABRIC; static RamonAsic ramonAsic{switchId, switchInfo}; @@ -82,6 +88,8 @@ uint32_t getFabricPortsPerVirtualDevice(const cfg::AsicType asicType) { return 192; case cfg::AsicType::ASIC_TYPE_JERICHO3: return 160; + case cfg::AsicType::ASIC_TYPE_Q4D: + return 160; case cfg::AsicType::ASIC_TYPE_RAMON3: return 256; case cfg::AsicType::ASIC_TYPE_FAKE: diff --git a/fboss/agent/PortUpdateHandler.cpp b/fboss/agent/PortUpdateHandler.cpp index b4e48da1052fb..5f8238ca6698c 100644 --- a/fboss/agent/PortUpdateHandler.cpp +++ b/fboss/agent/PortUpdateHandler.cpp @@ -299,6 +299,7 @@ void PortUpdateHandler::computeFabricOverdrainPct(const StateDelta& delta) { case cfg::AsicType::ASIC_TYPE_JERICHO2: return 1.12; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: return 1.06; case cfg::AsicType::ASIC_TYPE_MOCK: case cfg::AsicType::ASIC_TYPE_FAKE: diff --git a/fboss/agent/hw/bcm/BcmFieldProcessorUtils.cpp b/fboss/agent/hw/bcm/BcmFieldProcessorUtils.cpp index 832dd37702a53..c59e5d1bbb28d 100644 --- a/fboss/agent/hw/bcm/BcmFieldProcessorUtils.cpp +++ b/fboss/agent/hw/bcm/BcmFieldProcessorUtils.cpp @@ -543,6 +543,7 @@ bool needsExtraFPQsetQualifiers(cfg::AsicType asicType) { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_G202X: diff --git a/fboss/agent/hw/bcm/BcmSwitch.cpp b/fboss/agent/hw/bcm/BcmSwitch.cpp index 8517f3ff18211..923f8bbb9609a 100644 --- a/fboss/agent/hw/bcm/BcmSwitch.cpp +++ b/fboss/agent/hw/bcm/BcmSwitch.cpp @@ -4222,6 +4222,7 @@ void BcmSwitch::disableHotSwap() const { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_G202X: diff --git a/fboss/agent/hw/bcm/tests/HwTestTamUtils.cpp b/fboss/agent/hw/bcm/tests/HwTestTamUtils.cpp index 34ed3b111dcc9..ea8e416dec057 100644 --- a/fboss/agent/hw/bcm/tests/HwTestTamUtils.cpp +++ b/fboss/agent/hw/bcm/tests/HwTestTamUtils.cpp @@ -20,6 +20,7 @@ void triggerParityError(HwSwitchEnsemble* ensemble) { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_EBRO: diff --git a/fboss/agent/hw/bcm/tests/HwTestTamUtilsThriftHandler.cpp b/fboss/agent/hw/bcm/tests/HwTestTamUtilsThriftHandler.cpp index 5d71acdd08818..83d4dc19182fe 100644 --- a/fboss/agent/hw/bcm/tests/HwTestTamUtilsThriftHandler.cpp +++ b/fboss/agent/hw/bcm/tests/HwTestTamUtilsThriftHandler.cpp @@ -19,6 +19,7 @@ void HwTestThriftHandler::triggerParityError() { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_EBRO: diff --git a/fboss/agent/hw/sai/hw_test/HwTestTamUtils.cpp b/fboss/agent/hw/sai/hw_test/HwTestTamUtils.cpp index 3629cf64fd3db..c87f40203009d 100644 --- a/fboss/agent/hw/sai/hw_test/HwTestTamUtils.cpp +++ b/fboss/agent/hw/sai/hw_test/HwTestTamUtils.cpp @@ -141,6 +141,7 @@ void triggerParityError(HwSwitchEnsemble* ensemble) { triggerBcmJericho2ParityError(ensemble); break; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: triggerBcmJericho3ParityError(ensemble); break; case cfg::AsicType::ASIC_TYPE_CHENAB: diff --git a/fboss/agent/hw/sai/hw_test/HwTestTamUtilsThriftHandler.cpp b/fboss/agent/hw/sai/hw_test/HwTestTamUtilsThriftHandler.cpp index 357d8f02d4806..5cced993ac763 100644 --- a/fboss/agent/hw/sai/hw_test/HwTestTamUtilsThriftHandler.cpp +++ b/fboss/agent/hw/sai/hw_test/HwTestTamUtilsThriftHandler.cpp @@ -236,6 +236,7 @@ void HwTestThriftHandler::triggerParityError() { triggerBcmJericho2ParityError(hwSwitch_); break; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: triggerBcmJericho3ParityError(hwSwitch_); break; case cfg::AsicType::ASIC_TYPE_CHENAB: diff --git a/fboss/agent/hw/sai/switch/SaiAclTableManager.cpp b/fboss/agent/hw/sai/switch/SaiAclTableManager.cpp index 30ceb503f6f29..a1e703fa28e41 100644 --- a/fboss/agent/hw/sai/switch/SaiAclTableManager.cpp +++ b/fboss/agent/hw/sai/switch/SaiAclTableManager.cpp @@ -1682,8 +1682,9 @@ std::set SaiAclTableManager::getSupportedQualifierSet( platform_->getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_TRIDENT2; bool isJericho2 = platform_->getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO2; - bool isJericho3 = - platform_->getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO3; + bool isJericho3 = platform_->getAsic()->getAsicType() == + cfg::AsicType::ASIC_TYPE_JERICHO3 || + platform_->getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_Q4D; bool isTomahawk5 = platform_->getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_TOMAHAWK5; bool isChenab = diff --git a/fboss/agent/hw/sai/switch/SaiBufferManager.cpp b/fboss/agent/hw/sai/switch/SaiBufferManager.cpp index 31742f7d3af7a..a63a6be974742 100644 --- a/fboss/agent/hw/sai/switch/SaiBufferManager.cpp +++ b/fboss/agent/hw/sai/switch/SaiBufferManager.cpp @@ -109,6 +109,7 @@ void assertMaxBufferPoolSize(const SaiPlatform* platform) { break; case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_TRIDENT2: CHECK_EQ(maxEgressPoolSize, availableBuffer); break; @@ -201,6 +202,7 @@ uint64_t SaiBufferManager::getMaxEgressPoolBytes(const SaiPlatform* platform) { } case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: /* * XXX: TODO: Need to check if there is a way to compute the * buffers available for use in Jericho2 without using the diff --git a/fboss/agent/hw/sai/switch/SaiPortManager.cpp b/fboss/agent/hw/sai/switch/SaiPortManager.cpp index 30897e2a51805..f261e01f1b3ad 100644 --- a/fboss/agent/hw/sai/switch/SaiPortManager.cpp +++ b/fboss/agent/hw/sai/switch/SaiPortManager.cpp @@ -611,6 +611,7 @@ int getWorstCaseAssumedOpticsDelayNS( case cfg::AsicType::ASIC_TYPE_G202X: break; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: if (portType == cfg::PortType::FABRIC_PORT) { return 110; } else { diff --git a/fboss/agent/hw/sai/switch/SaiVirtualRouterManager.cpp b/fboss/agent/hw/sai/switch/SaiVirtualRouterManager.cpp index 93d52d0ad656c..3d7282a20e254 100644 --- a/fboss/agent/hw/sai/switch/SaiVirtualRouterManager.cpp +++ b/fboss/agent/hw/sai/switch/SaiVirtualRouterManager.cpp @@ -110,6 +110,7 @@ SaiVirtualRouterManager::createMplsRouterInterface(VirtualRouterSaiId vrId) { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_CHENAB: diff --git a/fboss/agent/hw/switch_asics/HwAsic.cpp b/fboss/agent/hw/switch_asics/HwAsic.cpp index 676391b85d34d..087af1078dcba 100644 --- a/fboss/agent/hw/switch_asics/HwAsic.cpp +++ b/fboss/agent/hw/switch_asics/HwAsic.cpp @@ -19,6 +19,7 @@ #include "fboss/agent/hw/switch_asics/Jericho2Asic.h" #include "fboss/agent/hw/switch_asics/Jericho3Asic.h" #include "fboss/agent/hw/switch_asics/MockAsic.h" +#include "fboss/agent/hw/switch_asics/Q4DAsic.h" #include "fboss/agent/hw/switch_asics/Ramon3Asic.h" #include "fboss/agent/hw/switch_asics/RamonAsic.h" #include "fboss/agent/hw/switch_asics/Tomahawk3Asic.h" @@ -120,6 +121,8 @@ std::unique_ptr HwAsic::makeAsic( return std::make_unique(switchId, switchInfo, sdkVersion); case cfg::AsicType::ASIC_TYPE_JERICHO3: return std::make_unique(switchId, switchInfo, sdkVersion); + case cfg::AsicType::ASIC_TYPE_Q4D: + return std::make_unique(switchId, switchInfo, sdkVersion); case cfg::AsicType::ASIC_TYPE_RAMON: return std::make_unique(switchId, switchInfo, sdkVersion); case cfg::AsicType::ASIC_TYPE_RAMON3: diff --git a/fboss/agent/hw/switch_asics/Q4DAsic.cpp b/fboss/agent/hw/switch_asics/Q4DAsic.cpp new file mode 100644 index 0000000000000..62f039141f105 --- /dev/null +++ b/fboss/agent/hw/switch_asics/Q4DAsic.cpp @@ -0,0 +1,255 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#include "fboss/agent/hw/switch_asics/Q4DAsic.h" +#include +#include "fboss/agent/AgentFeatures.h" + +namespace facebook::fboss { + +bool Q4DAsic::isSupported(Feature feature) const { + switch (feature) { + case HwAsic::Feature::OBJECT_KEY_CACHE: + case HwAsic::Feature::PKTIO: + case HwAsic::Feature::HOSTTABLE: + case HwAsic::Feature::OBM_COUNTERS: + case HwAsic::Feature::MIRROR_PACKET_TRUNCATION: + case HwAsic::Feature::SFLOW_SAMPLING: + case HwAsic::Feature::TELEMETRY_AND_MONITORING: + case HwAsic::Feature::WIDE_ECMP: + case HwAsic::Feature::ALPM_ROUTE_PROJECTION: + case HwAsic::Feature::MAC_AGING: + case HwAsic::Feature::SAI_PORT_SPEED_CHANGE: // CS00011784917 + case HwAsic::Feature::EGRESS_MIRRORING: + case HwAsic::Feature::EGRESS_SFLOW: + case HwAsic::Feature::DEFAULT_VLAN: + case HwAsic::Feature::CPU_PORT: + case HwAsic::Feature::CPU_QUEUES: + case HwAsic::Feature::VRF: + case HwAsic::Feature::SAI_HASH_FIELDS_CLEAR_BEFORE_SET: + case HwAsic::Feature::SAI_WEIGHTED_NEXTHOPGROUP_MEMBER: + case HwAsic::Feature::PORT_TX_DISABLE: + case HwAsic::Feature::SAI_PORT_ERR_STATUS: + case HwAsic::Feature::ROUTE_PROGRAMMING: + case HwAsic::Feature::FABRIC_PORTS: + case HwAsic::Feature::LINK_TRAINING: + case HwAsic::Feature::FEC: + case HwAsic::Feature::SAI_TTL0_PACKET_FORWARD_ENABLE: + case HwAsic::Feature::PMD_RX_LOCK_STATUS: + case HwAsic::Feature::PMD_RX_SIGNAL_DETECT: + case HwAsic::Feature::MEDIA_TYPE: + case HwAsic::Feature::PORT_FABRIC_ISOLATE: + case HwAsic::Feature::CPU_TX_VIA_RECYCLE_PORT: + case HwAsic::Feature::SWITCH_DROP_STATS: + case HwAsic::Feature::PACKET_INTEGRITY_DROP_STATS: + case HwAsic::Feature::SAI_CONFIGURE_SIX_TAP: + case HwAsic::Feature::DRAM_ENQUEUE_DEQUEUE_STATS: + case HwAsic::Feature::RESOURCE_USAGE_STATS: + case HwAsic::Feature::SAI_FEC_COUNTERS: + case HwAsic::Feature::SAI_FEC_CORRECTED_BITS: + case HwAsic::Feature::BLACKHOLE_ROUTE_DROP_COUNTER: + case HwAsic::Feature::ECN: + case HwAsic::Feature::SAI_ECN_WRED: + case HwAsic::Feature::QUEUE_ECN_COUNTER: + case HwAsic::Feature::MANAGEMENT_PORT: + case HwAsic::Feature::ANY_ACL_DROP_COUNTER: + case HwAsic::Feature::EGRESS_FORWARDING_DROP_COUNTER: + case HwAsic::Feature::ACL_COUNTER_LABEL: + case HwAsic::Feature::SWITCH_ATTR_INGRESS_ACL: + case HwAsic::Feature::ACL_TABLE_GROUP: + case HwAsic::Feature::ERSPANv4: + case HwAsic::Feature::ERSPANv6: + case HwAsic::Feature::RCI_WATERMARK_COUNTER: + case HwAsic::Feature::SAI_ACL_ENTRY_SRC_PORT_QUALIFIER: + case HwAsic::Feature::SAI_PRBS: + case HwAsic::Feature::PORT_SERDES_ZERO_PREEMPHASIS: + case HwAsic::Feature::LINK_ACTIVE_INACTIVE_NOTIFY: + case HwAsic::Feature::WARMBOOT: + case HwAsic::Feature::PQP_ERROR_EGRESS_DROP_COUNTER: + case HwAsic::Feature::FABRIC_LINK_DOWN_CELL_DROP_COUNTER: + case HwAsic::Feature::CRC_ERROR_DETECT: + case HwAsic::Feature::ACL_METADATA_QUALIFER: + case HwAsic::Feature::EVENTOR_PORT_FOR_SFLOW: + case HwAsic::Feature::SFLOWv6: + case HwAsic::Feature::ZERO_SDK_WRITE_WARMBOOT: + case HwAsic::Feature::SWITCH_REACHABILITY_CHANGE_NOTIFY: + case HwAsic::Feature::CABLE_PROPOGATION_DELAY: + case HwAsic::Feature::DRAM_BLOCK_TIME: + case HwAsic::Feature::VOQ_LATENCY_WATERMARK_BIN: + case HwAsic::Feature::ACL_ENTRY_ETHER_TYPE: + case HwAsic::Feature::ACL_BYTE_COUNTER: + case HwAsic::Feature::EGRESS_CORE_BUFFER_WATERMARK: + case HwAsic::Feature::DELETED_CREDITS_STAT: + case HwAsic::Feature::INGRESS_PRIORITY_GROUP_DROPPED_PACKETS: + case HwAsic::Feature::ROUTE_METADATA: + case HwAsic::Feature::NO_RX_REASON_TRAP: + case HwAsic::Feature::EGRESS_GVOQ_WATERMARK_BYTES: + case HwAsic::Feature::INGRESS_PRIORITY_GROUP_SHARED_WATERMARK: + case HwAsic::Feature::PORT_MTU_ERROR_TRAP: + case HwAsic::Feature::FAST_LLFC_COUNTER: + case HwAsic::Feature::INGRESS_SRAM_MIN_BUFFER_WATERMARK: + case HwAsic::Feature::FDR_FIFO_WATERMARK: + case HwAsic::Feature::EGRESS_CELL_ERROR_STATS: + case HwAsic::Feature::ECMP_MEMBER_WIDTH_INTROSPECTION: + case HwAsic::Feature::CPU_QUEUE_WATERMARK_STATS: + case HwAsic::Feature::SAMPLE_RATE_CONFIG_PER_MIRROR: + case HwAsic::Feature::SFLOW_SAMPLES_PACKING: + case HwAsic::Feature::VENDOR_SWITCH_NOTIFICATION: + case HwAsic::Feature::SDK_REGISTER_DUMP: + case HwAsic::Feature::FEC_ERROR_DETECT_ENABLE: + case HwAsic::Feature::BUFFER_POOL_HEADROOM_WATERMARK: + case HwAsic::Feature::SAI_SET_TC_WITH_USER_DEFINED_TRAP_CPU_ACTION: + case HwAsic::Feature::DRAM_DATAPATH_PACKET_ERROR_STATS: + case HwAsic::Feature::EGRESS_POOL_AVAILABLE_SIZE_ATTRIBUTE_SUPPORTED: + case HwAsic::Feature::VENDOR_SWITCH_CONGESTION_MANAGEMENT_ERRORS: + case HwAsic::Feature::ASIC_RESET_NOTIFICATIONS: + case HwAsic::Feature::RX_SERDES_PARAMETERS: + case HwAsic::Feature::BULK_CREATE_ECMP_MEMBER: + case HwAsic::Feature::TECH_SUPPORT: + case HwAsic::Feature::DRAM_QUARANTINED_BUFFER_STATS: + case HwAsic::Feature::FABRIC_LINK_MONITORING: + case HwAsic::Feature::TEMPERATURE_MONITORING: + return true; + // Features not expected to work on SIM + case HwAsic::Feature::SHARED_INGRESS_EGRESS_BUFFER_POOL: + case HwAsic::Feature::BUFFER_POOL: + case HwAsic::Feature::PFC: + case HwAsic::Feature::PFC_XON_TO_XOFF_COUNTER: + case HwAsic::Feature::SAI_PORT_SERDES_FIELDS_RESET: + case HwAsic::Feature::VOQ: + case HwAsic::Feature::FABRIC_TX_QUEUES: + case HwAsic::Feature::VOQ_DELETE_COUNTER: + case HwAsic::Feature::L3_QOS: + case HwAsic::Feature::TC_TO_QUEUE_QOS_MAP_ON_SYSTEM_PORT: + case HwAsic::Feature::CREDIT_WATCHDOG: + case HwAsic::Feature::SAI_PORT_SERDES_PROGRAMMING: + return getAsicMode() != AsicMode::ASIC_MODE_SIM; + // SIM specific features. + case HwAsic::Feature::SAI_PORT_ETHER_STATS: + case HwAsic::Feature::SLOW_STAT_UPDATE: + // supported only on the SIM + return getAsicMode() == AsicMode::ASIC_MODE_SIM; + case HwAsic::Feature::RESERVED_ENCAP_INDEX_RANGE: + case HwAsic::Feature::UDF_HASH_FIELD_QUERY: + case HwAsic::Feature::IN_PAUSE_INCREMENTS_DISCARDS: + case HwAsic::Feature::SAI_LAG_HASH: + case HwAsic::Feature::QOS_MAP_GLOBAL: + case HwAsic::Feature::QCM: + case HwAsic::Feature::SMAC_EQUALS_DMAC_CHECK_ENABLED: + case HwAsic::Feature::PORT_TTL_DECREMENT_DISABLE: + case HwAsic::Feature::PORT_INTERFACE_TYPE: + case HwAsic::Feature::WEIGHTED_NEXTHOPGROUP_MEMBER: + case HwAsic::Feature::HSDK: + case HwAsic::Feature::L3_EGRESS_MODE_AUTO_ENABLED: + case HwAsic::Feature::INGRESS_FIELD_PROCESSOR_FLEX_COUNTER: + case HwAsic::Feature::PENDING_L2_ENTRY: + case HwAsic::Feature::EGRESS_QUEUE_FLEX_COUNTER: + case HwAsic::Feature::INGRESS_L3_INTERFACE: + case HwAsic::Feature::NON_UNICAST_HASH: + case HwAsic::Feature::DETAILED_L2_UPDATE: + case HwAsic::Feature::COUNTER_REFRESH_INTERVAL: + case HwAsic::Feature::SFLOW_SHIM_VERSION_FIELD: + case HwAsic::Feature::REMOVE_PORTS_FOR_COLDBOOT: // CS00012066057 + case HwAsic::Feature::MACSEC: + case HwAsic::Feature::SAI_MPLS_QOS: + case HwAsic::Feature::EMPTY_ACL_MATCHER: + case HwAsic::Feature::ROUTE_FLEX_COUNTERS: + case HwAsic::Feature::FEC_DIAG_COUNTERS: + case HwAsic::Feature::SAI_ACL_TABLE_UPDATE: + case HwAsic::Feature::SAI_MPLS_TTL_1_TRAP: + case HwAsic::Feature::SAI_MPLS_LABEL_LOOKUP_FAIL_COUNTER: + case HwAsic::Feature::EXACT_MATCH: + case HwAsic::Feature::RX_FREQUENCY_PPM: + case HwAsic::Feature::SAI_FIRMWARE_PATH: + // On Q4D ASIC we don't create any vlans but rather + // associate RIFs directly with ports. Hence no bridge port + // is created (or supported for now). + case HwAsic::Feature::BRIDGE_PORT_8021Q: + case HwAsic::Feature::EXTENDED_FEC: + case HwAsic::Feature::SAI_RX_REASON_COUNTER: + case HwAsic::Feature::SAI_MPLS_INSEGMENT: + case HwAsic::Feature::XPHY_PORT_STATE_TOGGLE: + case HwAsic::Feature::SAI_PORT_GET_PMD_LANES: + case HwAsic::Feature::SAI_PORT_VCO_CHANGE: + case HwAsic::Feature::ARS: + case HwAsic::Feature::P4_WARMBOOT: + case HwAsic::Feature::FEC_AM_LOCK_STATUS: + case HwAsic::Feature::PCS_RX_LINK_STATUS: + case HwAsic::Feature::SAI_CONFIGURE_SEVEN_TAP: + case HwAsic::Feature::SAI_SAMPLEPACKET_TRAP: + case HwAsic::Feature::SAI_UDF_HASH: + case HwAsic::Feature::PTP_TC: + case HwAsic::Feature::PTP_TC_PCS: + case HwAsic::Feature::INGRESS_PRIORITY_GROUP_HEADROOM_WATERMARK: + case HwAsic::Feature::RX_LANE_SQUELCH_ENABLE: + case HwAsic::Feature::SEPARATE_BYTE_AND_PACKET_ACL_COUNTER: + case HwAsic::Feature::ARS_PORT_ATTRIBUTES: + case HwAsic::Feature::ARS_ALTERNATE_MEMBERS: + case HwAsic::Feature::SAI_EAPOL_TRAP: + case HwAsic::Feature::SAI_USER_DEFINED_TRAP: + case HwAsic::Feature::PORT_EYE_VALUES: + case HwAsic::Feature::ECMP_DLB_OFFSET: + case HwAsic::Feature::SPAN: + case HwAsic::Feature::SFLOWv4: + case HwAsic::Feature::MPLS: + case HwAsic::Feature::MPLS_ECMP: + case HwAsic::Feature::RX_SNR: + case HwAsic::Feature::FEC_CORRECTED_BITS: + case HwAsic::Feature::ROUTE_COUNTERS: + // J3-AI natively supports hashing. So hash configuration is not supported. + case HwAsic::Feature::HASH_FIELDS_CUSTOMIZATION: + case HwAsic::Feature::ECMP_HASH_V4: + case HwAsic::Feature::ECMP_HASH_V6: + case HwAsic::Feature::TRAFFIC_HASHING: + case HwAsic::Feature::PORT_WRED_COUNTER: + case HwAsic::Feature::DTL_WATERMARK_COUNTER: + case HwAsic::Feature::MULTIPLE_ACL_TABLES: + case HwAsic::Feature::SAI_ECMP_HASH_ALGORITHM: + case HwAsic::Feature::SCHEDULER_PPS: + case HwAsic::Feature::DATA_CELL_FILTER: + case HwAsic::Feature::MULTIPLE_EGRESS_BUFFER_POOL: + case HwAsic::Feature::ENABLE_DELAY_DROP_CONGESTION_THRESHOLD: + case HwAsic::Feature::L3_MTU_ERROR_TRAP: + case HwAsic::Feature::L3_INTF_MTU: + case HwAsic::Feature::DEDICATED_CPU_BUFFER_POOL: + case HwAsic::Feature::INGRESS_POST_LOOKUP_ACL_TABLE: + case HwAsic::Feature::SAI_HOST_MISS_TRAP: + case HwAsic::Feature::CPU_TX_PACKET_REQUIRES_VLAN_TAG: + case HwAsic::Feature::SWITCH_ASIC_SDK_HEALTH_NOTIFY: + case HwAsic::Feature::PFC_WATCHDOG_TIMER_GRANULARITY: + case HwAsic::Feature::SAI_PORT_IN_CONGESTION_DISCARDS: + case HwAsic::Feature::ROUTER_INTERFACE_STATISTICS: + case HwAsic::Feature::CPU_PORT_EGRESS_BUFFER_POOL: + case HwAsic::Feature::ACL_SET_ECMP_HASH_ALGORITHM: + case HwAsic::Feature::SET_NEXT_HOP_GROUP_HASH_ALGORITHM: + case HwAsic::Feature::MANAGEMENT_PORT_MULTICAST_QUEUE_ALPHA: + case HwAsic::Feature::SAI_PORT_PG_DROP_STATUS: + case HwAsic::Feature::FABRIC_INTER_CELL_JITTER_WATERMARK: + case HwAsic::Feature::MAC_TRANSMIT_DATA_QUEUE_WATERMARK: + /* + * Q4D does not support NEXTHOP_TTL_DECREMENT_DISABLE. Similar effect is + * achieved by configuring to forward TTL0 packets by enabling + * SAI_TTL0_PACKET_FORWARD_ENABLE. + */ + case HwAsic::Feature::NEXTHOP_TTL_DECREMENT_DISABLE: + case HwAsic::Feature::RESERVED_BYTES_FOR_BUFFER_POOL: + case HwAsic::Feature::INGRESS_BUFFER_POOL_SIZE_EXCLUDES_HEADROOM: + case HwAsic::Feature::IN_DISCARDS_EXCLUDES_PFC: + case HwAsic::Feature::PORT_LEVEL_BUFFER_CONFIGURATION_SUPPORT: + case HwAsic::Feature::SAI_SERDES_RX_REACH: + case HwAsic::Feature::SAI_SERDES_PRECODING: + case HwAsic::Feature::ARS_FUTURE_PORT_LOAD: + case HwAsic::Feature::ECN_PROBABILISTIC_MARKING: + case HwAsic::Feature::SWITCH_DROP_DEBUG_COUNTER: + // Disabling ANY_TRAP_DROP_COUNTER for the time being. + // This will result in an early return in + // SaiDebugCounterManager::setupTrapDropCounter(), which is currently + // failing with SAI 14.x + case HwAsic::Feature::ANY_TRAP_DROP_COUNTER: + case HwAsic::Feature::SAI_FEC_CODEWORDS_STATS: + case HwAsic::Feature::LINK_INACTIVE_BASED_ISOLATE: + return false; + } + return false; +} + +} // namespace facebook::fboss diff --git a/fboss/agent/hw/switch_asics/Q4DAsic.h b/fboss/agent/hw/switch_asics/Q4DAsic.h new file mode 100644 index 0000000000000..f36e6b47f0973 --- /dev/null +++ b/fboss/agent/hw/switch_asics/Q4DAsic.h @@ -0,0 +1,33 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#pragma once + +#include +#include "fboss/agent/hw/switch_asics/Jericho3Asic.h" + +namespace facebook::fboss { + +class Q4DAsic : public Jericho3Asic { + public: + Q4DAsic( + std::optional switchId, + cfg::SwitchInfo switchInfo, + std::optional sdkVersion = std::nullopt) + : Jericho3Asic(switchId, switchInfo, sdkVersion) {} + + bool isSupported(Feature) const override; + + cfg::AsicType getAsicType() const override { + return cfg::AsicType::ASIC_TYPE_Q4D; + } + + cfg::PortSpeed getMaxPortSpeed() const override { + return cfg::PortSpeed::EIGHTHUNDREDG; + } + + uint32_t getNumCores() const override { + return 8; + } +}; + +} // namespace facebook::fboss diff --git a/fboss/agent/hw/test/HwHashPolarizationTestUtils.cpp b/fboss/agent/hw/test/HwHashPolarizationTestUtils.cpp index bc48f906f5c64..e2e4aa38b0d57 100644 --- a/fboss/agent/hw/test/HwHashPolarizationTestUtils.cpp +++ b/fboss/agent/hw/test/HwHashPolarizationTestUtils.cpp @@ -57,6 +57,7 @@ std::unique_ptr> getFullHashedPackets( case cfg::AsicType::ASIC_TYPE_AGERA3: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_G202X: @@ -88,6 +89,7 @@ std::unique_ptr> getFullHashedPackets( case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_G202X: diff --git a/fboss/agent/hw/test/dataplane_tests/HwProdInvariantHelper.cpp b/fboss/agent/hw/test/dataplane_tests/HwProdInvariantHelper.cpp index efc3ee16d28c7..10fc998676d73 100644 --- a/fboss/agent/hw/test/dataplane_tests/HwProdInvariantHelper.cpp +++ b/fboss/agent/hw/test/dataplane_tests/HwProdInvariantHelper.cpp @@ -174,6 +174,7 @@ void HwProdInvariantHelper::verifySafeDiagCmds() { case cfg::AsicType::ASIC_TYPE_SANDIA_PHY: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_TOMAHAWK5: diff --git a/fboss/agent/platforms/sai/SaiPlatform.cpp b/fboss/agent/platforms/sai/SaiPlatform.cpp index b0e0ba95d1352..997b46c276b22 100644 --- a/fboss/agent/platforms/sai/SaiPlatform.cpp +++ b/fboss/agent/platforms/sai/SaiPlatform.cpp @@ -17,6 +17,7 @@ #include "fboss/agent/hw/sai/switch/SaiSwitch.h" #include "fboss/agent/hw/switch_asics/HwAsic.h" #include "fboss/agent/hw/switch_asics/Jericho3Asic.h" +#include "fboss/agent/hw/switch_asics/Q4DAsic.h" #include "fboss/agent/platforms/sai/SaiBcmDarwinPlatformPort.h" #include "fboss/agent/platforms/sai/SaiBcmElbertPlatformPort.h" #include "fboss/agent/platforms/sai/SaiBcmFujiPlatformPort.h" @@ -556,6 +557,7 @@ SaiSwitchTraits::CreateAttributes SaiPlatform::getSwitchAttributes( swInfo.switchType() = cfg::SwitchType::VOQ; swInfo.switchMac() = localMac.toString(); const Jericho3Asic j3(0, swInfo); + const Q4DAsic q4d(0, swInfo); for (const auto& [id, dsfNode] : *agentCfg->thrift.sw()->dsfNodes()) { if (dsfNode.type() != cfg::DsfNodeType::INTERFACE_NODE) { continue; @@ -568,6 +570,11 @@ SaiSwitchTraits::CreateAttributes SaiPlatform::getSwitchAttributes( maxSystemCoreCount = std::max(maxSystemCoreCount, uint32_t(id + j3.getNumCores())); break; + case cfg::AsicType::ASIC_TYPE_Q4D: + maxCoreCount = std::max(q4d.getNumCores(), maxCoreCount); + maxSystemCoreCount = + std::max(maxSystemCoreCount, uint32_t(id + q4d.getNumCores())); + break; default: throw FbossError("Unexpected asic type: ", *dsfNode.asicType()); } @@ -911,6 +918,13 @@ SaiSwitchTraits::CreateAttributes SaiPlatform::getSwitchAttributes( } #endif + // Q4D bringup - Override max sysports and voqs for Q4D standalone box. + if (getAsic()->getAsicType() == cfg::AsicType::ASIC_TYPE_Q4D) { + maxSystemPorts = 1024; + maxVoqs = 8 * 1024; + maxSystemPortId = 1024 - 1; + } + return { initSwitch, hwInfo, // hardware info diff --git a/fboss/agent/switch_config.thrift b/fboss/agent/switch_config.thrift index 0c8916c688ada..231006686b970 100644 --- a/fboss/agent/switch_config.thrift +++ b/fboss/agent/switch_config.thrift @@ -1543,6 +1543,7 @@ enum AsicType { ASIC_TYPE_G202X = 20, ASIC_TYPE_FAKE_NO_WARMBOOT = 21, ASIC_TYPE_TOMAHAWKULTRA1 = 22, + ASIC_TYPE_Q4D = 23, } /** * The configuration for an interface diff --git a/fboss/agent/test/agent_hw_tests/AgentDiagShellStressTests.cpp b/fboss/agent/test/agent_hw_tests/AgentDiagShellStressTests.cpp index 827e2b709e2b7..40b7953f62bd6 100644 --- a/fboss/agent/test/agent_hw_tests/AgentDiagShellStressTests.cpp +++ b/fboss/agent/test/agent_hw_tests/AgentDiagShellStressTests.cpp @@ -33,6 +33,7 @@ class AgentDiagShellStressTest : public AgentHwTest { // No diag shell to test for these ASICs break; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: runBcmDnxCmds(switchId); break; case cfg::AsicType::ASIC_TYPE_EBRO: diff --git a/fboss/agent/test/prod_agent_tests/ProdInvariantTests.cpp b/fboss/agent/test/prod_agent_tests/ProdInvariantTests.cpp index 3a83d95bfbb9f..8cc97365ccb03 100644 --- a/fboss/agent/test/prod_agent_tests/ProdInvariantTests.cpp +++ b/fboss/agent/test/prod_agent_tests/ProdInvariantTests.cpp @@ -373,6 +373,7 @@ void ProdInvariantTest::verifySafeDiagCommands() { case cfg::AsicType::ASIC_TYPE_AGERA3: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_TOMAHAWK5: diff --git a/fboss/agent/test/utils/ConfigUtils.cpp b/fboss/agent/test/utils/ConfigUtils.cpp index 4913f667a9998..625bb953789b2 100644 --- a/fboss/agent/test/utils/ConfigUtils.cpp +++ b/fboss/agent/test/utils/ConfigUtils.cpp @@ -87,7 +87,9 @@ int getSysPortIdsAllocated( std::optional platformType = std::nullopt) { auto portsConsumed = firstSwitchIdMin; auto deviceIndex = remoteSwitchId / asic.getNumCores(); - CHECK(asic.getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO3); + CHECK( + asic.getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO3 || + asic.getAsicType() == cfg::AsicType::ASIC_TYPE_Q4D); if (deviceIndex < getMaxRdsw(platformType)) { portsConsumed += deviceIndex * getRdswSysPortBlockSize(platformType) - 1; } else { diff --git a/fboss/agent/test/utils/CoppTestUtils.cpp b/fboss/agent/test/utils/CoppTestUtils.cpp index 3335aec4ce3cb..1016ca276fa96 100644 --- a/fboss/agent/test/utils/CoppTestUtils.cpp +++ b/fboss/agent/test/utils/CoppTestUtils.cpp @@ -119,6 +119,7 @@ uint16_t getCoppHighPriQueueId(const HwAsic* hwAsic) { case cfg::AsicType::ASIC_TYPE_YUBA: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_G202X: return 7; case cfg::AsicType::ASIC_TYPE_CHENAB: @@ -166,6 +167,7 @@ cfg::ToCpuAction getCpuActionType(const HwAsic* hwAsic) { return cfg::ToCpuAction::COPY; case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_CHENAB: return cfg::ToCpuAction::TRAP; case cfg::AsicType::ASIC_TYPE_ELBERT_8DD: @@ -246,7 +248,8 @@ cfg::PortQueueRate getPortQueueRate(const HwAsic* hwAsic, uint16_t queueId) { portQueueRate.pktsPerSec() = getRange(0, pps); } else { uint32_t kbps; - if (hwAsic->getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO3) { + if (hwAsic->getAsicType() == cfg::AsicType::ASIC_TYPE_JERICHO3 || + hwAsic->getAsicType() == cfg::AsicType::ASIC_TYPE_Q4D) { kbps = kCoppDnxLowPriKbitsPerSec; } else { kbps = getCoppQueueKbpsFromPps(hwAsic, pps); diff --git a/fboss/agent/test/utils/InvariantTestUtils.cpp b/fboss/agent/test/utils/InvariantTestUtils.cpp index cbcbe8039dc31..92d27cb81fc21 100644 --- a/fboss/agent/test/utils/InvariantTestUtils.cpp +++ b/fboss/agent/test/utils/InvariantTestUtils.cpp @@ -46,6 +46,7 @@ void verifySafeDiagCmds(TestEnsembleIf* ensemble) { case cfg::AsicType::ASIC_TYPE_AGERA3: case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: case cfg::AsicType::ASIC_TYPE_RAMON: case cfg::AsicType::ASIC_TYPE_RAMON3: case cfg::AsicType::ASIC_TYPE_TOMAHAWK5: diff --git a/fboss/agent/test/utils/PfcTestUtils.cpp b/fboss/agent/test/utils/PfcTestUtils.cpp index 3602f1c841727..cf8aac4358933 100644 --- a/fboss/agent/test/utils/PfcTestUtils.cpp +++ b/fboss/agent/test/utils/PfcTestUtils.cpp @@ -261,6 +261,7 @@ PfcBufferParams PfcBufferParams::getPfcBufferParams( switch (asicType) { case cfg::AsicType::ASIC_TYPE_JERICHO2: case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: buffer.globalShared = kSmallGlobalSharedBytes; break; default: diff --git a/fboss/agent/test/utils/PortTestUtils.cpp b/fboss/agent/test/utils/PortTestUtils.cpp index 4b2be9794818a..81afcbcecef2d 100644 --- a/fboss/agent/test/utils/PortTestUtils.cpp +++ b/fboss/agent/test/utils/PortTestUtils.cpp @@ -186,6 +186,7 @@ cfg::PortSpeed getDefaultInterfaceSpeed(const cfg::AsicType& asicType) { case cfg::AsicType::ASIC_TYPE_JERICHO2: return cfg::PortSpeed::HUNDREDG; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: return cfg::PortSpeed::FOURHUNDREDG; default: throw FbossError( @@ -199,6 +200,7 @@ cfg::PortSpeed getDefaultFabricSpeed(const cfg::AsicType& asicType) { case cfg::AsicType::ASIC_TYPE_JERICHO2: return cfg::PortSpeed::FIFTYTHREEPOINTONETWOFIVEG; case cfg::AsicType::ASIC_TYPE_JERICHO3: + case cfg::AsicType::ASIC_TYPE_Q4D: return cfg::PortSpeed::HUNDREDANDSIXPOINTTWOFIVEG; default: throw FbossError( diff --git a/fboss/lib/platform_mapping_v2/platform_mapping_config.thrift b/fboss/lib/platform_mapping_v2/platform_mapping_config.thrift index e97a65d4ede66..9d5d0254edf26 100644 --- a/fboss/lib/platform_mapping_v2/platform_mapping_config.thrift +++ b/fboss/lib/platform_mapping_v2/platform_mapping_config.thrift @@ -34,6 +34,7 @@ enum CoreType { J3_EVT = 7, // J3 Eventor Port CHENAB_NIF = 8, TH6_NIF = 9, // TH6 + Q4D_NIF = 10, // Q4D // Transceivers OSFP = 100,