mtk_iommu.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. u32 ivrp_paddr;
  32. };
  33. enum mtk_iommu_plat {
  34. M4U_MT2701,
  35. M4U_MT2712,
  36. M4U_MT8173,
  37. };
  38. struct mtk_iommu_domain;
  39. struct mtk_iommu_data {
  40. void __iomem *base;
  41. int irq;
  42. struct device *dev;
  43. struct clk *bclk;
  44. phys_addr_t protect_base; /* protect memory base */
  45. struct mtk_iommu_suspend_reg reg;
  46. struct mtk_iommu_domain *m4u_dom;
  47. struct iommu_group *m4u_group;
  48. struct mtk_smi_iommu smi_imu; /* SMI larb iommu info */
  49. bool enable_4GB;
  50. bool tlb_flush_active;
  51. struct iommu_device iommu;
  52. enum mtk_iommu_plat m4u_plat;
  53. struct list_head list;
  54. };
  55. static inline int compare_of(struct device *dev, void *data)
  56. {
  57. return dev->of_node == data;
  58. }
  59. static inline void release_of(struct device *dev, void *data)
  60. {
  61. of_node_put(data);
  62. }
  63. static inline int mtk_iommu_bind(struct device *dev)
  64. {
  65. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  66. return component_bind_all(dev, &data->smi_imu);
  67. }
  68. static inline void mtk_iommu_unbind(struct device *dev)
  69. {
  70. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  71. component_unbind_all(dev, &data->smi_imu);
  72. }
  73. #endif