18c2ecf20Sopenharmony_ci#ifndef _IOMMU_H 28c2ecf20Sopenharmony_ci#define _IOMMU_H 1 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <linux/pci.h> 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_cistruct parisc_device; 78c2ecf20Sopenharmony_cistruct ioc; 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cistatic inline struct pci_hba_data *parisc_walk_tree(struct device *dev) 108c2ecf20Sopenharmony_ci{ 118c2ecf20Sopenharmony_ci struct device *otherdev; 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci if (likely(dev->platform_data)) 148c2ecf20Sopenharmony_ci return dev->platform_data; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci /* OK, just traverse the bus to find it */ 178c2ecf20Sopenharmony_ci for (otherdev = dev->parent; 188c2ecf20Sopenharmony_ci otherdev; 198c2ecf20Sopenharmony_ci otherdev = otherdev->parent) { 208c2ecf20Sopenharmony_ci if (otherdev->platform_data) { 218c2ecf20Sopenharmony_ci dev->platform_data = otherdev->platform_data; 228c2ecf20Sopenharmony_ci break; 238c2ecf20Sopenharmony_ci } 248c2ecf20Sopenharmony_ci } 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci return dev->platform_data; 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic inline struct ioc *GET_IOC(struct device *dev) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci struct pci_hba_data *pdata = parisc_walk_tree(dev); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci if (!pdata) 348c2ecf20Sopenharmony_ci return NULL; 358c2ecf20Sopenharmony_ci return pdata->iommu; 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#ifdef CONFIG_IOMMU_CCIO 398c2ecf20Sopenharmony_civoid *ccio_get_iommu(const struct parisc_device *dev); 408c2ecf20Sopenharmony_ciint ccio_request_resource(const struct parisc_device *dev, 418c2ecf20Sopenharmony_ci struct resource *res); 428c2ecf20Sopenharmony_ciint ccio_allocate_resource(const struct parisc_device *dev, 438c2ecf20Sopenharmony_ci struct resource *res, unsigned long size, 448c2ecf20Sopenharmony_ci unsigned long min, unsigned long max, unsigned long align); 458c2ecf20Sopenharmony_ci#else /* !CONFIG_IOMMU_CCIO */ 468c2ecf20Sopenharmony_ci#define ccio_get_iommu(dev) NULL 478c2ecf20Sopenharmony_ci#define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res) 488c2ecf20Sopenharmony_ci#define ccio_allocate_resource(dev, res, size, min, max, align) \ 498c2ecf20Sopenharmony_ci allocate_resource(&iomem_resource, res, size, min, max, \ 508c2ecf20Sopenharmony_ci align, NULL, NULL) 518c2ecf20Sopenharmony_ci#endif /* !CONFIG_IOMMU_CCIO */ 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_civoid *sba_get_iommu(struct parisc_device *dev); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#endif /* _IOMMU_H */ 56