1bfe2ae49SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause 2bfe2ae49SAnoob Joseph * Copyright(c) 2018 Cavium, Inc 3bfe2ae49SAnoob Joseph */ 4bfe2ae49SAnoob Joseph 5bfe2ae49SAnoob Joseph #include <rte_bus_pci.h> 6bfe2ae49SAnoob Joseph #include <rte_common.h> 7bfe2ae49SAnoob Joseph #include <rte_cryptodev.h> 8bfe2ae49SAnoob Joseph #include <rte_cryptodev_pmd.h> 9bfe2ae49SAnoob Joseph #include <rte_log.h> 10bfe2ae49SAnoob Joseph #include <rte_pci.h> 11bfe2ae49SAnoob Joseph 12bfe2ae49SAnoob Joseph #include "otx_cryptodev.h" 13bfe2ae49SAnoob Joseph #include "otx_cryptodev_ops.h" 14bfe2ae49SAnoob Joseph 1598c7b9c9SAnoob Joseph #include "cpt_pmd_logs.h" 1698c7b9c9SAnoob Joseph 17*8dc6c2f1SShijith Thotton /* Device ID */ 18*8dc6c2f1SShijith Thotton #define PCI_VENDOR_ID_CAVIUM 0x177d 19*8dc6c2f1SShijith Thotton #define CPT_81XX_PCI_VF_DEVICE_ID 0xa041 20*8dc6c2f1SShijith Thotton 2198c7b9c9SAnoob Joseph uint8_t otx_cryptodev_driver_id; 22bfe2ae49SAnoob Joseph 23bfe2ae49SAnoob Joseph static struct rte_pci_id pci_id_cpt_table[] = { 24bfe2ae49SAnoob Joseph { 25bfe2ae49SAnoob Joseph RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, CPT_81XX_PCI_VF_DEVICE_ID), 26bfe2ae49SAnoob Joseph }, 27bfe2ae49SAnoob Joseph /* sentinel */ 28bfe2ae49SAnoob Joseph { 29bfe2ae49SAnoob Joseph .device_id = 0 30bfe2ae49SAnoob Joseph }, 31bfe2ae49SAnoob Joseph }; 32bfe2ae49SAnoob Joseph 33bfe2ae49SAnoob Joseph static int 34bfe2ae49SAnoob Joseph otx_cpt_pci_probe(struct rte_pci_driver *pci_drv, 35bfe2ae49SAnoob Joseph struct rte_pci_device *pci_dev) 36bfe2ae49SAnoob Joseph { 37bfe2ae49SAnoob Joseph struct rte_cryptodev *cryptodev; 38bfe2ae49SAnoob Joseph char name[RTE_CRYPTODEV_NAME_MAX_LEN]; 39bfe2ae49SAnoob Joseph int retval; 40bfe2ae49SAnoob Joseph 41bfe2ae49SAnoob Joseph if (pci_drv == NULL) 42bfe2ae49SAnoob Joseph return -ENODEV; 43bfe2ae49SAnoob Joseph 44bfe2ae49SAnoob Joseph rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); 45bfe2ae49SAnoob Joseph 46bfe2ae49SAnoob Joseph cryptodev = rte_cryptodev_pmd_allocate(name, rte_socket_id()); 47bfe2ae49SAnoob Joseph if (cryptodev == NULL) 48bfe2ae49SAnoob Joseph return -ENOMEM; 49bfe2ae49SAnoob Joseph 50bfe2ae49SAnoob Joseph cryptodev->device = &pci_dev->device; 51bfe2ae49SAnoob Joseph cryptodev->device->driver = &pci_drv->driver; 52bfe2ae49SAnoob Joseph cryptodev->driver_id = otx_cryptodev_driver_id; 53bfe2ae49SAnoob Joseph 54bfe2ae49SAnoob Joseph /* init user callbacks */ 55bfe2ae49SAnoob Joseph TAILQ_INIT(&(cryptodev->link_intr_cbs)); 56bfe2ae49SAnoob Joseph 57bfe2ae49SAnoob Joseph /* Invoke PMD device initialization function */ 58bfe2ae49SAnoob Joseph retval = otx_cpt_dev_create(cryptodev); 59bfe2ae49SAnoob Joseph if (retval == 0) 60bfe2ae49SAnoob Joseph return 0; 61bfe2ae49SAnoob Joseph 62bfe2ae49SAnoob Joseph CPT_LOG_ERR("[DRV %s]: Failed to create device " 63bfe2ae49SAnoob Joseph "(vendor_id: 0x%x device_id: 0x%x", 64bfe2ae49SAnoob Joseph pci_drv->driver.name, 65bfe2ae49SAnoob Joseph (unsigned int) pci_dev->id.vendor_id, 66bfe2ae49SAnoob Joseph (unsigned int) pci_dev->id.device_id); 67bfe2ae49SAnoob Joseph 68bfe2ae49SAnoob Joseph cryptodev->attached = RTE_CRYPTODEV_DETACHED; 69bfe2ae49SAnoob Joseph 70bfe2ae49SAnoob Joseph return -ENXIO; 71bfe2ae49SAnoob Joseph } 72bfe2ae49SAnoob Joseph 73bfe2ae49SAnoob Joseph static int 74bfe2ae49SAnoob Joseph otx_cpt_pci_remove(struct rte_pci_device *pci_dev) 75bfe2ae49SAnoob Joseph { 76bfe2ae49SAnoob Joseph struct rte_cryptodev *cryptodev; 77bfe2ae49SAnoob Joseph char name[RTE_CRYPTODEV_NAME_MAX_LEN]; 78bfe2ae49SAnoob Joseph 79bfe2ae49SAnoob Joseph if (pci_dev == NULL) 80bfe2ae49SAnoob Joseph return -EINVAL; 81bfe2ae49SAnoob Joseph 82bfe2ae49SAnoob Joseph rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); 83bfe2ae49SAnoob Joseph 84bfe2ae49SAnoob Joseph cryptodev = rte_cryptodev_pmd_get_named_dev(name); 85bfe2ae49SAnoob Joseph if (cryptodev == NULL) 86bfe2ae49SAnoob Joseph return -ENODEV; 87bfe2ae49SAnoob Joseph 88bfe2ae49SAnoob Joseph if (pci_dev->driver == NULL) 89bfe2ae49SAnoob Joseph return -ENODEV; 90bfe2ae49SAnoob Joseph 91bfe2ae49SAnoob Joseph /* free crypto device */ 92bfe2ae49SAnoob Joseph rte_cryptodev_pmd_release_device(cryptodev); 93bfe2ae49SAnoob Joseph 94bfe2ae49SAnoob Joseph if (rte_eal_process_type() == RTE_PROC_PRIMARY) 95bfe2ae49SAnoob Joseph rte_free(cryptodev->data->dev_private); 96bfe2ae49SAnoob Joseph 97bfe2ae49SAnoob Joseph cryptodev->device->driver = NULL; 98accf8ca7SAnoob Joseph cryptodev->device = NULL; 99bfe2ae49SAnoob Joseph cryptodev->data = NULL; 100bfe2ae49SAnoob Joseph 101bfe2ae49SAnoob Joseph return 0; 102bfe2ae49SAnoob Joseph } 103bfe2ae49SAnoob Joseph 104bfe2ae49SAnoob Joseph static struct rte_pci_driver otx_cryptodev_pmd = { 105bfe2ae49SAnoob Joseph .id_table = pci_id_cpt_table, 106bfe2ae49SAnoob Joseph .drv_flags = RTE_PCI_DRV_NEED_MAPPING, 107bfe2ae49SAnoob Joseph .probe = otx_cpt_pci_probe, 108bfe2ae49SAnoob Joseph .remove = otx_cpt_pci_remove, 109bfe2ae49SAnoob Joseph }; 110bfe2ae49SAnoob Joseph 111bfe2ae49SAnoob Joseph static struct cryptodev_driver otx_cryptodev_drv; 112bfe2ae49SAnoob Joseph 113bfe2ae49SAnoob Joseph RTE_PMD_REGISTER_PCI(CRYPTODEV_NAME_OCTEONTX_PMD, otx_cryptodev_pmd); 114bfe2ae49SAnoob Joseph RTE_PMD_REGISTER_PCI_TABLE(CRYPTODEV_NAME_OCTEONTX_PMD, pci_id_cpt_table); 1151378ddceSThierry Herbelot RTE_PMD_REGISTER_KMOD_DEP(CRYPTODEV_NAME_OCTEONTX_PMD, "vfio-pci"); 116bfe2ae49SAnoob Joseph RTE_PMD_REGISTER_CRYPTO_DRIVER(otx_cryptodev_drv, otx_cryptodev_pmd.driver, 117bfe2ae49SAnoob Joseph otx_cryptodev_driver_id); 118eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(otx_cpt_logtype, NOTICE); 119