LCOV - code coverage report
Current view: top level - drivers/mempool/cnxk - cnxk_mempool.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 4 58 6.9 %
Date: 2025-03-01 20:23:48 Functions: 2 10 20.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 20 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(C) 2021 Marvell.
       3                 :            :  */
       4                 :            : 
       5                 :            : #include <rte_atomic.h>
       6                 :            : #include <bus_pci_driver.h>
       7                 :            : #include <rte_common.h>
       8                 :            : #include <rte_devargs.h>
       9                 :            : #include <rte_eal.h>
      10                 :            : #include <rte_io.h>
      11                 :            : #include <rte_kvargs.h>
      12                 :            : #include <rte_malloc.h>
      13                 :            : #include <rte_mbuf_pool_ops.h>
      14                 :            : #include <rte_pci.h>
      15                 :            : 
      16                 :            : #include "roc_api.h"
      17                 :            : 
      18                 :            : #define CNXK_NPA_DEV_NAME        RTE_STR(cnxk_npa_dev_)
      19                 :            : #define CNXK_NPA_DEV_NAME_LEN    (sizeof(CNXK_NPA_DEV_NAME) + PCI_PRI_STR_SIZE)
      20                 :            : #define CNXK_NPA_MAX_POOLS_PARAM "max_pools"
      21                 :            : 
      22                 :            : static inline uint32_t
      23                 :            : npa_aura_size_to_u32(uint8_t val)
      24                 :            : {
      25                 :            :         if (val == NPA_AURA_SZ_0)
      26                 :            :                 return 128;
      27                 :            :         if (val >= NPA_AURA_SZ_MAX)
      28                 :            :                 return BIT_ULL(20);
      29                 :            : 
      30                 :            :         return 1 << (val + 6);
      31                 :            : }
      32                 :            : 
      33                 :            : static int
      34                 :          0 : parse_max_pools_handler(const char *key, const char *value, void *extra_args)
      35                 :            : {
      36                 :            :         RTE_SET_USED(key);
      37                 :            :         uint32_t val;
      38                 :            : 
      39                 :          0 :         val = rte_align32pow2(atoi(value));
      40                 :            :         if (val < npa_aura_size_to_u32(NPA_AURA_SZ_128))
      41                 :            :                 val = 128;
      42                 :            :         if (val > npa_aura_size_to_u32(NPA_AURA_SZ_1M))
      43                 :            :                 val = BIT_ULL(20);
      44                 :            : 
      45                 :          0 :         *(uint32_t *)extra_args = val;
      46                 :          0 :         return 0;
      47                 :            : }
      48                 :            : 
      49                 :            : static inline uint32_t
      50                 :          0 : parse_max_pools(struct rte_devargs *devargs)
      51                 :            : {
      52                 :          0 :         uint32_t max_pools = npa_aura_size_to_u32(NPA_AURA_SZ_128);
      53                 :            :         struct rte_kvargs *kvlist;
      54                 :            : 
      55         [ #  # ]:          0 :         if (devargs == NULL)
      56                 :          0 :                 goto exit;
      57                 :          0 :         kvlist = rte_kvargs_parse(devargs->args, NULL);
      58         [ #  # ]:          0 :         if (kvlist == NULL)
      59                 :          0 :                 goto exit;
      60                 :            : 
      61                 :          0 :         rte_kvargs_process(kvlist, CNXK_NPA_MAX_POOLS_PARAM,
      62                 :            :                            &parse_max_pools_handler, &max_pools);
      63                 :          0 :         rte_kvargs_free(kvlist);
      64                 :          0 : exit:
      65                 :          0 :         return max_pools;
      66                 :            : }
      67                 :            : 
      68                 :            : static int
      69                 :          0 : cnxk_mempool_plt_parse_devargs(struct rte_pci_device *pci_dev)
      70                 :            : {
      71                 :          0 :         roc_idev_npa_maxpools_set(parse_max_pools(pci_dev->device.devargs));
      72                 :          0 :         return 0;
      73                 :            : }
      74                 :            : 
      75                 :            : static inline char *
      76                 :          0 : npa_dev_to_name(struct rte_pci_device *pci_dev, char *name)
      77                 :            : {
      78                 :          0 :         snprintf(name, CNXK_NPA_DEV_NAME_LEN, CNXK_NPA_DEV_NAME PCI_PRI_FMT,
      79                 :          0 :                  pci_dev->addr.domain, pci_dev->addr.bus, pci_dev->addr.devid,
      80                 :          0 :                  pci_dev->addr.function);
      81                 :            : 
      82                 :          0 :         return name;
      83                 :            : }
      84                 :            : 
      85                 :            : static int
      86                 :          0 : npa_init(struct rte_pci_device *pci_dev)
      87                 :            : {
      88                 :            :         char name[CNXK_NPA_DEV_NAME_LEN];
      89                 :            :         const struct rte_memzone *mz;
      90                 :            :         struct roc_npa *dev;
      91                 :            :         int rc = -ENOMEM;
      92                 :            : 
      93                 :          0 :         mz = rte_memzone_reserve_aligned(npa_dev_to_name(pci_dev, name),
      94                 :            :                                          sizeof(*dev), SOCKET_ID_ANY, 0,
      95                 :            :                                          RTE_CACHE_LINE_SIZE);
      96         [ #  # ]:          0 :         if (mz == NULL)
      97                 :          0 :                 goto error;
      98                 :            : 
      99                 :          0 :         dev = mz->addr;
     100                 :          0 :         dev->pci_dev = pci_dev;
     101                 :            : 
     102                 :          0 :         rc = roc_npa_dev_init(dev);
     103         [ #  # ]:          0 :         if (rc)
     104                 :          0 :                 goto mz_free;
     105                 :            : 
     106                 :            :         return 0;
     107                 :            : 
     108                 :            : mz_free:
     109                 :          0 :         rte_memzone_free(mz);
     110                 :          0 : error:
     111                 :          0 :         plt_err("failed to initialize npa device rc=%d", rc);
     112                 :          0 :         return rc;
     113                 :            : }
     114                 :            : 
     115                 :            : static int
     116                 :          0 : npa_fini(struct rte_pci_device *pci_dev)
     117                 :            : {
     118                 :            :         char name[CNXK_NPA_DEV_NAME_LEN];
     119                 :            :         const struct rte_memzone *mz;
     120                 :            :         int rc;
     121                 :            : 
     122                 :          0 :         mz = rte_memzone_lookup(npa_dev_to_name(pci_dev, name));
     123         [ #  # ]:          0 :         if (mz == NULL)
     124                 :            :                 return -EINVAL;
     125                 :            : 
     126                 :          0 :         rc = roc_npa_dev_fini(mz->addr);
     127         [ #  # ]:          0 :         if (rc) {
     128         [ #  # ]:          0 :                 if (rc != -EAGAIN)
     129                 :          0 :                         plt_err("Failed to remove npa dev, rc=%d", rc);
     130                 :          0 :                 return rc;
     131                 :            :         }
     132                 :          0 :         rte_memzone_free(mz);
     133                 :            : 
     134                 :          0 :         return 0;
     135                 :            : }
     136                 :            : 
     137                 :            : static int
     138                 :          0 : npa_remove(struct rte_pci_device *pci_dev)
     139                 :            : {
     140         [ #  # ]:          0 :         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
     141                 :            :                 return 0;
     142                 :            : 
     143                 :          0 :         return npa_fini(pci_dev);
     144                 :            : }
     145                 :            : 
     146                 :            : static int
     147                 :          0 : npa_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
     148                 :            : {
     149                 :            :         int rc;
     150                 :            : 
     151                 :            :         RTE_SET_USED(pci_drv);
     152                 :            : 
     153                 :          0 :         rc = roc_plt_init();
     154         [ #  # ]:          0 :         if (rc < 0)
     155                 :            :                 return rc;
     156                 :            : 
     157         [ #  # ]:          0 :         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
     158                 :            :                 return 0;
     159                 :            : 
     160                 :          0 :         return npa_init(pci_dev);
     161                 :            : }
     162                 :            : 
     163                 :            : static const struct rte_pci_id npa_pci_map[] = {
     164                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN20KA, PCI_DEVID_CNXK_RVU_NPA_PF),
     165                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KA, PCI_DEVID_CNXK_RVU_NPA_PF),
     166                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KAS, PCI_DEVID_CNXK_RVU_NPA_PF),
     167                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KB, PCI_DEVID_CNXK_RVU_NPA_PF),
     168                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KA, PCI_DEVID_CNXK_RVU_NPA_PF),
     169                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KB, PCI_DEVID_CNXK_RVU_NPA_PF),
     170                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_NPA_PF),
     171                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_NPA_PF),
     172                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_NPA_PF),
     173                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_NPA_PF),
     174                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_NPA_PF),
     175                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF9KA, PCI_DEVID_CNXK_RVU_NPA_PF),
     176                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN20KA, PCI_DEVID_CNXK_RVU_NPA_VF),
     177                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KA, PCI_DEVID_CNXK_RVU_NPA_VF),
     178                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KAS, PCI_DEVID_CNXK_RVU_NPA_VF),
     179                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KB, PCI_DEVID_CNXK_RVU_NPA_VF),
     180                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KA, PCI_DEVID_CNXK_RVU_NPA_VF),
     181                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KB, PCI_DEVID_CNXK_RVU_NPA_VF),
     182                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_NPA_VF),
     183                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_NPA_VF),
     184                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_NPA_VF),
     185                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_NPA_VF),
     186                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_NPA_VF),
     187                 :            :         CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF9KA, PCI_DEVID_CNXK_RVU_NPA_VF),
     188                 :            :         {
     189                 :            :                 .vendor_id = 0,
     190                 :            :         },
     191                 :            : };
     192                 :            : 
     193                 :            : static struct rte_pci_driver npa_pci = {
     194                 :            :         .id_table = npa_pci_map,
     195                 :            :         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
     196                 :            :         .probe = npa_probe,
     197                 :            :         .remove = npa_remove,
     198                 :            : };
     199                 :            : 
     200                 :        252 : RTE_PMD_REGISTER_PCI(mempool_cnxk, npa_pci);
     201                 :            : RTE_PMD_REGISTER_PCI_TABLE(mempool_cnxk, npa_pci_map);
     202                 :            : RTE_PMD_REGISTER_KMOD_DEP(mempool_cnxk, "vfio-pci");
     203                 :            : RTE_PMD_REGISTER_PARAM_STRING(mempool_cnxk,
     204                 :            :                               CNXK_NPA_MAX_POOLS_PARAM "=<128-1048576>");
     205                 :            : 
     206                 :        252 : RTE_INIT(cnxk_mempool_parse_devargs)
     207                 :            : {
     208                 :        252 :         roc_npa_lf_init_cb_register(cnxk_mempool_plt_parse_devargs);
     209                 :        252 : }

Generated by: LCOV version 1.14