linux/drivers/misc/ocxl/pci.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2// Copyright 2019 IBM Corp.
   3#include <linux/module.h>
   4#include "ocxl_internal.h"
   5
   6/*
   7 * Any opencapi device which wants to use this 'generic' driver should
   8 * use the 0x062B device ID. Vendors should define the subsystem
   9 * vendor/device ID to help differentiate devices.
  10 */
  11static const struct pci_device_id ocxl_pci_tbl[] = {
  12        { PCI_DEVICE(PCI_VENDOR_ID_IBM, 0x062B), },
  13        { }
  14};
  15MODULE_DEVICE_TABLE(pci, ocxl_pci_tbl);
  16
  17static int ocxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
  18{
  19        int rc;
  20        struct ocxl_afu *afu, *tmp;
  21        struct ocxl_fn *fn;
  22        struct list_head *afu_list;
  23
  24        fn = ocxl_function_open(dev);
  25        if (IS_ERR(fn))
  26                return PTR_ERR(fn);
  27
  28        pci_set_drvdata(dev, fn);
  29
  30        afu_list = ocxl_function_afu_list(fn);
  31
  32        list_for_each_entry_safe(afu, tmp, afu_list, list) {
  33                // Cleanup handled within ocxl_file_register_afu()
  34                rc = ocxl_file_register_afu(afu);
  35                if (rc) {
  36                        dev_err(&dev->dev, "Failed to register AFU '%s' index %d",
  37                                        afu->config.name, afu->config.idx);
  38                }
  39        }
  40
  41        return 0;
  42}
  43
  44static void ocxl_remove(struct pci_dev *dev)
  45{
  46        struct ocxl_fn *fn;
  47        struct ocxl_afu *afu;
  48        struct list_head *afu_list;
  49
  50        fn = pci_get_drvdata(dev);
  51        afu_list = ocxl_function_afu_list(fn);
  52
  53        list_for_each_entry(afu, afu_list, list) {
  54                ocxl_file_unregister_afu(afu);
  55        }
  56
  57        ocxl_function_close(fn);
  58}
  59
  60struct pci_driver ocxl_pci_driver = {
  61        .name = "ocxl",
  62        .id_table = ocxl_pci_tbl,
  63        .probe = ocxl_probe,
  64        .remove = ocxl_remove,
  65        .shutdown = ocxl_remove,
  66};
  67