mtk_iommu.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015-2016 MediaTek Inc.
  4. * Author: Yong Wu <yong.wu@mediatek.com>
  5. */
  6. #include <linux/arm-smccc.h>
  7. #include <linux/bitfield.h>
  8. #include <linux/bug.h>
  9. #include <linux/clk.h>
  10. #include <linux/component.h>
  11. #include <linux/device.h>
  12. #include <linux/err.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/io.h>
  15. #include <linux/iommu.h>
  16. #include <linux/iopoll.h>
  17. #include <linux/io-pgtable.h>
  18. #include <linux/list.h>
  19. #include <linux/mfd/syscon.h>
  20. #include <linux/module.h>
  21. #include <linux/of_address.h>
  22. #include <linux/of_irq.h>
  23. #include <linux/of_platform.h>
  24. #include <linux/pci.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/pm_runtime.h>
  27. #include <linux/regmap.h>
  28. #include <linux/slab.h>
  29. #include <linux/spinlock.h>
  30. #include <linux/soc/mediatek/infracfg.h>
  31. #include <linux/soc/mediatek/mtk_sip_svc.h>
  32. #include <linux/string_choices.h>
  33. #include <asm/barrier.h>
  34. #include <soc/mediatek/smi.h>
  35. #include <dt-bindings/memory/mtk-memory-port.h>
  36. #define REG_MMU_PT_BASE_ADDR 0x000
  37. #define REG_MMU_INVALIDATE 0x020
  38. #define F_ALL_INVLD 0x2
  39. #define F_MMU_INV_RANGE 0x1
  40. #define REG_MMU_INVLD_START_A 0x024
  41. #define REG_MMU_INVLD_END_A 0x028
  42. #define REG_MMU_INV_SEL_GEN2 0x02c
  43. #define REG_MMU_INV_SEL_GEN1 0x038
  44. #define F_INVLD_EN0 BIT(0)
  45. #define F_INVLD_EN1 BIT(1)
  46. #define REG_MMU_MISC_CTRL 0x048
  47. #define F_MMU_IN_ORDER_WR_EN_MASK (BIT(1) | BIT(17))
  48. #define F_MMU_STANDARD_AXI_MODE_MASK (BIT(3) | BIT(19))
  49. #define REG_MMU_DCM_DIS 0x050
  50. #define F_MMU_DCM BIT(8)
  51. #define REG_MMU_WR_LEN_CTRL 0x054
  52. #define F_MMU_WR_THROT_DIS_MASK (BIT(5) | BIT(21))
  53. #define REG_MMU_CTRL_REG 0x110
  54. #define F_MMU_TF_PROT_TO_PROGRAM_ADDR (2 << 4)
  55. #define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4)
  56. #define F_MMU_TF_PROT_TO_PROGRAM_ADDR_MT8173 (2 << 5)
  57. #define REG_MMU_IVRP_PADDR 0x114
  58. #define REG_MMU_VLD_PA_RNG 0x118
  59. #define F_MMU_VLD_PA_RNG(EA, SA) (((EA) << 8) | (SA))
  60. #define REG_MMU_INT_CONTROL0 0x120
  61. #define F_L2_MULIT_HIT_EN BIT(0)
  62. #define F_TABLE_WALK_FAULT_INT_EN BIT(1)
  63. #define F_PREETCH_FIFO_OVERFLOW_INT_EN BIT(2)
  64. #define F_MISS_FIFO_OVERFLOW_INT_EN BIT(3)
  65. #define F_PREFETCH_FIFO_ERR_INT_EN BIT(5)
  66. #define F_MISS_FIFO_ERR_INT_EN BIT(6)
  67. #define F_INT_CLR_BIT BIT(12)
  68. #define REG_MMU_INT_MAIN_CONTROL 0x124
  69. /* mmu0 | mmu1 */
  70. #define F_INT_TRANSLATION_FAULT (BIT(0) | BIT(7))
  71. #define F_INT_MAIN_MULTI_HIT_FAULT (BIT(1) | BIT(8))
  72. #define F_INT_INVALID_PA_FAULT (BIT(2) | BIT(9))
  73. #define F_INT_ENTRY_REPLACEMENT_FAULT (BIT(3) | BIT(10))
  74. #define F_INT_TLB_MISS_FAULT (BIT(4) | BIT(11))
  75. #define F_INT_MISS_TRANSACTION_FIFO_FAULT (BIT(5) | BIT(12))
  76. #define F_INT_PRETETCH_TRANSATION_FIFO_FAULT (BIT(6) | BIT(13))
  77. #define REG_MMU_CPE_DONE 0x12C
  78. #define REG_MMU_FAULT_ST1 0x134
  79. #define F_REG_MMU0_FAULT_MASK GENMASK(6, 0)
  80. #define F_REG_MMU1_FAULT_MASK GENMASK(13, 7)
  81. #define REG_MMU0_FAULT_VA 0x13c
  82. #define F_MMU_INVAL_VA_31_12_MASK GENMASK(31, 12)
  83. #define F_MMU_INVAL_VA_34_32_MASK GENMASK(11, 9)
  84. #define F_MMU_INVAL_PA_34_32_MASK GENMASK(8, 6)
  85. #define F_MMU_FAULT_VA_WRITE_BIT BIT(1)
  86. #define F_MMU_FAULT_VA_LAYER_BIT BIT(0)
  87. #define REG_MMU0_INVLD_PA 0x140
  88. #define REG_MMU1_FAULT_VA 0x144
  89. #define REG_MMU1_INVLD_PA 0x148
  90. #define REG_MMU0_INT_ID 0x150
  91. #define REG_MMU1_INT_ID 0x154
  92. #define F_MMU_INT_ID_COMM_ID(a) (((a) >> 9) & 0x7)
  93. #define F_MMU_INT_ID_SUB_COMM_ID(a) (((a) >> 7) & 0x3)
  94. #define F_MMU_INT_ID_COMM_ID_EXT(a) (((a) >> 10) & 0x7)
  95. #define F_MMU_INT_ID_SUB_COMM_ID_EXT(a) (((a) >> 7) & 0x7)
  96. /* Macro for 5 bits length port ID field (default) */
  97. #define F_MMU_INT_ID_LARB_ID(a) (((a) >> 7) & 0x7)
  98. #define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f)
  99. /* Macro for 6 bits length port ID field */
  100. #define F_MMU_INT_ID_LARB_ID_WID_6(a) (((a) >> 8) & 0x7)
  101. #define F_MMU_INT_ID_PORT_ID_WID_6(a) (((a) >> 2) & 0x3f)
  102. #define MTK_PROTECT_PA_ALIGN 256
  103. #define MTK_IOMMU_BANK_SZ 0x1000
  104. #define PERICFG_IOMMU_1 0x714
  105. #define HAS_4GB_MODE BIT(0)
  106. /* HW will use the EMI clock if there isn't the "bclk". */
  107. #define HAS_BCLK BIT(1)
  108. #define HAS_VLD_PA_RNG BIT(2)
  109. #define RESET_AXI BIT(3)
  110. #define OUT_ORDER_WR_EN BIT(4)
  111. #define HAS_SUB_COMM_2BITS BIT(5)
  112. #define HAS_SUB_COMM_3BITS BIT(6)
  113. #define WR_THROT_EN BIT(7)
  114. #define HAS_LEGACY_IVRP_PADDR BIT(8)
  115. #define IOVA_34_EN BIT(9)
  116. #define SHARE_PGTABLE BIT(10) /* 2 HW share pgtable */
  117. #define DCM_DISABLE BIT(11)
  118. #define STD_AXI_MODE BIT(12) /* For non MM iommu */
  119. /* 2 bits: iommu type */
  120. #define MTK_IOMMU_TYPE_MM (0x0 << 13)
  121. #define MTK_IOMMU_TYPE_INFRA (0x1 << 13)
  122. #define MTK_IOMMU_TYPE_APU (0x2 << 13)
  123. #define MTK_IOMMU_TYPE_MASK (0x3 << 13)
  124. /* PM and clock always on. e.g. infra iommu */
  125. #define PM_CLK_AO BIT(15)
  126. #define IFA_IOMMU_PCIE_SUPPORT BIT(16)
  127. #define PGTABLE_PA_35_EN BIT(17)
  128. #define TF_PORT_TO_ADDR_MT8173 BIT(18)
  129. #define INT_ID_PORT_WIDTH_6 BIT(19)
  130. #define CFG_IFA_MASTER_IN_ATF BIT(20)
  131. #define DL_WITH_MULTI_LARB BIT(21)
  132. #define MTK_IOMMU_HAS_FLAG_MASK(pdata, _x, mask) \
  133. ((((pdata)->flags) & (mask)) == (_x))
  134. #define MTK_IOMMU_HAS_FLAG(pdata, _x) MTK_IOMMU_HAS_FLAG_MASK(pdata, _x, _x)
  135. #define MTK_IOMMU_IS_TYPE(pdata, _x) MTK_IOMMU_HAS_FLAG_MASK(pdata, _x,\
  136. MTK_IOMMU_TYPE_MASK)
  137. #define MTK_INVALID_LARBID MTK_LARB_NR_MAX
  138. #define MTK_LARB_COM_MAX 8
  139. #define MTK_LARB_SUBCOM_MAX 8
  140. #define MTK_IOMMU_GROUP_MAX 8
  141. #define MTK_IOMMU_BANK_MAX 5
  142. enum mtk_iommu_plat {
  143. M4U_MT2712,
  144. M4U_MT6779,
  145. M4U_MT6795,
  146. M4U_MT8167,
  147. M4U_MT8173,
  148. M4U_MT8183,
  149. M4U_MT8186,
  150. M4U_MT8188,
  151. M4U_MT8189,
  152. M4U_MT8192,
  153. M4U_MT8195,
  154. M4U_MT8365,
  155. };
  156. struct mtk_iommu_iova_region {
  157. dma_addr_t iova_base;
  158. unsigned long long size;
  159. };
  160. struct mtk_iommu_suspend_reg {
  161. u32 misc_ctrl;
  162. u32 dcm_dis;
  163. u32 ctrl_reg;
  164. u32 vld_pa_rng;
  165. u32 wr_len_ctrl;
  166. u32 int_control[MTK_IOMMU_BANK_MAX];
  167. u32 int_main_control[MTK_IOMMU_BANK_MAX];
  168. u32 ivrp_paddr[MTK_IOMMU_BANK_MAX];
  169. };
  170. struct mtk_iommu_plat_data {
  171. enum mtk_iommu_plat m4u_plat;
  172. u32 flags;
  173. u32 inv_sel_reg;
  174. char *pericfg_comp_str;
  175. struct list_head *hw_list;
  176. /*
  177. * The IOMMU HW may support 16GB iova. In order to balance the IOVA ranges,
  178. * different masters will be put in different iova ranges, for example vcodec
  179. * is in 4G-8G and cam is in 8G-12G. Meanwhile, some masters may have the
  180. * special IOVA range requirement, like CCU can only support the address
  181. * 0x40000000-0x44000000.
  182. * Here list the iova ranges this SoC supports and which larbs/ports are in
  183. * which region.
  184. *
  185. * 16GB iova all use one pgtable, but each a region is a iommu group.
  186. */
  187. struct {
  188. unsigned int iova_region_nr;
  189. const struct mtk_iommu_iova_region *iova_region;
  190. /*
  191. * Indicate the correspondance between larbs, ports and regions.
  192. *
  193. * The index is the same as iova_region and larb port numbers are
  194. * described as bit positions.
  195. * For example, storing BIT(0) at index 2,1 means "larb 1, port0 is in region 2".
  196. * [2] = { [1] = BIT(0) }
  197. */
  198. const u32 (*iova_region_larb_msk)[MTK_LARB_NR_MAX];
  199. };
  200. /*
  201. * The IOMMU HW may have 5 banks. Each bank has a independent pgtable.
  202. * Here list how many banks this SoC supports/enables and which ports are in which bank.
  203. */
  204. struct {
  205. u8 banks_num;
  206. bool banks_enable[MTK_IOMMU_BANK_MAX];
  207. unsigned int banks_portmsk[MTK_IOMMU_BANK_MAX];
  208. };
  209. unsigned char larbid_remap[MTK_LARB_COM_MAX][MTK_LARB_SUBCOM_MAX];
  210. };
  211. struct mtk_iommu_bank_data {
  212. void __iomem *base;
  213. int irq;
  214. u8 id;
  215. struct device *parent_dev;
  216. struct mtk_iommu_data *parent_data;
  217. spinlock_t tlb_lock; /* lock for tlb range flush */
  218. struct mtk_iommu_domain *m4u_dom; /* Each bank has a domain */
  219. };
  220. struct mtk_iommu_data {
  221. struct device *dev;
  222. struct clk *bclk;
  223. phys_addr_t protect_base; /* protect memory base */
  224. struct mtk_iommu_suspend_reg reg;
  225. struct iommu_group *m4u_group[MTK_IOMMU_GROUP_MAX];
  226. bool enable_4GB;
  227. struct iommu_device iommu;
  228. const struct mtk_iommu_plat_data *plat_data;
  229. struct device *smicomm_dev;
  230. struct mtk_iommu_bank_data *bank;
  231. struct mtk_iommu_domain *share_dom;
  232. struct regmap *pericfg;
  233. struct mutex mutex; /* Protect m4u_group/m4u_dom above */
  234. /*
  235. * In the sharing pgtable case, list data->list to the global list like m4ulist.
  236. * In the non-sharing pgtable case, list data->list to the itself hw_list_head.
  237. */
  238. struct list_head *hw_list;
  239. struct list_head hw_list_head;
  240. struct list_head list;
  241. struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX];
  242. };
  243. struct mtk_iommu_domain {
  244. struct io_pgtable_cfg cfg;
  245. struct io_pgtable_ops *iop;
  246. struct mtk_iommu_bank_data *bank;
  247. struct iommu_domain domain;
  248. struct mutex mutex; /* Protect "data" in this structure */
  249. };
  250. static int mtk_iommu_bind(struct device *dev)
  251. {
  252. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  253. return component_bind_all(dev, &data->larb_imu);
  254. }
  255. static void mtk_iommu_unbind(struct device *dev)
  256. {
  257. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  258. component_unbind_all(dev, &data->larb_imu);
  259. }
  260. static const struct iommu_ops mtk_iommu_ops;
  261. static int mtk_iommu_hw_init(const struct mtk_iommu_data *data, unsigned int bankid);
  262. #define MTK_IOMMU_TLB_ADDR(iova) ({ \
  263. dma_addr_t _addr = iova; \
  264. ((lower_32_bits(_addr) & GENMASK(31, 12)) | upper_32_bits(_addr));\
  265. })
  266. /*
  267. * In M4U 4GB mode, the physical address is remapped as below:
  268. *
  269. * CPU Physical address:
  270. * ====================
  271. *
  272. * 0 1G 2G 3G 4G 5G
  273. * |---A---|---B---|---C---|---D---|---E---|
  274. * +--I/O--+------------Memory-------------+
  275. *
  276. * IOMMU output physical address:
  277. * =============================
  278. *
  279. * 4G 5G 6G 7G 8G
  280. * |---E---|---B---|---C---|---D---|
  281. * +------------Memory-------------+
  282. *
  283. * The Region 'A'(I/O) can NOT be mapped by M4U; For Region 'B'/'C'/'D', the
  284. * bit32 of the CPU physical address always is needed to set, and for Region
  285. * 'E', the CPU physical address keep as is.
  286. * Additionally, The iommu consumers always use the CPU phyiscal address.
  287. */
  288. #define MTK_IOMMU_4GB_MODE_REMAP_BASE 0x140000000UL
  289. static LIST_HEAD(apulist); /* List the apu iommu HWs */
  290. static LIST_HEAD(infralist); /* List the iommu_infra HW */
  291. static LIST_HEAD(m4ulist); /* List all the M4U HWs */
  292. #define for_each_m4u(data, head) list_for_each_entry(data, head, list)
  293. #define MTK_IOMMU_IOVA_SZ_4G (SZ_4G - SZ_8M) /* 8M as gap */
  294. static const struct mtk_iommu_iova_region single_domain[] = {
  295. {.iova_base = 0, .size = MTK_IOMMU_IOVA_SZ_4G},
  296. };
  297. #define MT8192_MULTI_REGION_NR_MAX 6
  298. #define MT8192_MULTI_REGION_NR (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) ? \
  299. MT8192_MULTI_REGION_NR_MAX : 1)
  300. static const struct mtk_iommu_iova_region mt8189_multi_dom_apu[] = {
  301. { .iova_base = 0x200000ULL, .size = SZ_512M}, /* APU SECURE */
  302. #if IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)
  303. { .iova_base = SZ_1G, .size = 0xc0000000}, /* APU CODE */
  304. { .iova_base = 0x70000000ULL, .size = 0x12600000}, /* APU VLM */
  305. { .iova_base = SZ_4G, .size = SZ_4G * 3}, /* APU VPU */
  306. #endif
  307. };
  308. static const struct mtk_iommu_iova_region mt8192_multi_dom[MT8192_MULTI_REGION_NR] = {
  309. { .iova_base = 0x0, .size = MTK_IOMMU_IOVA_SZ_4G}, /* 0 ~ 4G, */
  310. #if IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)
  311. { .iova_base = SZ_4G, .size = MTK_IOMMU_IOVA_SZ_4G}, /* 4G ~ 8G */
  312. { .iova_base = SZ_4G * 2, .size = MTK_IOMMU_IOVA_SZ_4G}, /* 8G ~ 12G */
  313. { .iova_base = SZ_4G * 3, .size = MTK_IOMMU_IOVA_SZ_4G}, /* 12G ~ 16G */
  314. { .iova_base = 0x240000000ULL, .size = 0x4000000}, /* CCU0 */
  315. { .iova_base = 0x244000000ULL, .size = 0x4000000}, /* CCU1 */
  316. #endif
  317. };
  318. /* If 2 M4U share a domain(use the same hwlist), Put the corresponding info in first data.*/
  319. static struct mtk_iommu_data *mtk_iommu_get_frst_data(struct list_head *hwlist)
  320. {
  321. return list_first_entry(hwlist, struct mtk_iommu_data, list);
  322. }
  323. static struct mtk_iommu_domain *to_mtk_domain(struct iommu_domain *dom)
  324. {
  325. return container_of(dom, struct mtk_iommu_domain, domain);
  326. }
  327. static void mtk_iommu_tlb_flush_all(struct mtk_iommu_data *data)
  328. {
  329. /* Tlb flush all always is in bank0. */
  330. struct mtk_iommu_bank_data *bank = &data->bank[0];
  331. void __iomem *base = bank->base;
  332. unsigned long flags;
  333. spin_lock_irqsave(&bank->tlb_lock, flags);
  334. writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, base + data->plat_data->inv_sel_reg);
  335. writel_relaxed(F_ALL_INVLD, base + REG_MMU_INVALIDATE);
  336. wmb(); /* Make sure the tlb flush all done */
  337. spin_unlock_irqrestore(&bank->tlb_lock, flags);
  338. }
  339. static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size,
  340. struct mtk_iommu_bank_data *bank)
  341. {
  342. struct list_head *head = bank->parent_data->hw_list;
  343. struct mtk_iommu_bank_data *curbank;
  344. struct mtk_iommu_data *data;
  345. bool check_pm_status;
  346. unsigned long flags;
  347. void __iomem *base;
  348. int ret;
  349. u32 tmp;
  350. for_each_m4u(data, head) {
  351. /*
  352. * To avoid resume the iommu device frequently when the iommu device
  353. * is not active, it doesn't always call pm_runtime_get here, then tlb
  354. * flush depends on the tlb flush all in the runtime resume.
  355. *
  356. * There are 2 special cases:
  357. *
  358. * Case1: The iommu dev doesn't have power domain but has bclk. This case
  359. * should also avoid the tlb flush while the dev is not active to mute
  360. * the tlb timeout log. like mt8173.
  361. *
  362. * Case2: The power/clock of infra iommu is always on, and it doesn't
  363. * have the device link with the master devices. This case should avoid
  364. * the PM status check.
  365. */
  366. check_pm_status = !MTK_IOMMU_HAS_FLAG(data->plat_data, PM_CLK_AO);
  367. if (check_pm_status) {
  368. if (pm_runtime_get_if_in_use(data->dev) <= 0)
  369. continue;
  370. }
  371. curbank = &data->bank[bank->id];
  372. base = curbank->base;
  373. spin_lock_irqsave(&curbank->tlb_lock, flags);
  374. writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0,
  375. base + data->plat_data->inv_sel_reg);
  376. writel_relaxed(MTK_IOMMU_TLB_ADDR(iova), base + REG_MMU_INVLD_START_A);
  377. writel_relaxed(MTK_IOMMU_TLB_ADDR(iova + size - 1),
  378. base + REG_MMU_INVLD_END_A);
  379. writel_relaxed(F_MMU_INV_RANGE, base + REG_MMU_INVALIDATE);
  380. /* tlb sync */
  381. ret = readl_poll_timeout_atomic(base + REG_MMU_CPE_DONE,
  382. tmp, tmp != 0, 10, 1000);
  383. /* Clear the CPE status */
  384. writel_relaxed(0, base + REG_MMU_CPE_DONE);
  385. spin_unlock_irqrestore(&curbank->tlb_lock, flags);
  386. if (ret) {
  387. dev_warn(data->dev,
  388. "Partial TLB flush timed out, falling back to full flush\n");
  389. mtk_iommu_tlb_flush_all(data);
  390. }
  391. if (check_pm_status)
  392. pm_runtime_put(data->dev);
  393. }
  394. }
  395. static irqreturn_t mtk_iommu_isr(int irq, void *dev_id)
  396. {
  397. struct mtk_iommu_bank_data *bank = dev_id;
  398. struct mtk_iommu_data *data = bank->parent_data;
  399. struct mtk_iommu_domain *dom = bank->m4u_dom;
  400. unsigned int fault_larb = MTK_INVALID_LARBID, fault_port = 0, sub_comm = 0;
  401. u32 int_state, regval, va34_32, pa34_32;
  402. const struct mtk_iommu_plat_data *plat_data = data->plat_data;
  403. void __iomem *base = bank->base;
  404. u64 fault_iova, fault_pa;
  405. bool layer, write;
  406. /* Read error info from registers */
  407. int_state = readl_relaxed(base + REG_MMU_FAULT_ST1);
  408. if (int_state & F_REG_MMU0_FAULT_MASK) {
  409. regval = readl_relaxed(base + REG_MMU0_INT_ID);
  410. fault_iova = readl_relaxed(base + REG_MMU0_FAULT_VA);
  411. fault_pa = readl_relaxed(base + REG_MMU0_INVLD_PA);
  412. } else {
  413. regval = readl_relaxed(base + REG_MMU1_INT_ID);
  414. fault_iova = readl_relaxed(base + REG_MMU1_FAULT_VA);
  415. fault_pa = readl_relaxed(base + REG_MMU1_INVLD_PA);
  416. }
  417. layer = fault_iova & F_MMU_FAULT_VA_LAYER_BIT;
  418. write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT;
  419. if (MTK_IOMMU_HAS_FLAG(plat_data, IOVA_34_EN)) {
  420. va34_32 = FIELD_GET(F_MMU_INVAL_VA_34_32_MASK, fault_iova);
  421. fault_iova = fault_iova & F_MMU_INVAL_VA_31_12_MASK;
  422. fault_iova |= (u64)va34_32 << 32;
  423. }
  424. pa34_32 = FIELD_GET(F_MMU_INVAL_PA_34_32_MASK, fault_iova);
  425. fault_pa |= (u64)pa34_32 << 32;
  426. if (MTK_IOMMU_IS_TYPE(plat_data, MTK_IOMMU_TYPE_MM)) {
  427. if (MTK_IOMMU_HAS_FLAG(plat_data, HAS_SUB_COMM_2BITS)) {
  428. fault_larb = F_MMU_INT_ID_COMM_ID(regval);
  429. sub_comm = F_MMU_INT_ID_SUB_COMM_ID(regval);
  430. fault_port = F_MMU_INT_ID_PORT_ID(regval);
  431. } else if (MTK_IOMMU_HAS_FLAG(plat_data, HAS_SUB_COMM_3BITS)) {
  432. fault_larb = F_MMU_INT_ID_COMM_ID_EXT(regval);
  433. sub_comm = F_MMU_INT_ID_SUB_COMM_ID_EXT(regval);
  434. fault_port = F_MMU_INT_ID_PORT_ID(regval);
  435. } else if (MTK_IOMMU_HAS_FLAG(plat_data, INT_ID_PORT_WIDTH_6)) {
  436. fault_port = F_MMU_INT_ID_PORT_ID_WID_6(regval);
  437. fault_larb = F_MMU_INT_ID_LARB_ID_WID_6(regval);
  438. } else {
  439. fault_port = F_MMU_INT_ID_PORT_ID(regval);
  440. fault_larb = F_MMU_INT_ID_LARB_ID(regval);
  441. }
  442. fault_larb = data->plat_data->larbid_remap[fault_larb][sub_comm];
  443. }
  444. if (!dom || report_iommu_fault(&dom->domain, bank->parent_dev, fault_iova,
  445. write ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ)) {
  446. dev_err_ratelimited(
  447. bank->parent_dev,
  448. "fault type=0x%x iova=0x%llx pa=0x%llx master=0x%x(larb=%d port=%d) layer=%d %s\n",
  449. int_state, fault_iova, fault_pa, regval, fault_larb, fault_port,
  450. layer, str_write_read(write));
  451. }
  452. /* Interrupt clear */
  453. regval = readl_relaxed(base + REG_MMU_INT_CONTROL0);
  454. regval |= F_INT_CLR_BIT;
  455. writel_relaxed(regval, base + REG_MMU_INT_CONTROL0);
  456. mtk_iommu_tlb_flush_all(data);
  457. return IRQ_HANDLED;
  458. }
  459. static unsigned int mtk_iommu_get_bank_id(struct device *dev,
  460. const struct mtk_iommu_plat_data *plat_data)
  461. {
  462. struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
  463. unsigned int i, portmsk = 0, bankid = 0;
  464. if (plat_data->banks_num == 1)
  465. return bankid;
  466. for (i = 0; i < fwspec->num_ids; i++)
  467. portmsk |= BIT(MTK_M4U_TO_PORT(fwspec->ids[i]));
  468. for (i = 0; i < plat_data->banks_num && i < MTK_IOMMU_BANK_MAX; i++) {
  469. if (!plat_data->banks_enable[i])
  470. continue;
  471. if (portmsk & plat_data->banks_portmsk[i]) {
  472. bankid = i;
  473. break;
  474. }
  475. }
  476. return bankid; /* default is 0 */
  477. }
  478. static int mtk_iommu_get_iova_region_id(struct device *dev,
  479. const struct mtk_iommu_plat_data *plat_data)
  480. {
  481. struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
  482. unsigned int portidmsk = 0, larbid;
  483. const u32 *rgn_larb_msk;
  484. int i;
  485. if (plat_data->iova_region_nr == 1)
  486. return 0;
  487. larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
  488. for (i = 0; i < fwspec->num_ids; i++)
  489. portidmsk |= BIT(MTK_M4U_TO_PORT(fwspec->ids[i]));
  490. for (i = 0; i < plat_data->iova_region_nr; i++) {
  491. rgn_larb_msk = plat_data->iova_region_larb_msk[i];
  492. if (!rgn_larb_msk)
  493. continue;
  494. if ((rgn_larb_msk[larbid] & portidmsk) == portidmsk)
  495. return i;
  496. }
  497. dev_err(dev, "Can NOT find the region for larb(%d-%x).\n",
  498. larbid, portidmsk);
  499. return -EINVAL;
  500. }
  501. static int mtk_iommu_config(struct mtk_iommu_data *data, struct device *dev,
  502. bool enable, unsigned int regionid)
  503. {
  504. struct mtk_smi_larb_iommu *larb_mmu;
  505. unsigned int larbid, portid;
  506. struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
  507. const struct mtk_iommu_iova_region *region;
  508. unsigned long portid_msk = 0;
  509. struct arm_smccc_res res;
  510. int i, ret = 0;
  511. for (i = 0; i < fwspec->num_ids; ++i) {
  512. portid = MTK_M4U_TO_PORT(fwspec->ids[i]);
  513. portid_msk |= BIT(portid);
  514. }
  515. if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
  516. /* All ports should be in the same larb. just use 0 here */
  517. larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
  518. larb_mmu = &data->larb_imu[larbid];
  519. region = data->plat_data->iova_region + regionid;
  520. for_each_set_bit(portid, &portid_msk, 32)
  521. larb_mmu->bank[portid] = upper_32_bits(region->iova_base);
  522. dev_dbg(dev, "%s iommu for larb(%s) port 0x%lx region %d rgn-bank %d.\n",
  523. str_enable_disable(enable), dev_name(larb_mmu->dev),
  524. portid_msk, regionid, upper_32_bits(region->iova_base));
  525. if (enable)
  526. larb_mmu->mmu |= portid_msk;
  527. else
  528. larb_mmu->mmu &= ~portid_msk;
  529. } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA)) {
  530. if (MTK_IOMMU_HAS_FLAG(data->plat_data, CFG_IFA_MASTER_IN_ATF)) {
  531. arm_smccc_smc(MTK_SIP_KERNEL_IOMMU_CONTROL,
  532. IOMMU_ATF_CMD_CONFIG_INFRA_IOMMU,
  533. portid_msk, enable, 0, 0, 0, 0, &res);
  534. ret = res.a0;
  535. } else {
  536. /* PCI dev has only one output id, enable the next writing bit for PCIe */
  537. if (dev_is_pci(dev)) {
  538. if (fwspec->num_ids != 1) {
  539. dev_err(dev, "PCI dev can only have one port.\n");
  540. return -ENODEV;
  541. }
  542. portid_msk |= BIT(portid + 1);
  543. }
  544. ret = regmap_update_bits(data->pericfg, PERICFG_IOMMU_1,
  545. (u32)portid_msk, enable ? (u32)portid_msk : 0);
  546. }
  547. if (ret)
  548. dev_err(dev, "%s iommu(%s) inframaster 0x%lx fail(%d).\n",
  549. str_enable_disable(enable), dev_name(data->dev),
  550. portid_msk, ret);
  551. }
  552. return ret;
  553. }
  554. static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom,
  555. struct mtk_iommu_data *data,
  556. unsigned int region_id)
  557. {
  558. struct mtk_iommu_domain *share_dom = data->share_dom;
  559. const struct mtk_iommu_iova_region *region;
  560. /* Share pgtable when 2 MM IOMMU share the pgtable or one IOMMU use multiple iova ranges */
  561. if (share_dom) {
  562. dom->iop = share_dom->iop;
  563. dom->cfg = share_dom->cfg;
  564. dom->domain.pgsize_bitmap = share_dom->domain.pgsize_bitmap;
  565. goto update_iova_region;
  566. }
  567. dom->cfg = (struct io_pgtable_cfg) {
  568. .quirks = IO_PGTABLE_QUIRK_ARM_NS |
  569. IO_PGTABLE_QUIRK_NO_PERMS |
  570. IO_PGTABLE_QUIRK_ARM_MTK_EXT,
  571. .pgsize_bitmap = dom->domain.pgsize_bitmap,
  572. .ias = MTK_IOMMU_HAS_FLAG(data->plat_data, IOVA_34_EN) ? 34 : 32,
  573. .iommu_dev = data->dev,
  574. };
  575. if (MTK_IOMMU_HAS_FLAG(data->plat_data, PGTABLE_PA_35_EN))
  576. dom->cfg.quirks |= IO_PGTABLE_QUIRK_ARM_MTK_TTBR_EXT;
  577. if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_4GB_MODE))
  578. dom->cfg.oas = data->enable_4GB ? 33 : 32;
  579. else
  580. dom->cfg.oas = 35;
  581. dom->iop = alloc_io_pgtable_ops(ARM_V7S, &dom->cfg, data);
  582. if (!dom->iop) {
  583. dev_err(data->dev, "Failed to alloc io pgtable\n");
  584. return -ENOMEM;
  585. }
  586. data->share_dom = dom;
  587. update_iova_region:
  588. /* Update the iova region for this domain */
  589. region = data->plat_data->iova_region + region_id;
  590. dom->domain.geometry.aperture_start = region->iova_base;
  591. dom->domain.geometry.aperture_end = region->iova_base + region->size - 1;
  592. dom->domain.geometry.force_aperture = true;
  593. return 0;
  594. }
  595. static struct iommu_domain *mtk_iommu_domain_alloc_paging(struct device *dev)
  596. {
  597. struct mtk_iommu_domain *dom;
  598. dom = kzalloc_obj(*dom);
  599. if (!dom)
  600. return NULL;
  601. mutex_init(&dom->mutex);
  602. dom->domain.pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M;
  603. return &dom->domain;
  604. }
  605. static void mtk_iommu_domain_free(struct iommu_domain *domain)
  606. {
  607. kfree(to_mtk_domain(domain));
  608. }
  609. static int mtk_iommu_attach_device(struct iommu_domain *domain,
  610. struct device *dev, struct iommu_domain *old)
  611. {
  612. struct mtk_iommu_data *data = dev_iommu_priv_get(dev), *frstdata;
  613. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  614. struct list_head *hw_list = data->hw_list;
  615. struct device *m4udev = data->dev;
  616. struct mtk_iommu_bank_data *bank;
  617. unsigned int bankid;
  618. int ret, region_id;
  619. region_id = mtk_iommu_get_iova_region_id(dev, data->plat_data);
  620. if (region_id < 0)
  621. return region_id;
  622. bankid = mtk_iommu_get_bank_id(dev, data->plat_data);
  623. mutex_lock(&dom->mutex);
  624. if (!dom->bank) {
  625. /* Data is in the frstdata in sharing pgtable case. */
  626. frstdata = mtk_iommu_get_frst_data(hw_list);
  627. mutex_lock(&frstdata->mutex);
  628. ret = mtk_iommu_domain_finalise(dom, frstdata, region_id);
  629. mutex_unlock(&frstdata->mutex);
  630. if (ret) {
  631. mutex_unlock(&dom->mutex);
  632. return ret;
  633. }
  634. dom->bank = &data->bank[bankid];
  635. }
  636. mutex_unlock(&dom->mutex);
  637. mutex_lock(&data->mutex);
  638. bank = &data->bank[bankid];
  639. if (!bank->m4u_dom) { /* Initialize the M4U HW for each a BANK */
  640. ret = pm_runtime_resume_and_get(m4udev);
  641. if (ret < 0) {
  642. dev_err(m4udev, "pm get fail(%d) in attach.\n", ret);
  643. goto err_unlock;
  644. }
  645. ret = mtk_iommu_hw_init(data, bankid);
  646. if (ret) {
  647. pm_runtime_put(m4udev);
  648. goto err_unlock;
  649. }
  650. bank->m4u_dom = dom;
  651. writel(dom->cfg.arm_v7s_cfg.ttbr, bank->base + REG_MMU_PT_BASE_ADDR);
  652. pm_runtime_put(m4udev);
  653. }
  654. mutex_unlock(&data->mutex);
  655. if (region_id > 0) {
  656. ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));
  657. if (ret) {
  658. dev_err(m4udev, "Failed to set dma_mask for %s(%d).\n", dev_name(dev), ret);
  659. return ret;
  660. }
  661. }
  662. return mtk_iommu_config(data, dev, true, region_id);
  663. err_unlock:
  664. mutex_unlock(&data->mutex);
  665. return ret;
  666. }
  667. static int mtk_iommu_identity_attach(struct iommu_domain *identity_domain,
  668. struct device *dev,
  669. struct iommu_domain *old)
  670. {
  671. struct mtk_iommu_data *data = dev_iommu_priv_get(dev);
  672. if (old == identity_domain || !old)
  673. return 0;
  674. mtk_iommu_config(data, dev, false, 0);
  675. return 0;
  676. }
  677. static struct iommu_domain_ops mtk_iommu_identity_ops = {
  678. .attach_dev = mtk_iommu_identity_attach,
  679. };
  680. static struct iommu_domain mtk_iommu_identity_domain = {
  681. .type = IOMMU_DOMAIN_IDENTITY,
  682. .ops = &mtk_iommu_identity_ops,
  683. };
  684. static int mtk_iommu_map(struct iommu_domain *domain, unsigned long iova,
  685. phys_addr_t paddr, size_t pgsize, size_t pgcount,
  686. int prot, gfp_t gfp, size_t *mapped)
  687. {
  688. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  689. /* The "4GB mode" M4U physically can not use the lower remap of Dram. */
  690. if (dom->bank->parent_data->enable_4GB)
  691. paddr |= BIT_ULL(32);
  692. /* Synchronize with the tlb_lock */
  693. return dom->iop->map_pages(dom->iop, iova, paddr, pgsize, pgcount, prot, gfp, mapped);
  694. }
  695. static size_t mtk_iommu_unmap(struct iommu_domain *domain,
  696. unsigned long iova, size_t pgsize, size_t pgcount,
  697. struct iommu_iotlb_gather *gather)
  698. {
  699. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  700. iommu_iotlb_gather_add_range(gather, iova, pgsize * pgcount);
  701. return dom->iop->unmap_pages(dom->iop, iova, pgsize, pgcount, gather);
  702. }
  703. static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain)
  704. {
  705. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  706. if (dom->bank)
  707. mtk_iommu_tlb_flush_all(dom->bank->parent_data);
  708. }
  709. static void mtk_iommu_iotlb_sync(struct iommu_domain *domain,
  710. struct iommu_iotlb_gather *gather)
  711. {
  712. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  713. size_t length = gather->end - gather->start + 1;
  714. mtk_iommu_tlb_flush_range_sync(gather->start, length, dom->bank);
  715. }
  716. static int mtk_iommu_sync_map(struct iommu_domain *domain, unsigned long iova,
  717. size_t size)
  718. {
  719. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  720. mtk_iommu_tlb_flush_range_sync(iova, size, dom->bank);
  721. return 0;
  722. }
  723. static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
  724. dma_addr_t iova)
  725. {
  726. struct mtk_iommu_domain *dom = to_mtk_domain(domain);
  727. phys_addr_t pa;
  728. pa = dom->iop->iova_to_phys(dom->iop, iova);
  729. if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT) &&
  730. dom->bank->parent_data->enable_4GB &&
  731. pa >= MTK_IOMMU_4GB_MODE_REMAP_BASE)
  732. pa &= ~BIT_ULL(32);
  733. return pa;
  734. }
  735. static struct iommu_device *mtk_iommu_probe_device(struct device *dev)
  736. {
  737. struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
  738. struct mtk_iommu_data *data = dev_iommu_priv_get(dev);
  739. struct device_link *link;
  740. struct device *larbdev;
  741. unsigned long larbid_msk = 0;
  742. unsigned int larbid, larbidx, i;
  743. if (!MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM))
  744. return &data->iommu;
  745. /*
  746. * Link the consumer device with the smi-larb device(supplier).
  747. * w/DL_WITH_MULTI_LARB: the master may connect with multi larbs,
  748. * we should create device link with each larb.
  749. * w/o DL_WITH_MULTI_LARB: the master must connect with one larb,
  750. * otherwise fail.
  751. */
  752. larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
  753. if (larbid >= MTK_LARB_NR_MAX)
  754. return ERR_PTR(-EINVAL);
  755. larbid_msk |= BIT(larbid);
  756. for (i = 1; i < fwspec->num_ids; i++) {
  757. larbidx = MTK_M4U_TO_LARB(fwspec->ids[i]);
  758. if (MTK_IOMMU_HAS_FLAG(data->plat_data, DL_WITH_MULTI_LARB)) {
  759. larbid_msk |= BIT(larbidx);
  760. } else if (larbid != larbidx) {
  761. dev_err(dev, "Can only use one larb. Fail@larb%d-%d.\n",
  762. larbid, larbidx);
  763. return ERR_PTR(-EINVAL);
  764. }
  765. }
  766. for_each_set_bit(larbid, &larbid_msk, 32) {
  767. larbdev = data->larb_imu[larbid].dev;
  768. if (!larbdev)
  769. return ERR_PTR(-EINVAL);
  770. link = device_link_add(dev, larbdev,
  771. DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS);
  772. if (!link) {
  773. dev_err(dev, "Unable to link %s\n", dev_name(larbdev));
  774. goto link_remove;
  775. }
  776. }
  777. return &data->iommu;
  778. link_remove:
  779. for_each_set_bit(i, &larbid_msk, larbid) {
  780. larbdev = data->larb_imu[i].dev;
  781. device_link_remove(dev, larbdev);
  782. }
  783. return ERR_PTR(-ENODEV);
  784. }
  785. static void mtk_iommu_release_device(struct device *dev)
  786. {
  787. struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
  788. struct mtk_iommu_data *data;
  789. struct device *larbdev;
  790. unsigned int larbid, i;
  791. unsigned long larbid_msk = 0;
  792. data = dev_iommu_priv_get(dev);
  793. if (!MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM))
  794. return;
  795. for (i = 0; i < fwspec->num_ids; i++) {
  796. larbid = MTK_M4U_TO_LARB(fwspec->ids[i]);
  797. larbid_msk |= BIT(larbid);
  798. }
  799. for_each_set_bit(larbid, &larbid_msk, 32) {
  800. larbdev = data->larb_imu[larbid].dev;
  801. device_link_remove(dev, larbdev);
  802. }
  803. }
  804. static int mtk_iommu_get_group_id(struct device *dev, const struct mtk_iommu_plat_data *plat_data)
  805. {
  806. unsigned int bankid;
  807. /*
  808. * If the bank function is enabled, each bank is a iommu group/domain.
  809. * Otherwise, each iova region is a iommu group/domain.
  810. */
  811. bankid = mtk_iommu_get_bank_id(dev, plat_data);
  812. if (bankid)
  813. return bankid;
  814. return mtk_iommu_get_iova_region_id(dev, plat_data);
  815. }
  816. static struct iommu_group *mtk_iommu_device_group(struct device *dev)
  817. {
  818. struct mtk_iommu_data *c_data = dev_iommu_priv_get(dev), *data;
  819. struct list_head *hw_list = c_data->hw_list;
  820. struct iommu_group *group;
  821. int groupid;
  822. data = mtk_iommu_get_frst_data(hw_list);
  823. if (!data)
  824. return ERR_PTR(-ENODEV);
  825. groupid = mtk_iommu_get_group_id(dev, data->plat_data);
  826. if (groupid < 0)
  827. return ERR_PTR(groupid);
  828. mutex_lock(&data->mutex);
  829. group = data->m4u_group[groupid];
  830. if (!group) {
  831. group = iommu_group_alloc();
  832. if (!IS_ERR(group))
  833. data->m4u_group[groupid] = group;
  834. } else {
  835. iommu_group_ref_get(group);
  836. }
  837. mutex_unlock(&data->mutex);
  838. return group;
  839. }
  840. static int mtk_iommu_of_xlate(struct device *dev,
  841. const struct of_phandle_args *args)
  842. {
  843. struct platform_device *m4updev;
  844. if (args->args_count != 1) {
  845. dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n",
  846. args->args_count);
  847. return -EINVAL;
  848. }
  849. if (!dev_iommu_priv_get(dev)) {
  850. /* Get the m4u device */
  851. m4updev = of_find_device_by_node(args->np);
  852. if (WARN_ON(!m4updev))
  853. return -EINVAL;
  854. dev_iommu_priv_set(dev, platform_get_drvdata(m4updev));
  855. put_device(&m4updev->dev);
  856. }
  857. return iommu_fwspec_add_ids(dev, args->args, 1);
  858. }
  859. static void mtk_iommu_get_resv_regions(struct device *dev,
  860. struct list_head *head)
  861. {
  862. struct mtk_iommu_data *data = dev_iommu_priv_get(dev);
  863. unsigned int regionid = mtk_iommu_get_iova_region_id(dev, data->plat_data), i;
  864. const struct mtk_iommu_iova_region *resv, *curdom;
  865. struct iommu_resv_region *region;
  866. int prot = IOMMU_WRITE | IOMMU_READ;
  867. if ((int)regionid < 0)
  868. return;
  869. curdom = data->plat_data->iova_region + regionid;
  870. for (i = 0; i < data->plat_data->iova_region_nr; i++) {
  871. resv = data->plat_data->iova_region + i;
  872. /* Only reserve when the region is inside the current domain */
  873. if (resv->iova_base <= curdom->iova_base ||
  874. resv->iova_base + resv->size >= curdom->iova_base + curdom->size)
  875. continue;
  876. region = iommu_alloc_resv_region(resv->iova_base, resv->size,
  877. prot, IOMMU_RESV_RESERVED,
  878. GFP_KERNEL);
  879. if (!region)
  880. return;
  881. list_add_tail(&region->list, head);
  882. }
  883. }
  884. static const struct iommu_ops mtk_iommu_ops = {
  885. .identity_domain = &mtk_iommu_identity_domain,
  886. .domain_alloc_paging = mtk_iommu_domain_alloc_paging,
  887. .probe_device = mtk_iommu_probe_device,
  888. .release_device = mtk_iommu_release_device,
  889. .device_group = mtk_iommu_device_group,
  890. .of_xlate = mtk_iommu_of_xlate,
  891. .get_resv_regions = mtk_iommu_get_resv_regions,
  892. .owner = THIS_MODULE,
  893. .default_domain_ops = &(const struct iommu_domain_ops) {
  894. .attach_dev = mtk_iommu_attach_device,
  895. .map_pages = mtk_iommu_map,
  896. .unmap_pages = mtk_iommu_unmap,
  897. .flush_iotlb_all = mtk_iommu_flush_iotlb_all,
  898. .iotlb_sync = mtk_iommu_iotlb_sync,
  899. .iotlb_sync_map = mtk_iommu_sync_map,
  900. .iova_to_phys = mtk_iommu_iova_to_phys,
  901. .free = mtk_iommu_domain_free,
  902. }
  903. };
  904. static int mtk_iommu_hw_init(const struct mtk_iommu_data *data, unsigned int bankid)
  905. {
  906. const struct mtk_iommu_bank_data *bankx = &data->bank[bankid];
  907. const struct mtk_iommu_bank_data *bank0 = &data->bank[0];
  908. u32 regval;
  909. /*
  910. * Global control settings are in bank0. May re-init these global registers
  911. * since no sure if there is bank0 consumers.
  912. */
  913. if (MTK_IOMMU_HAS_FLAG(data->plat_data, TF_PORT_TO_ADDR_MT8173)) {
  914. regval = F_MMU_PREFETCH_RT_REPLACE_MOD |
  915. F_MMU_TF_PROT_TO_PROGRAM_ADDR_MT8173;
  916. } else {
  917. regval = readl_relaxed(bank0->base + REG_MMU_CTRL_REG);
  918. regval |= F_MMU_TF_PROT_TO_PROGRAM_ADDR;
  919. }
  920. writel_relaxed(regval, bank0->base + REG_MMU_CTRL_REG);
  921. if (data->enable_4GB &&
  922. MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_VLD_PA_RNG)) {
  923. /*
  924. * If 4GB mode is enabled, the validate PA range is from
  925. * 0x1_0000_0000 to 0x1_ffff_ffff. here record bit[32:30].
  926. */
  927. regval = F_MMU_VLD_PA_RNG(7, 4);
  928. writel_relaxed(regval, bank0->base + REG_MMU_VLD_PA_RNG);
  929. }
  930. if (MTK_IOMMU_HAS_FLAG(data->plat_data, DCM_DISABLE))
  931. writel_relaxed(F_MMU_DCM, bank0->base + REG_MMU_DCM_DIS);
  932. else
  933. writel_relaxed(0, bank0->base + REG_MMU_DCM_DIS);
  934. if (MTK_IOMMU_HAS_FLAG(data->plat_data, WR_THROT_EN)) {
  935. /* write command throttling mode */
  936. regval = readl_relaxed(bank0->base + REG_MMU_WR_LEN_CTRL);
  937. regval &= ~F_MMU_WR_THROT_DIS_MASK;
  938. writel_relaxed(regval, bank0->base + REG_MMU_WR_LEN_CTRL);
  939. }
  940. if (MTK_IOMMU_HAS_FLAG(data->plat_data, RESET_AXI)) {
  941. /* The register is called STANDARD_AXI_MODE in this case */
  942. regval = 0;
  943. } else {
  944. regval = readl_relaxed(bank0->base + REG_MMU_MISC_CTRL);
  945. if (!MTK_IOMMU_HAS_FLAG(data->plat_data, STD_AXI_MODE))
  946. regval &= ~F_MMU_STANDARD_AXI_MODE_MASK;
  947. if (MTK_IOMMU_HAS_FLAG(data->plat_data, OUT_ORDER_WR_EN))
  948. regval &= ~F_MMU_IN_ORDER_WR_EN_MASK;
  949. }
  950. writel_relaxed(regval, bank0->base + REG_MMU_MISC_CTRL);
  951. /* Independent settings for each bank */
  952. regval = F_L2_MULIT_HIT_EN |
  953. F_TABLE_WALK_FAULT_INT_EN |
  954. F_PREETCH_FIFO_OVERFLOW_INT_EN |
  955. F_MISS_FIFO_OVERFLOW_INT_EN |
  956. F_PREFETCH_FIFO_ERR_INT_EN |
  957. F_MISS_FIFO_ERR_INT_EN;
  958. writel_relaxed(regval, bankx->base + REG_MMU_INT_CONTROL0);
  959. regval = F_INT_TRANSLATION_FAULT |
  960. F_INT_MAIN_MULTI_HIT_FAULT |
  961. F_INT_INVALID_PA_FAULT |
  962. F_INT_ENTRY_REPLACEMENT_FAULT |
  963. F_INT_TLB_MISS_FAULT |
  964. F_INT_MISS_TRANSACTION_FIFO_FAULT |
  965. F_INT_PRETETCH_TRANSATION_FIFO_FAULT;
  966. writel_relaxed(regval, bankx->base + REG_MMU_INT_MAIN_CONTROL);
  967. if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_LEGACY_IVRP_PADDR))
  968. regval = (data->protect_base >> 1) | (data->enable_4GB << 31);
  969. else
  970. regval = lower_32_bits(data->protect_base) |
  971. upper_32_bits(data->protect_base);
  972. writel_relaxed(regval, bankx->base + REG_MMU_IVRP_PADDR);
  973. if (devm_request_irq(bankx->parent_dev, bankx->irq, mtk_iommu_isr, 0,
  974. dev_name(bankx->parent_dev), (void *)bankx)) {
  975. writel_relaxed(0, bankx->base + REG_MMU_PT_BASE_ADDR);
  976. dev_err(bankx->parent_dev, "Failed @ IRQ-%d Request\n", bankx->irq);
  977. return -ENODEV;
  978. }
  979. return 0;
  980. }
  981. static const struct component_master_ops mtk_iommu_com_ops = {
  982. .bind = mtk_iommu_bind,
  983. .unbind = mtk_iommu_unbind,
  984. };
  985. static int mtk_iommu_mm_dts_parse(struct device *dev, struct component_match **match,
  986. struct mtk_iommu_data *data)
  987. {
  988. struct device_node *larbnode, *frst_avail_smicomm_node = NULL;
  989. struct platform_device *plarbdev, *pcommdev;
  990. struct device_link *link;
  991. int i, larb_nr, ret;
  992. larb_nr = of_count_phandle_with_args(dev->of_node, "mediatek,larbs", NULL);
  993. if (larb_nr < 0)
  994. return larb_nr;
  995. if (larb_nr == 0 || larb_nr > MTK_LARB_NR_MAX)
  996. return -EINVAL;
  997. for (i = 0; i < larb_nr; i++) {
  998. struct device_node *smicomm_node, *smi_subcomm_node;
  999. u32 id;
  1000. larbnode = of_parse_phandle(dev->of_node, "mediatek,larbs", i);
  1001. if (!larbnode) {
  1002. ret = -EINVAL;
  1003. goto err_larbdev_put;
  1004. }
  1005. if (!of_device_is_available(larbnode)) {
  1006. of_node_put(larbnode);
  1007. continue;
  1008. }
  1009. ret = of_property_read_u32(larbnode, "mediatek,larb-id", &id);
  1010. if (ret)/* The id is consecutive if there is no this property */
  1011. id = i;
  1012. if (id >= MTK_LARB_NR_MAX) {
  1013. of_node_put(larbnode);
  1014. ret = -EINVAL;
  1015. goto err_larbdev_put;
  1016. }
  1017. plarbdev = of_find_device_by_node(larbnode);
  1018. of_node_put(larbnode);
  1019. if (!plarbdev) {
  1020. ret = -ENODEV;
  1021. goto err_larbdev_put;
  1022. }
  1023. if (data->larb_imu[id].dev) {
  1024. platform_device_put(plarbdev);
  1025. ret = -EEXIST;
  1026. goto err_larbdev_put;
  1027. }
  1028. data->larb_imu[id].dev = &plarbdev->dev;
  1029. if (!plarbdev->dev.driver) {
  1030. ret = -EPROBE_DEFER;
  1031. goto err_larbdev_put;
  1032. }
  1033. /* Get smi-(sub)-common dev from the last larb. */
  1034. smi_subcomm_node = of_parse_phandle(larbnode, "mediatek,smi", 0);
  1035. if (!smi_subcomm_node) {
  1036. ret = -EINVAL;
  1037. goto err_larbdev_put;
  1038. }
  1039. /*
  1040. * It may have two level smi-common. the node is smi-sub-common if it
  1041. * has a new mediatek,smi property. otherwise it is smi-commmon.
  1042. */
  1043. smicomm_node = of_parse_phandle(smi_subcomm_node, "mediatek,smi", 0);
  1044. if (smicomm_node)
  1045. of_node_put(smi_subcomm_node);
  1046. else
  1047. smicomm_node = smi_subcomm_node;
  1048. /*
  1049. * All the larbs that connect to one IOMMU must connect with the same
  1050. * smi-common.
  1051. */
  1052. if (!frst_avail_smicomm_node) {
  1053. frst_avail_smicomm_node = smicomm_node;
  1054. } else if (frst_avail_smicomm_node != smicomm_node) {
  1055. dev_err(dev, "mediatek,smi property is not right @larb%d.", id);
  1056. of_node_put(smicomm_node);
  1057. ret = -EINVAL;
  1058. goto err_larbdev_put;
  1059. } else {
  1060. of_node_put(smicomm_node);
  1061. }
  1062. component_match_add(dev, match, component_compare_dev, &plarbdev->dev);
  1063. }
  1064. if (!frst_avail_smicomm_node) {
  1065. ret = -EINVAL;
  1066. goto err_larbdev_put;
  1067. }
  1068. pcommdev = of_find_device_by_node(frst_avail_smicomm_node);
  1069. of_node_put(frst_avail_smicomm_node);
  1070. if (!pcommdev) {
  1071. ret = -ENODEV;
  1072. goto err_larbdev_put;
  1073. }
  1074. data->smicomm_dev = &pcommdev->dev;
  1075. link = device_link_add(data->smicomm_dev, dev,
  1076. DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME);
  1077. platform_device_put(pcommdev);
  1078. if (!link) {
  1079. dev_err(dev, "Unable to link %s.\n", dev_name(data->smicomm_dev));
  1080. ret = -EINVAL;
  1081. goto err_larbdev_put;
  1082. }
  1083. return 0;
  1084. err_larbdev_put:
  1085. /* id mapping may not be linear, loop the whole array */
  1086. for (i = 0; i < MTK_LARB_NR_MAX; i++)
  1087. put_device(data->larb_imu[i].dev);
  1088. return ret;
  1089. }
  1090. static int mtk_iommu_probe(struct platform_device *pdev)
  1091. {
  1092. struct mtk_iommu_data *data;
  1093. struct device *dev = &pdev->dev;
  1094. struct resource *res;
  1095. resource_size_t ioaddr;
  1096. struct component_match *match = NULL;
  1097. struct regmap *infracfg;
  1098. void *protect;
  1099. int ret, banks_num, i = 0;
  1100. u32 val;
  1101. char *p;
  1102. struct mtk_iommu_bank_data *bank;
  1103. void __iomem *base;
  1104. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  1105. if (!data)
  1106. return -ENOMEM;
  1107. data->dev = dev;
  1108. data->plat_data = of_device_get_match_data(dev);
  1109. /* Protect memory. HW will access here while translation fault.*/
  1110. protect = devm_kcalloc(dev, 2, MTK_PROTECT_PA_ALIGN, GFP_KERNEL);
  1111. if (!protect)
  1112. return -ENOMEM;
  1113. data->protect_base = ALIGN(virt_to_phys(protect), MTK_PROTECT_PA_ALIGN);
  1114. if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_4GB_MODE)) {
  1115. infracfg = syscon_regmap_lookup_by_phandle(dev->of_node, "mediatek,infracfg");
  1116. if (IS_ERR(infracfg)) {
  1117. /*
  1118. * Legacy devicetrees will not specify a phandle to
  1119. * mediatek,infracfg: in that case, we use the older
  1120. * way to retrieve a syscon to infra.
  1121. *
  1122. * This is for retrocompatibility purposes only, hence
  1123. * no more compatibles shall be added to this.
  1124. */
  1125. switch (data->plat_data->m4u_plat) {
  1126. case M4U_MT2712:
  1127. p = "mediatek,mt2712-infracfg";
  1128. break;
  1129. case M4U_MT8173:
  1130. p = "mediatek,mt8173-infracfg";
  1131. break;
  1132. default:
  1133. p = NULL;
  1134. }
  1135. infracfg = syscon_regmap_lookup_by_compatible(p);
  1136. if (IS_ERR(infracfg))
  1137. return PTR_ERR(infracfg);
  1138. }
  1139. ret = regmap_read(infracfg, REG_INFRA_MISC, &val);
  1140. if (ret)
  1141. return ret;
  1142. data->enable_4GB = !!(val & F_DDR_4GB_SUPPORT_EN);
  1143. }
  1144. banks_num = data->plat_data->banks_num;
  1145. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1146. if (!res)
  1147. return -EINVAL;
  1148. if (resource_size(res) < banks_num * MTK_IOMMU_BANK_SZ) {
  1149. dev_err(dev, "banknr %d. res %pR is not enough.\n", banks_num, res);
  1150. return -EINVAL;
  1151. }
  1152. base = devm_ioremap_resource(dev, res);
  1153. if (IS_ERR(base))
  1154. return PTR_ERR(base);
  1155. ioaddr = res->start;
  1156. data->bank = devm_kmalloc(dev, banks_num * sizeof(*data->bank), GFP_KERNEL);
  1157. if (!data->bank)
  1158. return -ENOMEM;
  1159. do {
  1160. if (!data->plat_data->banks_enable[i])
  1161. continue;
  1162. bank = &data->bank[i];
  1163. bank->id = i;
  1164. bank->base = base + i * MTK_IOMMU_BANK_SZ;
  1165. bank->m4u_dom = NULL;
  1166. bank->irq = platform_get_irq(pdev, i);
  1167. if (bank->irq < 0)
  1168. return bank->irq;
  1169. bank->parent_dev = dev;
  1170. bank->parent_data = data;
  1171. spin_lock_init(&bank->tlb_lock);
  1172. } while (++i < banks_num);
  1173. if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_BCLK)) {
  1174. data->bclk = devm_clk_get(dev, "bclk");
  1175. if (IS_ERR(data->bclk))
  1176. return PTR_ERR(data->bclk);
  1177. }
  1178. if (MTK_IOMMU_HAS_FLAG(data->plat_data, PGTABLE_PA_35_EN)) {
  1179. ret = dma_set_mask(dev, DMA_BIT_MASK(35));
  1180. if (ret) {
  1181. dev_err(dev, "Failed to set dma_mask 35.\n");
  1182. return ret;
  1183. }
  1184. }
  1185. pm_runtime_enable(dev);
  1186. if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
  1187. ret = mtk_iommu_mm_dts_parse(dev, &match, data);
  1188. if (ret) {
  1189. dev_err_probe(dev, ret, "mm dts parse fail\n");
  1190. goto out_runtime_disable;
  1191. }
  1192. } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA) &&
  1193. !MTK_IOMMU_HAS_FLAG(data->plat_data, CFG_IFA_MASTER_IN_ATF)) {
  1194. p = data->plat_data->pericfg_comp_str;
  1195. data->pericfg = syscon_regmap_lookup_by_compatible(p);
  1196. if (IS_ERR(data->pericfg)) {
  1197. ret = PTR_ERR(data->pericfg);
  1198. goto out_runtime_disable;
  1199. }
  1200. }
  1201. platform_set_drvdata(pdev, data);
  1202. mutex_init(&data->mutex);
  1203. if (MTK_IOMMU_HAS_FLAG(data->plat_data, SHARE_PGTABLE)) {
  1204. list_add_tail(&data->list, data->plat_data->hw_list);
  1205. data->hw_list = data->plat_data->hw_list;
  1206. } else {
  1207. INIT_LIST_HEAD(&data->hw_list_head);
  1208. list_add_tail(&data->list, &data->hw_list_head);
  1209. data->hw_list = &data->hw_list_head;
  1210. }
  1211. ret = iommu_device_sysfs_add(&data->iommu, dev, NULL,
  1212. "mtk-iommu.%pa", &ioaddr);
  1213. if (ret)
  1214. goto out_list_del;
  1215. ret = iommu_device_register(&data->iommu, &mtk_iommu_ops, dev);
  1216. if (ret)
  1217. goto out_sysfs_remove;
  1218. if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
  1219. ret = component_master_add_with_match(dev, &mtk_iommu_com_ops, match);
  1220. if (ret)
  1221. goto out_device_unregister;
  1222. }
  1223. return ret;
  1224. out_device_unregister:
  1225. iommu_device_unregister(&data->iommu);
  1226. out_sysfs_remove:
  1227. iommu_device_sysfs_remove(&data->iommu);
  1228. out_list_del:
  1229. list_del(&data->list);
  1230. if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
  1231. device_link_remove(data->smicomm_dev, dev);
  1232. for (i = 0; i < MTK_LARB_NR_MAX; i++)
  1233. put_device(data->larb_imu[i].dev);
  1234. }
  1235. out_runtime_disable:
  1236. pm_runtime_disable(dev);
  1237. return ret;
  1238. }
  1239. static void mtk_iommu_remove(struct platform_device *pdev)
  1240. {
  1241. struct mtk_iommu_data *data = platform_get_drvdata(pdev);
  1242. struct mtk_iommu_bank_data *bank;
  1243. int i;
  1244. iommu_device_sysfs_remove(&data->iommu);
  1245. iommu_device_unregister(&data->iommu);
  1246. list_del(&data->list);
  1247. if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
  1248. device_link_remove(data->smicomm_dev, &pdev->dev);
  1249. component_master_del(&pdev->dev, &mtk_iommu_com_ops);
  1250. for (i = 0; i < MTK_LARB_NR_MAX; i++)
  1251. put_device(data->larb_imu[i].dev);
  1252. }
  1253. pm_runtime_disable(&pdev->dev);
  1254. for (i = 0; i < data->plat_data->banks_num; i++) {
  1255. bank = &data->bank[i];
  1256. if (!bank->m4u_dom)
  1257. continue;
  1258. devm_free_irq(&pdev->dev, bank->irq, bank);
  1259. }
  1260. }
  1261. static int __maybe_unused mtk_iommu_runtime_suspend(struct device *dev)
  1262. {
  1263. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  1264. struct mtk_iommu_suspend_reg *reg = &data->reg;
  1265. void __iomem *base;
  1266. int i = 0;
  1267. base = data->bank[i].base;
  1268. reg->wr_len_ctrl = readl_relaxed(base + REG_MMU_WR_LEN_CTRL);
  1269. reg->misc_ctrl = readl_relaxed(base + REG_MMU_MISC_CTRL);
  1270. reg->dcm_dis = readl_relaxed(base + REG_MMU_DCM_DIS);
  1271. reg->ctrl_reg = readl_relaxed(base + REG_MMU_CTRL_REG);
  1272. reg->vld_pa_rng = readl_relaxed(base + REG_MMU_VLD_PA_RNG);
  1273. do {
  1274. if (!data->plat_data->banks_enable[i])
  1275. continue;
  1276. base = data->bank[i].base;
  1277. reg->int_control[i] = readl_relaxed(base + REG_MMU_INT_CONTROL0);
  1278. reg->int_main_control[i] = readl_relaxed(base + REG_MMU_INT_MAIN_CONTROL);
  1279. reg->ivrp_paddr[i] = readl_relaxed(base + REG_MMU_IVRP_PADDR);
  1280. } while (++i < data->plat_data->banks_num);
  1281. clk_disable_unprepare(data->bclk);
  1282. return 0;
  1283. }
  1284. static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
  1285. {
  1286. struct mtk_iommu_data *data = dev_get_drvdata(dev);
  1287. struct mtk_iommu_suspend_reg *reg = &data->reg;
  1288. struct mtk_iommu_domain *m4u_dom;
  1289. void __iomem *base;
  1290. int ret, i = 0;
  1291. ret = clk_prepare_enable(data->bclk);
  1292. if (ret) {
  1293. dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret);
  1294. return ret;
  1295. }
  1296. /*
  1297. * Uppon first resume, only enable the clk and return, since the values of the
  1298. * registers are not yet set.
  1299. */
  1300. if (!reg->wr_len_ctrl)
  1301. return 0;
  1302. base = data->bank[i].base;
  1303. writel_relaxed(reg->wr_len_ctrl, base + REG_MMU_WR_LEN_CTRL);
  1304. writel_relaxed(reg->misc_ctrl, base + REG_MMU_MISC_CTRL);
  1305. writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS);
  1306. writel_relaxed(reg->ctrl_reg, base + REG_MMU_CTRL_REG);
  1307. writel_relaxed(reg->vld_pa_rng, base + REG_MMU_VLD_PA_RNG);
  1308. do {
  1309. m4u_dom = data->bank[i].m4u_dom;
  1310. if (!data->plat_data->banks_enable[i] || !m4u_dom)
  1311. continue;
  1312. base = data->bank[i].base;
  1313. writel_relaxed(reg->int_control[i], base + REG_MMU_INT_CONTROL0);
  1314. writel_relaxed(reg->int_main_control[i], base + REG_MMU_INT_MAIN_CONTROL);
  1315. writel_relaxed(reg->ivrp_paddr[i], base + REG_MMU_IVRP_PADDR);
  1316. writel(m4u_dom->cfg.arm_v7s_cfg.ttbr, base + REG_MMU_PT_BASE_ADDR);
  1317. } while (++i < data->plat_data->banks_num);
  1318. /*
  1319. * Users may allocate dma buffer before they call pm_runtime_get,
  1320. * in which case it will lack the necessary tlb flush.
  1321. * Thus, make sure to update the tlb after each PM resume.
  1322. */
  1323. mtk_iommu_tlb_flush_all(data);
  1324. return 0;
  1325. }
  1326. static const struct dev_pm_ops mtk_iommu_pm_ops = {
  1327. SET_RUNTIME_PM_OPS(mtk_iommu_runtime_suspend, mtk_iommu_runtime_resume, NULL)
  1328. SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
  1329. pm_runtime_force_resume)
  1330. };
  1331. static const struct mtk_iommu_plat_data mt2712_data = {
  1332. .m4u_plat = M4U_MT2712,
  1333. .flags = HAS_4GB_MODE | HAS_BCLK | HAS_VLD_PA_RNG | SHARE_PGTABLE |
  1334. MTK_IOMMU_TYPE_MM,
  1335. .hw_list = &m4ulist,
  1336. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1337. .iova_region = single_domain,
  1338. .banks_num = 1,
  1339. .banks_enable = {true},
  1340. .iova_region_nr = ARRAY_SIZE(single_domain),
  1341. .larbid_remap = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}},
  1342. };
  1343. static const struct mtk_iommu_plat_data mt6779_data = {
  1344. .m4u_plat = M4U_MT6779,
  1345. .flags = HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN | WR_THROT_EN |
  1346. MTK_IOMMU_TYPE_MM | PGTABLE_PA_35_EN,
  1347. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1348. .banks_num = 1,
  1349. .banks_enable = {true},
  1350. .iova_region = single_domain,
  1351. .iova_region_nr = ARRAY_SIZE(single_domain),
  1352. .larbid_remap = {{0}, {1}, {2}, {3}, {5}, {7, 8}, {10}, {9}},
  1353. };
  1354. static const struct mtk_iommu_plat_data mt6795_data = {
  1355. .m4u_plat = M4U_MT6795,
  1356. .flags = HAS_4GB_MODE | HAS_BCLK | RESET_AXI |
  1357. HAS_LEGACY_IVRP_PADDR | MTK_IOMMU_TYPE_MM |
  1358. TF_PORT_TO_ADDR_MT8173,
  1359. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1360. .banks_num = 1,
  1361. .banks_enable = {true},
  1362. .iova_region = single_domain,
  1363. .iova_region_nr = ARRAY_SIZE(single_domain),
  1364. .larbid_remap = {{0}, {1}, {2}, {3}, {4}}, /* Linear mapping. */
  1365. };
  1366. static const unsigned int mt8192_larb_region_msk[MT8192_MULTI_REGION_NR_MAX][MTK_LARB_NR_MAX] = {
  1367. [0] = {~0, ~0}, /* Region0: larb0/1 */
  1368. [1] = {0, 0, 0, 0, ~0, ~0, 0, ~0}, /* Region1: larb4/5/7 */
  1369. [2] = {0, 0, ~0, 0, 0, 0, 0, 0, /* Region2: larb2/9/11/13/14/16/17/18/19/20 */
  1370. 0, ~0, 0, ~0, 0, ~(u32)(BIT(9) | BIT(10)), ~(u32)(BIT(4) | BIT(5)), 0,
  1371. ~0, ~0, ~0, ~0, ~0},
  1372. [3] = {0},
  1373. [4] = {[13] = BIT(9) | BIT(10)}, /* larb13 port9/10 */
  1374. [5] = {[14] = BIT(4) | BIT(5)}, /* larb14 port4/5 */
  1375. };
  1376. static const struct mtk_iommu_plat_data mt6893_data = {
  1377. .m4u_plat = M4U_MT8192,
  1378. .flags = HAS_BCLK | OUT_ORDER_WR_EN | HAS_SUB_COMM_2BITS |
  1379. WR_THROT_EN | IOVA_34_EN | SHARE_PGTABLE | MTK_IOMMU_TYPE_MM,
  1380. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1381. .banks_num = 1,
  1382. .banks_enable = {true},
  1383. .iova_region = mt8192_multi_dom,
  1384. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1385. .iova_region_larb_msk = mt8192_larb_region_msk,
  1386. .larbid_remap = {{0}, {1}, {4, 5}, {7}, {2}, {9, 11, 19, 20},
  1387. {0, 14, 16}, {0, 13, 18, 17}},
  1388. };
  1389. static const struct mtk_iommu_plat_data mt8167_data = {
  1390. .m4u_plat = M4U_MT8167,
  1391. .flags = RESET_AXI | HAS_LEGACY_IVRP_PADDR | MTK_IOMMU_TYPE_MM,
  1392. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1393. .banks_num = 1,
  1394. .banks_enable = {true},
  1395. .iova_region = single_domain,
  1396. .iova_region_nr = ARRAY_SIZE(single_domain),
  1397. .larbid_remap = {{0}, {1}, {2}}, /* Linear mapping. */
  1398. };
  1399. static const struct mtk_iommu_plat_data mt8173_data = {
  1400. .m4u_plat = M4U_MT8173,
  1401. .flags = HAS_4GB_MODE | HAS_BCLK | RESET_AXI |
  1402. HAS_LEGACY_IVRP_PADDR | MTK_IOMMU_TYPE_MM |
  1403. TF_PORT_TO_ADDR_MT8173,
  1404. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1405. .banks_num = 1,
  1406. .banks_enable = {true},
  1407. .iova_region = single_domain,
  1408. .iova_region_nr = ARRAY_SIZE(single_domain),
  1409. .larbid_remap = {{0}, {1}, {2}, {3}, {4}, {5}}, /* Linear mapping. */
  1410. };
  1411. static const struct mtk_iommu_plat_data mt8183_data = {
  1412. .m4u_plat = M4U_MT8183,
  1413. .flags = RESET_AXI | MTK_IOMMU_TYPE_MM,
  1414. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1415. .banks_num = 1,
  1416. .banks_enable = {true},
  1417. .iova_region = single_domain,
  1418. .iova_region_nr = ARRAY_SIZE(single_domain),
  1419. .larbid_remap = {{0}, {4}, {5}, {6}, {7}, {2}, {3}, {1}},
  1420. };
  1421. static const unsigned int mt8186_larb_region_msk[MT8192_MULTI_REGION_NR_MAX][MTK_LARB_NR_MAX] = {
  1422. [0] = {~0, ~0, ~0}, /* Region0: all ports for larb0/1/2 */
  1423. [1] = {0, 0, 0, 0, ~0, 0, 0, ~0}, /* Region1: larb4/7 */
  1424. [2] = {0, 0, 0, 0, 0, 0, 0, 0, /* Region2: larb8/9/11/13/16/17/19/20 */
  1425. ~0, ~0, 0, ~0, 0, ~(u32)(BIT(9) | BIT(10)), 0, 0,
  1426. /* larb13: the other ports except port9/10 */
  1427. ~0, ~0, 0, ~0, ~0},
  1428. [3] = {0},
  1429. [4] = {[13] = BIT(9) | BIT(10)}, /* larb13 port9/10 */
  1430. [5] = {[14] = ~0}, /* larb14 */
  1431. };
  1432. static const struct mtk_iommu_plat_data mt8186_data_mm = {
  1433. .m4u_plat = M4U_MT8186,
  1434. .flags = HAS_BCLK | HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN |
  1435. WR_THROT_EN | IOVA_34_EN | MTK_IOMMU_TYPE_MM | PGTABLE_PA_35_EN,
  1436. .larbid_remap = {{0}, {1, MTK_INVALID_LARBID, 8}, {4}, {7}, {2}, {9, 11, 19, 20},
  1437. {MTK_INVALID_LARBID, 14, 16},
  1438. {MTK_INVALID_LARBID, 13, MTK_INVALID_LARBID, 17}},
  1439. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1440. .banks_num = 1,
  1441. .banks_enable = {true},
  1442. .iova_region = mt8192_multi_dom,
  1443. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1444. .iova_region_larb_msk = mt8186_larb_region_msk,
  1445. };
  1446. static const struct mtk_iommu_plat_data mt8188_data_infra = {
  1447. .m4u_plat = M4U_MT8188,
  1448. .flags = WR_THROT_EN | DCM_DISABLE | STD_AXI_MODE | PM_CLK_AO |
  1449. MTK_IOMMU_TYPE_INFRA | IFA_IOMMU_PCIE_SUPPORT |
  1450. PGTABLE_PA_35_EN | CFG_IFA_MASTER_IN_ATF,
  1451. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1452. .banks_num = 1,
  1453. .banks_enable = {true},
  1454. .iova_region = single_domain,
  1455. .iova_region_nr = ARRAY_SIZE(single_domain),
  1456. };
  1457. static const u32 mt8188_larb_region_msk[MT8192_MULTI_REGION_NR_MAX][MTK_LARB_NR_MAX] = {
  1458. [0] = {~0, ~0, ~0, ~0}, /* Region0: all ports for larb0/1/2/3 */
  1459. [1] = {0, 0, 0, 0, 0, 0, 0, 0,
  1460. 0, 0, 0, 0, 0, 0, 0, 0,
  1461. 0, 0, 0, 0, 0, ~0, ~0, ~0}, /* Region1: larb19(21)/21(22)/23 */
  1462. [2] = {0, 0, 0, 0, ~0, ~0, ~0, ~0, /* Region2: the other larbs. */
  1463. ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0,
  1464. ~0, ~0, ~0, ~0, ~0, 0, 0, 0,
  1465. 0, ~0},
  1466. [3] = {0},
  1467. [4] = {[24] = BIT(0) | BIT(1)}, /* Only larb27(24) port0/1 */
  1468. [5] = {[24] = BIT(2) | BIT(3)}, /* Only larb27(24) port2/3 */
  1469. };
  1470. static const struct mtk_iommu_plat_data mt8188_data_vdo = {
  1471. .m4u_plat = M4U_MT8188,
  1472. .flags = HAS_BCLK | HAS_SUB_COMM_3BITS | OUT_ORDER_WR_EN |
  1473. WR_THROT_EN | IOVA_34_EN | SHARE_PGTABLE |
  1474. PGTABLE_PA_35_EN | MTK_IOMMU_TYPE_MM,
  1475. .hw_list = &m4ulist,
  1476. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1477. .banks_num = 1,
  1478. .banks_enable = {true},
  1479. .iova_region = mt8192_multi_dom,
  1480. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1481. .iova_region_larb_msk = mt8188_larb_region_msk,
  1482. .larbid_remap = {{2}, {0}, {21}, {0}, {19}, {9, 10,
  1483. 11 /* 11a */, 25 /* 11c */},
  1484. {13, 0, 29 /* 16b */, 30 /* 17b */, 0}, {5}},
  1485. };
  1486. static const struct mtk_iommu_plat_data mt8188_data_vpp = {
  1487. .m4u_plat = M4U_MT8188,
  1488. .flags = HAS_BCLK | HAS_SUB_COMM_3BITS | OUT_ORDER_WR_EN |
  1489. WR_THROT_EN | IOVA_34_EN | SHARE_PGTABLE |
  1490. PGTABLE_PA_35_EN | MTK_IOMMU_TYPE_MM,
  1491. .hw_list = &m4ulist,
  1492. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1493. .banks_num = 1,
  1494. .banks_enable = {true},
  1495. .iova_region = mt8192_multi_dom,
  1496. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1497. .iova_region_larb_msk = mt8188_larb_region_msk,
  1498. .larbid_remap = {{1}, {3}, {23}, {7}, {MTK_INVALID_LARBID},
  1499. {12, 15, 24 /* 11b */}, {14, MTK_INVALID_LARBID,
  1500. 16 /* 16a */, 17 /* 17a */, MTK_INVALID_LARBID,
  1501. 27, 28 /* ccu0 */, MTK_INVALID_LARBID}, {4, 6}},
  1502. };
  1503. static const unsigned int mt8189_apu_region_msk[][MTK_LARB_NR_MAX] = {
  1504. [0] = {[0] = BIT(2)}, /* Region0: fake larb 0 APU_SECURE */
  1505. [1] = {[0] = BIT(1)}, /* Region1: fake larb 0 APU_CODE */
  1506. [2] = {[0] = BIT(3)}, /* Region2: fake larb 0 APU_VLM */
  1507. [3] = {[0] = BIT(0)}, /* Region3: fake larb 0 APU_DATA */
  1508. };
  1509. static const struct mtk_iommu_plat_data mt8189_data_apu = {
  1510. .m4u_plat = M4U_MT8189,
  1511. .flags = IOVA_34_EN | DCM_DISABLE |
  1512. MTK_IOMMU_TYPE_APU | PGTABLE_PA_35_EN,
  1513. .hw_list = &apulist,
  1514. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1515. .banks_num = 1,
  1516. .banks_enable = {true},
  1517. .iova_region = mt8189_multi_dom_apu,
  1518. .iova_region_nr = ARRAY_SIZE(mt8189_multi_dom_apu),
  1519. .larbid_remap = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}},
  1520. .iova_region_larb_msk = mt8189_apu_region_msk,
  1521. };
  1522. static const struct mtk_iommu_plat_data mt8189_data_infra = {
  1523. .m4u_plat = M4U_MT8189,
  1524. .flags = WR_THROT_EN | DCM_DISABLE | MTK_IOMMU_TYPE_INFRA |
  1525. CFG_IFA_MASTER_IN_ATF | SHARE_PGTABLE | PGTABLE_PA_35_EN,
  1526. .hw_list = &infralist,
  1527. .banks_num = 1,
  1528. .banks_enable = {true},
  1529. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1530. .iova_region = single_domain,
  1531. .iova_region_nr = ARRAY_SIZE(single_domain),
  1532. };
  1533. static const u32 mt8189_larb_region_msk[MT8192_MULTI_REGION_NR_MAX][MTK_LARB_NR_MAX] = {
  1534. [0] = {~0, ~0, ~0, [22] = BIT(0)}, /* Region0: all ports for larb0/1/2 */
  1535. [1] = {[3] = ~0, [4] = ~0}, /* Region1: all ports for larb4(3)/7(4) */
  1536. [2] = {[5] = ~0, [6] = ~0, /* Region2: all ports for larb9(5)/11(6) */
  1537. [7] = ~0, [8] = ~0, /* Region2: all ports for larb13(7)/14(8) */
  1538. [9] = ~0, [10] = ~0, /* Region2: all ports for larb16(9)/17(10) */
  1539. [11] = ~0, [12] = ~0, /* Region2: all ports for larb19(11)/20(12) */
  1540. [21] = ~0}, /* Region2: larb21 fake GCE larb */
  1541. };
  1542. static const struct mtk_iommu_plat_data mt8189_data_mm = {
  1543. .m4u_plat = M4U_MT8189,
  1544. .flags = HAS_BCLK | HAS_SUB_COMM_3BITS | OUT_ORDER_WR_EN |
  1545. WR_THROT_EN | IOVA_34_EN | MTK_IOMMU_TYPE_MM |
  1546. PGTABLE_PA_35_EN | DL_WITH_MULTI_LARB,
  1547. .hw_list = &m4ulist,
  1548. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1549. .banks_num = 5,
  1550. .banks_enable = {true, false, false, false, false},
  1551. .iova_region = mt8192_multi_dom,
  1552. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1553. .iova_region_larb_msk = mt8189_larb_region_msk,
  1554. .larbid_remap = {{0}, {1}, {21/* GCE_D */, 21/* GCE_M */, 2},
  1555. {19, 20, 9, 11}, {7}, {4},
  1556. {13, 17}, {14, 16}},
  1557. };
  1558. static const struct mtk_iommu_plat_data mt8192_data = {
  1559. .m4u_plat = M4U_MT8192,
  1560. .flags = HAS_BCLK | HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN |
  1561. WR_THROT_EN | IOVA_34_EN | MTK_IOMMU_TYPE_MM,
  1562. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1563. .banks_num = 1,
  1564. .banks_enable = {true},
  1565. .iova_region = mt8192_multi_dom,
  1566. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1567. .iova_region_larb_msk = mt8192_larb_region_msk,
  1568. .larbid_remap = {{0}, {1}, {4, 5}, {7}, {2}, {9, 11, 19, 20},
  1569. {0, 14, 16}, {0, 13, 18, 17}},
  1570. };
  1571. static const struct mtk_iommu_plat_data mt8195_data_infra = {
  1572. .m4u_plat = M4U_MT8195,
  1573. .flags = WR_THROT_EN | DCM_DISABLE | STD_AXI_MODE | PM_CLK_AO |
  1574. MTK_IOMMU_TYPE_INFRA | IFA_IOMMU_PCIE_SUPPORT,
  1575. .pericfg_comp_str = "mediatek,mt8195-pericfg_ao",
  1576. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1577. .banks_num = 5,
  1578. .banks_enable = {true, false, false, false, true},
  1579. .banks_portmsk = {[0] = GENMASK(19, 16), /* PCIe */
  1580. [4] = GENMASK(31, 20), /* USB */
  1581. },
  1582. .iova_region = single_domain,
  1583. .iova_region_nr = ARRAY_SIZE(single_domain),
  1584. };
  1585. static const unsigned int mt8195_larb_region_msk[MT8192_MULTI_REGION_NR_MAX][MTK_LARB_NR_MAX] = {
  1586. [0] = {~0, ~0, ~0, ~0}, /* Region0: all ports for larb0/1/2/3 */
  1587. [1] = {0, 0, 0, 0, 0, 0, 0, 0,
  1588. 0, 0, 0, 0, 0, 0, 0, 0,
  1589. 0, 0, 0, ~0, ~0, ~0, ~0, ~0, /* Region1: larb19/20/21/22/23/24 */
  1590. ~0},
  1591. [2] = {0, 0, 0, 0, ~0, ~0, ~0, ~0, /* Region2: the other larbs. */
  1592. ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0,
  1593. ~0, ~0, 0, 0, 0, 0, 0, 0,
  1594. 0, ~0, ~0, ~0, ~0},
  1595. [3] = {0},
  1596. [4] = {[18] = BIT(0) | BIT(1)}, /* Only larb18 port0/1 */
  1597. [5] = {[18] = BIT(2) | BIT(3)}, /* Only larb18 port2/3 */
  1598. };
  1599. static const struct mtk_iommu_plat_data mt8195_data_vdo = {
  1600. .m4u_plat = M4U_MT8195,
  1601. .flags = HAS_BCLK | HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN |
  1602. WR_THROT_EN | IOVA_34_EN | SHARE_PGTABLE | MTK_IOMMU_TYPE_MM,
  1603. .hw_list = &m4ulist,
  1604. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1605. .banks_num = 1,
  1606. .banks_enable = {true},
  1607. .iova_region = mt8192_multi_dom,
  1608. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1609. .iova_region_larb_msk = mt8195_larb_region_msk,
  1610. .larbid_remap = {{2, 0}, {21}, {24}, {7}, {19}, {9, 10, 11},
  1611. {13, 17, 15/* 17b */, 25}, {5}},
  1612. };
  1613. static const struct mtk_iommu_plat_data mt8195_data_vpp = {
  1614. .m4u_plat = M4U_MT8195,
  1615. .flags = HAS_BCLK | HAS_SUB_COMM_3BITS | OUT_ORDER_WR_EN |
  1616. WR_THROT_EN | IOVA_34_EN | SHARE_PGTABLE | MTK_IOMMU_TYPE_MM,
  1617. .hw_list = &m4ulist,
  1618. .inv_sel_reg = REG_MMU_INV_SEL_GEN2,
  1619. .banks_num = 1,
  1620. .banks_enable = {true},
  1621. .iova_region = mt8192_multi_dom,
  1622. .iova_region_nr = ARRAY_SIZE(mt8192_multi_dom),
  1623. .iova_region_larb_msk = mt8195_larb_region_msk,
  1624. .larbid_remap = {{1}, {3},
  1625. {22, MTK_INVALID_LARBID, MTK_INVALID_LARBID, MTK_INVALID_LARBID, 23},
  1626. {8}, {20}, {12},
  1627. /* 16: 16a; 29: 16b; 30: CCUtop0; 31: CCUtop1 */
  1628. {14, 16, 29, 26, 30, 31, 18},
  1629. {4, MTK_INVALID_LARBID, MTK_INVALID_LARBID, MTK_INVALID_LARBID, 6}},
  1630. };
  1631. static const struct mtk_iommu_plat_data mt8365_data = {
  1632. .m4u_plat = M4U_MT8365,
  1633. .flags = RESET_AXI | INT_ID_PORT_WIDTH_6,
  1634. .inv_sel_reg = REG_MMU_INV_SEL_GEN1,
  1635. .banks_num = 1,
  1636. .banks_enable = {true},
  1637. .iova_region = single_domain,
  1638. .iova_region_nr = ARRAY_SIZE(single_domain),
  1639. .larbid_remap = {{0}, {1}, {2}, {3}, {4}, {5}}, /* Linear mapping. */
  1640. };
  1641. static const struct of_device_id mtk_iommu_of_ids[] = {
  1642. { .compatible = "mediatek,mt2712-m4u", .data = &mt2712_data},
  1643. { .compatible = "mediatek,mt6779-m4u", .data = &mt6779_data},
  1644. { .compatible = "mediatek,mt6795-m4u", .data = &mt6795_data},
  1645. { .compatible = "mediatek,mt6893-iommu-mm", .data = &mt6893_data},
  1646. { .compatible = "mediatek,mt8167-m4u", .data = &mt8167_data},
  1647. { .compatible = "mediatek,mt8173-m4u", .data = &mt8173_data},
  1648. { .compatible = "mediatek,mt8183-m4u", .data = &mt8183_data},
  1649. { .compatible = "mediatek,mt8186-iommu-mm", .data = &mt8186_data_mm}, /* mm: m4u */
  1650. { .compatible = "mediatek,mt8188-iommu-infra", .data = &mt8188_data_infra},
  1651. { .compatible = "mediatek,mt8188-iommu-vdo", .data = &mt8188_data_vdo},
  1652. { .compatible = "mediatek,mt8188-iommu-vpp", .data = &mt8188_data_vpp},
  1653. { .compatible = "mediatek,mt8189-iommu-apu", .data = &mt8189_data_apu},
  1654. { .compatible = "mediatek,mt8189-iommu-infra", .data = &mt8189_data_infra},
  1655. { .compatible = "mediatek,mt8189-iommu-mm", .data = &mt8189_data_mm},
  1656. { .compatible = "mediatek,mt8192-m4u", .data = &mt8192_data},
  1657. { .compatible = "mediatek,mt8195-iommu-infra", .data = &mt8195_data_infra},
  1658. { .compatible = "mediatek,mt8195-iommu-vdo", .data = &mt8195_data_vdo},
  1659. { .compatible = "mediatek,mt8195-iommu-vpp", .data = &mt8195_data_vpp},
  1660. { .compatible = "mediatek,mt8365-m4u", .data = &mt8365_data},
  1661. {}
  1662. };
  1663. MODULE_DEVICE_TABLE(of, mtk_iommu_of_ids);
  1664. static struct platform_driver mtk_iommu_driver = {
  1665. .probe = mtk_iommu_probe,
  1666. .remove = mtk_iommu_remove,
  1667. .driver = {
  1668. .name = "mtk-iommu",
  1669. .of_match_table = mtk_iommu_of_ids,
  1670. .pm = &mtk_iommu_pm_ops,
  1671. }
  1672. };
  1673. module_platform_driver(mtk_iommu_driver);
  1674. MODULE_DESCRIPTION("IOMMU API for MediaTek M4U implementations");
  1675. MODULE_LICENSE("GPL v2");