Add a module parameter that allows specification of one or more CCPs based on PCI bus identifiers. The value of the parameter is a comma- separated list of bus numbers, in no particular order. Signed-off-by: Gary R Hook <gary.hook@xxxxxxx> --- drivers/crypto/ccp/sp-pci.c | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c index bcd1e233dce7..a563d85b242e 100644 --- a/drivers/crypto/ccp/sp-pci.c +++ b/drivers/crypto/ccp/sp-pci.c @@ -40,6 +40,13 @@ static unsigned int pcidev; module_param(pcidev, uint, 0444); MODULE_PARM_DESC(pcidev, "Device number for a specific CCP"); +#define MAXCCPS 32 +static char *buses; +static unsigned int n_pcibus = 0; +static unsigned int pcibus[MAXCCPS]; +module_param(buses, charp, 0444); +MODULE_PARM_DESC(buses, "PCI Bus number(s), comma-separated. List CCPs with 'lspci |grep Enc'"); + static struct mutex devcount_mutex ____cacheline_aligned; static unsigned int devcount = 0; static unsigned int maxdev = 0; @@ -50,6 +57,37 @@ static unsigned int nqueues = MAX_HW_QUEUES; module_param(nqueues, uint, 0444); MODULE_PARM_DESC(nqueues, "Number of queues per CCP (default: 5)"); +#define COMMA ',' +static void ccp_parse_pci_buses(void) +{ + unsigned int busno; + unsigned int eos = 0; + int ret; + char *comma; + char *tok; + + /* Nothing on the command line? */ + if (!buses) + return; + + comma = tok = buses; + while (!eos && *tok && (n_pcibus < MAXCCPS)) { + while (*comma && *comma != COMMA) + comma++; + if (*comma == COMMA) + *comma = '\0'; + else + eos = 1; + ret = kstrtouint(tok, 0, &busno); + if (ret) { + pr_info("%s: Parsing error (%d) '%s'\n", __func__, ret, buses); + return; + } + pcibus[n_pcibus++] = busno; + tok = ++comma; + } +} + #ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS modparam_t moduleparameters[] = { {"maxdev", &maxdev, S_IRUSR}, @@ -204,6 +242,7 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) void __iomem * const *iomap_table; int bar_mask; int ret; + int j; if (maxdev && (devcount >= maxdev)) /* Too many devices? */ return 0; @@ -212,6 +251,25 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) if (pcidev && (pdev->device != pcidev)) return 0; + /* + * Look for (1) a specific device, (2) devices on a certain + * bus, or (3) a specific device number. If both parameters + * are zero accept any device. + */ + ccp_parse_pci_buses(); + if (n_pcibus) { + int match = 0; + + /* Scan the list of buses for a match */ + for (j = 0 ; j < n_pcibus ; j++) + if (pcibus[j] == pdev->bus->number) { + match = 1; + break; + } + if (!match) + return 0; + } + ret = -ENOMEM; sp = sp_alloc_struct(dev); if (!sp)