Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-msm-display-for-6.2' of https://gitlab.freedesktop.org/lumag/msm into drm-next

drm/msm updates for 6.2

Core:
- MSM_INFO_GET_FLAGS support
- Cleaned up MSM IOMMU wrapper code

DPU:
- Added support for XR30 and P010 image formats
- Reworked MDSS/DPU schema, added SM8250 MDSS bindings
- Added Qualcomm SM6115 support

DP:
- Dropped unsane sanity checks

DSI:
- Fix calculation of DSC pps payload

DSI PHY:
- DSI PHY support for QCM2290

HDMI:
- Reworked dev init path

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20221126102141.721353-1-dmitry.baryshkov@linaro.org

+3489 -1603
+52
Documentation/devicetree/bindings/display/msm/dpu-common.yaml
··· 1 + %YAML 1.2 2 + --- 3 + $id: http://devicetree.org/schemas/display/msm/dpu-common.yaml# 4 + $schema: http://devicetree.org/meta-schemas/core.yaml# 5 + 6 + title: Qualcomm Display DPU common properties 7 + 8 + maintainers: 9 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + - Rob Clark <robdclark@gmail.com> 12 + 13 + description: | 14 + Common properties for QCom DPU display controller. 15 + 16 + properties: 17 + interrupts: 18 + maxItems: 1 19 + 20 + power-domains: 21 + maxItems: 1 22 + 23 + operating-points-v2: true 24 + opp-table: 25 + type: object 26 + 27 + ports: 28 + $ref: /schemas/graph.yaml#/properties/ports 29 + description: | 30 + Contains the list of output ports from DPU device. These ports 31 + connect to interfaces that are external to the DPU hardware, 32 + such as DSI, DP etc. 33 + 34 + patternProperties: 35 + "^port@[0-9a-f]+$": 36 + $ref: /schemas/graph.yaml#/properties/port 37 + 38 + # at least one port is required 39 + required: 40 + - port@0 41 + 42 + required: 43 + - compatible 44 + - reg 45 + - reg-names 46 + - clocks 47 + - interrupts 48 + - power-domains 49 + - operating-points-v2 50 + - ports 51 + 52 + additionalProperties: true
-223
Documentation/devicetree/bindings/display/msm/dpu-msm8998.yaml
··· 1 - # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/display/msm/dpu-msm8998.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm Display DPU dt properties for MSM8998 target 8 - 9 - maintainers: 10 - - AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org> 11 - 12 - description: | 13 - Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 - sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 - bindings of MDSS and DPU are mentioned for MSM8998 target. 16 - 17 - properties: 18 - compatible: 19 - items: 20 - - const: qcom,msm8998-mdss 21 - 22 - reg: 23 - maxItems: 1 24 - 25 - reg-names: 26 - const: mdss 27 - 28 - power-domains: 29 - maxItems: 1 30 - 31 - clocks: 32 - items: 33 - - description: Display AHB clock 34 - - description: Display AXI clock 35 - - description: Display core clock 36 - 37 - clock-names: 38 - items: 39 - - const: iface 40 - - const: bus 41 - - const: core 42 - 43 - interrupts: 44 - maxItems: 1 45 - 46 - interrupt-controller: true 47 - 48 - "#address-cells": true 49 - 50 - "#size-cells": true 51 - 52 - "#interrupt-cells": 53 - const: 1 54 - 55 - iommus: 56 - items: 57 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 58 - 59 - ranges: true 60 - 61 - patternProperties: 62 - "^display-controller@[0-9a-f]+$": 63 - type: object 64 - description: Node containing the properties of DPU. 65 - additionalProperties: false 66 - 67 - properties: 68 - compatible: 69 - items: 70 - - const: qcom,msm8998-dpu 71 - 72 - reg: 73 - items: 74 - - description: Address offset and size for mdp register set 75 - - description: Address offset and size for regdma register set 76 - - description: Address offset and size for vbif register set 77 - - description: Address offset and size for non-realtime vbif register set 78 - 79 - reg-names: 80 - items: 81 - - const: mdp 82 - - const: regdma 83 - - const: vbif 84 - - const: vbif_nrt 85 - 86 - clocks: 87 - items: 88 - - description: Display ahb clock 89 - - description: Display axi clock 90 - - description: Display mem-noc clock 91 - - description: Display core clock 92 - - description: Display vsync clock 93 - 94 - clock-names: 95 - items: 96 - - const: iface 97 - - const: bus 98 - - const: mnoc 99 - - const: core 100 - - const: vsync 101 - 102 - interrupts: 103 - maxItems: 1 104 - 105 - power-domains: 106 - maxItems: 1 107 - 108 - operating-points-v2: true 109 - opp-table: 110 - type: object 111 - 112 - ports: 113 - $ref: /schemas/graph.yaml#/properties/ports 114 - description: | 115 - Contains the list of output ports from DPU device. These ports 116 - connect to interfaces that are external to the DPU hardware, 117 - such as DSI, DP etc. Each output port contains an endpoint that 118 - describes how it is connected to an external interface. 119 - 120 - properties: 121 - port@0: 122 - $ref: /schemas/graph.yaml#/properties/port 123 - description: DPU_INTF1 (DSI1) 124 - 125 - port@1: 126 - $ref: /schemas/graph.yaml#/properties/port 127 - description: DPU_INTF2 (DSI2) 128 - 129 - required: 130 - - port@0 131 - - port@1 132 - 133 - required: 134 - - compatible 135 - - reg 136 - - reg-names 137 - - clocks 138 - - interrupts 139 - - power-domains 140 - - operating-points-v2 141 - - ports 142 - 143 - required: 144 - - compatible 145 - - reg 146 - - reg-names 147 - - power-domains 148 - - clocks 149 - - interrupts 150 - - interrupt-controller 151 - - iommus 152 - - ranges 153 - 154 - additionalProperties: false 155 - 156 - examples: 157 - - | 158 - #include <dt-bindings/clock/qcom,mmcc-msm8998.h> 159 - #include <dt-bindings/interrupt-controller/arm-gic.h> 160 - #include <dt-bindings/power/qcom-rpmpd.h> 161 - 162 - mdss: display-subsystem@c900000 { 163 - compatible = "qcom,msm8998-mdss"; 164 - reg = <0x0c900000 0x1000>; 165 - reg-names = "mdss"; 166 - 167 - clocks = <&mmcc MDSS_AHB_CLK>, 168 - <&mmcc MDSS_AXI_CLK>, 169 - <&mmcc MDSS_MDP_CLK>; 170 - clock-names = "iface", "bus", "core"; 171 - 172 - #address-cells = <1>; 173 - #interrupt-cells = <1>; 174 - #size-cells = <1>; 175 - 176 - interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 177 - interrupt-controller; 178 - iommus = <&mmss_smmu 0>; 179 - 180 - power-domains = <&mmcc MDSS_GDSC>; 181 - ranges; 182 - 183 - display-controller@c901000 { 184 - compatible = "qcom,msm8998-dpu"; 185 - reg = <0x0c901000 0x8f000>, 186 - <0x0c9a8e00 0xf0>, 187 - <0x0c9b0000 0x2008>, 188 - <0x0c9b8000 0x1040>; 189 - reg-names = "mdp", "regdma", "vbif", "vbif_nrt"; 190 - 191 - clocks = <&mmcc MDSS_AHB_CLK>, 192 - <&mmcc MDSS_AXI_CLK>, 193 - <&mmcc MNOC_AHB_CLK>, 194 - <&mmcc MDSS_MDP_CLK>, 195 - <&mmcc MDSS_VSYNC_CLK>; 196 - clock-names = "iface", "bus", "mnoc", "core", "vsync"; 197 - 198 - interrupt-parent = <&mdss>; 199 - interrupts = <0>; 200 - operating-points-v2 = <&mdp_opp_table>; 201 - power-domains = <&rpmpd MSM8998_VDDMX>; 202 - 203 - ports { 204 - #address-cells = <1>; 205 - #size-cells = <0>; 206 - 207 - port@0 { 208 - reg = <0>; 209 - dpu_intf1_out: endpoint { 210 - remote-endpoint = <&dsi0_in>; 211 - }; 212 - }; 213 - 214 - port@1 { 215 - reg = <1>; 216 - dpu_intf2_out: endpoint { 217 - remote-endpoint = <&dsi1_in>; 218 - }; 219 - }; 220 - }; 221 - }; 222 - }; 223 - ...
-222
Documentation/devicetree/bindings/display/msm/dpu-qcm2290.yaml
··· 1 - # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/display/msm/dpu-qcm2290.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm Display DPU dt properties for QCM2290 target 8 - 9 - maintainers: 10 - - Loic Poulain <loic.poulain@linaro.org> 11 - 12 - description: | 13 - Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 - sub-blocks like DPU display controller and DSI. Device tree bindings of MDSS 15 - and DPU are mentioned for QCM2290 target. 16 - 17 - properties: 18 - compatible: 19 - items: 20 - - const: qcom,qcm2290-mdss 21 - 22 - reg: 23 - maxItems: 1 24 - 25 - reg-names: 26 - const: mdss 27 - 28 - power-domains: 29 - maxItems: 1 30 - 31 - clocks: 32 - items: 33 - - description: Display AHB clock from gcc 34 - - description: Display AXI clock 35 - - description: Display core clock 36 - 37 - clock-names: 38 - items: 39 - - const: iface 40 - - const: bus 41 - - const: core 42 - 43 - interrupts: 44 - maxItems: 1 45 - 46 - interrupt-controller: true 47 - 48 - "#address-cells": true 49 - 50 - "#size-cells": true 51 - 52 - "#interrupt-cells": 53 - const: 1 54 - 55 - iommus: 56 - items: 57 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 58 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port1 59 - 60 - ranges: true 61 - 62 - interconnects: 63 - items: 64 - - description: Interconnect path specifying the port ids for data bus 65 - 66 - interconnect-names: 67 - const: mdp0-mem 68 - 69 - resets: 70 - items: 71 - - description: MDSS_CORE reset 72 - 73 - patternProperties: 74 - "^display-controller@[0-9a-f]+$": 75 - type: object 76 - description: Node containing the properties of DPU. 77 - additionalProperties: false 78 - 79 - properties: 80 - compatible: 81 - items: 82 - - const: qcom,qcm2290-dpu 83 - 84 - reg: 85 - items: 86 - - description: Address offset and size for mdp register set 87 - - description: Address offset and size for vbif register set 88 - 89 - reg-names: 90 - items: 91 - - const: mdp 92 - - const: vbif 93 - 94 - clocks: 95 - items: 96 - - description: Display AXI clock from gcc 97 - - description: Display AHB clock from dispcc 98 - - description: Display core clock from dispcc 99 - - description: Display lut clock from dispcc 100 - - description: Display vsync clock from dispcc 101 - 102 - clock-names: 103 - items: 104 - - const: bus 105 - - const: iface 106 - - const: core 107 - - const: lut 108 - - const: vsync 109 - 110 - interrupts: 111 - maxItems: 1 112 - 113 - power-domains: 114 - maxItems: 1 115 - 116 - operating-points-v2: true 117 - opp-table: 118 - type: object 119 - 120 - ports: 121 - $ref: /schemas/graph.yaml#/properties/ports 122 - description: | 123 - Contains the list of output ports from DPU device. These ports 124 - connect to interfaces that are external to the DPU hardware, 125 - such as DSI. Each output port contains an endpoint that 126 - describes how it is connected to an external interface. 127 - 128 - properties: 129 - port@0: 130 - $ref: /schemas/graph.yaml#/properties/port 131 - description: DPU_INTF1 (DSI1) 132 - 133 - required: 134 - - port@0 135 - 136 - required: 137 - - compatible 138 - - reg 139 - - reg-names 140 - - clocks 141 - - interrupts 142 - - power-domains 143 - - operating-points-v2 144 - - ports 145 - 146 - required: 147 - - compatible 148 - - reg 149 - - reg-names 150 - - power-domains 151 - - clocks 152 - - interrupts 153 - - interrupt-controller 154 - - iommus 155 - - ranges 156 - 157 - additionalProperties: false 158 - 159 - examples: 160 - - | 161 - #include <dt-bindings/clock/qcom,dispcc-qcm2290.h> 162 - #include <dt-bindings/clock/qcom,gcc-qcm2290.h> 163 - #include <dt-bindings/interrupt-controller/arm-gic.h> 164 - #include <dt-bindings/interconnect/qcom,qcm2290.h> 165 - #include <dt-bindings/power/qcom-rpmpd.h> 166 - 167 - mdss: mdss@5e00000 { 168 - #address-cells = <1>; 169 - #size-cells = <1>; 170 - compatible = "qcom,qcm2290-mdss"; 171 - reg = <0x05e00000 0x1000>; 172 - reg-names = "mdss"; 173 - power-domains = <&dispcc MDSS_GDSC>; 174 - clocks = <&gcc GCC_DISP_AHB_CLK>, 175 - <&gcc GCC_DISP_HF_AXI_CLK>, 176 - <&dispcc DISP_CC_MDSS_MDP_CLK>; 177 - clock-names = "iface", "bus", "core"; 178 - 179 - interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>; 180 - interrupt-controller; 181 - #interrupt-cells = <1>; 182 - 183 - interconnects = <&mmrt_virt MASTER_MDP0 &bimc SLAVE_EBI1>; 184 - interconnect-names = "mdp0-mem"; 185 - 186 - iommus = <&apps_smmu 0x420 0x2>, 187 - <&apps_smmu 0x421 0x0>; 188 - ranges; 189 - 190 - mdss_mdp: display-controller@5e01000 { 191 - compatible = "qcom,qcm2290-dpu"; 192 - reg = <0x05e01000 0x8f000>, 193 - <0x05eb0000 0x2008>; 194 - reg-names = "mdp", "vbif"; 195 - 196 - clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 197 - <&dispcc DISP_CC_MDSS_AHB_CLK>, 198 - <&dispcc DISP_CC_MDSS_MDP_CLK>, 199 - <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 200 - <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 201 - clock-names = "bus", "iface", "core", "lut", "vsync"; 202 - 203 - operating-points-v2 = <&mdp_opp_table>; 204 - power-domains = <&rpmpd QCM2290_VDDCX>; 205 - 206 - interrupt-parent = <&mdss>; 207 - interrupts = <0>; 208 - 209 - ports { 210 - #address-cells = <1>; 211 - #size-cells = <0>; 212 - 213 - port@0 { 214 - reg = <0>; 215 - dpu_intf1_out: endpoint { 216 - remote-endpoint = <&dsi0_in>; 217 - }; 218 - }; 219 - }; 220 - }; 221 - }; 222 - ...
-235
Documentation/devicetree/bindings/display/msm/dpu-sc7180.yaml
··· 1 - # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/display/msm/dpu-sc7180.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm Display DPU dt properties for SC7180 target 8 - 9 - maintainers: 10 - - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 - 12 - description: | 13 - Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 - sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 - bindings of MDSS and DPU are mentioned for SC7180 target. 16 - 17 - properties: 18 - compatible: 19 - items: 20 - - const: qcom,sc7180-mdss 21 - 22 - reg: 23 - maxItems: 1 24 - 25 - reg-names: 26 - const: mdss 27 - 28 - power-domains: 29 - maxItems: 1 30 - 31 - clocks: 32 - items: 33 - - description: Display AHB clock from gcc 34 - - description: Display AHB clock from dispcc 35 - - description: Display core clock 36 - 37 - clock-names: 38 - items: 39 - - const: iface 40 - - const: ahb 41 - - const: core 42 - 43 - interrupts: 44 - maxItems: 1 45 - 46 - interrupt-controller: true 47 - 48 - "#address-cells": true 49 - 50 - "#size-cells": true 51 - 52 - "#interrupt-cells": 53 - const: 1 54 - 55 - iommus: 56 - items: 57 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 58 - 59 - ranges: true 60 - 61 - interconnects: 62 - items: 63 - - description: Interconnect path specifying the port ids for data bus 64 - 65 - interconnect-names: 66 - const: mdp0-mem 67 - 68 - resets: 69 - items: 70 - - description: MDSS_CORE reset 71 - 72 - patternProperties: 73 - "^display-controller@[0-9a-f]+$": 74 - type: object 75 - description: Node containing the properties of DPU. 76 - additionalProperties: false 77 - 78 - properties: 79 - compatible: 80 - items: 81 - - const: qcom,sc7180-dpu 82 - 83 - reg: 84 - items: 85 - - description: Address offset and size for mdp register set 86 - - description: Address offset and size for vbif register set 87 - 88 - reg-names: 89 - items: 90 - - const: mdp 91 - - const: vbif 92 - 93 - clocks: 94 - items: 95 - - description: Display hf axi clock 96 - - description: Display ahb clock 97 - - description: Display rotator clock 98 - - description: Display lut clock 99 - - description: Display core clock 100 - - description: Display vsync clock 101 - 102 - clock-names: 103 - items: 104 - - const: bus 105 - - const: iface 106 - - const: rot 107 - - const: lut 108 - - const: core 109 - - const: vsync 110 - 111 - interrupts: 112 - maxItems: 1 113 - 114 - power-domains: 115 - maxItems: 1 116 - 117 - operating-points-v2: true 118 - opp-table: 119 - type: object 120 - 121 - ports: 122 - $ref: /schemas/graph.yaml#/properties/ports 123 - description: | 124 - Contains the list of output ports from DPU device. These ports 125 - connect to interfaces that are external to the DPU hardware, 126 - such as DSI, DP etc. Each output port contains an endpoint that 127 - describes how it is connected to an external interface. 128 - 129 - properties: 130 - port@0: 131 - $ref: /schemas/graph.yaml#/properties/port 132 - description: DPU_INTF1 (DSI1) 133 - 134 - port@2: 135 - $ref: /schemas/graph.yaml#/properties/port 136 - description: DPU_INTF0 (DP) 137 - 138 - required: 139 - - port@0 140 - 141 - required: 142 - - compatible 143 - - reg 144 - - reg-names 145 - - clocks 146 - - interrupts 147 - - power-domains 148 - - operating-points-v2 149 - - ports 150 - 151 - required: 152 - - compatible 153 - - reg 154 - - reg-names 155 - - power-domains 156 - - clocks 157 - - interrupts 158 - - interrupt-controller 159 - - iommus 160 - - ranges 161 - 162 - additionalProperties: false 163 - 164 - examples: 165 - - | 166 - #include <dt-bindings/clock/qcom,dispcc-sc7180.h> 167 - #include <dt-bindings/clock/qcom,gcc-sc7180.h> 168 - #include <dt-bindings/interrupt-controller/arm-gic.h> 169 - #include <dt-bindings/interconnect/qcom,sdm845.h> 170 - #include <dt-bindings/power/qcom-rpmpd.h> 171 - 172 - display-subsystem@ae00000 { 173 - #address-cells = <1>; 174 - #size-cells = <1>; 175 - compatible = "qcom,sc7180-mdss"; 176 - reg = <0xae00000 0x1000>; 177 - reg-names = "mdss"; 178 - power-domains = <&dispcc MDSS_GDSC>; 179 - clocks = <&gcc GCC_DISP_AHB_CLK>, 180 - <&dispcc DISP_CC_MDSS_AHB_CLK>, 181 - <&dispcc DISP_CC_MDSS_MDP_CLK>; 182 - clock-names = "iface", "ahb", "core"; 183 - 184 - interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 185 - interrupt-controller; 186 - #interrupt-cells = <1>; 187 - 188 - interconnects = <&mmss_noc MASTER_MDP0 &mc_virt SLAVE_EBI1>; 189 - interconnect-names = "mdp0-mem"; 190 - 191 - iommus = <&apps_smmu 0x800 0x2>; 192 - ranges; 193 - 194 - display-controller@ae01000 { 195 - compatible = "qcom,sc7180-dpu"; 196 - reg = <0x0ae01000 0x8f000>, 197 - <0x0aeb0000 0x2008>; 198 - 199 - reg-names = "mdp", "vbif"; 200 - 201 - clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 202 - <&dispcc DISP_CC_MDSS_AHB_CLK>, 203 - <&dispcc DISP_CC_MDSS_ROT_CLK>, 204 - <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 205 - <&dispcc DISP_CC_MDSS_MDP_CLK>, 206 - <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 207 - clock-names = "bus", "iface", "rot", "lut", "core", 208 - "vsync"; 209 - 210 - interrupt-parent = <&mdss>; 211 - interrupts = <0>; 212 - power-domains = <&rpmhpd SC7180_CX>; 213 - operating-points-v2 = <&mdp_opp_table>; 214 - 215 - ports { 216 - #address-cells = <1>; 217 - #size-cells = <0>; 218 - 219 - port@0 { 220 - reg = <0>; 221 - dpu_intf1_out: endpoint { 222 - remote-endpoint = <&dsi0_in>; 223 - }; 224 - }; 225 - 226 - port@2 { 227 - reg = <2>; 228 - dpu_intf0_out: endpoint { 229 - remote-endpoint = <&dp_in>; 230 - }; 231 - }; 232 - }; 233 - }; 234 - }; 235 - ...
-239
Documentation/devicetree/bindings/display/msm/dpu-sc7280.yaml
··· 1 - # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/display/msm/dpu-sc7280.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm Display DPU dt properties for SC7280 8 - 9 - maintainers: 10 - - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 - 12 - description: | 13 - Device tree bindings for MSM Mobile Display Subsystem (MDSS) that encapsulates 14 - sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 - bindings of MDSS and DPU are mentioned for SC7280. 16 - 17 - properties: 18 - compatible: 19 - const: qcom,sc7280-mdss 20 - 21 - reg: 22 - maxItems: 1 23 - 24 - reg-names: 25 - const: mdss 26 - 27 - power-domains: 28 - maxItems: 1 29 - 30 - clocks: 31 - items: 32 - - description: Display AHB clock from gcc 33 - - description: Display AHB clock from dispcc 34 - - description: Display core clock 35 - 36 - clock-names: 37 - items: 38 - - const: iface 39 - - const: ahb 40 - - const: core 41 - 42 - interrupts: 43 - maxItems: 1 44 - 45 - interrupt-controller: true 46 - 47 - "#address-cells": true 48 - 49 - "#size-cells": true 50 - 51 - "#interrupt-cells": 52 - const: 1 53 - 54 - iommus: 55 - items: 56 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 57 - 58 - ranges: true 59 - 60 - interconnects: 61 - items: 62 - - description: Interconnect path specifying the port ids for data bus 63 - 64 - interconnect-names: 65 - const: mdp0-mem 66 - 67 - resets: 68 - items: 69 - - description: MDSS_CORE reset 70 - 71 - patternProperties: 72 - "^display-controller@[0-9a-f]+$": 73 - type: object 74 - description: Node containing the properties of DPU. 75 - additionalProperties: false 76 - 77 - properties: 78 - compatible: 79 - const: qcom,sc7280-dpu 80 - 81 - reg: 82 - items: 83 - - description: Address offset and size for mdp register set 84 - - description: Address offset and size for vbif register set 85 - 86 - reg-names: 87 - items: 88 - - const: mdp 89 - - const: vbif 90 - 91 - clocks: 92 - items: 93 - - description: Display hf axi clock 94 - - description: Display sf axi clock 95 - - description: Display ahb clock 96 - - description: Display lut clock 97 - - description: Display core clock 98 - - description: Display vsync clock 99 - 100 - clock-names: 101 - items: 102 - - const: bus 103 - - const: nrt_bus 104 - - const: iface 105 - - const: lut 106 - - const: core 107 - - const: vsync 108 - 109 - interrupts: 110 - maxItems: 1 111 - 112 - power-domains: 113 - maxItems: 1 114 - 115 - operating-points-v2: true 116 - opp-table: 117 - type: object 118 - 119 - ports: 120 - $ref: /schemas/graph.yaml#/properties/ports 121 - description: | 122 - Contains the list of output ports from DPU device. These ports 123 - connect to interfaces that are external to the DPU hardware, 124 - such as DSI, DP etc. Each output port contains an endpoint that 125 - describes how it is connected to an external interface. 126 - 127 - properties: 128 - port@0: 129 - $ref: /schemas/graph.yaml#/properties/port 130 - description: DPU_INTF1 (DSI) 131 - 132 - port@1: 133 - $ref: /schemas/graph.yaml#/properties/port 134 - description: DPU_INTF5 (EDP) 135 - 136 - required: 137 - - port@0 138 - 139 - required: 140 - - compatible 141 - - reg 142 - - reg-names 143 - - clocks 144 - - interrupts 145 - - power-domains 146 - - operating-points-v2 147 - - ports 148 - 149 - required: 150 - - compatible 151 - - reg 152 - - reg-names 153 - - power-domains 154 - - clocks 155 - - interrupts 156 - - interrupt-controller 157 - - iommus 158 - - ranges 159 - 160 - additionalProperties: false 161 - 162 - examples: 163 - - | 164 - #include <dt-bindings/clock/qcom,dispcc-sc7280.h> 165 - #include <dt-bindings/clock/qcom,gcc-sc7280.h> 166 - #include <dt-bindings/interrupt-controller/arm-gic.h> 167 - #include <dt-bindings/interconnect/qcom,sc7280.h> 168 - #include <dt-bindings/power/qcom-rpmpd.h> 169 - 170 - display-subsystem@ae00000 { 171 - #address-cells = <1>; 172 - #size-cells = <1>; 173 - compatible = "qcom,sc7280-mdss"; 174 - reg = <0xae00000 0x1000>; 175 - reg-names = "mdss"; 176 - power-domains = <&dispcc DISP_CC_MDSS_CORE_GDSC>; 177 - clocks = <&gcc GCC_DISP_AHB_CLK>, 178 - <&dispcc DISP_CC_MDSS_AHB_CLK>, 179 - <&dispcc DISP_CC_MDSS_MDP_CLK>; 180 - clock-names = "iface", 181 - "ahb", 182 - "core"; 183 - 184 - interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 185 - interrupt-controller; 186 - #interrupt-cells = <1>; 187 - 188 - interconnects = <&mmss_noc MASTER_MDP0 &mc_virt SLAVE_EBI1>; 189 - interconnect-names = "mdp0-mem"; 190 - 191 - iommus = <&apps_smmu 0x900 0x402>; 192 - ranges; 193 - 194 - display-controller@ae01000 { 195 - compatible = "qcom,sc7280-dpu"; 196 - reg = <0x0ae01000 0x8f000>, 197 - <0x0aeb0000 0x2008>; 198 - 199 - reg-names = "mdp", "vbif"; 200 - 201 - clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 202 - <&gcc GCC_DISP_SF_AXI_CLK>, 203 - <&dispcc DISP_CC_MDSS_AHB_CLK>, 204 - <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 205 - <&dispcc DISP_CC_MDSS_MDP_CLK>, 206 - <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 207 - clock-names = "bus", 208 - "nrt_bus", 209 - "iface", 210 - "lut", 211 - "core", 212 - "vsync"; 213 - 214 - interrupt-parent = <&mdss>; 215 - interrupts = <0>; 216 - power-domains = <&rpmhpd SC7280_CX>; 217 - operating-points-v2 = <&mdp_opp_table>; 218 - 219 - ports { 220 - #address-cells = <1>; 221 - #size-cells = <0>; 222 - 223 - port@0 { 224 - reg = <0>; 225 - dpu_intf1_out: endpoint { 226 - remote-endpoint = <&dsi0_in>; 227 - }; 228 - }; 229 - 230 - port@1 { 231 - reg = <1>; 232 - dpu_intf5_out: endpoint { 233 - remote-endpoint = <&edp_in>; 234 - }; 235 - }; 236 - }; 237 - }; 238 - }; 239 - ...
-217
Documentation/devicetree/bindings/display/msm/dpu-sdm845.yaml
··· 1 - # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/display/msm/dpu-sdm845.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm Display DPU dt properties for SDM845 target 8 - 9 - maintainers: 10 - - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 - 12 - description: | 13 - Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 - sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 - bindings of MDSS and DPU are mentioned for SDM845 target. 16 - 17 - properties: 18 - compatible: 19 - items: 20 - - const: qcom,sdm845-mdss 21 - 22 - reg: 23 - maxItems: 1 24 - 25 - reg-names: 26 - const: mdss 27 - 28 - power-domains: 29 - maxItems: 1 30 - 31 - clocks: 32 - items: 33 - - description: Display AHB clock from gcc 34 - - description: Display core clock 35 - 36 - clock-names: 37 - items: 38 - - const: iface 39 - - const: core 40 - 41 - interrupts: 42 - maxItems: 1 43 - 44 - interrupt-controller: true 45 - 46 - "#address-cells": true 47 - 48 - "#size-cells": true 49 - 50 - "#interrupt-cells": 51 - const: 1 52 - 53 - iommus: 54 - items: 55 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 56 - - description: Phandle to apps_smmu node with SID mask for Hard-Fail port1 57 - 58 - ranges: true 59 - 60 - resets: 61 - items: 62 - - description: MDSS_CORE reset 63 - 64 - patternProperties: 65 - "^display-controller@[0-9a-f]+$": 66 - type: object 67 - description: Node containing the properties of DPU. 68 - additionalProperties: false 69 - 70 - properties: 71 - compatible: 72 - items: 73 - - const: qcom,sdm845-dpu 74 - 75 - reg: 76 - items: 77 - - description: Address offset and size for mdp register set 78 - - description: Address offset and size for vbif register set 79 - 80 - reg-names: 81 - items: 82 - - const: mdp 83 - - const: vbif 84 - 85 - clocks: 86 - items: 87 - - description: Display ahb clock 88 - - description: Display axi clock 89 - - description: Display core clock 90 - - description: Display vsync clock 91 - 92 - clock-names: 93 - items: 94 - - const: iface 95 - - const: bus 96 - - const: core 97 - - const: vsync 98 - 99 - interrupts: 100 - maxItems: 1 101 - 102 - power-domains: 103 - maxItems: 1 104 - 105 - operating-points-v2: true 106 - opp-table: 107 - type: object 108 - 109 - ports: 110 - $ref: /schemas/graph.yaml#/properties/ports 111 - description: | 112 - Contains the list of output ports from DPU device. These ports 113 - connect to interfaces that are external to the DPU hardware, 114 - such as DSI, DP etc. Each output port contains an endpoint that 115 - describes how it is connected to an external interface. 116 - 117 - properties: 118 - port@0: 119 - $ref: /schemas/graph.yaml#/properties/port 120 - description: DPU_INTF1 (DSI1) 121 - 122 - port@1: 123 - $ref: /schemas/graph.yaml#/properties/port 124 - description: DPU_INTF2 (DSI2) 125 - 126 - required: 127 - - port@0 128 - - port@1 129 - 130 - required: 131 - - compatible 132 - - reg 133 - - reg-names 134 - - clocks 135 - - interrupts 136 - - power-domains 137 - - operating-points-v2 138 - - ports 139 - 140 - required: 141 - - compatible 142 - - reg 143 - - reg-names 144 - - power-domains 145 - - clocks 146 - - interrupts 147 - - interrupt-controller 148 - - iommus 149 - - ranges 150 - 151 - additionalProperties: false 152 - 153 - examples: 154 - - | 155 - #include <dt-bindings/clock/qcom,dispcc-sdm845.h> 156 - #include <dt-bindings/clock/qcom,gcc-sdm845.h> 157 - #include <dt-bindings/interrupt-controller/arm-gic.h> 158 - #include <dt-bindings/power/qcom-rpmpd.h> 159 - 160 - display-subsystem@ae00000 { 161 - #address-cells = <1>; 162 - #size-cells = <1>; 163 - compatible = "qcom,sdm845-mdss"; 164 - reg = <0x0ae00000 0x1000>; 165 - reg-names = "mdss"; 166 - power-domains = <&dispcc MDSS_GDSC>; 167 - 168 - clocks = <&gcc GCC_DISP_AHB_CLK>, 169 - <&dispcc DISP_CC_MDSS_MDP_CLK>; 170 - clock-names = "iface", "core"; 171 - 172 - interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 173 - interrupt-controller; 174 - #interrupt-cells = <1>; 175 - 176 - iommus = <&apps_smmu 0x880 0x8>, 177 - <&apps_smmu 0xc80 0x8>; 178 - ranges; 179 - 180 - display-controller@ae01000 { 181 - compatible = "qcom,sdm845-dpu"; 182 - reg = <0x0ae01000 0x8f000>, 183 - <0x0aeb0000 0x2008>; 184 - reg-names = "mdp", "vbif"; 185 - 186 - clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 187 - <&dispcc DISP_CC_MDSS_AXI_CLK>, 188 - <&dispcc DISP_CC_MDSS_MDP_CLK>, 189 - <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 190 - clock-names = "iface", "bus", "core", "vsync"; 191 - 192 - interrupt-parent = <&mdss>; 193 - interrupts = <0>; 194 - power-domains = <&rpmhpd SDM845_CX>; 195 - operating-points-v2 = <&mdp_opp_table>; 196 - 197 - ports { 198 - #address-cells = <1>; 199 - #size-cells = <0>; 200 - 201 - port@0 { 202 - reg = <0>; 203 - dpu_intf1_out: endpoint { 204 - remote-endpoint = <&dsi0_in>; 205 - }; 206 - }; 207 - 208 - port@1 { 209 - reg = <1>; 210 - dpu_intf2_out: endpoint { 211 - remote-endpoint = <&dsi1_in>; 212 - }; 213 - }; 214 - }; 215 - }; 216 - }; 217 - ...
+4 -1
Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
··· 49 49 maxItems: 1 50 50 51 51 phy-names: 52 + deprecated: true 52 53 const: dsi 53 54 54 55 "#address-cells": true ··· 80 79 maxItems: 1 81 80 82 81 operating-points-v2: true 82 + 83 + opp-table: 84 + type: object 83 85 84 86 ports: 85 87 $ref: "/schemas/graph.yaml#/properties/ports" ··· 135 131 - clocks 136 132 - clock-names 137 133 - phys 138 - - phy-names 139 134 - assigned-clocks 140 135 - assigned-clock-parents 141 136 - power-domains
+1
Documentation/devicetree/bindings/display/msm/dsi-phy-14nm.yaml
··· 16 16 compatible: 17 17 enum: 18 18 - qcom,dsi-phy-14nm 19 + - qcom,dsi-phy-14nm-2290 19 20 - qcom,dsi-phy-14nm-660 20 21 - qcom,dsi-phy-14nm-8953 21 22
+1 -29
Documentation/devicetree/bindings/display/msm/mdp5.txt
··· 2 2 3 3 Description: 4 4 5 - This is the bindings documentation for the Mobile Display Subsytem(MDSS) that 6 - encapsulates sub-blocks like MDP5, DSI, HDMI, eDP etc, and the MDP5 display 5 + This is the bindings documentation for the MDP5 display 7 6 controller found in SoCs like MSM8974, APQ8084, MSM8916, MSM8994 and MSM8996. 8 - 9 - MDSS: 10 - Required properties: 11 - - compatible: 12 - * "qcom,mdss" - MDSS 13 - - reg: Physical base address and length of the controller's registers. 14 - - reg-names: The names of register regions. The following regions are required: 15 - * "mdss_phys" 16 - * "vbif_phys" 17 - - interrupts: The interrupt signal from MDSS. 18 - - interrupt-controller: identifies the node as an interrupt controller. 19 - - #interrupt-cells: specifies the number of cells needed to encode an interrupt 20 - source, should be 1. 21 - - power-domains: a power domain consumer specifier according to 22 - Documentation/devicetree/bindings/power/power_domain.txt 23 - - clocks: device clocks. See ../clocks/clock-bindings.txt for details. 24 - - clock-names: the following clocks are required. 25 - * "iface" 26 - * "bus" 27 - * "vsync" 28 - - #address-cells: number of address cells for the MDSS children. Should be 1. 29 - - #size-cells: Should be 1. 30 - - ranges: parent bus address space is the same as the child bus address space. 31 - 32 - Optional properties: 33 - - clock-names: the following clocks are optional: 34 - * "lut" 35 7 36 8 MDP5: 37 9 Required properties:
+83
Documentation/devicetree/bindings/display/msm/mdss-common.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/mdss-common.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display MDSS common properties 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 12 + - Rob Clark <robdclark@gmail.com> 13 + 14 + description: 15 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 16 + sub-blocks like DPU display controller, DSI and DP interfaces etc. 17 + 18 + properties: 19 + reg: 20 + maxItems: 1 21 + 22 + reg-names: 23 + const: mdss 24 + 25 + power-domains: 26 + maxItems: 1 27 + 28 + clocks: 29 + minItems: 2 30 + maxItems: 4 31 + 32 + clock-names: 33 + minItems: 2 34 + maxItems: 4 35 + 36 + interrupts: 37 + maxItems: 1 38 + 39 + interrupt-controller: true 40 + 41 + "#address-cells": true 42 + 43 + "#size-cells": true 44 + 45 + "#interrupt-cells": 46 + const: 1 47 + 48 + iommus: 49 + minItems: 1 50 + items: 51 + - description: Phandle to apps_smmu node with SID mask for Hard-Fail port0 52 + - description: Phandle to apps_smmu node with SID mask for Hard-Fail port1 53 + 54 + ranges: true 55 + 56 + interconnects: 57 + minItems: 1 58 + items: 59 + - description: Interconnect path from mdp0 (or a single mdp) port to the data bus 60 + - description: Interconnect path from mdp1 port to the data bus 61 + 62 + interconnect-names: 63 + minItems: 1 64 + items: 65 + - const: mdp0-mem 66 + - const: mdp1-mem 67 + 68 + resets: 69 + items: 70 + - description: MDSS_CORE reset 71 + 72 + required: 73 + - compatible 74 + - reg 75 + - reg-names 76 + - power-domains 77 + - clocks 78 + - interrupts 79 + - interrupt-controller 80 + - iommus 81 + - ranges 82 + 83 + additionalProperties: true
+196
Documentation/devicetree/bindings/display/msm/qcom,mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Mobile Display SubSystem (MDSS) 8 + 9 + maintainers: 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + - Rob Clark <robdclark@gmail.com> 12 + 13 + description: 14 + This is the bindings documentation for the Mobile Display Subsytem(MDSS) that 15 + encapsulates sub-blocks like MDP5, DSI, HDMI, eDP, etc. 16 + 17 + properties: 18 + compatible: 19 + enum: 20 + - qcom,mdss 21 + 22 + reg: 23 + minItems: 2 24 + maxItems: 3 25 + 26 + reg-names: 27 + minItems: 2 28 + items: 29 + - const: mdss_phys 30 + - const: vbif_phys 31 + - const: vbif_nrt_phys 32 + 33 + interrupts: 34 + maxItems: 1 35 + 36 + interrupt-controller: true 37 + 38 + "#interrupt-cells": 39 + const: 1 40 + 41 + power-domains: 42 + maxItems: 1 43 + description: | 44 + The MDSS power domain provided by GCC 45 + 46 + clocks: 47 + minItems: 1 48 + items: 49 + - description: Display abh clock 50 + - description: Display axi clock 51 + - description: Display vsync clock 52 + 53 + clock-names: 54 + minItems: 1 55 + items: 56 + - const: iface 57 + - const: bus 58 + - const: vsync 59 + 60 + "#address-cells": 61 + const: 1 62 + 63 + "#size-cells": 64 + const: 1 65 + 66 + ranges: true 67 + 68 + resets: 69 + items: 70 + - description: MDSS_CORE reset 71 + 72 + required: 73 + - compatible 74 + - reg 75 + - reg-names 76 + - interrupts 77 + - interrupt-controller 78 + - "#interrupt-cells" 79 + - power-domains 80 + - clocks 81 + - clock-names 82 + - "#address-cells" 83 + - "#size-cells" 84 + - ranges 85 + 86 + patternProperties: 87 + "^mdp@[1-9a-f][0-9a-f]*$": 88 + type: object 89 + properties: 90 + compatible: 91 + const: qcom,mdp5 92 + 93 + "^dsi@[1-9a-f][0-9a-f]*$": 94 + type: object 95 + properties: 96 + compatible: 97 + const: qcom,mdss-dsi-ctrl 98 + 99 + "^phy@[1-9a-f][0-9a-f]*$": 100 + type: object 101 + properties: 102 + compatible: 103 + enum: 104 + - qcom,dsi-phy-14nm 105 + - qcom,dsi-phy-14nm-660 106 + - qcom,dsi-phy-14nm-8953 107 + - qcom,dsi-phy-20nm 108 + - qcom,dsi-phy-28nm-hpm 109 + - qcom,dsi-phy-28nm-lp 110 + 111 + "^hdmi-phy@[1-9a-f][0-9a-f]*$": 112 + type: object 113 + properties: 114 + compatible: 115 + enum: 116 + - qcom,hdmi-phy-8084 117 + - qcom,hdmi-phy-8660 118 + - qcom,hdmi-phy-8960 119 + - qcom,hdmi-phy-8974 120 + - qcom,hdmi-phy-8996 121 + 122 + "^hdmi-tx@[1-9a-f][0-9a-f]*$": 123 + type: object 124 + properties: 125 + compatible: 126 + enum: 127 + - qcom,hdmi-tx-8084 128 + - qcom,hdmi-tx-8660 129 + - qcom,hdmi-tx-8960 130 + - qcom,hdmi-tx-8974 131 + - qcom,hdmi-tx-8994 132 + - qcom,hdmi-tx-8996 133 + 134 + additionalProperties: false 135 + 136 + examples: 137 + - | 138 + #include <dt-bindings/clock/qcom,gcc-msm8916.h> 139 + #include <dt-bindings/interrupt-controller/arm-gic.h> 140 + mdss@1a00000 { 141 + compatible = "qcom,mdss"; 142 + reg = <0x1a00000 0x1000>, 143 + <0x1ac8000 0x3000>; 144 + reg-names = "mdss_phys", "vbif_phys"; 145 + 146 + power-domains = <&gcc MDSS_GDSC>; 147 + 148 + clocks = <&gcc GCC_MDSS_AHB_CLK>, 149 + <&gcc GCC_MDSS_AXI_CLK>, 150 + <&gcc GCC_MDSS_VSYNC_CLK>; 151 + clock-names = "iface", 152 + "bus", 153 + "vsync"; 154 + 155 + interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; 156 + 157 + interrupt-controller; 158 + #interrupt-cells = <1>; 159 + 160 + #address-cells = <1>; 161 + #size-cells = <1>; 162 + ranges; 163 + 164 + mdp@1a01000 { 165 + compatible = "qcom,mdp5"; 166 + reg = <0x01a01000 0x89000>; 167 + reg-names = "mdp_phys"; 168 + 169 + interrupt-parent = <&mdss>; 170 + interrupts = <0>; 171 + 172 + clocks = <&gcc GCC_MDSS_AHB_CLK>, 173 + <&gcc GCC_MDSS_AXI_CLK>, 174 + <&gcc GCC_MDSS_MDP_CLK>, 175 + <&gcc GCC_MDSS_VSYNC_CLK>; 176 + clock-names = "iface", 177 + "bus", 178 + "core", 179 + "vsync"; 180 + 181 + iommus = <&apps_iommu 4>; 182 + 183 + ports { 184 + #address-cells = <1>; 185 + #size-cells = <0>; 186 + 187 + port@0 { 188 + reg = <0>; 189 + mdp5_intf1_out: endpoint { 190 + remote-endpoint = <&dsi0_in>; 191 + }; 192 + }; 193 + }; 194 + }; 195 + }; 196 + ...
+95
Documentation/devicetree/bindings/display/msm/qcom,msm8998-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,msm8998-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for MSM8998 target 8 + 9 + maintainers: 10 + - AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + items: 17 + - const: qcom,msm8998-dpu 18 + 19 + reg: 20 + items: 21 + - description: Address offset and size for mdp register set 22 + - description: Address offset and size for regdma register set 23 + - description: Address offset and size for vbif register set 24 + - description: Address offset and size for non-realtime vbif register set 25 + 26 + reg-names: 27 + items: 28 + - const: mdp 29 + - const: regdma 30 + - const: vbif 31 + - const: vbif_nrt 32 + 33 + clocks: 34 + items: 35 + - description: Display ahb clock 36 + - description: Display axi clock 37 + - description: Display mem-noc clock 38 + - description: Display core clock 39 + - description: Display vsync clock 40 + 41 + clock-names: 42 + items: 43 + - const: iface 44 + - const: bus 45 + - const: mnoc 46 + - const: core 47 + - const: vsync 48 + 49 + unevaluatedProperties: false 50 + 51 + examples: 52 + - | 53 + #include <dt-bindings/clock/qcom,mmcc-msm8998.h> 54 + #include <dt-bindings/power/qcom-rpmpd.h> 55 + 56 + display-controller@c901000 { 57 + compatible = "qcom,msm8998-dpu"; 58 + reg = <0x0c901000 0x8f000>, 59 + <0x0c9a8e00 0xf0>, 60 + <0x0c9b0000 0x2008>, 61 + <0x0c9b8000 0x1040>; 62 + reg-names = "mdp", "regdma", "vbif", "vbif_nrt"; 63 + 64 + clocks = <&mmcc MDSS_AHB_CLK>, 65 + <&mmcc MDSS_AXI_CLK>, 66 + <&mmcc MNOC_AHB_CLK>, 67 + <&mmcc MDSS_MDP_CLK>, 68 + <&mmcc MDSS_VSYNC_CLK>; 69 + clock-names = "iface", "bus", "mnoc", "core", "vsync"; 70 + 71 + interrupt-parent = <&mdss>; 72 + interrupts = <0>; 73 + operating-points-v2 = <&mdp_opp_table>; 74 + power-domains = <&rpmpd MSM8998_VDDMX>; 75 + 76 + ports { 77 + #address-cells = <1>; 78 + #size-cells = <0>; 79 + 80 + port@0 { 81 + reg = <0>; 82 + endpoint { 83 + remote-endpoint = <&dsi0_in>; 84 + }; 85 + }; 86 + 87 + port@1 { 88 + reg = <1>; 89 + endpoint { 90 + remote-endpoint = <&dsi1_in>; 91 + }; 92 + }; 93 + }; 94 + }; 95 + ...
+268
Documentation/devicetree/bindings/display/msm/qcom,msm8998-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,msm8998-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm MSM8998 Display MDSS 8 + 9 + maintainers: 10 + - AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 + bindings of MDSS are mentioned for MSM8998 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,msm8998-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock 27 + - description: Display AXI clock 28 + - description: Display core clock 29 + 30 + clock-names: 31 + items: 32 + - const: iface 33 + - const: bus 34 + - const: core 35 + 36 + iommus: 37 + maxItems: 1 38 + 39 + patternProperties: 40 + "^display-controller@[0-9a-f]+$": 41 + type: object 42 + properties: 43 + compatible: 44 + const: qcom,msm8998-dpu 45 + 46 + "^dsi@[0-9a-f]+$": 47 + type: object 48 + properties: 49 + compatible: 50 + const: qcom,mdss-dsi-ctrl 51 + 52 + "^phy@[0-9a-f]+$": 53 + type: object 54 + properties: 55 + compatible: 56 + const: qcom,dsi-phy-10nm-8998 57 + 58 + unevaluatedProperties: false 59 + 60 + examples: 61 + - | 62 + #include <dt-bindings/clock/qcom,mmcc-msm8998.h> 63 + #include <dt-bindings/clock/qcom,rpmcc.h> 64 + #include <dt-bindings/interrupt-controller/arm-gic.h> 65 + #include <dt-bindings/power/qcom-rpmpd.h> 66 + 67 + display-subsystem@c900000 { 68 + compatible = "qcom,msm8998-mdss"; 69 + reg = <0x0c900000 0x1000>; 70 + reg-names = "mdss"; 71 + 72 + clocks = <&mmcc MDSS_AHB_CLK>, 73 + <&mmcc MDSS_AXI_CLK>, 74 + <&mmcc MDSS_MDP_CLK>; 75 + clock-names = "iface", "bus", "core"; 76 + 77 + #address-cells = <1>; 78 + #interrupt-cells = <1>; 79 + #size-cells = <1>; 80 + 81 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 82 + interrupt-controller; 83 + iommus = <&mmss_smmu 0>; 84 + 85 + power-domains = <&mmcc MDSS_GDSC>; 86 + ranges; 87 + 88 + display-controller@c901000 { 89 + compatible = "qcom,msm8998-dpu"; 90 + reg = <0x0c901000 0x8f000>, 91 + <0x0c9a8e00 0xf0>, 92 + <0x0c9b0000 0x2008>, 93 + <0x0c9b8000 0x1040>; 94 + reg-names = "mdp", "regdma", "vbif", "vbif_nrt"; 95 + 96 + clocks = <&mmcc MDSS_AHB_CLK>, 97 + <&mmcc MDSS_AXI_CLK>, 98 + <&mmcc MNOC_AHB_CLK>, 99 + <&mmcc MDSS_MDP_CLK>, 100 + <&mmcc MDSS_VSYNC_CLK>; 101 + clock-names = "iface", "bus", "mnoc", "core", "vsync"; 102 + 103 + interrupt-parent = <&mdss>; 104 + interrupts = <0>; 105 + operating-points-v2 = <&mdp_opp_table>; 106 + power-domains = <&rpmpd MSM8998_VDDMX>; 107 + 108 + ports { 109 + #address-cells = <1>; 110 + #size-cells = <0>; 111 + 112 + port@0 { 113 + reg = <0>; 114 + dpu_intf1_out: endpoint { 115 + remote-endpoint = <&dsi0_in>; 116 + }; 117 + }; 118 + 119 + port@1 { 120 + reg = <1>; 121 + dpu_intf2_out: endpoint { 122 + remote-endpoint = <&dsi1_in>; 123 + }; 124 + }; 125 + }; 126 + }; 127 + 128 + dsi@c994000 { 129 + compatible = "qcom,mdss-dsi-ctrl"; 130 + reg = <0x0c994000 0x400>; 131 + reg-names = "dsi_ctrl"; 132 + 133 + interrupt-parent = <&mdss>; 134 + interrupts = <4>; 135 + 136 + clocks = <&mmcc MDSS_BYTE0_CLK>, 137 + <&mmcc MDSS_BYTE0_INTF_CLK>, 138 + <&mmcc MDSS_PCLK0_CLK>, 139 + <&mmcc MDSS_ESC0_CLK>, 140 + <&mmcc MDSS_AHB_CLK>, 141 + <&mmcc MDSS_AXI_CLK>; 142 + clock-names = "byte", 143 + "byte_intf", 144 + "pixel", 145 + "core", 146 + "iface", 147 + "bus"; 148 + assigned-clocks = <&mmcc BYTE0_CLK_SRC>, <&mmcc PCLK0_CLK_SRC>; 149 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 150 + 151 + operating-points-v2 = <&dsi_opp_table>; 152 + power-domains = <&rpmpd MSM8998_VDDCX>; 153 + 154 + phys = <&dsi0_phy>; 155 + phy-names = "dsi"; 156 + 157 + #address-cells = <1>; 158 + #size-cells = <0>; 159 + 160 + ports { 161 + #address-cells = <1>; 162 + #size-cells = <0>; 163 + 164 + port@0 { 165 + reg = <0>; 166 + dsi0_in: endpoint { 167 + remote-endpoint = <&dpu_intf1_out>; 168 + }; 169 + }; 170 + 171 + port@1 { 172 + reg = <1>; 173 + dsi0_out: endpoint { 174 + }; 175 + }; 176 + }; 177 + }; 178 + 179 + dsi0_phy: phy@c994400 { 180 + compatible = "qcom,dsi-phy-10nm-8998"; 181 + reg = <0x0c994400 0x200>, 182 + <0x0c994600 0x280>, 183 + <0x0c994a00 0x1e0>; 184 + reg-names = "dsi_phy", 185 + "dsi_phy_lane", 186 + "dsi_pll"; 187 + 188 + #clock-cells = <1>; 189 + #phy-cells = <0>; 190 + 191 + clocks = <&mmcc MDSS_AHB_CLK>, 192 + <&rpmcc RPM_SMD_XO_CLK_SRC>; 193 + clock-names = "iface", "ref"; 194 + 195 + vdds-supply = <&pm8998_l1>; 196 + }; 197 + 198 + dsi@c996000 { 199 + compatible = "qcom,mdss-dsi-ctrl"; 200 + reg = <0x0c996000 0x400>; 201 + reg-names = "dsi_ctrl"; 202 + 203 + interrupt-parent = <&mdss>; 204 + interrupts = <5>; 205 + 206 + clocks = <&mmcc MDSS_BYTE1_CLK>, 207 + <&mmcc MDSS_BYTE1_INTF_CLK>, 208 + <&mmcc MDSS_PCLK1_CLK>, 209 + <&mmcc MDSS_ESC1_CLK>, 210 + <&mmcc MDSS_AHB_CLK>, 211 + <&mmcc MDSS_AXI_CLK>; 212 + clock-names = "byte", 213 + "byte_intf", 214 + "pixel", 215 + "core", 216 + "iface", 217 + "bus"; 218 + assigned-clocks = <&mmcc BYTE1_CLK_SRC>, <&mmcc PCLK1_CLK_SRC>; 219 + assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 220 + 221 + operating-points-v2 = <&dsi_opp_table>; 222 + power-domains = <&rpmpd MSM8998_VDDCX>; 223 + 224 + phys = <&dsi1_phy>; 225 + phy-names = "dsi"; 226 + 227 + #address-cells = <1>; 228 + #size-cells = <0>; 229 + 230 + ports { 231 + #address-cells = <1>; 232 + #size-cells = <0>; 233 + 234 + port@0 { 235 + reg = <0>; 236 + dsi1_in: endpoint { 237 + remote-endpoint = <&dpu_intf2_out>; 238 + }; 239 + }; 240 + 241 + port@1 { 242 + reg = <1>; 243 + dsi1_out: endpoint { 244 + }; 245 + }; 246 + }; 247 + }; 248 + 249 + dsi1_phy: phy@c996400 { 250 + compatible = "qcom,dsi-phy-10nm-8998"; 251 + reg = <0x0c996400 0x200>, 252 + <0x0c996600 0x280>, 253 + <0x0c996a00 0x10e>; 254 + reg-names = "dsi_phy", 255 + "dsi_phy_lane", 256 + "dsi_pll"; 257 + 258 + #clock-cells = <1>; 259 + #phy-cells = <0>; 260 + 261 + clocks = <&mmcc MDSS_AHB_CLK>, 262 + <&rpmcc RPM_SMD_XO_CLK_SRC>; 263 + clock-names = "iface", "ref"; 264 + 265 + vdds-supply = <&pm8998_l1>; 266 + }; 267 + }; 268 + ...
+84
Documentation/devicetree/bindings/display/msm/qcom,qcm2290-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,qcm2290-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for QCM2290 target 8 + 9 + maintainers: 10 + - Loic Poulain <loic.poulain@linaro.org> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + items: 17 + - const: qcom,qcm2290-dpu 18 + 19 + reg: 20 + items: 21 + - description: Address offset and size for mdp register set 22 + - description: Address offset and size for vbif register set 23 + 24 + reg-names: 25 + items: 26 + - const: mdp 27 + - const: vbif 28 + 29 + clocks: 30 + items: 31 + - description: Display AXI clock from gcc 32 + - description: Display AHB clock from dispcc 33 + - description: Display core clock from dispcc 34 + - description: Display lut clock from dispcc 35 + - description: Display vsync clock from dispcc 36 + 37 + clock-names: 38 + items: 39 + - const: bus 40 + - const: iface 41 + - const: core 42 + - const: lut 43 + - const: vsync 44 + 45 + unevaluatedProperties: false 46 + 47 + examples: 48 + - | 49 + #include <dt-bindings/clock/qcom,dispcc-qcm2290.h> 50 + #include <dt-bindings/clock/qcom,gcc-qcm2290.h> 51 + #include <dt-bindings/power/qcom-rpmpd.h> 52 + 53 + display-controller@5e01000 { 54 + compatible = "qcom,qcm2290-dpu"; 55 + reg = <0x05e01000 0x8f000>, 56 + <0x05eb0000 0x2008>; 57 + reg-names = "mdp", "vbif"; 58 + 59 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 60 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 61 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 62 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 63 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 64 + clock-names = "bus", "iface", "core", "lut", "vsync"; 65 + 66 + operating-points-v2 = <&mdp_opp_table>; 67 + power-domains = <&rpmpd QCM2290_VDDCX>; 68 + 69 + interrupt-parent = <&mdss>; 70 + interrupts = <0>; 71 + 72 + ports { 73 + #address-cells = <1>; 74 + #size-cells = <0>; 75 + 76 + port@0 { 77 + reg = <0>; 78 + endpoint { 79 + remote-endpoint = <&dsi0_in>; 80 + }; 81 + }; 82 + }; 83 + }; 84 + ...
+198
Documentation/devicetree/bindings/display/msm/qcom,qcm2290-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,qcm2290-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm QCM220 Display MDSS 8 + 9 + maintainers: 10 + - Loic Poulain <loic.poulain@linaro.org> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller and DSI. Device tree bindings of MDSS 15 + are mentioned for QCM2290 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,qcm2290-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock from gcc 27 + - description: Display AXI clock 28 + - description: Display core clock 29 + 30 + clock-names: 31 + items: 32 + - const: iface 33 + - const: bus 34 + - const: core 35 + 36 + iommus: 37 + maxItems: 2 38 + 39 + interconnects: 40 + maxItems: 1 41 + 42 + interconnect-names: 43 + maxItems: 1 44 + 45 + patternProperties: 46 + "^display-controller@[0-9a-f]+$": 47 + type: object 48 + properties: 49 + compatible: 50 + const: qcom,qcm2290-dpu 51 + 52 + "^dsi@[0-9a-f]+$": 53 + type: object 54 + properties: 55 + compatible: 56 + const: qcom,dsi-ctrl-6g-qcm2290 57 + 58 + "^phy@[0-9a-f]+$": 59 + type: object 60 + properties: 61 + compatible: 62 + const: qcom,dsi-phy-14nm-2290 63 + 64 + unevaluatedProperties: false 65 + 66 + examples: 67 + - | 68 + #include <dt-bindings/clock/qcom,dispcc-qcm2290.h> 69 + #include <dt-bindings/clock/qcom,gcc-qcm2290.h> 70 + #include <dt-bindings/clock/qcom,rpmcc.h> 71 + #include <dt-bindings/interrupt-controller/arm-gic.h> 72 + #include <dt-bindings/interconnect/qcom,qcm2290.h> 73 + #include <dt-bindings/power/qcom-rpmpd.h> 74 + 75 + mdss@5e00000 { 76 + #address-cells = <1>; 77 + #size-cells = <1>; 78 + compatible = "qcom,qcm2290-mdss"; 79 + reg = <0x05e00000 0x1000>; 80 + reg-names = "mdss"; 81 + power-domains = <&dispcc MDSS_GDSC>; 82 + clocks = <&gcc GCC_DISP_AHB_CLK>, 83 + <&gcc GCC_DISP_HF_AXI_CLK>, 84 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 85 + clock-names = "iface", "bus", "core"; 86 + 87 + interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>; 88 + interrupt-controller; 89 + #interrupt-cells = <1>; 90 + 91 + interconnects = <&mmrt_virt MASTER_MDP0 &bimc SLAVE_EBI1>; 92 + interconnect-names = "mdp0-mem"; 93 + 94 + iommus = <&apps_smmu 0x420 0x2>, 95 + <&apps_smmu 0x421 0x0>; 96 + ranges; 97 + 98 + display-controller@5e01000 { 99 + compatible = "qcom,qcm2290-dpu"; 100 + reg = <0x05e01000 0x8f000>, 101 + <0x05eb0000 0x2008>; 102 + reg-names = "mdp", "vbif"; 103 + 104 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 105 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 106 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 107 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 108 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 109 + clock-names = "bus", "iface", "core", "lut", "vsync"; 110 + 111 + operating-points-v2 = <&mdp_opp_table>; 112 + power-domains = <&rpmpd QCM2290_VDDCX>; 113 + 114 + interrupt-parent = <&mdss>; 115 + interrupts = <0>; 116 + 117 + ports { 118 + #address-cells = <1>; 119 + #size-cells = <0>; 120 + 121 + port@0 { 122 + reg = <0>; 123 + dpu_intf1_out: endpoint { 124 + remote-endpoint = <&dsi0_in>; 125 + }; 126 + }; 127 + }; 128 + }; 129 + 130 + dsi@5e94000 { 131 + compatible = "qcom,dsi-ctrl-6g-qcm2290"; 132 + reg = <0x05e94000 0x400>; 133 + reg-names = "dsi_ctrl"; 134 + 135 + interrupt-parent = <&mdss>; 136 + interrupts = <4>; 137 + 138 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 139 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 140 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 141 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 142 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 143 + <&gcc GCC_DISP_HF_AXI_CLK>; 144 + clock-names = "byte", 145 + "byte_intf", 146 + "pixel", 147 + "core", 148 + "iface", 149 + "bus"; 150 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 151 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 152 + 153 + operating-points-v2 = <&dsi_opp_table>; 154 + power-domains = <&rpmpd QCM2290_VDDCX>; 155 + 156 + phys = <&dsi0_phy>; 157 + phy-names = "dsi"; 158 + 159 + #address-cells = <1>; 160 + #size-cells = <0>; 161 + 162 + ports { 163 + #address-cells = <1>; 164 + #size-cells = <0>; 165 + 166 + port@0 { 167 + reg = <0>; 168 + dsi0_in: endpoint { 169 + remote-endpoint = <&dpu_intf1_out>; 170 + }; 171 + }; 172 + 173 + port@1 { 174 + reg = <1>; 175 + dsi0_out: endpoint { 176 + }; 177 + }; 178 + }; 179 + }; 180 + 181 + dsi0_phy: phy@5e94400 { 182 + compatible = "qcom,dsi-phy-14nm-2290"; 183 + reg = <0x05e94400 0x100>, 184 + <0x05e94500 0x300>, 185 + <0x05e94800 0x188>; 186 + reg-names = "dsi_phy", 187 + "dsi_phy_lane", 188 + "dsi_pll"; 189 + 190 + #clock-cells = <1>; 191 + #phy-cells = <0>; 192 + 193 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, <&rpmcc RPM_SMD_XO_CLK_SRC>; 194 + clock-names = "iface", "ref"; 195 + vcca-supply = <&vreg_dsi_phy>; 196 + }; 197 + }; 198 + ...
+95
Documentation/devicetree/bindings/display/msm/qcom,sc7180-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sc7180-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for SC7180 target 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + items: 17 + - const: qcom,sc7180-dpu 18 + 19 + reg: 20 + items: 21 + - description: Address offset and size for mdp register set 22 + - description: Address offset and size for vbif register set 23 + 24 + reg-names: 25 + items: 26 + - const: mdp 27 + - const: vbif 28 + 29 + clocks: 30 + items: 31 + - description: Display hf axi clock 32 + - description: Display ahb clock 33 + - description: Display rotator clock 34 + - description: Display lut clock 35 + - description: Display core clock 36 + - description: Display vsync clock 37 + 38 + clock-names: 39 + items: 40 + - const: bus 41 + - const: iface 42 + - const: rot 43 + - const: lut 44 + - const: core 45 + - const: vsync 46 + 47 + unevaluatedProperties: false 48 + 49 + examples: 50 + - | 51 + #include <dt-bindings/clock/qcom,dispcc-sc7180.h> 52 + #include <dt-bindings/clock/qcom,gcc-sc7180.h> 53 + #include <dt-bindings/power/qcom-rpmpd.h> 54 + 55 + display-controller@ae01000 { 56 + compatible = "qcom,sc7180-dpu"; 57 + reg = <0x0ae01000 0x8f000>, 58 + <0x0aeb0000 0x2008>; 59 + 60 + reg-names = "mdp", "vbif"; 61 + 62 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 63 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 64 + <&dispcc DISP_CC_MDSS_ROT_CLK>, 65 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 66 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 67 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 68 + clock-names = "bus", "iface", "rot", "lut", "core", 69 + "vsync"; 70 + 71 + interrupt-parent = <&mdss>; 72 + interrupts = <0>; 73 + power-domains = <&rpmhpd SC7180_CX>; 74 + operating-points-v2 = <&mdp_opp_table>; 75 + 76 + ports { 77 + #address-cells = <1>; 78 + #size-cells = <0>; 79 + 80 + port@0 { 81 + reg = <0>; 82 + endpoint { 83 + remote-endpoint = <&dsi0_in>; 84 + }; 85 + }; 86 + 87 + port@2 { 88 + reg = <2>; 89 + endpoint { 90 + remote-endpoint = <&dp_in>; 91 + }; 92 + }; 93 + }; 94 + }; 95 + ...
+304
Documentation/devicetree/bindings/display/msm/qcom,sc7180-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sc7180-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SC7180 Display MDSS 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 + bindings of MDSS are mentioned for SC7180 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,sc7180-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock from gcc 27 + - description: Display AHB clock from dispcc 28 + - description: Display core clock 29 + 30 + clock-names: 31 + items: 32 + - const: iface 33 + - const: ahb 34 + - const: core 35 + 36 + iommus: 37 + maxItems: 1 38 + 39 + interconnects: 40 + maxItems: 1 41 + 42 + interconnect-names: 43 + maxItems: 1 44 + 45 + patternProperties: 46 + "^display-controller@[0-9a-f]+$": 47 + type: object 48 + properties: 49 + compatible: 50 + const: qcom,sc7180-dpu 51 + 52 + "^displayport-controller@[0-9a-f]+$": 53 + type: object 54 + properties: 55 + compatible: 56 + const: qcom,sc7180-dp 57 + 58 + "^dsi@[0-9a-f]+$": 59 + type: object 60 + properties: 61 + compatible: 62 + const: qcom,mdss-dsi-ctrl 63 + 64 + "^phy@[0-9a-f]+$": 65 + type: object 66 + properties: 67 + compatible: 68 + const: qcom,dsi-phy-10nm 69 + 70 + unevaluatedProperties: false 71 + 72 + examples: 73 + - | 74 + #include <dt-bindings/clock/qcom,dispcc-sc7180.h> 75 + #include <dt-bindings/clock/qcom,gcc-sc7180.h> 76 + #include <dt-bindings/clock/qcom,rpmh.h> 77 + #include <dt-bindings/interrupt-controller/arm-gic.h> 78 + #include <dt-bindings/interconnect/qcom,sdm845.h> 79 + #include <dt-bindings/power/qcom-rpmpd.h> 80 + 81 + display-subsystem@ae00000 { 82 + #address-cells = <1>; 83 + #size-cells = <1>; 84 + compatible = "qcom,sc7180-mdss"; 85 + reg = <0xae00000 0x1000>; 86 + reg-names = "mdss"; 87 + power-domains = <&dispcc MDSS_GDSC>; 88 + clocks = <&gcc GCC_DISP_AHB_CLK>, 89 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 90 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 91 + clock-names = "iface", "ahb", "core"; 92 + 93 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 94 + interrupt-controller; 95 + #interrupt-cells = <1>; 96 + 97 + interconnects = <&mmss_noc MASTER_MDP0 &mc_virt SLAVE_EBI1>; 98 + interconnect-names = "mdp0-mem"; 99 + 100 + iommus = <&apps_smmu 0x800 0x2>; 101 + ranges; 102 + 103 + display-controller@ae01000 { 104 + compatible = "qcom,sc7180-dpu"; 105 + reg = <0x0ae01000 0x8f000>, 106 + <0x0aeb0000 0x2008>; 107 + 108 + reg-names = "mdp", "vbif"; 109 + 110 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 111 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 112 + <&dispcc DISP_CC_MDSS_ROT_CLK>, 113 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 114 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 115 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 116 + clock-names = "bus", "iface", "rot", "lut", "core", 117 + "vsync"; 118 + 119 + interrupt-parent = <&mdss>; 120 + interrupts = <0>; 121 + power-domains = <&rpmhpd SC7180_CX>; 122 + operating-points-v2 = <&mdp_opp_table>; 123 + 124 + ports { 125 + #address-cells = <1>; 126 + #size-cells = <0>; 127 + 128 + port@0 { 129 + reg = <0>; 130 + dpu_intf1_out: endpoint { 131 + remote-endpoint = <&dsi0_in>; 132 + }; 133 + }; 134 + 135 + port@2 { 136 + reg = <2>; 137 + dpu_intf0_out: endpoint { 138 + remote-endpoint = <&dp_in>; 139 + }; 140 + }; 141 + }; 142 + }; 143 + 144 + dsi@ae94000 { 145 + compatible = "qcom,mdss-dsi-ctrl"; 146 + reg = <0x0ae94000 0x400>; 147 + reg-names = "dsi_ctrl"; 148 + 149 + interrupt-parent = <&mdss>; 150 + interrupts = <4>; 151 + 152 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 153 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 154 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 155 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 156 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 157 + <&gcc GCC_DISP_HF_AXI_CLK>; 158 + clock-names = "byte", 159 + "byte_intf", 160 + "pixel", 161 + "core", 162 + "iface", 163 + "bus"; 164 + 165 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 166 + assigned-clock-parents = <&dsi_phy 0>, <&dsi_phy 1>; 167 + 168 + operating-points-v2 = <&dsi_opp_table>; 169 + power-domains = <&rpmhpd SC7180_CX>; 170 + 171 + phys = <&dsi_phy>; 172 + phy-names = "dsi"; 173 + 174 + #address-cells = <1>; 175 + #size-cells = <0>; 176 + 177 + ports { 178 + #address-cells = <1>; 179 + #size-cells = <0>; 180 + 181 + port@0 { 182 + reg = <0>; 183 + dsi0_in: endpoint { 184 + remote-endpoint = <&dpu_intf1_out>; 185 + }; 186 + }; 187 + 188 + port@1 { 189 + reg = <1>; 190 + dsi0_out: endpoint { 191 + }; 192 + }; 193 + }; 194 + 195 + dsi_opp_table: opp-table { 196 + compatible = "operating-points-v2"; 197 + 198 + opp-187500000 { 199 + opp-hz = /bits/ 64 <187500000>; 200 + required-opps = <&rpmhpd_opp_low_svs>; 201 + }; 202 + 203 + opp-300000000 { 204 + opp-hz = /bits/ 64 <300000000>; 205 + required-opps = <&rpmhpd_opp_svs>; 206 + }; 207 + 208 + opp-358000000 { 209 + opp-hz = /bits/ 64 <358000000>; 210 + required-opps = <&rpmhpd_opp_svs_l1>; 211 + }; 212 + }; 213 + }; 214 + 215 + dsi_phy: phy@ae94400 { 216 + compatible = "qcom,dsi-phy-10nm"; 217 + reg = <0x0ae94400 0x200>, 218 + <0x0ae94600 0x280>, 219 + <0x0ae94a00 0x1e0>; 220 + reg-names = "dsi_phy", 221 + "dsi_phy_lane", 222 + "dsi_pll"; 223 + 224 + #clock-cells = <1>; 225 + #phy-cells = <0>; 226 + 227 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 228 + <&rpmhcc RPMH_CXO_CLK>; 229 + clock-names = "iface", "ref"; 230 + vdds-supply = <&vreg_dsi_phy>; 231 + }; 232 + 233 + displayport-controller@ae90000 { 234 + compatible = "qcom,sc7180-dp"; 235 + 236 + reg = <0xae90000 0x200>, 237 + <0xae90200 0x200>, 238 + <0xae90400 0xc00>, 239 + <0xae91000 0x400>, 240 + <0xae91400 0x400>; 241 + 242 + interrupt-parent = <&mdss>; 243 + interrupts = <12>; 244 + 245 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 246 + <&dispcc DISP_CC_MDSS_DP_AUX_CLK>, 247 + <&dispcc DISP_CC_MDSS_DP_LINK_CLK>, 248 + <&dispcc DISP_CC_MDSS_DP_LINK_INTF_CLK>, 249 + <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK>; 250 + clock-names = "core_iface", "core_aux", "ctrl_link", 251 + "ctrl_link_iface", "stream_pixel"; 252 + assigned-clocks = <&dispcc DISP_CC_MDSS_DP_LINK_CLK_SRC>, 253 + <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>; 254 + assigned-clock-parents = <&dp_phy 0>, <&dp_phy 1>; 255 + phys = <&dp_phy>; 256 + phy-names = "dp"; 257 + 258 + operating-points-v2 = <&dp_opp_table>; 259 + power-domains = <&rpmhpd SC7180_CX>; 260 + 261 + #sound-dai-cells = <0>; 262 + 263 + ports { 264 + #address-cells = <1>; 265 + #size-cells = <0>; 266 + port@0 { 267 + reg = <0>; 268 + dp_in: endpoint { 269 + remote-endpoint = <&dpu_intf0_out>; 270 + }; 271 + }; 272 + 273 + port@1 { 274 + reg = <1>; 275 + dp_out: endpoint { }; 276 + }; 277 + }; 278 + 279 + dp_opp_table: opp-table { 280 + compatible = "operating-points-v2"; 281 + 282 + opp-160000000 { 283 + opp-hz = /bits/ 64 <160000000>; 284 + required-opps = <&rpmhpd_opp_low_svs>; 285 + }; 286 + 287 + opp-270000000 { 288 + opp-hz = /bits/ 64 <270000000>; 289 + required-opps = <&rpmhpd_opp_svs>; 290 + }; 291 + 292 + opp-540000000 { 293 + opp-hz = /bits/ 64 <540000000>; 294 + required-opps = <&rpmhpd_opp_svs_l1>; 295 + }; 296 + 297 + opp-810000000 { 298 + opp-hz = /bits/ 64 <810000000>; 299 + required-opps = <&rpmhpd_opp_nom>; 300 + }; 301 + }; 302 + }; 303 + }; 304 + ...
+98
Documentation/devicetree/bindings/display/msm/qcom,sc7280-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sc7280-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for SC7280 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + const: qcom,sc7280-dpu 17 + 18 + reg: 19 + items: 20 + - description: Address offset and size for mdp register set 21 + - description: Address offset and size for vbif register set 22 + 23 + reg-names: 24 + items: 25 + - const: mdp 26 + - const: vbif 27 + 28 + clocks: 29 + items: 30 + - description: Display hf axi clock 31 + - description: Display sf axi clock 32 + - description: Display ahb clock 33 + - description: Display lut clock 34 + - description: Display core clock 35 + - description: Display vsync clock 36 + 37 + clock-names: 38 + items: 39 + - const: bus 40 + - const: nrt_bus 41 + - const: iface 42 + - const: lut 43 + - const: core 44 + - const: vsync 45 + 46 + unevaluatedProperties: false 47 + 48 + examples: 49 + - | 50 + #include <dt-bindings/clock/qcom,dispcc-sc7280.h> 51 + #include <dt-bindings/clock/qcom,gcc-sc7280.h> 52 + #include <dt-bindings/power/qcom-rpmpd.h> 53 + 54 + display-controller@ae01000 { 55 + compatible = "qcom,sc7280-dpu"; 56 + reg = <0x0ae01000 0x8f000>, 57 + <0x0aeb0000 0x2008>; 58 + 59 + reg-names = "mdp", "vbif"; 60 + 61 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 62 + <&gcc GCC_DISP_SF_AXI_CLK>, 63 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 64 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 65 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 66 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 67 + clock-names = "bus", 68 + "nrt_bus", 69 + "iface", 70 + "lut", 71 + "core", 72 + "vsync"; 73 + 74 + interrupt-parent = <&mdss>; 75 + interrupts = <0>; 76 + power-domains = <&rpmhpd SC7280_CX>; 77 + operating-points-v2 = <&mdp_opp_table>; 78 + 79 + ports { 80 + #address-cells = <1>; 81 + #size-cells = <0>; 82 + 83 + port@0 { 84 + reg = <0>; 85 + endpoint { 86 + remote-endpoint = <&dsi0_in>; 87 + }; 88 + }; 89 + 90 + port@1 { 91 + reg = <1>; 92 + endpoint { 93 + remote-endpoint = <&edp_in>; 94 + }; 95 + }; 96 + }; 97 + }; 98 + ...
+422
Documentation/devicetree/bindings/display/msm/qcom,sc7280-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sc7280-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SC7280 Display MDSS 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem (MDSS) that encapsulates 14 + sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 + bindings of MDSS are mentioned for SC7280. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + const: qcom,sc7280-mdss 22 + 23 + clocks: 24 + items: 25 + - description: Display AHB clock from gcc 26 + - description: Display AHB clock from dispcc 27 + - description: Display core clock 28 + 29 + clock-names: 30 + items: 31 + - const: iface 32 + - const: ahb 33 + - const: core 34 + 35 + iommus: 36 + maxItems: 1 37 + 38 + interconnects: 39 + maxItems: 1 40 + 41 + interconnect-names: 42 + maxItems: 1 43 + 44 + patternProperties: 45 + "^display-controller@[0-9a-f]+$": 46 + type: object 47 + properties: 48 + compatible: 49 + const: qcom,sc7280-dpu 50 + 51 + "^displayport-controller@[0-9a-f]+$": 52 + type: object 53 + properties: 54 + compatible: 55 + const: qcom,sc7280-dp 56 + 57 + "^dsi@[0-9a-f]+$": 58 + type: object 59 + properties: 60 + compatible: 61 + const: qcom,mdss-dsi-ctrl 62 + 63 + "^edp@[0-9a-f]+$": 64 + type: object 65 + properties: 66 + compatible: 67 + const: qcom,sc7280-edp 68 + 69 + "^phy@[0-9a-f]+$": 70 + type: object 71 + properties: 72 + compatible: 73 + enum: 74 + - qcom,sc7280-dsi-phy-7nm 75 + - qcom,sc7280-edp-phy 76 + 77 + unevaluatedProperties: false 78 + 79 + examples: 80 + - | 81 + #include <dt-bindings/clock/qcom,dispcc-sc7280.h> 82 + #include <dt-bindings/clock/qcom,gcc-sc7280.h> 83 + #include <dt-bindings/clock/qcom,rpmh.h> 84 + #include <dt-bindings/interrupt-controller/arm-gic.h> 85 + #include <dt-bindings/interconnect/qcom,sc7280.h> 86 + #include <dt-bindings/power/qcom-rpmpd.h> 87 + 88 + display-subsystem@ae00000 { 89 + #address-cells = <1>; 90 + #size-cells = <1>; 91 + compatible = "qcom,sc7280-mdss"; 92 + reg = <0xae00000 0x1000>; 93 + reg-names = "mdss"; 94 + power-domains = <&dispcc DISP_CC_MDSS_CORE_GDSC>; 95 + clocks = <&gcc GCC_DISP_AHB_CLK>, 96 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 97 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 98 + clock-names = "iface", 99 + "ahb", 100 + "core"; 101 + 102 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 103 + interrupt-controller; 104 + #interrupt-cells = <1>; 105 + 106 + interconnects = <&mmss_noc MASTER_MDP0 &mc_virt SLAVE_EBI1>; 107 + interconnect-names = "mdp0-mem"; 108 + 109 + iommus = <&apps_smmu 0x900 0x402>; 110 + ranges; 111 + 112 + display-controller@ae01000 { 113 + compatible = "qcom,sc7280-dpu"; 114 + reg = <0x0ae01000 0x8f000>, 115 + <0x0aeb0000 0x2008>; 116 + 117 + reg-names = "mdp", "vbif"; 118 + 119 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 120 + <&gcc GCC_DISP_SF_AXI_CLK>, 121 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 122 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 123 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 124 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 125 + clock-names = "bus", 126 + "nrt_bus", 127 + "iface", 128 + "lut", 129 + "core", 130 + "vsync"; 131 + 132 + interrupt-parent = <&mdss>; 133 + interrupts = <0>; 134 + power-domains = <&rpmhpd SC7280_CX>; 135 + operating-points-v2 = <&mdp_opp_table>; 136 + 137 + ports { 138 + #address-cells = <1>; 139 + #size-cells = <0>; 140 + 141 + port@0 { 142 + reg = <0>; 143 + dpu_intf1_out: endpoint { 144 + remote-endpoint = <&dsi0_in>; 145 + }; 146 + }; 147 + 148 + port@1 { 149 + reg = <1>; 150 + dpu_intf5_out: endpoint { 151 + remote-endpoint = <&edp_in>; 152 + }; 153 + }; 154 + 155 + port@2 { 156 + reg = <2>; 157 + dpu_intf0_out: endpoint { 158 + remote-endpoint = <&dp_in>; 159 + }; 160 + }; 161 + }; 162 + }; 163 + 164 + dsi@ae94000 { 165 + compatible = "qcom,mdss-dsi-ctrl"; 166 + reg = <0x0ae94000 0x400>; 167 + reg-names = "dsi_ctrl"; 168 + 169 + interrupt-parent = <&mdss>; 170 + interrupts = <4>; 171 + 172 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 173 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 174 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 175 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 176 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 177 + <&gcc GCC_DISP_HF_AXI_CLK>; 178 + clock-names = "byte", 179 + "byte_intf", 180 + "pixel", 181 + "core", 182 + "iface", 183 + "bus"; 184 + 185 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, 186 + <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 187 + assigned-clock-parents = <&mdss_dsi_phy 0>, <&mdss_dsi_phy 1>; 188 + 189 + operating-points-v2 = <&dsi_opp_table>; 190 + power-domains = <&rpmhpd SC7280_CX>; 191 + 192 + phys = <&mdss_dsi_phy>; 193 + phy-names = "dsi"; 194 + 195 + #address-cells = <1>; 196 + #size-cells = <0>; 197 + 198 + ports { 199 + #address-cells = <1>; 200 + #size-cells = <0>; 201 + 202 + port@0 { 203 + reg = <0>; 204 + dsi0_in: endpoint { 205 + remote-endpoint = <&dpu_intf1_out>; 206 + }; 207 + }; 208 + 209 + port@1 { 210 + reg = <1>; 211 + dsi0_out: endpoint { 212 + }; 213 + }; 214 + }; 215 + 216 + dsi_opp_table: opp-table { 217 + compatible = "operating-points-v2"; 218 + 219 + opp-187500000 { 220 + opp-hz = /bits/ 64 <187500000>; 221 + required-opps = <&rpmhpd_opp_low_svs>; 222 + }; 223 + 224 + opp-300000000 { 225 + opp-hz = /bits/ 64 <300000000>; 226 + required-opps = <&rpmhpd_opp_svs>; 227 + }; 228 + 229 + opp-358000000 { 230 + opp-hz = /bits/ 64 <358000000>; 231 + required-opps = <&rpmhpd_opp_svs_l1>; 232 + }; 233 + }; 234 + }; 235 + 236 + mdss_dsi_phy: phy@ae94400 { 237 + compatible = "qcom,sc7280-dsi-phy-7nm"; 238 + reg = <0x0ae94400 0x200>, 239 + <0x0ae94600 0x280>, 240 + <0x0ae94900 0x280>; 241 + reg-names = "dsi_phy", 242 + "dsi_phy_lane", 243 + "dsi_pll"; 244 + 245 + #clock-cells = <1>; 246 + #phy-cells = <0>; 247 + 248 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 249 + <&rpmhcc RPMH_CXO_CLK>; 250 + clock-names = "iface", "ref"; 251 + 252 + vdds-supply = <&vreg_dsi_supply>; 253 + }; 254 + 255 + edp@aea0000 { 256 + compatible = "qcom,sc7280-edp"; 257 + pinctrl-names = "default"; 258 + pinctrl-0 = <&edp_hot_plug_det>; 259 + 260 + reg = <0xaea0000 0x200>, 261 + <0xaea0200 0x200>, 262 + <0xaea0400 0xc00>, 263 + <0xaea1000 0x400>; 264 + 265 + interrupt-parent = <&mdss>; 266 + interrupts = <14>; 267 + 268 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 269 + <&dispcc DISP_CC_MDSS_EDP_AUX_CLK>, 270 + <&dispcc DISP_CC_MDSS_EDP_LINK_CLK>, 271 + <&dispcc DISP_CC_MDSS_EDP_LINK_INTF_CLK>, 272 + <&dispcc DISP_CC_MDSS_EDP_PIXEL_CLK>; 273 + clock-names = "core_iface", 274 + "core_aux", 275 + "ctrl_link", 276 + "ctrl_link_iface", 277 + "stream_pixel"; 278 + assigned-clocks = <&dispcc DISP_CC_MDSS_EDP_LINK_CLK_SRC>, 279 + <&dispcc DISP_CC_MDSS_EDP_PIXEL_CLK_SRC>; 280 + assigned-clock-parents = <&mdss_edp_phy 0>, <&mdss_edp_phy 1>; 281 + 282 + phys = <&mdss_edp_phy>; 283 + phy-names = "dp"; 284 + 285 + operating-points-v2 = <&edp_opp_table>; 286 + power-domains = <&rpmhpd SC7280_CX>; 287 + 288 + ports { 289 + #address-cells = <1>; 290 + #size-cells = <0>; 291 + 292 + port@0 { 293 + reg = <0>; 294 + edp_in: endpoint { 295 + remote-endpoint = <&dpu_intf5_out>; 296 + }; 297 + }; 298 + 299 + port@1 { 300 + reg = <1>; 301 + mdss_edp_out: endpoint { }; 302 + }; 303 + }; 304 + 305 + edp_opp_table: opp-table { 306 + compatible = "operating-points-v2"; 307 + 308 + opp-160000000 { 309 + opp-hz = /bits/ 64 <160000000>; 310 + required-opps = <&rpmhpd_opp_low_svs>; 311 + }; 312 + 313 + opp-270000000 { 314 + opp-hz = /bits/ 64 <270000000>; 315 + required-opps = <&rpmhpd_opp_svs>; 316 + }; 317 + 318 + opp-540000000 { 319 + opp-hz = /bits/ 64 <540000000>; 320 + required-opps = <&rpmhpd_opp_nom>; 321 + }; 322 + 323 + opp-810000000 { 324 + opp-hz = /bits/ 64 <810000000>; 325 + required-opps = <&rpmhpd_opp_nom>; 326 + }; 327 + }; 328 + }; 329 + 330 + mdss_edp_phy: phy@aec2a00 { 331 + compatible = "qcom,sc7280-edp-phy"; 332 + 333 + reg = <0xaec2a00 0x19c>, 334 + <0xaec2200 0xa0>, 335 + <0xaec2600 0xa0>, 336 + <0xaec2000 0x1c0>; 337 + 338 + clocks = <&rpmhcc RPMH_CXO_CLK>, 339 + <&gcc GCC_EDP_CLKREF_EN>; 340 + clock-names = "aux", 341 + "cfg_ahb"; 342 + 343 + #clock-cells = <1>; 344 + #phy-cells = <0>; 345 + }; 346 + 347 + displayport-controller@ae90000 { 348 + compatible = "qcom,sc7280-dp"; 349 + 350 + reg = <0xae90000 0x200>, 351 + <0xae90200 0x200>, 352 + <0xae90400 0xc00>, 353 + <0xae91000 0x400>, 354 + <0xae91400 0x400>; 355 + 356 + interrupt-parent = <&mdss>; 357 + interrupts = <12>; 358 + 359 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 360 + <&dispcc DISP_CC_MDSS_DP_AUX_CLK>, 361 + <&dispcc DISP_CC_MDSS_DP_LINK_CLK>, 362 + <&dispcc DISP_CC_MDSS_DP_LINK_INTF_CLK>, 363 + <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK>; 364 + clock-names = "core_iface", 365 + "core_aux", 366 + "ctrl_link", 367 + "ctrl_link_iface", 368 + "stream_pixel"; 369 + assigned-clocks = <&dispcc DISP_CC_MDSS_DP_LINK_CLK_SRC>, 370 + <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>; 371 + assigned-clock-parents = <&dp_phy 0>, <&dp_phy 1>; 372 + phys = <&dp_phy>; 373 + phy-names = "dp"; 374 + 375 + operating-points-v2 = <&dp_opp_table>; 376 + power-domains = <&rpmhpd SC7280_CX>; 377 + 378 + #sound-dai-cells = <0>; 379 + 380 + ports { 381 + #address-cells = <1>; 382 + #size-cells = <0>; 383 + 384 + port@0 { 385 + reg = <0>; 386 + dp_in: endpoint { 387 + remote-endpoint = <&dpu_intf0_out>; 388 + }; 389 + }; 390 + 391 + port@1 { 392 + reg = <1>; 393 + dp_out: endpoint { }; 394 + }; 395 + }; 396 + 397 + dp_opp_table: opp-table { 398 + compatible = "operating-points-v2"; 399 + 400 + opp-160000000 { 401 + opp-hz = /bits/ 64 <160000000>; 402 + required-opps = <&rpmhpd_opp_low_svs>; 403 + }; 404 + 405 + opp-270000000 { 406 + opp-hz = /bits/ 64 <270000000>; 407 + required-opps = <&rpmhpd_opp_svs>; 408 + }; 409 + 410 + opp-540000000 { 411 + opp-hz = /bits/ 64 <540000000>; 412 + required-opps = <&rpmhpd_opp_svs_l1>; 413 + }; 414 + 415 + opp-810000000 { 416 + opp-hz = /bits/ 64 <810000000>; 417 + required-opps = <&rpmhpd_opp_nom>; 418 + }; 419 + }; 420 + }; 421 + }; 422 + ...
+90
Documentation/devicetree/bindings/display/msm/qcom,sdm845-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sdm845-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for SDM845 target 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + items: 17 + - const: qcom,sdm845-dpu 18 + 19 + reg: 20 + items: 21 + - description: Address offset and size for mdp register set 22 + - description: Address offset and size for vbif register set 23 + 24 + reg-names: 25 + items: 26 + - const: mdp 27 + - const: vbif 28 + 29 + clocks: 30 + items: 31 + - description: Display GCC bus clock 32 + - description: Display ahb clock 33 + - description: Display axi clock 34 + - description: Display core clock 35 + - description: Display vsync clock 36 + 37 + clock-names: 38 + items: 39 + - const: gcc-bus 40 + - const: iface 41 + - const: bus 42 + - const: core 43 + - const: vsync 44 + 45 + unevaluatedProperties: false 46 + 47 + examples: 48 + - | 49 + #include <dt-bindings/clock/qcom,dispcc-sdm845.h> 50 + #include <dt-bindings/clock/qcom,gcc-sdm845.h> 51 + #include <dt-bindings/power/qcom-rpmpd.h> 52 + 53 + display-controller@ae01000 { 54 + compatible = "qcom,sdm845-dpu"; 55 + reg = <0x0ae01000 0x8f000>, 56 + <0x0aeb0000 0x2008>; 57 + reg-names = "mdp", "vbif"; 58 + 59 + clocks = <&gcc GCC_DISP_AXI_CLK>, 60 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 61 + <&dispcc DISP_CC_MDSS_AXI_CLK>, 62 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 63 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 64 + clock-names = "gcc-bus", "iface", "bus", "core", "vsync"; 65 + 66 + interrupt-parent = <&mdss>; 67 + interrupts = <0>; 68 + power-domains = <&rpmhpd SDM845_CX>; 69 + operating-points-v2 = <&mdp_opp_table>; 70 + 71 + ports { 72 + #address-cells = <1>; 73 + #size-cells = <0>; 74 + 75 + port@0 { 76 + reg = <0>; 77 + endpoint { 78 + remote-endpoint = <&dsi0_in>; 79 + }; 80 + }; 81 + 82 + port@1 { 83 + reg = <1>; 84 + endpoint { 85 + remote-endpoint = <&dsi1_in>; 86 + }; 87 + }; 88 + }; 89 + }; 90 + ...
+270
Documentation/devicetree/bindings/display/msm/qcom,sdm845-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sdm845-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SDM845 Display MDSS 8 + 9 + maintainers: 10 + - Krishna Manikandan <quic_mkrishn@quicinc.com> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 + bindings of MDSS are mentioned for SDM845 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,sdm845-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock from gcc 27 + - description: Display core clock 28 + 29 + clock-names: 30 + items: 31 + - const: iface 32 + - const: core 33 + 34 + iommus: 35 + maxItems: 2 36 + 37 + interconnects: 38 + maxItems: 2 39 + 40 + interconnect-names: 41 + maxItems: 2 42 + 43 + patternProperties: 44 + "^display-controller@[0-9a-f]+$": 45 + type: object 46 + properties: 47 + compatible: 48 + const: qcom,sdm845-dpu 49 + 50 + "^dsi@[0-9a-f]+$": 51 + type: object 52 + properties: 53 + compatible: 54 + const: qcom,mdss-dsi-ctrl 55 + 56 + "^phy@[0-9a-f]+$": 57 + type: object 58 + properties: 59 + compatible: 60 + const: qcom,dsi-phy-10nm 61 + 62 + unevaluatedProperties: false 63 + 64 + examples: 65 + - | 66 + #include <dt-bindings/clock/qcom,dispcc-sdm845.h> 67 + #include <dt-bindings/clock/qcom,gcc-sdm845.h> 68 + #include <dt-bindings/clock/qcom,rpmh.h> 69 + #include <dt-bindings/interrupt-controller/arm-gic.h> 70 + #include <dt-bindings/power/qcom-rpmpd.h> 71 + 72 + display-subsystem@ae00000 { 73 + #address-cells = <1>; 74 + #size-cells = <1>; 75 + compatible = "qcom,sdm845-mdss"; 76 + reg = <0x0ae00000 0x1000>; 77 + reg-names = "mdss"; 78 + power-domains = <&dispcc MDSS_GDSC>; 79 + 80 + clocks = <&gcc GCC_DISP_AHB_CLK>, 81 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 82 + clock-names = "iface", "core"; 83 + 84 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 85 + interrupt-controller; 86 + #interrupt-cells = <1>; 87 + 88 + iommus = <&apps_smmu 0x880 0x8>, 89 + <&apps_smmu 0xc80 0x8>; 90 + ranges; 91 + 92 + display-controller@ae01000 { 93 + compatible = "qcom,sdm845-dpu"; 94 + reg = <0x0ae01000 0x8f000>, 95 + <0x0aeb0000 0x2008>; 96 + reg-names = "mdp", "vbif"; 97 + 98 + clocks = <&gcc GCC_DISP_AXI_CLK>, 99 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 100 + <&dispcc DISP_CC_MDSS_AXI_CLK>, 101 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 102 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 103 + clock-names = "gcc-bus", "iface", "bus", "core", "vsync"; 104 + 105 + interrupt-parent = <&mdss>; 106 + interrupts = <0>; 107 + power-domains = <&rpmhpd SDM845_CX>; 108 + operating-points-v2 = <&mdp_opp_table>; 109 + 110 + ports { 111 + #address-cells = <1>; 112 + #size-cells = <0>; 113 + 114 + port@0 { 115 + reg = <0>; 116 + dpu_intf1_out: endpoint { 117 + remote-endpoint = <&dsi0_in>; 118 + }; 119 + }; 120 + 121 + port@1 { 122 + reg = <1>; 123 + dpu_intf2_out: endpoint { 124 + remote-endpoint = <&dsi1_in>; 125 + }; 126 + }; 127 + }; 128 + }; 129 + 130 + dsi@ae94000 { 131 + compatible = "qcom,mdss-dsi-ctrl"; 132 + reg = <0x0ae94000 0x400>; 133 + reg-names = "dsi_ctrl"; 134 + 135 + interrupt-parent = <&mdss>; 136 + interrupts = <4>; 137 + 138 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 139 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 140 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 141 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 142 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 143 + <&dispcc DISP_CC_MDSS_AXI_CLK>; 144 + clock-names = "byte", 145 + "byte_intf", 146 + "pixel", 147 + "core", 148 + "iface", 149 + "bus"; 150 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, 151 + <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 152 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 153 + 154 + operating-points-v2 = <&dsi_opp_table>; 155 + power-domains = <&rpmhpd SDM845_CX>; 156 + 157 + phys = <&dsi0_phy>; 158 + phy-names = "dsi"; 159 + 160 + #address-cells = <1>; 161 + #size-cells = <0>; 162 + 163 + ports { 164 + #address-cells = <1>; 165 + #size-cells = <0>; 166 + 167 + port@0 { 168 + reg = <0>; 169 + dsi0_in: endpoint { 170 + remote-endpoint = <&dpu_intf1_out>; 171 + }; 172 + }; 173 + 174 + port@1 { 175 + reg = <1>; 176 + dsi0_out: endpoint { 177 + }; 178 + }; 179 + }; 180 + }; 181 + 182 + dsi0_phy: phy@ae94400 { 183 + compatible = "qcom,dsi-phy-10nm"; 184 + reg = <0x0ae94400 0x200>, 185 + <0x0ae94600 0x280>, 186 + <0x0ae94a00 0x1e0>; 187 + reg-names = "dsi_phy", 188 + "dsi_phy_lane", 189 + "dsi_pll"; 190 + 191 + #clock-cells = <1>; 192 + #phy-cells = <0>; 193 + 194 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 195 + <&rpmhcc RPMH_CXO_CLK>; 196 + clock-names = "iface", "ref"; 197 + vdds-supply = <&vreg_dsi_phy>; 198 + }; 199 + 200 + dsi@ae96000 { 201 + compatible = "qcom,mdss-dsi-ctrl"; 202 + reg = <0x0ae96000 0x400>; 203 + reg-names = "dsi_ctrl"; 204 + 205 + interrupt-parent = <&mdss>; 206 + interrupts = <5>; 207 + 208 + clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK>, 209 + <&dispcc DISP_CC_MDSS_BYTE1_INTF_CLK>, 210 + <&dispcc DISP_CC_MDSS_PCLK1_CLK>, 211 + <&dispcc DISP_CC_MDSS_ESC1_CLK>, 212 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 213 + <&dispcc DISP_CC_MDSS_AXI_CLK>; 214 + clock-names = "byte", 215 + "byte_intf", 216 + "pixel", 217 + "core", 218 + "iface", 219 + "bus"; 220 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK_SRC>, 221 + <&dispcc DISP_CC_MDSS_PCLK1_CLK_SRC>; 222 + assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 223 + 224 + operating-points-v2 = <&dsi_opp_table>; 225 + power-domains = <&rpmhpd SDM845_CX>; 226 + 227 + phys = <&dsi1_phy>; 228 + phy-names = "dsi"; 229 + 230 + #address-cells = <1>; 231 + #size-cells = <0>; 232 + 233 + ports { 234 + #address-cells = <1>; 235 + #size-cells = <0>; 236 + 237 + port@0 { 238 + reg = <0>; 239 + dsi1_in: endpoint { 240 + remote-endpoint = <&dpu_intf2_out>; 241 + }; 242 + }; 243 + 244 + port@1 { 245 + reg = <1>; 246 + dsi1_out: endpoint { 247 + }; 248 + }; 249 + }; 250 + }; 251 + 252 + dsi1_phy: phy@ae96400 { 253 + compatible = "qcom,dsi-phy-10nm"; 254 + reg = <0x0ae96400 0x200>, 255 + <0x0ae96600 0x280>, 256 + <0x0ae96a00 0x10e>; 257 + reg-names = "dsi_phy", 258 + "dsi_phy_lane", 259 + "dsi_pll"; 260 + 261 + #clock-cells = <1>; 262 + #phy-cells = <0>; 263 + 264 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 265 + <&rpmhcc RPMH_CXO_CLK>; 266 + clock-names = "iface", "ref"; 267 + vdds-supply = <&vreg_dsi_phy>; 268 + }; 269 + }; 270 + ...
+94
Documentation/devicetree/bindings/display/msm/qcom,sm6115-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sm6115-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Display DPU dt properties for SM6115 target 8 + 9 + maintainers: 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + items: 17 + - const: qcom,sm6115-dpu 18 + 19 + reg: 20 + items: 21 + - description: MDP register set 22 + - description: VBIF register set 23 + 24 + reg-names: 25 + items: 26 + - const: mdp 27 + - const: vbif 28 + 29 + clocks: 30 + items: 31 + - description: Display AXI 32 + - description: Display AHB 33 + - description: Display core 34 + - description: Display lut 35 + - description: Display rotator 36 + - description: Display vsync 37 + 38 + clock-names: 39 + items: 40 + - const: bus 41 + - const: iface 42 + - const: core 43 + - const: lut 44 + - const: rot 45 + - const: vsync 46 + 47 + required: 48 + - compatible 49 + - reg 50 + - reg-names 51 + - clocks 52 + - clock-names 53 + 54 + unevaluatedProperties: false 55 + 56 + examples: 57 + - | 58 + #include <dt-bindings/clock/qcom,sm6115-dispcc.h> 59 + #include <dt-bindings/clock/qcom,gcc-sm6115.h> 60 + #include <dt-bindings/power/qcom-rpmpd.h> 61 + 62 + display-controller@5e01000 { 63 + compatible = "qcom,sm6115-dpu"; 64 + reg = <0x05e01000 0x8f000>, 65 + <0x05eb0000 0x2008>; 66 + reg-names = "mdp", "vbif"; 67 + 68 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 69 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 70 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 71 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 72 + <&dispcc DISP_CC_MDSS_ROT_CLK>, 73 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 74 + clock-names = "bus", "iface", "core", "lut", "rot", "vsync"; 75 + 76 + operating-points-v2 = <&mdp_opp_table>; 77 + power-domains = <&rpmpd SM6115_VDDCX>; 78 + 79 + interrupt-parent = <&mdss>; 80 + interrupts = <0>; 81 + 82 + ports { 83 + #address-cells = <1>; 84 + #size-cells = <0>; 85 + 86 + port@0 { 87 + reg = <0>; 88 + endpoint { 89 + remote-endpoint = <&dsi0_in>; 90 + }; 91 + }; 92 + }; 93 + }; 94 + ...
+182
Documentation/devicetree/bindings/display/msm/qcom,sm6115-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sm6115-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM6115 Display MDSS 8 + 9 + maintainers: 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller and DSI. Device tree bindings of MDSS 15 + are mentioned for SM6115 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,sm6115-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock from gcc 27 + - description: Display AXI clock 28 + - description: Display core clock 29 + 30 + iommus: 31 + maxItems: 2 32 + 33 + patternProperties: 34 + "^display-controller@[0-9a-f]+$": 35 + type: object 36 + properties: 37 + compatible: 38 + const: qcom,sm6115-dpu 39 + 40 + "^dsi@[0-9a-f]+$": 41 + type: object 42 + properties: 43 + compatible: 44 + const: qcom,dsi-ctrl-6g-qcm2290 45 + 46 + "^phy@[0-9a-f]+$": 47 + type: object 48 + properties: 49 + compatible: 50 + const: qcom,dsi-phy-14nm-2290 51 + 52 + required: 53 + - compatible 54 + 55 + unevaluatedProperties: false 56 + 57 + examples: 58 + - | 59 + #include <dt-bindings/clock/qcom,sm6115-dispcc.h> 60 + #include <dt-bindings/clock/qcom,gcc-sm6115.h> 61 + #include <dt-bindings/clock/qcom,rpmcc.h> 62 + #include <dt-bindings/interrupt-controller/arm-gic.h> 63 + #include <dt-bindings/power/qcom-rpmpd.h> 64 + 65 + mdss@5e00000 { 66 + #address-cells = <1>; 67 + #size-cells = <1>; 68 + compatible = "qcom,sm6115-mdss"; 69 + reg = <0x05e00000 0x1000>; 70 + reg-names = "mdss"; 71 + power-domains = <&dispcc MDSS_GDSC>; 72 + clocks = <&gcc GCC_DISP_AHB_CLK>, 73 + <&gcc GCC_DISP_HF_AXI_CLK>, 74 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 75 + 76 + interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>; 77 + interrupt-controller; 78 + #interrupt-cells = <1>; 79 + 80 + iommus = <&apps_smmu 0x420 0x2>, 81 + <&apps_smmu 0x421 0x0>; 82 + ranges; 83 + 84 + display-controller@5e01000 { 85 + compatible = "qcom,sm6115-dpu"; 86 + reg = <0x05e01000 0x8f000>, 87 + <0x05eb0000 0x2008>; 88 + reg-names = "mdp", "vbif"; 89 + 90 + clocks = <&gcc GCC_DISP_HF_AXI_CLK>, 91 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 92 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 93 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 94 + <&dispcc DISP_CC_MDSS_ROT_CLK>, 95 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 96 + clock-names = "bus", "iface", "core", "lut", "rot", "vsync"; 97 + 98 + operating-points-v2 = <&mdp_opp_table>; 99 + power-domains = <&rpmpd SM6115_VDDCX>; 100 + 101 + interrupt-parent = <&mdss>; 102 + interrupts = <0>; 103 + 104 + ports { 105 + #address-cells = <1>; 106 + #size-cells = <0>; 107 + 108 + port@0 { 109 + reg = <0>; 110 + dpu_intf1_out: endpoint { 111 + remote-endpoint = <&dsi0_in>; 112 + }; 113 + }; 114 + }; 115 + }; 116 + 117 + dsi@5e94000 { 118 + compatible = "qcom,dsi-ctrl-6g-qcm2290"; 119 + reg = <0x05e94000 0x400>; 120 + reg-names = "dsi_ctrl"; 121 + 122 + interrupt-parent = <&mdss>; 123 + interrupts = <4>; 124 + 125 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 126 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 127 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 128 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 129 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 130 + <&gcc GCC_DISP_HF_AXI_CLK>; 131 + clock-names = "byte", 132 + "byte_intf", 133 + "pixel", 134 + "core", 135 + "iface", 136 + "bus"; 137 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 138 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 139 + 140 + operating-points-v2 = <&dsi_opp_table>; 141 + power-domains = <&rpmpd SM6115_VDDCX>; 142 + phys = <&dsi0_phy>; 143 + 144 + #address-cells = <1>; 145 + #size-cells = <0>; 146 + 147 + ports { 148 + #address-cells = <1>; 149 + #size-cells = <0>; 150 + 151 + port@0 { 152 + reg = <0>; 153 + dsi0_in: endpoint { 154 + remote-endpoint = <&dpu_intf1_out>; 155 + }; 156 + }; 157 + 158 + port@1 { 159 + reg = <1>; 160 + dsi0_out: endpoint { 161 + }; 162 + }; 163 + }; 164 + }; 165 + 166 + dsi0_phy: phy@5e94400 { 167 + compatible = "qcom,dsi-phy-14nm-2290"; 168 + reg = <0x05e94400 0x100>, 169 + <0x05e94500 0x300>, 170 + <0x05e94800 0x188>; 171 + reg-names = "dsi_phy", 172 + "dsi_phy_lane", 173 + "dsi_pll"; 174 + 175 + #clock-cells = <1>; 176 + #phy-cells = <0>; 177 + 178 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, <&rpmcc RPM_SMD_XO_CLK_SRC>; 179 + clock-names = "iface", "ref"; 180 + }; 181 + }; 182 + ...
+92
Documentation/devicetree/bindings/display/msm/qcom,sm8250-dpu.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sm8250-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM8250 Display DPU 8 + 9 + maintainers: 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + const: qcom,sm8250-dpu 17 + 18 + reg: 19 + items: 20 + - description: Address offset and size for mdp register set 21 + - description: Address offset and size for vbif register set 22 + 23 + reg-names: 24 + items: 25 + - const: mdp 26 + - const: vbif 27 + 28 + clocks: 29 + items: 30 + - description: Display ahb clock 31 + - description: Display hf axi clock 32 + - description: Display core clock 33 + - description: Display vsync clock 34 + 35 + clock-names: 36 + items: 37 + - const: iface 38 + - const: bus 39 + - const: core 40 + - const: vsync 41 + 42 + unevaluatedProperties: false 43 + 44 + examples: 45 + - | 46 + #include <dt-bindings/clock/qcom,dispcc-sm8250.h> 47 + #include <dt-bindings/clock/qcom,gcc-sm8250.h> 48 + #include <dt-bindings/interrupt-controller/arm-gic.h> 49 + #include <dt-bindings/interconnect/qcom,sm8250.h> 50 + #include <dt-bindings/power/qcom-rpmpd.h> 51 + 52 + display-controller@ae01000 { 53 + compatible = "qcom,sm8250-dpu"; 54 + reg = <0x0ae01000 0x8f000>, 55 + <0x0aeb0000 0x2008>; 56 + reg-names = "mdp", "vbif"; 57 + 58 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 59 + <&gcc GCC_DISP_HF_AXI_CLK>, 60 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 61 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 62 + clock-names = "iface", "bus", "core", "vsync"; 63 + 64 + assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 65 + assigned-clock-rates = <19200000>; 66 + 67 + operating-points-v2 = <&mdp_opp_table>; 68 + power-domains = <&rpmhpd SM8250_MMCX>; 69 + 70 + interrupt-parent = <&mdss>; 71 + interrupts = <0>; 72 + 73 + ports { 74 + #address-cells = <1>; 75 + #size-cells = <0>; 76 + 77 + port@0 { 78 + reg = <0>; 79 + endpoint { 80 + remote-endpoint = <&dsi0_in>; 81 + }; 82 + }; 83 + 84 + port@1 { 85 + reg = <1>; 86 + endpoint { 87 + remote-endpoint = <&dsi1_in>; 88 + }; 89 + }; 90 + }; 91 + }; 92 + ...
+330
Documentation/devicetree/bindings/display/msm/qcom,sm8250-mdss.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/msm/qcom,sm8250-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM8250 Display MDSS 8 + 9 + maintainers: 10 + - Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 11 + 12 + description: 13 + Device tree bindings for MSM Mobile Display Subsystem(MDSS) that encapsulates 14 + sub-blocks like DPU display controller, DSI and DP interfaces etc. Device tree 15 + bindings of MDSS are mentioned for SM8250 target. 16 + 17 + $ref: /schemas/display/msm/mdss-common.yaml# 18 + 19 + properties: 20 + compatible: 21 + items: 22 + - const: qcom,sm8250-mdss 23 + 24 + clocks: 25 + items: 26 + - description: Display AHB clock from gcc 27 + - description: Display hf axi clock 28 + - description: Display sf axi clock 29 + - description: Display core clock 30 + 31 + clock-names: 32 + items: 33 + - const: iface 34 + - const: bus 35 + - const: nrt_bus 36 + - const: core 37 + 38 + iommus: 39 + maxItems: 1 40 + 41 + interconnects: 42 + maxItems: 2 43 + 44 + interconnect-names: 45 + maxItems: 2 46 + 47 + patternProperties: 48 + "^display-controller@[0-9a-f]+$": 49 + type: object 50 + properties: 51 + compatible: 52 + const: qcom,sm8250-dpu 53 + 54 + "^dsi@[0-9a-f]+$": 55 + type: object 56 + properties: 57 + compatible: 58 + const: qcom,mdss-dsi-ctrl 59 + 60 + "^phy@[0-9a-f]+$": 61 + type: object 62 + properties: 63 + compatible: 64 + const: qcom,dsi-phy-7nm 65 + 66 + unevaluatedProperties: false 67 + 68 + examples: 69 + - | 70 + #include <dt-bindings/clock/qcom,dispcc-sm8250.h> 71 + #include <dt-bindings/clock/qcom,gcc-sm8250.h> 72 + #include <dt-bindings/clock/qcom,rpmh.h> 73 + #include <dt-bindings/interrupt-controller/arm-gic.h> 74 + #include <dt-bindings/interconnect/qcom,sm8250.h> 75 + #include <dt-bindings/power/qcom-rpmpd.h> 76 + 77 + display-subsystem@ae00000 { 78 + compatible = "qcom,sm8250-mdss"; 79 + reg = <0x0ae00000 0x1000>; 80 + reg-names = "mdss"; 81 + 82 + interconnects = <&mmss_noc MASTER_MDP_PORT0 &mc_virt SLAVE_EBI_CH0>, 83 + <&mmss_noc MASTER_MDP_PORT1 &mc_virt SLAVE_EBI_CH0>; 84 + interconnect-names = "mdp0-mem", "mdp1-mem"; 85 + 86 + power-domains = <&dispcc MDSS_GDSC>; 87 + 88 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 89 + <&gcc GCC_DISP_HF_AXI_CLK>, 90 + <&gcc GCC_DISP_SF_AXI_CLK>, 91 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 92 + clock-names = "iface", "bus", "nrt_bus", "core"; 93 + 94 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 95 + interrupt-controller; 96 + #interrupt-cells = <1>; 97 + 98 + iommus = <&apps_smmu 0x820 0x402>; 99 + 100 + #address-cells = <1>; 101 + #size-cells = <1>; 102 + ranges; 103 + 104 + display-controller@ae01000 { 105 + compatible = "qcom,sm8250-dpu"; 106 + reg = <0x0ae01000 0x8f000>, 107 + <0x0aeb0000 0x2008>; 108 + reg-names = "mdp", "vbif"; 109 + 110 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 111 + <&gcc GCC_DISP_HF_AXI_CLK>, 112 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 113 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 114 + clock-names = "iface", "bus", "core", "vsync"; 115 + 116 + assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 117 + assigned-clock-rates = <19200000>; 118 + 119 + operating-points-v2 = <&mdp_opp_table>; 120 + power-domains = <&rpmhpd SM8250_MMCX>; 121 + 122 + interrupt-parent = <&mdss>; 123 + interrupts = <0>; 124 + 125 + ports { 126 + #address-cells = <1>; 127 + #size-cells = <0>; 128 + 129 + port@0 { 130 + reg = <0>; 131 + dpu_intf1_out: endpoint { 132 + remote-endpoint = <&dsi0_in>; 133 + }; 134 + }; 135 + 136 + port@1 { 137 + reg = <1>; 138 + dpu_intf2_out: endpoint { 139 + remote-endpoint = <&dsi1_in>; 140 + }; 141 + }; 142 + }; 143 + 144 + mdp_opp_table: opp-table { 145 + compatible = "operating-points-v2"; 146 + 147 + opp-200000000 { 148 + opp-hz = /bits/ 64 <200000000>; 149 + required-opps = <&rpmhpd_opp_low_svs>; 150 + }; 151 + 152 + opp-300000000 { 153 + opp-hz = /bits/ 64 <300000000>; 154 + required-opps = <&rpmhpd_opp_svs>; 155 + }; 156 + 157 + opp-345000000 { 158 + opp-hz = /bits/ 64 <345000000>; 159 + required-opps = <&rpmhpd_opp_svs_l1>; 160 + }; 161 + 162 + opp-460000000 { 163 + opp-hz = /bits/ 64 <460000000>; 164 + required-opps = <&rpmhpd_opp_nom>; 165 + }; 166 + }; 167 + }; 168 + 169 + dsi@ae94000 { 170 + compatible = "qcom,mdss-dsi-ctrl"; 171 + reg = <0x0ae94000 0x400>; 172 + reg-names = "dsi_ctrl"; 173 + 174 + interrupt-parent = <&mdss>; 175 + interrupts = <4>; 176 + 177 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 178 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 179 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 180 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 181 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 182 + <&gcc GCC_DISP_HF_AXI_CLK>; 183 + clock-names = "byte", 184 + "byte_intf", 185 + "pixel", 186 + "core", 187 + "iface", 188 + "bus"; 189 + 190 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, 191 + <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 192 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 193 + 194 + operating-points-v2 = <&dsi_opp_table>; 195 + power-domains = <&rpmhpd SM8250_MMCX>; 196 + 197 + phys = <&dsi0_phy>; 198 + phy-names = "dsi"; 199 + 200 + #address-cells = <1>; 201 + #size-cells = <0>; 202 + 203 + ports { 204 + #address-cells = <1>; 205 + #size-cells = <0>; 206 + 207 + port@0 { 208 + reg = <0>; 209 + dsi0_in: endpoint { 210 + remote-endpoint = <&dpu_intf1_out>; 211 + }; 212 + }; 213 + 214 + port@1 { 215 + reg = <1>; 216 + dsi0_out: endpoint { 217 + }; 218 + }; 219 + }; 220 + 221 + dsi_opp_table: opp-table { 222 + compatible = "operating-points-v2"; 223 + 224 + opp-187500000 { 225 + opp-hz = /bits/ 64 <187500000>; 226 + required-opps = <&rpmhpd_opp_low_svs>; 227 + }; 228 + 229 + opp-300000000 { 230 + opp-hz = /bits/ 64 <300000000>; 231 + required-opps = <&rpmhpd_opp_svs>; 232 + }; 233 + 234 + opp-358000000 { 235 + opp-hz = /bits/ 64 <358000000>; 236 + required-opps = <&rpmhpd_opp_svs_l1>; 237 + }; 238 + }; 239 + }; 240 + 241 + dsi0_phy: phy@ae94400 { 242 + compatible = "qcom,dsi-phy-7nm"; 243 + reg = <0x0ae94400 0x200>, 244 + <0x0ae94600 0x280>, 245 + <0x0ae94900 0x260>; 246 + reg-names = "dsi_phy", 247 + "dsi_phy_lane", 248 + "dsi_pll"; 249 + 250 + #clock-cells = <1>; 251 + #phy-cells = <0>; 252 + 253 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 254 + <&rpmhcc RPMH_CXO_CLK>; 255 + clock-names = "iface", "ref"; 256 + vdds-supply = <&vreg_dsi_phy>; 257 + }; 258 + 259 + dsi@ae96000 { 260 + compatible = "qcom,mdss-dsi-ctrl"; 261 + reg = <0x0ae96000 0x400>; 262 + reg-names = "dsi_ctrl"; 263 + 264 + interrupt-parent = <&mdss>; 265 + interrupts = <5>; 266 + 267 + clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK>, 268 + <&dispcc DISP_CC_MDSS_BYTE1_INTF_CLK>, 269 + <&dispcc DISP_CC_MDSS_PCLK1_CLK>, 270 + <&dispcc DISP_CC_MDSS_ESC1_CLK>, 271 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 272 + <&gcc GCC_DISP_HF_AXI_CLK>; 273 + clock-names = "byte", 274 + "byte_intf", 275 + "pixel", 276 + "core", 277 + "iface", 278 + "bus"; 279 + 280 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK_SRC>, 281 + <&dispcc DISP_CC_MDSS_PCLK1_CLK_SRC>; 282 + assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 283 + 284 + operating-points-v2 = <&dsi_opp_table>; 285 + power-domains = <&rpmhpd SM8250_MMCX>; 286 + 287 + phys = <&dsi1_phy>; 288 + phy-names = "dsi"; 289 + 290 + #address-cells = <1>; 291 + #size-cells = <0>; 292 + 293 + ports { 294 + #address-cells = <1>; 295 + #size-cells = <0>; 296 + 297 + port@0 { 298 + reg = <0>; 299 + dsi1_in: endpoint { 300 + remote-endpoint = <&dpu_intf2_out>; 301 + }; 302 + }; 303 + 304 + port@1 { 305 + reg = <1>; 306 + dsi1_out: endpoint { 307 + }; 308 + }; 309 + }; 310 + }; 311 + 312 + dsi1_phy: phy@ae96400 { 313 + compatible = "qcom,dsi-phy-7nm"; 314 + reg = <0x0ae96400 0x200>, 315 + <0x0ae96600 0x280>, 316 + <0x0ae96900 0x260>; 317 + reg-names = "dsi_phy", 318 + "dsi_phy_lane", 319 + "dsi_pll"; 320 + 321 + #clock-cells = <1>; 322 + #phy-cells = <0>; 323 + 324 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 325 + <&rpmhcc RPMH_CXO_CLK>; 326 + clock-names = "iface", "ref"; 327 + vdds-supply = <&vreg_dsi_phy>; 328 + }; 329 + }; 330 + ...
+1 -1
drivers/gpu/drm/msm/adreno/a3xx_gpu.c
··· 500 500 #endif 501 501 .gpu_state_get = a3xx_gpu_state_get, 502 502 .gpu_state_put = adreno_gpu_state_put, 503 - .create_address_space = adreno_iommu_create_address_space, 503 + .create_address_space = adreno_create_address_space, 504 504 .get_rptr = a3xx_get_rptr, 505 505 }, 506 506 };
+1 -1
drivers/gpu/drm/msm/adreno/a4xx_gpu.c
··· 635 635 #endif 636 636 .gpu_state_get = a4xx_gpu_state_get, 637 637 .gpu_state_put = adreno_gpu_state_put, 638 - .create_address_space = adreno_iommu_create_address_space, 638 + .create_address_space = adreno_create_address_space, 639 639 .get_rptr = a4xx_get_rptr, 640 640 }, 641 641 .get_timestamp = a4xx_get_timestamp,
+1 -1
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
··· 1705 1705 .gpu_busy = a5xx_gpu_busy, 1706 1706 .gpu_state_get = a5xx_gpu_state_get, 1707 1707 .gpu_state_put = a5xx_gpu_state_put, 1708 - .create_address_space = adreno_iommu_create_address_space, 1708 + .create_address_space = adreno_create_address_space, 1709 1709 .get_rptr = a5xx_get_rptr, 1710 1710 }, 1711 1711 .get_timestamp = a5xx_get_timestamp,
+5 -7
drivers/gpu/drm/msm/adreno/a6xx_gmu.c
··· 1213 1213 1214 1214 static int a6xx_gmu_memory_probe(struct a6xx_gmu *gmu) 1215 1215 { 1216 - struct iommu_domain *domain; 1217 1216 struct msm_mmu *mmu; 1218 1217 1219 - domain = iommu_domain_alloc(&platform_bus_type); 1220 - if (!domain) 1218 + mmu = msm_iommu_new(gmu->dev, 0); 1219 + if (!mmu) 1221 1220 return -ENODEV; 1221 + if (IS_ERR(mmu)) 1222 + return PTR_ERR(mmu); 1222 1223 1223 - mmu = msm_iommu_new(gmu->dev, domain); 1224 1224 gmu->aspace = msm_gem_address_space_create(mmu, "gmu", 0x0, 0x80000000); 1225 - if (IS_ERR(gmu->aspace)) { 1226 - iommu_domain_free(domain); 1225 + if (IS_ERR(gmu->aspace)) 1227 1226 return PTR_ERR(gmu->aspace); 1228 - } 1229 1227 1230 1228 return 0; 1231 1229 }
+3 -30
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
··· 1786 1786 { 1787 1787 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 1788 1788 struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); 1789 - struct iommu_domain *iommu; 1790 - struct msm_mmu *mmu; 1791 - struct msm_gem_address_space *aspace; 1792 - u64 start, size; 1793 - 1794 - iommu = iommu_domain_alloc(&platform_bus_type); 1795 - if (!iommu) 1796 - return NULL; 1789 + unsigned long quirks = 0; 1797 1790 1798 1791 /* 1799 1792 * This allows GPU to set the bus attributes required to use system 1800 1793 * cache on behalf of the iommu page table walker. 1801 1794 */ 1802 1795 if (!IS_ERR_OR_NULL(a6xx_gpu->htw_llc_slice)) 1803 - adreno_set_llc_attributes(iommu); 1796 + quirks |= IO_PGTABLE_QUIRK_ARM_OUTER_WBWA; 1804 1797 1805 - mmu = msm_iommu_new(&pdev->dev, iommu); 1806 - if (IS_ERR(mmu)) { 1807 - iommu_domain_free(iommu); 1808 - return ERR_CAST(mmu); 1809 - } 1810 - 1811 - /* 1812 - * Use the aperture start or SZ_16M, whichever is greater. This will 1813 - * ensure that we align with the allocated pagetable range while still 1814 - * allowing room in the lower 32 bits for GMEM and whatnot 1815 - */ 1816 - start = max_t(u64, SZ_16M, iommu->geometry.aperture_start); 1817 - size = iommu->geometry.aperture_end - start + 1; 1818 - 1819 - aspace = msm_gem_address_space_create(mmu, "gpu", 1820 - start & GENMASK_ULL(48, 0), size); 1821 - 1822 - if (IS_ERR(aspace) && !IS_ERR(mmu)) 1823 - mmu->funcs->destroy(mmu); 1824 - 1825 - return aspace; 1798 + return adreno_iommu_create_address_space(gpu, pdev, quirks); 1826 1799 } 1827 1800 1828 1801 static struct msm_gem_address_space *
+15 -14
drivers/gpu/drm/msm/adreno/adreno_gpu.c
··· 191 191 return zap_shader_load_mdt(gpu, adreno_gpu->info->zapfw, pasid); 192 192 } 193 193 194 - void adreno_set_llc_attributes(struct iommu_domain *iommu) 194 + struct msm_gem_address_space * 195 + adreno_create_address_space(struct msm_gpu *gpu, 196 + struct platform_device *pdev) 195 197 { 196 - iommu_set_pgtable_quirks(iommu, IO_PGTABLE_QUIRK_ARM_OUTER_WBWA); 198 + return adreno_iommu_create_address_space(gpu, pdev, 0); 197 199 } 198 200 199 201 struct msm_gem_address_space * 200 202 adreno_iommu_create_address_space(struct msm_gpu *gpu, 201 - struct platform_device *pdev) 203 + struct platform_device *pdev, 204 + unsigned long quirks) 202 205 { 203 - struct iommu_domain *iommu; 206 + struct iommu_domain_geometry *geometry; 204 207 struct msm_mmu *mmu; 205 208 struct msm_gem_address_space *aspace; 206 209 u64 start, size; 207 210 208 - iommu = iommu_domain_alloc(&platform_bus_type); 209 - if (!iommu) 210 - return NULL; 211 - 212 - mmu = msm_iommu_new(&pdev->dev, iommu); 213 - if (IS_ERR(mmu)) { 214 - iommu_domain_free(iommu); 211 + mmu = msm_iommu_new(&pdev->dev, quirks); 212 + if (IS_ERR_OR_NULL(mmu)) 215 213 return ERR_CAST(mmu); 216 - } 214 + 215 + geometry = msm_iommu_get_geometry(mmu); 216 + if (IS_ERR(geometry)) 217 + return ERR_CAST(geometry); 217 218 218 219 /* 219 220 * Use the aperture start or SZ_16M, whichever is greater. This will 220 221 * ensure that we align with the allocated pagetable range while still 221 222 * allowing room in the lower 32 bits for GMEM and whatnot 222 223 */ 223 - start = max_t(u64, SZ_16M, iommu->geometry.aperture_start); 224 - size = iommu->geometry.aperture_end - start + 1; 224 + start = max_t(u64, SZ_16M, geometry->aperture_start); 225 + size = geometry->aperture_end - start + 1; 225 226 226 227 aspace = msm_gem_address_space_create(mmu, "gpu", 227 228 start & GENMASK_ULL(48, 0), size);
+6 -3
drivers/gpu/drm/msm/adreno/adreno_gpu.h
··· 335 335 * attached targets 336 336 */ 337 337 struct msm_gem_address_space * 338 - adreno_iommu_create_address_space(struct msm_gpu *gpu, 339 - struct platform_device *pdev); 338 + adreno_create_address_space(struct msm_gpu *gpu, 339 + struct platform_device *pdev); 340 340 341 - void adreno_set_llc_attributes(struct iommu_domain *iommu); 341 + struct msm_gem_address_space * 342 + adreno_iommu_create_address_space(struct msm_gpu *gpu, 343 + struct platform_device *pdev, 344 + unsigned long quirks); 342 345 343 346 int adreno_read_speedbin(struct device *dev, u32 *speedbin); 344 347
+23 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
··· 434 434 DPU_CHROMA_H2V1, DPU_FORMAT_FLAG_YUV, 435 435 DPU_FETCH_LINEAR, 2), 436 436 437 + PSEUDO_YUV_FMT_LOOSE(P010, 438 + 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 439 + C1_B_Cb, C2_R_Cr, 440 + DPU_CHROMA_420, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_YUV, 441 + DPU_FETCH_LINEAR, 2), 442 + 437 443 INTERLEAVED_YUV_FMT(VYUY, 438 444 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 439 445 C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y, ··· 530 524 true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED, 531 525 DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), 532 526 527 + INTERLEAVED_RGB_FMT_TILED(XRGB2101010, 528 + COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 529 + C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4, 530 + true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED, 531 + DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), 532 + 533 533 PSEUDO_YUV_FMT_TILED(NV12, 534 534 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 535 535 C1_B_Cb, C2_R_Cr, 536 536 DPU_CHROMA_420, DPU_FORMAT_FLAG_YUV | 537 537 DPU_FORMAT_FLAG_COMPRESSED, 538 538 DPU_FETCH_UBWC, 4, DPU_TILE_HEIGHT_NV12), 539 + 540 + PSEUDO_YUV_FMT_TILED(P010, 541 + 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 542 + C1_B_Cb, C2_R_Cr, 543 + DPU_CHROMA_420, DPU_FORMAT_FLAG_DX | 544 + DPU_FORMAT_FLAG_YUV | 545 + DPU_FORMAT_FLAG_COMPRESSED, 546 + DPU_FETCH_UBWC, 4, DPU_TILE_HEIGHT_UBWC), 539 547 }; 540 548 541 549 /* _dpu_get_v_h_subsample_rate - Get subsample rates for all formats we support ··· 591 571 {DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC}, 592 572 {DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC}, 593 573 {DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 574 + {DRM_FORMAT_XRGB2101010, COLOR_FMT_RGBA1010102_UBWC}, 594 575 {DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 595 576 {DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC}, 596 577 }; 597 578 int color_fmt = -1; 598 579 int i; 599 580 600 - if (fmt->base.pixel_format == DRM_FORMAT_NV12) { 581 + if (fmt->base.pixel_format == DRM_FORMAT_NV12 || 582 + fmt->base.pixel_format == DRM_FORMAT_P010) { 601 583 if (DPU_FORMAT_IS_DX(fmt)) { 602 584 if (fmt->unpack_tight) 603 585 color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
+97 -7
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
··· 156 156 DRM_FORMAT_RGBX8888, 157 157 DRM_FORMAT_BGRX8888, 158 158 DRM_FORMAT_XBGR8888, 159 + DRM_FORMAT_XRGB2101010, 159 160 DRM_FORMAT_RGB888, 160 161 DRM_FORMAT_BGR888, 161 162 DRM_FORMAT_RGB565, ··· 185 184 DRM_FORMAT_RGBA8888, 186 185 DRM_FORMAT_BGRX8888, 187 186 DRM_FORMAT_BGRA8888, 187 + DRM_FORMAT_XRGB2101010, 188 188 DRM_FORMAT_XRGB8888, 189 189 DRM_FORMAT_XBGR8888, 190 190 DRM_FORMAT_RGBX8888, ··· 210 208 DRM_FORMAT_RGBX4444, 211 209 DRM_FORMAT_BGRX4444, 212 210 211 + DRM_FORMAT_P010, 213 212 DRM_FORMAT_NV12, 214 213 DRM_FORMAT_NV21, 215 214 DRM_FORMAT_NV16, ··· 318 315 .has_dim_layer = true, 319 316 .has_idle_pc = true, 320 317 .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 318 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 319 + }; 320 + 321 + static const struct dpu_caps sm6115_dpu_caps = { 322 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 323 + .max_mixer_blendstages = 0x4, 324 + .qseed_type = DPU_SSPP_SCALER_QSEED3LITE, 325 + .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 326 + .ubwc_version = DPU_HW_UBWC_VER_20, 327 + .has_dim_layer = true, 328 + .has_idle_pc = true, 329 + .max_linewidth = 2160, 321 330 .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 322 331 }; 323 332 ··· 484 469 .reg_off = 0x2BC, .bit_off = 8}, 485 470 .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { 486 471 .reg_off = 0x2C4, .bit_off = 8}, 472 + }, 473 + }; 474 + 475 + static const struct dpu_mdp_cfg sm6115_mdp[] = { 476 + { 477 + .name = "top_0", .id = MDP_TOP, 478 + .base = 0x0, .len = 0x494, 479 + .features = 0, 480 + .highest_bank_bit = 0x1, 481 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 482 + .reg_off = 0x2ac, .bit_off = 0}, 483 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 484 + .reg_off = 0x2ac, .bit_off = 8}, 487 485 }, 488 486 }; 489 487 ··· 877 849 sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), 878 850 }; 879 851 852 + static const struct dpu_sspp_sub_blks sm6115_vig_sblk_0 = 853 + _VIG_SBLK("0", 2, DPU_SSPP_SCALER_QSEED3LITE); 854 + 855 + static const struct dpu_sspp_cfg sm6115_sspp[] = { 856 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SM8250_MASK, 857 + sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 858 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 859 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 860 + }; 861 + 880 862 static const struct dpu_sspp_sub_blks sm8250_vig_sblk_0 = 881 863 _VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED3LITE); 882 864 static const struct dpu_sspp_sub_blks sm8250_vig_sblk_1 = ··· 1213 1175 -1), 1214 1176 }; 1215 1177 1178 + static const struct dpu_pingpong_cfg sc7280_pp[] = { 1179 + PP_BLK("pingpong_0", PINGPONG_0, 0x59000, 0, sc7280_pp_sblk, -1, -1), 1180 + PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), 1181 + PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), 1182 + PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), 1183 + }; 1184 + 1216 1185 static struct dpu_pingpong_cfg qcm2290_pp[] = { 1217 1186 PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, 1218 1187 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), ··· 1241 1196 MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), 1242 1197 MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), 1243 1198 MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), 1244 - }; 1245 - 1246 - static const struct dpu_pingpong_cfg sc7280_pp[] = { 1247 - PP_BLK("pingpong_0", PINGPONG_0, 0x59000, 0, sc7280_pp_sblk, -1, -1), 1248 - PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), 1249 - PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), 1250 - PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), 1251 1199 }; 1252 1200 1253 1201 /************************************************************* ··· 1625 1587 .bw_inefficiency_factor = 120, 1626 1588 }; 1627 1589 1590 + static const struct dpu_perf_cfg sm6115_perf_data = { 1591 + .max_bw_low = 3100000, 1592 + .max_bw_high = 4000000, 1593 + .min_core_ib = 2400000, 1594 + .min_llcc_ib = 800000, 1595 + .min_dram_ib = 800000, 1596 + .min_prefill_lines = 24, 1597 + .danger_lut_tbl = {0xff, 0xffff, 0x0}, 1598 + .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 1599 + .qos_lut_tbl = { 1600 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 1601 + .entries = sc7180_qos_linear 1602 + }, 1603 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1604 + .entries = sc7180_qos_macrotile 1605 + }, 1606 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 1607 + .entries = sc7180_qos_nrt 1608 + }, 1609 + /* TODO: macrotile-qseed is different from macrotile */ 1610 + }, 1611 + .cdp_cfg = { 1612 + {.rd_enable = 1, .wr_enable = 1}, 1613 + {.rd_enable = 1, .wr_enable = 0} 1614 + }, 1615 + .clk_inefficiency_factor = 105, 1616 + .bw_inefficiency_factor = 120, 1617 + }; 1618 + 1628 1619 static const struct dpu_perf_cfg sm8150_perf_data = { 1629 1620 .max_bw_low = 12800000, 1630 1621 .max_bw_high = 12800000, ··· 1865 1798 .mdss_irqs = IRQ_SC7180_MASK, 1866 1799 }; 1867 1800 1801 + static const struct dpu_mdss_cfg sm6115_dpu_cfg = { 1802 + .caps = &sm6115_dpu_caps, 1803 + .mdp_count = ARRAY_SIZE(sm6115_mdp), 1804 + .mdp = sm6115_mdp, 1805 + .ctl_count = ARRAY_SIZE(qcm2290_ctl), 1806 + .ctl = qcm2290_ctl, 1807 + .sspp_count = ARRAY_SIZE(sm6115_sspp), 1808 + .sspp = sm6115_sspp, 1809 + .mixer_count = ARRAY_SIZE(qcm2290_lm), 1810 + .mixer = qcm2290_lm, 1811 + .dspp_count = ARRAY_SIZE(qcm2290_dspp), 1812 + .dspp = qcm2290_dspp, 1813 + .pingpong_count = ARRAY_SIZE(qcm2290_pp), 1814 + .pingpong = qcm2290_pp, 1815 + .intf_count = ARRAY_SIZE(qcm2290_intf), 1816 + .intf = qcm2290_intf, 1817 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 1818 + .vbif = sdm845_vbif, 1819 + .perf = &sm6115_perf_data, 1820 + .mdss_irqs = IRQ_SC7180_MASK, 1821 + }; 1822 + 1868 1823 static const struct dpu_mdss_cfg sm8150_dpu_cfg = { 1869 1824 .caps = &sm8150_dpu_caps, 1870 1825 .mdp_count = ARRAY_SIZE(sdm845_mdp), ··· 2021 1932 { .hw_rev = DPU_HW_VER_510, .dpu_cfg = &sc8180x_dpu_cfg}, 2022 1933 { .hw_rev = DPU_HW_VER_600, .dpu_cfg = &sm8250_dpu_cfg}, 2023 1934 { .hw_rev = DPU_HW_VER_620, .dpu_cfg = &sc7180_dpu_cfg}, 1935 + { .hw_rev = DPU_HW_VER_630, .dpu_cfg = &sm6115_dpu_cfg}, 2024 1936 { .hw_rev = DPU_HW_VER_650, .dpu_cfg = &qcm2290_dpu_cfg}, 2025 1937 { .hw_rev = DPU_HW_VER_720, .dpu_cfg = &sc7280_dpu_cfg}, 2026 1938 };
+1
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
··· 44 44 #define DPU_HW_VER_510 DPU_HW_VER(5, 1, 1) /* sc8180 */ 45 45 #define DPU_HW_VER_600 DPU_HW_VER(6, 0, 0) /* sm8250 */ 46 46 #define DPU_HW_VER_620 DPU_HW_VER(6, 2, 0) /* sc7180 v1.0 */ 47 + #define DPU_HW_VER_630 DPU_HW_VER(6, 3, 0) /* sm6115|sm4250 */ 47 48 #define DPU_HW_VER_650 DPU_HW_VER(6, 5, 0) /* qcm2290|sm4125 */ 48 49 #define DPU_HW_VER_720 DPU_HW_VER(7, 2, 0) /* sc7280 */ 49 50
+2 -9
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
··· 42 42 u32 initial_lines) 43 43 { 44 44 struct dpu_hw_blk_reg_map *c = &hw_dsc->hw; 45 - u32 data, lsb, bpp; 45 + u32 data; 46 46 u32 slice_last_group_size; 47 47 u32 det_thresh_flatness; 48 48 bool is_cmd_mode = !(mode & DSC_MODE_VIDEO); ··· 56 56 data = (initial_lines << 20); 57 57 data |= ((slice_last_group_size - 1) << 18); 58 58 /* bpp is 6.4 format, 4 LSBs bits are for fractional part */ 59 - data |= dsc->bits_per_pixel << 12; 60 - lsb = dsc->bits_per_pixel % 4; 61 - bpp = dsc->bits_per_pixel / 4; 62 - bpp *= 4; 63 - bpp <<= 4; 64 - bpp |= lsb; 65 - 66 - data |= bpp << 8; 59 + data |= (dsc->bits_per_pixel << 8); 67 60 data |= (dsc->block_pred_enable << 7); 68 61 data |= (dsc->line_buf_depth << 3); 69 62 data |= (dsc->simple_422 << 2);
+4 -15
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 194 194 struct dpu_kms *dpu_kms; 195 195 }; 196 196 197 - static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data) 197 + static int dpu_regset32_show(struct seq_file *s, void *data) 198 198 { 199 199 struct dpu_debugfs_regset32 *regset = s->private; 200 200 struct dpu_kms *dpu_kms = regset->dpu_kms; ··· 227 227 228 228 return 0; 229 229 } 230 - 231 - static int dpu_debugfs_open_regset32(struct inode *inode, 232 - struct file *file) 233 - { 234 - return single_open(file, _dpu_debugfs_show_regset32, inode->i_private); 235 - } 236 - 237 - static const struct file_operations dpu_fops_regset32 = { 238 - .open = dpu_debugfs_open_regset32, 239 - .read = seq_read, 240 - .llseek = seq_lseek, 241 - .release = single_release, 242 - }; 230 + DEFINE_SHOW_ATTRIBUTE(dpu_regset32); 243 231 244 232 void dpu_debugfs_create_regset32(const char *name, umode_t mode, 245 233 void *parent, ··· 247 259 regset->blk_len = length; 248 260 regset->dpu_kms = dpu_kms; 249 261 250 - debugfs_create_file(name, mode, parent, regset, &dpu_fops_regset32); 262 + debugfs_create_file(name, mode, parent, regset, &dpu_regset32_fops); 251 263 } 252 264 253 265 static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor) ··· 1292 1304 { .compatible = "qcom,sc7180-dpu", }, 1293 1305 { .compatible = "qcom,sc7280-dpu", }, 1294 1306 { .compatible = "qcom,sc8180x-dpu", }, 1307 + { .compatible = "qcom,sm6115-dpu", }, 1295 1308 { .compatible = "qcom,sm8150-dpu", }, 1296 1309 { .compatible = "qcom,sm8250-dpu", }, 1297 1310 {}
+2
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
··· 69 69 DRM_FORMAT_ARGB8888, 70 70 DRM_FORMAT_XBGR8888, 71 71 DRM_FORMAT_XRGB8888, 72 + DRM_FORMAT_XRGB2101010, 72 73 DRM_FORMAT_BGR565, 73 74 74 75 DRM_FORMAT_NV12, 76 + DRM_FORMAT_P010, 75 77 }; 76 78 77 79 /**
+10 -9
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
··· 387 387 struct msm_drm_private *priv = dev->dev_private; 388 388 struct mdp4_kms *mdp4_kms; 389 389 struct msm_kms *kms = NULL; 390 - struct iommu_domain *iommu; 390 + struct msm_mmu *mmu; 391 391 struct msm_gem_address_space *aspace; 392 392 int irq, ret; 393 393 u32 major, minor; ··· 499 499 mdp4_disable(mdp4_kms); 500 500 mdelay(16); 501 501 502 - iommu = iommu_domain_alloc(pdev->dev.bus); 503 - if (iommu) { 504 - struct msm_mmu *mmu = msm_iommu_new(&pdev->dev, iommu); 505 - 502 + mmu = msm_iommu_new(&pdev->dev, 0); 503 + if (IS_ERR(mmu)) { 504 + ret = PTR_ERR(mmu); 505 + goto fail; 506 + } else if (!mmu) { 507 + DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys " 508 + "contig buffers for scanout\n"); 509 + aspace = NULL; 510 + } else { 506 511 aspace = msm_gem_address_space_create(mmu, 507 512 "mdp4", 0x1000, 0x100000000 - 0x1000); 508 513 ··· 519 514 } 520 515 521 516 kms->aspace = aspace; 522 - } else { 523 - DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys " 524 - "contig buffers for scanout\n"); 525 - aspace = NULL; 526 517 } 527 518 528 519 ret = modeset_init(mdp4_kms);
+14 -13
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
··· 203 203 slave_encoder); 204 204 } 205 205 206 - static void mdp5_destroy(struct platform_device *pdev); 206 + static void mdp5_destroy(struct mdp5_kms *mdp5_kms); 207 207 208 208 static void mdp5_kms_destroy(struct msm_kms *kms) 209 209 { ··· 223 223 } 224 224 225 225 mdp_kms_destroy(&mdp5_kms->base); 226 - mdp5_destroy(mdp5_kms->pdev); 226 + mdp5_destroy(mdp5_kms); 227 227 } 228 228 229 229 #ifdef CONFIG_DEBUG_FS ··· 559 559 int irq, i, ret; 560 560 561 561 ret = mdp5_init(to_platform_device(dev->dev), dev); 562 + if (ret) 563 + return ret; 562 564 563 565 /* priv->kms would have been populated by the MDP5 driver */ 564 566 kms = priv->kms; ··· 634 632 return ret; 635 633 } 636 634 637 - static void mdp5_destroy(struct platform_device *pdev) 635 + static void mdp5_destroy(struct mdp5_kms *mdp5_kms) 638 636 { 639 - struct mdp5_kms *mdp5_kms = platform_get_drvdata(pdev); 640 637 int i; 641 638 642 639 if (mdp5_kms->ctlm) ··· 649 648 kfree(mdp5_kms->intfs[i]); 650 649 651 650 if (mdp5_kms->rpm_enabled) 652 - pm_runtime_disable(&pdev->dev); 651 + pm_runtime_disable(&mdp5_kms->pdev->dev); 653 652 654 653 drm_atomic_private_obj_fini(&mdp5_kms->glob_state); 655 654 drm_modeset_lock_fini(&mdp5_kms->glob_state_lock); ··· 798 797 goto fail; 799 798 } 800 799 801 - platform_set_drvdata(pdev, mdp5_kms); 802 - 803 800 spin_lock_init(&mdp5_kms->resource_lock); 804 801 805 802 mdp5_kms->dev = dev; ··· 837 838 * more optimal rate: 838 839 */ 839 840 clk_set_rate(mdp5_kms->core_clk, 200000000); 841 + 842 + /* set uninit-ed kms */ 843 + priv->kms = &mdp5_kms->base.base; 840 844 841 845 pm_runtime_enable(&pdev->dev); 842 846 mdp5_kms->rpm_enabled = true; ··· 892 890 if (ret) 893 891 goto fail; 894 892 895 - /* set uninit-ed kms */ 896 - priv->kms = &mdp5_kms->base.base; 897 - 898 893 return 0; 899 894 fail: 900 895 if (mdp5_kms) 901 - mdp5_destroy(pdev); 896 + mdp5_destroy(mdp5_kms); 902 897 return ret; 903 898 } 904 899 ··· 952 953 static __maybe_unused int mdp5_runtime_suspend(struct device *dev) 953 954 { 954 955 struct platform_device *pdev = to_platform_device(dev); 955 - struct mdp5_kms *mdp5_kms = platform_get_drvdata(pdev); 956 + struct msm_drm_private *priv = platform_get_drvdata(pdev); 957 + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); 956 958 957 959 DBG(""); 958 960 ··· 963 963 static __maybe_unused int mdp5_runtime_resume(struct device *dev) 964 964 { 965 965 struct platform_device *pdev = to_platform_device(dev); 966 - struct mdp5_kms *mdp5_kms = platform_get_drvdata(pdev); 966 + struct msm_drm_private *priv = platform_get_drvdata(pdev); 967 + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); 967 968 968 969 DBG(""); 969 970
+1 -11
drivers/gpu/drm/msm/dp/dp_display.c
··· 1600 1600 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev, 1601 1601 struct drm_encoder *encoder) 1602 1602 { 1603 - struct msm_drm_private *priv; 1603 + struct msm_drm_private *priv = dev->dev_private; 1604 1604 struct dp_display_private *dp_priv; 1605 1605 int ret; 1606 - 1607 - if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev)) 1608 - return -EINVAL; 1609 - 1610 - priv = dev->dev_private; 1611 - 1612 - if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) { 1613 - DRM_DEV_ERROR(dev->dev, "too many bridges\n"); 1614 - return -ENOSPC; 1615 - } 1616 1606 1617 1607 dp_display->drm_dev = dev; 1618 1608
+12 -9
drivers/gpu/drm/msm/dp/dp_link.c
··· 49 49 struct dp_link_info *link) 50 50 { 51 51 u8 value; 52 - int err; 52 + ssize_t len; 53 + int i; 53 54 54 55 if (link->revision < 0x11) 55 56 return 0; 56 57 57 - err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); 58 - if (err < 0) 59 - return err; 58 + len = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); 59 + if (len < 0) 60 + return len; 60 61 61 62 value &= ~DP_SET_POWER_MASK; 62 63 value |= DP_SET_POWER_D0; 63 64 64 - err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); 65 - if (err < 0) 66 - return err; 67 - 68 - usleep_range(1000, 2000); 65 + /* retry for 1ms to give the sink time to wake up */ 66 + for (i = 0; i < 3; i++) { 67 + len = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); 68 + usleep_range(1000, 2000); 69 + if (len == 1) 70 + break; 71 + } 69 72 70 73 return 0; 71 74 }
+1 -6
drivers/gpu/drm/msm/dsi/dsi.c
··· 211 211 int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev, 212 212 struct drm_encoder *encoder) 213 213 { 214 - struct msm_drm_private *priv; 214 + struct msm_drm_private *priv = dev->dev_private; 215 215 int ret; 216 - 217 - if (WARN_ON(!encoder) || WARN_ON(!msm_dsi) || WARN_ON(!dev)) 218 - return -EINVAL; 219 - 220 - priv = dev->dev_private; 221 216 222 217 if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) { 223 218 DRM_DEV_ERROR(dev->dev, "too many bridges\n");
+34 -85
drivers/gpu/drm/msm/dsi/dsi_host.c
··· 21 21 22 22 #include <video/mipi_display.h> 23 23 24 + #include <drm/display/drm_dsc_helper.h> 24 25 #include <drm/drm_of.h> 25 26 26 27 #include "dsi.h" ··· 34 33 35 34 #define DSI_RESET_TOGGLE_DELAY_MS 20 36 35 37 - static int dsi_populate_dsc_params(struct drm_dsc_config *dsc); 36 + static int dsi_populate_dsc_params(struct msm_dsi_host *msm_host, struct drm_dsc_config *dsc); 38 37 39 38 static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) 40 39 { ··· 843 842 static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode, u32 hdisplay) 844 843 { 845 844 struct drm_dsc_config *dsc = msm_host->dsc; 846 - u32 reg, intf_width, reg_ctrl, reg_ctrl2; 845 + u32 reg, reg_ctrl, reg_ctrl2; 847 846 u32 slice_per_intf, total_bytes_per_intf; 848 847 u32 pkt_per_line; 849 - u32 bytes_in_slice; 850 848 u32 eol_byte_num; 851 849 852 850 /* first calculate dsc parameters and then program 853 851 * compress mode registers 854 852 */ 855 - intf_width = hdisplay; 856 - slice_per_intf = DIV_ROUND_UP(intf_width, dsc->slice_width); 853 + slice_per_intf = DIV_ROUND_UP(hdisplay, dsc->slice_width); 857 854 858 855 /* If slice_per_pkt is greater than slice_per_intf 859 856 * then default to 1. This can happen during partial ··· 860 861 if (slice_per_intf > dsc->slice_count) 861 862 dsc->slice_count = 1; 862 863 863 - slice_per_intf = DIV_ROUND_UP(hdisplay, dsc->slice_width); 864 - bytes_in_slice = DIV_ROUND_UP(dsc->slice_width * dsc->bits_per_pixel, 8); 865 - 866 - dsc->slice_chunk_size = bytes_in_slice; 867 - 868 - total_bytes_per_intf = bytes_in_slice * slice_per_intf; 864 + total_bytes_per_intf = dsc->slice_chunk_size * slice_per_intf; 869 865 870 866 eol_byte_num = total_bytes_per_intf % 3; 871 867 pkt_per_line = slice_per_intf / dsc->slice_count; ··· 886 892 reg_ctrl |= reg; 887 893 888 894 reg_ctrl2 &= ~DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH__MASK; 889 - reg_ctrl2 |= DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH(bytes_in_slice); 895 + reg_ctrl2 |= DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH(dsc->slice_chunk_size); 890 896 891 897 dsi_write(msm_host, REG_DSI_COMMAND_COMPRESSION_MODE_CTRL, reg_ctrl); 892 898 dsi_write(msm_host, REG_DSI_COMMAND_COMPRESSION_MODE_CTRL2, reg_ctrl2); ··· 909 915 u32 va_end = va_start + mode->vdisplay; 910 916 u32 hdisplay = mode->hdisplay; 911 917 u32 wc; 918 + int ret; 912 919 913 920 DBG(""); 914 921 ··· 945 950 /* we do the calculations for dsc parameters here so that 946 951 * panel can use these parameters 947 952 */ 948 - dsi_populate_dsc_params(dsc); 953 + ret = dsi_populate_dsc_params(msm_host, dsc); 954 + if (ret) 955 + return; 949 956 950 957 /* Divide the display by 3 but keep back/font porch and 951 958 * pulse width same ··· 1751 1754 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -12, -12, -12, -12 1752 1755 }; 1753 1756 1754 - static int dsi_populate_dsc_params(struct drm_dsc_config *dsc) 1757 + static int dsi_populate_dsc_params(struct msm_dsi_host *msm_host, struct drm_dsc_config *dsc) 1755 1758 { 1756 - int mux_words_size; 1757 - int groups_per_line, groups_total; 1758 - int min_rate_buffer_size; 1759 - int hrd_delay; 1760 - int pre_num_extra_mux_bits, num_extra_mux_bits; 1761 - int slice_bits; 1762 - int target_bpp_x16; 1763 - int data; 1764 - int final_value, final_scale; 1765 1759 int i; 1760 + u16 bpp = dsc->bits_per_pixel >> 4; 1761 + 1762 + if (dsc->bits_per_pixel & 0xf) { 1763 + DRM_DEV_ERROR(&msm_host->pdev->dev, "DSI does not support fractional bits_per_pixel\n"); 1764 + return -EINVAL; 1765 + } 1766 + 1767 + if (dsc->bits_per_component != 8) { 1768 + DRM_DEV_ERROR(&msm_host->pdev->dev, "DSI does not support bits_per_component != 8 yet\n"); 1769 + return -EOPNOTSUPP; 1770 + } 1766 1771 1767 1772 dsc->rc_model_size = 8192; 1768 1773 dsc->first_line_bpg_offset = 12; ··· 1782 1783 for (i = 0; i < DSC_NUM_BUF_RANGES; i++) { 1783 1784 dsc->rc_range_params[i].range_min_qp = min_qp[i]; 1784 1785 dsc->rc_range_params[i].range_max_qp = max_qp[i]; 1785 - dsc->rc_range_params[i].range_bpg_offset = bpg_offset[i]; 1786 + /* 1787 + * Range BPG Offset contains two's-complement signed values that fill 1788 + * 8 bits, yet the registers and DCS PPS field are only 6 bits wide. 1789 + */ 1790 + dsc->rc_range_params[i].range_bpg_offset = bpg_offset[i] & DSC_RANGE_BPG_OFFSET_MASK; 1786 1791 } 1787 1792 1788 - dsc->initial_offset = 6144; /* Not bpp 12 */ 1789 - if (dsc->bits_per_pixel != 8) 1793 + dsc->initial_offset = 6144; /* Not bpp 12 */ 1794 + if (bpp != 8) 1790 1795 dsc->initial_offset = 2048; /* bpp = 12 */ 1791 1796 1792 - mux_words_size = 48; /* bpc == 8/10 */ 1793 - if (dsc->bits_per_component == 12) 1794 - mux_words_size = 64; 1797 + if (dsc->bits_per_component <= 10) 1798 + dsc->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC; 1799 + else 1800 + dsc->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC; 1795 1801 1796 1802 dsc->initial_xmit_delay = 512; 1797 1803 dsc->initial_scale_value = 32; ··· 1808 1804 dsc->flatness_max_qp = 12; 1809 1805 dsc->rc_quant_incr_limit0 = 11; 1810 1806 dsc->rc_quant_incr_limit1 = 11; 1811 - dsc->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC; 1812 1807 1813 - /* FIXME: need to call drm_dsc_compute_rc_parameters() so that rest of 1814 - * params are calculated 1815 - */ 1816 - groups_per_line = DIV_ROUND_UP(dsc->slice_width, 3); 1817 - dsc->slice_chunk_size = dsc->slice_width * dsc->bits_per_pixel / 8; 1818 - if ((dsc->slice_width * dsc->bits_per_pixel) % 8) 1819 - dsc->slice_chunk_size++; 1820 - 1821 - /* rbs-min */ 1822 - min_rate_buffer_size = dsc->rc_model_size - dsc->initial_offset + 1823 - dsc->initial_xmit_delay * dsc->bits_per_pixel + 1824 - groups_per_line * dsc->first_line_bpg_offset; 1825 - 1826 - hrd_delay = DIV_ROUND_UP(min_rate_buffer_size, dsc->bits_per_pixel); 1827 - 1828 - dsc->initial_dec_delay = hrd_delay - dsc->initial_xmit_delay; 1829 - 1830 - dsc->initial_scale_value = 8 * dsc->rc_model_size / 1831 - (dsc->rc_model_size - dsc->initial_offset); 1832 - 1833 - slice_bits = 8 * dsc->slice_chunk_size * dsc->slice_height; 1834 - 1835 - groups_total = groups_per_line * dsc->slice_height; 1836 - 1837 - data = dsc->first_line_bpg_offset * 2048; 1838 - 1839 - dsc->nfl_bpg_offset = DIV_ROUND_UP(data, (dsc->slice_height - 1)); 1840 - 1841 - pre_num_extra_mux_bits = 3 * (mux_words_size + (4 * dsc->bits_per_component + 4) - 2); 1842 - 1843 - num_extra_mux_bits = pre_num_extra_mux_bits - (mux_words_size - 1844 - ((slice_bits - pre_num_extra_mux_bits) % mux_words_size)); 1845 - 1846 - data = 2048 * (dsc->rc_model_size - dsc->initial_offset + num_extra_mux_bits); 1847 - dsc->slice_bpg_offset = DIV_ROUND_UP(data, groups_total); 1848 - 1849 - /* bpp * 16 + 0.5 */ 1850 - data = dsc->bits_per_pixel * 16; 1851 - data *= 2; 1852 - data++; 1853 - data /= 2; 1854 - target_bpp_x16 = data; 1855 - 1856 - data = (dsc->initial_xmit_delay * target_bpp_x16) / 16; 1857 - final_value = dsc->rc_model_size - data + num_extra_mux_bits; 1858 - dsc->final_offset = final_value; 1859 - 1860 - final_scale = 8 * dsc->rc_model_size / (dsc->rc_model_size - final_value); 1861 - 1862 - data = (final_scale - 9) * (dsc->nfl_bpg_offset + dsc->slice_bpg_offset); 1863 - dsc->scale_increment_interval = (2048 * dsc->final_offset) / data; 1864 - 1865 - dsc->scale_decrement_interval = groups_per_line / (dsc->initial_scale_value - 8); 1866 - 1867 - return 0; 1808 + return drm_dsc_compute_rc_parameters(dsc); 1868 1809 } 1869 1810 1870 1811 static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
+2
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
··· 549 549 #ifdef CONFIG_DRM_MSM_DSI_14NM_PHY 550 550 { .compatible = "qcom,dsi-phy-14nm", 551 551 .data = &dsi_phy_14nm_cfgs }, 552 + { .compatible = "qcom,dsi-phy-14nm-2290", 553 + .data = &dsi_phy_14nm_2290_cfgs }, 552 554 { .compatible = "qcom,dsi-phy-14nm-660", 553 555 .data = &dsi_phy_14nm_660_cfgs }, 554 556 { .compatible = "qcom,dsi-phy-14nm-8953",
+1
drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
··· 50 50 extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs; 51 51 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs; 52 52 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_660_cfgs; 53 + extern const struct msm_dsi_phy_cfg dsi_phy_14nm_2290_cfgs; 53 54 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_8953_cfgs; 54 55 extern const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs; 55 56 extern const struct msm_dsi_phy_cfg dsi_phy_10nm_8998_cfgs;
+17
drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
··· 1081 1081 .io_start = { 0x1a94400, 0x1a96400 }, 1082 1082 .num_dsi_phy = 2, 1083 1083 }; 1084 + 1085 + const struct msm_dsi_phy_cfg dsi_phy_14nm_2290_cfgs = { 1086 + .has_phy_lane = true, 1087 + .regulator_data = dsi_phy_14nm_17mA_regulators, 1088 + .num_regulators = ARRAY_SIZE(dsi_phy_14nm_17mA_regulators), 1089 + .ops = { 1090 + .enable = dsi_14nm_phy_enable, 1091 + .disable = dsi_14nm_phy_disable, 1092 + .pll_init = dsi_pll_14nm_init, 1093 + .save_pll_state = dsi_14nm_pll_save_state, 1094 + .restore_pll_state = dsi_14nm_pll_restore_state, 1095 + }, 1096 + .min_pll_rate = VCO_MIN_RATE, 1097 + .max_pll_rate = VCO_MAX_RATE, 1098 + .io_start = { 0x5e94400 }, 1099 + .num_dsi_phy = 1, 1100 + };
+162 -190
drivers/gpu/drm/msm/hdmi/hdmi.c
··· 68 68 destroy_workqueue(hdmi->workq); 69 69 msm_hdmi_hdcp_destroy(hdmi); 70 70 71 + if (hdmi->i2c) 72 + msm_hdmi_i2c_destroy(hdmi->i2c); 73 + } 74 + 75 + static void msm_hdmi_put_phy(struct hdmi *hdmi) 76 + { 71 77 if (hdmi->phy_dev) { 72 78 put_device(hdmi->phy_dev); 73 79 hdmi->phy = NULL; 74 80 hdmi->phy_dev = NULL; 75 81 } 76 - 77 - if (hdmi->i2c) 78 - msm_hdmi_i2c_destroy(hdmi->i2c); 79 - 80 - platform_set_drvdata(hdmi->pdev, NULL); 81 82 } 82 83 83 84 static int msm_hdmi_get_phy(struct hdmi *hdmi) ··· 94 93 } 95 94 96 95 phy_pdev = of_find_device_by_node(phy_node); 97 - if (phy_pdev) 98 - hdmi->phy = platform_get_drvdata(phy_pdev); 99 - 100 96 of_node_put(phy_node); 101 97 102 - if (!phy_pdev) { 103 - DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n"); 104 - return -EPROBE_DEFER; 105 - } 98 + if (!phy_pdev) 99 + return dev_err_probe(&pdev->dev, -EPROBE_DEFER, "phy driver is not ready\n"); 100 + 101 + hdmi->phy = platform_get_drvdata(phy_pdev); 106 102 if (!hdmi->phy) { 107 - DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n"); 108 103 put_device(&phy_pdev->dev); 109 - return -EPROBE_DEFER; 104 + return dev_err_probe(&pdev->dev, -EPROBE_DEFER, "phy driver is not ready\n"); 110 105 } 111 106 112 - hdmi->phy_dev = get_device(&phy_pdev->dev); 107 + hdmi->phy_dev = &phy_pdev->dev; 113 108 114 109 return 0; 115 110 } ··· 114 117 * we are to EPROBE_DEFER we want to do it here, rather than later 115 118 * at modeset_init() time 116 119 */ 117 - static struct hdmi *msm_hdmi_init(struct platform_device *pdev) 120 + static int msm_hdmi_init(struct hdmi *hdmi) 118 121 { 119 - struct hdmi_platform_config *config = pdev->dev.platform_data; 120 - struct hdmi *hdmi = NULL; 121 - struct resource *res; 122 - int i, ret; 123 - 124 - hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); 125 - if (!hdmi) { 126 - ret = -ENOMEM; 127 - goto fail; 128 - } 129 - 130 - hdmi->pdev = pdev; 131 - hdmi->config = config; 132 - spin_lock_init(&hdmi->reg_lock); 133 - 134 - ret = drm_of_find_panel_or_bridge(pdev->dev.of_node, 1, 0, NULL, &hdmi->next_bridge); 135 - if (ret && ret != -ENODEV) 136 - goto fail; 137 - 138 - hdmi->mmio = msm_ioremap(pdev, config->mmio_name); 139 - if (IS_ERR(hdmi->mmio)) { 140 - ret = PTR_ERR(hdmi->mmio); 141 - goto fail; 142 - } 143 - 144 - /* HDCP needs physical address of hdmi register */ 145 - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 146 - config->mmio_name); 147 - if (!res) { 148 - ret = -EINVAL; 149 - goto fail; 150 - } 151 - hdmi->mmio_phy_addr = res->start; 152 - 153 - hdmi->qfprom_mmio = msm_ioremap(pdev, config->qfprom_mmio_name); 154 - if (IS_ERR(hdmi->qfprom_mmio)) { 155 - DRM_DEV_INFO(&pdev->dev, "can't find qfprom resource\n"); 156 - hdmi->qfprom_mmio = NULL; 157 - } 158 - 159 - hdmi->hpd_regs = devm_kcalloc(&pdev->dev, 160 - config->hpd_reg_cnt, 161 - sizeof(hdmi->hpd_regs[0]), 162 - GFP_KERNEL); 163 - if (!hdmi->hpd_regs) { 164 - ret = -ENOMEM; 165 - goto fail; 166 - } 167 - for (i = 0; i < config->hpd_reg_cnt; i++) 168 - hdmi->hpd_regs[i].supply = config->hpd_reg_names[i]; 169 - 170 - ret = devm_regulator_bulk_get(&pdev->dev, config->hpd_reg_cnt, hdmi->hpd_regs); 171 - if (ret) { 172 - DRM_DEV_ERROR(&pdev->dev, "failed to get hpd regulator: %d\n", ret); 173 - goto fail; 174 - } 175 - 176 - hdmi->pwr_regs = devm_kcalloc(&pdev->dev, 177 - config->pwr_reg_cnt, 178 - sizeof(hdmi->pwr_regs[0]), 179 - GFP_KERNEL); 180 - if (!hdmi->pwr_regs) { 181 - ret = -ENOMEM; 182 - goto fail; 183 - } 184 - 185 - for (i = 0; i < config->pwr_reg_cnt; i++) 186 - hdmi->pwr_regs[i].supply = config->pwr_reg_names[i]; 187 - 188 - ret = devm_regulator_bulk_get(&pdev->dev, config->pwr_reg_cnt, hdmi->pwr_regs); 189 - if (ret) { 190 - DRM_DEV_ERROR(&pdev->dev, "failed to get pwr regulator: %d\n", ret); 191 - goto fail; 192 - } 193 - 194 - hdmi->hpd_clks = devm_kcalloc(&pdev->dev, 195 - config->hpd_clk_cnt, 196 - sizeof(hdmi->hpd_clks[0]), 197 - GFP_KERNEL); 198 - if (!hdmi->hpd_clks) { 199 - ret = -ENOMEM; 200 - goto fail; 201 - } 202 - for (i = 0; i < config->hpd_clk_cnt; i++) { 203 - struct clk *clk; 204 - 205 - clk = msm_clk_get(pdev, config->hpd_clk_names[i]); 206 - if (IS_ERR(clk)) { 207 - ret = PTR_ERR(clk); 208 - DRM_DEV_ERROR(&pdev->dev, "failed to get hpd clk: %s (%d)\n", 209 - config->hpd_clk_names[i], ret); 210 - goto fail; 211 - } 212 - 213 - hdmi->hpd_clks[i] = clk; 214 - } 215 - 216 - hdmi->pwr_clks = devm_kcalloc(&pdev->dev, 217 - config->pwr_clk_cnt, 218 - sizeof(hdmi->pwr_clks[0]), 219 - GFP_KERNEL); 220 - if (!hdmi->pwr_clks) { 221 - ret = -ENOMEM; 222 - goto fail; 223 - } 224 - for (i = 0; i < config->pwr_clk_cnt; i++) { 225 - struct clk *clk; 226 - 227 - clk = msm_clk_get(pdev, config->pwr_clk_names[i]); 228 - if (IS_ERR(clk)) { 229 - ret = PTR_ERR(clk); 230 - DRM_DEV_ERROR(&pdev->dev, "failed to get pwr clk: %s (%d)\n", 231 - config->pwr_clk_names[i], ret); 232 - goto fail; 233 - } 234 - 235 - hdmi->pwr_clks[i] = clk; 236 - } 237 - 238 - hdmi->hpd_gpiod = devm_gpiod_get_optional(&pdev->dev, "hpd", GPIOD_IN); 239 - /* This will catch e.g. -EPROBE_DEFER */ 240 - if (IS_ERR(hdmi->hpd_gpiod)) { 241 - ret = PTR_ERR(hdmi->hpd_gpiod); 242 - DRM_DEV_ERROR(&pdev->dev, "failed to get hpd gpio: (%d)\n", ret); 243 - goto fail; 244 - } 245 - 246 - if (!hdmi->hpd_gpiod) 247 - DBG("failed to get HPD gpio"); 248 - 249 - if (hdmi->hpd_gpiod) 250 - gpiod_set_consumer_name(hdmi->hpd_gpiod, "HDMI_HPD"); 251 - 252 - pm_runtime_enable(&pdev->dev); 122 + struct platform_device *pdev = hdmi->pdev; 123 + int ret; 253 124 254 125 hdmi->workq = alloc_ordered_workqueue("msm_hdmi", 0); 255 126 ··· 129 264 goto fail; 130 265 } 131 266 132 - ret = msm_hdmi_get_phy(hdmi); 133 - if (ret) { 134 - DRM_DEV_ERROR(&pdev->dev, "failed to get phy\n"); 135 - goto fail; 136 - } 137 - 138 267 hdmi->hdcp_ctrl = msm_hdmi_hdcp_init(hdmi); 139 268 if (IS_ERR(hdmi->hdcp_ctrl)) { 140 269 dev_warn(&pdev->dev, "failed to init hdcp: disabled\n"); 141 270 hdmi->hdcp_ctrl = NULL; 142 271 } 143 272 144 - return hdmi; 273 + return 0; 145 274 146 275 fail: 147 - if (hdmi) 148 - msm_hdmi_destroy(hdmi); 276 + msm_hdmi_destroy(hdmi); 149 277 150 - return ERR_PTR(ret); 278 + return ret; 151 279 } 152 280 153 281 /* Second part of initialization, the drm/kms level modeset_init, ··· 155 297 struct drm_device *dev, struct drm_encoder *encoder) 156 298 { 157 299 struct msm_drm_private *priv = dev->dev_private; 158 - struct platform_device *pdev = hdmi->pdev; 159 300 int ret; 160 301 161 302 if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) { ··· 194 337 195 338 drm_connector_attach_encoder(hdmi->connector, hdmi->encoder); 196 339 197 - hdmi->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); 198 - if (!hdmi->irq) { 199 - ret = -EINVAL; 200 - DRM_DEV_ERROR(dev->dev, "failed to get irq\n"); 201 - goto fail; 202 - } 203 - 204 340 ret = devm_request_irq(dev->dev, hdmi->irq, 205 341 msm_hdmi_irq, IRQF_TRIGGER_HIGH, 206 342 "hdmi_isr", hdmi); ··· 212 362 } 213 363 214 364 priv->bridges[priv->num_bridges++] = hdmi->bridge; 215 - 216 - platform_set_drvdata(pdev, hdmi); 217 365 218 366 return 0; 219 367 ··· 240 392 static const char *hpd_reg_names_8960[] = {"core-vdda"}; 241 393 static const char *hpd_clk_names_8960[] = {"core", "master_iface", "slave_iface"}; 242 394 243 - static struct hdmi_platform_config hdmi_tx_8960_config = { 395 + static const struct hdmi_platform_config hdmi_tx_8960_config = { 244 396 HDMI_CFG(hpd_reg, 8960), 245 397 HDMI_CFG(hpd_clk, 8960), 246 398 }; ··· 250 402 static const char *hpd_clk_names_8x74[] = {"iface", "core", "mdp_core"}; 251 403 static unsigned long hpd_clk_freq_8x74[] = {0, 19200000, 0}; 252 404 253 - static struct hdmi_platform_config hdmi_tx_8974_config = { 405 + static const struct hdmi_platform_config hdmi_tx_8974_config = { 254 406 HDMI_CFG(pwr_reg, 8x74), 255 407 HDMI_CFG(pwr_clk, 8x74), 256 408 HDMI_CFG(hpd_clk, 8x74), ··· 365 517 static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) 366 518 { 367 519 struct msm_drm_private *priv = dev_get_drvdata(master); 368 - struct hdmi_platform_config *hdmi_cfg; 369 - struct hdmi *hdmi; 370 - struct device_node *of_node = dev->of_node; 520 + struct hdmi *hdmi = dev_get_drvdata(dev); 371 521 int err; 372 522 373 - hdmi_cfg = (struct hdmi_platform_config *) 374 - of_device_get_match_data(dev); 375 - if (!hdmi_cfg) { 376 - DRM_DEV_ERROR(dev, "unknown hdmi_cfg: %pOFn\n", of_node); 377 - return -ENXIO; 378 - } 379 - 380 - hdmi_cfg->mmio_name = "core_physical"; 381 - hdmi_cfg->qfprom_mmio_name = "qfprom_physical"; 382 - 383 - dev->platform_data = hdmi_cfg; 384 - 385 - hdmi = msm_hdmi_init(to_platform_device(dev)); 386 - if (IS_ERR(hdmi)) 387 - return PTR_ERR(hdmi); 523 + err = msm_hdmi_init(hdmi); 524 + if (err) 525 + return err; 388 526 priv->hdmi = hdmi; 389 527 390 528 err = msm_hdmi_register_audio_driver(hdmi, dev); ··· 403 569 404 570 static int msm_hdmi_dev_probe(struct platform_device *pdev) 405 571 { 572 + const struct hdmi_platform_config *config; 573 + struct device *dev = &pdev->dev; 574 + struct hdmi *hdmi; 575 + struct resource *res; 576 + int i, ret; 577 + 578 + config = of_device_get_match_data(dev); 579 + if (!config) 580 + return -EINVAL; 581 + 582 + hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); 583 + if (!hdmi) 584 + return -ENOMEM; 585 + 586 + hdmi->pdev = pdev; 587 + hdmi->config = config; 588 + spin_lock_init(&hdmi->reg_lock); 589 + 590 + ret = drm_of_find_panel_or_bridge(pdev->dev.of_node, 1, 0, NULL, &hdmi->next_bridge); 591 + if (ret && ret != -ENODEV) 592 + return ret; 593 + 594 + hdmi->mmio = msm_ioremap(pdev, "core_physical"); 595 + if (IS_ERR(hdmi->mmio)) 596 + return PTR_ERR(hdmi->mmio); 597 + 598 + /* HDCP needs physical address of hdmi register */ 599 + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 600 + "core_physical"); 601 + if (!res) 602 + return -EINVAL; 603 + hdmi->mmio_phy_addr = res->start; 604 + 605 + hdmi->qfprom_mmio = msm_ioremap(pdev, "qfprom_physical"); 606 + if (IS_ERR(hdmi->qfprom_mmio)) { 607 + DRM_DEV_INFO(&pdev->dev, "can't find qfprom resource\n"); 608 + hdmi->qfprom_mmio = NULL; 609 + } 610 + 611 + hdmi->irq = platform_get_irq(pdev, 0); 612 + if (hdmi->irq < 0) 613 + return hdmi->irq; 614 + 615 + hdmi->hpd_regs = devm_kcalloc(&pdev->dev, 616 + config->hpd_reg_cnt, 617 + sizeof(hdmi->hpd_regs[0]), 618 + GFP_KERNEL); 619 + if (!hdmi->hpd_regs) 620 + return -ENOMEM; 621 + 622 + for (i = 0; i < config->hpd_reg_cnt; i++) 623 + hdmi->hpd_regs[i].supply = config->hpd_reg_names[i]; 624 + 625 + ret = devm_regulator_bulk_get(&pdev->dev, config->hpd_reg_cnt, hdmi->hpd_regs); 626 + if (ret) 627 + return dev_err_probe(dev, ret, "failed to get hpd regulators\n"); 628 + 629 + hdmi->pwr_regs = devm_kcalloc(&pdev->dev, 630 + config->pwr_reg_cnt, 631 + sizeof(hdmi->pwr_regs[0]), 632 + GFP_KERNEL); 633 + if (!hdmi->pwr_regs) 634 + return -ENOMEM; 635 + 636 + for (i = 0; i < config->pwr_reg_cnt; i++) 637 + hdmi->pwr_regs[i].supply = config->pwr_reg_names[i]; 638 + 639 + ret = devm_regulator_bulk_get(&pdev->dev, config->pwr_reg_cnt, hdmi->pwr_regs); 640 + if (ret) 641 + return dev_err_probe(dev, ret, "failed to get pwr regulators\n"); 642 + 643 + hdmi->hpd_clks = devm_kcalloc(&pdev->dev, 644 + config->hpd_clk_cnt, 645 + sizeof(hdmi->hpd_clks[0]), 646 + GFP_KERNEL); 647 + if (!hdmi->hpd_clks) 648 + return -ENOMEM; 649 + 650 + for (i = 0; i < config->hpd_clk_cnt; i++) { 651 + struct clk *clk; 652 + 653 + clk = msm_clk_get(pdev, config->hpd_clk_names[i]); 654 + if (IS_ERR(clk)) 655 + return dev_err_probe(dev, PTR_ERR(clk), 656 + "failed to get hpd clk: %s\n", 657 + config->hpd_clk_names[i]); 658 + 659 + hdmi->hpd_clks[i] = clk; 660 + } 661 + 662 + hdmi->pwr_clks = devm_kcalloc(&pdev->dev, 663 + config->pwr_clk_cnt, 664 + sizeof(hdmi->pwr_clks[0]), 665 + GFP_KERNEL); 666 + if (!hdmi->pwr_clks) 667 + return -ENOMEM; 668 + 669 + for (i = 0; i < config->pwr_clk_cnt; i++) { 670 + struct clk *clk; 671 + 672 + clk = msm_clk_get(pdev, config->pwr_clk_names[i]); 673 + if (IS_ERR(clk)) 674 + return dev_err_probe(dev, PTR_ERR(clk), 675 + "failed to get pwr clk: %s\n", 676 + config->pwr_clk_names[i]); 677 + 678 + hdmi->pwr_clks[i] = clk; 679 + } 680 + 681 + hdmi->hpd_gpiod = devm_gpiod_get_optional(&pdev->dev, "hpd", GPIOD_IN); 682 + /* This will catch e.g. -EPROBE_DEFER */ 683 + if (IS_ERR(hdmi->hpd_gpiod)) 684 + return dev_err_probe(dev, PTR_ERR(hdmi->hpd_gpiod), 685 + "failed to get hpd gpio\n"); 686 + 687 + if (!hdmi->hpd_gpiod) 688 + DBG("failed to get HPD gpio"); 689 + 690 + if (hdmi->hpd_gpiod) 691 + gpiod_set_consumer_name(hdmi->hpd_gpiod, "HDMI_HPD"); 692 + 693 + ret = msm_hdmi_get_phy(hdmi); 694 + if (ret) { 695 + DRM_DEV_ERROR(&pdev->dev, "failed to get phy\n"); 696 + return ret; 697 + } 698 + 699 + ret = devm_pm_runtime_enable(&pdev->dev); 700 + if (ret) 701 + return ret; 702 + 703 + platform_set_drvdata(pdev, hdmi); 704 + 406 705 return component_add(&pdev->dev, &msm_hdmi_ops); 407 706 } 408 707 409 708 static int msm_hdmi_dev_remove(struct platform_device *pdev) 410 709 { 710 + struct hdmi *hdmi = dev_get_drvdata(&pdev->dev); 711 + 411 712 component_del(&pdev->dev, &msm_hdmi_ops); 713 + 714 + msm_hdmi_put_phy(hdmi); 715 + 412 716 return 0; 413 717 } 414 718
-3
drivers/gpu/drm/msm/hdmi/hdmi.h
··· 86 86 87 87 /* platform config data (ie. from DT, or pdata) */ 88 88 struct hdmi_platform_config { 89 - const char *mmio_name; 90 - const char *qfprom_mmio_name; 91 - 92 89 /* regulators that need to be on for hpd: */ 93 90 const char **hpd_reg_names; 94 91 int hpd_reg_cnt;
+18 -10
drivers/gpu/drm/msm/msm_drv.c
··· 277 277 278 278 struct msm_gem_address_space *msm_kms_init_aspace(struct drm_device *dev) 279 279 { 280 - struct iommu_domain *domain; 281 280 struct msm_gem_address_space *aspace; 282 281 struct msm_mmu *mmu; 283 282 struct device *mdp_dev = dev->dev; ··· 292 293 else 293 294 iommu_dev = mdss_dev; 294 295 295 - domain = iommu_domain_alloc(iommu_dev->bus); 296 - if (!domain) { 296 + mmu = msm_iommu_new(iommu_dev, 0); 297 + if (IS_ERR(mmu)) 298 + return ERR_CAST(mmu); 299 + 300 + if (!mmu) { 297 301 drm_info(dev, "no IOMMU, fallback to phys contig buffers for scanout\n"); 298 302 return NULL; 299 303 } 300 304 301 - mmu = msm_iommu_new(iommu_dev, domain); 302 - if (IS_ERR(mmu)) { 303 - iommu_domain_free(domain); 304 - return ERR_CAST(mmu); 305 - } 306 - 307 305 aspace = msm_gem_address_space_create(mmu, "mdp_kms", 308 306 0x1000, 0x100000000 - 0x1000); 309 - if (IS_ERR(aspace)) 307 + if (IS_ERR(aspace)) { 308 + dev_err(mdp_dev, "aspace create, error %pe\n", aspace); 310 309 mmu->funcs->destroy(mmu); 310 + } 311 311 312 312 return aspace; 313 313 } ··· 817 819 case MSM_INFO_GET_OFFSET: 818 820 case MSM_INFO_GET_IOVA: 819 821 case MSM_INFO_SET_IOVA: 822 + case MSM_INFO_GET_FLAGS: 820 823 /* value returned as immediate, not pointer, so len==0: */ 821 824 if (args->len) 822 825 return -EINVAL; ··· 844 845 break; 845 846 case MSM_INFO_SET_IOVA: 846 847 ret = msm_ioctl_gem_info_set_iova(dev, file, obj, args->value); 848 + break; 849 + case MSM_INFO_GET_FLAGS: 850 + if (obj->import_attach) { 851 + ret = -EINVAL; 852 + break; 853 + } 854 + /* Hide internal kernel-only flags: */ 855 + args->value = to_msm_bo(obj)->flags & MSM_BO_FLAGS; 856 + ret = 0; 847 857 break; 848 858 case MSM_INFO_SET_NAME: 849 859 /* length check should leave room for terminating null: */
+17 -3
drivers/gpu/drm/msm/msm_iommu.c
··· 186 186 return 0; 187 187 } 188 188 189 + struct iommu_domain_geometry *msm_iommu_get_geometry(struct msm_mmu *mmu) 190 + { 191 + struct msm_iommu *iommu = to_msm_iommu(mmu); 192 + 193 + return &iommu->domain->geometry; 194 + } 195 + 189 196 static const struct msm_mmu_funcs pagetable_funcs = { 190 197 .map = msm_iommu_pagetable_map, 191 198 .unmap = msm_iommu_pagetable_unmap, ··· 374 367 .resume_translation = msm_iommu_resume_translation, 375 368 }; 376 369 377 - struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain) 370 + struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks) 378 371 { 372 + struct iommu_domain *domain; 379 373 struct msm_iommu *iommu; 380 374 int ret; 381 375 376 + domain = iommu_domain_alloc(dev->bus); 382 377 if (!domain) 383 - return ERR_PTR(-ENODEV); 378 + return NULL; 379 + 380 + iommu_set_pgtable_quirks(domain, quirks); 384 381 385 382 iommu = kzalloc(sizeof(*iommu), GFP_KERNEL); 386 - if (!iommu) 383 + if (!iommu) { 384 + iommu_domain_free(domain); 387 385 return ERR_PTR(-ENOMEM); 386 + } 388 387 389 388 iommu->domain = domain; 390 389 msm_mmu_init(&iommu->base, dev, &funcs, MSM_MMU_IOMMU); ··· 399 386 400 387 ret = iommu_attach_device(iommu->domain, dev); 401 388 if (ret) { 389 + iommu_domain_free(domain); 402 390 kfree(iommu); 403 391 return ERR_PTR(ret); 404 392 }
+77 -8
drivers/gpu/drm/msm/msm_mdss.c
··· 22 22 #define HW_REV 0x0 23 23 #define HW_INTR_STATUS 0x0010 24 24 25 + #define UBWC_DEC_HW_VERSION 0x58 25 26 #define UBWC_STATIC 0x144 26 27 #define UBWC_CTRL_2 0x150 27 28 #define UBWC_PREDICTION_MODE 0x154 ··· 175 174 return 0; 176 175 } 177 176 177 + #define UBWC_1_0 0x10000000 178 + #define UBWC_2_0 0x20000000 179 + #define UBWC_3_0 0x30000000 180 + #define UBWC_4_0 0x40000000 181 + 182 + static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss, 183 + u32 ubwc_static) 184 + { 185 + writel_relaxed(ubwc_static, msm_mdss->mmio + UBWC_STATIC); 186 + } 187 + 188 + static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss, 189 + unsigned int ubwc_version, 190 + u32 ubwc_swizzle, 191 + u32 highest_bank_bit, 192 + u32 macrotile_mode) 193 + { 194 + u32 value = (ubwc_swizzle & 0x1) | 195 + (highest_bank_bit & 0x3) << 4 | 196 + (macrotile_mode & 0x1) << 12; 197 + 198 + if (ubwc_version == UBWC_3_0) 199 + value |= BIT(10); 200 + 201 + if (ubwc_version == UBWC_1_0) 202 + value |= BIT(8); 203 + 204 + writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC); 205 + } 206 + 207 + static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss, 208 + unsigned int ubwc_version, 209 + u32 ubwc_swizzle, 210 + u32 ubwc_static, 211 + u32 highest_bank_bit, 212 + u32 macrotile_mode) 213 + { 214 + u32 value = (ubwc_swizzle & 0x7) | 215 + (ubwc_static & 0x1) << 3 | 216 + (highest_bank_bit & 0x7) << 4 | 217 + (macrotile_mode & 0x1) << 12; 218 + 219 + writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC); 220 + 221 + if (ubwc_version == UBWC_3_0) { 222 + writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2); 223 + writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE); 224 + } else { 225 + writel_relaxed(2, msm_mdss->mmio + UBWC_CTRL_2); 226 + writel_relaxed(1, msm_mdss->mmio + UBWC_PREDICTION_MODE); 227 + } 228 + } 229 + 178 230 static int msm_mdss_enable(struct msm_mdss *msm_mdss) 179 231 { 180 232 int ret; 233 + u32 hw_rev; 181 234 182 235 /* 183 236 * Several components have AXI clocks that can only be turned on if ··· 253 198 if (msm_mdss->is_mdp5) 254 199 return 0; 255 200 201 + hw_rev = readl_relaxed(msm_mdss->mmio + HW_REV); 202 + dev_dbg(msm_mdss->dev, "HW_REV: 0x%x\n", hw_rev); 203 + dev_dbg(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n", 204 + readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION)); 205 + 256 206 /* 257 207 * ubwc config is part of the "mdss" region which is not accessible 258 208 * from the rest of the driver. hardcode known configurations here 209 + * 210 + * Decoder version can be read from the UBWC_DEC_HW_VERSION reg, 211 + * UBWC_n and the rest of params comes from hw_catalog. 212 + * Unforunately this driver can not access hw catalog, so we have to 213 + * hardcode them here. 259 214 */ 260 - switch (readl_relaxed(msm_mdss->mmio + HW_REV)) { 215 + switch (hw_rev) { 261 216 case DPU_HW_VER_500: 262 217 case DPU_HW_VER_501: 263 - writel_relaxed(0x420, msm_mdss->mmio + UBWC_STATIC); 218 + msm_mdss_setup_ubwc_dec_30(msm_mdss, UBWC_3_0, 0, 2, 0); 264 219 break; 265 220 case DPU_HW_VER_600: 266 - /* TODO: 0x102e for LP_DDR4 */ 267 - writel_relaxed(0x103e, msm_mdss->mmio + UBWC_STATIC); 268 - writel_relaxed(2, msm_mdss->mmio + UBWC_CTRL_2); 269 - writel_relaxed(1, msm_mdss->mmio + UBWC_PREDICTION_MODE); 221 + /* TODO: highest_bank_bit = 2 for LP_DDR4 */ 222 + msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); 270 223 break; 271 224 case DPU_HW_VER_620: 272 - writel_relaxed(0x1e, msm_mdss->mmio + UBWC_STATIC); 225 + /* UBWC_2_0 */ 226 + msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x1e); 227 + break; 228 + case DPU_HW_VER_630: 229 + /* UBWC_2_0 */ 230 + msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x11f); 273 231 break; 274 232 case DPU_HW_VER_720: 275 - writel_relaxed(0x101e, msm_mdss->mmio + UBWC_STATIC); 233 + msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_3_0, 6, 1, 1, 1); 276 234 break; 277 235 } 278 236 ··· 513 445 { .compatible = "qcom,sc7180-mdss" }, 514 446 { .compatible = "qcom,sc7280-mdss" }, 515 447 { .compatible = "qcom,sc8180x-mdss" }, 448 + { .compatible = "qcom,sm6115-mdss" }, 516 449 { .compatible = "qcom,sm8150-mdss" }, 517 450 { .compatible = "qcom,sm8250-mdss" }, 518 451 {}
+2 -1
drivers/gpu/drm/msm/msm_mmu.h
··· 40 40 mmu->type = type; 41 41 } 42 42 43 - struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain); 43 + struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks); 44 44 struct msm_mmu *msm_gpummu_new(struct device *dev, struct msm_gpu *gpu); 45 45 46 46 static inline void msm_mmu_set_fault_handler(struct msm_mmu *mmu, void *arg, ··· 58 58 59 59 int msm_iommu_pagetable_params(struct msm_mmu *mmu, phys_addr_t *ttbr, 60 60 int *asid); 61 + struct iommu_domain_geometry *msm_iommu_get_geometry(struct msm_mmu *mmu); 61 62 62 63 #endif /* __MSM_MMU_H__ */
+1
include/uapi/drm/msm_drm.h
··· 138 138 #define MSM_INFO_SET_NAME 0x02 /* set the debug name (by pointer) */ 139 139 #define MSM_INFO_GET_NAME 0x03 /* get debug name, returned by pointer */ 140 140 #define MSM_INFO_SET_IOVA 0x04 /* set the iova, passed by value */ 141 + #define MSM_INFO_GET_FLAGS 0x05 /* get the MSM_BO_x flags */ 141 142 142 143 struct drm_msm_gem_info { 143 144 __u32 handle; /* in */