| #ifndef _IOMMU_H |
| #define _IOMMU_H 1 |
| |
| #include <linux/pci.h> |
| |
| struct parisc_device; |
| struct ioc; |
| |
| static inline struct pci_hba_data *parisc_walk_tree(struct device *dev) |
| { |
| struct device *otherdev; |
| |
| if (likely(dev->platform_data)) |
| return dev->platform_data; |
| |
| /* OK, just traverse the bus to find it */ |
| for (otherdev = dev->parent; |
| otherdev; |
| otherdev = otherdev->parent) { |
| if (otherdev->platform_data) { |
| dev->platform_data = otherdev->platform_data; |
| break; |
| } |
| } |
| |
| return dev->platform_data; |
| } |
| |
| static inline struct ioc *GET_IOC(struct device *dev) |
| { |
| struct pci_hba_data *pdata = parisc_walk_tree(dev); |
| |
| if (!pdata) |
| return NULL; |
| return pdata->iommu; |
| } |
| |
| #ifdef CONFIG_IOMMU_CCIO |
| void *ccio_get_iommu(const struct parisc_device *dev); |
| int ccio_request_resource(const struct parisc_device *dev, |
| struct resource *res); |
| int ccio_allocate_resource(const struct parisc_device *dev, |
| struct resource *res, unsigned long size, |
| unsigned long min, unsigned long max, unsigned long align); |
| #else /* !CONFIG_IOMMU_CCIO */ |
| #define ccio_get_iommu(dev) NULL |
| #define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res) |
| #define ccio_allocate_resource(dev, res, size, min, max, align) \ |
| allocate_resource(&iomem_resource, res, size, min, max, \ |
| align, NULL, NULL) |
| #endif /* !CONFIG_IOMMU_CCIO */ |
| |
| void *sba_get_iommu(struct parisc_device *dev); |
| |
| #endif /* _IOMMU_H */ |