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