Christoph Hellwig | 9b8eeab | 2019-01-29 19:13:04 +0100 | [diff] [blame] | 1 | #ifndef _IOMMU_H |
| 2 | #define _IOMMU_H 1 |
| 3 | |
| 4 | #include <linux/pci.h> |
| 5 | |
| 6 | struct parisc_device; |
| 7 | struct ioc; |
| 8 | |
Christoph Hellwig | cb0f7ab | 2019-01-29 19:13:07 +0100 | [diff] [blame] | 9 | static inline struct pci_hba_data *parisc_walk_tree(struct device *dev) |
Christoph Hellwig | 9b8eeab | 2019-01-29 19:13:04 +0100 | [diff] [blame] | 10 | { |
| 11 | struct device *otherdev; |
| 12 | |
| 13 | if (likely(dev->platform_data)) |
| 14 | return dev->platform_data; |
| 15 | |
| 16 | /* OK, just traverse the bus to find it */ |
| 17 | for (otherdev = dev->parent; |
| 18 | otherdev; |
| 19 | otherdev = otherdev->parent) { |
| 20 | if (otherdev->platform_data) { |
| 21 | dev->platform_data = otherdev->platform_data; |
| 22 | break; |
| 23 | } |
| 24 | } |
| 25 | |
| 26 | return dev->platform_data; |
| 27 | } |
| 28 | |
Christoph Hellwig | 25c9dbe | 2019-01-29 19:13:05 +0100 | [diff] [blame] | 29 | static inline struct ioc *GET_IOC(struct device *dev) |
| 30 | { |
| 31 | struct pci_hba_data *pdata = parisc_walk_tree(dev); |
| 32 | |
| 33 | if (!pdata) |
| 34 | return NULL; |
| 35 | return pdata->iommu; |
| 36 | } |
Christoph Hellwig | 9b8eeab | 2019-01-29 19:13:04 +0100 | [diff] [blame] | 37 | |
| 38 | #ifdef CONFIG_IOMMU_CCIO |
| 39 | void *ccio_get_iommu(const struct parisc_device *dev); |
| 40 | int ccio_request_resource(const struct parisc_device *dev, |
| 41 | struct resource *res); |
| 42 | int ccio_allocate_resource(const struct parisc_device *dev, |
| 43 | struct resource *res, unsigned long size, |
| 44 | unsigned long min, unsigned long max, unsigned long align); |
| 45 | #else /* !CONFIG_IOMMU_CCIO */ |
| 46 | #define ccio_get_iommu(dev) NULL |
| 47 | #define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res) |
| 48 | #define ccio_allocate_resource(dev, res, size, min, max, align) \ |
| 49 | allocate_resource(&iomem_resource, res, size, min, max, \ |
| 50 | align, NULL, NULL) |
| 51 | #endif /* !CONFIG_IOMMU_CCIO */ |
| 52 | |
| 53 | void *sba_get_iommu(struct parisc_device *dev); |
| 54 | |
| 55 | #endif /* _IOMMU_H */ |