| * Mediatek IOMMU Architecture Implementation |
| |
| Some Mediatek SOCs contain a Multimedia Memory Management Unit (M4U), and |
| this M4U have two generations of HW architecture. Generation one uses flat |
| pagetable, and only supports 4K size page mapping. Generation two uses the |
| ARM Short-Descriptor translation table format for address translation. |
| |
| About the M4U Hardware Block Diagram, please check below: |
| |
| EMI (External Memory Interface) |
| | |
| m4u (Multimedia Memory Management Unit) |
| | |
| +--------+ |
| | | |
| gals0-rx gals1-rx (Global Async Local Sync rx) |
| | | |
| | | |
| gals0-tx gals1-tx (Global Async Local Sync tx) |
| | | Some SoCs may have GALS. |
| +--------+ |
| | |
| SMI Common(Smart Multimedia Interface Common) |
| | |
| +----------------+------- |
| | | |
| | gals-rx There may be GALS in some larbs. |
| | | |
| | | |
| | gals-tx |
| | | |
| SMI larb0 SMI larb1 ... SoCs have several SMI local arbiter(larb). |
| (display) (vdec) |
| | | |
| | | |
| +-----+-----+ +----+----+ |
| | | | | | | |
| | | |... | | | ... There are different ports in each larb. |
| | | | | | | |
| OVL0 RDMA0 WDMA0 MC PP VLD |
| |
| As above, The Multimedia HW will go through SMI and M4U while it |
| access EMI. SMI is a bridge between m4u and the Multimedia HW. It contain |
| smi local arbiter and smi common. It will control whether the Multimedia |
| HW should go though the m4u for translation or bypass it and talk |
| directly with EMI. And also SMI help control the power domain and clocks for |
| each local arbiter. |
| Normally we specify a local arbiter(larb) for each multimedia HW |
| like display, video decode, and camera. And there are different ports |
| in each larb. Take a example, There are many ports like MC, PP, VLD in the |
| video decode local arbiter, all these ports are according to the video HW. |
| In some SoCs, there may be a GALS(Global Async Local Sync) module between |
| smi-common and m4u, and additional GALS module between smi-larb and |
| smi-common. GALS can been seen as a "asynchronous fifo" which could help |
| synchronize for the modules in different clock frequency. |
| |
| Required properties: |
| - compatible : must be one of the following string: |
| "mediatek,mt2701-m4u" for mt2701 which uses generation one m4u HW. |
| "mediatek,mt2712-m4u" for mt2712 which uses generation two m4u HW. |
| "mediatek,mt8173-m4u" for mt8173 which uses generation two m4u HW. |
| "mediatek,mt8183-m4u" for mt8183 which uses generation two m4u HW. |
| - reg : m4u register base and size. |
| - interrupts : the interrupt of m4u. |
| - clocks : must contain one entry for each clock-names. |
| - clock-names : Only 1 optional clock: |
| - "bclk": the block clock of m4u. |
| Here is the list which require this "bclk": |
| - mt2701, mt2712, mt7623 and mt8173. |
| Note that m4u use the EMI clock which always has been enabled before kernel |
| if there is no this "bclk". |
| - mediatek,larbs : List of phandle to the local arbiters in the current Socs. |
| Refer to bindings/memory-controllers/mediatek,smi-larb.txt. It must sort |
| according to the local arbiter index, like larb0, larb1, larb2... |
| - iommu-cells : must be 1. This is the mtk_m4u_id according to the HW. |
| Specifies the mtk_m4u_id as defined in |
| dt-binding/memory/mt2701-larb-port.h for mt2701, |
| dt-binding/memory/mt2712-larb-port.h for mt2712, |
| dt-binding/memory/mt8173-larb-port.h for mt8173, and. |
| dt-binding/memory/mt8183-larb-port.h for mt8183. |
| |
| Example: |
| iommu: iommu@10205000 { |
| compatible = "mediatek,mt8173-m4u"; |
| reg = <0 0x10205000 0 0x1000>; |
| interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_LOW>; |
| clocks = <&infracfg CLK_INFRA_M4U>; |
| clock-names = "bclk"; |
| mediatek,larbs = <&larb0 &larb1 &larb2 &larb3 &larb4 &larb5>; |
| #iommu-cells = <1>; |
| }; |
| |
| Example for a client device: |
| display { |
| compatible = "mediatek,mt8173-disp"; |
| iommus = <&iommu M4U_PORT_DISP_OVL0>, |
| <&iommu M4U_PORT_DISP_RDMA0>; |
| ... |
| }; |