LCOV - code coverage report
Current view: top level - drivers/common/cnxk - roc_bphy_cgx.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 190 0.0 %
Date: 2025-10-01 17:51:42 Functions: 0 22 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 216 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(C) 2021 Marvell.
       3                 :            :  */
       4                 :            : 
       5                 :            : #include <pthread.h>
       6                 :            : 
       7                 :            : #include "roc_api.h"
       8                 :            : #include "roc_priv.h"
       9                 :            : 
      10                 :            : #define CGX_CMRX_CONFIG                0x00
      11                 :            : #define CGX_CMRX_CONFIG_DATA_PKT_RX_EN BIT_ULL(54)
      12                 :            : #define CGX_CMRX_CONFIG_DATA_PKT_TX_EN BIT_ULL(53)
      13                 :            : #define CGX_CMRX_INT                   0x40
      14                 :            : #define CGX_CMRX_INT_OVERFLW           BIT_ULL(1)
      15                 :            : /*
      16                 :            :  * CN10K stores number of lmacs in 4 bit filed
      17                 :            :  * in contrary to CN9K which uses only 3 bits.
      18                 :            :  *
      19                 :            :  * In theory masks should differ yet on CN9K
      20                 :            :  * bits beyond specified range contain zeros.
      21                 :            :  *
      22                 :            :  * Hence common longer mask may be used.
      23                 :            :  */
      24                 :            : #define CGX_CMRX_RX_LMACS                     0x128
      25                 :            : #define CGX_CMRX_RX_LMACS_LMACS               GENMASK_ULL(3, 0)
      26                 :            : #define CGX_CMRX_SCRATCH0                     0x1050
      27                 :            : #define CGX_CMRX_SCRATCH1                     0x1058
      28                 :            : #define CGX_MTI_MAC100X_COMMAND_CONFIG        0x8010
      29                 :            : #define CGX_MTI_MAC100X_COMMAND_CONFIG_RX_ENA BIT_ULL(1)
      30                 :            : #define CGX_MTI_MAC100X_COMMAND_CONFIG_TX_ENA BIT_ULL(0)
      31                 :            : 
      32                 :            : static uint64_t
      33                 :            : roc_bphy_cgx_read(struct roc_bphy_cgx *roc_cgx, uint64_t lmac, uint64_t offset)
      34                 :            : {
      35   [ #  #  #  #  :          0 :         int shift = roc_model_is_cn10k() ? 20 : 18;
             #  #  #  # ]
      36                 :          0 :         uint64_t base = (uint64_t)roc_cgx->bar0_va;
      37                 :            : 
      38   [ #  #  #  #  :          0 :         return plt_read64(base + (lmac << shift) + offset);
          #  #  #  #  #  
                      # ]
      39                 :            : }
      40                 :            : 
      41                 :            : static void
      42                 :            : roc_bphy_cgx_write(struct roc_bphy_cgx *roc_cgx, uint64_t lmac, uint64_t offset,
      43                 :            :                    uint64_t value)
      44                 :            : {
      45   [ #  #  #  # ]:          0 :         int shift = roc_model_is_cn10k() ? 20 : 18;
      46                 :          0 :         uint64_t base = (uint64_t)roc_cgx->bar0_va;
      47                 :            : 
      48                 :          0 :         plt_write64(value, base + (lmac << shift) + offset);
      49                 :            : }
      50                 :            : 
      51                 :            : static void
      52                 :          0 : roc_bphy_cgx_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
      53                 :            :                  uint64_t *scr0)
      54                 :            : {
      55                 :            :         uint64_t val;
      56                 :            : 
      57                 :            :         /* clear interrupt */
      58         [ #  # ]:          0 :         val = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_INT);
      59         [ #  # ]:          0 :         val |= FIELD_PREP(CGX_CMRX_INT_OVERFLW, 1);
      60                 :            :         roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_INT, val);
      61                 :            : 
      62                 :            :         /* ack fw response */
      63         [ #  # ]:          0 :         *scr0 &= ~SCR0_ETH_EVT_STS_S_ACK;
      64                 :            :         roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_SCRATCH0, *scr0);
      65                 :          0 : }
      66                 :            : 
      67                 :            : static int
      68                 :          0 : roc_bphy_cgx_wait_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, uint64_t *scr0, bool ack)
      69                 :            : {
      70                 :            :         int tries = 5000;
      71                 :            :         uint64_t scr1;
      72                 :            : 
      73                 :            :         do {
      74   [ #  #  #  # ]:          0 :                 *scr0 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH0);
      75                 :            :                 scr1 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH1);
      76                 :            : 
      77                 :            :                 /* clear async events if any */
      78         [ #  # ]:          0 :                 if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) == ETH_EVT_ASYNC &&
      79                 :            :                     FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0)) {
      80                 :          0 :                         roc_bphy_cgx_ack(roc_cgx, lmac, scr0);
      81                 :          0 :                         goto skip;
      82                 :            :                 }
      83                 :            : 
      84         [ #  # ]:          0 :                 if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
      85         [ #  # ]:          0 :                     FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0) == ack)
      86                 :            :                         break;
      87                 :            : 
      88                 :          0 : skip:
      89                 :            :                 plt_delay_ms(1);
      90         [ #  # ]:          0 :         } while (--tries);
      91                 :            : 
      92         [ #  # ]:          0 :         return tries ? 0 : -ETIMEDOUT;
      93                 :            : }
      94                 :            : 
      95                 :            : static int
      96                 :            : roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, uint64_t *scr0)
      97                 :            : {
      98                 :          0 :         return roc_bphy_cgx_wait_ack(roc_cgx, lmac, scr0, false);
      99                 :            : }
     100                 :            : 
     101                 :            : static int
     102                 :            : roc_bphy_cgx_wait_for_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, uint64_t *scr0)
     103                 :            : {
     104                 :          0 :         return roc_bphy_cgx_wait_ack(roc_cgx, lmac, scr0, true);
     105                 :            : }
     106                 :            : 
     107                 :            : static int
     108                 :          0 : roc_bphy_cgx_intf_req(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, uint64_t scr1,
     109                 :            :                       uint64_t *scr0)
     110                 :            : {
     111                 :          0 :         uint8_t cmd_id = FIELD_GET(SCR1_ETH_CMD_ID, scr1);
     112                 :            :         int ret;
     113                 :            : 
     114                 :          0 :         pthread_mutex_lock(&roc_cgx->lock);
     115                 :            : 
     116                 :            :         /* wait for ownership */
     117                 :            :         ret = roc_bphy_cgx_wait_for_ownership(roc_cgx, lmac, scr0);
     118         [ #  # ]:          0 :         if (ret) {
     119                 :          0 :                 plt_err("timed out waiting for ownership");
     120                 :          0 :                 goto out;
     121                 :            :         }
     122                 :            : 
     123                 :            :         /* write command */
     124                 :          0 :         scr1 |= FIELD_PREP(SCR1_OWN_STATUS, ETH_OWN_FIRMWARE);
     125         [ #  # ]:          0 :         roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_SCRATCH1, scr1);
     126                 :            : 
     127                 :            :         /* wait for command ack */
     128                 :            :         ret = roc_bphy_cgx_wait_for_ack(roc_cgx, lmac, scr0);
     129         [ #  # ]:          0 :         if (ret) {
     130                 :          0 :                 plt_err("timed out waiting for response");
     131                 :          0 :                 goto out;
     132                 :            :         }
     133                 :            : 
     134         [ #  # ]:          0 :         if (cmd_id == ETH_CMD_INTF_SHUTDOWN)
     135                 :          0 :                 goto out;
     136                 :            : 
     137         [ #  # ]:          0 :         if (FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0) != cmd_id) {
     138                 :          0 :                 plt_err("received resp for cmd %d expected for cmd %d",
     139                 :            :                         (int)FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0), cmd_id);
     140                 :            :                 ret = -EIO;
     141                 :          0 :                 goto out;
     142                 :            :         }
     143                 :            : 
     144         [ #  # ]:          0 :         if (FIELD_GET(SCR0_ETH_EVT_STS_S_STAT, *scr0) != ETH_STAT_SUCCESS) {
     145                 :          0 :                 plt_err("cmd %d failed on cgx%u lmac%u with errcode %d", cmd_id,
     146                 :            :                         roc_cgx->id, lmac,
     147                 :            :                         (int)FIELD_GET(SCR0_ETH_LNK_STS_S_ERR_TYPE, *scr0));
     148                 :            :                 ret = -EIO;
     149                 :            :         }
     150                 :            : 
     151                 :          0 : out:
     152                 :          0 :         roc_bphy_cgx_ack(roc_cgx, lmac, scr0);
     153                 :            : 
     154                 :          0 :         pthread_mutex_unlock(&roc_cgx->lock);
     155                 :            : 
     156                 :          0 :         return ret;
     157                 :            : }
     158                 :            : 
     159                 :            : static unsigned int
     160                 :            : roc_bphy_cgx_dev_id(struct roc_bphy_cgx *roc_cgx)
     161                 :            : {
     162                 :            :         uint64_t cgx_id;
     163                 :            : 
     164         [ #  # ]:          0 :         if (roc_model_is_cnf10kb())
     165                 :            :                 cgx_id = GENMASK_ULL(27, 24);
     166         [ #  # ]:          0 :         else if (roc_model_is_cn10k())
     167                 :            :                 cgx_id = GENMASK_ULL(26, 24);
     168                 :            :         else
     169                 :            :                 cgx_id = GENMASK_ULL(25, 24);
     170                 :            : 
     171                 :          0 :         return FIELD_GET(cgx_id, roc_cgx->bar0_pa);
     172                 :            : }
     173                 :            : 
     174                 :            : int
     175                 :          0 : roc_bphy_cgx_dev_init(struct roc_bphy_cgx *roc_cgx)
     176                 :            : {
     177                 :            :         uint64_t val;
     178                 :            : 
     179   [ #  #  #  #  :          0 :         if (!roc_cgx || !roc_cgx->bar0_va || !roc_cgx->bar0_pa)
                   #  # ]
     180                 :            :                 return -EINVAL;
     181                 :            : 
     182                 :          0 :         pthread_mutex_init(&roc_cgx->lock, NULL);
     183                 :            : 
     184                 :            :         val = roc_bphy_cgx_read(roc_cgx, 0, CGX_CMRX_RX_LMACS);
     185         [ #  # ]:          0 :         val = FIELD_GET(CGX_CMRX_RX_LMACS_LMACS, val);
     186         [ #  # ]:          0 :         if (roc_model_is_cn9k())
     187                 :          0 :                 val = GENMASK_ULL(val - 1, 0);
     188         [ #  # ]:          0 :         roc_cgx->lmac_bmap = val;
     189                 :          0 :         roc_cgx->id = roc_bphy_cgx_dev_id(roc_cgx);
     190                 :            : 
     191                 :          0 :         return 0;
     192                 :            : }
     193                 :            : 
     194                 :            : int
     195                 :          0 : roc_bphy_cgx_dev_fini(struct roc_bphy_cgx *roc_cgx)
     196                 :            : {
     197         [ #  # ]:          0 :         if (!roc_cgx)
     198                 :            :                 return -EINVAL;
     199                 :            : 
     200                 :          0 :         pthread_mutex_destroy(&roc_cgx->lock);
     201                 :            : 
     202                 :          0 :         return 0;
     203                 :            : }
     204                 :            : 
     205                 :            : static bool
     206                 :            : roc_bphy_cgx_lmac_exists(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     207                 :            : {
     208   [ #  #  #  #  :          0 :         return (lmac < MAX_LMACS_PER_CGX) &&
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     209   [ #  #  #  #  :          0 :                (roc_cgx->lmac_bmap & BIT_ULL(lmac));
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     210                 :            : }
     211                 :            : 
     212                 :            : static int
     213                 :          0 : roc_bphy_cgx_start_stop_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     214                 :            :                              bool start)
     215                 :            : {
     216                 :            :         uint64_t val, reg, rx_field, tx_field;
     217                 :            : 
     218         [ #  # ]:          0 :         if (!roc_cgx)
     219                 :            :                 return -EINVAL;
     220                 :            : 
     221         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     222                 :            :                 return -ENODEV;
     223                 :            : 
     224         [ #  # ]:          0 :         if (roc_model_is_cnf10kb()) {
     225                 :            :                 reg = CGX_MTI_MAC100X_COMMAND_CONFIG;
     226                 :            :                 rx_field = CGX_MTI_MAC100X_COMMAND_CONFIG_RX_ENA;
     227                 :            :                 tx_field = CGX_MTI_MAC100X_COMMAND_CONFIG_TX_ENA;
     228                 :            :         } else {
     229                 :            :                 reg = CGX_CMRX_CONFIG;
     230                 :            :                 rx_field = CGX_CMRX_CONFIG_DATA_PKT_RX_EN;
     231                 :            :                 tx_field = CGX_CMRX_CONFIG_DATA_PKT_TX_EN;
     232                 :            :         }
     233                 :            : 
     234                 :          0 :         pthread_mutex_lock(&roc_cgx->lock);
     235         [ #  # ]:          0 :         val = roc_bphy_cgx_read(roc_cgx, lmac, reg);
     236                 :          0 :         val &= ~(rx_field | tx_field);
     237                 :            : 
     238         [ #  # ]:          0 :         if (start)
     239                 :          0 :                 val |= FIELD_PREP(rx_field, 1) | FIELD_PREP(tx_field, 1);
     240                 :            : 
     241                 :            :         roc_bphy_cgx_write(roc_cgx, lmac, reg, val);
     242                 :          0 :         pthread_mutex_unlock(&roc_cgx->lock);
     243                 :            : 
     244                 :          0 :         return 0;
     245                 :            : }
     246                 :            : 
     247                 :            : static int
     248                 :          0 : roc_bphy_cgx_intlbk_ena_dis(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     249                 :            :                             bool enable)
     250                 :            : {
     251                 :            :         uint64_t scr1, scr0;
     252                 :            : 
     253         [ #  # ]:          0 :         if (!roc_cgx)
     254                 :            :                 return -EINVAL;
     255                 :            : 
     256         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     257                 :            :                 return -ENODEV;
     258                 :            : 
     259                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_INTERNAL_LBK) |
     260                 :          0 :                FIELD_PREP(SCR1_ETH_CTL_ARGS_ENABLE, enable);
     261                 :            : 
     262                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     263                 :            : }
     264                 :            : 
     265                 :            : static int
     266                 :          0 : roc_bphy_cgx_ptp_rx_ena_dis(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     267                 :            :                             bool enable)
     268                 :            : {
     269                 :            :         uint64_t scr1, scr0;
     270                 :            : 
     271         [ #  # ]:          0 :         if (!roc_cgx)
     272                 :            :                 return -EINVAL;
     273                 :            : 
     274         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     275                 :            :                 return -ENODEV;
     276                 :            : 
     277                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_SET_PTP_MODE) |
     278                 :          0 :                FIELD_PREP(SCR1_ETH_CTL_ARGS_ENABLE, enable);
     279                 :            : 
     280                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     281                 :            : }
     282                 :            : 
     283                 :            : int
     284                 :          0 : roc_bphy_cgx_start_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     285                 :            : {
     286                 :          0 :         return roc_bphy_cgx_start_stop_rxtx(roc_cgx, lmac, true);
     287                 :            : }
     288                 :            : 
     289                 :            : int
     290                 :          0 : roc_bphy_cgx_stop_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     291                 :            : {
     292                 :          0 :         return roc_bphy_cgx_start_stop_rxtx(roc_cgx, lmac, false);
     293                 :            : }
     294                 :            : 
     295                 :            : int
     296                 :          0 : roc_bphy_cgx_set_link_state(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     297                 :            :                             struct roc_bphy_cgx_link_state *state)
     298                 :            : {
     299                 :            :         uint64_t scr1, scr0;
     300                 :            : 
     301         [ #  # ]:          0 :         if (!roc_cgx)
     302                 :            :                 return -EINVAL;
     303                 :            : 
     304         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     305                 :            :                 return -ENODEV;
     306                 :            : 
     307         [ #  # ]:          0 :         if (!state)
     308                 :            :                 return -EINVAL;
     309                 :            : 
     310         [ #  # ]:          0 :         scr1 = (state->state ? FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_UP) :
     311                 :          0 :                                FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_DOWN)) |
     312                 :          0 :                FIELD_PREP(SCR1_CGX_LINK_BRINGUP_ARGS_TIMEOUT, state->timeout) |
     313                 :          0 :                FIELD_PREP(SCR1_CGX_LINK_BRINGUP_ARGS_RX_TX_DIS, state->rx_tx_dis);
     314                 :            : 
     315                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     316                 :            : }
     317                 :            : 
     318                 :            : int
     319                 :          0 : roc_bphy_cgx_get_linkinfo(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     320                 :            :                           struct roc_bphy_cgx_link_info *info)
     321                 :            : {
     322                 :            :         uint64_t scr1, scr0;
     323                 :            :         int ret;
     324                 :            : 
     325         [ #  # ]:          0 :         if (!roc_cgx)
     326                 :            :                 return -EINVAL;
     327                 :            : 
     328         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     329                 :            :                 return -ENODEV;
     330                 :            : 
     331         [ #  # ]:          0 :         if (!info)
     332                 :            :                 return -EINVAL;
     333                 :            : 
     334                 :            :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_LINK_STS);
     335                 :          0 :         ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     336         [ #  # ]:          0 :         if (ret)
     337                 :            :                 return ret;
     338                 :            : 
     339                 :          0 :         info->link_up = FIELD_GET(SCR0_ETH_LNK_STS_S_LINK_UP, scr0);
     340                 :          0 :         info->full_duplex = FIELD_GET(SCR0_ETH_LNK_STS_S_FULL_DUPLEX, scr0);
     341                 :          0 :         info->speed = FIELD_GET(SCR0_ETH_LNK_STS_S_SPEED, scr0);
     342                 :          0 :         info->an = FIELD_GET(SCR0_ETH_LNK_STS_S_AN, scr0);
     343                 :          0 :         info->fec = FIELD_GET(SCR0_ETH_LNK_STS_S_FEC, scr0);
     344                 :          0 :         info->mode = FIELD_GET(SCR0_ETH_LNK_STS_S_MODE, scr0);
     345                 :            : 
     346                 :          0 :         return 0;
     347                 :            : }
     348                 :            : 
     349                 :            : int
     350                 :          0 : roc_bphy_cgx_set_link_mode(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     351                 :            :                            struct roc_bphy_cgx_link_mode *mode)
     352                 :            : {
     353                 :            :         uint64_t scr1, scr0;
     354                 :            : 
     355         [ #  # ]:          0 :         if (!mode)
     356                 :            :                 return -EINVAL;
     357                 :            : 
     358         [ #  # ]:          0 :         if (!roc_cgx)
     359                 :            :                 return -EINVAL;
     360                 :            : 
     361         [ #  # ]:          0 :         if (roc_model_is_cn9k() &&
     362   [ #  #  #  #  :          0 :             (mode->use_portm_idx || mode->portm_idx || mode->mode_group_idx)) {
                   #  # ]
     363                 :            :                 return -ENOTSUP;
     364                 :            :         }
     365                 :            : 
     366         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     367                 :            :                 return -ENODEV;
     368                 :            : 
     369                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_MODE_CHANGE) |
     370                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_SPEED, mode->speed) |
     371                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_DUPLEX, mode->full_duplex) |
     372                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_AN, mode->an) |
     373                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_USE_PORTM_IDX,
     374                 :          0 :                           mode->use_portm_idx) |
     375                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_PORTM_IDX,
     376                 :          0 :                           mode->portm_idx) |
     377                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE_GROUP_IDX,
     378                 :          0 :                           mode->mode_group_idx) |
     379                 :          0 :                FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE, BIT_ULL(mode->mode));
     380                 :            : 
     381                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     382                 :            : }
     383                 :            : 
     384                 :            : int
     385                 :          0 : roc_bphy_cgx_intlbk_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     386                 :            : {
     387                 :          0 :         return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, true);
     388                 :            : }
     389                 :            : 
     390                 :            : int
     391                 :          0 : roc_bphy_cgx_intlbk_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     392                 :            : {
     393                 :          0 :         return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, false);
     394                 :            : }
     395                 :            : 
     396                 :            : int
     397                 :          0 : roc_bphy_cgx_ptp_rx_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     398                 :            : {
     399                 :          0 :         return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, true);
     400                 :            : }
     401                 :            : 
     402                 :            : int
     403                 :          0 : roc_bphy_cgx_ptp_rx_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
     404                 :            : {
     405                 :          0 :         return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, false);
     406                 :            : }
     407                 :            : 
     408                 :            : int
     409                 :          0 : roc_bphy_cgx_fec_set(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     410                 :            :                      enum roc_bphy_cgx_eth_link_fec fec)
     411                 :            : {
     412                 :            :         uint64_t scr1, scr0;
     413                 :            : 
     414         [ #  # ]:          0 :         if (!roc_cgx)
     415                 :            :                 return -EINVAL;
     416                 :            : 
     417         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     418                 :            :                 return -ENODEV;
     419                 :            : 
     420                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_SET_FEC) |
     421                 :          0 :                FIELD_PREP(SCR1_ETH_SET_FEC_ARGS, fec);
     422                 :            : 
     423                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     424                 :            : }
     425                 :            : 
     426                 :            : int
     427                 :          0 : roc_bphy_cgx_fec_supported_get(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     428                 :            :                                enum roc_bphy_cgx_eth_link_fec *fec)
     429                 :            : {
     430                 :            :         uint64_t scr1, scr0;
     431                 :            :         int ret;
     432                 :            : 
     433         [ #  # ]:          0 :         if (!roc_cgx || !fec)
     434                 :            :                 return -EINVAL;
     435                 :            : 
     436         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     437                 :            :                 return -ENODEV;
     438                 :            : 
     439                 :            :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_SUPPORTED_FEC);
     440                 :            : 
     441                 :          0 :         ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     442         [ #  # ]:          0 :         if (ret)
     443                 :            :                 return ret;
     444                 :            : 
     445                 :          0 :         scr0 = FIELD_GET(SCR0_ETH_FEC_TYPES_S_FEC, scr0);
     446                 :          0 :         *fec = (enum roc_bphy_cgx_eth_link_fec)scr0;
     447                 :            : 
     448                 :          0 :         return 0;
     449                 :            : }
     450                 :            : 
     451                 :            : int
     452         [ #  # ]:          0 : roc_bphy_cgx_cpri_mode_change(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     453                 :            :                               struct roc_bphy_cgx_cpri_mode_change *mode)
     454                 :            : {
     455                 :            :         uint64_t scr1, scr0;
     456                 :            : 
     457   [ #  #  #  #  :          0 :         if (!(roc_model_is_cnf95xxn_a0() ||
                   #  # ]
     458                 :            :               roc_model_is_cnf95xxn_a1() ||
     459                 :            :               roc_model_is_cnf95xxn_b0()))
     460                 :            :                 return -ENOTSUP;
     461                 :            : 
     462         [ #  # ]:          0 :         if (!roc_cgx)
     463                 :            :                 return -EINVAL;
     464                 :            : 
     465         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     466                 :            :                 return -ENODEV;
     467                 :            : 
     468         [ #  # ]:          0 :         if (!mode)
     469                 :            :                 return -EINVAL;
     470                 :            : 
     471                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MODE_CHANGE) |
     472                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_GSERC_IDX,
     473                 :          0 :                           mode->gserc_idx) |
     474                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_LANE_IDX, mode->lane_idx) |
     475                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_RATE, mode->rate) |
     476                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_LEQ,
     477                 :          0 :                           mode->disable_leq) |
     478                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_DFE,
     479                 :            :                           mode->disable_dfe);
     480                 :            : 
     481                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     482                 :            : }
     483                 :            : 
     484                 :            : int
     485         [ #  # ]:          0 : roc_bphy_cgx_cpri_mode_tx_control(struct roc_bphy_cgx *roc_cgx,
     486                 :            :                                   unsigned int lmac,
     487                 :            :                                   struct roc_bphy_cgx_cpri_mode_tx_ctrl *mode)
     488                 :            : {
     489                 :            :         uint64_t scr1, scr0;
     490                 :            : 
     491   [ #  #  #  #  :          0 :         if (!(roc_model_is_cnf95xxn_a0() ||
                   #  # ]
     492                 :            :               roc_model_is_cnf95xxn_a1() ||
     493                 :            :               roc_model_is_cnf95xxn_b0()))
     494                 :            :                 return -ENOTSUP;
     495                 :            : 
     496         [ #  # ]:          0 :         if (!roc_cgx)
     497                 :            :                 return -EINVAL;
     498                 :            : 
     499         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     500                 :            :                 return -ENODEV;
     501                 :            : 
     502         [ #  # ]:          0 :         if (!mode)
     503                 :            :                 return -EINVAL;
     504                 :            : 
     505                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_TX_CONTROL) |
     506                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_GSERC_IDX,
     507                 :          0 :                           mode->gserc_idx) |
     508                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_LANE_IDX,
     509                 :          0 :                           mode->lane_idx) |
     510                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_ENABLE, mode->enable);
     511                 :            : 
     512                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     513                 :            : }
     514                 :            : 
     515                 :            : int
     516         [ #  # ]:          0 : roc_bphy_cgx_cpri_mode_misc(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
     517                 :            :                             struct roc_bphy_cgx_cpri_mode_misc *mode)
     518                 :            : {
     519                 :            :         uint64_t scr1, scr0;
     520                 :            : 
     521   [ #  #  #  #  :          0 :         if (!(roc_model_is_cnf95xxn_a0() ||
                   #  # ]
     522                 :            :               roc_model_is_cnf95xxn_a1() ||
     523                 :            :               roc_model_is_cnf95xxn_b0()))
     524                 :            :                 return -ENOTSUP;
     525                 :            : 
     526         [ #  # ]:          0 :         if (!roc_cgx)
     527                 :            :                 return -EINVAL;
     528                 :            : 
     529         [ #  # ]:          0 :         if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
     530                 :            :                 return -ENODEV;
     531                 :            : 
     532         [ #  # ]:          0 :         if (!mode)
     533                 :            :                 return -EINVAL;
     534                 :            : 
     535                 :          0 :         scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MISC) |
     536                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_GSERC_IDX,
     537                 :          0 :                           mode->gserc_idx) |
     538                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_LANE_IDX,
     539                 :          0 :                           mode->lane_idx) |
     540                 :          0 :                FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_FLAGS, mode->flags);
     541                 :            : 
     542                 :          0 :         return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
     543                 :            : }

Generated by: LCOV version 1.14