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