Skip to content

Commit 8dc0a85

Browse files
authored
Add support for new Port SI parameters in PortsOA (#2929)
* Swss changes to support port SI per speed
1 parent 9458b85 commit 8dc0a85

5 files changed

Lines changed: 151 additions & 1 deletion

File tree

orchagent/port/portcnt.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,36 @@ class PortConfig final
155155
bool is_set = false;
156156
} attn; // Port serdes attn
157157

158+
struct {
159+
std::vector<std::uint32_t> value;
160+
bool is_set = false;
161+
} ob_m2lp; // Port serdes ob_m2lp
162+
163+
struct {
164+
std::vector<std::uint32_t> value;
165+
bool is_set = false;
166+
} ob_alev_out; // Port serdes ob_alev_out
167+
168+
struct {
169+
std::vector<std::uint32_t> value;
170+
bool is_set = false;
171+
} obplev; // Port serdes obplev
172+
173+
struct {
174+
std::vector<std::uint32_t> value;
175+
bool is_set = false;
176+
} obnlev; // Port serdes obnlev
177+
178+
struct {
179+
std::vector<std::uint32_t> value;
180+
bool is_set = false;
181+
} regn_bfm1p; // Port serdes regn_bfm1p
182+
183+
struct {
184+
std::vector<std::uint32_t> value;
185+
bool is_set = false;
186+
} regn_bfm1n; // Port serdes regn_bfm1n
187+
158188
} serdes; // Port serdes
159189

160190
struct {

orchagent/port/porthlpr.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,14 @@ template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post1) &serdes,
683683
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post2) &serdes, const std::string &field, const std::string &value) const;
684684
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::post3) &serdes, const std::string &field, const std::string &value) const;
685685
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::attn) &serdes, const std::string &field, const std::string &value) const;
686+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::ob_m2lp) &serdes, const std::string &field, const std::string &value) const;
687+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::ob_alev_out) &serdes, const std::string &field, const std::string &value) const;
688+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::obplev) &serdes, const std::string &field, const std::string &value) const;
689+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::obnlev) &serdes, const std::string &field, const std::string &value) const;
690+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::regn_bfm1p) &serdes, const std::string &field, const std::string &value) const;
691+
template bool PortHelper::parsePortSerdes(decltype(PortSerdes_t::regn_bfm1n) &serdes, const std::string &field, const std::string &value) const;
692+
693+
686694

687695
bool PortHelper::parsePortRole(PortConfig &port, const std::string &field, const std::string &value) const
688696
{
@@ -924,6 +932,48 @@ bool PortHelper::parsePortConfig(PortConfig &port) const
924932
return false;
925933
}
926934
}
935+
else if (field == PORT_OB_M2LP)
936+
{
937+
if (!this->parsePortSerdes(port.serdes.ob_m2lp, field, value))
938+
{
939+
return false;
940+
}
941+
}
942+
else if (field == PORT_OB_ALEV_OUT)
943+
{
944+
if (!this->parsePortSerdes(port.serdes.ob_alev_out, field, value))
945+
{
946+
return false;
947+
}
948+
}
949+
else if (field == PORT_OBPLEV)
950+
{
951+
if (!this->parsePortSerdes(port.serdes.obplev, field, value))
952+
{
953+
return false;
954+
}
955+
}
956+
else if (field == PORT_OBNLEV)
957+
{
958+
if (!this->parsePortSerdes(port.serdes.obnlev, field, value))
959+
{
960+
return false;
961+
}
962+
}
963+
else if (field == PORT_REGN_BFM1P)
964+
{
965+
if (!this->parsePortSerdes(port.serdes.regn_bfm1p, field, value))
966+
{
967+
return false;
968+
}
969+
}
970+
else if (field == PORT_REGN_BFM1N)
971+
{
972+
if (!this->parsePortSerdes(port.serdes.regn_bfm1n, field, value))
973+
{
974+
return false;
975+
}
976+
}
927977
else if (field == PORT_ROLE)
928978
{
929979
if (!this->parsePortRole(port, field, value))

orchagent/port/portschema.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@
7777
#define PORT_POST2 "post2"
7878
#define PORT_POST3 "post3"
7979
#define PORT_ATTN "attn"
80+
#define PORT_OB_M2LP "ob_m2lp"
81+
#define PORT_OB_ALEV_OUT "ob_alev_out"
82+
#define PORT_OBPLEV "obplev"
83+
#define PORT_OBNLEV "obnlev"
84+
#define PORT_REGN_BFM1P "regn_bfm1p"
85+
#define PORT_REGN_BFM1N "regn_bfm1n"
8086
#define PORT_ROLE "role"
8187
#define PORT_ADMIN_STATUS "admin_status"
8288
#define PORT_DESCRIPTION "description"

orchagent/portsorch.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,39 @@ static void getPortSerdesAttr(PortSerdesAttrMap_t &map, const PortConfig &port)
339339
{
340340
map[SAI_PORT_SERDES_ATTR_TX_FIR_ATTN] = port.serdes.attn.value;
341341
}
342+
343+
if (port.serdes.ob_m2lp.is_set)
344+
{
345+
346+
map[SAI_PORT_SERDES_ATTR_TX_PAM4_RATIO] = port.serdes.ob_m2lp.value;
347+
}
348+
349+
if (port.serdes.ob_alev_out.is_set)
350+
{
351+
map[SAI_PORT_SERDES_ATTR_TX_OUT_COMMON_MODE] = port.serdes.ob_alev_out.value;
352+
}
353+
354+
if (port.serdes.obplev.is_set)
355+
{
356+
map[SAI_PORT_SERDES_ATTR_TX_PMOS_COMMON_MODE] = port.serdes.obplev.value;
357+
}
358+
359+
if (port.serdes.obnlev.is_set)
360+
{
361+
map[SAI_PORT_SERDES_ATTR_TX_NMOS_COMMON_MODE] = port.serdes.obnlev.value;
362+
}
363+
364+
if (port.serdes.regn_bfm1p.is_set)
365+
{
366+
map[SAI_PORT_SERDES_ATTR_TX_PMOS_VLTG_REG] = port.serdes.regn_bfm1p.value;
367+
}
368+
369+
if (port.serdes.regn_bfm1n.is_set)
370+
{
371+
map[SAI_PORT_SERDES_ATTR_TX_NMOS_VLTG_REG] = port.serdes.regn_bfm1n.value;
372+
}
373+
374+
342375
}
343376

344377
// Port OA ------------------------------------------------------------------------------------------------------------
@@ -8775,3 +8808,4 @@ void PortsOrch::doTask(swss::SelectableTimer &timer)
87758808
m_port_state_poller->stop();
87768809
}
87778810
}
8811+

tests/mock_tests/portsorch_ut.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,13 @@ namespace portsorch_test
708708
{ "post1", "0x10,0x12,0x11,0x13" },
709709
{ "post2", "0x10,0x12,0x11,0x13" },
710710
{ "post3", "0x10,0x12,0x11,0x13" },
711-
{ "attn", "0x80,0x82,0x81,0x83" }
711+
{ "attn", "0x80,0x82,0x81,0x83" },
712+
{ "ob_m2lp", "0x4,0x6,0x5,0x7" },
713+
{ "ob_alev_out", "0xf,0x11,0x10,0x12" },
714+
{ "obplev", "0x69,0x6b,0x6a,0x6c" },
715+
{ "obnlev", "0x5f,0x61,0x60,0x62" },
716+
{ "regn_bfm1p", "0x1e,0x20,0x1f,0x21" },
717+
{ "regn_bfm1n", "0xaa,0xac,0xab,0xad" }
712718
}
713719
}};
714720

@@ -767,6 +773,30 @@ namespace portsorch_test
767773
std::vector<std::uint32_t> attn = { 0x80, 0x82, 0x81, 0x83 };
768774
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_FIR_ATTN), attn);
769775

776+
// Verify ob_m2lp
777+
std::vector<std::uint32_t> ob_m2lp = { 0x4, 0x6, 0x5, 0x7 };
778+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_PAM4_RATIO), ob_m2lp);
779+
780+
// Verify ob_alev_out
781+
std::vector<std::uint32_t> ob_alev_out = { 0xf, 0x11, 0x10, 0x12 };
782+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_OUT_COMMON_MODE), ob_alev_out);
783+
784+
// Verify obplev
785+
std::vector<std::uint32_t> obplev = { 0x69, 0x6b, 0x6a, 0x6c };
786+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_PMOS_COMMON_MODE), obplev);
787+
788+
// Verify obnlev
789+
std::vector<std::uint32_t> obnlev = { 0x5f, 0x61, 0x60, 0x62 };
790+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_NMOS_COMMON_MODE), obnlev);
791+
792+
// Verify regn_bfm1p
793+
std::vector<std::uint32_t> regn_bfm1p = { 0x1e, 0x20, 0x1f, 0x21 };
794+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_PMOS_VLTG_REG), regn_bfm1p);
795+
796+
// Verify regn_bfm1n
797+
std::vector<std::uint32_t> regn_bfm1n = { 0xaa, 0xac, 0xab, 0xad };
798+
ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_TX_NMOS_VLTG_REG), regn_bfm1n);
799+
770800
// Dump pending tasks
771801
std::vector<std::string> taskList;
772802
gPortsOrch->dumpPendingTasks(taskList);

0 commit comments

Comments
 (0)