mtk_iommu.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. enum mtk_iommu_plat {
  33. M4U_MT2701,
  34. M4U_MT2712,
  35. M4U_MT8173,
  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. bool tlb_flush_active;
  50. struct iommu_device iommu;
  51. enum mtk_iommu_plat m4u_plat;
  52. };
  53. static inline int compare_of(struct device *dev, void *data)
  54. {
  55. return dev->of_node == data;
  56. }
  57. static inline void release_of(struct device *dev, void *data)
  58. {
  59. of_node_put(data);
  60. }
  61. static inline int mtk_iommu_bind(struct device *dev)
  62. {
  63. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  64. return component_bind_all(dev, &data->smi_imu);
  65. }
  66. static inline void mtk_iommu_unbind(struct device *dev)
  67. {
  68. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  69. component_unbind_all(dev, &data->smi_imu);
  70. }
  71. #endif