From 79bfd1bbd370b1a410f28600b05d25cf4aaee8ca Mon Sep 17 00:00:00 2001 From: nkanchi-nexthop Date: Tue, 7 Jul 2026 13:28:31 -0700 Subject: [PATCH] Added memory map support for C-CMIS PM pages Signed-off-by: nkanchi-nexthop --- .../sonic_xcvr/fields/consts.py | 30 ++++++++++++++++++ .../sonic_xcvr/mem_maps/public/cmis/c_cmis.py | 2 ++ .../mem_maps/public/cmis/pages/__init__.py | 2 ++ .../mem_maps/public/cmis/pages/page35.py | 15 +++++++++ .../mem_maps/public/cmis/pages/page3a.py | 31 +++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page3a.py diff --git a/sonic_platform_base/sonic_xcvr/fields/consts.py b/sonic_platform_base/sonic_xcvr/fields/consts.py index c4881da34..2f1f8d7ab 100644 --- a/sonic_platform_base/sonic_xcvr/fields/consts.py +++ b/sonic_platform_base/sonic_xcvr/fields/consts.py @@ -484,6 +484,36 @@ RX_AVG_MER_PM = "rxAvgMerPm" RX_MIN_MER_PM = "rxMinMerPm" RX_MAX_MER_PM = "rxMaxMerPm" +RX_AVG_CLOCK_REC_PM = "rxAvgClockRecPm" +RX_MIN_CLOCK_REC_PM = "rxMinClockRecPm" +RX_MAX_CLOCK_REC_PM = "rxMaxClockRecPm" +RX_AVG_LG_SOPMD_PM = "rxAvgLGSopmdPm" +RX_MIN_LG_SOPMD_PM = "rxMinLGSopmdPm" +RX_MAX_LG_SOPMD_PM = "rxMaxLGSopmdPm" +RX_AVG_SNR_MARGIN_PM = "rxAvgSNRMarginPm" +RX_MIN_SNR_MARGIN_PM = "rxMinSNRMarginPm" +RX_MAX_SNR_MARGIN_PM = "rxMaxSNRMarginPm" +RX_AVG_QFACTOR_PM = "rxAvgQFactorPm" +RX_MIN_QFACTOR_PM = "rxMinQFactorPm" +RX_MAX_PM_QFACTOR = "rxMaxPmQFactor" +RX_AVG_QMARGIN_PM = "rxAvgQMarginPm" +RX_MIN_QMARGIN_PM = "rxMinQMarginPm" +RX_MAX_QMARGIN_PM = "rxMaxQMarginPm" + +## Data Path Host Interface Performance Monitoring +DATA_PATH_HOST_IF_PM = "Data Path Host Interface Performance Monitoring" +TX_BITS_PM = "txBitsPm" +TX_BITS_SUB_INTERVAL_PM = "txBitsSubIntPm" +TX_CORR_BITS_PM = "txCorrBitsPm" +TX_MIN_CORR_BITS_SUB_INTERVAL_PM = "txMinCorrBitsSubIntPm" +TX_MAX_CORR_BITS_SUB_INTERVAL_PM = "txMaxCorrBitsSubIntPm" +TX_FRAMES_PM = "txFramesPm" +TX_FRAMES_SUB_INTERVAL_PM = "txFramesSubIntPm" +TX_FRAMES_UNCORR_ERR_PM = "txFramesUncorrErrPm" +TX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM = "txMinFramesUncorrErrSubintPm" +TX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM = "txMaxFramesUncorrErrSubintPm" +TX_CORRECTED_FRAMES_PM = "txCorrectedFramesPm" +TX_CORRECTED_FRAMES_SUB_INTERVAL_PM = "txCorrectedFramesSubintPm" # CDB TRANS_CDB_FIELD = "TransceiverCdb" diff --git a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/c_cmis.py b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/c_cmis.py index 3cd84caf0..8838a9395 100644 --- a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/c_cmis.py +++ b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/c_cmis.py @@ -9,6 +9,7 @@ CCmisModuleConfigSupportPage, CCmisMediaLaneFecPmPage, CCmisMediaLaneLinkPmPage, + CCmisDataPathHostIfPmPage, ) @@ -21,4 +22,5 @@ def __init__(self, codes, bank=0): CCmisModuleConfigSupportPage(codes, bank=bank), # 0x04 CCmisMediaLaneFecPmPage(codes, bank=bank), # 0x34 CCmisMediaLaneLinkPmPage(codes, bank=bank), # 0x35 + CCmisDataPathHostIfPmPage(codes, bank=bank), # 0x3A ) diff --git a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/__init__.py b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/__init__.py index 63c7f716b..fb9287712 100644 --- a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/__init__.py +++ b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/__init__.py @@ -31,6 +31,7 @@ from .page2f import CmisVdmAdvertisingCtrlPage from .page34 import CCmisMediaLaneFecPmPage from .page35 import CCmisMediaLaneLinkPmPage +from .page3a import CCmisDataPathHostIfPmPage from .page9f import CmisCdbMessagePage from .page9f_cdb import CdbLplMessagePage @@ -60,6 +61,7 @@ 'CmisVdmAdvertisingCtrlPage', 'CCmisMediaLaneFecPmPage', 'CCmisMediaLaneLinkPmPage', + 'CCmisDataPathHostIfPmPage', 'CmisCdbMessagePage', 'CdbLplMessagePage', ] diff --git a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page35.py b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page35.py index 7abc0f32e..5f2fa042f 100644 --- a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page35.py +++ b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page35.py @@ -56,4 +56,19 @@ def __init__(self, codes, bank=0, page=0x35): NumberRegField(consts.RX_AVG_MER_PM, self.getaddr(206), format=">H", size=2, scale=10.0), NumberRegField(consts.RX_MIN_MER_PM, self.getaddr(208), format=">H", size=2, scale=10.0), NumberRegField(consts.RX_MAX_MER_PM, self.getaddr(210), format=">H", size=2, scale=10.0), + NumberRegField(consts.RX_AVG_CLOCK_REC_PM, self.getaddr(212), format=">h", size=2, scale=327.67), + NumberRegField(consts.RX_MIN_CLOCK_REC_PM, self.getaddr(214), format=">h", size=2, scale=327.67), + NumberRegField(consts.RX_MAX_CLOCK_REC_PM, self.getaddr(216), format=">h", size=2, scale=327.67), + NumberRegField(consts.RX_AVG_LG_SOPMD_PM, self.getaddr(218), format=">H", size=2), + NumberRegField(consts.RX_MIN_LG_SOPMD_PM, self.getaddr(220), format=">H", size=2), + NumberRegField(consts.RX_MAX_LG_SOPMD_PM, self.getaddr(222), format=">H", size=2), + NumberRegField(consts.RX_AVG_SNR_MARGIN_PM, self.getaddr(224), format=">h", size=2, scale=10.0), + NumberRegField(consts.RX_MIN_SNR_MARGIN_PM, self.getaddr(226), format=">h", size=2, scale=10.0), + NumberRegField(consts.RX_MAX_SNR_MARGIN_PM, self.getaddr(228), format=">h", size=2, scale=10.0), + NumberRegField(consts.RX_AVG_QFACTOR_PM, self.getaddr(230), format=">H", size=2, scale=10.0), + NumberRegField(consts.RX_MIN_QFACTOR_PM, self.getaddr(232), format=">H", size=2, scale=10.0), + NumberRegField(consts.RX_MAX_PM_QFACTOR, self.getaddr(234), format=">H", size=2, scale=10.0), + NumberRegField(consts.RX_AVG_QMARGIN_PM, self.getaddr(236), format=">h", size=2, scale=10.0), + NumberRegField(consts.RX_MIN_QMARGIN_PM, self.getaddr(238), format=">h", size=2, scale=10.0), + NumberRegField(consts.RX_MAX_QMARGIN_PM, self.getaddr(240), format=">h", size=2, scale=10.0), ] diff --git a/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page3a.py b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page3a.py new file mode 100644 index 000000000..95ff2e73b --- /dev/null +++ b/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page3a.py @@ -0,0 +1,31 @@ +""" + page3a.py + + C-CMIS Page 3Ah - Data Path Host Interface Performance Monitors. +""" + +from .page import CmisPage +from .....fields.xcvr_field import NumberRegField +from .....fields import consts + + +class CCmisDataPathHostIfPmPage(CmisPage): + """C-CMIS Page 3Ah: data path host-interface performance-monitor counters.""" + + def __init__(self, codes, bank=0, page=0x3A): + super().__init__(codes, page=page, bank=bank) + + self.fields[consts.DATA_PATH_HOST_IF_PM] = [ + NumberRegField(consts.TX_BITS_PM, self.getaddr(128), format=">Q", size=8), + NumberRegField(consts.TX_BITS_SUB_INTERVAL_PM, self.getaddr(136), format=">Q", size=8), + NumberRegField(consts.TX_CORR_BITS_PM, self.getaddr(144), format=">Q", size=8), + NumberRegField(consts.TX_MIN_CORR_BITS_SUB_INTERVAL_PM, self.getaddr(152), format=">Q", size=8), + NumberRegField(consts.TX_MAX_CORR_BITS_SUB_INTERVAL_PM, self.getaddr(160), format=">Q", size=8), + NumberRegField(consts.TX_FRAMES_PM, self.getaddr(168), format=">I", size=4), + NumberRegField(consts.TX_FRAMES_SUB_INTERVAL_PM, self.getaddr(172), format=">I", size=4), + NumberRegField(consts.TX_FRAMES_UNCORR_ERR_PM, self.getaddr(176), format=">I", size=4), + NumberRegField(consts.TX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM, self.getaddr(180), format=">I", size=4), + NumberRegField(consts.TX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM, self.getaddr(184), format=">I", size=4), + NumberRegField(consts.TX_CORRECTED_FRAMES_PM, self.getaddr(188), format=">I", size=4), + NumberRegField(consts.TX_CORRECTED_FRAMES_SUB_INTERVAL_PM, self.getaddr(192), format=">I", size=4), + ]