167fc3ff9SGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause 267fc3ff9SGagandeep Singh * Copyright 2019 NXP 367fc3ff9SGagandeep Singh */ 467fc3ff9SGagandeep Singh 567fc3ff9SGagandeep Singh #include <rte_kvargs.h> 667fc3ff9SGagandeep Singh #include <rte_ethdev_vdev.h> 767fc3ff9SGagandeep Singh #include <rte_bus_vdev.h> 867fc3ff9SGagandeep Singh #include <dpaa_of.h> 967fc3ff9SGagandeep Singh 10*b1bc1afaSGagandeep Singh #include "pfe_logs.h" 1167fc3ff9SGagandeep Singh #include "pfe_mod.h" 1267fc3ff9SGagandeep Singh 1367fc3ff9SGagandeep Singh #define PFE_MAX_MACS 1 /*we can support upto 4 MACs per IF*/ 1467fc3ff9SGagandeep Singh #define PFE_VDEV_GEM_ID_ARG "intf" 1567fc3ff9SGagandeep Singh 1667fc3ff9SGagandeep Singh struct pfe_vdev_init_params { 1767fc3ff9SGagandeep Singh int8_t gem_id; 1867fc3ff9SGagandeep Singh }; 1967fc3ff9SGagandeep Singh static struct pfe *g_pfe; 2067fc3ff9SGagandeep Singh 2167fc3ff9SGagandeep Singh /* TODO: make pfe_svr a runtime option. 2267fc3ff9SGagandeep Singh * Driver should be able to get the SVR 2367fc3ff9SGagandeep Singh * information from HW. 2467fc3ff9SGagandeep Singh */ 2567fc3ff9SGagandeep Singh unsigned int pfe_svr = SVR_LS1012A_REV1; 2667fc3ff9SGagandeep Singh 27*b1bc1afaSGagandeep Singh int pfe_logtype_pmd; 28*b1bc1afaSGagandeep Singh 2967fc3ff9SGagandeep Singh static void 3067fc3ff9SGagandeep Singh pfe_soc_version_get(void) 3167fc3ff9SGagandeep Singh { 3267fc3ff9SGagandeep Singh FILE *svr_file = NULL; 3367fc3ff9SGagandeep Singh unsigned int svr_ver = 0; 3467fc3ff9SGagandeep Singh 35*b1bc1afaSGagandeep Singh PMD_INIT_FUNC_TRACE(); 36*b1bc1afaSGagandeep Singh 3767fc3ff9SGagandeep Singh svr_file = fopen(PFE_SOC_ID_FILE, "r"); 38*b1bc1afaSGagandeep Singh if (!svr_file) { 39*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Unable to open SoC device"); 4067fc3ff9SGagandeep Singh return; /* Not supported on this infra */ 41*b1bc1afaSGagandeep Singh } 4267fc3ff9SGagandeep Singh 4367fc3ff9SGagandeep Singh if (fscanf(svr_file, "svr:%x", &svr_ver) > 0) 4467fc3ff9SGagandeep Singh pfe_svr = svr_ver; 4567fc3ff9SGagandeep Singh else 46*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Unable to read SoC device"); 4767fc3ff9SGagandeep Singh 4867fc3ff9SGagandeep Singh fclose(svr_file); 4967fc3ff9SGagandeep Singh } 5067fc3ff9SGagandeep Singh 5167fc3ff9SGagandeep Singh static int 5267fc3ff9SGagandeep Singh pfe_eth_open_cdev(struct pfe_eth_priv_s *priv) 5367fc3ff9SGagandeep Singh { 5467fc3ff9SGagandeep Singh int pfe_cdev_fd; 5567fc3ff9SGagandeep Singh 5667fc3ff9SGagandeep Singh if (priv == NULL) 5767fc3ff9SGagandeep Singh return -1; 5867fc3ff9SGagandeep Singh 5967fc3ff9SGagandeep Singh pfe_cdev_fd = open(PFE_CDEV_PATH, O_RDONLY); 6067fc3ff9SGagandeep Singh if (pfe_cdev_fd < 0) { 61*b1bc1afaSGagandeep Singh PFE_PMD_WARN("Unable to open PFE device file (%s).\n", 62*b1bc1afaSGagandeep Singh PFE_CDEV_PATH); 63*b1bc1afaSGagandeep Singh PFE_PMD_WARN("Link status update will not be available.\n"); 6467fc3ff9SGagandeep Singh priv->link_fd = PFE_CDEV_INVALID_FD; 6567fc3ff9SGagandeep Singh return -1; 6667fc3ff9SGagandeep Singh } 6767fc3ff9SGagandeep Singh 6867fc3ff9SGagandeep Singh priv->link_fd = pfe_cdev_fd; 6967fc3ff9SGagandeep Singh 7067fc3ff9SGagandeep Singh return 0; 7167fc3ff9SGagandeep Singh } 7267fc3ff9SGagandeep Singh 7367fc3ff9SGagandeep Singh static void 7467fc3ff9SGagandeep Singh pfe_eth_close_cdev(struct pfe_eth_priv_s *priv) 7567fc3ff9SGagandeep Singh { 7667fc3ff9SGagandeep Singh if (priv == NULL) 7767fc3ff9SGagandeep Singh return; 7867fc3ff9SGagandeep Singh 7967fc3ff9SGagandeep Singh if (priv->link_fd != PFE_CDEV_INVALID_FD) { 8067fc3ff9SGagandeep Singh close(priv->link_fd); 8167fc3ff9SGagandeep Singh priv->link_fd = PFE_CDEV_INVALID_FD; 8267fc3ff9SGagandeep Singh } 8367fc3ff9SGagandeep Singh } 8467fc3ff9SGagandeep Singh 8567fc3ff9SGagandeep Singh static void 8667fc3ff9SGagandeep Singh pfe_eth_exit(struct rte_eth_dev *dev, struct pfe *pfe) 8767fc3ff9SGagandeep Singh { 88*b1bc1afaSGagandeep Singh PMD_INIT_FUNC_TRACE(); 89*b1bc1afaSGagandeep Singh 9067fc3ff9SGagandeep Singh /* Close the device file for link status */ 9167fc3ff9SGagandeep Singh pfe_eth_close_cdev(dev->data->dev_private); 9267fc3ff9SGagandeep Singh 9367fc3ff9SGagandeep Singh rte_free(dev->data->mac_addrs); 9467fc3ff9SGagandeep Singh rte_eth_dev_release_port(dev); 9567fc3ff9SGagandeep Singh pfe->nb_devs--; 9667fc3ff9SGagandeep Singh } 9767fc3ff9SGagandeep Singh 9867fc3ff9SGagandeep Singh static int 9967fc3ff9SGagandeep Singh pfe_eth_init(struct rte_vdev_device *vdev, struct pfe *pfe, int id) 10067fc3ff9SGagandeep Singh { 10167fc3ff9SGagandeep Singh struct rte_eth_dev *eth_dev = NULL; 10267fc3ff9SGagandeep Singh struct pfe_eth_priv_s *priv = NULL; 10367fc3ff9SGagandeep Singh int err; 10467fc3ff9SGagandeep Singh 10567fc3ff9SGagandeep Singh eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*priv)); 10667fc3ff9SGagandeep Singh if (eth_dev == NULL) 10767fc3ff9SGagandeep Singh return -ENOMEM; 10867fc3ff9SGagandeep Singh 10967fc3ff9SGagandeep Singh priv = eth_dev->data->dev_private; 11067fc3ff9SGagandeep Singh priv->ndev = eth_dev; 11167fc3ff9SGagandeep Singh priv->pfe = pfe; 11267fc3ff9SGagandeep Singh 11367fc3ff9SGagandeep Singh pfe->eth.eth_priv[id] = priv; 11467fc3ff9SGagandeep Singh 11567fc3ff9SGagandeep Singh #define HIF_GEMAC_TMUQ_BASE 6 11667fc3ff9SGagandeep Singh priv->low_tmu_q = HIF_GEMAC_TMUQ_BASE + (id * 2); 11767fc3ff9SGagandeep Singh priv->high_tmu_q = priv->low_tmu_q + 1; 11867fc3ff9SGagandeep Singh 11967fc3ff9SGagandeep Singh rte_spinlock_init(&priv->lock); 12067fc3ff9SGagandeep Singh 12167fc3ff9SGagandeep Singh /* Copy the station address into the dev structure, */ 12267fc3ff9SGagandeep Singh eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", 12367fc3ff9SGagandeep Singh ETHER_ADDR_LEN * PFE_MAX_MACS, 0); 12467fc3ff9SGagandeep Singh if (eth_dev->data->mac_addrs == NULL) { 125*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Failed to allocate mem %d to store MAC addresses", 126*b1bc1afaSGagandeep Singh ETHER_ADDR_LEN * PFE_MAX_MACS); 12767fc3ff9SGagandeep Singh err = -ENOMEM; 12867fc3ff9SGagandeep Singh goto err0; 12967fc3ff9SGagandeep Singh } 13067fc3ff9SGagandeep Singh 13167fc3ff9SGagandeep Singh eth_dev->data->mtu = 1500; 13267fc3ff9SGagandeep Singh 13367fc3ff9SGagandeep Singh eth_dev->data->nb_rx_queues = 1; 13467fc3ff9SGagandeep Singh eth_dev->data->nb_tx_queues = 1; 13567fc3ff9SGagandeep Singh 13667fc3ff9SGagandeep Singh /* For link status, open the PFE CDEV; Error from this function 13767fc3ff9SGagandeep Singh * is silently ignored; In case of error, the link status will not 13867fc3ff9SGagandeep Singh * be available. 13967fc3ff9SGagandeep Singh */ 14067fc3ff9SGagandeep Singh pfe_eth_open_cdev(priv); 14167fc3ff9SGagandeep Singh rte_eth_dev_probing_finish(eth_dev); 14267fc3ff9SGagandeep Singh 14367fc3ff9SGagandeep Singh return 0; 14467fc3ff9SGagandeep Singh err0: 14567fc3ff9SGagandeep Singh rte_eth_dev_release_port(eth_dev); 14667fc3ff9SGagandeep Singh return err; 14767fc3ff9SGagandeep Singh } 14867fc3ff9SGagandeep Singh 14967fc3ff9SGagandeep Singh /* Parse integer from integer argument */ 15067fc3ff9SGagandeep Singh static int 15167fc3ff9SGagandeep Singh parse_integer_arg(const char *key __rte_unused, 15267fc3ff9SGagandeep Singh const char *value, void *extra_args) 15367fc3ff9SGagandeep Singh { 15467fc3ff9SGagandeep Singh int i; 15567fc3ff9SGagandeep Singh char *end; 15667fc3ff9SGagandeep Singh errno = 0; 15767fc3ff9SGagandeep Singh 15867fc3ff9SGagandeep Singh i = strtol(value, &end, 10); 159*b1bc1afaSGagandeep Singh if (*end != 0 || errno != 0 || i < 0 || i > 1) { 160*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Supported Port IDS are 0 and 1"); 16167fc3ff9SGagandeep Singh return -EINVAL; 162*b1bc1afaSGagandeep Singh } 16367fc3ff9SGagandeep Singh 16467fc3ff9SGagandeep Singh *((uint32_t *)extra_args) = i; 16567fc3ff9SGagandeep Singh 16667fc3ff9SGagandeep Singh return 0; 16767fc3ff9SGagandeep Singh } 16867fc3ff9SGagandeep Singh 16967fc3ff9SGagandeep Singh static int 17067fc3ff9SGagandeep Singh pfe_parse_vdev_init_params(struct pfe_vdev_init_params *params, 17167fc3ff9SGagandeep Singh struct rte_vdev_device *dev) 17267fc3ff9SGagandeep Singh { 17367fc3ff9SGagandeep Singh struct rte_kvargs *kvlist = NULL; 17467fc3ff9SGagandeep Singh int ret = 0; 17567fc3ff9SGagandeep Singh 17667fc3ff9SGagandeep Singh static const char * const pfe_vdev_valid_params[] = { 17767fc3ff9SGagandeep Singh PFE_VDEV_GEM_ID_ARG, 17867fc3ff9SGagandeep Singh NULL 17967fc3ff9SGagandeep Singh }; 18067fc3ff9SGagandeep Singh 18167fc3ff9SGagandeep Singh const char *input_args = rte_vdev_device_args(dev); 18267fc3ff9SGagandeep Singh 18367fc3ff9SGagandeep Singh if (!input_args) 18467fc3ff9SGagandeep Singh return -1; 18567fc3ff9SGagandeep Singh 18667fc3ff9SGagandeep Singh kvlist = rte_kvargs_parse(input_args, pfe_vdev_valid_params); 18767fc3ff9SGagandeep Singh if (kvlist == NULL) 18867fc3ff9SGagandeep Singh return -1; 18967fc3ff9SGagandeep Singh 19067fc3ff9SGagandeep Singh ret = rte_kvargs_process(kvlist, 19167fc3ff9SGagandeep Singh PFE_VDEV_GEM_ID_ARG, 19267fc3ff9SGagandeep Singh &parse_integer_arg, 19367fc3ff9SGagandeep Singh ¶ms->gem_id); 19467fc3ff9SGagandeep Singh rte_kvargs_free(kvlist); 19567fc3ff9SGagandeep Singh return ret; 19667fc3ff9SGagandeep Singh } 19767fc3ff9SGagandeep Singh 19867fc3ff9SGagandeep Singh static int 19967fc3ff9SGagandeep Singh pmd_pfe_probe(struct rte_vdev_device *vdev) 20067fc3ff9SGagandeep Singh { 20167fc3ff9SGagandeep Singh const u32 *prop; 20267fc3ff9SGagandeep Singh const struct device_node *np; 20367fc3ff9SGagandeep Singh const char *name; 20467fc3ff9SGagandeep Singh const uint32_t *addr; 20567fc3ff9SGagandeep Singh uint64_t cbus_addr, ddr_size, cbus_size; 20667fc3ff9SGagandeep Singh int rc = -1, fd = -1, gem_id; 20767fc3ff9SGagandeep Singh unsigned int interface_count = 0; 20867fc3ff9SGagandeep Singh size_t size = 0; 20967fc3ff9SGagandeep Singh struct pfe_vdev_init_params init_params = { 21067fc3ff9SGagandeep Singh .gem_id = -1 21167fc3ff9SGagandeep Singh }; 21267fc3ff9SGagandeep Singh 21367fc3ff9SGagandeep Singh name = rte_vdev_device_name(vdev); 21467fc3ff9SGagandeep Singh rc = pfe_parse_vdev_init_params(&init_params, vdev); 21567fc3ff9SGagandeep Singh if (rc < 0) 21667fc3ff9SGagandeep Singh return -EINVAL; 21767fc3ff9SGagandeep Singh 218*b1bc1afaSGagandeep Singh RTE_LOG(INFO, PMD, "Initializing pmd_pfe for %s Given gem-id %d\n", 219*b1bc1afaSGagandeep Singh name, init_params.gem_id); 22067fc3ff9SGagandeep Singh 221*b1bc1afaSGagandeep Singh if (g_pfe) { 222*b1bc1afaSGagandeep Singh if (g_pfe->nb_devs >= g_pfe->max_intf) { 223*b1bc1afaSGagandeep Singh PFE_PMD_ERR("PFE %d dev already created Max is %d", 224*b1bc1afaSGagandeep Singh g_pfe->nb_devs, g_pfe->max_intf); 225*b1bc1afaSGagandeep Singh return -EINVAL; 226*b1bc1afaSGagandeep Singh } 22767fc3ff9SGagandeep Singh goto eth_init; 22867fc3ff9SGagandeep Singh } 22967fc3ff9SGagandeep Singh 23067fc3ff9SGagandeep Singh g_pfe = rte_zmalloc(NULL, sizeof(*g_pfe), RTE_CACHE_LINE_SIZE); 23167fc3ff9SGagandeep Singh if (g_pfe == NULL) 23267fc3ff9SGagandeep Singh return -EINVAL; 23367fc3ff9SGagandeep Singh 23467fc3ff9SGagandeep Singh /* Load the device-tree driver */ 23567fc3ff9SGagandeep Singh rc = of_init(); 236*b1bc1afaSGagandeep Singh if (rc) { 237*b1bc1afaSGagandeep Singh PFE_PMD_ERR("of_init failed with ret: %d", rc); 23867fc3ff9SGagandeep Singh goto err; 239*b1bc1afaSGagandeep Singh } 24067fc3ff9SGagandeep Singh 24167fc3ff9SGagandeep Singh np = of_find_compatible_node(NULL, NULL, "fsl,pfe"); 24267fc3ff9SGagandeep Singh if (!np) { 243*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Invalid device node"); 24467fc3ff9SGagandeep Singh rc = -EINVAL; 24567fc3ff9SGagandeep Singh goto err; 24667fc3ff9SGagandeep Singh } 24767fc3ff9SGagandeep Singh 24867fc3ff9SGagandeep Singh addr = of_get_address(np, 0, &cbus_size, NULL); 249*b1bc1afaSGagandeep Singh if (!addr) { 250*b1bc1afaSGagandeep Singh PFE_PMD_ERR("of_get_address cannot return qman address\n"); 25167fc3ff9SGagandeep Singh goto err; 252*b1bc1afaSGagandeep Singh } 25367fc3ff9SGagandeep Singh cbus_addr = of_translate_address(np, addr); 254*b1bc1afaSGagandeep Singh if (!cbus_addr) { 255*b1bc1afaSGagandeep Singh PFE_PMD_ERR("of_translate_address failed\n"); 25667fc3ff9SGagandeep Singh goto err; 257*b1bc1afaSGagandeep Singh } 25867fc3ff9SGagandeep Singh 25967fc3ff9SGagandeep Singh addr = of_get_address(np, 1, &ddr_size, NULL); 260*b1bc1afaSGagandeep Singh if (!addr) { 261*b1bc1afaSGagandeep Singh PFE_PMD_ERR("of_get_address cannot return qman address\n"); 26267fc3ff9SGagandeep Singh goto err; 263*b1bc1afaSGagandeep Singh } 26467fc3ff9SGagandeep Singh 26567fc3ff9SGagandeep Singh g_pfe->ddr_phys_baseaddr = of_translate_address(np, addr); 266*b1bc1afaSGagandeep Singh if (!g_pfe->ddr_phys_baseaddr) { 267*b1bc1afaSGagandeep Singh PFE_PMD_ERR("of_translate_address failed\n"); 26867fc3ff9SGagandeep Singh goto err; 269*b1bc1afaSGagandeep Singh } 27067fc3ff9SGagandeep Singh 27167fc3ff9SGagandeep Singh g_pfe->ddr_size = ddr_size; 27267fc3ff9SGagandeep Singh g_pfe->cbus_size = cbus_size; 27367fc3ff9SGagandeep Singh 27467fc3ff9SGagandeep Singh fd = open("/dev/mem", O_RDWR); 27567fc3ff9SGagandeep Singh g_pfe->cbus_baseaddr = mmap(NULL, cbus_size, PROT_READ | PROT_WRITE, 27667fc3ff9SGagandeep Singh MAP_SHARED, fd, cbus_addr); 27767fc3ff9SGagandeep Singh close(fd); 27867fc3ff9SGagandeep Singh if (g_pfe->cbus_baseaddr == MAP_FAILED) { 279*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Can not map cbus base"); 28067fc3ff9SGagandeep Singh rc = -EINVAL; 28167fc3ff9SGagandeep Singh goto err; 28267fc3ff9SGagandeep Singh } 28367fc3ff9SGagandeep Singh 28467fc3ff9SGagandeep Singh /* Read interface count */ 28567fc3ff9SGagandeep Singh prop = of_get_property(np, "fsl,pfe-num-interfaces", &size); 28667fc3ff9SGagandeep Singh if (!prop) { 287*b1bc1afaSGagandeep Singh PFE_PMD_ERR("Failed to read number of interfaces"); 28867fc3ff9SGagandeep Singh rc = -ENXIO; 28967fc3ff9SGagandeep Singh goto err_prop; 29067fc3ff9SGagandeep Singh } 29167fc3ff9SGagandeep Singh 29267fc3ff9SGagandeep Singh interface_count = rte_be_to_cpu_32((unsigned int)*prop); 29367fc3ff9SGagandeep Singh if (interface_count <= 0) { 294*b1bc1afaSGagandeep Singh PFE_PMD_ERR("No ethernet interface count : %d", 295*b1bc1afaSGagandeep Singh interface_count); 29667fc3ff9SGagandeep Singh rc = -ENXIO; 29767fc3ff9SGagandeep Singh goto err_prop; 29867fc3ff9SGagandeep Singh } 299*b1bc1afaSGagandeep Singh PFE_PMD_INFO("num interfaces = %d ", interface_count); 300*b1bc1afaSGagandeep Singh 30167fc3ff9SGagandeep Singh g_pfe->max_intf = interface_count; 30267fc3ff9SGagandeep Singh pfe_soc_version_get(); 30367fc3ff9SGagandeep Singh eth_init: 30467fc3ff9SGagandeep Singh if (init_params.gem_id < 0) 30567fc3ff9SGagandeep Singh gem_id = g_pfe->nb_devs; 30667fc3ff9SGagandeep Singh else 30767fc3ff9SGagandeep Singh gem_id = init_params.gem_id; 30867fc3ff9SGagandeep Singh 30967fc3ff9SGagandeep Singh RTE_LOG(INFO, PMD, "Init pmd_pfe for %s gem-id %d(given =%d)\n", 31067fc3ff9SGagandeep Singh name, gem_id, init_params.gem_id); 31167fc3ff9SGagandeep Singh 31267fc3ff9SGagandeep Singh rc = pfe_eth_init(vdev, g_pfe, gem_id); 31367fc3ff9SGagandeep Singh if (rc < 0) 31467fc3ff9SGagandeep Singh goto err_eth; 31567fc3ff9SGagandeep Singh else 31667fc3ff9SGagandeep Singh g_pfe->nb_devs++; 31767fc3ff9SGagandeep Singh 31867fc3ff9SGagandeep Singh return 0; 31967fc3ff9SGagandeep Singh 32067fc3ff9SGagandeep Singh err_eth: 32167fc3ff9SGagandeep Singh err_prop: 32267fc3ff9SGagandeep Singh munmap(g_pfe->cbus_baseaddr, cbus_size); 32367fc3ff9SGagandeep Singh err: 32467fc3ff9SGagandeep Singh rte_free(g_pfe); 32567fc3ff9SGagandeep Singh return rc; 32667fc3ff9SGagandeep Singh } 32767fc3ff9SGagandeep Singh 32867fc3ff9SGagandeep Singh static int 32967fc3ff9SGagandeep Singh pmd_pfe_remove(struct rte_vdev_device *vdev) 33067fc3ff9SGagandeep Singh { 33167fc3ff9SGagandeep Singh const char *name; 33267fc3ff9SGagandeep Singh struct rte_eth_dev *eth_dev = NULL; 33367fc3ff9SGagandeep Singh 33467fc3ff9SGagandeep Singh name = rte_vdev_device_name(vdev); 33567fc3ff9SGagandeep Singh if (name == NULL) 33667fc3ff9SGagandeep Singh return -EINVAL; 33767fc3ff9SGagandeep Singh 338*b1bc1afaSGagandeep Singh PFE_PMD_INFO("Closing eventdev sw device %s", name); 339*b1bc1afaSGagandeep Singh 34067fc3ff9SGagandeep Singh if (!g_pfe) 34167fc3ff9SGagandeep Singh return 0; 34267fc3ff9SGagandeep Singh 34367fc3ff9SGagandeep Singh eth_dev = rte_eth_dev_allocated(name); 34467fc3ff9SGagandeep Singh if (eth_dev == NULL) 34567fc3ff9SGagandeep Singh return -ENODEV; 34667fc3ff9SGagandeep Singh 34767fc3ff9SGagandeep Singh pfe_eth_exit(eth_dev, g_pfe); 34867fc3ff9SGagandeep Singh munmap(g_pfe->cbus_baseaddr, g_pfe->cbus_size); 34967fc3ff9SGagandeep Singh 35067fc3ff9SGagandeep Singh return 0; 35167fc3ff9SGagandeep Singh } 35267fc3ff9SGagandeep Singh 35367fc3ff9SGagandeep Singh static 35467fc3ff9SGagandeep Singh struct rte_vdev_driver pmd_pfe_drv = { 35567fc3ff9SGagandeep Singh .probe = pmd_pfe_probe, 35667fc3ff9SGagandeep Singh .remove = pmd_pfe_remove, 35767fc3ff9SGagandeep Singh }; 35867fc3ff9SGagandeep Singh 35967fc3ff9SGagandeep Singh RTE_PMD_REGISTER_VDEV(PFE_NAME_PMD, pmd_pfe_drv); 36067fc3ff9SGagandeep Singh RTE_PMD_REGISTER_PARAM_STRING(PFE_NAME_PMD, PFE_VDEV_GEM_ID_ARG "=<int> "); 361*b1bc1afaSGagandeep Singh 362*b1bc1afaSGagandeep Singh RTE_INIT(pfe_pmd_init_log) 363*b1bc1afaSGagandeep Singh { 364*b1bc1afaSGagandeep Singh pfe_logtype_pmd = rte_log_register("pmd.net.pfe"); 365*b1bc1afaSGagandeep Singh if (pfe_logtype_pmd >= 0) 366*b1bc1afaSGagandeep Singh rte_log_set_level(pfe_logtype_pmd, RTE_LOG_NOTICE); 367*b1bc1afaSGagandeep Singh } 368