Skip to content

Commit 4b2db13

Browse files
orchagent: Add support to orchagent to program gearbox SI settings from APPL_DB
See [this PR](sonic-net/SONiC#2174) for the HLD describing the high-level design behind this change. This commit adds logic to program gearbox signal integrity settings published to APPL_DB by xcvrd via SAI in the doPortTask() hook in orchagent. The old code path that was previously responsible for programming gearbox signal integrity settings is left intact for backwards compatibility. Signed-off-by: Brian Gallagher <[email protected]>
1 parent 3a9f9e4 commit 4b2db13

5 files changed

Lines changed: 639 additions & 0 deletions

File tree

orchagent/port/portcnt.h

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,76 @@ class PortConfig final
150150
bool is_set = false;
151151
} post3; // Port serdes post3
152152

153+
struct {
154+
std::vector<std::uint32_t> value;
155+
bool is_set = false;
156+
} gb_line_pre1; // Gearbox line-side port serdes pre1
157+
158+
struct {
159+
std::vector<std::uint32_t> value;
160+
bool is_set = false;
161+
} gb_line_pre2; // Gearbox line-side port serdes pre2
162+
163+
struct {
164+
std::vector<std::uint32_t> value;
165+
bool is_set = false;
166+
} gb_line_pre3; // Gearbox line-side port serdes pre3
167+
168+
struct {
169+
std::vector<std::uint32_t> value;
170+
bool is_set = false;
171+
} gb_line_main; // Gearbox line-side port serdes main
172+
173+
struct {
174+
std::vector<std::uint32_t> value;
175+
bool is_set = false;
176+
} gb_line_post1; // Gearbox line-side port serdes post1
177+
178+
struct {
179+
std::vector<std::uint32_t> value;
180+
bool is_set = false;
181+
} gb_line_post2; // Gearbox line-side port serdes post2
182+
183+
struct {
184+
std::vector<std::uint32_t> value;
185+
bool is_set = false;
186+
} gb_line_post3; // Gearbox line-side port serdes post3
187+
188+
struct {
189+
std::vector<std::uint32_t> value;
190+
bool is_set = false;
191+
} gb_system_pre1; // Gearbox system-side port serdes pre1
192+
193+
struct {
194+
std::vector<std::uint32_t> value;
195+
bool is_set = false;
196+
} gb_system_pre2; // Gearbox system-side port serdes pre2
197+
198+
struct {
199+
std::vector<std::uint32_t> value;
200+
bool is_set = false;
201+
} gb_system_pre3; // Gearbox system-side port serdes pre3
202+
203+
struct {
204+
std::vector<std::uint32_t> value;
205+
bool is_set = false;
206+
} gb_system_main; // Gearbox system-side port serdes main
207+
208+
struct {
209+
std::vector<std::uint32_t> value;
210+
bool is_set = false;
211+
} gb_system_post1; // Gearbox system-side port serdes post1
212+
213+
struct {
214+
std::vector<std::uint32_t> value;
215+
bool is_set = false;
216+
} gb_system_post2; // Gearbox system-side port serdes post2
217+
218+
struct {
219+
std::vector<std::uint32_t> value;
220+
bool is_set = false;
221+
} gb_system_post3; // Gearbox system-side port serdes post3
222+
153223
struct {
154224
std::vector<std::uint32_t> value;
155225
bool is_set = false;

orchagent/port/porthlpr.cpp

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,20 @@ template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::main) &serdes,
757757
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post1) &serdes, const std::string &field, const std::string &value) const;
758758
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post2) &serdes, const std::string &field, const std::string &value) const;
759759
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post3) &serdes, const std::string &field, const std::string &value) const;
760+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_pre1) &serdes, const std::string &field, const std::string &value) const;
761+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_pre2) &serdes, const std::string &field, const std::string &value) const;
762+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_pre3) &serdes, const std::string &field, const std::string &value) const;
763+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_main) &serdes, const std::string &field, const std::string &value) const;
764+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_post1) &serdes, const std::string &field, const std::string &value) const;
765+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_post2) &serdes, const std::string &field, const std::string &value) const;
766+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_line_post3) &serdes, const std::string &field, const std::string &value) const;
767+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_pre1) &serdes, const std::string &field, const std::string &value) const;
768+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_pre2) &serdes, const std::string &field, const std::string &value) const;
769+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_pre3) &serdes, const std::string &field, const std::string &value) const;
770+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_main) &serdes, const std::string &field, const std::string &value) const;
771+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_post1) &serdes, const std::string &field, const std::string &value) const;
772+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_post2) &serdes, const std::string &field, const std::string &value) const;
773+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::gb_system_post3) &serdes, const std::string &field, const std::string &value) const;
760774
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::attn) &serdes, const std::string &field, const std::string &value) const;
761775
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::ob_m2lp) &serdes, const std::string &field, const std::string &value) const;
762776
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::ob_alev_out) &serdes, const std::string &field, const std::string &value) const;
@@ -1153,6 +1167,104 @@ bool PortHelper::parsePortConfig(PortConfig &port) const
11531167
return false;
11541168
}
11551169
}
1170+
else if (field == PORT_GB_LINE_PRE1)
1171+
{
1172+
if (!this->parsePortSerdes(port.serdes.gb_line_pre1, field, value))
1173+
{
1174+
return false;
1175+
}
1176+
}
1177+
else if (field == PORT_GB_LINE_PRE2)
1178+
{
1179+
if (!this->parsePortSerdes(port.serdes.gb_line_pre2, field, value))
1180+
{
1181+
return false;
1182+
}
1183+
}
1184+
else if (field == PORT_GB_LINE_PRE3)
1185+
{
1186+
if (!this->parsePortSerdes(port.serdes.gb_line_pre3, field, value))
1187+
{
1188+
return false;
1189+
}
1190+
}
1191+
else if (field == PORT_GB_LINE_MAIN)
1192+
{
1193+
if (!this->parsePortSerdes(port.serdes.gb_line_main, field, value))
1194+
{
1195+
return false;
1196+
}
1197+
}
1198+
else if (field == PORT_GB_LINE_POST1)
1199+
{
1200+
if (!this->parsePortSerdes(port.serdes.gb_line_post1, field, value))
1201+
{
1202+
return false;
1203+
}
1204+
}
1205+
else if (field == PORT_GB_LINE_POST2)
1206+
{
1207+
if (!this->parsePortSerdes(port.serdes.gb_line_post2, field, value))
1208+
{
1209+
return false;
1210+
}
1211+
}
1212+
else if (field == PORT_GB_LINE_POST3)
1213+
{
1214+
if (!this->parsePortSerdes(port.serdes.gb_line_post3, field, value))
1215+
{
1216+
return false;
1217+
}
1218+
}
1219+
else if (field == PORT_GB_SYSTEM_PRE1)
1220+
{
1221+
if (!this->parsePortSerdes(port.serdes.gb_system_pre1, field, value))
1222+
{
1223+
return false;
1224+
}
1225+
}
1226+
else if (field == PORT_GB_SYSTEM_PRE2)
1227+
{
1228+
if (!this->parsePortSerdes(port.serdes.gb_system_pre2, field, value))
1229+
{
1230+
return false;
1231+
}
1232+
}
1233+
else if (field == PORT_GB_SYSTEM_PRE3)
1234+
{
1235+
if (!this->parsePortSerdes(port.serdes.gb_system_pre3, field, value))
1236+
{
1237+
return false;
1238+
}
1239+
}
1240+
else if (field == PORT_GB_SYSTEM_MAIN)
1241+
{
1242+
if (!this->parsePortSerdes(port.serdes.gb_system_main, field, value))
1243+
{
1244+
return false;
1245+
}
1246+
}
1247+
else if (field == PORT_GB_SYSTEM_POST1)
1248+
{
1249+
if (!this->parsePortSerdes(port.serdes.gb_system_post1, field, value))
1250+
{
1251+
return false;
1252+
}
1253+
}
1254+
else if (field == PORT_GB_SYSTEM_POST2)
1255+
{
1256+
if (!this->parsePortSerdes(port.serdes.gb_system_post2, field, value))
1257+
{
1258+
return false;
1259+
}
1260+
}
1261+
else if (field == PORT_GB_SYSTEM_POST3)
1262+
{
1263+
if (!this->parsePortSerdes(port.serdes.gb_system_post3, field, value))
1264+
{
1265+
return false;
1266+
}
1267+
}
11561268
else if (field == PORT_ATTN)
11571269
{
11581270
if (!this->parsePortSerdes(port.serdes.attn, field, value))

orchagent/port/portschema.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,20 @@
8282
#define PORT_POST1 "post1"
8383
#define PORT_POST2 "post2"
8484
#define PORT_POST3 "post3"
85+
#define PORT_GB_LINE_PRE1 "gb_line_pre1"
86+
#define PORT_GB_LINE_PRE2 "gb_line_pre2"
87+
#define PORT_GB_LINE_PRE3 "gb_line_pre3"
88+
#define PORT_GB_LINE_MAIN "gb_line_main"
89+
#define PORT_GB_LINE_POST1 "gb_line_post1"
90+
#define PORT_GB_LINE_POST2 "gb_line_post2"
91+
#define PORT_GB_LINE_POST3 "gb_line_post3"
92+
#define PORT_GB_SYSTEM_PRE1 "gb_system_pre1"
93+
#define PORT_GB_SYSTEM_PRE2 "gb_system_pre2"
94+
#define PORT_GB_SYSTEM_PRE3 "gb_system_pre3"
95+
#define PORT_GB_SYSTEM_MAIN "gb_system_main"
96+
#define PORT_GB_SYSTEM_POST1 "gb_system_post1"
97+
#define PORT_GB_SYSTEM_POST2 "gb_system_post2"
98+
#define PORT_GB_SYSTEM_POST3 "gb_system_post3"
8599
#define PORT_ATTN "attn"
86100
#define PORT_OB_M2LP "ob_m2lp"
87101
#define PORT_OB_ALEV_OUT "ob_alev_out"

orchagent/portsorch.cpp

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,86 @@ static void getPortSerdesAttr(PortSerdesAttrMap_t &map, const PortConfig &port)
524524

525525
}
526526

527+
static void getLinePortSerdesAttr(PortSerdesAttrMap_t &map, const PortConfig &port)
528+
{
529+
530+
if (port.serdes.gb_line_pre1.is_set)
531+
{
532+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE1] = port.serdes.gb_line_pre1.value;
533+
}
534+
535+
if (port.serdes.gb_line_pre2.is_set)
536+
{
537+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE2] = port.serdes.gb_line_pre2.value;
538+
}
539+
540+
if (port.serdes.gb_line_pre3.is_set)
541+
{
542+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE3] = port.serdes.gb_line_pre3.value;
543+
}
544+
545+
if (port.serdes.gb_line_main.is_set)
546+
{
547+
map[SAI_PORT_SERDES_ATTR_TX_FIR_MAIN] = port.serdes.gb_line_main.value;
548+
}
549+
550+
if (port.serdes.gb_line_post1.is_set)
551+
{
552+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST1] = port.serdes.gb_line_post1.value;
553+
}
554+
555+
if (port.serdes.gb_line_post2.is_set)
556+
{
557+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST2] = port.serdes.gb_line_post2.value;
558+
}
559+
560+
if (port.serdes.gb_line_post3.is_set)
561+
{
562+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST3] = port.serdes.gb_line_post3.value;
563+
}
564+
565+
}
566+
567+
static void getSystemPortSerdesAttr(PortSerdesAttrMap_t &map, const PortConfig &port)
568+
{
569+
570+
if (port.serdes.gb_system_pre1.is_set)
571+
{
572+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE1] = port.serdes.gb_system_pre1.value;
573+
}
574+
575+
if (port.serdes.gb_system_pre2.is_set)
576+
{
577+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE2] = port.serdes.gb_system_pre2.value;
578+
}
579+
580+
if (port.serdes.gb_system_pre3.is_set)
581+
{
582+
map[SAI_PORT_SERDES_ATTR_TX_FIR_PRE3] = port.serdes.gb_system_pre3.value;
583+
}
584+
585+
if (port.serdes.gb_system_main.is_set)
586+
{
587+
map[SAI_PORT_SERDES_ATTR_TX_FIR_MAIN] = port.serdes.gb_system_main.value;
588+
}
589+
590+
if (port.serdes.gb_system_post1.is_set)
591+
{
592+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST1] = port.serdes.gb_system_post1.value;
593+
}
594+
595+
if (port.serdes.gb_system_post2.is_set)
596+
{
597+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST2] = port.serdes.gb_system_post2.value;
598+
}
599+
600+
if (port.serdes.gb_system_post3.is_set)
601+
{
602+
map[SAI_PORT_SERDES_ATTR_TX_FIR_POST3] = port.serdes.gb_system_post3.value;
603+
}
604+
605+
}
606+
527607
static bool isPathTracingSupported()
528608
{
529609
/*
@@ -4530,7 +4610,11 @@ void PortsOrch::doPortTask(Consumer &consumer)
45304610
else
45314611
{
45324612
PortSerdesAttrMap_t serdes_attr;
4613+
PortSerdesAttrMap_t line_serdes_attr;
4614+
PortSerdesAttrMap_t system_serdes_attr;
45334615
getPortSerdesAttr(serdes_attr, pCfg);
4616+
getLinePortSerdesAttr(line_serdes_attr, pCfg);
4617+
getSystemPortSerdesAttr(system_serdes_attr, pCfg);
45344618

45354619
// Saved configured admin status
45364620
bool admin_status = p.m_admin_state_up;
@@ -5195,6 +5279,34 @@ void PortsOrch::doPortTask(Consumer &consumer)
51955279
}
51965280
}
51975281

5282+
if (p.m_line_side_id && !line_serdes_attr.empty())
5283+
{
5284+
if (setPortSerdesAttribute(p.m_line_side_id, p.m_switch_id, line_serdes_attr))
5285+
{
5286+
SWSS_LOG_NOTICE("Successfully set line-side gearbox tunings for port %s", p.m_alias.c_str());
5287+
}
5288+
else
5289+
{
5290+
SWSS_LOG_ERROR("Failed to set line-side gearbox tunings for port %s", p.m_alias.c_str());
5291+
it++;
5292+
continue;
5293+
}
5294+
}
5295+
5296+
if (p.m_system_side_id && !system_serdes_attr.empty())
5297+
{
5298+
if (setPortSerdesAttribute(p.m_system_side_id, p.m_switch_id, system_serdes_attr))
5299+
{
5300+
SWSS_LOG_NOTICE("Successfully set system-side gearbox tunings for port %s", p.m_alias.c_str());
5301+
}
5302+
else
5303+
{
5304+
SWSS_LOG_ERROR("Failed to set system-side gearbox tunings for port %s", p.m_alias.c_str());
5305+
it++;
5306+
continue;
5307+
}
5308+
}
5309+
51985310
/* create host_tx_ready field in state-db */
51995311
initHostTxReadyState(p);
52005312

0 commit comments

Comments
 (0)