1 /* 2 * SPDX-FileCopyrightText: Copyright (c) 2020-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3 * SPDX-License-Identifier: MIT 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24 #ifndef _CCI_PRIV_NVSWITCH_H_ 25 #define _CCI_PRIV_NVSWITCH_H_ 26 27 #include "common_nvswitch.h" 28 29 #include "nvtypes.h" 30 #include "cci/cci_nvswitch.h" 31 #include "cci/cci_cdb_async_nvswitch.h" 32 #include "cci/cci_cables_nvswitch.h" 33 #include "soe/cci/cpld_machx03.h" 34 #include "soe/cci/cci_cmis.h" 35 36 // 37 // CCI is the top-level management state for all cable controllers on a device. 38 // The management tasks related to cable controllers is encapsulated by a PCS 39 // or Platform Cable System, for which CCI is largely a container. 40 // 41 42 #define NVSWITCH_CCI_LINK_NUM_MAX 64 43 #define NVSWITCH_CCI_OSFP_NUM_MAX 32 44 45 // Vendor specified number(Used across all LR10/LS10 systems) 46 #define NVSWITCH_CCI_CDB_CMD_ID 0xcd19 47 48 // LS10 Saved LED state 49 #define CCI_LED_STATE_LED_A CPLD_MACHXO3_LED_STATE_REG_LED_A 50 #define CCI_LED_STATE_LED_B CPLD_MACHXO3_LED_STATE_REG_LED_B 51 52 // Timeout for CMIS access locks 53 #define NVSWITCH_CCI_CMIS_LOCK_TIMEOUT (10 * NVSWITCH_INTERVAL_1SEC_IN_NS) 54 55 // Cable Controller Interface 56 struct CCI 57 { 58 // Links that are supported by CCI. The value here is defined in the BIOS 59 // and is a static property of the system. See repeater bit in NVLink. 60 NvU64 linkMask; 61 62 // ================================================================ 63 // === State below this line has been moved and can be deleted. === 64 // ================================================================ 65 66 // Other member variables specific to CCI go here 67 NvBool bDiscovered; 68 NvBool bSupported; 69 NvBool bInitialized; 70 NvU32 osfpMaskAll; // All the possible module positions 71 NvU32 osfpMaskPresent; // Currently present modules 72 NvU32 cagesMask; // All the possible module cage positions 73 NvU32 modulesMask; // Currently present modules(currently mirrors osfpMaskPresent) 74 NvU32 numLinks; 75 NVSWITCH_CCI_MODULE_LINK_LANE_MAP *osfp_map; 76 struct NVSWITCH_I2C_DEVICE_DESCRIPTOR *osfp_i2c_info; 77 NvU32 osfp_map_size; 78 NvU32 osfp_num; 79 80 struct { 81 void (*functionPtr)(struct nvswitch_device*); 82 NvU32 interval; 83 } callbackList[NVSWITCH_CCI_CALLBACK_NUM_MAX]; 84 NvU32 callbackCounter; 85 NvU8 xcvrCurrentLedState[NVSWITCH_CCI_OSFP_NUM_MAX]; 86 NvU8 xcvrNextLedState[NVSWITCH_CCI_OSFP_NUM_MAX]; 87 NvU64 tpCounterPreviousSum[NVSWITCH_CCI_LINK_NUM_MAX]; 88 89 // LS10 cable initialization 90 NvU8 cableType[NVSWITCH_CCI_OSFP_NUM_MAX]; 91 NvBool rxDetEnable[NVSWITCH_CCI_OSFP_NUM_MAX]; 92 93 // LS10 Async module onboarding 94 CCI_MODULE_STATE moduleState[NVSWITCH_CCI_OSFP_NUM_MAX]; 95 96 // LS10 Async CDB management 97 CCI_CDB_STATE cdbState[NVSWITCH_CCI_OSFP_NUM_MAX]; 98 99 // LS10 Module info 100 NvBool isFlatMemory[NVSWITCH_CCI_OSFP_NUM_MAX]; 101 struct { 102 NvBool bLocked; 103 NvU32 pid; 104 NvU64 timestamp; 105 } cmisAccessLock[NVSWITCH_CCI_OSFP_NUM_MAX]; 106 107 // LS10 link training mode 108 NvBool bModeContinuousALI[NVSWITCH_CCI_OSFP_NUM_MAX]; 109 NvU64 linkMaskAliRequested; 110 111 // LS10 Module HW state 112 NvBool isFaulty[NVSWITCH_CCI_OSFP_NUM_MAX]; 113 114 }; 115 116 // Helper functions for CCI subcomponents 117 NvlStatus cciGetModuleId(nvswitch_device *device, NvU32 linkId, NvU32 *pModuleId); 118 NvBool cciModulePresent(nvswitch_device *device, NvU32 moduleId); 119 void cciGetModulePresenceChange(nvswitch_device *device, NvU32 *pModuleMask); 120 NvlStatus cciResetModule(nvswitch_device *device, NvU32 moduleId); 121 NvlStatus cciGetXcvrFWInfo(nvswitch_device *device, NvU32 moduleId, NvU8 *pInfo); 122 NvlStatus cciSetLPMode(nvswitch_device *device, NvU8 moduleId, NvBool bAssert); 123 NvBool cciCheckLPMode(nvswitch_device *device, NvU8 moduleId); 124 void cciPingModules(nvswitch_device *device, NvU32 *pMaskPresent); 125 void cciGetAllLinks(nvswitch_device *device, NvU64 *pLinkMaskAll); 126 NvlStatus cciGetModuleMask(nvswitch_device *device, NvU64 linkMask, NvU32 *pModuleMask); 127 NvBool cciCheckXcvrForLinkTraffic(nvswitch_device *device, NvU32 osfp, NvU64 linkMask); 128 NvlStatus cciGetLaneMask(nvswitch_device *device, NvU32 linkId, NvU8 *laneMask); 129 NvBool cciModuleHWGood(nvswitch_device *device, NvU32 moduleId); 130 void cciSetModulePower(nvswitch_device *device, NvU32 moduleId, NvBool bPowerOn); 131 132 #endif //_CCI_PRIV_NVSWITCH_H_ 133