linux/drivers/iommu/mtk_iommu.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2015-2016 MediaTek Inc.
   3 * Author: Honghui Zhang <honghui.zhang@mediatek.com>
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License version 2 as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 */
  14
  15#ifndef _MTK_IOMMU_H_
  16#define _MTK_IOMMU_H_
  17
  18#include <linux/clk.h>
  19#include <linux/component.h>
  20#include <linux/device.h>
  21#include <linux/io.h>
  22#include <linux/io-pgtable.h>
  23#include <linux/iommu.h>
  24#include <linux/list.h>
  25#include <linux/spinlock.h>
  26#include <soc/mediatek/smi.h>
  27
  28struct mtk_iommu_suspend_reg {
  29        u32                             standard_axi_mode;
  30        u32                             dcm_dis;
  31        u32                             ctrl_reg;
  32        u32                             int_control0;
  33        u32                             int_main_control;
  34        u32                             ivrp_paddr;
  35};
  36
  37enum mtk_iommu_plat {
  38        M4U_MT2701,
  39        M4U_MT2712,
  40        M4U_MT8173,
  41};
  42
  43struct mtk_iommu_domain;
  44
  45struct mtk_iommu_data {
  46        void __iomem                    *base;
  47        int                             irq;
  48        struct device                   *dev;
  49        struct clk                      *bclk;
  50        phys_addr_t                     protect_base; /* protect memory base */
  51        struct mtk_iommu_suspend_reg    reg;
  52        struct mtk_iommu_domain         *m4u_dom;
  53        struct iommu_group              *m4u_group;
  54        struct mtk_smi_iommu            smi_imu;      /* SMI larb iommu info */
  55        bool                            enable_4GB;
  56        bool                            tlb_flush_active;
  57
  58        struct iommu_device             iommu;
  59        enum mtk_iommu_plat             m4u_plat;
  60
  61        struct list_head                list;
  62};
  63
  64static inline int compare_of(struct device *dev, void *data)
  65{
  66        return dev->of_node == data;
  67}
  68
  69static inline void release_of(struct device *dev, void *data)
  70{
  71        of_node_put(data);
  72}
  73
  74static inline int mtk_iommu_bind(struct device *dev)
  75{
  76        struct mtk_iommu_data *data = dev_get_drvdata(dev);
  77
  78        return component_bind_all(dev, &data->smi_imu);
  79}
  80
  81static inline void mtk_iommu_unbind(struct device *dev)
  82{
  83        struct mtk_iommu_data *data = dev_get_drvdata(dev);
  84
  85        component_unbind_all(dev, &data->smi_imu);
  86}
  87
  88#endif
  89