LCOV - code coverage report
Current view: top level - drivers/common/cnxk - roc_ree.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 282 0.0 %
Date: 2025-02-01 18:54:23 Functions: 0 21 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 120 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(C) 2021 Marvell.
       3                 :            :  */
       4                 :            : 
       5                 :            : #include "roc_api.h"
       6                 :            : #include "roc_priv.h"
       7                 :            : 
       8                 :            : #define REE0_PF 19
       9                 :            : #define REE1_PF 20
      10                 :            : 
      11                 :            : static int
      12                 :          0 : roc_ree_available_queues_get(struct roc_ree_vf *vf, uint16_t *nb_queues)
      13                 :            : {
      14                 :            :         struct free_rsrcs_rsp *rsp;
      15                 :          0 :         struct dev *dev = vf->dev;
      16                 :            :         int ret;
      17                 :            : 
      18                 :          0 :         mbox_alloc_msg_free_rsrc_cnt(dev->mbox);
      19                 :            : 
      20                 :          0 :         ret = mbox_process_msg(dev->mbox, (void *)&rsp);
      21         [ #  # ]:          0 :         if (ret)
      22                 :            :                 return -EIO;
      23                 :            : 
      24         [ #  # ]:          0 :         if (vf->block_address == RVU_BLOCK_ADDR_REE0)
      25                 :          0 :                 *nb_queues = rsp->ree0;
      26                 :            :         else
      27                 :          0 :                 *nb_queues = rsp->ree1;
      28                 :            :         return 0;
      29                 :            : }
      30                 :            : 
      31                 :            : static int
      32                 :            : roc_ree_max_matches_get(struct roc_ree_vf *vf, uint8_t *max_matches)
      33                 :            : {
      34                 :            :         uint64_t val;
      35                 :            :         int ret;
      36                 :            : 
      37                 :          0 :         ret = roc_ree_af_reg_read(vf, REE_AF_REEXM_MAX_MATCH, &val);
      38         [ #  # ]:          0 :         if (ret)
      39                 :            :                 return ret;
      40                 :            : 
      41                 :          0 :         *max_matches = val;
      42                 :            :         return 0;
      43                 :            : }
      44                 :            : 
      45                 :            : int
      46                 :          0 : roc_ree_queues_attach(struct roc_ree_vf *vf, uint8_t nb_queues)
      47                 :            : {
      48                 :            :         struct rsrc_attach_req *req;
      49                 :            :         struct mbox *mbox;
      50                 :            : 
      51                 :          0 :         mbox = vf->dev->mbox;
      52                 :            :         /* Ask AF to attach required LFs */
      53                 :          0 :         req = mbox_alloc_msg_attach_resources(mbox);
      54         [ #  # ]:          0 :         if (req == NULL) {
      55                 :          0 :                 plt_err("Could not allocate mailbox message");
      56                 :          0 :                 return -EFAULT;
      57                 :            :         }
      58                 :            : 
      59                 :            :         /* 1 LF = 1 queue */
      60                 :          0 :         req->reelfs = nb_queues;
      61                 :          0 :         req->ree_blkaddr = vf->block_address;
      62                 :            : 
      63         [ #  # ]:          0 :         if (mbox_process(mbox) < 0)
      64                 :            :                 return -EIO;
      65                 :            : 
      66                 :            :         /* Update number of attached queues */
      67                 :          0 :         vf->nb_queues = nb_queues;
      68                 :            : 
      69                 :          0 :         return 0;
      70                 :            : }
      71                 :            : 
      72                 :            : int
      73                 :          0 : roc_ree_queues_detach(struct roc_ree_vf *vf)
      74                 :            : {
      75                 :            :         struct rsrc_detach_req *req;
      76                 :            :         struct mbox *mbox;
      77                 :            : 
      78                 :          0 :         mbox = vf->dev->mbox;
      79                 :          0 :         req = mbox_alloc_msg_detach_resources(mbox);
      80         [ #  # ]:          0 :         if (req == NULL) {
      81                 :          0 :                 plt_err("Could not allocate mailbox message");
      82                 :          0 :                 return -EFAULT;
      83                 :            :         }
      84                 :          0 :         req->reelfs = true;
      85                 :          0 :         req->partial = true;
      86         [ #  # ]:          0 :         if (mbox_process(mbox) < 0)
      87                 :            :                 return -EIO;
      88                 :            : 
      89                 :            :         /* Queues have been detached */
      90                 :          0 :         vf->nb_queues = 0;
      91                 :            : 
      92                 :          0 :         return 0;
      93                 :            : }
      94                 :            : 
      95                 :            : int
      96                 :          0 : roc_ree_msix_offsets_get(struct roc_ree_vf *vf)
      97                 :            : {
      98                 :            :         struct msix_offset_rsp *rsp;
      99                 :            :         struct mbox *mbox;
     100                 :            :         uint32_t i, ret;
     101                 :            : 
     102                 :            :         /* Get REE MSI-X vector offsets */
     103                 :          0 :         mbox = vf->dev->mbox;
     104                 :          0 :         mbox_alloc_msg_msix_offset(mbox);
     105                 :            : 
     106                 :            :         ret = mbox_process_msg(mbox, (void *)&rsp);
     107         [ #  # ]:          0 :         if (ret)
     108                 :            :                 return ret;
     109                 :            : 
     110         [ #  # ]:          0 :         for (i = 0; i < vf->nb_queues; i++) {
     111         [ #  # ]:          0 :                 if (vf->block_address == RVU_BLOCK_ADDR_REE0)
     112                 :          0 :                         vf->lf_msixoff[i] = rsp->ree0_lf_msixoff[i];
     113                 :            :                 else
     114                 :          0 :                         vf->lf_msixoff[i] = rsp->ree1_lf_msixoff[i];
     115                 :          0 :                 plt_ree_dbg("lf_msixoff[%d]  0x%x", i, vf->lf_msixoff[i]);
     116                 :            :         }
     117                 :            : 
     118                 :            :         return 0;
     119                 :            : }
     120                 :            : 
     121                 :            : static int
     122                 :          0 : ree_send_mbox_msg(struct roc_ree_vf *vf)
     123                 :            : {
     124                 :          0 :         struct mbox *mbox = vf->dev->mbox;
     125                 :            :         int ret;
     126                 :            : 
     127                 :          0 :         mbox_msg_send(mbox, 0);
     128                 :            : 
     129                 :          0 :         ret = mbox_wait_for_rsp(mbox, 0);
     130         [ #  # ]:          0 :         if (ret < 0) {
     131                 :          0 :                 plt_err("Could not get mailbox response");
     132                 :          0 :                 return ret;
     133                 :            :         }
     134                 :            : 
     135                 :            :         return 0;
     136                 :            : }
     137                 :            : 
     138                 :            : int
     139                 :          0 : roc_ree_config_lf(struct roc_ree_vf *vf, uint8_t lf, uint8_t pri, uint32_t size)
     140                 :            : {
     141                 :            :         struct ree_lf_req_msg *req;
     142                 :            :         struct mbox *mbox;
     143                 :            :         int ret;
     144                 :            : 
     145                 :          0 :         mbox = vf->dev->mbox;
     146                 :          0 :         req = mbox_alloc_msg_ree_config_lf(mbox);
     147         [ #  # ]:          0 :         if (req == NULL) {
     148                 :          0 :                 plt_err("Could not allocate mailbox message");
     149                 :          0 :                 return -EFAULT;
     150                 :            :         }
     151                 :            : 
     152                 :          0 :         req->lf = lf;
     153                 :          0 :         req->pri = pri ? 1 : 0;
     154                 :          0 :         req->size = size;
     155                 :          0 :         req->blkaddr = vf->block_address;
     156                 :            : 
     157                 :          0 :         ret = mbox_process(mbox);
     158         [ #  # ]:          0 :         if (ret < 0) {
     159                 :          0 :                 plt_err("Could not get mailbox response");
     160                 :          0 :                 return ret;
     161                 :            :         }
     162                 :            :         return 0;
     163                 :            : }
     164                 :            : 
     165                 :            : int
     166                 :          0 : roc_ree_af_reg_read(struct roc_ree_vf *vf, uint64_t reg, uint64_t *val)
     167                 :            : {
     168                 :            :         struct ree_rd_wr_reg_msg *msg;
     169                 :            :         struct mbox_dev *mdev;
     170                 :            :         struct mbox *mbox;
     171                 :            :         int ret, off;
     172                 :            : 
     173                 :          0 :         mbox = vf->dev->mbox;
     174                 :          0 :         mdev = &mbox->dev[0];
     175                 :          0 :         msg = (struct ree_rd_wr_reg_msg *)mbox_alloc_msg_rsp(
     176                 :            :                 mbox, 0, sizeof(*msg), sizeof(*msg));
     177         [ #  # ]:          0 :         if (msg == NULL) {
     178                 :          0 :                 plt_err("Could not allocate mailbox message");
     179                 :          0 :                 return -EFAULT;
     180                 :            :         }
     181                 :            : 
     182                 :          0 :         msg->hdr.id = MBOX_MSG_REE_RD_WR_REGISTER;
     183                 :          0 :         msg->hdr.sig = MBOX_REQ_SIG;
     184                 :          0 :         msg->hdr.pcifunc = vf->dev->pf_func;
     185                 :          0 :         msg->is_write = 0;
     186                 :          0 :         msg->reg_offset = reg;
     187                 :          0 :         msg->ret_val = val;
     188                 :          0 :         msg->blkaddr = vf->block_address;
     189                 :            : 
     190                 :          0 :         ret = ree_send_mbox_msg(vf);
     191         [ #  # ]:          0 :         if (ret < 0)
     192                 :            :                 return ret;
     193                 :            : 
     194                 :          0 :         off = mbox->rx_start +
     195                 :            :               RTE_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
     196                 :          0 :         msg = (struct ree_rd_wr_reg_msg *)((uintptr_t)mdev->mbase + off);
     197                 :            : 
     198                 :          0 :         *val = msg->val;
     199                 :            : 
     200                 :          0 :         return 0;
     201                 :            : }
     202                 :            : 
     203                 :            : int
     204                 :          0 : roc_ree_af_reg_write(struct roc_ree_vf *vf, uint64_t reg, uint64_t val)
     205                 :            : {
     206                 :            :         struct ree_rd_wr_reg_msg *msg;
     207                 :            :         struct mbox *mbox;
     208                 :            : 
     209                 :          0 :         mbox = vf->dev->mbox;
     210                 :          0 :         msg = (struct ree_rd_wr_reg_msg *)mbox_alloc_msg_rsp(
     211                 :            :                 mbox, 0, sizeof(*msg), sizeof(*msg));
     212         [ #  # ]:          0 :         if (msg == NULL) {
     213                 :          0 :                 plt_err("Could not allocate mailbox message");
     214                 :          0 :                 return -EFAULT;
     215                 :            :         }
     216                 :            : 
     217                 :          0 :         msg->hdr.id = MBOX_MSG_REE_RD_WR_REGISTER;
     218                 :          0 :         msg->hdr.sig = MBOX_REQ_SIG;
     219                 :          0 :         msg->hdr.pcifunc = vf->dev->pf_func;
     220                 :          0 :         msg->is_write = 1;
     221                 :          0 :         msg->reg_offset = reg;
     222                 :          0 :         msg->val = val;
     223                 :          0 :         msg->blkaddr = vf->block_address;
     224                 :            : 
     225                 :          0 :         return ree_send_mbox_msg(vf);
     226                 :            : }
     227                 :            : 
     228                 :            : int
     229                 :          0 : roc_ree_rule_db_get(struct roc_ree_vf *vf, char *rule_db, uint32_t rule_db_len,
     230                 :            :                     char *rule_dbi, uint32_t rule_dbi_len)
     231                 :            : {
     232                 :            :         struct ree_rule_db_get_req_msg *req;
     233                 :            :         struct ree_rule_db_get_rsp_msg *rsp;
     234                 :            :         char *rule_db_ptr = (char *)rule_db;
     235                 :            :         struct mbox *mbox;
     236                 :            :         int ret, last = 0;
     237                 :            :         uint32_t len = 0;
     238                 :            : 
     239                 :          0 :         mbox = vf->dev->mbox;
     240         [ #  # ]:          0 :         if (!rule_db) {
     241                 :          0 :                 plt_err("Couldn't return rule db due to NULL pointer");
     242                 :          0 :                 return -EFAULT;
     243                 :            :         }
     244                 :            : 
     245         [ #  # ]:          0 :         while (!last) {
     246                 :          0 :                 req = (struct ree_rule_db_get_req_msg *)mbox_alloc_msg_rsp(
     247                 :            :                         mbox, 0, sizeof(*req), sizeof(*rsp));
     248         [ #  # ]:          0 :                 if (!req) {
     249                 :          0 :                         plt_err("Could not allocate mailbox message");
     250                 :          0 :                         return -EFAULT;
     251                 :            :                 }
     252                 :            : 
     253                 :          0 :                 req->hdr.id = MBOX_MSG_REE_RULE_DB_GET;
     254                 :          0 :                 req->hdr.sig = MBOX_REQ_SIG;
     255                 :          0 :                 req->hdr.pcifunc = vf->dev->pf_func;
     256                 :          0 :                 req->blkaddr = vf->block_address;
     257                 :          0 :                 req->is_dbi = 0;
     258                 :          0 :                 req->offset = len;
     259                 :            :                 ret = mbox_process_msg(mbox, (void *)&rsp);
     260         [ #  # ]:          0 :                 if (ret)
     261                 :          0 :                         return ret;
     262         [ #  # ]:          0 :                 if (rule_db_len < len + rsp->len) {
     263                 :          0 :                         plt_err("Rule db size is too small");
     264                 :          0 :                         return -EFAULT;
     265                 :            :                 }
     266         [ #  # ]:          0 :                 mbox_memcpy(rule_db_ptr, rsp->rule_db, rsp->len);
     267                 :          0 :                 len += rsp->len;
     268                 :          0 :                 rule_db_ptr = rule_db_ptr + rsp->len;
     269                 :          0 :                 last = rsp->is_last;
     270                 :            :         }
     271                 :            : 
     272         [ #  # ]:          0 :         if (rule_dbi) {
     273                 :          0 :                 req = (struct ree_rule_db_get_req_msg *)mbox_alloc_msg_rsp(
     274                 :            :                         mbox, 0, sizeof(*req), sizeof(*rsp));
     275         [ #  # ]:          0 :                 if (!req) {
     276                 :          0 :                         plt_err("Could not allocate mailbox message");
     277                 :          0 :                         return -EFAULT;
     278                 :            :                 }
     279                 :            : 
     280                 :          0 :                 req->hdr.id = MBOX_MSG_REE_RULE_DB_GET;
     281                 :          0 :                 req->hdr.sig = MBOX_REQ_SIG;
     282                 :          0 :                 req->hdr.pcifunc = vf->dev->pf_func;
     283                 :          0 :                 req->blkaddr = vf->block_address;
     284                 :          0 :                 req->is_dbi = 1;
     285                 :          0 :                 req->offset = 0;
     286                 :            : 
     287                 :            :                 ret = mbox_process_msg(mbox, (void *)&rsp);
     288         [ #  # ]:          0 :                 if (ret)
     289                 :            :                         return ret;
     290         [ #  # ]:          0 :                 if (rule_dbi_len < rsp->len) {
     291                 :          0 :                         plt_err("Rule dbi size is too small");
     292                 :          0 :                         return -EFAULT;
     293                 :            :                 }
     294                 :          0 :                 mbox_memcpy(rule_dbi, rsp->rule_db, rsp->len);
     295                 :            :         }
     296                 :            :         return 0;
     297                 :            : }
     298                 :            : 
     299                 :            : int
     300                 :          0 : roc_ree_rule_db_len_get(struct roc_ree_vf *vf, uint32_t *rule_db_len,
     301                 :            :                         uint32_t *rule_dbi_len)
     302                 :            : {
     303                 :            :         struct ree_rule_db_len_rsp_msg *rsp;
     304                 :            :         struct ree_req_msg *req;
     305                 :            :         struct mbox *mbox;
     306                 :            :         int ret;
     307                 :            : 
     308                 :          0 :         mbox = vf->dev->mbox;
     309                 :          0 :         req = (struct ree_req_msg *)mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
     310                 :            :                                                        sizeof(*rsp));
     311         [ #  # ]:          0 :         if (!req) {
     312                 :          0 :                 plt_err("Could not allocate mailbox message");
     313                 :          0 :                 return -EFAULT;
     314                 :            :         }
     315                 :            : 
     316                 :          0 :         req->hdr.id = MBOX_MSG_REE_RULE_DB_LEN_GET;
     317                 :          0 :         req->hdr.sig = MBOX_REQ_SIG;
     318                 :          0 :         req->hdr.pcifunc = vf->dev->pf_func;
     319                 :          0 :         req->blkaddr = vf->block_address;
     320                 :            :         ret = mbox_process_msg(mbox, (void *)&rsp);
     321         [ #  # ]:          0 :         if (ret)
     322                 :            :                 return ret;
     323         [ #  # ]:          0 :         if (rule_db_len != NULL)
     324                 :          0 :                 *rule_db_len = rsp->len;
     325         [ #  # ]:          0 :         if (rule_dbi_len != NULL)
     326                 :          0 :                 *rule_dbi_len = rsp->inc_len;
     327                 :            : 
     328                 :            :         return 0;
     329                 :            : }
     330                 :            : 
     331                 :            : static int
     332                 :          0 : ree_db_msg(struct roc_ree_vf *vf, const char *db, uint32_t db_len, int inc,
     333                 :            :            int dbi)
     334                 :            : {
     335                 :            :         uint32_t len_left = db_len, offset = 0;
     336                 :            :         struct ree_rule_db_prog_req_msg *req;
     337                 :            :         const char *rule_db_ptr = db;
     338                 :            :         struct mbox *mbox;
     339                 :            :         struct msg_rsp *rsp;
     340                 :            :         int ret;
     341                 :            : 
     342                 :          0 :         mbox = vf->dev->mbox;
     343         [ #  # ]:          0 :         while (len_left) {
     344                 :          0 :                 req = (struct ree_rule_db_prog_req_msg *)mbox_alloc_msg_rsp(
     345                 :            :                         mbox, 0, sizeof(*req), sizeof(*rsp));
     346         [ #  # ]:          0 :                 if (!req) {
     347                 :          0 :                         plt_err("Could not allocate mailbox message");
     348                 :          0 :                         return -EFAULT;
     349                 :            :                 }
     350                 :          0 :                 req->hdr.id = MBOX_MSG_REE_RULE_DB_PROG;
     351                 :          0 :                 req->hdr.sig = MBOX_REQ_SIG;
     352                 :          0 :                 req->hdr.pcifunc = vf->dev->pf_func;
     353                 :          0 :                 req->offset = offset;
     354                 :          0 :                 req->total_len = db_len;
     355                 :          0 :                 req->len = REE_RULE_DB_REQ_BLOCK_SIZE;
     356                 :          0 :                 req->is_incremental = inc;
     357                 :          0 :                 req->is_dbi = dbi;
     358                 :          0 :                 req->blkaddr = vf->block_address;
     359                 :            : 
     360         [ #  # ]:          0 :                 if (len_left < REE_RULE_DB_REQ_BLOCK_SIZE) {
     361                 :          0 :                         req->is_last = true;
     362                 :          0 :                         req->len = len_left;
     363                 :            :                 }
     364         [ #  # ]:          0 :                 mbox_memcpy(req->rule_db, rule_db_ptr, req->len);
     365                 :            :                 ret = mbox_process_msg(mbox, (void *)&rsp);
     366         [ #  # ]:          0 :                 if (ret) {
     367                 :          0 :                         plt_err("Programming mailbox processing failed");
     368                 :          0 :                         return ret;
     369                 :            :                 }
     370                 :          0 :                 len_left -= req->len;
     371                 :          0 :                 offset += req->len;
     372                 :          0 :                 rule_db_ptr = rule_db_ptr + req->len;
     373                 :            :         }
     374                 :            :         return 0;
     375                 :            : }
     376                 :            : 
     377                 :            : int
     378                 :          0 : roc_ree_rule_db_prog(struct roc_ree_vf *vf, const char *rule_db,
     379                 :            :                      uint32_t rule_db_len, const char *rule_dbi,
     380                 :            :                      uint32_t rule_dbi_len)
     381                 :            : {
     382                 :            :         int inc, ret;
     383                 :            : 
     384         [ #  # ]:          0 :         if (rule_db_len == 0) {
     385                 :          0 :                 plt_err("Couldn't program empty rule db");
     386                 :          0 :                 return -EFAULT;
     387                 :            :         }
     388                 :          0 :         inc = (rule_dbi_len != 0);
     389   [ #  #  #  # ]:          0 :         if ((rule_db == NULL) || (inc && (rule_dbi == NULL))) {
     390                 :          0 :                 plt_err("Couldn't program NULL rule db");
     391                 :          0 :                 return -EFAULT;
     392                 :            :         }
     393         [ #  # ]:          0 :         if (inc) {
     394                 :          0 :                 ret = ree_db_msg(vf, rule_dbi, rule_dbi_len, inc, 1);
     395         [ #  # ]:          0 :                 if (ret)
     396                 :            :                         return ret;
     397                 :            :         }
     398                 :          0 :         return ree_db_msg(vf, rule_db, rule_db_len, inc, 0);
     399                 :            : }
     400                 :            : 
     401                 :            : static int
     402                 :            : ree_get_blkaddr(struct dev *dev)
     403                 :            : {
     404                 :            :         int pf;
     405                 :            : 
     406         [ #  # ]:          0 :         pf = dev_get_pf(dev->pf_func);
     407         [ #  # ]:          0 :         if (pf == REE0_PF)
     408                 :            :                 return RVU_BLOCK_ADDR_REE0;
     409         [ #  # ]:          0 :         else if (pf == REE1_PF)
     410                 :            :                 return RVU_BLOCK_ADDR_REE1;
     411                 :            :         else
     412                 :          0 :                 return 0;
     413                 :            : }
     414                 :            : 
     415                 :            : uintptr_t
     416                 :          0 : roc_ree_qp_get_base(struct roc_ree_vf *vf, uint16_t qp_id)
     417                 :            : {
     418                 :          0 :         return REE_LF_BAR2(vf, qp_id);
     419                 :            : }
     420                 :            : 
     421                 :            : static void
     422                 :          0 : roc_ree_lf_err_intr_handler(void *param)
     423                 :            : {
     424                 :          0 :         uintptr_t base = (uintptr_t)param;
     425                 :            :         uint8_t lf_id;
     426                 :            :         uint64_t intr;
     427                 :            : 
     428                 :          0 :         lf_id = (base >> 12) & 0xFF;
     429                 :            : 
     430         [ #  # ]:          0 :         intr = plt_read64(base + REE_LF_MISC_INT);
     431         [ #  # ]:          0 :         if (intr == 0)
     432                 :            :                 return;
     433                 :            : 
     434                 :          0 :         plt_ree_dbg("LF %d MISC_INT: 0x%" PRIx64 "", lf_id, intr);
     435                 :            : 
     436                 :            :         /* Clear interrupt */
     437                 :            :         plt_write64(intr, base + REE_LF_MISC_INT);
     438                 :            : }
     439                 :            : 
     440                 :            : static void
     441                 :            : roc_ree_lf_err_intr_unregister(struct roc_ree_vf *vf, uint16_t msix_off,
     442                 :            :                                uintptr_t base)
     443                 :            : {
     444                 :          0 :         struct plt_pci_device *pci_dev = vf->pci_dev;
     445                 :            : 
     446                 :            :         /* Disable error interrupts */
     447                 :          0 :         plt_write64(~0ull, base + REE_LF_MISC_INT_ENA_W1C);
     448                 :            : 
     449                 :          0 :         dev_irq_unregister(pci_dev->intr_handle,
     450                 :            :                            roc_ree_lf_err_intr_handler, (void *)base, msix_off);
     451                 :            : }
     452                 :            : 
     453                 :            : void
     454                 :          0 : roc_ree_err_intr_unregister(struct roc_ree_vf *vf)
     455                 :            : {
     456                 :            :         uintptr_t base;
     457                 :            :         uint32_t i;
     458                 :            : 
     459         [ #  # ]:          0 :         for (i = 0; i < vf->nb_queues; i++) {
     460                 :          0 :                 base = REE_LF_BAR2(vf, i);
     461                 :          0 :                 roc_ree_lf_err_intr_unregister(vf, vf->lf_msixoff[i], base);
     462                 :            :         }
     463                 :            : 
     464                 :          0 :         vf->err_intr_registered = 0;
     465                 :          0 : }
     466                 :            : 
     467                 :            : static int
     468                 :          0 : roc_ree_lf_err_intr_register(struct roc_ree_vf *vf, uint16_t msix_off,
     469                 :            :                              uintptr_t base)
     470                 :            : {
     471                 :          0 :         struct plt_pci_device *pci_dev = vf->pci_dev;
     472                 :            :         int ret;
     473                 :            : 
     474                 :            :         /* Disable error interrupts */
     475                 :          0 :         plt_write64(~0ull, base + REE_LF_MISC_INT_ENA_W1C);
     476                 :            : 
     477                 :            :         /* Register error interrupt handler */
     478                 :          0 :         ret = dev_irq_register(pci_dev->intr_handle,
     479                 :            :                                roc_ree_lf_err_intr_handler, (void *)base,
     480                 :            :                                msix_off);
     481         [ #  # ]:          0 :         if (ret)
     482                 :            :                 return ret;
     483                 :            : 
     484                 :            :         /* Enable error interrupts */
     485                 :          0 :         plt_write64(~0ull, base + REE_LF_MISC_INT_ENA_W1S);
     486                 :            : 
     487                 :          0 :         return 0;
     488                 :            : }
     489                 :            : 
     490                 :            : int
     491                 :          0 : roc_ree_err_intr_register(struct roc_ree_vf *vf)
     492                 :            : {
     493                 :            :         uint32_t i, j, ret;
     494                 :            :         uintptr_t base;
     495                 :            : 
     496         [ #  # ]:          0 :         for (i = 0; i < vf->nb_queues; i++) {
     497         [ #  # ]:          0 :                 if (vf->lf_msixoff[i] == MSIX_VECTOR_INVALID) {
     498                 :          0 :                         plt_err("Invalid REE LF MSI-X offset: 0x%x",
     499                 :            :                                 vf->lf_msixoff[i]);
     500                 :          0 :                         return -EINVAL;
     501                 :            :                 }
     502                 :            :         }
     503                 :            : 
     504         [ #  # ]:          0 :         for (i = 0; i < vf->nb_queues; i++) {
     505                 :          0 :                 base = REE_LF_BAR2(vf, i);
     506                 :          0 :                 ret = roc_ree_lf_err_intr_register(vf, vf->lf_msixoff[i], base);
     507         [ #  # ]:          0 :                 if (ret)
     508                 :          0 :                         goto intr_unregister;
     509                 :            :         }
     510                 :            : 
     511                 :          0 :         vf->err_intr_registered = 1;
     512                 :          0 :         return 0;
     513                 :            : 
     514                 :            : intr_unregister:
     515                 :            :         /* Unregister the ones already registered */
     516         [ #  # ]:          0 :         for (j = 0; j < i; j++) {
     517                 :          0 :                 base = REE_LF_BAR2(vf, j);
     518                 :          0 :                 roc_ree_lf_err_intr_unregister(vf, vf->lf_msixoff[j], base);
     519                 :            :         }
     520                 :            :         return ret;
     521                 :            : }
     522                 :            : 
     523                 :            : int
     524                 :          0 : roc_ree_iq_enable(struct roc_ree_vf *vf, const struct roc_ree_qp *qp,
     525                 :            :                   uint8_t pri, uint32_t size_div2)
     526                 :            : {
     527                 :            :         uint64_t val;
     528                 :            : 
     529                 :            :         /* Set instruction queue size and priority */
     530                 :          0 :         roc_ree_config_lf(vf, qp->id, pri, size_div2);
     531                 :            : 
     532                 :            :         /* Set instruction queue base address */
     533                 :            :         /* Should be written after SBUF_CTL and before LF_ENA */
     534                 :            : 
     535                 :          0 :         val = plt_read64(qp->base + REE_LF_SBUF_ADDR);
     536                 :          0 :         val &= ~REE_LF_SBUF_ADDR_PTR_MASK;
     537                 :          0 :         val |= FIELD_PREP(REE_LF_SBUF_ADDR_PTR_MASK, qp->iq_dma_addr >> 7);
     538                 :            :         plt_write64(val, qp->base + REE_LF_SBUF_ADDR);
     539                 :            : 
     540                 :            :         /* Enable instruction queue */
     541                 :            : 
     542                 :          0 :         val = plt_read64(qp->base + REE_LF_ENA);
     543                 :          0 :         val &= ~REE_LF_ENA_ENA_MASK;
     544                 :          0 :         val |= FIELD_PREP(REE_LF_ENA_ENA_MASK, 1);
     545                 :            :         plt_write64(val, qp->base + REE_LF_ENA);
     546                 :            : 
     547                 :          0 :         return 0;
     548                 :            : }
     549                 :            : 
     550                 :            : void
     551                 :          0 : roc_ree_iq_disable(struct roc_ree_qp *qp)
     552                 :            : {
     553                 :            :         uint64_t val;
     554                 :            : 
     555                 :            :         /* Stop instruction execution */
     556                 :          0 :         val = plt_read64(qp->base + REE_LF_ENA);
     557                 :          0 :         val &= ~REE_LF_ENA_ENA_MASK;
     558                 :            :         val |= FIELD_PREP(REE_LF_ENA_ENA_MASK, 0);
     559                 :            :         plt_write64(val, qp->base + REE_LF_ENA);
     560                 :          0 : }
     561                 :            : 
     562                 :            : int
     563                 :          0 : roc_ree_dev_init(struct roc_ree_vf *vf)
     564                 :            : {
     565                 :            :         struct plt_pci_device *pci_dev;
     566                 :            :         struct ree *ree;
     567                 :            :         struct dev *dev;
     568                 :            :         uint8_t max_matches = 0;
     569                 :          0 :         uint16_t nb_queues = 0;
     570                 :            :         int rc;
     571                 :            : 
     572   [ #  #  #  # ]:          0 :         if (vf == NULL || vf->pci_dev == NULL)
     573                 :            :                 return -EINVAL;
     574                 :            : 
     575                 :            :         PLT_STATIC_ASSERT(sizeof(struct ree) <= ROC_REE_MEM_SZ);
     576                 :            : 
     577                 :            :         ree = roc_ree_to_ree_priv(vf);
     578                 :            :         memset(ree, 0, sizeof(*ree));
     579                 :          0 :         vf->dev = &ree->dev;
     580                 :            : 
     581                 :            :         pci_dev = vf->pci_dev;
     582                 :            :         dev = vf->dev;
     583                 :            : 
     584                 :            :         /* Initialize device  */
     585                 :          0 :         rc = dev_init(dev, pci_dev);
     586         [ #  # ]:          0 :         if (rc) {
     587                 :          0 :                 plt_err("Failed to init roc device");
     588                 :          0 :                 goto fail;
     589                 :            :         }
     590                 :            : 
     591                 :            :         /* Get REE block address */
     592                 :          0 :         vf->block_address = ree_get_blkaddr(dev);
     593         [ #  # ]:          0 :         if (!vf->block_address) {
     594                 :          0 :                 plt_err("Could not determine block PF number");
     595                 :          0 :                 goto fail;
     596                 :            :         }
     597                 :            : 
     598                 :            :         /* Get number of queues available on the device */
     599                 :          0 :         rc = roc_ree_available_queues_get(vf, &nb_queues);
     600         [ #  # ]:          0 :         if (rc) {
     601                 :          0 :                 plt_err("Could not determine the number of queues available");
     602                 :          0 :                 goto fail;
     603                 :            :         }
     604                 :            : 
     605                 :            :         /* Don't exceed the limits set per VF */
     606                 :          0 :         nb_queues = RTE_MIN(nb_queues, REE_MAX_QUEUES_PER_VF);
     607                 :            : 
     608         [ #  # ]:          0 :         if (nb_queues == 0) {
     609                 :          0 :                 plt_err("No free queues available on the device");
     610                 :          0 :                 goto fail;
     611                 :            :         }
     612                 :            : 
     613                 :          0 :         vf->max_queues = nb_queues;
     614                 :            : 
     615                 :          0 :         plt_ree_dbg("Max queues supported by device: %d", vf->max_queues);
     616                 :            : 
     617                 :            :         /* Get number of maximum matches supported on the device */
     618                 :            :         rc = roc_ree_max_matches_get(vf, &max_matches);
     619                 :            :         if (rc) {
     620                 :          0 :                 plt_err("Could not determine the maximum matches supported");
     621                 :          0 :                 goto fail;
     622                 :            :         }
     623                 :            :         /* Don't exceed the limits set per VF */
     624                 :          0 :         max_matches = RTE_MIN(max_matches, REE_MAX_MATCHES_PER_VF);
     625         [ #  # ]:          0 :         if (max_matches == 0) {
     626                 :          0 :                 plt_err("Could not determine the maximum matches supported");
     627                 :          0 :                 goto fail;
     628                 :            :         }
     629                 :            : 
     630                 :          0 :         vf->max_matches = max_matches;
     631                 :            : 
     632                 :          0 :         plt_ree_dbg("Max matches supported by device: %d", vf->max_matches);
     633                 :            : fail:
     634                 :            :         return rc;
     635                 :            : }
     636                 :            : 
     637                 :            : int
     638                 :          0 : roc_ree_dev_fini(struct roc_ree_vf *vf)
     639                 :            : {
     640         [ #  # ]:          0 :         if (vf == NULL)
     641                 :            :                 return -EINVAL;
     642                 :            : 
     643                 :          0 :         vf->max_matches = 0;
     644                 :          0 :         vf->max_queues = 0;
     645                 :            : 
     646                 :          0 :         return dev_fini(vf->dev, vf->pci_dev);
     647                 :            : }

Generated by: LCOV version 1.14