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