162306a36Sopenharmony_ci#ifndef _IOMMU_H 262306a36Sopenharmony_ci#define _IOMMU_H 1 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/pci.h> 562306a36Sopenharmony_ci 662306a36Sopenharmony_cistruct parisc_device; 762306a36Sopenharmony_cistruct ioc; 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistatic inline struct pci_hba_data *parisc_walk_tree(struct device *dev) 1062306a36Sopenharmony_ci{ 1162306a36Sopenharmony_ci struct device *otherdev; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci if (likely(dev->platform_data)) 1462306a36Sopenharmony_ci return dev->platform_data; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci /* OK, just traverse the bus to find it */ 1762306a36Sopenharmony_ci for (otherdev = dev->parent; 1862306a36Sopenharmony_ci otherdev; 1962306a36Sopenharmony_ci otherdev = otherdev->parent) { 2062306a36Sopenharmony_ci if (otherdev->platform_data) { 2162306a36Sopenharmony_ci dev->platform_data = otherdev->platform_data; 2262306a36Sopenharmony_ci break; 2362306a36Sopenharmony_ci } 2462306a36Sopenharmony_ci } 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci return dev->platform_data; 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic inline struct ioc *GET_IOC(struct device *dev) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci struct pci_hba_data *pdata = parisc_walk_tree(dev); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci if (!pdata) 3462306a36Sopenharmony_ci return NULL; 3562306a36Sopenharmony_ci return pdata->iommu; 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#ifdef CONFIG_IOMMU_CCIO 3962306a36Sopenharmony_civoid *ccio_get_iommu(const struct parisc_device *dev); 4062306a36Sopenharmony_ciint ccio_request_resource(const struct parisc_device *dev, 4162306a36Sopenharmony_ci struct resource *res); 4262306a36Sopenharmony_ciint ccio_allocate_resource(const struct parisc_device *dev, 4362306a36Sopenharmony_ci struct resource *res, unsigned long size, 4462306a36Sopenharmony_ci unsigned long min, unsigned long max, unsigned long align); 4562306a36Sopenharmony_ci#else /* !CONFIG_IOMMU_CCIO */ 4662306a36Sopenharmony_ci#define ccio_get_iommu(dev) NULL 4762306a36Sopenharmony_ci#define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res) 4862306a36Sopenharmony_ci#define ccio_allocate_resource(dev, res, size, min, max, align) \ 4962306a36Sopenharmony_ci allocate_resource(&iomem_resource, res, size, min, max, \ 5062306a36Sopenharmony_ci align, NULL, NULL) 5162306a36Sopenharmony_ci#endif /* !CONFIG_IOMMU_CCIO */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_civoid *sba_get_iommu(struct parisc_device *dev); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#endif /* _IOMMU_H */ 56