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

Generated by: LCOV version 1.14