13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 23d0407baSopenharmony_ci/* 33d0407baSopenharmony_ci * Copyright (C) 2014-2015 ARM Ltd. 43d0407baSopenharmony_ci */ 53d0407baSopenharmony_ci#ifndef __DMA_IOMMU_H 63d0407baSopenharmony_ci#define __DMA_IOMMU_H 73d0407baSopenharmony_ci 83d0407baSopenharmony_ci#include <linux/errno.h> 93d0407baSopenharmony_ci#include <linux/types.h> 103d0407baSopenharmony_ci 113d0407baSopenharmony_ci#ifdef CONFIG_IOMMU_DMA 123d0407baSopenharmony_ci#include <linux/dma-mapping.h> 133d0407baSopenharmony_ci#include <linux/iommu.h> 143d0407baSopenharmony_ci#include <linux/msi.h> 153d0407baSopenharmony_ci 163d0407baSopenharmony_ci/* Domain management interface for IOMMU drivers */ 173d0407baSopenharmony_ciint iommu_get_dma_cookie(struct iommu_domain *domain); 183d0407baSopenharmony_ciint iommu_get_msi_cookie(struct iommu_domain *domain, dma_addr_t base); 193d0407baSopenharmony_civoid iommu_put_dma_cookie(struct iommu_domain *domain); 203d0407baSopenharmony_ci 213d0407baSopenharmony_ci/* Setup call for arch DMA mapping code */ 223d0407baSopenharmony_civoid iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size); 233d0407baSopenharmony_ci 243d0407baSopenharmony_ci/* The DMA API isn't _quite_ the whole story, though... */ 253d0407baSopenharmony_ci/* 263d0407baSopenharmony_ci * iommu_dma_prepare_msi() - Map the MSI page in the IOMMU device 273d0407baSopenharmony_ci * 283d0407baSopenharmony_ci * The MSI page will be stored in @desc. 293d0407baSopenharmony_ci * 303d0407baSopenharmony_ci * Return: 0 on success otherwise an error describing the failure. 313d0407baSopenharmony_ci */ 323d0407baSopenharmony_ciint iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr); 333d0407baSopenharmony_ci 343d0407baSopenharmony_ci/* Update the MSI message if required. */ 353d0407baSopenharmony_civoid iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg); 363d0407baSopenharmony_ci 373d0407baSopenharmony_civoid iommu_dma_get_resv_regions(struct device *dev, struct list_head *list); 383d0407baSopenharmony_ci 393d0407baSopenharmony_ciint iommu_dma_reserve_iova(struct device *dev, dma_addr_t base, u64 size); 403d0407baSopenharmony_ci 413d0407baSopenharmony_ciint iommu_dma_enable_best_fit_algo(struct device *dev); 423d0407baSopenharmony_ci 433d0407baSopenharmony_ci#else /* CONFIG_IOMMU_DMA */ 443d0407baSopenharmony_ci 453d0407baSopenharmony_cistruct iommu_domain; 463d0407baSopenharmony_cistruct msi_desc; 473d0407baSopenharmony_cistruct msi_msg; 483d0407baSopenharmony_cistruct device; 493d0407baSopenharmony_ci 503d0407baSopenharmony_cistatic inline void iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size) 513d0407baSopenharmony_ci{ 523d0407baSopenharmony_ci} 533d0407baSopenharmony_ci 543d0407baSopenharmony_cistatic inline int iommu_get_dma_cookie(struct iommu_domain *domain) 553d0407baSopenharmony_ci{ 563d0407baSopenharmony_ci return -ENODEV; 573d0407baSopenharmony_ci} 583d0407baSopenharmony_ci 593d0407baSopenharmony_cistatic inline int iommu_get_msi_cookie(struct iommu_domain *domain, dma_addr_t base) 603d0407baSopenharmony_ci{ 613d0407baSopenharmony_ci return -ENODEV; 623d0407baSopenharmony_ci} 633d0407baSopenharmony_ci 643d0407baSopenharmony_cistatic inline void iommu_put_dma_cookie(struct iommu_domain *domain) 653d0407baSopenharmony_ci{ 663d0407baSopenharmony_ci} 673d0407baSopenharmony_ci 683d0407baSopenharmony_cistatic inline int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) 693d0407baSopenharmony_ci{ 703d0407baSopenharmony_ci return 0; 713d0407baSopenharmony_ci} 723d0407baSopenharmony_ci 733d0407baSopenharmony_cistatic inline void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg) 743d0407baSopenharmony_ci{ 753d0407baSopenharmony_ci} 763d0407baSopenharmony_ci 773d0407baSopenharmony_cistatic inline void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list) 783d0407baSopenharmony_ci{ 793d0407baSopenharmony_ci} 803d0407baSopenharmony_ci 813d0407baSopenharmony_cistatic inline int iommu_dma_reserve_iova(struct device *dev, dma_addr_t base, u64 size) 823d0407baSopenharmony_ci{ 833d0407baSopenharmony_ci return -ENODEV; 843d0407baSopenharmony_ci} 853d0407baSopenharmony_ci 863d0407baSopenharmony_cistatic inline int iommu_dma_enable_best_fit_algo(struct device *dev) 873d0407baSopenharmony_ci{ 883d0407baSopenharmony_ci return -ENODEV; 893d0407baSopenharmony_ci} 903d0407baSopenharmony_ci 913d0407baSopenharmony_ci#endif /* CONFIG_IOMMU_DMA */ 923d0407baSopenharmony_ci#endif /* __DMA_IOMMU_H */ 93