mtk_iommu.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. #ifndef _MTK_IOMMU_H_
  15. #define _MTK_IOMMU_H_
  16. #include <linux/clk.h>
  17. #include <linux/component.h>
  18. #include <linux/device.h>
  19. #include <linux/io.h>
  20. #include <linux/iommu.h>
  21. #include <linux/list.h>
  22. #include <linux/spinlock.h>
  23. #include <soc/mediatek/smi.h>
  24. #include "io-pgtable.h"
  25. struct mtk_iommu_suspend_reg {
  26. u32 standard_axi_mode;
  27. u32 dcm_dis;
  28. u32 ctrl_reg;
  29. u32 int_control0;
  30. u32 int_main_control;
  31. };
  32. struct mtk_iommu_client_priv {
  33. struct list_head client;
  34. unsigned int mtk_m4u_id;
  35. struct device *m4udev;
  36. };
  37. struct mtk_iommu_domain;
  38. struct mtk_iommu_data {
  39. void __iomem *base;
  40. int irq;
  41. struct device *dev;
  42. struct clk *bclk;
  43. phys_addr_t protect_base; /* protect memory base */
  44. struct mtk_iommu_suspend_reg reg;
  45. struct mtk_iommu_domain *m4u_dom;
  46. struct iommu_group *m4u_group;
  47. struct mtk_smi_iommu smi_imu; /* SMI larb iommu info */
  48. bool enable_4GB;
  49. };
  50. static inline int compare_of(struct device *dev, void *data)
  51. {
  52. return dev->of_node == data;
  53. }
  54. static inline int mtk_iommu_bind(struct device *dev)
  55. {
  56. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  57. return component_bind_all(dev, &data->smi_imu);
  58. }
  59. static inline void mtk_iommu_unbind(struct device *dev)
  60. {
  61. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  62. component_unbind_all(dev, &data->smi_imu);
  63. }
  64. #endif