1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright IBM Corp. 2020 4 * 5 * Author(s): 6 * Pierre Morel <pmorel@linux.ibm.com> 7 * 8 */ 9 #ifndef __S390_PCI_BUS_H 10 #define __S390_PCI_BUS_H 11 12 #include <linux/pci.h> 13 14 int zpci_bus_device_register(struct zpci_dev *zdev, struct pci_ops *ops); 15 void zpci_bus_device_unregister(struct zpci_dev *zdev); 16 17 int zpci_bus_scan_bus(struct zpci_bus *zbus); 18 void zpci_bus_get_next(struct zpci_bus **pos); 19 20 /** 21 * zpci_bus_for_each - iterate over all the registered zbus objects 22 * @pos: a struct zpci_bus * as cursor 23 * 24 * Acquires and releases references as the cursor iterates over the registered 25 * objects. Is tolerant against concurrent removals of objects. 26 * 27 * Context: Process context. May sleep. 28 */ 29 #define zpci_bus_for_each(pos) \ 30 for ((pos) = NULL, zpci_bus_get_next(&(pos)); (pos) != NULL; \ 31 zpci_bus_get_next(&(pos))) 32 33 int zpci_bus_scan_device(struct zpci_dev *zdev); 34 void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error); 35 36 void zpci_release_device(struct kref *kref); 37 38 void zpci_zdev_put(struct zpci_dev *zdev); 39 zpci_zdev_get(struct zpci_dev * zdev)40static inline void zpci_zdev_get(struct zpci_dev *zdev) 41 { 42 kref_get(&zdev->kref); 43 } 44 45 int zpci_alloc_domain(int domain); 46 void zpci_free_domain(int domain); 47 int zpci_setup_bus_resources(struct zpci_dev *zdev); 48 zdev_from_bus(struct pci_bus * bus,unsigned int devfn)49static inline struct zpci_dev *zdev_from_bus(struct pci_bus *bus, 50 unsigned int devfn) 51 { 52 struct zpci_bus *zbus = bus->sysdata; 53 54 return (devfn >= ZPCI_FUNCTIONS_PER_BUS) ? NULL : zbus->function[devfn]; 55 } 56 57 #endif /* __S390_PCI_BUS_H */ 58