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

Merge tag 'drm-msm-next-2023-04-10' of https://gitlab.freedesktop.org/drm/msm into drm-next

main pull request for v6.4

Core Display:
============
* Bugfixes for error handling during probe
* rework UBWC decoder programming
* prepare_commit cleanup
* bindings for SM8550 (MDSS, DPU), SM8450 (DP)
* timeout calculation fixup
* atomic: use drm_crtc_next_vblank_start() instead of our own
custom thing to calculate the start of next vblank

DP:
==
* interrupts cleanup

DPU:
===
* DSPP sub-block flush on sc7280
* support AR30 in addition to XR30 format
* Allow using REC_0 and REC_1 to handle wide (4k) RGB planes
* Split the HW catalog into individual per-SoC files

DSI:
===
* rework DSI instance ID detection on obscure platforms

GPU:
===
* uapi C++ compatibility fix
* a6xx: More robust gdsc reset
* a3xx and a4xx devfreq support
* update generated headers
* various cleanups and fixes
* GPU and GEM updates to avoid allocations which could trigger
reclaim (shrinker) in fence signaling path
* dma-fence deadline hint support and wait-boost
* a640 speedbin support
* a650 speedbin support

Conflicts in drivers/gpu/drm/msm/adreno/adreno_gpu.c:

Conflict between the 7fa5047a436b ("drm: Use of_property_present() for
testing DT property presence") and 9f251f934012 ("drm/msm/adreno: Use
OPP for every GPU generation"). The latter removed the of_ function
call outright, so I went with what's in the PR unchanged.

From: Rob Clark <robdclark@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/CAF6AEGvwuj5tabyW910+N-B=5kFNAC7QNYoQ=0xi3roBjQvFFQ@mail.gmail.com
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>

+7023 -4512
+15 -10
Documentation/devicetree/bindings/display/msm/dp-controller.yaml
··· 15 15 16 16 properties: 17 17 compatible: 18 - enum: 19 - - qcom,sc7180-dp 20 - - qcom,sc7280-dp 21 - - qcom,sc7280-edp 22 - - qcom,sc8180x-dp 23 - - qcom,sc8180x-edp 24 - - qcom,sc8280xp-dp 25 - - qcom,sc8280xp-edp 26 - - qcom,sdm845-dp 27 - - qcom,sm8350-dp 18 + oneOf: 19 + - enum: 20 + - qcom,sc7180-dp 21 + - qcom,sc7280-dp 22 + - qcom,sc7280-edp 23 + - qcom,sc8180x-dp 24 + - qcom,sc8180x-edp 25 + - qcom,sc8280xp-dp 26 + - qcom,sc8280xp-edp 27 + - qcom,sdm845-dp 28 + - qcom,sm8350-dp 29 + - items: 30 + - enum: 31 + - qcom,sm8450-dp 32 + - const: qcom,sm8350-dp 28 33 29 34 reg: 30 35 minItems: 4
+5 -4
Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
··· 25 25 - qcom,sc7280-dsi-ctrl 26 26 - qcom,sdm660-dsi-ctrl 27 27 - qcom,sdm845-dsi-ctrl 28 + - qcom,sm6115-dsi-ctrl 28 29 - qcom,sm8150-dsi-ctrl 29 30 - qcom,sm8250-dsi-ctrl 30 31 - qcom,sm8350-dsi-ctrl 31 32 - qcom,sm8450-dsi-ctrl 32 33 - qcom,sm8550-dsi-ctrl 33 34 - const: qcom,mdss-dsi-ctrl 34 - - items: 35 - - enum: 36 - - dsi-ctrl-6g-qcm2290 37 - - const: qcom,mdss-dsi-ctrl 35 + - enum: 36 + - qcom,dsi-ctrl-6g-qcm2290 37 + - qcom,mdss-dsi-ctrl # This should always come with an SoC-specific compatible 38 38 deprecated: true 39 39 40 40 reg: ··· 351 351 contains: 352 352 enum: 353 353 - qcom,sdm845-dsi-ctrl 354 + - qcom,sm6115-dsi-ctrl 354 355 then: 355 356 properties: 356 357 clocks:
+8 -2
Documentation/devicetree/bindings/display/msm/qcom,sm6115-mdss.yaml
··· 40 40 type: object 41 41 properties: 42 42 compatible: 43 - const: qcom,dsi-ctrl-6g-qcm2290 43 + oneOf: 44 + - items: 45 + - const: qcom,sm6115-dsi-ctrl 46 + - const: qcom,mdss-dsi-ctrl 47 + - description: Old binding, please don't use 48 + deprecated: true 49 + const: qcom,dsi-ctrl-6g-qcm2290 44 50 45 51 "^phy@[0-9a-f]+$": 46 52 type: object ··· 120 114 }; 121 115 122 116 dsi@5e94000 { 123 - compatible = "qcom,dsi-ctrl-6g-qcm2290"; 117 + compatible = "qcom,sm6115-dsi-ctrl", "qcom,mdss-dsi-ctrl"; 124 118 reg = <0x05e94000 0x400>; 125 119 reg-names = "dsi_ctrl"; 126 120
+3 -3
Documentation/devicetree/bindings/display/msm/qcom,sm8450-mdss.yaml
··· 54 54 type: object 55 55 properties: 56 56 compatible: 57 - const: qcom,dsi-phy-5nm-8450 57 + const: qcom,sm8450-dsi-phy-5nm 58 58 59 59 required: 60 60 - compatible ··· 254 254 }; 255 255 256 256 dsi0_phy: phy@ae94400 { 257 - compatible = "qcom,dsi-phy-5nm-8450"; 257 + compatible = "qcom,sm8450-dsi-phy-5nm"; 258 258 reg = <0x0ae94400 0x200>, 259 259 <0x0ae94600 0x280>, 260 260 <0x0ae94900 0x260>; ··· 325 325 }; 326 326 327 327 dsi1_phy: phy@ae96400 { 328 - compatible = "qcom,dsi-phy-5nm-8450"; 328 + compatible = "qcom,sm8450-dsi-phy-5nm"; 329 329 reg = <0x0ae96400 0x200>, 330 330 <0x0ae96600 0x280>, 331 331 <0x0ae96900 0x260>;
+133
Documentation/devicetree/bindings/display/msm/qcom,sm8550-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,sm8550-dpu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM8550 Display DPU 8 + 9 + maintainers: 10 + - Neil Armstrong <neil.armstrong@linaro.org> 11 + 12 + $ref: /schemas/display/msm/dpu-common.yaml# 13 + 14 + properties: 15 + compatible: 16 + const: qcom,sm8550-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 31 + - description: Display hf axi 32 + - description: Display MDSS ahb 33 + - description: Display lut 34 + - description: Display core 35 + - description: Display vsync 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 + required: 47 + - compatible 48 + - reg 49 + - reg-names 50 + - clocks 51 + - clock-names 52 + 53 + unevaluatedProperties: false 54 + 55 + examples: 56 + - | 57 + #include <dt-bindings/clock/qcom,sm8550-dispcc.h> 58 + #include <dt-bindings/clock/qcom,sm8550-gcc.h> 59 + #include <dt-bindings/interrupt-controller/arm-gic.h> 60 + #include <dt-bindings/power/qcom-rpmpd.h> 61 + 62 + display-controller@ae01000 { 63 + compatible = "qcom,sm8550-dpu"; 64 + reg = <0x0ae01000 0x8f000>, 65 + <0x0aeb0000 0x2008>; 66 + reg-names = "mdp", "vbif"; 67 + 68 + clocks = <&gcc GCC_DISP_AHB_CLK>, 69 + <&gcc GCC_DISP_HF_AXI_CLK>, 70 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 71 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 72 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 73 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 74 + clock-names = "bus", 75 + "nrt_bus", 76 + "iface", 77 + "lut", 78 + "core", 79 + "vsync"; 80 + 81 + assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 82 + assigned-clock-rates = <19200000>; 83 + 84 + operating-points-v2 = <&mdp_opp_table>; 85 + power-domains = <&rpmhpd SM8550_MMCX>; 86 + 87 + interrupt-parent = <&mdss>; 88 + interrupts = <0>; 89 + 90 + ports { 91 + #address-cells = <1>; 92 + #size-cells = <0>; 93 + 94 + port@0 { 95 + reg = <0>; 96 + dpu_intf1_out: endpoint { 97 + remote-endpoint = <&dsi0_in>; 98 + }; 99 + }; 100 + 101 + port@1 { 102 + reg = <1>; 103 + dpu_intf2_out: endpoint { 104 + remote-endpoint = <&dsi1_in>; 105 + }; 106 + }; 107 + }; 108 + 109 + mdp_opp_table: opp-table { 110 + compatible = "operating-points-v2"; 111 + 112 + opp-200000000 { 113 + opp-hz = /bits/ 64 <200000000>; 114 + required-opps = <&rpmhpd_opp_low_svs>; 115 + }; 116 + 117 + opp-325000000 { 118 + opp-hz = /bits/ 64 <325000000>; 119 + required-opps = <&rpmhpd_opp_svs>; 120 + }; 121 + 122 + opp-375000000 { 123 + opp-hz = /bits/ 64 <375000000>; 124 + required-opps = <&rpmhpd_opp_svs_l1>; 125 + }; 126 + 127 + opp-514000000 { 128 + opp-hz = /bits/ 64 <514000000>; 129 + required-opps = <&rpmhpd_opp_nom>; 130 + }; 131 + }; 132 + }; 133 + ...
+333
Documentation/devicetree/bindings/display/msm/qcom,sm8550-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,sm8550-mdss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM8550 Display MDSS 8 + 9 + maintainers: 10 + - Neil Armstrong <neil.armstrong@linaro.org> 11 + 12 + description: 13 + SM8550 MSM Mobile Display Subsystem(MDSS), which encapsulates sub-blocks like 14 + DPU display controller, DSI and DP interfaces etc. 15 + 16 + $ref: /schemas/display/msm/mdss-common.yaml# 17 + 18 + properties: 19 + compatible: 20 + const: qcom,sm8550-mdss 21 + 22 + clocks: 23 + items: 24 + - description: Display MDSS AHB 25 + - description: Display AHB 26 + - description: Display hf AXI 27 + - description: Display core 28 + 29 + iommus: 30 + maxItems: 1 31 + 32 + interconnects: 33 + maxItems: 2 34 + 35 + interconnect-names: 36 + maxItems: 2 37 + 38 + patternProperties: 39 + "^display-controller@[0-9a-f]+$": 40 + type: object 41 + properties: 42 + compatible: 43 + const: qcom,sm8550-dpu 44 + 45 + "^dsi@[0-9a-f]+$": 46 + type: object 47 + properties: 48 + compatible: 49 + items: 50 + - const: qcom,sm8550-dsi-ctrl 51 + - const: qcom,mdss-dsi-ctrl 52 + 53 + "^phy@[0-9a-f]+$": 54 + type: object 55 + properties: 56 + compatible: 57 + const: qcom,sm8550-dsi-phy-4nm 58 + 59 + required: 60 + - compatible 61 + 62 + unevaluatedProperties: false 63 + 64 + examples: 65 + - | 66 + #include <dt-bindings/clock/qcom,sm8550-dispcc.h> 67 + #include <dt-bindings/clock/qcom,sm8550-gcc.h> 68 + #include <dt-bindings/clock/qcom,rpmh.h> 69 + #include <dt-bindings/interrupt-controller/arm-gic.h> 70 + #include <dt-bindings/interconnect/qcom,sm8550-rpmh.h> 71 + #include <dt-bindings/power/qcom-rpmpd.h> 72 + 73 + display-subsystem@ae00000 { 74 + compatible = "qcom,sm8550-mdss"; 75 + reg = <0x0ae00000 0x1000>; 76 + reg-names = "mdss"; 77 + 78 + interconnects = <&mmss_noc MASTER_MDP 0 &gem_noc SLAVE_LLCC 0>, 79 + <&mc_virt MASTER_LLCC 0 &mc_virt SLAVE_EBI1 0>; 80 + interconnect-names = "mdp0-mem", "mdp1-mem"; 81 + 82 + resets = <&dispcc DISP_CC_MDSS_CORE_BCR>; 83 + 84 + power-domains = <&dispcc MDSS_GDSC>; 85 + 86 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 87 + <&gcc GCC_DISP_AHB_CLK>, 88 + <&gcc GCC_DISP_HF_AXI_CLK>, 89 + <&dispcc DISP_CC_MDSS_MDP_CLK>; 90 + clock-names = "iface", "bus", "nrt_bus", "core"; 91 + 92 + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; 93 + interrupt-controller; 94 + #interrupt-cells = <1>; 95 + 96 + iommus = <&apps_smmu 0x1c00 0x2>; 97 + 98 + #address-cells = <1>; 99 + #size-cells = <1>; 100 + ranges; 101 + 102 + display-controller@ae01000 { 103 + compatible = "qcom,sm8550-dpu"; 104 + reg = <0x0ae01000 0x8f000>, 105 + <0x0aeb0000 0x2008>; 106 + reg-names = "mdp", "vbif"; 107 + 108 + clocks = <&gcc GCC_DISP_AHB_CLK>, 109 + <&gcc GCC_DISP_HF_AXI_CLK>, 110 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 111 + <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>, 112 + <&dispcc DISP_CC_MDSS_MDP_CLK>, 113 + <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 114 + clock-names = "bus", 115 + "nrt_bus", 116 + "iface", 117 + "lut", 118 + "core", 119 + "vsync"; 120 + 121 + assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>; 122 + assigned-clock-rates = <19200000>; 123 + 124 + operating-points-v2 = <&mdp_opp_table>; 125 + power-domains = <&rpmhpd SM8550_MMCX>; 126 + 127 + interrupt-parent = <&mdss>; 128 + interrupts = <0>; 129 + 130 + ports { 131 + #address-cells = <1>; 132 + #size-cells = <0>; 133 + 134 + port@0 { 135 + reg = <0>; 136 + dpu_intf1_out: endpoint { 137 + remote-endpoint = <&dsi0_in>; 138 + }; 139 + }; 140 + 141 + port@1 { 142 + reg = <1>; 143 + dpu_intf2_out: endpoint { 144 + remote-endpoint = <&dsi1_in>; 145 + }; 146 + }; 147 + }; 148 + 149 + mdp_opp_table: opp-table { 150 + compatible = "operating-points-v2"; 151 + 152 + opp-200000000 { 153 + opp-hz = /bits/ 64 <200000000>; 154 + required-opps = <&rpmhpd_opp_low_svs>; 155 + }; 156 + 157 + opp-325000000 { 158 + opp-hz = /bits/ 64 <325000000>; 159 + required-opps = <&rpmhpd_opp_svs>; 160 + }; 161 + 162 + opp-375000000 { 163 + opp-hz = /bits/ 64 <375000000>; 164 + required-opps = <&rpmhpd_opp_svs_l1>; 165 + }; 166 + 167 + opp-514000000 { 168 + opp-hz = /bits/ 64 <514000000>; 169 + required-opps = <&rpmhpd_opp_nom>; 170 + }; 171 + }; 172 + }; 173 + 174 + dsi@ae94000 { 175 + compatible = "qcom,sm8550-dsi-ctrl", "qcom,mdss-dsi-ctrl"; 176 + reg = <0x0ae94000 0x400>; 177 + reg-names = "dsi_ctrl"; 178 + 179 + interrupt-parent = <&mdss>; 180 + interrupts = <4>; 181 + 182 + clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>, 183 + <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>, 184 + <&dispcc DISP_CC_MDSS_PCLK0_CLK>, 185 + <&dispcc DISP_CC_MDSS_ESC0_CLK>, 186 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 187 + <&gcc GCC_DISP_HF_AXI_CLK>; 188 + clock-names = "byte", 189 + "byte_intf", 190 + "pixel", 191 + "core", 192 + "iface", 193 + "bus"; 194 + 195 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>, 196 + <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>; 197 + assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 198 + 199 + operating-points-v2 = <&dsi_opp_table>; 200 + power-domains = <&rpmhpd SM8550_MMCX>; 201 + 202 + phys = <&dsi0_phy>; 203 + phy-names = "dsi"; 204 + 205 + #address-cells = <1>; 206 + #size-cells = <0>; 207 + 208 + ports { 209 + #address-cells = <1>; 210 + #size-cells = <0>; 211 + 212 + port@0 { 213 + reg = <0>; 214 + dsi0_in: endpoint { 215 + remote-endpoint = <&dpu_intf1_out>; 216 + }; 217 + }; 218 + 219 + port@1 { 220 + reg = <1>; 221 + dsi0_out: endpoint { 222 + }; 223 + }; 224 + }; 225 + 226 + dsi_opp_table: opp-table { 227 + compatible = "operating-points-v2"; 228 + 229 + opp-187500000 { 230 + opp-hz = /bits/ 64 <187500000>; 231 + required-opps = <&rpmhpd_opp_low_svs>; 232 + }; 233 + 234 + opp-300000000 { 235 + opp-hz = /bits/ 64 <300000000>; 236 + required-opps = <&rpmhpd_opp_svs>; 237 + }; 238 + 239 + opp-358000000 { 240 + opp-hz = /bits/ 64 <358000000>; 241 + required-opps = <&rpmhpd_opp_svs_l1>; 242 + }; 243 + }; 244 + }; 245 + 246 + dsi0_phy: phy@ae94400 { 247 + compatible = "qcom,sm8550-dsi-phy-4nm"; 248 + reg = <0x0ae95000 0x200>, 249 + <0x0ae95200 0x280>, 250 + <0x0ae95500 0x400>; 251 + reg-names = "dsi_phy", 252 + "dsi_phy_lane", 253 + "dsi_pll"; 254 + 255 + #clock-cells = <1>; 256 + #phy-cells = <0>; 257 + 258 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 259 + <&rpmhcc RPMH_CXO_CLK>; 260 + clock-names = "iface", "ref"; 261 + }; 262 + 263 + dsi@ae96000 { 264 + compatible = "qcom,sm8550-dsi-ctrl", "qcom,mdss-dsi-ctrl"; 265 + reg = <0x0ae96000 0x400>; 266 + reg-names = "dsi_ctrl"; 267 + 268 + interrupt-parent = <&mdss>; 269 + interrupts = <5>; 270 + 271 + clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK>, 272 + <&dispcc DISP_CC_MDSS_BYTE1_INTF_CLK>, 273 + <&dispcc DISP_CC_MDSS_PCLK1_CLK>, 274 + <&dispcc DISP_CC_MDSS_ESC1_CLK>, 275 + <&dispcc DISP_CC_MDSS_AHB_CLK>, 276 + <&gcc GCC_DISP_HF_AXI_CLK>; 277 + clock-names = "byte", 278 + "byte_intf", 279 + "pixel", 280 + "core", 281 + "iface", 282 + "bus"; 283 + 284 + assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE1_CLK_SRC>, 285 + <&dispcc DISP_CC_MDSS_PCLK1_CLK_SRC>; 286 + assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 287 + 288 + operating-points-v2 = <&dsi_opp_table>; 289 + power-domains = <&rpmhpd SM8550_MMCX>; 290 + 291 + phys = <&dsi1_phy>; 292 + phy-names = "dsi"; 293 + 294 + #address-cells = <1>; 295 + #size-cells = <0>; 296 + 297 + ports { 298 + #address-cells = <1>; 299 + #size-cells = <0>; 300 + 301 + port@0 { 302 + reg = <0>; 303 + dsi1_in: endpoint { 304 + remote-endpoint = <&dpu_intf2_out>; 305 + }; 306 + }; 307 + 308 + port@1 { 309 + reg = <1>; 310 + dsi1_out: endpoint { 311 + }; 312 + }; 313 + }; 314 + }; 315 + 316 + dsi1_phy: phy@ae96400 { 317 + compatible = "qcom,sm8550-dsi-phy-4nm"; 318 + reg = <0x0ae97000 0x200>, 319 + <0x0ae97200 0x280>, 320 + <0x0ae97500 0x400>; 321 + reg-names = "dsi_phy", 322 + "dsi_phy_lane", 323 + "dsi_pll"; 324 + 325 + #clock-cells = <1>; 326 + #phy-cells = <0>; 327 + 328 + clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, 329 + <&rpmhcc RPMH_CXO_CLK>; 330 + clock-names = "iface", "ref"; 331 + }; 332 + }; 333 + ...
+1
MAINTAINERS
··· 6518 6518 L: dri-devel@lists.freedesktop.org 6519 6519 L: freedreno@lists.freedesktop.org 6520 6520 S: Maintained 6521 + B: https://gitlab.freedesktop.org/drm/msm/-/issues 6521 6522 T: git https://gitlab.freedesktop.org/drm/msm.git 6522 6523 F: Documentation/devicetree/bindings/display/msm/ 6523 6524 F: drivers/gpu/drm/msm/
+60 -8
drivers/gpu/drm/bridge/panel.c
··· 111 111 drm_connector_cleanup(connector); 112 112 } 113 113 114 - static void panel_bridge_pre_enable(struct drm_bridge *bridge) 114 + static void panel_bridge_atomic_pre_enable(struct drm_bridge *bridge, 115 + struct drm_bridge_state *old_bridge_state) 115 116 { 116 117 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 118 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 119 + struct drm_encoder *encoder = bridge->encoder; 120 + struct drm_crtc *crtc; 121 + struct drm_crtc_state *old_crtc_state; 122 + 123 + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); 124 + if (!crtc) 125 + return; 126 + 127 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 128 + if (old_crtc_state && old_crtc_state->self_refresh_active) 129 + return; 117 130 118 131 drm_panel_prepare(panel_bridge->panel); 119 132 } 120 133 121 - static void panel_bridge_enable(struct drm_bridge *bridge) 134 + static void panel_bridge_atomic_enable(struct drm_bridge *bridge, 135 + struct drm_bridge_state *old_bridge_state) 122 136 { 123 137 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 138 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 139 + struct drm_encoder *encoder = bridge->encoder; 140 + struct drm_crtc *crtc; 141 + struct drm_crtc_state *old_crtc_state; 142 + 143 + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); 144 + if (!crtc) 145 + return; 146 + 147 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 148 + if (old_crtc_state && old_crtc_state->self_refresh_active) 149 + return; 124 150 125 151 drm_panel_enable(panel_bridge->panel); 126 152 } 127 153 128 - static void panel_bridge_disable(struct drm_bridge *bridge) 154 + static void panel_bridge_atomic_disable(struct drm_bridge *bridge, 155 + struct drm_bridge_state *old_bridge_state) 129 156 { 130 157 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 158 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 159 + struct drm_encoder *encoder = bridge->encoder; 160 + struct drm_crtc *crtc; 161 + struct drm_crtc_state *new_crtc_state; 162 + 163 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); 164 + if (!crtc) 165 + return; 166 + 167 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 168 + if (new_crtc_state && new_crtc_state->self_refresh_active) 169 + return; 131 170 132 171 drm_panel_disable(panel_bridge->panel); 133 172 } 134 173 135 - static void panel_bridge_post_disable(struct drm_bridge *bridge) 174 + static void panel_bridge_atomic_post_disable(struct drm_bridge *bridge, 175 + struct drm_bridge_state *old_bridge_state) 136 176 { 137 177 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 178 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 179 + struct drm_encoder *encoder = bridge->encoder; 180 + struct drm_crtc *crtc; 181 + struct drm_crtc_state *new_crtc_state; 182 + 183 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); 184 + if (!crtc) 185 + return; 186 + 187 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 188 + if (new_crtc_state && new_crtc_state->self_refresh_active) 189 + return; 138 190 139 191 drm_panel_unprepare(panel_bridge->panel); 140 192 } ··· 213 161 static const struct drm_bridge_funcs panel_bridge_bridge_funcs = { 214 162 .attach = panel_bridge_attach, 215 163 .detach = panel_bridge_detach, 216 - .pre_enable = panel_bridge_pre_enable, 217 - .enable = panel_bridge_enable, 218 - .disable = panel_bridge_disable, 219 - .post_disable = panel_bridge_post_disable, 164 + .atomic_pre_enable = panel_bridge_atomic_pre_enable, 165 + .atomic_enable = panel_bridge_atomic_enable, 166 + .atomic_disable = panel_bridge_atomic_disable, 167 + .atomic_post_disable = panel_bridge_atomic_post_disable, 220 168 .get_modes = panel_bridge_get_modes, 221 169 .atomic_reset = drm_atomic_helper_bridge_reset, 222 170 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
+60
drivers/gpu/drm/drm_atomic.c
··· 985 985 EXPORT_SYMBOL(drm_atomic_get_new_connector_for_encoder); 986 986 987 987 /** 988 + * drm_atomic_get_old_crtc_for_encoder - Get old crtc for an encoder 989 + * @state: Atomic state 990 + * @encoder: The encoder to fetch the crtc state for 991 + * 992 + * This function finds and returns the crtc that was connected to @encoder 993 + * as specified by the @state. 994 + * 995 + * Returns: The old crtc connected to @encoder, or NULL if the encoder is 996 + * not connected. 997 + */ 998 + struct drm_crtc * 999 + drm_atomic_get_old_crtc_for_encoder(struct drm_atomic_state *state, 1000 + struct drm_encoder *encoder) 1001 + { 1002 + struct drm_connector *connector; 1003 + struct drm_connector_state *conn_state; 1004 + 1005 + connector = drm_atomic_get_old_connector_for_encoder(state, encoder); 1006 + if (!connector) 1007 + return NULL; 1008 + 1009 + conn_state = drm_atomic_get_old_connector_state(state, connector); 1010 + if (!conn_state) 1011 + return NULL; 1012 + 1013 + return conn_state->crtc; 1014 + } 1015 + EXPORT_SYMBOL(drm_atomic_get_old_crtc_for_encoder); 1016 + 1017 + /** 1018 + * drm_atomic_get_new_crtc_for_encoder - Get new crtc for an encoder 1019 + * @state: Atomic state 1020 + * @encoder: The encoder to fetch the crtc state for 1021 + * 1022 + * This function finds and returns the crtc that will be connected to @encoder 1023 + * as specified by the @state. 1024 + * 1025 + * Returns: The new crtc connected to @encoder, or NULL if the encoder is 1026 + * not connected. 1027 + */ 1028 + struct drm_crtc * 1029 + drm_atomic_get_new_crtc_for_encoder(struct drm_atomic_state *state, 1030 + struct drm_encoder *encoder) 1031 + { 1032 + struct drm_connector *connector; 1033 + struct drm_connector_state *conn_state; 1034 + 1035 + connector = drm_atomic_get_new_connector_for_encoder(state, encoder); 1036 + if (!connector) 1037 + return NULL; 1038 + 1039 + conn_state = drm_atomic_get_new_connector_state(state, connector); 1040 + if (!conn_state) 1041 + return NULL; 1042 + 1043 + return conn_state->crtc; 1044 + } 1045 + EXPORT_SYMBOL(drm_atomic_get_new_crtc_for_encoder); 1046 + 1047 + /** 988 1048 * drm_atomic_get_connector_state - get connector state 989 1049 * @state: global atomic state object 990 1050 * @connector: connector to get state object for
+10 -1
drivers/gpu/drm/drm_gem.c
··· 1337 1337 } 1338 1338 EXPORT_SYMBOL(drm_gem_lru_remove); 1339 1339 1340 - static void 1340 + /** 1341 + * drm_gem_lru_move_tail_locked - move the object to the tail of the LRU 1342 + * 1343 + * Like &drm_gem_lru_move_tail but lru lock must be held 1344 + * 1345 + * @lru: The LRU to move the object into. 1346 + * @obj: The GEM object to move into this LRU 1347 + */ 1348 + void 1341 1349 drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_object *obj) 1342 1350 { 1343 1351 lockdep_assert_held_once(lru->lock); ··· 1357 1349 list_add_tail(&obj->lru_node, &lru->list); 1358 1350 obj->lru = lru; 1359 1351 } 1352 + EXPORT_SYMBOL(drm_gem_lru_move_tail_locked); 1360 1353 1361 1354 /** 1362 1355 * drm_gem_lru_move_tail - move the object to the tail of the LRU
+2
drivers/gpu/drm/msm/Kconfig
··· 9 9 depends on QCOM_OCMEM || QCOM_OCMEM=n 10 10 depends on QCOM_LLCC || QCOM_LLCC=n 11 11 depends on QCOM_COMMAND_DB || QCOM_COMMAND_DB=n 12 + depends on PM 12 13 select IOMMU_IO_PGTABLE 13 14 select QCOM_MDT_LOADER if ARCH_QCOM 14 15 select REGULATOR ··· 29 28 select SYNC_FILE 30 29 select PM_OPP 31 30 select NVMEM 31 + select PM_GENERIC_DOMAINS 32 32 help 33 33 DRM/KMS driver for MSM/snapdragon. 34 34
+38 -14
drivers/gpu/drm/msm/adreno/a2xx.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2021 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28 ··· 1060 1060 AXI_TOTAL_READ_REQUEST_DATA_BEATS = 181, 1061 1061 }; 1062 1062 1063 + enum perf_mode_cnt { 1064 + PERF_STATE_RESET = 0, 1065 + PERF_STATE_ENABLE = 1, 1066 + PERF_STATE_FREEZE = 2, 1067 + }; 1068 + 1063 1069 enum adreno_mmu_clnt_beh { 1064 1070 BEH_NEVR = 0, 1065 1071 BEH_TRAN_RNG = 1, ··· 1313 1307 #define A2XX_RBBM_PM_OVERRIDE1_MH_TCROQ_SCLK_PM_OVERRIDE 0x80000000 1314 1308 1315 1309 #define REG_A2XX_RBBM_PM_OVERRIDE2 0x0000039d 1310 + #define A2XX_RBBM_PM_OVERRIDE2_PA_REG_SCLK_PM_OVERRIDE 0x00000001 1311 + #define A2XX_RBBM_PM_OVERRIDE2_PA_PA_SCLK_PM_OVERRIDE 0x00000002 1312 + #define A2XX_RBBM_PM_OVERRIDE2_PA_AG_SCLK_PM_OVERRIDE 0x00000004 1313 + #define A2XX_RBBM_PM_OVERRIDE2_VGT_REG_SCLK_PM_OVERRIDE 0x00000008 1314 + #define A2XX_RBBM_PM_OVERRIDE2_VGT_FIFOS_SCLK_PM_OVERRIDE 0x00000010 1315 + #define A2XX_RBBM_PM_OVERRIDE2_VGT_VGT_SCLK_PM_OVERRIDE 0x00000020 1316 + #define A2XX_RBBM_PM_OVERRIDE2_DEBUG_PERF_SCLK_PM_OVERRIDE 0x00000040 1317 + #define A2XX_RBBM_PM_OVERRIDE2_PERM_SCLK_PM_OVERRIDE 0x00000080 1318 + #define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM0_PM_OVERRIDE 0x00000100 1319 + #define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM1_PM_OVERRIDE 0x00000200 1320 + #define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM2_PM_OVERRIDE 0x00000400 1321 + #define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM3_PM_OVERRIDE 0x00000800 1316 1322 1317 1323 #define REG_A2XX_RBBM_DEBUG_OUT 0x000003a0 1318 1324 ··· 1352 1334 #define REG_A2XX_RBBM_PERIPHID2 0x000003fa 1353 1335 1354 1336 #define REG_A2XX_CP_PERFMON_CNTL 0x00000444 1337 + #define A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__MASK 0x00000007 1338 + #define A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__SHIFT 0 1339 + static inline uint32_t A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT(enum perf_mode_cnt val) 1340 + { 1341 + return ((val) << A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__SHIFT) & A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__MASK; 1342 + } 1355 1343 1356 1344 #define REG_A2XX_CP_PERFCOUNTER_SELECT 0x00000445 1357 1345
+14 -14
drivers/gpu/drm/msm/adreno/a3xx.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2021 by the following authors: 25 + Copyright (C) 2013-2022 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28
+11
drivers/gpu/drm/msm/adreno/a3xx_gpu.c
··· 477 477 return state; 478 478 } 479 479 480 + static u64 a3xx_gpu_busy(struct msm_gpu *gpu, unsigned long *out_sample_rate) 481 + { 482 + u64 busy_cycles; 483 + 484 + busy_cycles = gpu_read64(gpu, REG_A3XX_RBBM_PERFCTR_RBBM_1_LO); 485 + *out_sample_rate = clk_get_rate(gpu->core_clk); 486 + 487 + return busy_cycles; 488 + } 489 + 480 490 static u32 a3xx_get_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring) 481 491 { 482 492 ring->memptrs->rptr = gpu_read(gpu, REG_AXXX_CP_RB_RPTR); ··· 508 498 #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) 509 499 .show = adreno_show, 510 500 #endif 501 + .gpu_busy = a3xx_gpu_busy, 511 502 .gpu_state_get = a3xx_gpu_state_get, 512 503 .gpu_state_put = adreno_gpu_state_put, 513 504 .create_address_space = adreno_create_address_space,
+25 -13
drivers/gpu/drm/msm/adreno/a4xx.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 25 Copyright (C) 2013-2022 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) ··· 3159 3159 #define REG_A4XX_TPL1_TP_GS_BORDER_COLOR_BASE_ADDR 0x0000238d 3160 3160 3161 3161 #define REG_A4XX_TPL1_TP_FS_TEX_COUNT 0x000023a0 3162 + #define A4XX_TPL1_TP_FS_TEX_COUNT_FS__MASK 0x000000ff 3163 + #define A4XX_TPL1_TP_FS_TEX_COUNT_FS__SHIFT 0 3164 + static inline uint32_t A4XX_TPL1_TP_FS_TEX_COUNT_FS(uint32_t val) 3165 + { 3166 + return ((val) << A4XX_TPL1_TP_FS_TEX_COUNT_FS__SHIFT) & A4XX_TPL1_TP_FS_TEX_COUNT_FS__MASK; 3167 + } 3168 + #define A4XX_TPL1_TP_FS_TEX_COUNT_CS__MASK 0x0000ff00 3169 + #define A4XX_TPL1_TP_FS_TEX_COUNT_CS__SHIFT 8 3170 + static inline uint32_t A4XX_TPL1_TP_FS_TEX_COUNT_CS(uint32_t val) 3171 + { 3172 + return ((val) << A4XX_TPL1_TP_FS_TEX_COUNT_CS__SHIFT) & A4XX_TPL1_TP_FS_TEX_COUNT_CS__MASK; 3173 + } 3162 3174 3163 3175 #define REG_A4XX_TPL1_TP_FS_BORDER_COLOR_BASE_ADDR 0x000023a1 3164 3176
+11
drivers/gpu/drm/msm/adreno/a4xx_gpu.c
··· 611 611 return 0; 612 612 } 613 613 614 + static u64 a4xx_gpu_busy(struct msm_gpu *gpu, unsigned long *out_sample_rate) 615 + { 616 + u64 busy_cycles; 617 + 618 + busy_cycles = gpu_read64(gpu, REG_A4XX_RBBM_PERFCTR_RBBM_1_LO); 619 + *out_sample_rate = clk_get_rate(gpu->core_clk); 620 + 621 + return busy_cycles; 622 + } 623 + 614 624 static u32 a4xx_get_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring) 615 625 { 616 626 ring->memptrs->rptr = gpu_read(gpu, REG_A4XX_CP_RB_RPTR); ··· 642 632 #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) 643 633 .show = adreno_show, 644 634 #endif 635 + .gpu_busy = a4xx_gpu_busy, 645 636 .gpu_state_get = a4xx_gpu_state_get, 646 637 .gpu_state_put = adreno_gpu_state_put, 647 638 .create_address_space = adreno_create_address_space,
+24 -18
drivers/gpu/drm/msm/adreno/a5xx.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2022 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28 ··· 4218 4218 #define REG_A5XX_SP_FS_CONFIG_MAX_CONST 0x0000e58b 4219 4219 4220 4220 #define REG_A5XX_SP_VS_CTRL_REG0 0x0000e590 4221 + #define A5XX_SP_VS_CTRL_REG0_BUFFER 0x00000004 4221 4222 #define A5XX_SP_VS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4222 4223 #define A5XX_SP_VS_CTRL_REG0_THREADSIZE__SHIFT 3 4223 4224 static inline uint32_t A5XX_SP_VS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4317 4316 #define REG_A5XX_SP_VS_OBJ_START_HI 0x0000e5ad 4318 4317 4319 4318 #define REG_A5XX_SP_FS_CTRL_REG0 0x0000e5c0 4319 + #define A5XX_SP_FS_CTRL_REG0_BUFFER 0x00000004 4320 4320 #define A5XX_SP_FS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4321 4321 #define A5XX_SP_FS_CTRL_REG0_THREADSIZE__SHIFT 3 4322 4322 static inline uint32_t A5XX_SP_FS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4408 4406 #define REG_A5XX_UNKNOWN_E5DB 0x0000e5db 4409 4407 4410 4408 #define REG_A5XX_SP_CS_CTRL_REG0 0x0000e5f0 4409 + #define A5XX_SP_CS_CTRL_REG0_BUFFER 0x00000004 4411 4410 #define A5XX_SP_CS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4412 4411 #define A5XX_SP_CS_CTRL_REG0_THREADSIZE__SHIFT 3 4413 4412 static inline uint32_t A5XX_SP_CS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4443 4440 #define REG_A5XX_SP_CS_OBJ_START_HI 0x0000e5f4 4444 4441 4445 4442 #define REG_A5XX_SP_HS_CTRL_REG0 0x0000e600 4443 + #define A5XX_SP_HS_CTRL_REG0_BUFFER 0x00000004 4446 4444 #define A5XX_SP_HS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4447 4445 #define A5XX_SP_HS_CTRL_REG0_THREADSIZE__SHIFT 3 4448 4446 static inline uint32_t A5XX_SP_HS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4478 4474 #define REG_A5XX_SP_HS_OBJ_START_HI 0x0000e604 4479 4475 4480 4476 #define REG_A5XX_SP_DS_CTRL_REG0 0x0000e610 4477 + #define A5XX_SP_DS_CTRL_REG0_BUFFER 0x00000004 4481 4478 #define A5XX_SP_DS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4482 4479 #define A5XX_SP_DS_CTRL_REG0_THREADSIZE__SHIFT 3 4483 4480 static inline uint32_t A5XX_SP_DS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4513 4508 #define REG_A5XX_SP_DS_OBJ_START_HI 0x0000e62d 4514 4509 4515 4510 #define REG_A5XX_SP_GS_CTRL_REG0 0x0000e640 4511 + #define A5XX_SP_GS_CTRL_REG0_BUFFER 0x00000004 4516 4512 #define A5XX_SP_GS_CTRL_REG0_THREADSIZE__MASK 0x00000008 4517 4513 #define A5XX_SP_GS_CTRL_REG0_THREADSIZE__SHIFT 3 4518 4514 static inline uint32_t A5XX_SP_GS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) ··· 4671 4665 { 4672 4666 return ((val) << A5XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK; 4673 4667 } 4674 - #define A5XX_HLSQ_CONTROL_2_REG_SIZE__MASK 0xff000000 4675 - #define A5XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT 24 4676 - static inline uint32_t A5XX_HLSQ_CONTROL_2_REG_SIZE(uint32_t val) 4668 + #define A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK 0xff000000 4669 + #define A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT 24 4670 + static inline uint32_t A5XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val) 4677 4671 { 4678 - return ((val) << A5XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_SIZE__MASK; 4672 + return ((val) << A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK; 4679 4673 } 4680 4674 4681 4675 #define REG_A5XX_HLSQ_CONTROL_3_REG 0x0000e787
+39 -30
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
··· 567 567 msm_gem_put_vaddr(obj); 568 568 } 569 569 570 - static int a5xx_ucode_init(struct msm_gpu *gpu) 570 + static int a5xx_ucode_load(struct msm_gpu *gpu) 571 571 { 572 572 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 573 573 struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu); ··· 605 605 a5xx_ucode_check_version(a5xx_gpu, a5xx_gpu->pfp_bo); 606 606 } 607 607 608 - gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO, a5xx_gpu->pm4_iova); 608 + if (a5xx_gpu->has_whereami) { 609 + if (!a5xx_gpu->shadow_bo) { 610 + a5xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, 611 + sizeof(u32) * gpu->nr_rings, 612 + MSM_BO_WC | MSM_BO_MAP_PRIV, 613 + gpu->aspace, &a5xx_gpu->shadow_bo, 614 + &a5xx_gpu->shadow_iova); 609 615 610 - gpu_write64(gpu, REG_A5XX_CP_PFP_INSTR_BASE_LO, a5xx_gpu->pfp_iova); 616 + if (IS_ERR(a5xx_gpu->shadow)) 617 + return PTR_ERR(a5xx_gpu->shadow); 618 + 619 + msm_gem_object_set_name(a5xx_gpu->shadow_bo, "shadow"); 620 + } 621 + } else if (gpu->nr_rings > 1) { 622 + /* Disable preemption if WHERE_AM_I isn't available */ 623 + a5xx_preempt_fini(gpu); 624 + gpu->nr_rings = 1; 625 + } 611 626 612 627 return 0; 613 628 } ··· 915 900 if (adreno_is_a530(adreno_gpu) || adreno_is_a540(adreno_gpu)) 916 901 a5xx_gpmu_ucode_init(gpu); 917 902 918 - ret = a5xx_ucode_init(gpu); 919 - if (ret) 920 - return ret; 903 + gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO, a5xx_gpu->pm4_iova); 904 + gpu_write64(gpu, REG_A5XX_CP_PFP_INSTR_BASE_LO, a5xx_gpu->pfp_iova); 921 905 922 906 /* Set the ringbuffer address */ 923 907 gpu_write64(gpu, REG_A5XX_CP_RB_BASE, gpu->rb[0]->iova); ··· 930 916 gpu_write(gpu, REG_A5XX_CP_RB_CNTL, 931 917 MSM_GPU_RB_CNTL_DEFAULT | AXXX_CP_RB_CNTL_NO_UPDATE); 932 918 933 - /* Create a privileged buffer for the RPTR shadow */ 934 - if (a5xx_gpu->has_whereami) { 935 - if (!a5xx_gpu->shadow_bo) { 936 - a5xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, 937 - sizeof(u32) * gpu->nr_rings, 938 - MSM_BO_WC | MSM_BO_MAP_PRIV, 939 - gpu->aspace, &a5xx_gpu->shadow_bo, 940 - &a5xx_gpu->shadow_iova); 941 - 942 - if (IS_ERR(a5xx_gpu->shadow)) 943 - return PTR_ERR(a5xx_gpu->shadow); 944 - 945 - msm_gem_object_set_name(a5xx_gpu->shadow_bo, "shadow"); 946 - } 947 - 919 + /* Configure the RPTR shadow if needed: */ 920 + if (a5xx_gpu->shadow_bo) { 948 921 gpu_write64(gpu, REG_A5XX_CP_RB_RPTR_ADDR, 949 922 shadowptr(a5xx_gpu, gpu->rb[0])); 950 - } else if (gpu->nr_rings > 1) { 951 - /* Disable preemption if WHERE_AM_I isn't available */ 952 - a5xx_preempt_fini(gpu); 953 - gpu->nr_rings = 1; 954 923 } 955 924 956 925 a5xx_preempt_hw_init(gpu); ··· 1096 1099 static int a5xx_fault_handler(void *arg, unsigned long iova, int flags, void *data) 1097 1100 { 1098 1101 struct msm_gpu *gpu = arg; 1099 - pr_warn_ratelimited("*** gpu fault: iova=%08lx, flags=%d (%u,%u,%u,%u)\n", 1100 - iova, flags, 1102 + struct adreno_smmu_fault_info *info = data; 1103 + char block[12] = "unknown"; 1104 + u32 scratch[] = { 1101 1105 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(4)), 1102 1106 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(5)), 1103 1107 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(6)), 1104 - gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(7))); 1108 + gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(7)), 1109 + }; 1105 1110 1106 - return 0; 1111 + if (info) 1112 + snprintf(block, sizeof(block), "%x", info->fsynr1); 1113 + 1114 + return adreno_fault_handler(gpu, iova, flags, info, block, scratch); 1107 1115 } 1108 1116 1109 1117 static void a5xx_cp_err_irq(struct msm_gpu *gpu) ··· 1684 1682 .get_param = adreno_get_param, 1685 1683 .set_param = adreno_set_param, 1686 1684 .hw_init = a5xx_hw_init, 1685 + .ucode_load = a5xx_ucode_load, 1687 1686 .pm_suspend = a5xx_pm_suspend, 1688 1687 .pm_resume = a5xx_pm_resume, 1689 1688 .recover = a5xx_recover, ··· 1746 1743 struct a5xx_gpu *a5xx_gpu = NULL; 1747 1744 struct adreno_gpu *adreno_gpu; 1748 1745 struct msm_gpu *gpu; 1746 + unsigned int nr_rings; 1749 1747 int ret; 1750 1748 1751 1749 if (!pdev) { ··· 1767 1763 1768 1764 check_speed_bin(&pdev->dev); 1769 1765 1770 - ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 4); 1766 + nr_rings = 4; 1767 + 1768 + if (adreno_is_a510(adreno_gpu)) 1769 + nr_rings = 1; 1770 + 1771 + ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, nr_rings); 1771 1772 if (ret) { 1772 1773 a5xx_destroy(&(a5xx_gpu->base.base)); 1773 1774 return ERR_PTR(ret);
+624 -169
drivers/gpu/drm/msm/adreno/a6xx.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2022 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28 ··· 911 911 A6XX_EARLY_Z = 0, 912 912 A6XX_LATE_Z = 1, 913 913 A6XX_EARLY_LRZ_LATE_Z = 2, 914 + A6XX_INVALID_ZTEST = 3, 914 915 }; 915 916 916 917 enum a6xx_sequenced_thread_dist { ··· 947 946 BUFFERS_IN_SYSMEM = 3, 948 947 }; 949 948 949 + enum a6xx_lrz_dir_status { 950 + LRZ_DIR_LE = 1, 951 + LRZ_DIR_GE = 2, 952 + LRZ_DIR_INVALID = 3, 953 + }; 954 + 950 955 enum a6xx_fragcoord_sample_mode { 951 956 FRAGCOORD_CENTER = 0, 952 957 FRAGCOORD_SAMPLE = 3, ··· 983 976 enum a6xx_threadsize { 984 977 THREAD64 = 0, 985 978 THREAD128 = 1, 979 + }; 980 + 981 + enum a6xx_bindless_descriptor_size { 982 + BINDLESS_DESCRIPTOR_16B = 1, 983 + BINDLESS_DESCRIPTOR_64B = 3, 986 984 }; 987 985 988 986 enum a6xx_isam_mode { ··· 1042 1030 1043 1031 #define A6XX_RBBM_INT_0_MASK_RBBM_GPU_IDLE 0x00000001 1044 1032 #define A6XX_RBBM_INT_0_MASK_CP_AHB_ERROR 0x00000002 1033 + #define A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_0 0x00000010 1034 + #define A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_1 0x00000020 1045 1035 #define A6XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNCFIFO_OVERFLOW 0x00000040 1046 1036 #define A6XX_RBBM_INT_0_MASK_RBBM_GPC_ERROR 0x00000080 1047 1037 #define A6XX_RBBM_INT_0_MASK_CP_SW 0x00000100 ··· 1054 1040 #define A6XX_RBBM_INT_0_MASK_CP_IB2 0x00002000 1055 1041 #define A6XX_RBBM_INT_0_MASK_CP_IB1 0x00004000 1056 1042 #define A6XX_RBBM_INT_0_MASK_CP_RB 0x00008000 1043 + #define A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPT 0x00008000 1044 + #define A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPTLPAC 0x00010000 1057 1045 #define A6XX_RBBM_INT_0_MASK_CP_RB_DONE_TS 0x00020000 1058 1046 #define A6XX_RBBM_INT_0_MASK_CP_WT_DONE_TS 0x00040000 1059 1047 #define A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS 0x00100000 1048 + #define A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS_LPAC 0x00200000 1060 1049 #define A6XX_RBBM_INT_0_MASK_RBBM_ATB_BUS_OVERFLOW 0x00400000 1061 1050 #define A6XX_RBBM_INT_0_MASK_RBBM_HANG_DETECT 0x00800000 1062 1051 #define A6XX_RBBM_INT_0_MASK_UCHE_OOB_ACCESS 0x01000000 1063 1052 #define A6XX_RBBM_INT_0_MASK_UCHE_TRAP_INTR 0x02000000 1064 1053 #define A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_0 0x04000000 1065 1054 #define A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_1 0x08000000 1055 + #define A6XX_RBBM_INT_0_MASK_TSBWRITEERROR 0x10000000 1066 1056 #define A6XX_RBBM_INT_0_MASK_ISDB_CPU_IRQ 0x40000000 1067 1057 #define A6XX_RBBM_INT_0_MASK_ISDB_UNDER_DEBUG 0x80000000 1068 1058 #define A6XX_CP_INT_CP_OPCODE_ERROR 0x00000001 ··· 1076 1058 #define A6XX_CP_INT_CP_AHB_ERROR 0x00000020 1077 1059 #define A6XX_CP_INT_CP_VSD_PARITY_ERROR 0x00000040 1078 1060 #define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR 0x00000080 1061 + #define A6XX_CP_INT_CP_OPCODE_ERROR_LPAC 0x00000100 1062 + #define A6XX_CP_INT_CP_UCODE_ERROR_LPAC 0x00000200 1063 + #define A6XX_CP_INT_CP_HW_FAULT_ERROR_LPAC 0x00000400 1064 + #define A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_LPAC 0x00000800 1065 + #define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_LPAC 0x00001000 1066 + #define A6XX_CP_INT_CP_OPCODE_ERROR_BV 0x00002000 1067 + #define A6XX_CP_INT_CP_UCODE_ERROR_BV 0x00004000 1068 + #define A6XX_CP_INT_CP_HW_FAULT_ERROR_BV 0x00008000 1069 + #define A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_BV 0x00010000 1070 + #define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_BV 0x00020000 1079 1071 #define REG_A6XX_CP_RB_BASE 0x00000800 1080 - 1081 - #define REG_A6XX_CP_RB_BASE_HI 0x00000801 1082 1072 1083 1073 #define REG_A6XX_CP_RB_CNTL 0x00000802 1084 1074 1085 - #define REG_A6XX_CP_RB_RPTR_ADDR_LO 0x00000804 1086 - 1087 - #define REG_A6XX_CP_RB_RPTR_ADDR_HI 0x00000805 1075 + #define REG_A6XX_CP_RB_RPTR_ADDR 0x00000804 1088 1076 1089 1077 #define REG_A6XX_CP_RB_RPTR 0x00000806 1090 1078 ··· 1107 1083 1108 1084 #define REG_A6XX_CP_PROTECT_STATUS 0x00000824 1109 1085 1086 + #define REG_A6XX_CP_STATUS_1 0x00000825 1087 + 1110 1088 #define REG_A6XX_CP_SQE_INSTR_BASE 0x00000830 1111 1089 1112 1090 #define REG_A6XX_CP_MISC_CNTL 0x00000840 1113 1091 1114 - #define REG_A6XX_CP_CHICKEN_DBG 0x00000841 1115 - 1116 1092 #define REG_A6XX_CP_APRIV_CNTL 0x00000844 1117 1093 1094 + #define REG_A6XX_CP_PREEMPT_THRESHOLD 0x000008c0 1095 + 1118 1096 #define REG_A6XX_CP_ROQ_THRESHOLDS_1 0x000008c1 1119 - #define A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__MASK 0x000000ff 1120 - #define A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__SHIFT 0 1121 - static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_RB_LO(uint32_t val) 1097 + #define A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__MASK 0x000000ff 1098 + #define A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__SHIFT 0 1099 + static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_MRB_START(uint32_t val) 1122 1100 { 1123 - return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__MASK; 1101 + return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__MASK; 1124 1102 } 1125 - #define A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__MASK 0x0000ff00 1126 - #define A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__SHIFT 8 1127 - static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_RB_HI(uint32_t val) 1103 + #define A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__MASK 0x0000ff00 1104 + #define A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__SHIFT 8 1105 + static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_VSD_START(uint32_t val) 1128 1106 { 1129 - return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__MASK; 1107 + return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__MASK; 1130 1108 } 1131 1109 #define A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__MASK 0x00ff0000 1132 1110 #define A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__SHIFT 16 ··· 1190 1164 1191 1165 #define REG_A6XX_CP_CONTEXT_SWITCH_CNTL 0x000008a0 1192 1166 1193 - #define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO_LO 0x000008a1 1167 + #define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO 0x000008a1 1194 1168 1195 - #define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO_HI 0x000008a2 1169 + #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR 0x000008a3 1196 1170 1197 - #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_LO 0x000008a3 1171 + #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR 0x000008a5 1198 1172 1199 - #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_HI 0x000008a4 1173 + #define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR 0x000008a7 1200 1174 1201 - #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_LO 0x000008a5 1202 - 1203 - #define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_HI 0x000008a6 1204 - 1205 - #define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_LO 0x000008a7 1206 - 1207 - #define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_HI 0x000008a8 1175 + #define REG_A7XX_CP_CONTEXT_SWITCH_LEVEL_STATUS 0x000008ab 1208 1176 1209 1177 static inline uint32_t REG_A6XX_CP_PERFCTR_CP_SEL(uint32_t i0) { return 0x000008d0 + 0x1*i0; } 1210 1178 1211 - #define REG_A6XX_CP_CRASH_SCRIPT_BASE_LO 0x00000900 1179 + static inline uint32_t REG_A7XX_CP_BV_PERFCTR_CP_SEL(uint32_t i0) { return 0x000008e0 + 0x1*i0; } 1212 1180 1213 - #define REG_A6XX_CP_CRASH_SCRIPT_BASE_HI 0x00000901 1181 + #define REG_A6XX_CP_CRASH_SCRIPT_BASE 0x00000900 1214 1182 1215 1183 #define REG_A6XX_CP_CRASH_DUMP_CNTL 0x00000902 1216 1184 ··· 1232 1212 1233 1213 #define REG_A6XX_CP_IB1_BASE 0x00000928 1234 1214 1235 - #define REG_A6XX_CP_IB1_BASE_HI 0x00000929 1236 - 1237 1215 #define REG_A6XX_CP_IB1_REM_SIZE 0x0000092a 1238 1216 1239 1217 #define REG_A6XX_CP_IB2_BASE 0x0000092b 1240 - 1241 - #define REG_A6XX_CP_IB2_BASE_HI 0x0000092c 1242 1218 1243 1219 #define REG_A6XX_CP_IB2_REM_SIZE 0x0000092d 1244 1220 1245 1221 #define REG_A6XX_CP_SDS_BASE 0x0000092e 1246 1222 1247 - #define REG_A6XX_CP_SDS_BASE_HI 0x0000092f 1248 - 1249 1223 #define REG_A6XX_CP_SDS_REM_SIZE 0x00000930 1250 1224 1251 1225 #define REG_A6XX_CP_MRB_BASE 0x00000931 1252 - 1253 - #define REG_A6XX_CP_MRB_BASE_HI 0x00000932 1254 1226 1255 1227 #define REG_A6XX_CP_MRB_REM_SIZE 0x00000933 1256 1228 1257 1229 #define REG_A6XX_CP_VSD_BASE 0x00000934 1258 1230 1259 - #define REG_A6XX_CP_VSD_BASE_HI 0x00000935 1231 + #define REG_A6XX_CP_ROQ_RB_STAT 0x00000939 1232 + #define A6XX_CP_ROQ_RB_STAT_RPTR__MASK 0x000003ff 1233 + #define A6XX_CP_ROQ_RB_STAT_RPTR__SHIFT 0 1234 + static inline uint32_t A6XX_CP_ROQ_RB_STAT_RPTR(uint32_t val) 1235 + { 1236 + return ((val) << A6XX_CP_ROQ_RB_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_RB_STAT_RPTR__MASK; 1237 + } 1238 + #define A6XX_CP_ROQ_RB_STAT_WPTR__MASK 0x03ff0000 1239 + #define A6XX_CP_ROQ_RB_STAT_WPTR__SHIFT 16 1240 + static inline uint32_t A6XX_CP_ROQ_RB_STAT_WPTR(uint32_t val) 1241 + { 1242 + return ((val) << A6XX_CP_ROQ_RB_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_RB_STAT_WPTR__MASK; 1243 + } 1244 + 1245 + #define REG_A6XX_CP_ROQ_IB1_STAT 0x0000093a 1246 + #define A6XX_CP_ROQ_IB1_STAT_RPTR__MASK 0x000003ff 1247 + #define A6XX_CP_ROQ_IB1_STAT_RPTR__SHIFT 0 1248 + static inline uint32_t A6XX_CP_ROQ_IB1_STAT_RPTR(uint32_t val) 1249 + { 1250 + return ((val) << A6XX_CP_ROQ_IB1_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_IB1_STAT_RPTR__MASK; 1251 + } 1252 + #define A6XX_CP_ROQ_IB1_STAT_WPTR__MASK 0x03ff0000 1253 + #define A6XX_CP_ROQ_IB1_STAT_WPTR__SHIFT 16 1254 + static inline uint32_t A6XX_CP_ROQ_IB1_STAT_WPTR(uint32_t val) 1255 + { 1256 + return ((val) << A6XX_CP_ROQ_IB1_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_IB1_STAT_WPTR__MASK; 1257 + } 1258 + 1259 + #define REG_A6XX_CP_ROQ_IB2_STAT 0x0000093b 1260 + #define A6XX_CP_ROQ_IB2_STAT_RPTR__MASK 0x000003ff 1261 + #define A6XX_CP_ROQ_IB2_STAT_RPTR__SHIFT 0 1262 + static inline uint32_t A6XX_CP_ROQ_IB2_STAT_RPTR(uint32_t val) 1263 + { 1264 + return ((val) << A6XX_CP_ROQ_IB2_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_IB2_STAT_RPTR__MASK; 1265 + } 1266 + #define A6XX_CP_ROQ_IB2_STAT_WPTR__MASK 0x03ff0000 1267 + #define A6XX_CP_ROQ_IB2_STAT_WPTR__SHIFT 16 1268 + static inline uint32_t A6XX_CP_ROQ_IB2_STAT_WPTR(uint32_t val) 1269 + { 1270 + return ((val) << A6XX_CP_ROQ_IB2_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_IB2_STAT_WPTR__MASK; 1271 + } 1272 + 1273 + #define REG_A6XX_CP_ROQ_SDS_STAT 0x0000093c 1274 + #define A6XX_CP_ROQ_SDS_STAT_RPTR__MASK 0x000003ff 1275 + #define A6XX_CP_ROQ_SDS_STAT_RPTR__SHIFT 0 1276 + static inline uint32_t A6XX_CP_ROQ_SDS_STAT_RPTR(uint32_t val) 1277 + { 1278 + return ((val) << A6XX_CP_ROQ_SDS_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_SDS_STAT_RPTR__MASK; 1279 + } 1280 + #define A6XX_CP_ROQ_SDS_STAT_WPTR__MASK 0x03ff0000 1281 + #define A6XX_CP_ROQ_SDS_STAT_WPTR__SHIFT 16 1282 + static inline uint32_t A6XX_CP_ROQ_SDS_STAT_WPTR(uint32_t val) 1283 + { 1284 + return ((val) << A6XX_CP_ROQ_SDS_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_SDS_STAT_WPTR__MASK; 1285 + } 1286 + 1287 + #define REG_A6XX_CP_ROQ_MRB_STAT 0x0000093d 1288 + #define A6XX_CP_ROQ_MRB_STAT_RPTR__MASK 0x000003ff 1289 + #define A6XX_CP_ROQ_MRB_STAT_RPTR__SHIFT 0 1290 + static inline uint32_t A6XX_CP_ROQ_MRB_STAT_RPTR(uint32_t val) 1291 + { 1292 + return ((val) << A6XX_CP_ROQ_MRB_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_MRB_STAT_RPTR__MASK; 1293 + } 1294 + #define A6XX_CP_ROQ_MRB_STAT_WPTR__MASK 0x03ff0000 1295 + #define A6XX_CP_ROQ_MRB_STAT_WPTR__SHIFT 16 1296 + static inline uint32_t A6XX_CP_ROQ_MRB_STAT_WPTR(uint32_t val) 1297 + { 1298 + return ((val) << A6XX_CP_ROQ_MRB_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_MRB_STAT_WPTR__MASK; 1299 + } 1300 + 1301 + #define REG_A6XX_CP_ROQ_VSD_STAT 0x0000093e 1302 + #define A6XX_CP_ROQ_VSD_STAT_RPTR__MASK 0x000003ff 1303 + #define A6XX_CP_ROQ_VSD_STAT_RPTR__SHIFT 0 1304 + static inline uint32_t A6XX_CP_ROQ_VSD_STAT_RPTR(uint32_t val) 1305 + { 1306 + return ((val) << A6XX_CP_ROQ_VSD_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_VSD_STAT_RPTR__MASK; 1307 + } 1308 + #define A6XX_CP_ROQ_VSD_STAT_WPTR__MASK 0x03ff0000 1309 + #define A6XX_CP_ROQ_VSD_STAT_WPTR__SHIFT 16 1310 + static inline uint32_t A6XX_CP_ROQ_VSD_STAT_WPTR(uint32_t val) 1311 + { 1312 + return ((val) << A6XX_CP_ROQ_VSD_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_VSD_STAT_WPTR__MASK; 1313 + } 1314 + 1315 + #define REG_A6XX_CP_IB1_DWORDS 0x00000943 1316 + 1317 + #define REG_A6XX_CP_IB2_DWORDS 0x00000944 1318 + 1319 + #define REG_A6XX_CP_SDS_DWORDS 0x00000945 1260 1320 1261 1321 #define REG_A6XX_CP_MRB_DWORDS 0x00000946 1262 1322 1263 1323 #define REG_A6XX_CP_VSD_DWORDS 0x00000947 1264 1324 1265 - #define REG_A6XX_CP_CSQ_IB1_STAT 0x00000949 1266 - #define A6XX_CP_CSQ_IB1_STAT_REM__MASK 0xffff0000 1267 - #define A6XX_CP_CSQ_IB1_STAT_REM__SHIFT 16 1268 - static inline uint32_t A6XX_CP_CSQ_IB1_STAT_REM(uint32_t val) 1325 + #define REG_A6XX_CP_ROQ_AVAIL_RB 0x00000948 1326 + #define A6XX_CP_ROQ_AVAIL_RB_REM__MASK 0xffff0000 1327 + #define A6XX_CP_ROQ_AVAIL_RB_REM__SHIFT 16 1328 + static inline uint32_t A6XX_CP_ROQ_AVAIL_RB_REM(uint32_t val) 1269 1329 { 1270 - return ((val) << A6XX_CP_CSQ_IB1_STAT_REM__SHIFT) & A6XX_CP_CSQ_IB1_STAT_REM__MASK; 1330 + return ((val) << A6XX_CP_ROQ_AVAIL_RB_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_RB_REM__MASK; 1271 1331 } 1272 1332 1273 - #define REG_A6XX_CP_CSQ_IB2_STAT 0x0000094a 1274 - #define A6XX_CP_CSQ_IB2_STAT_REM__MASK 0xffff0000 1275 - #define A6XX_CP_CSQ_IB2_STAT_REM__SHIFT 16 1276 - static inline uint32_t A6XX_CP_CSQ_IB2_STAT_REM(uint32_t val) 1333 + #define REG_A6XX_CP_ROQ_AVAIL_IB1 0x00000949 1334 + #define A6XX_CP_ROQ_AVAIL_IB1_REM__MASK 0xffff0000 1335 + #define A6XX_CP_ROQ_AVAIL_IB1_REM__SHIFT 16 1336 + static inline uint32_t A6XX_CP_ROQ_AVAIL_IB1_REM(uint32_t val) 1277 1337 { 1278 - return ((val) << A6XX_CP_CSQ_IB2_STAT_REM__SHIFT) & A6XX_CP_CSQ_IB2_STAT_REM__MASK; 1338 + return ((val) << A6XX_CP_ROQ_AVAIL_IB1_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_IB1_REM__MASK; 1279 1339 } 1280 1340 1281 - #define REG_A6XX_CP_MRQ_MRB_STAT 0x0000094c 1282 - #define A6XX_CP_MRQ_MRB_STAT_REM__MASK 0xffff0000 1283 - #define A6XX_CP_MRQ_MRB_STAT_REM__SHIFT 16 1284 - static inline uint32_t A6XX_CP_MRQ_MRB_STAT_REM(uint32_t val) 1341 + #define REG_A6XX_CP_ROQ_AVAIL_IB2 0x0000094a 1342 + #define A6XX_CP_ROQ_AVAIL_IB2_REM__MASK 0xffff0000 1343 + #define A6XX_CP_ROQ_AVAIL_IB2_REM__SHIFT 16 1344 + static inline uint32_t A6XX_CP_ROQ_AVAIL_IB2_REM(uint32_t val) 1285 1345 { 1286 - return ((val) << A6XX_CP_MRQ_MRB_STAT_REM__SHIFT) & A6XX_CP_MRQ_MRB_STAT_REM__MASK; 1346 + return ((val) << A6XX_CP_ROQ_AVAIL_IB2_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_IB2_REM__MASK; 1287 1347 } 1288 1348 1289 - #define REG_A6XX_CP_ALWAYS_ON_COUNTER_LO 0x00000980 1349 + #define REG_A6XX_CP_ROQ_AVAIL_SDS 0x0000094b 1350 + #define A6XX_CP_ROQ_AVAIL_SDS_REM__MASK 0xffff0000 1351 + #define A6XX_CP_ROQ_AVAIL_SDS_REM__SHIFT 16 1352 + static inline uint32_t A6XX_CP_ROQ_AVAIL_SDS_REM(uint32_t val) 1353 + { 1354 + return ((val) << A6XX_CP_ROQ_AVAIL_SDS_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_SDS_REM__MASK; 1355 + } 1290 1356 1291 - #define REG_A6XX_CP_ALWAYS_ON_COUNTER_HI 0x00000981 1357 + #define REG_A6XX_CP_ROQ_AVAIL_MRB 0x0000094c 1358 + #define A6XX_CP_ROQ_AVAIL_MRB_REM__MASK 0xffff0000 1359 + #define A6XX_CP_ROQ_AVAIL_MRB_REM__SHIFT 16 1360 + static inline uint32_t A6XX_CP_ROQ_AVAIL_MRB_REM(uint32_t val) 1361 + { 1362 + return ((val) << A6XX_CP_ROQ_AVAIL_MRB_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_MRB_REM__MASK; 1363 + } 1364 + 1365 + #define REG_A6XX_CP_ROQ_AVAIL_VSD 0x0000094d 1366 + #define A6XX_CP_ROQ_AVAIL_VSD_REM__MASK 0xffff0000 1367 + #define A6XX_CP_ROQ_AVAIL_VSD_REM__SHIFT 16 1368 + static inline uint32_t A6XX_CP_ROQ_AVAIL_VSD_REM(uint32_t val) 1369 + { 1370 + return ((val) << A6XX_CP_ROQ_AVAIL_VSD_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_VSD_REM__MASK; 1371 + } 1372 + 1373 + #define REG_A6XX_CP_ALWAYS_ON_COUNTER 0x00000980 1292 1374 1293 1375 #define REG_A6XX_CP_AHB_CNTL 0x0000098d 1294 1376 ··· 1398 1276 1399 1277 #define REG_A6XX_CP_APERTURE_CNTL_CD 0x00000a03 1400 1278 1279 + #define REG_A7XX_CP_BV_PROTECT_STATUS 0x00000a61 1280 + 1281 + #define REG_A7XX_CP_BV_HW_FAULT 0x00000a64 1282 + 1283 + #define REG_A7XX_CP_BV_DRAW_STATE_ADDR 0x00000a81 1284 + 1285 + #define REG_A7XX_CP_BV_DRAW_STATE_DATA 0x00000a82 1286 + 1287 + #define REG_A7XX_CP_BV_ROQ_DBG_ADDR 0x00000a83 1288 + 1289 + #define REG_A7XX_CP_BV_ROQ_DBG_DATA 0x00000a84 1290 + 1291 + #define REG_A7XX_CP_BV_SQE_UCODE_DBG_ADDR 0x00000a85 1292 + 1293 + #define REG_A7XX_CP_BV_SQE_UCODE_DBG_DATA 0x00000a86 1294 + 1295 + #define REG_A7XX_CP_BV_SQE_STAT_ADDR 0x00000a87 1296 + 1297 + #define REG_A7XX_CP_BV_SQE_STAT_DATA 0x00000a88 1298 + 1299 + #define REG_A7XX_CP_BV_MEM_POOL_DBG_ADDR 0x00000a96 1300 + 1301 + #define REG_A7XX_CP_BV_MEM_POOL_DBG_DATA 0x00000a97 1302 + 1303 + #define REG_A7XX_CP_BV_RB_RPTR_ADDR 0x00000a98 1304 + 1305 + #define REG_A7XX_CP_RESOURCE_TBL_DBG_ADDR 0x00000a9a 1306 + 1307 + #define REG_A7XX_CP_RESOURCE_TBL_DBG_DATA 0x00000a9b 1308 + 1309 + #define REG_A7XX_CP_BV_APRIV_CNTL 0x00000ad0 1310 + 1311 + #define REG_A7XX_CP_BV_CHICKEN_DBG 0x00000ada 1312 + 1313 + #define REG_A7XX_CP_LPAC_DRAW_STATE_ADDR 0x00000b0a 1314 + 1315 + #define REG_A7XX_CP_LPAC_DRAW_STATE_DATA 0x00000b0b 1316 + 1317 + #define REG_A7XX_CP_LPAC_ROQ_DBG_ADDR 0x00000b0c 1318 + 1319 + #define REG_A7XX_CP_SQE_AC_UCODE_DBG_ADDR 0x00000b27 1320 + 1321 + #define REG_A7XX_CP_SQE_AC_UCODE_DBG_DATA 0x00000b28 1322 + 1323 + #define REG_A7XX_CP_SQE_AC_STAT_ADDR 0x00000b29 1324 + 1325 + #define REG_A7XX_CP_SQE_AC_STAT_DATA 0x00000b2a 1326 + 1327 + #define REG_A7XX_CP_LPAC_APRIV_CNTL 0x00000b31 1328 + 1401 1329 #define REG_A6XX_CP_LPAC_PROG_FIFO_SIZE 0x00000b34 1330 + 1331 + #define REG_A7XX_CP_LPAC_ROQ_DBG_DATA 0x00000b35 1332 + 1333 + #define REG_A7XX_CP_LPAC_FIFO_DBG_DATA 0x00000b36 1334 + 1335 + #define REG_A7XX_CP_LPAC_FIFO_DBG_ADDR 0x00000b40 1402 1336 1403 1337 #define REG_A6XX_CP_LPAC_SQE_INSTR_BASE 0x00000b82 1404 1338 1405 1339 #define REG_A6XX_VSC_ADDR_MODE_CNTL 0x00000c01 1340 + 1341 + #define REG_A6XX_RBBM_GPR0_CNTL 0x00000018 1406 1342 1407 1343 #define REG_A6XX_RBBM_INT_0_STATUS 0x00000201 1408 1344 ··· 1490 1310 #define A6XX_RBBM_STATUS_CP_AHB_BUSY_CP_MASTER 0x00000002 1491 1311 #define A6XX_RBBM_STATUS_CP_AHB_BUSY_CX_MASTER 0x00000001 1492 1312 1313 + #define REG_A6XX_RBBM_STATUS1 0x00000211 1314 + 1315 + #define REG_A6XX_RBBM_STATUS2 0x00000212 1316 + 1493 1317 #define REG_A6XX_RBBM_STATUS3 0x00000213 1494 1318 #define A6XX_RBBM_STATUS3_SMMU_STALLED_ON_FAULT 0x01000000 1495 1319 1496 1320 #define REG_A6XX_RBBM_VBIF_GX_RESET_STATUS 0x00000215 1321 + 1322 + #define REG_A7XX_RBBM_CLOCK_MODE_CP 0x00000260 1323 + 1324 + #define REG_A7XX_RBBM_CLOCK_MODE_BV_LRZ 0x00000284 1325 + 1326 + #define REG_A7XX_RBBM_CLOCK_MODE_BV_GRAS 0x00000285 1327 + 1328 + #define REG_A7XX_RBBM_CLOCK_MODE2_GRAS 0x00000286 1329 + 1330 + #define REG_A7XX_RBBM_CLOCK_MODE_BV_VFD 0x00000287 1331 + 1332 + #define REG_A7XX_RBBM_CLOCK_MODE_BV_GPC 0x00000288 1497 1333 1498 1334 static inline uint32_t REG_A6XX_RBBM_PERFCTR_CP(uint32_t i0) { return 0x00000400 + 0x2*i0; } 1499 1335 ··· 1543 1347 1544 1348 static inline uint32_t REG_A6XX_RBBM_PERFCTR_CMP(uint32_t i0) { return 0x000004f2 + 0x2*i0; } 1545 1349 1350 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_CP(uint32_t i0) { return 0x00000300 + 0x2*i0; } 1351 + 1352 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_RBBM(uint32_t i0) { return 0x0000031c + 0x2*i0; } 1353 + 1354 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_PC(uint32_t i0) { return 0x00000324 + 0x2*i0; } 1355 + 1356 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_VFD(uint32_t i0) { return 0x00000334 + 0x2*i0; } 1357 + 1358 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_HLSQ(uint32_t i0) { return 0x00000344 + 0x2*i0; } 1359 + 1360 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_VPC(uint32_t i0) { return 0x00000350 + 0x2*i0; } 1361 + 1362 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_CCU(uint32_t i0) { return 0x0000035c + 0x2*i0; } 1363 + 1364 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_TSE(uint32_t i0) { return 0x00000366 + 0x2*i0; } 1365 + 1366 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_RAS(uint32_t i0) { return 0x0000036e + 0x2*i0; } 1367 + 1368 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_UCHE(uint32_t i0) { return 0x00000376 + 0x2*i0; } 1369 + 1370 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_TP(uint32_t i0) { return 0x0000038e + 0x2*i0; } 1371 + 1372 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_SP(uint32_t i0) { return 0x000003a6 + 0x2*i0; } 1373 + 1374 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_RB(uint32_t i0) { return 0x000003d6 + 0x2*i0; } 1375 + 1376 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_VSC(uint32_t i0) { return 0x000003e6 + 0x2*i0; } 1377 + 1378 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_LRZ(uint32_t i0) { return 0x000003ea + 0x2*i0; } 1379 + 1380 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_CMP(uint32_t i0) { return 0x000003f2 + 0x2*i0; } 1381 + 1382 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_UFC(uint32_t i0) { return 0x000003fa + 0x2*i0; } 1383 + 1384 + static inline uint32_t REG_A7XX_RBBM_PERFCTR2_HLSQ(uint32_t i0) { return 0x00000410 + 0x2*i0; } 1385 + 1386 + static inline uint32_t REG_A7XX_RBBM_PERFCTR2_CP(uint32_t i0) { return 0x0000041c + 0x2*i0; } 1387 + 1388 + static inline uint32_t REG_A7XX_RBBM_PERFCTR2_SP(uint32_t i0) { return 0x0000042a + 0x2*i0; } 1389 + 1390 + static inline uint32_t REG_A7XX_RBBM_PERFCTR2_TP(uint32_t i0) { return 0x00000442 + 0x2*i0; } 1391 + 1392 + static inline uint32_t REG_A7XX_RBBM_PERFCTR2_UFC(uint32_t i0) { return 0x0000044e + 0x2*i0; } 1393 + 1394 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_PC(uint32_t i0) { return 0x00000460 + 0x2*i0; } 1395 + 1396 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_VFD(uint32_t i0) { return 0x00000470 + 0x2*i0; } 1397 + 1398 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_VPC(uint32_t i0) { return 0x00000480 + 0x2*i0; } 1399 + 1400 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_TSE(uint32_t i0) { return 0x0000048c + 0x2*i0; } 1401 + 1402 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_RAS(uint32_t i0) { return 0x00000494 + 0x2*i0; } 1403 + 1404 + static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_LRZ(uint32_t i0) { return 0x0000049c + 0x2*i0; } 1405 + 1546 1406 #define REG_A6XX_RBBM_PERFCTR_CNTL 0x00000500 1547 1407 1548 1408 #define REG_A6XX_RBBM_PERFCTR_LOAD_CMD0 0x00000501 ··· 1622 1370 #define REG_A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS 0x0000050f 1623 1371 1624 1372 #define REG_A6XX_RBBM_ISDB_CNT 0x00000533 1373 + 1374 + #define REG_A7XX_RBBM_NC_MODE_CNTL 0x00000534 1375 + 1376 + #define REG_A7XX_RBBM_SNAPSHOT_STATUS 0x00000535 1625 1377 1626 1378 #define REG_A6XX_RBBM_PRIMCTR_0_LO 0x00000540 1627 1379 ··· 1673 1417 1674 1418 #define REG_A6XX_RBBM_SECVID_TRUST_CNTL 0x0000f400 1675 1419 1676 - #define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO 0x0000f800 1677 - 1678 - #define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_HI 0x0000f801 1420 + #define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE 0x0000f800 1679 1421 1680 1422 #define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_SIZE 0x0000f802 1681 1423 1682 1424 #define REG_A6XX_RBBM_SECVID_TSB_CNTL 0x0000f803 1683 1425 1684 1426 #define REG_A6XX_RBBM_SECVID_TSB_ADDR_MODE_CNTL 0x0000f810 1427 + 1428 + #define REG_A7XX_RBBM_SECVID_TSB_STATUS 0x0000fc00 1685 1429 1686 1430 #define REG_A6XX_RBBM_VBIF_CLIENT_QOS_CNTL 0x00000010 1687 1431 ··· 1694 1438 #define REG_A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD 0x0000001c 1695 1439 #define A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD_WAIT_GPU_IDLE 0x00000001 1696 1440 1441 + #define REG_A7XX_RBBM_GBIF_HALT 0x00000016 1442 + 1443 + #define REG_A7XX_RBBM_GBIF_HALT_ACK 0x00000017 1444 + 1697 1445 #define REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL 0x0000001f 1698 1446 1699 1447 #define REG_A6XX_RBBM_INT_CLEAR_CMD 0x00000037 1700 1448 1701 1449 #define REG_A6XX_RBBM_INT_0_MASK 0x00000038 1450 + 1451 + #define REG_A7XX_RBBM_INT_2_MASK 0x0000003a 1702 1452 1703 1453 #define REG_A6XX_RBBM_SP_HYST_CNT 0x00000042 1704 1454 ··· 1936 1674 1937 1675 #define REG_A6XX_RBBM_CLOCK_HYST_TEX_FCHE 0x00000122 1938 1676 1677 + #define REG_A6XX_RBBM_LPAC_GBIF_CLIENT_QOS_CNTL 0x000005ff 1678 + 1939 1679 #define REG_A6XX_DBGC_CFG_DBGBUS_SEL_A 0x00000600 1940 1680 1941 1681 #define REG_A6XX_DBGC_CFG_DBGBUS_SEL_B 0x00000601 ··· 2116 1852 2117 1853 #define REG_A6XX_UCHE_MODE_CNTL 0x00000e01 2118 1854 2119 - #define REG_A6XX_UCHE_WRITE_RANGE_MAX_LO 0x00000e05 1855 + #define REG_A6XX_UCHE_WRITE_RANGE_MAX 0x00000e05 2120 1856 2121 - #define REG_A6XX_UCHE_WRITE_RANGE_MAX_HI 0x00000e06 1857 + #define REG_A6XX_UCHE_WRITE_THRU_BASE 0x00000e07 2122 1858 2123 - #define REG_A6XX_UCHE_WRITE_THRU_BASE_LO 0x00000e07 1859 + #define REG_A6XX_UCHE_TRAP_BASE 0x00000e09 2124 1860 2125 - #define REG_A6XX_UCHE_WRITE_THRU_BASE_HI 0x00000e08 1861 + #define REG_A6XX_UCHE_GMEM_RANGE_MIN 0x00000e0b 2126 1862 2127 - #define REG_A6XX_UCHE_TRAP_BASE_LO 0x00000e09 2128 - 2129 - #define REG_A6XX_UCHE_TRAP_BASE_HI 0x00000e0a 2130 - 2131 - #define REG_A6XX_UCHE_GMEM_RANGE_MIN_LO 0x00000e0b 2132 - 2133 - #define REG_A6XX_UCHE_GMEM_RANGE_MIN_HI 0x00000e0c 2134 - 2135 - #define REG_A6XX_UCHE_GMEM_RANGE_MAX_LO 0x00000e0d 2136 - 2137 - #define REG_A6XX_UCHE_GMEM_RANGE_MAX_HI 0x00000e0e 1863 + #define REG_A6XX_UCHE_GMEM_RANGE_MAX 0x00000e0d 2138 1864 2139 1865 #define REG_A6XX_UCHE_CACHE_WAYS 0x00000e17 2140 1866 ··· 2139 1885 } 2140 1886 2141 1887 static inline uint32_t REG_A6XX_UCHE_PERFCTR_UCHE_SEL(uint32_t i0) { return 0x00000e1c + 0x1*i0; } 1888 + 1889 + #define REG_A6XX_UCHE_GBIF_GX_CONFIG 0x00000e3a 2142 1890 2143 1891 #define REG_A6XX_UCHE_CMDQ_CONFIG 0x00000e3c 2144 1892 ··· 2238 1982 #define REG_A6XX_GBIF_HALT_ACK 0x00003c46 2239 1983 2240 1984 #define REG_A6XX_GBIF_PERF_PWR_CNT_EN 0x00003cc0 1985 + 1986 + #define REG_A6XX_GBIF_PERF_PWR_CNT_CLR 0x00003cc1 2241 1987 2242 1988 #define REG_A6XX_GBIF_PERF_CNT_SEL 0x00003cc2 2243 1989 ··· 2363 2105 #define A6XX_GRAS_CL_CNTL_CLIP_DISABLE 0x00000001 2364 2106 #define A6XX_GRAS_CL_CNTL_ZNEAR_CLIP_DISABLE 0x00000002 2365 2107 #define A6XX_GRAS_CL_CNTL_ZFAR_CLIP_DISABLE 0x00000004 2366 - #define A6XX_GRAS_CL_CNTL_UNK5 0x00000020 2108 + #define A6XX_GRAS_CL_CNTL_Z_CLAMP_ENABLE 0x00000020 2367 2109 #define A6XX_GRAS_CL_CNTL_ZERO_GB_SCALE_Z 0x00000040 2368 2110 #define A6XX_GRAS_CL_CNTL_VP_CLIP_CODE_IGNORE 0x00000080 2369 2111 #define A6XX_GRAS_CL_CNTL_VP_XFORM_DISABLE 0x00000100 ··· 2678 2420 { 2679 2421 return ((val) << A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__SHIFT) & A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__MASK; 2680 2422 } 2681 - #define A6XX_GRAS_SC_CNTL_UNK9__MASK 0x00000e00 2682 - #define A6XX_GRAS_SC_CNTL_UNK9__SHIFT 9 2683 - static inline uint32_t A6XX_GRAS_SC_CNTL_UNK9(uint32_t val) 2423 + #define A6XX_GRAS_SC_CNTL_UNK9 0x00000200 2424 + #define A6XX_GRAS_SC_CNTL_ROTATION__MASK 0x00000c00 2425 + #define A6XX_GRAS_SC_CNTL_ROTATION__SHIFT 10 2426 + static inline uint32_t A6XX_GRAS_SC_CNTL_ROTATION(uint32_t val) 2684 2427 { 2685 - return ((val) << A6XX_GRAS_SC_CNTL_UNK9__SHIFT) & A6XX_GRAS_SC_CNTL_UNK9__MASK; 2428 + return ((val) << A6XX_GRAS_SC_CNTL_ROTATION__SHIFT) & A6XX_GRAS_SC_CNTL_ROTATION__MASK; 2686 2429 } 2687 2430 #define A6XX_GRAS_SC_CNTL_EARLYVIZOUTEN 0x00001000 2688 2431 ··· 2956 2697 #define A6XX_GRAS_LRZ_CNTL_FC_ENABLE 0x00000008 2957 2698 #define A6XX_GRAS_LRZ_CNTL_Z_TEST_ENABLE 0x00000010 2958 2699 #define A6XX_GRAS_LRZ_CNTL_Z_BOUNDS_ENABLE 0x00000020 2959 - #define A6XX_GRAS_LRZ_CNTL_UNK6__MASK 0x000003c0 2960 - #define A6XX_GRAS_LRZ_CNTL_UNK6__SHIFT 6 2961 - static inline uint32_t A6XX_GRAS_LRZ_CNTL_UNK6(uint32_t val) 2700 + #define A6XX_GRAS_LRZ_CNTL_DIR__MASK 0x000000c0 2701 + #define A6XX_GRAS_LRZ_CNTL_DIR__SHIFT 6 2702 + static inline uint32_t A6XX_GRAS_LRZ_CNTL_DIR(enum a6xx_lrz_dir_status val) 2962 2703 { 2963 - return ((val) << A6XX_GRAS_LRZ_CNTL_UNK6__SHIFT) & A6XX_GRAS_LRZ_CNTL_UNK6__MASK; 2704 + return ((val) << A6XX_GRAS_LRZ_CNTL_DIR__SHIFT) & A6XX_GRAS_LRZ_CNTL_DIR__MASK; 2964 2705 } 2706 + #define A6XX_GRAS_LRZ_CNTL_DIR_WRITE 0x00000100 2707 + #define A6XX_GRAS_LRZ_CNTL_DISABLE_ON_WRONG_DIR 0x00000200 2965 2708 2966 2709 #define REG_A6XX_GRAS_LRZ_PS_INPUT_CNTL 0x00008101 2967 2710 #define A6XX_GRAS_LRZ_PS_INPUT_CNTL_SAMPLEID 0x00000001 ··· 3015 2754 #define REG_A6XX_GRAS_SAMPLE_CNTL 0x00008109 3016 2755 #define A6XX_GRAS_SAMPLE_CNTL_PER_SAMP_MODE 0x00000001 3017 2756 3018 - #define REG_A6XX_GRAS_UNKNOWN_810A 0x0000810a 3019 - #define A6XX_GRAS_UNKNOWN_810A_UNK0__MASK 0x000007ff 3020 - #define A6XX_GRAS_UNKNOWN_810A_UNK0__SHIFT 0 3021 - static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK0(uint32_t val) 2757 + #define REG_A6XX_GRAS_LRZ_DEPTH_VIEW 0x0000810a 2758 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__MASK 0x000007ff 2759 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__SHIFT 0 2760 + static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER(uint32_t val) 3022 2761 { 3023 - return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK0__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK0__MASK; 2762 + return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__MASK; 3024 2763 } 3025 - #define A6XX_GRAS_UNKNOWN_810A_UNK16__MASK 0x07ff0000 3026 - #define A6XX_GRAS_UNKNOWN_810A_UNK16__SHIFT 16 3027 - static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK16(uint32_t val) 2764 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__MASK 0x07ff0000 2765 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__SHIFT 16 2766 + static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT(uint32_t val) 3028 2767 { 3029 - return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK16__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK16__MASK; 2768 + return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__MASK; 3030 2769 } 3031 - #define A6XX_GRAS_UNKNOWN_810A_UNK28__MASK 0xf0000000 3032 - #define A6XX_GRAS_UNKNOWN_810A_UNK28__SHIFT 28 3033 - static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK28(uint32_t val) 2770 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__MASK 0xf0000000 2771 + #define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__SHIFT 28 2772 + static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL(uint32_t val) 3034 2773 { 3035 - return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK28__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK28__MASK; 2774 + return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__MASK; 3036 2775 } 3037 2776 3038 2777 #define REG_A6XX_GRAS_UNKNOWN_8110 0x00008110 ··· 3160 2899 #define A6XX_GRAS_DBG_ECO_CNTL_LRZCACHELOCKDIS 0x00000800 3161 2900 3162 2901 #define REG_A6XX_GRAS_ADDR_MODE_CNTL 0x00008601 2902 + 2903 + #define REG_A7XX_GRAS_NC_MODE_CNTL 0x00008602 3163 2904 3164 2905 static inline uint32_t REG_A6XX_GRAS_PERFCTR_TSE_SEL(uint32_t i0) { return 0x00008610 + 0x1*i0; } 3165 2906 ··· 3389 3126 3390 3127 #define REG_A6XX_RB_RENDER_CONTROL1 0x0000880a 3391 3128 #define A6XX_RB_RENDER_CONTROL1_SAMPLEMASK 0x00000001 3392 - #define A6XX_RB_RENDER_CONTROL1_UNK1 0x00000002 3129 + #define A6XX_RB_RENDER_CONTROL1_POSTDEPTHCOVERAGE 0x00000002 3393 3130 #define A6XX_RB_RENDER_CONTROL1_FACENESS 0x00000004 3394 3131 #define A6XX_RB_RENDER_CONTROL1_SAMPLEID 0x00000008 3395 3132 #define A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__MASK 0x00000030 ··· 3398 3135 { 3399 3136 return ((val) << A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__SHIFT) & A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__MASK; 3400 3137 } 3401 - #define A6XX_RB_RENDER_CONTROL1_SIZE 0x00000040 3138 + #define A6XX_RB_RENDER_CONTROL1_CENTERRHW 0x00000040 3402 3139 #define A6XX_RB_RENDER_CONTROL1_LINELENGTHEN 0x00000080 3403 3140 #define A6XX_RB_RENDER_CONTROL1_FOVEATION 0x00000100 3404 3141 ··· 3954 3691 } 3955 3692 3956 3693 #define REG_A6XX_RB_SAMPLE_COUNT_CONTROL 0x00008891 3957 - #define A6XX_RB_SAMPLE_COUNT_CONTROL_UNK0 0x00000001 3694 + #define A6XX_RB_SAMPLE_COUNT_CONTROL_DISABLE 0x00000001 3958 3695 #define A6XX_RB_SAMPLE_COUNT_CONTROL_COPY 0x00000002 3959 3696 3960 3697 #define REG_A6XX_RB_LRZ_CNTL 0x00008898 ··· 4046 3783 return ((val) << A6XX_RB_WINDOW_OFFSET2_Y__SHIFT) & A6XX_RB_WINDOW_OFFSET2_Y__MASK; 4047 3784 } 4048 3785 4049 - #define REG_A6XX_RB_MSAA_CNTL 0x000088d5 4050 - #define A6XX_RB_MSAA_CNTL_SAMPLES__MASK 0x00000018 4051 - #define A6XX_RB_MSAA_CNTL_SAMPLES__SHIFT 3 4052 - static inline uint32_t A6XX_RB_MSAA_CNTL_SAMPLES(enum a3xx_msaa_samples val) 3786 + #define REG_A6XX_RB_BLIT_GMEM_MSAA_CNTL 0x000088d5 3787 + #define A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__MASK 0x00000018 3788 + #define A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__SHIFT 3 3789 + static inline uint32_t A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES(enum a3xx_msaa_samples val) 4053 3790 { 4054 - return ((val) << A6XX_RB_MSAA_CNTL_SAMPLES__SHIFT) & A6XX_RB_MSAA_CNTL_SAMPLES__MASK; 3791 + return ((val) << A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__SHIFT) & A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__MASK; 4055 3792 } 4056 3793 4057 3794 #define REG_A6XX_RB_BLIT_BASE_GMEM 0x000088d6 ··· 4155 3892 { 4156 3893 return ((val) << A6XX_RB_BLIT_INFO_CLEAR_MASK__SHIFT) & A6XX_RB_BLIT_INFO_CLEAR_MASK__MASK; 4157 3894 } 4158 - #define A6XX_RB_BLIT_INFO_UNK8__MASK 0x00000300 4159 - #define A6XX_RB_BLIT_INFO_UNK8__SHIFT 8 4160 - static inline uint32_t A6XX_RB_BLIT_INFO_UNK8(uint32_t val) 3895 + #define A6XX_RB_BLIT_INFO_LAST__MASK 0x00000300 3896 + #define A6XX_RB_BLIT_INFO_LAST__SHIFT 8 3897 + static inline uint32_t A6XX_RB_BLIT_INFO_LAST(uint32_t val) 4161 3898 { 4162 - return ((val) << A6XX_RB_BLIT_INFO_UNK8__SHIFT) & A6XX_RB_BLIT_INFO_UNK8__MASK; 3899 + return ((val) << A6XX_RB_BLIT_INFO_LAST__SHIFT) & A6XX_RB_BLIT_INFO_LAST__MASK; 4163 3900 } 4164 - #define A6XX_RB_BLIT_INFO_UNK12__MASK 0x0000f000 4165 - #define A6XX_RB_BLIT_INFO_UNK12__SHIFT 12 4166 - static inline uint32_t A6XX_RB_BLIT_INFO_UNK12(uint32_t val) 3901 + #define A6XX_RB_BLIT_INFO_BUFFER_ID__MASK 0x0000f000 3902 + #define A6XX_RB_BLIT_INFO_BUFFER_ID__SHIFT 12 3903 + static inline uint32_t A6XX_RB_BLIT_INFO_BUFFER_ID(uint32_t val) 4167 3904 { 4168 - return ((val) << A6XX_RB_BLIT_INFO_UNK12__SHIFT) & A6XX_RB_BLIT_INFO_UNK12__MASK; 3905 + return ((val) << A6XX_RB_BLIT_INFO_BUFFER_ID__SHIFT) & A6XX_RB_BLIT_INFO_BUFFER_ID__MASK; 4169 3906 } 4170 3907 4171 3908 #define REG_A6XX_RB_UNKNOWN_88F0 0x000088f0 ··· 4436 4173 4437 4174 #define REG_A6XX_RB_UNKNOWN_8E01 0x00008e01 4438 4175 4439 - #define REG_A6XX_RB_UNKNOWN_8E04 0x00008e04 4176 + #define REG_A6XX_RB_DBG_ECO_CNTL 0x00008e04 4440 4177 4441 4178 #define REG_A6XX_RB_ADDR_MODE_CNTL 0x00008e05 4442 4179 4443 4180 #define REG_A6XX_RB_CCU_CNTL 0x00008e07 4444 - #define A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK 0xff800000 4445 - #define A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT 23 4446 - static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET(uint32_t val) 4181 + #define A6XX_RB_CCU_CNTL_CONCURRENT_RESOLVE 0x00000004 4182 + #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__MASK 0x00000080 4183 + #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__SHIFT 7 4184 + static inline uint32_t A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI(uint32_t val) 4447 4185 { 4448 - return ((val >> 12) << A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK; 4186 + return ((val) << A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__SHIFT) & A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__MASK; 4187 + } 4188 + #define A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__MASK 0x00000200 4189 + #define A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__SHIFT 9 4190 + static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI(uint32_t val) 4191 + { 4192 + return ((val) << A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__MASK; 4449 4193 } 4450 4194 #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET__MASK 0x001ff000 4451 4195 #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET__SHIFT 12 ··· 4461 4191 return ((val >> 12) << A6XX_RB_CCU_CNTL_DEPTH_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_DEPTH_OFFSET__MASK; 4462 4192 } 4463 4193 #define A6XX_RB_CCU_CNTL_GMEM 0x00400000 4464 - #define A6XX_RB_CCU_CNTL_UNK2 0x00000004 4194 + #define A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK 0xff800000 4195 + #define A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT 23 4196 + static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET(uint32_t val) 4197 + { 4198 + return ((val >> 12) << A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK; 4199 + } 4465 4200 4466 4201 #define REG_A6XX_RB_NC_MODE_CNTL 0x00008e08 4467 4202 #define A6XX_RB_NC_MODE_CNTL_MODE 0x00000001 ··· 4499 4224 #define REG_A6XX_RB_UNKNOWN_8E28 0x00008e28 4500 4225 4501 4226 static inline uint32_t REG_A6XX_RB_PERFCTR_CMP_SEL(uint32_t i0) { return 0x00008e2c + 0x1*i0; } 4227 + 4228 + static inline uint32_t REG_A7XX_RB_PERFCTR_UFC_SEL(uint32_t i0) { return 0x00008e30 + 0x1*i0; } 4502 4229 4503 4230 #define REG_A6XX_RB_RB_SUB_BLOCK_SEL_CNTL_HOST 0x00008e3b 4504 4231 ··· 4717 4440 return ((val >> 2) << A6XX_VPC_SO_BUFFER_SIZE__SHIFT) & A6XX_VPC_SO_BUFFER_SIZE__MASK; 4718 4441 } 4719 4442 4720 - static inline uint32_t REG_A6XX_VPC_SO_NCOMP(uint32_t i0) { return 0x0000921d + 0x7*i0; } 4443 + static inline uint32_t REG_A6XX_VPC_SO_BUFFER_STRIDE(uint32_t i0) { return 0x0000921d + 0x7*i0; } 4444 + #define A6XX_VPC_SO_BUFFER_STRIDE__MASK 0x000003ff 4445 + #define A6XX_VPC_SO_BUFFER_STRIDE__SHIFT 0 4446 + static inline uint32_t A6XX_VPC_SO_BUFFER_STRIDE(uint32_t val) 4447 + { 4448 + return ((val >> 2) << A6XX_VPC_SO_BUFFER_STRIDE__SHIFT) & A6XX_VPC_SO_BUFFER_STRIDE__MASK; 4449 + } 4721 4450 4722 4451 static inline uint32_t REG_A6XX_VPC_SO_BUFFER_OFFSET(uint32_t i0) { return 0x0000921e + 0x7*i0; } 4723 4452 #define A6XX_VPC_SO_BUFFER_OFFSET__MASK 0xfffffffc ··· 4880 4597 #define REG_A6XX_VPC_SO_DISABLE 0x00009306 4881 4598 #define A6XX_VPC_SO_DISABLE_DISABLE 0x00000001 4882 4599 4883 - #define REG_A6XX_VPC_UNKNOWN_9600 0x00009600 4600 + #define REG_A6XX_VPC_DBG_ECO_CNTL 0x00009600 4884 4601 4885 4602 #define REG_A6XX_VPC_ADDR_MODE_CNTL 0x00009601 4886 4603 ··· 4889 4606 #define REG_A6XX_VPC_UNKNOWN_9603 0x00009603 4890 4607 4891 4608 static inline uint32_t REG_A6XX_VPC_PERFCTR_VPC_SEL(uint32_t i0) { return 0x00009604 + 0x1*i0; } 4609 + 4610 + static inline uint32_t REG_A7XX_VPC_PERFCTR_VPC_SEL(uint32_t i0) { return 0x0000960b + 0x1*i0; } 4892 4611 4893 4612 #define REG_A6XX_PC_TESS_NUM_VERTEX 0x00009800 4894 4613 ··· 4931 4646 #define REG_A6XX_PC_PRIMID_PASSTHRU 0x00009806 4932 4647 4933 4648 #define REG_A6XX_PC_SO_STREAM_CNTL 0x00009808 4934 - #define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE 0x00008000 4649 + #define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__MASK 0x00078000 4650 + #define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__SHIFT 15 4651 + static inline uint32_t A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE(uint32_t val) 4652 + { 4653 + return ((val) << A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__SHIFT) & A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__MASK; 4654 + } 4935 4655 4936 4656 #define REG_A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL 0x0000980a 4937 4657 #define A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL_CONSERVATIVERASEN 0x00000001 ··· 5226 4936 5227 4937 static inline uint32_t REG_A6XX_PC_PERFCTR_PC_SEL(uint32_t i0) { return 0x00009e34 + 0x1*i0; } 5228 4938 4939 + static inline uint32_t REG_A7XX_PC_PERFCTR_PC_SEL(uint32_t i0) { return 0x00009e42 + 0x1*i0; } 4940 + 5229 4941 #define REG_A6XX_PC_UNKNOWN_9E72 0x00009e72 5230 4942 5231 4943 #define REG_A6XX_VFD_CONTROL_0 0x0000a000 ··· 5430 5138 5431 5139 static inline uint32_t REG_A6XX_VFD_PERFCTR_VFD_SEL(uint32_t i0) { return 0x0000a610 + 0x1*i0; } 5432 5140 5141 + static inline uint32_t REG_A7XX_VFD_PERFCTR_VFD_SEL(uint32_t i0) { return 0x0000a610 + 0x1*i0; } 5142 + 5433 5143 #define REG_A6XX_SP_VS_CTRL_REG0 0x0000a800 5434 5144 #define A6XX_SP_VS_CTRL_REG0_MERGEDREGS 0x00100000 5435 - #define A6XX_SP_VS_CTRL_REG0_UNK21 0x00200000 5145 + #define A6XX_SP_VS_CTRL_REG0_EARLYPREAMBLE 0x00200000 5436 5146 #define A6XX_SP_VS_CTRL_REG0_THREADMODE__MASK 0x00000001 5437 5147 #define A6XX_SP_VS_CTRL_REG0_THREADMODE__SHIFT 0 5438 5148 static inline uint32_t A6XX_SP_VS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) ··· 5612 5318 } 5613 5319 5614 5320 #define REG_A6XX_SP_HS_CTRL_REG0 0x0000a830 5615 - #define A6XX_SP_HS_CTRL_REG0_UNK20 0x00100000 5321 + #define A6XX_SP_HS_CTRL_REG0_EARLYPREAMBLE 0x00100000 5616 5322 #define A6XX_SP_HS_CTRL_REG0_THREADMODE__MASK 0x00000001 5617 5323 #define A6XX_SP_HS_CTRL_REG0_THREADMODE__SHIFT 0 5618 5324 static inline uint32_t A6XX_SP_HS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) ··· 5722 5428 } 5723 5429 5724 5430 #define REG_A6XX_SP_DS_CTRL_REG0 0x0000a840 5725 - #define A6XX_SP_DS_CTRL_REG0_MERGEDREGS 0x00100000 5431 + #define A6XX_SP_DS_CTRL_REG0_EARLYPREAMBLE 0x00100000 5726 5432 #define A6XX_SP_DS_CTRL_REG0_THREADMODE__MASK 0x00000001 5727 5433 #define A6XX_SP_DS_CTRL_REG0_THREADMODE__SHIFT 0 5728 5434 static inline uint32_t A6XX_SP_DS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) ··· 5900 5606 } 5901 5607 5902 5608 #define REG_A6XX_SP_GS_CTRL_REG0 0x0000a870 5903 - #define A6XX_SP_GS_CTRL_REG0_UNK20 0x00100000 5609 + #define A6XX_SP_GS_CTRL_REG0_EARLYPREAMBLE 0x00100000 5904 5610 #define A6XX_SP_GS_CTRL_REG0_THREADMODE__MASK 0x00000001 5905 5611 #define A6XX_SP_GS_CTRL_REG0_THREADMODE__SHIFT 0 5906 5612 static inline uint32_t A6XX_SP_GS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) ··· 6156 5862 #define A6XX_SP_FS_CTRL_REG0_UNK24 0x01000000 6157 5863 #define A6XX_SP_FS_CTRL_REG0_UNK25 0x02000000 6158 5864 #define A6XX_SP_FS_CTRL_REG0_PIXLODENABLE 0x04000000 6159 - #define A6XX_SP_FS_CTRL_REG0_UNK27__MASK 0x18000000 6160 - #define A6XX_SP_FS_CTRL_REG0_UNK27__SHIFT 27 6161 - static inline uint32_t A6XX_SP_FS_CTRL_REG0_UNK27(uint32_t val) 6162 - { 6163 - return ((val) << A6XX_SP_FS_CTRL_REG0_UNK27__SHIFT) & A6XX_SP_FS_CTRL_REG0_UNK27__MASK; 6164 - } 5865 + #define A6XX_SP_FS_CTRL_REG0_UNK27 0x08000000 5866 + #define A6XX_SP_FS_CTRL_REG0_EARLYPREAMBLE 0x10000000 6165 5867 #define A6XX_SP_FS_CTRL_REG0_MERGEDREGS 0x80000000 6166 5868 #define A6XX_SP_FS_CTRL_REG0_THREADMODE__MASK 0x00000001 6167 5869 #define A6XX_SP_FS_CTRL_REG0_THREADMODE__SHIFT 0 ··· 6359 6069 { 6360 6070 return ((val) << A6XX_SP_FS_PREFETCH_CNTL_COUNT__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_COUNT__MASK; 6361 6071 } 6362 - #define A6XX_SP_FS_PREFETCH_CNTL_UNK3 0x00000008 6363 - #define A6XX_SP_FS_PREFETCH_CNTL_UNK4__MASK 0x00000ff0 6364 - #define A6XX_SP_FS_PREFETCH_CNTL_UNK4__SHIFT 4 6365 - static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK4(uint32_t val) 6072 + #define A6XX_SP_FS_PREFETCH_CNTL_IJ_WRITE_DISABLE 0x00000008 6073 + #define A6XX_SP_FS_PREFETCH_CNTL_UNK4 0x00000010 6074 + #define A6XX_SP_FS_PREFETCH_CNTL_WRITE_COLOR_TO_OUTPUT 0x00000020 6075 + #define A6XX_SP_FS_PREFETCH_CNTL_UNK6__MASK 0x00007fc0 6076 + #define A6XX_SP_FS_PREFETCH_CNTL_UNK6__SHIFT 6 6077 + static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK6(uint32_t val) 6366 6078 { 6367 - return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK4__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK4__MASK; 6368 - } 6369 - #define A6XX_SP_FS_PREFETCH_CNTL_UNK12__MASK 0x00007000 6370 - #define A6XX_SP_FS_PREFETCH_CNTL_UNK12__SHIFT 12 6371 - static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK12(uint32_t val) 6372 - { 6373 - return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK12__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK12__MASK; 6079 + return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK6__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK6__MASK; 6374 6080 } 6375 6081 6376 6082 static inline uint32_t REG_A6XX_SP_FS_PREFETCH(uint32_t i0) { return 0x0000a99f + 0x1*i0; } ··· 6403 6117 return ((val) << A6XX_SP_FS_PREFETCH_CMD_WRMASK__SHIFT) & A6XX_SP_FS_PREFETCH_CMD_WRMASK__MASK; 6404 6118 } 6405 6119 #define A6XX_SP_FS_PREFETCH_CMD_HALF 0x04000000 6406 - #define A6XX_SP_FS_PREFETCH_CMD_CMD__MASK 0xf8000000 6407 - #define A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT 27 6408 - static inline uint32_t A6XX_SP_FS_PREFETCH_CMD_CMD(uint32_t val) 6120 + #define A6XX_SP_FS_PREFETCH_CMD_UNK27 0x08000000 6121 + #define A6XX_SP_FS_PREFETCH_CMD_BINDLESS 0x10000000 6122 + #define A6XX_SP_FS_PREFETCH_CMD_CMD__MASK 0xe0000000 6123 + #define A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT 29 6124 + static inline uint32_t A6XX_SP_FS_PREFETCH_CMD_CMD(enum a6xx_tex_prefetch_cmd val) 6409 6125 { 6410 6126 return ((val) << A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT) & A6XX_SP_FS_PREFETCH_CMD_CMD__MASK; 6411 6127 } ··· 6449 6161 } 6450 6162 #define A6XX_SP_CS_CTRL_REG0_UNK21 0x00200000 6451 6163 #define A6XX_SP_CS_CTRL_REG0_UNK22 0x00400000 6452 - #define A6XX_SP_CS_CTRL_REG0_SEPARATEPROLOG 0x00800000 6164 + #define A6XX_SP_CS_CTRL_REG0_EARLYPREAMBLE 0x00800000 6453 6165 #define A6XX_SP_CS_CTRL_REG0_MERGEDREGS 0x80000000 6454 6166 #define A6XX_SP_CS_CTRL_REG0_THREADMODE__MASK 0x00000001 6455 6167 #define A6XX_SP_CS_CTRL_REG0_THREADMODE__SHIFT 0 ··· 6643 6355 6644 6356 static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } 6645 6357 6646 - static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } 6358 + static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } 6359 + #define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK 0x00000003 6360 + #define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT 0 6361 + static inline uint32_t A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) 6362 + { 6363 + return ((val) << A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; 6364 + } 6365 + #define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK 0xfffffffc 6366 + #define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT 2 6367 + static inline uint32_t A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) 6368 + { 6369 + return ((val >> 2) << A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; 6370 + } 6647 6371 6648 6372 #define REG_A6XX_SP_CS_IBO 0x0000a9f2 6649 6373 #define A6XX_SP_CS_IBO__MASK 0xffffffff ··· 6706 6406 6707 6407 static inline uint32_t REG_A6XX_SP_BINDLESS_BASE(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } 6708 6408 6709 - static inline uint32_t REG_A6XX_SP_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } 6409 + static inline uint32_t REG_A6XX_SP_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } 6410 + #define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK 0x00000003 6411 + #define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT 0 6412 + static inline uint32_t A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) 6413 + { 6414 + return ((val) << A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; 6415 + } 6416 + #define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK 0xfffffffc 6417 + #define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT 2 6418 + static inline uint32_t A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) 6419 + { 6420 + return ((val >> 2) << A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; 6421 + } 6710 6422 6711 6423 #define REG_A6XX_SP_IBO 0x0000ab1a 6712 6424 #define A6XX_SP_IBO__MASK 0xffffffff ··· 6748 6436 return ((val) << A6XX_SP_2D_DST_FORMAT_MASK__SHIFT) & A6XX_SP_2D_DST_FORMAT_MASK__MASK; 6749 6437 } 6750 6438 6751 - #define REG_A6XX_SP_UNKNOWN_AE00 0x0000ae00 6439 + #define REG_A6XX_SP_DBG_ECO_CNTL 0x0000ae00 6752 6440 6753 6441 #define REG_A6XX_SP_ADDR_MODE_CNTL 0x0000ae01 6754 6442 ··· 6768 6456 #define A6XX_SP_PERFCTR_ENABLE_CS 0x00000020 6769 6457 6770 6458 static inline uint32_t REG_A6XX_SP_PERFCTR_SP_SEL(uint32_t i0) { return 0x0000ae10 + 0x1*i0; } 6459 + 6460 + static inline uint32_t REG_A7XX_SP_PERFCTR_HLSQ_SEL(uint32_t i0) { return 0x0000ae60 + 0x1*i0; } 6461 + 6462 + #define REG_A7XX_SP_READ_SEL 0x0000ae6d 6463 + 6464 + static inline uint32_t REG_A7XX_SP_PERFCTR_SP_SEL(uint32_t i0) { return 0x0000ae80 + 0x1*i0; } 6771 6465 6772 6466 #define REG_A6XX_SP_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE 0x0000be22 6773 6467 ··· 7205 6887 7206 6888 #define REG_A6XX_HLSQ_CONTROL_1_REG 0x0000b982 7207 6889 6890 + #define REG_A7XX_HLSQ_CONTROL_1_REG 0x0000a9c7 6891 + 7208 6892 #define REG_A6XX_HLSQ_CONTROL_2_REG 0x0000b983 7209 6893 #define A6XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK 0x000000ff 7210 6894 #define A6XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT 0 ··· 7226 6906 { 7227 6907 return ((val) << A6XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK; 7228 6908 } 7229 - #define A6XX_HLSQ_CONTROL_2_REG_SIZE__MASK 0xff000000 7230 - #define A6XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT 24 7231 - static inline uint32_t A6XX_HLSQ_CONTROL_2_REG_SIZE(uint32_t val) 6909 + #define A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK 0xff000000 6910 + #define A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT 24 6911 + static inline uint32_t A6XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val) 7232 6912 { 7233 - return ((val) << A6XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_SIZE__MASK; 6913 + return ((val) << A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK; 6914 + } 6915 + 6916 + #define REG_A7XX_HLSQ_CONTROL_2_REG 0x0000a9c8 6917 + #define A7XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK 0x000000ff 6918 + #define A7XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT 0 6919 + static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_FACEREGID(uint32_t val) 6920 + { 6921 + return ((val) << A7XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK; 6922 + } 6923 + #define A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__MASK 0x0000ff00 6924 + #define A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__SHIFT 8 6925 + static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_SAMPLEID(uint32_t val) 6926 + { 6927 + return ((val) << A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__MASK; 6928 + } 6929 + #define A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK 0x00ff0000 6930 + #define A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT 16 6931 + static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK(uint32_t val) 6932 + { 6933 + return ((val) << A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK; 6934 + } 6935 + #define A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK 0xff000000 6936 + #define A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT 24 6937 + static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val) 6938 + { 6939 + return ((val) << A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK; 7234 6940 } 7235 6941 7236 6942 #define REG_A6XX_HLSQ_CONTROL_3_REG 0x0000b984 ··· 7285 6939 return ((val) << A6XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT) & A6XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK; 7286 6940 } 7287 6941 6942 + #define REG_A7XX_HLSQ_CONTROL_3_REG 0x0000a9c9 6943 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__MASK 0x000000ff 6944 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__SHIFT 0 6945 + static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL(uint32_t val) 6946 + { 6947 + return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__MASK; 6948 + } 6949 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__MASK 0x0000ff00 6950 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__SHIFT 8 6951 + static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL(uint32_t val) 6952 + { 6953 + return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__MASK; 6954 + } 6955 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__MASK 0x00ff0000 6956 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__SHIFT 16 6957 + static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID(uint32_t val) 6958 + { 6959 + return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__MASK; 6960 + } 6961 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK 0xff000000 6962 + #define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT 24 6963 + static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID(uint32_t val) 6964 + { 6965 + return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK; 6966 + } 6967 + 7288 6968 #define REG_A6XX_HLSQ_CONTROL_4_REG 0x0000b985 7289 6969 #define A6XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK 0x000000ff 7290 6970 #define A6XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT 0 ··· 7337 6965 return ((val) << A6XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT) & A6XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK; 7338 6966 } 7339 6967 6968 + #define REG_A7XX_HLSQ_CONTROL_4_REG 0x0000a9ca 6969 + #define A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK 0x000000ff 6970 + #define A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT 0 6971 + static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE(uint32_t val) 6972 + { 6973 + return ((val) << A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK; 6974 + } 6975 + #define A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__MASK 0x0000ff00 6976 + #define A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__SHIFT 8 6977 + static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE(uint32_t val) 6978 + { 6979 + return ((val) << A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__MASK; 6980 + } 6981 + #define A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__MASK 0x00ff0000 6982 + #define A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__SHIFT 16 6983 + static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID(uint32_t val) 6984 + { 6985 + return ((val) << A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__MASK; 6986 + } 6987 + #define A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK 0xff000000 6988 + #define A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT 24 6989 + static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID(uint32_t val) 6990 + { 6991 + return ((val) << A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK; 6992 + } 6993 + 7340 6994 #define REG_A6XX_HLSQ_CONTROL_5_REG 0x0000b986 7341 6995 #define A6XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK 0x000000ff 7342 6996 #define A6XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT 0 ··· 7375 6977 static inline uint32_t A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID(uint32_t val) 7376 6978 { 7377 6979 return ((val) << A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT) & A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK; 6980 + } 6981 + 6982 + #define REG_A7XX_HLSQ_CONTROL_5_REG 0x0000a9cb 6983 + #define A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK 0x000000ff 6984 + #define A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT 0 6985 + static inline uint32_t A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID(uint32_t val) 6986 + { 6987 + return ((val) << A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT) & A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK; 6988 + } 6989 + #define A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK 0x0000ff00 6990 + #define A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT 8 6991 + static inline uint32_t A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID(uint32_t val) 6992 + { 6993 + return ((val) << A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT) & A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK; 7378 6994 } 7379 6995 7380 6996 #define REG_A6XX_HLSQ_CS_CNTL 0x0000b987 ··· 7536 7124 7537 7125 static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } 7538 7126 7539 - static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } 7127 + static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } 7128 + #define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK 0x00000003 7129 + #define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT 0 7130 + static inline uint32_t A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) 7131 + { 7132 + return ((val) << A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; 7133 + } 7134 + #define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK 0xfffffffc 7135 + #define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT 2 7136 + static inline uint32_t A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) 7137 + { 7138 + return ((val >> 2) << A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; 7139 + } 7540 7140 7541 7141 #define REG_A6XX_HLSQ_CS_UNKNOWN_B9D0 0x0000b9d0 7542 7142 #define A6XX_HLSQ_CS_UNKNOWN_B9D0_SHARED_SIZE__MASK 0x0000001f ··· 7628 7204 7629 7205 static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } 7630 7206 7631 - static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } 7207 + static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } 7208 + #define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK 0x00000003 7209 + #define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT 0 7210 + static inline uint32_t A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) 7211 + { 7212 + return ((val) << A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; 7213 + } 7214 + #define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK 0xfffffffc 7215 + #define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT 2 7216 + static inline uint32_t A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) 7217 + { 7218 + return ((val >> 2) << A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; 7219 + } 7632 7220 7633 7221 #define REG_A6XX_HLSQ_2D_EVENT_CMD 0x0000bd80 7634 7222 #define A6XX_HLSQ_2D_EVENT_CMD_STATE_ID__MASK 0x0000ff00 ··· 7660 7224 7661 7225 #define REG_A6XX_HLSQ_UNKNOWN_BE01 0x0000be01 7662 7226 7663 - #define REG_A6XX_HLSQ_UNKNOWN_BE04 0x0000be04 7227 + #define REG_A6XX_HLSQ_DBG_ECO_CNTL 0x0000be04 7664 7228 7665 7229 #define REG_A6XX_HLSQ_ADDR_MODE_CNTL 0x0000be05 7666 7230 ··· 7669 7233 static inline uint32_t REG_A6XX_HLSQ_PERFCTR_HLSQ_SEL(uint32_t i0) { return 0x0000be10 + 0x1*i0; } 7670 7234 7671 7235 #define REG_A6XX_HLSQ_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE 0x0000be22 7236 + 7237 + #define REG_A7XX_SP_AHB_READ_APERTURE 0x0000c000 7672 7238 7673 7239 #define REG_A6XX_CP_EVENT_START 0x0000d600 7674 7240 #define A6XX_CP_EVENT_START_STATE_ID__MASK 0x000000ff ··· 7864 7426 } 7865 7427 7866 7428 #define REG_A6XX_TEX_CONST_2 0x00000002 7867 - #define A6XX_TEX_CONST_2_BUFFER 0x00000010 7429 + #define A6XX_TEX_CONST_2_STRUCTSIZETEXELS__MASK 0x0000fff0 7430 + #define A6XX_TEX_CONST_2_STRUCTSIZETEXELS__SHIFT 4 7431 + static inline uint32_t A6XX_TEX_CONST_2_STRUCTSIZETEXELS(uint32_t val) 7432 + { 7433 + return ((val) << A6XX_TEX_CONST_2_STRUCTSIZETEXELS__SHIFT) & A6XX_TEX_CONST_2_STRUCTSIZETEXELS__MASK; 7434 + } 7435 + #define A6XX_TEX_CONST_2_STARTOFFSETTEXELS__MASK 0x003f0000 7436 + #define A6XX_TEX_CONST_2_STARTOFFSETTEXELS__SHIFT 16 7437 + static inline uint32_t A6XX_TEX_CONST_2_STARTOFFSETTEXELS(uint32_t val) 7438 + { 7439 + return ((val) << A6XX_TEX_CONST_2_STARTOFFSETTEXELS__SHIFT) & A6XX_TEX_CONST_2_STARTOFFSETTEXELS__MASK; 7440 + } 7868 7441 #define A6XX_TEX_CONST_2_PITCHALIGN__MASK 0x0000000f 7869 7442 #define A6XX_TEX_CONST_2_PITCHALIGN__SHIFT 0 7870 7443 static inline uint32_t A6XX_TEX_CONST_2_PITCHALIGN(uint32_t val) ··· 7934 7485 } 7935 7486 7936 7487 #define REG_A6XX_TEX_CONST_6 0x00000006 7488 + #define A6XX_TEX_CONST_6_MIN_LOD_CLAMP__MASK 0x00000fff 7489 + #define A6XX_TEX_CONST_6_MIN_LOD_CLAMP__SHIFT 0 7490 + static inline uint32_t A6XX_TEX_CONST_6_MIN_LOD_CLAMP(float val) 7491 + { 7492 + return ((((uint32_t)(val * 256.0))) << A6XX_TEX_CONST_6_MIN_LOD_CLAMP__SHIFT) & A6XX_TEX_CONST_6_MIN_LOD_CLAMP__MASK; 7493 + } 7937 7494 #define A6XX_TEX_CONST_6_PLANE_PITCH__MASK 0xffffff00 7938 7495 #define A6XX_TEX_CONST_6_PLANE_PITCH__SHIFT 8 7939 7496 static inline uint32_t A6XX_TEX_CONST_6_PLANE_PITCH(uint32_t val)
+50 -14
drivers/gpu/drm/msm/adreno/a6xx_gmu.c
··· 621 621 /* ensure no writes happen before the uCode is fully written */ 622 622 wmb(); 623 623 624 + a6xx_rpmh_stop(gmu); 625 + 624 626 err: 625 627 if (!IS_ERR_OR_NULL(pdcptr)) 626 628 iounmap(pdcptr); ··· 755 753 756 754 static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state) 757 755 { 758 - static bool rpmh_init; 759 756 struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); 760 757 struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; 761 758 int ret; ··· 777 776 /* Turn on register retention */ 778 777 gmu_write(gmu, REG_A6XX_GMU_GENERAL_7, 1); 779 778 780 - /* We only need to load the RPMh microcode once */ 781 - if (!rpmh_init) { 782 - a6xx_gmu_rpmh_init(gmu); 783 - rpmh_init = true; 784 - } else { 785 - ret = a6xx_rpmh_start(gmu); 786 - if (ret) 787 - return ret; 788 - } 779 + ret = a6xx_rpmh_start(gmu); 780 + if (ret) 781 + return ret; 789 782 790 783 ret = a6xx_gmu_fw_load(gmu); 791 784 if (ret) ··· 1477 1482 1478 1483 pm_runtime_force_suspend(gmu->dev); 1479 1484 1485 + /* 1486 + * Since cxpd is a virt device, the devlink with gmu-dev will be removed 1487 + * automatically when we do detach 1488 + */ 1489 + dev_pm_domain_detach(gmu->cxpd, false); 1490 + 1480 1491 if (!IS_ERR_OR_NULL(gmu->gxpd)) { 1481 1492 pm_runtime_disable(gmu->gxpd); 1482 1493 dev_pm_domain_detach(gmu->gxpd, false); ··· 1503 1502 put_device(gmu->dev); 1504 1503 1505 1504 gmu->initialized = false; 1505 + } 1506 + 1507 + static int cxpd_notifier_cb(struct notifier_block *nb, 1508 + unsigned long action, void *data) 1509 + { 1510 + struct a6xx_gmu *gmu = container_of(nb, struct a6xx_gmu, pd_nb); 1511 + 1512 + if (action == GENPD_NOTIFY_OFF) 1513 + complete_all(&gmu->pd_gate); 1514 + 1515 + return 0; 1506 1516 } 1507 1517 1508 1518 int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node) ··· 1620 1608 1621 1609 if (adreno_is_a650_family(adreno_gpu)) { 1622 1610 gmu->rscc = a6xx_gmu_get_mmio(pdev, "rscc"); 1623 - if (IS_ERR(gmu->rscc)) 1611 + if (IS_ERR(gmu->rscc)) { 1612 + ret = -ENODEV; 1624 1613 goto err_mmio; 1614 + } 1625 1615 } else { 1626 1616 gmu->rscc = gmu->mmio + 0x23000; 1627 1617 } ··· 1632 1618 gmu->hfi_irq = a6xx_gmu_get_irq(gmu, pdev, "hfi", a6xx_hfi_irq); 1633 1619 gmu->gmu_irq = a6xx_gmu_get_irq(gmu, pdev, "gmu", a6xx_gmu_irq); 1634 1620 1635 - if (gmu->hfi_irq < 0 || gmu->gmu_irq < 0) 1621 + if (gmu->hfi_irq < 0 || gmu->gmu_irq < 0) { 1622 + ret = -ENODEV; 1636 1623 goto err_mmio; 1624 + } 1625 + 1626 + gmu->cxpd = dev_pm_domain_attach_by_name(gmu->dev, "cx"); 1627 + if (IS_ERR(gmu->cxpd)) { 1628 + ret = PTR_ERR(gmu->cxpd); 1629 + goto err_mmio; 1630 + } 1631 + 1632 + if (!device_link_add(gmu->dev, gmu->cxpd, 1633 + DL_FLAG_PM_RUNTIME)) { 1634 + ret = -ENODEV; 1635 + goto detach_cxpd; 1636 + } 1637 + 1638 + init_completion(&gmu->pd_gate); 1639 + complete_all(&gmu->pd_gate); 1640 + gmu->pd_nb.notifier_call = cxpd_notifier_cb; 1637 1641 1638 1642 /* 1639 1643 * Get a link to the GX power domain to reset the GPU in case of GMU ··· 1665 1633 /* Set up the HFI queues */ 1666 1634 a6xx_hfi_init(gmu); 1667 1635 1636 + /* Initialize RPMh */ 1637 + a6xx_gmu_rpmh_init(gmu); 1638 + 1668 1639 gmu->initialized = true; 1669 1640 1670 1641 return 0; 1642 + 1643 + detach_cxpd: 1644 + dev_pm_domain_detach(gmu->cxpd, false); 1671 1645 1672 1646 err_mmio: 1673 1647 iounmap(gmu->mmio); ··· 1681 1643 iounmap(gmu->rscc); 1682 1644 free_irq(gmu->gmu_irq, gmu); 1683 1645 free_irq(gmu->hfi_irq, gmu); 1684 - 1685 - ret = -ENODEV; 1686 1646 1687 1647 err_memory: 1688 1648 a6xx_gmu_memory_free(gmu);
+7
drivers/gpu/drm/msm/adreno/a6xx_gmu.h
··· 4 4 #ifndef _A6XX_GMU_H_ 5 5 #define _A6XX_GMU_H_ 6 6 7 + #include <linux/completion.h> 7 8 #include <linux/iopoll.h> 8 9 #include <linux/interrupt.h> 10 + #include <linux/notifier.h> 9 11 #include "msm_drv.h" 10 12 #include "a6xx_hfi.h" 11 13 ··· 58 56 int gmu_irq; 59 57 60 58 struct device *gxpd; 59 + struct device *cxpd; 61 60 62 61 int idle_level; 63 62 ··· 92 89 bool initialized; 93 90 bool hung; 94 91 bool legacy; /* a618 or a630 */ 92 + 93 + /* For power domain callback */ 94 + struct notifier_block pd_nb; 95 + struct completion pd_gate; 95 96 }; 96 97 97 98 static inline u32 gmu_read(struct a6xx_gmu *gmu, u32 offset)
+14 -14
drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2021 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28
+83 -100
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
··· 10 10 11 11 #include <linux/bitfield.h> 12 12 #include <linux/devfreq.h> 13 - #include <linux/reset.h> 13 + #include <linux/pm_domain.h> 14 14 #include <linux/soc/qcom/llcc-qcom.h> 15 15 16 16 #define GPU_PAS_ID 13 ··· 187 187 * GPU registers so we need to add 0x1a800 to the register value on A630 188 188 * to get the right value from PM4. 189 189 */ 190 - get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO, 190 + get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER, 191 191 rbmemptr_stats(ring, index, alwayson_start)); 192 192 193 193 /* Invalidate CCU depth and color */ ··· 228 228 229 229 get_stats_counter(ring, REG_A6XX_RBBM_PERFCTR_CP(0), 230 230 rbmemptr_stats(ring, index, cpcycles_end)); 231 - get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO, 231 + get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER, 232 232 rbmemptr_stats(ring, index, alwayson_end)); 233 233 234 234 /* Write the fence to the scratch register */ ··· 247 247 OUT_RING(ring, submit->seqno); 248 248 249 249 trace_msm_gpu_submit_flush(submit, 250 - gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO)); 250 + gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER)); 251 251 252 252 a6xx_flush(gpu, ring); 253 253 } ··· 917 917 return ret; 918 918 } 919 919 920 - static int a6xx_ucode_init(struct msm_gpu *gpu) 920 + static int a6xx_ucode_load(struct msm_gpu *gpu) 921 921 { 922 922 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 923 923 struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); ··· 946 946 } 947 947 } 948 948 949 - gpu_write64(gpu, REG_A6XX_CP_SQE_INSTR_BASE, a6xx_gpu->sqe_iova); 949 + /* 950 + * Expanded APRIV and targets that support WHERE_AM_I both need a 951 + * privileged buffer to store the RPTR shadow 952 + */ 953 + if ((adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami) && 954 + !a6xx_gpu->shadow_bo) { 955 + a6xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, 956 + sizeof(u32) * gpu->nr_rings, 957 + MSM_BO_WC | MSM_BO_MAP_PRIV, 958 + gpu->aspace, &a6xx_gpu->shadow_bo, 959 + &a6xx_gpu->shadow_iova); 960 + 961 + if (IS_ERR(a6xx_gpu->shadow)) 962 + return PTR_ERR(a6xx_gpu->shadow); 963 + 964 + msm_gem_object_set_name(a6xx_gpu->shadow_bo, "shadow"); 965 + } 950 966 951 967 return 0; 952 968 } ··· 1013 997 * memory rendering at this point in time and we don't want to block off 1014 998 * part of the virtual memory space. 1015 999 */ 1016 - gpu_write64(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO, 0x00000000); 1000 + gpu_write64(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE, 0x00000000); 1017 1001 gpu_write(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_SIZE, 0x00000000); 1018 1002 1019 1003 /* Turn on 64 bit addressing for all blocks */ ··· 1053 1037 gpu_write(gpu, REG_A6XX_RBBM_PERFCTR_GPU_BUSY_MASKED, 0xffffffff); 1054 1038 1055 1039 /* Disable L2 bypass in the UCHE */ 1056 - gpu_write(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX_LO, 0xffffffc0); 1057 - gpu_write(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX_HI, 0x0001ffff); 1058 - gpu_write(gpu, REG_A6XX_UCHE_TRAP_BASE_LO, 0xfffff000); 1059 - gpu_write(gpu, REG_A6XX_UCHE_TRAP_BASE_HI, 0x0001ffff); 1060 - gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_LO, 0xfffff000); 1061 - gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_HI, 0x0001ffff); 1040 + gpu_write64(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX, 0x0001ffffffffffc0llu); 1041 + gpu_write64(gpu, REG_A6XX_UCHE_TRAP_BASE, 0x0001fffffffff000llu); 1042 + gpu_write64(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE, 0x0001fffffffff000llu); 1062 1043 1063 1044 if (!adreno_is_a650_family(adreno_gpu)) { 1064 1045 /* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */ 1065 - gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN_LO, 0x00100000); 1046 + gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN, 0x00100000); 1066 1047 1067 - gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX_LO, 1048 + gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX, 1068 1049 0x00100000 + adreno_gpu->gmem - 1); 1069 1050 } 1070 1051 ··· 1148 1135 if (ret) 1149 1136 goto out; 1150 1137 1151 - ret = a6xx_ucode_init(gpu); 1152 - if (ret) 1153 - goto out; 1138 + gpu_write64(gpu, REG_A6XX_CP_SQE_INSTR_BASE, a6xx_gpu->sqe_iova); 1154 1139 1155 1140 /* Set the ringbuffer address */ 1156 1141 gpu_write64(gpu, REG_A6XX_CP_RB_BASE, gpu->rb[0]->iova); ··· 1163 1152 gpu_write(gpu, REG_A6XX_CP_RB_CNTL, 1164 1153 MSM_GPU_RB_CNTL_DEFAULT | AXXX_CP_RB_CNTL_NO_UPDATE); 1165 1154 1166 - /* 1167 - * Expanded APRIV and targets that support WHERE_AM_I both need a 1168 - * privileged buffer to store the RPTR shadow 1169 - */ 1170 - 1171 - if (adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami) { 1172 - if (!a6xx_gpu->shadow_bo) { 1173 - a6xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, 1174 - sizeof(u32) * gpu->nr_rings, 1175 - MSM_BO_WC | MSM_BO_MAP_PRIV, 1176 - gpu->aspace, &a6xx_gpu->shadow_bo, 1177 - &a6xx_gpu->shadow_iova); 1178 - 1179 - if (IS_ERR(a6xx_gpu->shadow)) 1180 - return PTR_ERR(a6xx_gpu->shadow); 1181 - 1182 - msm_gem_object_set_name(a6xx_gpu->shadow_bo, "shadow"); 1183 - } 1184 - 1185 - gpu_write64(gpu, REG_A6XX_CP_RB_RPTR_ADDR_LO, 1155 + /* Configure the RPTR shadow if needed: */ 1156 + if (a6xx_gpu->shadow_bo) { 1157 + gpu_write64(gpu, REG_A6XX_CP_RB_RPTR_ADDR, 1186 1158 shadowptr(a6xx_gpu, gpu->rb[0])); 1187 1159 } 1188 1160 ··· 1253 1259 { 1254 1260 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 1255 1261 struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); 1262 + struct a6xx_gmu *gmu = &a6xx_gpu->gmu; 1256 1263 int i, active_submits; 1257 1264 1258 1265 adreno_dump_info(gpu); ··· 1292 1297 */ 1293 1298 gpu->active_submits = 0; 1294 1299 1300 + reinit_completion(&gmu->pd_gate); 1301 + dev_pm_genpd_add_notifier(gmu->cxpd, &gmu->pd_nb); 1302 + dev_pm_genpd_synced_poweroff(gmu->cxpd); 1303 + 1295 1304 /* Drop the rpm refcount from active submits */ 1296 1305 if (active_submits) 1297 1306 pm_runtime_put(&gpu->pdev->dev); ··· 1303 1304 /* And the final one from recover worker */ 1304 1305 pm_runtime_put_sync(&gpu->pdev->dev); 1305 1306 1306 - /* Call into gpucc driver to poll for cx gdsc collapse */ 1307 - reset_control_reset(gpu->cx_collapse); 1307 + if (!wait_for_completion_timeout(&gmu->pd_gate, msecs_to_jiffies(1000))) 1308 + DRM_DEV_ERROR(&gpu->pdev->dev, "cx gdsc didn't collapse\n"); 1309 + 1310 + dev_pm_genpd_remove_notifier(gmu->cxpd); 1308 1311 1309 1312 pm_runtime_use_autosuspend(&gpu->pdev->dev); 1310 1313 ··· 1362 1361 return a6xx_uche_fault_block(gpu, id); 1363 1362 } 1364 1363 1365 - #define ARM_SMMU_FSR_TF BIT(1) 1366 - #define ARM_SMMU_FSR_PF BIT(3) 1367 - #define ARM_SMMU_FSR_EF BIT(4) 1368 - 1369 1364 static int a6xx_fault_handler(void *arg, unsigned long iova, int flags, void *data) 1370 1365 { 1371 1366 struct msm_gpu *gpu = arg; 1372 1367 struct adreno_smmu_fault_info *info = data; 1373 - const char *type = "UNKNOWN"; 1374 - const char *block; 1375 - bool do_devcoredump = info && !READ_ONCE(gpu->crashstate); 1368 + const char *block = "unknown"; 1376 1369 1377 - /* 1378 - * If we aren't going to be resuming later from fault_worker, then do 1379 - * it now. 1380 - */ 1381 - if (!do_devcoredump) { 1382 - gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu); 1383 - } 1384 - 1385 - /* 1386 - * Print a default message if we couldn't get the data from the 1387 - * adreno-smmu-priv 1388 - */ 1389 - if (!info) { 1390 - pr_warn_ratelimited("*** gpu fault: iova=%.16lx flags=%d (%u,%u,%u,%u)\n", 1391 - iova, flags, 1370 + u32 scratch[] = { 1392 1371 gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(4)), 1393 1372 gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(5)), 1394 1373 gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(6)), 1395 - gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7))); 1374 + gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7)), 1375 + }; 1396 1376 1397 - return 0; 1398 - } 1377 + if (info) 1378 + block = a6xx_fault_block(gpu, info->fsynr1 & 0xff); 1399 1379 1400 - if (info->fsr & ARM_SMMU_FSR_TF) 1401 - type = "TRANSLATION"; 1402 - else if (info->fsr & ARM_SMMU_FSR_PF) 1403 - type = "PERMISSION"; 1404 - else if (info->fsr & ARM_SMMU_FSR_EF) 1405 - type = "EXTERNAL"; 1406 - 1407 - block = a6xx_fault_block(gpu, info->fsynr1 & 0xff); 1408 - 1409 - pr_warn_ratelimited("*** gpu fault: ttbr0=%.16llx iova=%.16lx dir=%s type=%s source=%s (%u,%u,%u,%u)\n", 1410 - info->ttbr0, iova, 1411 - flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ", 1412 - type, block, 1413 - gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(4)), 1414 - gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(5)), 1415 - gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(6)), 1416 - gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7))); 1417 - 1418 - if (do_devcoredump) { 1419 - /* Turn off the hangcheck timer to keep it from bothering us */ 1420 - del_timer(&gpu->hangcheck_timer); 1421 - 1422 - gpu->fault_info.ttbr0 = info->ttbr0; 1423 - gpu->fault_info.iova = iova; 1424 - gpu->fault_info.flags = flags; 1425 - gpu->fault_info.type = type; 1426 - gpu->fault_info.block = block; 1427 - 1428 - kthread_queue_work(gpu->worker, &gpu->fault_work); 1429 - } 1430 - 1431 - return 0; 1380 + return adreno_fault_handler(gpu, iova, flags, info, block, scratch); 1432 1381 } 1433 1382 1434 1383 static void a6xx_cp_hw_err_irq(struct msm_gpu *gpu) ··· 1663 1712 /* Force the GPU power on so we can read this register */ 1664 1713 a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); 1665 1714 1666 - *value = gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO); 1715 + *value = gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER); 1667 1716 1668 1717 a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); 1669 1718 ··· 1799 1848 * to prevent prefetching into an unrelated submit. (And 1800 1849 * either way, at some point the ROQ will be full.) 1801 1850 */ 1802 - cp_state.ib1_rem += gpu_read(gpu, REG_A6XX_CP_CSQ_IB1_STAT) >> 16; 1803 - cp_state.ib2_rem += gpu_read(gpu, REG_A6XX_CP_CSQ_IB2_STAT) >> 16; 1851 + cp_state.ib1_rem += gpu_read(gpu, REG_A6XX_CP_ROQ_AVAIL_IB1) >> 16; 1852 + cp_state.ib2_rem += gpu_read(gpu, REG_A6XX_CP_ROQ_AVAIL_IB2) >> 16; 1804 1853 1805 1854 progress = !!memcmp(&cp_state, &ring->last_cp_state, sizeof(cp_state)); 1806 1855 ··· 1837 1886 return UINT_MAX; 1838 1887 } 1839 1888 1889 + static u32 a640_get_speed_bin(u32 fuse) 1890 + { 1891 + if (fuse == 0) 1892 + return 0; 1893 + else if (fuse == 1) 1894 + return 1; 1895 + 1896 + return UINT_MAX; 1897 + } 1898 + 1899 + static u32 a650_get_speed_bin(u32 fuse) 1900 + { 1901 + if (fuse == 0) 1902 + return 0; 1903 + else if (fuse == 1) 1904 + return 1; 1905 + /* Yep, 2 and 3 are swapped! :/ */ 1906 + else if (fuse == 2) 1907 + return 3; 1908 + else if (fuse == 3) 1909 + return 2; 1910 + 1911 + return UINT_MAX; 1912 + } 1913 + 1840 1914 static u32 adreno_7c3_get_speed_bin(u32 fuse) 1841 1915 { 1842 1916 if (fuse == 0) ··· 1886 1910 1887 1911 if (adreno_cmp_rev(ADRENO_REV(6, 3, 5, ANY_ID), rev)) 1888 1912 val = adreno_7c3_get_speed_bin(fuse); 1913 + 1914 + if (adreno_cmp_rev(ADRENO_REV(6, 4, 0, ANY_ID), rev)) 1915 + val = a640_get_speed_bin(fuse); 1916 + 1917 + if (adreno_cmp_rev(ADRENO_REV(6, 5, 0, ANY_ID), rev)) 1918 + val = a650_get_speed_bin(fuse); 1889 1919 1890 1920 if (val == UINT_MAX) { 1891 1921 DRM_DEV_ERROR(dev, ··· 1936 1954 .get_param = adreno_get_param, 1937 1955 .set_param = adreno_set_param, 1938 1956 .hw_init = a6xx_hw_init, 1957 + .ucode_load = a6xx_ucode_load, 1939 1958 .pm_suspend = a6xx_pm_suspend, 1940 1959 .pm_resume = a6xx_pm_resume, 1941 1960 .recover = a6xx_recover,
+1 -1
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
··· 147 147 /* Make sure all pending memory writes are posted */ 148 148 wmb(); 149 149 150 - gpu_write64(gpu, REG_A6XX_CP_CRASH_SCRIPT_BASE_LO, dumper->iova); 150 + gpu_write64(gpu, REG_A6XX_CP_CRASH_SCRIPT_BASE, dumper->iova); 151 151 152 152 gpu_write(gpu, REG_A6XX_CP_CRASH_DUMP_CNTL, 1); 153 153
+31 -19
drivers/gpu/drm/msm/adreno/adreno_common.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2021 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28 ··· 49 49 50 50 51 51 enum chip { 52 - A2XX = 0, 53 - A3XX = 0, 54 - A4XX = 0, 55 - A5XX = 0, 56 - A6XX = 0, 52 + A2XX = 2, 53 + A3XX = 3, 54 + A4XX = 4, 55 + A5XX = 5, 56 + A6XX = 6, 57 + A7XX = 7, 57 58 }; 58 59 59 60 enum adreno_pa_su_sc_draw { ··· 209 208 enum a5xx_line_mode { 210 209 BRESENHAM = 0, 211 210 RECTANGULAR = 1, 211 + }; 212 + 213 + enum a6xx_tex_prefetch_cmd { 214 + TEX_PREFETCH_UNK0 = 0, 215 + TEX_PREFETCH_SAM = 1, 216 + TEX_PREFETCH_GATHER4R = 2, 217 + TEX_PREFETCH_GATHER4G = 3, 218 + TEX_PREFETCH_GATHER4B = 4, 219 + TEX_PREFETCH_GATHER4A = 5, 220 + TEX_PREFETCH_UNK6 = 6, 221 + TEX_PREFETCH_UNK7 = 7, 212 222 }; 213 223 214 224 #define REG_AXXX_CP_RB_BASE 0x000001c0
+24 -9
drivers/gpu/drm/msm/adreno/adreno_device.c
··· 432 432 if (ret) 433 433 return NULL; 434 434 435 + if (gpu->funcs->ucode_load) { 436 + ret = gpu->funcs->ucode_load(gpu); 437 + if (ret) 438 + return NULL; 439 + } 440 + 435 441 /* 436 442 * Now that we have firmware loaded, and are ready to begin 437 443 * booting the gpu, go ahead and enable runpm: 438 444 */ 439 445 pm_runtime_enable(&pdev->dev); 440 446 441 - /* Make sure pm runtime is active and reset any previous errors */ 442 - pm_runtime_set_active(&pdev->dev); 443 - 444 447 ret = pm_runtime_get_sync(&pdev->dev); 445 448 if (ret < 0) { 446 - pm_runtime_put_sync(&pdev->dev); 449 + pm_runtime_put_noidle(&pdev->dev); 447 450 DRM_DEV_ERROR(dev->dev, "Couldn't power up the GPU: %d\n", ret); 448 - return NULL; 451 + goto err_disable_rpm; 449 452 } 450 453 451 454 mutex_lock(&gpu->lock); 452 455 ret = msm_gpu_hw_init(gpu); 453 456 mutex_unlock(&gpu->lock); 454 - pm_runtime_put_autosuspend(&pdev->dev); 455 457 if (ret) { 456 458 DRM_DEV_ERROR(dev->dev, "gpu hw init failed: %d\n", ret); 457 - return NULL; 459 + goto err_put_rpm; 458 460 } 461 + 462 + pm_runtime_put_autosuspend(&pdev->dev); 459 463 460 464 #ifdef CONFIG_DEBUG_FS 461 465 if (gpu->funcs->debugfs_init) { ··· 469 465 #endif 470 466 471 467 return gpu; 468 + 469 + err_put_rpm: 470 + pm_runtime_put_sync_suspend(&pdev->dev); 471 + err_disable_rpm: 472 + pm_runtime_disable(&pdev->dev); 473 + 474 + return NULL; 472 475 } 473 476 474 477 static int find_chipid(struct device *dev, struct adreno_rev *rev) ··· 559 548 return PTR_ERR(gpu); 560 549 } 561 550 551 + ret = dev_pm_opp_of_find_icc_paths(dev, NULL); 552 + if (ret) 553 + return ret; 554 + 562 555 return 0; 563 556 } 564 557 ··· 581 566 } 582 567 583 568 static const struct component_ops a3xx_ops = { 584 - .bind = adreno_bind, 585 - .unbind = adreno_unbind, 569 + .bind = adreno_bind, 570 + .unbind = adreno_unbind, 586 571 }; 587 572 588 573 static void adreno_device_register_headless(void)
+110 -64
drivers/gpu/drm/msm/adreno/adreno_gpu.c
··· 208 208 struct msm_gem_address_space *aspace; 209 209 u64 start, size; 210 210 211 - mmu = msm_iommu_new(&pdev->dev, quirks); 211 + mmu = msm_iommu_gpu_new(&pdev->dev, gpu, quirks); 212 212 if (IS_ERR_OR_NULL(mmu)) 213 213 return ERR_CAST(mmu); 214 214 ··· 244 244 return adreno_gpu->info->address_space_size; 245 245 246 246 return SZ_4G; 247 + } 248 + 249 + #define ARM_SMMU_FSR_TF BIT(1) 250 + #define ARM_SMMU_FSR_PF BIT(3) 251 + #define ARM_SMMU_FSR_EF BIT(4) 252 + 253 + int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags, 254 + struct adreno_smmu_fault_info *info, const char *block, 255 + u32 scratch[4]) 256 + { 257 + const char *type = "UNKNOWN"; 258 + bool do_devcoredump = info && !READ_ONCE(gpu->crashstate); 259 + 260 + /* 261 + * If we aren't going to be resuming later from fault_worker, then do 262 + * it now. 263 + */ 264 + if (!do_devcoredump) { 265 + gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu); 266 + } 267 + 268 + /* 269 + * Print a default message if we couldn't get the data from the 270 + * adreno-smmu-priv 271 + */ 272 + if (!info) { 273 + pr_warn_ratelimited("*** gpu fault: iova=%.16lx flags=%d (%u,%u,%u,%u)\n", 274 + iova, flags, 275 + scratch[0], scratch[1], scratch[2], scratch[3]); 276 + 277 + return 0; 278 + } 279 + 280 + if (info->fsr & ARM_SMMU_FSR_TF) 281 + type = "TRANSLATION"; 282 + else if (info->fsr & ARM_SMMU_FSR_PF) 283 + type = "PERMISSION"; 284 + else if (info->fsr & ARM_SMMU_FSR_EF) 285 + type = "EXTERNAL"; 286 + 287 + pr_warn_ratelimited("*** gpu fault: ttbr0=%.16llx iova=%.16lx dir=%s type=%s source=%s (%u,%u,%u,%u)\n", 288 + info->ttbr0, iova, 289 + flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ", 290 + type, block, 291 + scratch[0], scratch[1], scratch[2], scratch[3]); 292 + 293 + if (do_devcoredump) { 294 + /* Turn off the hangcheck timer to keep it from bothering us */ 295 + del_timer(&gpu->hangcheck_timer); 296 + 297 + gpu->fault_info.ttbr0 = info->ttbr0; 298 + gpu->fault_info.iova = iova; 299 + gpu->fault_info.flags = flags; 300 + gpu->fault_info.type = type; 301 + gpu->fault_info.block = block; 302 + 303 + kthread_queue_work(gpu->worker, &gpu->fault_work); 304 + } 305 + 306 + return 0; 247 307 } 248 308 249 309 int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx, ··· 563 503 564 504 int adreno_hw_init(struct msm_gpu *gpu) 565 505 { 566 - struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 567 - int ret, i; 568 - 569 506 VERB("%s", gpu->name); 570 507 571 - ret = adreno_load_fw(adreno_gpu); 572 - if (ret) 573 - return ret; 574 - 575 - for (i = 0; i < gpu->nr_rings; i++) { 508 + for (int i = 0; i < gpu->nr_rings; i++) { 576 509 struct msm_ringbuffer *ring = gpu->rb[i]; 577 510 578 511 if (!ring) ··· 975 922 ring->id); 976 923 } 977 924 978 - /* Get legacy powerlevels from qcom,gpu-pwrlevels and populate the opp table */ 979 - static int adreno_get_legacy_pwrlevels(struct device *dev) 980 - { 981 - struct device_node *child, *node; 982 - int ret; 983 - 984 - node = of_get_compatible_child(dev->of_node, "qcom,gpu-pwrlevels"); 985 - if (!node) { 986 - DRM_DEV_DEBUG(dev, "Could not find the GPU powerlevels\n"); 987 - return -ENXIO; 988 - } 989 - 990 - for_each_child_of_node(node, child) { 991 - unsigned int val; 992 - 993 - ret = of_property_read_u32(child, "qcom,gpu-freq", &val); 994 - if (ret) 995 - continue; 996 - 997 - /* 998 - * Skip the intentionally bogus clock value found at the bottom 999 - * of most legacy frequency tables 1000 - */ 1001 - if (val != 27000000) 1002 - dev_pm_opp_add(dev, val, 0); 1003 - } 1004 - 1005 - of_node_put(node); 1006 - 1007 - return 0; 1008 - } 1009 - 1010 - static void adreno_get_pwrlevels(struct device *dev, 925 + static int adreno_get_pwrlevels(struct device *dev, 1011 926 struct msm_gpu *gpu) 1012 927 { 928 + struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); 1013 929 unsigned long freq = ULONG_MAX; 1014 930 struct dev_pm_opp *opp; 1015 931 int ret; 1016 932 1017 933 gpu->fast_rate = 0; 1018 934 1019 - /* You down with OPP? */ 1020 - if (!of_property_present(dev->of_node, "operating-points-v2")) 1021 - ret = adreno_get_legacy_pwrlevels(dev); 1022 - else { 1023 - ret = devm_pm_opp_of_add_table(dev); 1024 - if (ret) 1025 - DRM_DEV_ERROR(dev, "Unable to set the OPP table\n"); 1026 - } 1027 - 1028 - if (!ret) { 1029 - /* Find the fastest defined rate */ 1030 - opp = dev_pm_opp_find_freq_floor(dev, &freq); 1031 - if (!IS_ERR(opp)) { 1032 - gpu->fast_rate = freq; 1033 - dev_pm_opp_put(opp); 935 + /* devm_pm_opp_of_add_table may error out but will still create an OPP table */ 936 + ret = devm_pm_opp_of_add_table(dev); 937 + if (ret == -ENODEV) { 938 + /* Special cases for ancient hw with ancient DT bindings */ 939 + if (adreno_is_a2xx(adreno_gpu)) { 940 + dev_warn(dev, "Unable to find the OPP table. Falling back to 200 MHz.\n"); 941 + dev_pm_opp_add(dev, 200000000, 0); 942 + } else if (adreno_is_a320(adreno_gpu)) { 943 + dev_warn(dev, "Unable to find the OPP table. Falling back to 450 MHz.\n"); 944 + dev_pm_opp_add(dev, 450000000, 0); 945 + } else { 946 + DRM_DEV_ERROR(dev, "Unable to find the OPP table\n"); 947 + return -ENODEV; 1034 948 } 949 + } else if (ret) { 950 + DRM_DEV_ERROR(dev, "Unable to set the OPP table\n"); 951 + return ret; 1035 952 } 1036 953 1037 - if (!gpu->fast_rate) { 1038 - dev_warn(dev, 1039 - "Could not find a clock rate. Using a reasonable default\n"); 1040 - /* Pick a suitably safe clock speed for any target */ 1041 - gpu->fast_rate = 200000000; 1042 - } 954 + /* Find the fastest defined rate */ 955 + opp = dev_pm_opp_find_freq_floor(dev, &freq); 956 + if (IS_ERR(opp)) 957 + return PTR_ERR(opp); 958 + 959 + gpu->fast_rate = freq; 960 + dev_pm_opp_put(opp); 1043 961 1044 962 DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate); 963 + 964 + return 0; 1045 965 } 1046 966 1047 967 int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu, ··· 1072 1046 struct adreno_rev *rev = &config->rev; 1073 1047 const char *gpu_name; 1074 1048 u32 speedbin; 1049 + int ret; 1050 + 1051 + /* Only handle the core clock when GMU is not in use */ 1052 + if (config->rev.core < 6) { 1053 + /* 1054 + * This can only be done before devm_pm_opp_of_add_table(), or 1055 + * dev_pm_opp_set_config() will WARN_ON() 1056 + */ 1057 + if (IS_ERR(devm_clk_get(dev, "core"))) { 1058 + /* 1059 + * If "core" is absent, go for the legacy clock name. 1060 + * If we got this far in probing, it's a given one of 1061 + * them exists. 1062 + */ 1063 + devm_pm_opp_set_clkname(dev, "core_clk"); 1064 + } else 1065 + devm_pm_opp_set_clkname(dev, "core"); 1066 + } 1075 1067 1076 1068 adreno_gpu->funcs = funcs; 1077 1069 adreno_gpu->info = adreno_info(config->rev); ··· 1114 1070 1115 1071 adreno_gpu_config.nr_rings = nr_rings; 1116 1072 1117 - adreno_get_pwrlevels(dev, gpu); 1073 + ret = adreno_get_pwrlevels(dev, gpu); 1074 + if (ret) 1075 + return ret; 1118 1076 1119 1077 pm_runtime_set_autosuspend_delay(dev, 1120 1078 adreno_gpu->info->inactive_period);
+4
drivers/gpu/drm/msm/adreno/adreno_gpu.h
··· 341 341 struct platform_device *pdev, 342 342 unsigned long quirks); 343 343 344 + int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags, 345 + struct adreno_smmu_fault_info *info, const char *block, 346 + u32 scratch[4]); 347 + 344 348 int adreno_read_speedbin(struct device *dev, u32 *speedbin); 345 349 346 350 /*
+96 -17
drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2021-01-30 18:25:22) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml ( 90810 bytes, from 2021-06-21 15:24:24) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 14609 bytes, from 2021-11-24 23:05:10) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 69086 bytes, from 2022-03-03 16:41:33) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2021-11-24 23:05:10) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113358 bytes, from 2022-01-31 23:06:21) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149512 bytes, from 2022-01-31 23:06:21) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml ( 184954 bytes, from 2022-03-03 16:41:33) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11331 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2021-01-30 18:25:22) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 6038 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2924 bytes, from 2021-07-22 15:21:56) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml ( 594 bytes, from 2023-03-10 18:32:52) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml ( 91929 bytes, from 2023-02-28 23:52:27) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml ( 15434 bytes, from 2023-03-10 18:32:53) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml ( 74995 bytes, from 2023-03-20 18:06:23) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml ( 84231 bytes, from 2022-08-02 16:38:43) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml ( 113474 bytes, from 2022-08-02 16:38:43) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml ( 149590 bytes, from 2023-02-14 19:37:12) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml ( 198949 bytes, from 2023-03-20 18:06:23) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml ( 11404 bytes, from 2023-03-10 18:32:53) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml ( 1773 bytes, from 2022-08-02 16:38:43) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml ( 9055 bytes, from 2023-03-10 18:32:52) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml ( 2976 bytes, from 2023-03-10 18:32:52) 24 24 25 - Copyright (C) 2013-2022 by the following authors: 25 + Copyright (C) 2013-2023 by the following authors: 26 26 - Rob Clark <robdclark@gmail.com> (robclark) 27 27 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 28 28 ··· 76 76 VS_FETCH_DONE = 27, 77 77 FACENESS_FLUSH = 28, 78 78 WT_DONE_TS = 8, 79 + START_FRAGMENT_CTRS = 13, 80 + STOP_FRAGMENT_CTRS = 14, 81 + START_COMPUTE_CTRS = 15, 82 + STOP_COMPUTE_CTRS = 16, 79 83 FLUSH_SO_0 = 17, 80 84 FLUSH_SO_1 = 18, 81 85 FLUSH_SO_2 = 19, ··· 90 86 PC_CCU_FLUSH_DEPTH_TS = 28, 91 87 PC_CCU_FLUSH_COLOR_TS = 29, 92 88 BLIT = 30, 93 - UNK_25 = 37, 89 + LRZ_CLEAR = 37, 94 90 LRZ_FLUSH = 38, 95 91 BLIT_OP_FILL_2D = 39, 96 92 BLIT_OP_COPY_2D = 40, ··· 99 95 UNK_2C = 44, 100 96 UNK_2D = 45, 101 97 CACHE_INVALIDATE = 49, 98 + LABEL = 63, 99 + CCU_INVALIDATE_DEPTH = 24, 100 + CCU_INVALIDATE_COLOR = 25, 101 + CCU_RESOLVE_CLEAN = 26, 102 + CCU_FLUSH_DEPTH = 28, 103 + CCU_FLUSH_COLOR = 29, 104 + CCU_RESOLVE = 30, 105 + CCU_END_RESOLVE_GROUP = 31, 106 + CCU_CLEAN_DEPTH = 32, 107 + CCU_CLEAN_COLOR = 33, 108 + CACHE_RESET = 48, 109 + CACHE_CLEAN = 49, 110 + CACHE_FLUSH7 = 50, 111 + CACHE_INVALIDATE7 = 51, 102 112 }; 103 113 104 114 enum pc_di_primtype { ··· 308 290 IN_INCR_UPDT_CONST = 86, 309 291 IN_INCR_UPDT_INSTR = 87, 310 292 PKT4 = 4, 293 + IN_IB_END = 10, 294 + IN_GMU_INTERRUPT = 11, 295 + IN_PREEMPT = 15, 311 296 CP_SCRATCH_WRITE = 76, 312 297 CP_REG_TO_MEM_OFFSET_MEM = 116, 313 298 CP_REG_TO_MEM_OFFSET_REG = 114, ··· 318 297 CP_WAIT_TWO_REGS = 112, 319 298 CP_MEMCPY = 117, 320 299 CP_SET_BIN_DATA5_OFFSET = 46, 300 + CP_CONTEXT_SWITCH = 84, 321 301 CP_SET_CTXSWITCH_IB = 85, 322 302 CP_REG_WRITE = 109, 323 303 CP_START_BIN = 80, 324 304 CP_END_BIN = 81, 305 + CP_PREEMPT_DISABLE = 108, 306 + CP_WAIT_TIMESTAMP = 20, 307 + CP_THREAD_CONTROL = 23, 308 + CP_CONTEXT_REG_BUNCH2 = 93, 309 + CP_UNK15 = 21, 310 + CP_UNK16 = 22, 311 + CP_UNK18 = 24, 312 + CP_UNK1B = 27, 313 + CP_UNK49 = 73, 325 314 }; 326 315 327 316 enum adreno_state_block { ··· 511 480 TRACK_CNTL_REG = 1, 512 481 TRACK_RENDER_CNTL = 2, 513 482 UNK_EVENT_WRITE = 4, 483 + TRACK_LRZ = 8, 484 + }; 485 + 486 + enum cp_thread { 487 + CP_SET_THREAD_BR = 1, 488 + CP_SET_THREAD_BV = 2, 489 + CP_SET_THREAD_BOTH = 3, 514 490 }; 515 491 516 492 #define REG_CP_LOAD_STATE_0 0x00000000 ··· 1293 1255 { 1294 1256 return ((val) << CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__SHIFT) & CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__MASK; 1295 1257 } 1258 + 1259 + #define REG_CP_SET_BIN_DATA5_7 0x00000007 1260 + 1261 + #define REG_CP_SET_BIN_DATA5_9 0x00000009 1296 1262 1297 1263 #define REG_CP_SET_BIN_DATA5_OFFSET_0 0x00000000 1298 1264 #define CP_SET_BIN_DATA5_OFFSET_0_VSC_SIZE__MASK 0x003f0000 ··· 2244 2202 { 2245 2203 return ((val) << A6XX_CP_REG_TEST_0_BIT__SHIFT) & A6XX_CP_REG_TEST_0_BIT__MASK; 2246 2204 } 2247 - #define A6XX_CP_REG_TEST_0_WAIT_FOR_ME 0x02000000 2205 + #define A6XX_CP_REG_TEST_0_SKIP_WAIT_FOR_ME 0x02000000 2206 + #define A6XX_CP_REG_TEST_0_PRED_BIT__MASK 0x7c000000 2207 + #define A6XX_CP_REG_TEST_0_PRED_BIT__SHIFT 26 2208 + static inline uint32_t A6XX_CP_REG_TEST_0_PRED_BIT(uint32_t val) 2209 + { 2210 + return ((val) << A6XX_CP_REG_TEST_0_PRED_BIT__SHIFT) & A6XX_CP_REG_TEST_0_PRED_BIT__MASK; 2211 + } 2212 + #define A6XX_CP_REG_TEST_0_PRED_UPDATE 0x80000000 2213 + 2214 + #define REG_A6XX_CP_REG_TEST_PRED_MASK 0x00000001 2215 + 2216 + #define REG_A6XX_CP_REG_TEST_PRED_VAL 0x00000002 2248 2217 2249 2218 #define REG_CP_COND_REG_EXEC_0 0x00000000 2250 2219 #define CP_COND_REG_EXEC_0_REG0__MASK 0x0003ffff ··· 2263 2210 static inline uint32_t CP_COND_REG_EXEC_0_REG0(uint32_t val) 2264 2211 { 2265 2212 return ((val) << CP_COND_REG_EXEC_0_REG0__SHIFT) & CP_COND_REG_EXEC_0_REG0__MASK; 2213 + } 2214 + #define CP_COND_REG_EXEC_0_PRED_BIT__MASK 0x007c0000 2215 + #define CP_COND_REG_EXEC_0_PRED_BIT__SHIFT 18 2216 + static inline uint32_t CP_COND_REG_EXEC_0_PRED_BIT(uint32_t val) 2217 + { 2218 + return ((val) << CP_COND_REG_EXEC_0_PRED_BIT__SHIFT) & CP_COND_REG_EXEC_0_PRED_BIT__MASK; 2266 2219 } 2267 2220 #define CP_COND_REG_EXEC_0_BINNING 0x02000000 2268 2221 #define CP_COND_REG_EXEC_0_GMEM 0x04000000 ··· 2367 2308 } 2368 2309 2369 2310 #define REG_CP_REG_WRITE_0 0x00000000 2370 - #define CP_REG_WRITE_0_TRACKER__MASK 0x00000007 2311 + #define CP_REG_WRITE_0_TRACKER__MASK 0x0000000f 2371 2312 #define CP_REG_WRITE_0_TRACKER__SHIFT 0 2372 2313 static inline uint32_t CP_REG_WRITE_0_TRACKER(enum reg_tracker val) 2373 2314 { 2374 2315 return ((val) << CP_REG_WRITE_0_TRACKER__SHIFT) & CP_REG_WRITE_0_TRACKER__MASK; 2375 2316 } 2317 + 2318 + #define REG_CP_REG_WRITE_1 0x00000001 2319 + 2320 + #define REG_CP_REG_WRITE_2 0x00000002 2376 2321 2377 2322 #define REG_CP_SMMU_TABLE_UPDATE_0 0x00000000 2378 2323 #define CP_SMMU_TABLE_UPDATE_0_TTBR0_LO__MASK 0xffffffff ··· 2423 2360 #define REG_CP_START_BIN_PREFIX_DWORDS 0x00000003 2424 2361 2425 2362 #define REG_CP_START_BIN_BODY_DWORDS 0x00000004 2363 + 2364 + #define REG_CP_WAIT_TIMESTAMP_0 0x00000000 2365 + 2366 + #define REG_CP_WAIT_TIMESTAMP_ADDR 0x00000001 2367 + 2368 + #define REG_CP_WAIT_TIMESTAMP_TIMESTAMP 0x00000003 2369 + 2370 + #define REG_CP_THREAD_CONTROL_0 0x00000000 2371 + #define CP_THREAD_CONTROL_0_THREAD__MASK 0x00000003 2372 + #define CP_THREAD_CONTROL_0_THREAD__SHIFT 0 2373 + static inline uint32_t CP_THREAD_CONTROL_0_THREAD(enum cp_thread val) 2374 + { 2375 + return ((val) << CP_THREAD_CONTROL_0_THREAD__SHIFT) & CP_THREAD_CONTROL_0_THREAD__MASK; 2376 + } 2377 + #define CP_THREAD_CONTROL_0_CONCURRENT_BIN_DISABLE 0x08000000 2378 + #define CP_THREAD_CONTROL_0_SYNC_THREADS 0x80000000 2426 2379 2427 2380 2428 2381 #endif /* ADRENO_PM4_XML */
+210
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_3_0_MSM8998_H 8 + #define _DPU_3_0_MSM8998_H 9 + 10 + static const struct dpu_caps msm8998_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0x7, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED3, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + .max_hdeci_exp = MAX_HORZ_DECIMATION, 21 + .max_vdeci_exp = MAX_VERT_DECIMATION, 22 + }; 23 + 24 + static const struct dpu_ubwc_cfg msm8998_ubwc_cfg = { 25 + .ubwc_version = DPU_HW_UBWC_VER_10, 26 + .highest_bank_bit = 0x2, 27 + }; 28 + 29 + static const struct dpu_mdp_cfg msm8998_mdp[] = { 30 + { 31 + .name = "top_0", .id = MDP_TOP, 32 + .base = 0x0, .len = 0x458, 33 + .features = 0, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 12 }, 42 + .clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8, .bit_off = 15 }, 43 + .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0, .bit_off = 15 }, 44 + }, 45 + }; 46 + 47 + static const struct dpu_ctl_cfg msm8998_ctl[] = { 48 + { 49 + .name = "ctl_0", .id = CTL_0, 50 + .base = 0x1000, .len = 0x94, 51 + .features = BIT(DPU_CTL_SPLIT_DISPLAY), 52 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 53 + }, 54 + { 55 + .name = "ctl_1", .id = CTL_1, 56 + .base = 0x1200, .len = 0x94, 57 + .features = 0, 58 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 59 + }, 60 + { 61 + .name = "ctl_2", .id = CTL_2, 62 + .base = 0x1400, .len = 0x94, 63 + .features = BIT(DPU_CTL_SPLIT_DISPLAY), 64 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 65 + }, 66 + { 67 + .name = "ctl_3", .id = CTL_3, 68 + .base = 0x1600, .len = 0x94, 69 + .features = 0, 70 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 71 + }, 72 + { 73 + .name = "ctl_4", .id = CTL_4, 74 + .base = 0x1800, .len = 0x94, 75 + .features = 0, 76 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 77 + }, 78 + }; 79 + 80 + static const struct dpu_sspp_cfg msm8998_sspp[] = { 81 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1ac, VIG_MSM8998_MASK, 82 + msm8998_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 83 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1ac, VIG_MSM8998_MASK, 84 + msm8998_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 85 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1ac, VIG_MSM8998_MASK, 86 + msm8998_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 87 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1ac, VIG_MSM8998_MASK, 88 + msm8998_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 89 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1ac, DMA_MSM8998_MASK, 90 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 91 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1ac, DMA_MSM8998_MASK, 92 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 93 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1ac, DMA_CURSOR_MSM8998_MASK, 94 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 95 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1ac, DMA_CURSOR_MSM8998_MASK, 96 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 97 + }; 98 + 99 + static const struct dpu_lm_cfg msm8998_lm[] = { 100 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK, 101 + &msm8998_lm_sblk, PINGPONG_0, LM_2, DSPP_0), 102 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK, 103 + &msm8998_lm_sblk, PINGPONG_1, LM_5, DSPP_1), 104 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK, 105 + &msm8998_lm_sblk, PINGPONG_2, LM_0, 0), 106 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK, 107 + &msm8998_lm_sblk, PINGPONG_MAX, 0, 0), 108 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK, 109 + &msm8998_lm_sblk, PINGPONG_MAX, 0, 0), 110 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK, 111 + &msm8998_lm_sblk, PINGPONG_3, LM_1, 0), 112 + }; 113 + 114 + static const struct dpu_pingpong_cfg msm8998_pp[] = { 115 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, 116 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 117 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 118 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, 119 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 120 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 121 + PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, 122 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 123 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 124 + PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, 125 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 126 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 127 + }; 128 + 129 + static const struct dpu_dspp_cfg msm8998_dspp[] = { 130 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_MSM8998_MASK, 131 + &msm8998_dspp_sblk), 132 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_MSM8998_MASK, 133 + &msm8998_dspp_sblk), 134 + }; 135 + 136 + static const struct dpu_intf_cfg msm8998_intf[] = { 137 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 138 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 139 + INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 140 + INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 141 + }; 142 + 143 + static const struct dpu_perf_cfg msm8998_perf_data = { 144 + .max_bw_low = 6700000, 145 + .max_bw_high = 6700000, 146 + .min_core_ib = 2400000, 147 + .min_llcc_ib = 800000, 148 + .min_dram_ib = 800000, 149 + .undersized_prefill_lines = 2, 150 + .xtra_prefill_lines = 2, 151 + .dest_scale_prefill_lines = 3, 152 + .macrotile_prefill_lines = 4, 153 + .yuv_nv12_prefill_lines = 8, 154 + .linear_prefill_lines = 1, 155 + .downscaling_prefill_lines = 1, 156 + .amortizable_threshold = 25, 157 + .min_prefill_lines = 25, 158 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 159 + .safe_lut_tbl = {0xfffc, 0xff00, 0xffff}, 160 + .qos_lut_tbl = { 161 + {.nentry = ARRAY_SIZE(msm8998_qos_linear), 162 + .entries = msm8998_qos_linear 163 + }, 164 + {.nentry = ARRAY_SIZE(msm8998_qos_macrotile), 165 + .entries = msm8998_qos_macrotile 166 + }, 167 + {.nentry = ARRAY_SIZE(msm8998_qos_nrt), 168 + .entries = msm8998_qos_nrt 169 + }, 170 + }, 171 + .cdp_cfg = { 172 + {.rd_enable = 1, .wr_enable = 1}, 173 + {.rd_enable = 1, .wr_enable = 0} 174 + }, 175 + .clk_inefficiency_factor = 200, 176 + .bw_inefficiency_factor = 120, 177 + }; 178 + 179 + const struct dpu_mdss_cfg dpu_msm8998_cfg = { 180 + .caps = &msm8998_dpu_caps, 181 + .ubwc = &msm8998_ubwc_cfg, 182 + .mdp_count = ARRAY_SIZE(msm8998_mdp), 183 + .mdp = msm8998_mdp, 184 + .ctl_count = ARRAY_SIZE(msm8998_ctl), 185 + .ctl = msm8998_ctl, 186 + .sspp_count = ARRAY_SIZE(msm8998_sspp), 187 + .sspp = msm8998_sspp, 188 + .mixer_count = ARRAY_SIZE(msm8998_lm), 189 + .mixer = msm8998_lm, 190 + .dspp_count = ARRAY_SIZE(msm8998_dspp), 191 + .dspp = msm8998_dspp, 192 + .pingpong_count = ARRAY_SIZE(msm8998_pp), 193 + .pingpong = msm8998_pp, 194 + .intf_count = ARRAY_SIZE(msm8998_intf), 195 + .intf = msm8998_intf, 196 + .vbif_count = ARRAY_SIZE(msm8998_vbif), 197 + .vbif = msm8998_vbif, 198 + .reg_dma_count = 0, 199 + .perf = &msm8998_perf_data, 200 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 201 + BIT(MDP_SSPP_TOP0_INTR2) | \ 202 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 203 + BIT(MDP_INTF0_INTR) | \ 204 + BIT(MDP_INTF1_INTR) | \ 205 + BIT(MDP_INTF2_INTR) | \ 206 + BIT(MDP_INTF3_INTR) | \ 207 + BIT(MDP_INTF4_INTR), 208 + }; 209 + 210 + #endif
+210
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_4_0_SDM845_H 8 + #define _DPU_4_0_SDM845_H 9 + 10 + static const struct dpu_caps sdm845_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED3, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + .max_hdeci_exp = MAX_HORZ_DECIMATION, 21 + .max_vdeci_exp = MAX_VERT_DECIMATION, 22 + }; 23 + 24 + static const struct dpu_ubwc_cfg sdm845_ubwc_cfg = { 25 + .ubwc_version = DPU_HW_UBWC_VER_20, 26 + .highest_bank_bit = 0x2, 27 + }; 28 + 29 + static const struct dpu_mdp_cfg sdm845_mdp[] = { 30 + { 31 + .name = "top_0", .id = MDP_TOP, 32 + .base = 0x0, .len = 0x45c, 33 + .features = BIT(DPU_MDP_AUDIO_SELECT), 34 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 42 + }, 43 + }; 44 + 45 + static const struct dpu_ctl_cfg sdm845_ctl[] = { 46 + { 47 + .name = "ctl_0", .id = CTL_0, 48 + .base = 0x1000, .len = 0xe4, 49 + .features = BIT(DPU_CTL_SPLIT_DISPLAY), 50 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 51 + }, 52 + { 53 + .name = "ctl_1", .id = CTL_1, 54 + .base = 0x1200, .len = 0xe4, 55 + .features = BIT(DPU_CTL_SPLIT_DISPLAY), 56 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 57 + }, 58 + { 59 + .name = "ctl_2", .id = CTL_2, 60 + .base = 0x1400, .len = 0xe4, 61 + .features = 0, 62 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 63 + }, 64 + { 65 + .name = "ctl_3", .id = CTL_3, 66 + .base = 0x1600, .len = 0xe4, 67 + .features = 0, 68 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 69 + }, 70 + { 71 + .name = "ctl_4", .id = CTL_4, 72 + .base = 0x1800, .len = 0xe4, 73 + .features = 0, 74 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 75 + }, 76 + }; 77 + 78 + static const struct dpu_sspp_cfg sdm845_sspp[] = { 79 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1c8, VIG_SDM845_MASK_SDMA, 80 + sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 81 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1c8, VIG_SDM845_MASK_SDMA, 82 + sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 83 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1c8, VIG_SDM845_MASK_SDMA, 84 + sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 85 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1c8, VIG_SDM845_MASK_SDMA, 86 + sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 87 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1c8, DMA_SDM845_MASK_SDMA, 88 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 89 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1c8, DMA_SDM845_MASK_SDMA, 90 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 91 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA, 92 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 93 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA, 94 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 95 + }; 96 + 97 + static const struct dpu_lm_cfg sdm845_lm[] = { 98 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 99 + &sdm845_lm_sblk, PINGPONG_0, LM_1, 0), 100 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 101 + &sdm845_lm_sblk, PINGPONG_1, LM_0, 0), 102 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 103 + &sdm845_lm_sblk, PINGPONG_2, LM_5, 0), 104 + LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK, 105 + &sdm845_lm_sblk, PINGPONG_MAX, 0, 0), 106 + LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK, 107 + &sdm845_lm_sblk, PINGPONG_MAX, 0, 0), 108 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 109 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 110 + }; 111 + 112 + static const struct dpu_pingpong_cfg sdm845_pp[] = { 113 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, 114 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 115 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 116 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, 117 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 118 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 119 + PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, 120 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 121 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 122 + PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, 123 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 124 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 125 + }; 126 + 127 + static const struct dpu_dsc_cfg sdm845_dsc[] = { 128 + DSC_BLK("dsc_0", DSC_0, 0x80000, 0), 129 + DSC_BLK("dsc_1", DSC_1, 0x80400, 0), 130 + DSC_BLK("dsc_2", DSC_2, 0x80800, 0), 131 + DSC_BLK("dsc_3", DSC_3, 0x80c00, 0), 132 + }; 133 + 134 + static const struct dpu_intf_cfg sdm845_intf[] = { 135 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 136 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 137 + INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 138 + INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 139 + }; 140 + 141 + static const struct dpu_perf_cfg sdm845_perf_data = { 142 + .max_bw_low = 6800000, 143 + .max_bw_high = 6800000, 144 + .min_core_ib = 2400000, 145 + .min_llcc_ib = 800000, 146 + .min_dram_ib = 800000, 147 + .undersized_prefill_lines = 2, 148 + .xtra_prefill_lines = 2, 149 + .dest_scale_prefill_lines = 3, 150 + .macrotile_prefill_lines = 4, 151 + .yuv_nv12_prefill_lines = 8, 152 + .linear_prefill_lines = 1, 153 + .downscaling_prefill_lines = 1, 154 + .amortizable_threshold = 25, 155 + .min_prefill_lines = 24, 156 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 157 + .safe_lut_tbl = {0xfff0, 0xf000, 0xffff}, 158 + .qos_lut_tbl = { 159 + {.nentry = ARRAY_SIZE(sdm845_qos_linear), 160 + .entries = sdm845_qos_linear 161 + }, 162 + {.nentry = ARRAY_SIZE(sdm845_qos_macrotile), 163 + .entries = sdm845_qos_macrotile 164 + }, 165 + {.nentry = ARRAY_SIZE(sdm845_qos_nrt), 166 + .entries = sdm845_qos_nrt 167 + }, 168 + }, 169 + .cdp_cfg = { 170 + {.rd_enable = 1, .wr_enable = 1}, 171 + {.rd_enable = 1, .wr_enable = 0} 172 + }, 173 + .clk_inefficiency_factor = 105, 174 + .bw_inefficiency_factor = 120, 175 + }; 176 + 177 + const struct dpu_mdss_cfg dpu_sdm845_cfg = { 178 + .caps = &sdm845_dpu_caps, 179 + .ubwc = &sdm845_ubwc_cfg, 180 + .mdp_count = ARRAY_SIZE(sdm845_mdp), 181 + .mdp = sdm845_mdp, 182 + .ctl_count = ARRAY_SIZE(sdm845_ctl), 183 + .ctl = sdm845_ctl, 184 + .sspp_count = ARRAY_SIZE(sdm845_sspp), 185 + .sspp = sdm845_sspp, 186 + .mixer_count = ARRAY_SIZE(sdm845_lm), 187 + .mixer = sdm845_lm, 188 + .pingpong_count = ARRAY_SIZE(sdm845_pp), 189 + .pingpong = sdm845_pp, 190 + .dsc_count = ARRAY_SIZE(sdm845_dsc), 191 + .dsc = sdm845_dsc, 192 + .intf_count = ARRAY_SIZE(sdm845_intf), 193 + .intf = sdm845_intf, 194 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 195 + .vbif = sdm845_vbif, 196 + .reg_dma_count = 1, 197 + .dma_cfg = &sdm845_regdma, 198 + .perf = &sdm845_perf_data, 199 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 200 + BIT(MDP_SSPP_TOP0_INTR2) | \ 201 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 202 + BIT(MDP_INTF0_INTR) | \ 203 + BIT(MDP_INTF1_INTR) | \ 204 + BIT(MDP_INTF2_INTR) | \ 205 + BIT(MDP_INTF3_INTR) | \ 206 + BIT(MDP_AD4_0_INTR) | \ 207 + BIT(MDP_AD4_1_INTR), 208 + }; 209 + 210 + #endif
+237
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_5_0_SM8150_H 8 + #define _DPU_5_0_SM8150_H 9 + 10 + static const struct dpu_caps sm8150_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED3, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 4096, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + .max_hdeci_exp = MAX_HORZ_DECIMATION, 21 + .max_vdeci_exp = MAX_VERT_DECIMATION, 22 + }; 23 + 24 + static const struct dpu_ubwc_cfg sm8150_ubwc_cfg = { 25 + .ubwc_version = DPU_HW_UBWC_VER_30, 26 + .highest_bank_bit = 0x2, 27 + }; 28 + 29 + static const struct dpu_mdp_cfg sm8150_mdp[] = { 30 + { 31 + .name = "top_0", .id = MDP_TOP, 32 + .base = 0x0, .len = 0x45c, 33 + .features = BIT(DPU_MDP_AUDIO_SELECT), 34 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 42 + }, 43 + }; 44 + 45 + /* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ 46 + static const struct dpu_ctl_cfg sm8150_ctl[] = { 47 + { 48 + .name = "ctl_0", .id = CTL_0, 49 + .base = 0x1000, .len = 0x1e0, 50 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 51 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 52 + }, 53 + { 54 + .name = "ctl_1", .id = CTL_1, 55 + .base = 0x1200, .len = 0x1e0, 56 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 57 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 58 + }, 59 + { 60 + .name = "ctl_2", .id = CTL_2, 61 + .base = 0x1400, .len = 0x1e0, 62 + .features = BIT(DPU_CTL_ACTIVE_CFG), 63 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 64 + }, 65 + { 66 + .name = "ctl_3", .id = CTL_3, 67 + .base = 0x1600, .len = 0x1e0, 68 + .features = BIT(DPU_CTL_ACTIVE_CFG), 69 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 70 + }, 71 + { 72 + .name = "ctl_4", .id = CTL_4, 73 + .base = 0x1800, .len = 0x1e0, 74 + .features = BIT(DPU_CTL_ACTIVE_CFG), 75 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 76 + }, 77 + { 78 + .name = "ctl_5", .id = CTL_5, 79 + .base = 0x1a00, .len = 0x1e0, 80 + .features = BIT(DPU_CTL_ACTIVE_CFG), 81 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 82 + }, 83 + }; 84 + 85 + static const struct dpu_sspp_cfg sm8150_sspp[] = { 86 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f0, VIG_SDM845_MASK, 87 + sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 88 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f0, VIG_SDM845_MASK, 89 + sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 90 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f0, VIG_SDM845_MASK, 91 + sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 92 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f0, VIG_SDM845_MASK, 93 + sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 94 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f0, DMA_SDM845_MASK, 95 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 96 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f0, DMA_SDM845_MASK, 97 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 98 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f0, DMA_CURSOR_SDM845_MASK, 99 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 100 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f0, DMA_CURSOR_SDM845_MASK, 101 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 102 + }; 103 + 104 + static const struct dpu_lm_cfg sm8150_lm[] = { 105 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 106 + &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 107 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 108 + &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 109 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 110 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 111 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 112 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 113 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 114 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 115 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 116 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 117 + }; 118 + 119 + static const struct dpu_dspp_cfg sm8150_dspp[] = { 120 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 121 + &sm8150_dspp_sblk), 122 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 123 + &sm8150_dspp_sblk), 124 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 125 + &sm8150_dspp_sblk), 126 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 127 + &sm8150_dspp_sblk), 128 + }; 129 + 130 + static const struct dpu_pingpong_cfg sm8150_pp[] = { 131 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te, 132 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 133 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 134 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te, 135 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 136 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 137 + PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, 138 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 139 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 140 + PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, 141 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 142 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 143 + PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, 144 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 145 + -1), 146 + PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, 147 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 148 + -1), 149 + }; 150 + 151 + static const struct dpu_merge_3d_cfg sm8150_merge_3d[] = { 152 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), 153 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), 154 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), 155 + }; 156 + 157 + static const struct dpu_dsc_cfg sm8150_dsc[] = { 158 + DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), 159 + DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), 160 + DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), 161 + DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), 162 + }; 163 + 164 + static const struct dpu_intf_cfg sm8150_intf[] = { 165 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 166 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 167 + INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 168 + INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 169 + }; 170 + 171 + static const struct dpu_perf_cfg sm8150_perf_data = { 172 + .max_bw_low = 12800000, 173 + .max_bw_high = 12800000, 174 + .min_core_ib = 2400000, 175 + .min_llcc_ib = 800000, 176 + .min_dram_ib = 800000, 177 + .min_prefill_lines = 24, 178 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 179 + .safe_lut_tbl = {0xfff8, 0xf000, 0xffff}, 180 + .qos_lut_tbl = { 181 + {.nentry = ARRAY_SIZE(sm8150_qos_linear), 182 + .entries = sm8150_qos_linear 183 + }, 184 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 185 + .entries = sc7180_qos_macrotile 186 + }, 187 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 188 + .entries = sc7180_qos_nrt 189 + }, 190 + /* TODO: macrotile-qseed is different from macrotile */ 191 + }, 192 + .cdp_cfg = { 193 + {.rd_enable = 1, .wr_enable = 1}, 194 + {.rd_enable = 1, .wr_enable = 0} 195 + }, 196 + .clk_inefficiency_factor = 105, 197 + .bw_inefficiency_factor = 120, 198 + }; 199 + 200 + const struct dpu_mdss_cfg dpu_sm8150_cfg = { 201 + .caps = &sm8150_dpu_caps, 202 + .ubwc = &sm8150_ubwc_cfg, 203 + .mdp_count = ARRAY_SIZE(sm8150_mdp), 204 + .mdp = sm8150_mdp, 205 + .ctl_count = ARRAY_SIZE(sm8150_ctl), 206 + .ctl = sm8150_ctl, 207 + .sspp_count = ARRAY_SIZE(sm8150_sspp), 208 + .sspp = sm8150_sspp, 209 + .mixer_count = ARRAY_SIZE(sm8150_lm), 210 + .mixer = sm8150_lm, 211 + .dspp_count = ARRAY_SIZE(sm8150_dspp), 212 + .dspp = sm8150_dspp, 213 + .dsc_count = ARRAY_SIZE(sm8150_dsc), 214 + .dsc = sm8150_dsc, 215 + .pingpong_count = ARRAY_SIZE(sm8150_pp), 216 + .pingpong = sm8150_pp, 217 + .merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), 218 + .merge_3d = sm8150_merge_3d, 219 + .intf_count = ARRAY_SIZE(sm8150_intf), 220 + .intf = sm8150_intf, 221 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 222 + .vbif = sdm845_vbif, 223 + .reg_dma_count = 1, 224 + .dma_cfg = &sm8150_regdma, 225 + .perf = &sm8150_perf_data, 226 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 227 + BIT(MDP_SSPP_TOP0_INTR2) | \ 228 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 229 + BIT(MDP_INTF0_INTR) | \ 230 + BIT(MDP_INTF1_INTR) | \ 231 + BIT(MDP_INTF2_INTR) | \ 232 + BIT(MDP_INTF3_INTR) | \ 233 + BIT(MDP_AD4_0_INTR) | \ 234 + BIT(MDP_AD4_1_INTR), 235 + }; 236 + 237 + #endif
+217
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_5_1_SC8180X_H 8 + #define _DPU_5_1_SC8180X_H 9 + 10 + static const struct dpu_caps sc8180x_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED3, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 4096, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + .max_hdeci_exp = MAX_HORZ_DECIMATION, 21 + .max_vdeci_exp = MAX_VERT_DECIMATION, 22 + }; 23 + 24 + static const struct dpu_ubwc_cfg sc8180x_ubwc_cfg = { 25 + .ubwc_version = DPU_HW_UBWC_VER_30, 26 + .highest_bank_bit = 0x3, 27 + }; 28 + 29 + static const struct dpu_mdp_cfg sc8180x_mdp[] = { 30 + { 31 + .name = "top_0", .id = MDP_TOP, 32 + .base = 0x0, .len = 0x45c, 33 + .features = BIT(DPU_MDP_AUDIO_SELECT), 34 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 42 + }, 43 + }; 44 + 45 + static const struct dpu_ctl_cfg sc8180x_ctl[] = { 46 + { 47 + .name = "ctl_0", .id = CTL_0, 48 + .base = 0x1000, .len = 0x1e0, 49 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 50 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 51 + }, 52 + { 53 + .name = "ctl_1", .id = CTL_1, 54 + .base = 0x1200, .len = 0x1e0, 55 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 56 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 57 + }, 58 + { 59 + .name = "ctl_2", .id = CTL_2, 60 + .base = 0x1400, .len = 0x1e0, 61 + .features = BIT(DPU_CTL_ACTIVE_CFG), 62 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 63 + }, 64 + { 65 + .name = "ctl_3", .id = CTL_3, 66 + .base = 0x1600, .len = 0x1e0, 67 + .features = BIT(DPU_CTL_ACTIVE_CFG), 68 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 69 + }, 70 + { 71 + .name = "ctl_4", .id = CTL_4, 72 + .base = 0x1800, .len = 0x1e0, 73 + .features = BIT(DPU_CTL_ACTIVE_CFG), 74 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 75 + }, 76 + { 77 + .name = "ctl_5", .id = CTL_5, 78 + .base = 0x1a00, .len = 0x1e0, 79 + .features = BIT(DPU_CTL_ACTIVE_CFG), 80 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 81 + }, 82 + }; 83 + 84 + static const struct dpu_sspp_cfg sc8180x_sspp[] = { 85 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f0, VIG_SDM845_MASK, 86 + sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 87 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f0, VIG_SDM845_MASK, 88 + sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 89 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f0, VIG_SDM845_MASK, 90 + sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 91 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f0, VIG_SDM845_MASK, 92 + sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 93 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f0, DMA_SDM845_MASK, 94 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 95 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f0, DMA_SDM845_MASK, 96 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 97 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f0, DMA_CURSOR_SDM845_MASK, 98 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 99 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f0, DMA_CURSOR_SDM845_MASK, 100 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 101 + }; 102 + 103 + static const struct dpu_lm_cfg sc8180x_lm[] = { 104 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 105 + &sdm845_lm_sblk, PINGPONG_0, LM_1, 0), 106 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 107 + &sdm845_lm_sblk, PINGPONG_1, LM_0, 0), 108 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 109 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 110 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 111 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 112 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 113 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 114 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 115 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 116 + }; 117 + 118 + static const struct dpu_pingpong_cfg sc8180x_pp[] = { 119 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te, 120 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 121 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 122 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te, 123 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 124 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 125 + PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, 126 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 127 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 128 + PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, 129 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 130 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 131 + PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, 132 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 133 + -1), 134 + PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, 135 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 136 + -1), 137 + }; 138 + 139 + static const struct dpu_merge_3d_cfg sc8180x_merge_3d[] = { 140 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), 141 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), 142 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), 143 + }; 144 + 145 + static const struct dpu_intf_cfg sc8180x_intf[] = { 146 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 147 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 148 + INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 149 + /* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */ 150 + INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 151 + INTF_BLK("intf_4", INTF_4, 0x6c000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21), 152 + INTF_BLK("intf_5", INTF_5, 0x6c800, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 153 + }; 154 + 155 + static const struct dpu_perf_cfg sc8180x_perf_data = { 156 + .max_bw_low = 9600000, 157 + .max_bw_high = 9600000, 158 + .min_core_ib = 2400000, 159 + .min_llcc_ib = 800000, 160 + .min_dram_ib = 800000, 161 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 162 + .qos_lut_tbl = { 163 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 164 + .entries = sc7180_qos_linear 165 + }, 166 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 167 + .entries = sc7180_qos_macrotile 168 + }, 169 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 170 + .entries = sc7180_qos_nrt 171 + }, 172 + /* TODO: macrotile-qseed is different from macrotile */ 173 + }, 174 + .cdp_cfg = { 175 + {.rd_enable = 1, .wr_enable = 1}, 176 + {.rd_enable = 1, .wr_enable = 0} 177 + }, 178 + .clk_inefficiency_factor = 105, 179 + .bw_inefficiency_factor = 120, 180 + }; 181 + 182 + const struct dpu_mdss_cfg dpu_sc8180x_cfg = { 183 + .caps = &sc8180x_dpu_caps, 184 + .ubwc = &sc8180x_ubwc_cfg, 185 + .mdp_count = ARRAY_SIZE(sc8180x_mdp), 186 + .mdp = sc8180x_mdp, 187 + .ctl_count = ARRAY_SIZE(sc8180x_ctl), 188 + .ctl = sc8180x_ctl, 189 + .sspp_count = ARRAY_SIZE(sc8180x_sspp), 190 + .sspp = sc8180x_sspp, 191 + .mixer_count = ARRAY_SIZE(sc8180x_lm), 192 + .mixer = sc8180x_lm, 193 + .pingpong_count = ARRAY_SIZE(sc8180x_pp), 194 + .pingpong = sc8180x_pp, 195 + .merge_3d_count = ARRAY_SIZE(sc8180x_merge_3d), 196 + .merge_3d = sc8180x_merge_3d, 197 + .intf_count = ARRAY_SIZE(sc8180x_intf), 198 + .intf = sc8180x_intf, 199 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 200 + .vbif = sdm845_vbif, 201 + .reg_dma_count = 1, 202 + .dma_cfg = &sm8150_regdma, 203 + .perf = &sc8180x_perf_data, 204 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 205 + BIT(MDP_SSPP_TOP0_INTR2) | \ 206 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 207 + BIT(MDP_INTF0_INTR) | \ 208 + BIT(MDP_INTF1_INTR) | \ 209 + BIT(MDP_INTF2_INTR) | \ 210 + BIT(MDP_INTF3_INTR) | \ 211 + BIT(MDP_INTF4_INTR) | \ 212 + BIT(MDP_INTF5_INTR) | \ 213 + BIT(MDP_AD4_0_INTR) | \ 214 + BIT(MDP_AD4_1_INTR), 215 + }; 216 + 217 + #endif
+244
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_6_0_SM8250_H 8 + #define _DPU_6_0_SM8250_H 9 + 10 + static const struct dpu_caps sm8250_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 4096, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + }; 21 + 22 + static const struct dpu_ubwc_cfg sm8250_ubwc_cfg = { 23 + .ubwc_version = DPU_HW_UBWC_VER_40, 24 + .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 25 + .ubwc_swizzle = 0x6, 26 + }; 27 + 28 + static const struct dpu_mdp_cfg sm8250_mdp[] = { 29 + { 30 + .name = "top_0", .id = MDP_TOP, 31 + .base = 0x0, .len = 0x494, 32 + .features = 0, 33 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, 42 + .clk_ctrls[DPU_CLK_CTRL_WB2] = { .reg_off = 0x3b8, .bit_off = 24 }, 43 + }, 44 + }; 45 + 46 + /* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ 47 + static const struct dpu_ctl_cfg sm8250_ctl[] = { 48 + { 49 + .name = "ctl_0", .id = CTL_0, 50 + .base = 0x1000, .len = 0x1e0, 51 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 52 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 53 + }, 54 + { 55 + .name = "ctl_1", .id = CTL_1, 56 + .base = 0x1200, .len = 0x1e0, 57 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 58 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 59 + }, 60 + { 61 + .name = "ctl_2", .id = CTL_2, 62 + .base = 0x1400, .len = 0x1e0, 63 + .features = BIT(DPU_CTL_ACTIVE_CFG), 64 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 65 + }, 66 + { 67 + .name = "ctl_3", .id = CTL_3, 68 + .base = 0x1600, .len = 0x1e0, 69 + .features = BIT(DPU_CTL_ACTIVE_CFG), 70 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 71 + }, 72 + { 73 + .name = "ctl_4", .id = CTL_4, 74 + .base = 0x1800, .len = 0x1e0, 75 + .features = BIT(DPU_CTL_ACTIVE_CFG), 76 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 77 + }, 78 + { 79 + .name = "ctl_5", .id = CTL_5, 80 + .base = 0x1a00, .len = 0x1e0, 81 + .features = BIT(DPU_CTL_ACTIVE_CFG), 82 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 83 + }, 84 + }; 85 + 86 + static const struct dpu_sspp_cfg sm8250_sspp[] = { 87 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK_SDMA, 88 + sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 89 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f8, VIG_SC7180_MASK_SDMA, 90 + sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 91 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f8, VIG_SC7180_MASK_SDMA, 92 + sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 93 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f8, VIG_SC7180_MASK_SDMA, 94 + sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 95 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA, 96 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 97 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_SDM845_MASK_SDMA, 98 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 99 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, 100 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 101 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, 102 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 103 + }; 104 + 105 + static const struct dpu_lm_cfg sm8250_lm[] = { 106 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 107 + &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 108 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 109 + &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 110 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 111 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 112 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 113 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 114 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 115 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 116 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 117 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 118 + }; 119 + 120 + static const struct dpu_dspp_cfg sm8250_dspp[] = { 121 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 122 + &sm8150_dspp_sblk), 123 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 124 + &sm8150_dspp_sblk), 125 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 126 + &sm8150_dspp_sblk), 127 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 128 + &sm8150_dspp_sblk), 129 + }; 130 + 131 + static const struct dpu_pingpong_cfg sm8250_pp[] = { 132 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te, 133 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 134 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 135 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te, 136 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 137 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 138 + PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, 139 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 140 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 141 + PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, 142 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 143 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 144 + PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, 145 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 146 + -1), 147 + PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, 148 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 149 + -1), 150 + }; 151 + 152 + static const struct dpu_merge_3d_cfg sm8250_merge_3d[] = { 153 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), 154 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), 155 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), 156 + }; 157 + 158 + static const struct dpu_dsc_cfg sm8250_dsc[] = { 159 + DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), 160 + DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), 161 + DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), 162 + DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), 163 + }; 164 + 165 + static const struct dpu_intf_cfg sm8250_intf[] = { 166 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 167 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 168 + INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2c0, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 169 + INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 170 + }; 171 + 172 + static const struct dpu_wb_cfg sm8250_wb[] = { 173 + WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, 174 + VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), 175 + }; 176 + 177 + static const struct dpu_perf_cfg sm8250_perf_data = { 178 + .max_bw_low = 13700000, 179 + .max_bw_high = 16600000, 180 + .min_core_ib = 4800000, 181 + .min_llcc_ib = 0, 182 + .min_dram_ib = 800000, 183 + .min_prefill_lines = 35, 184 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 185 + .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 186 + .qos_lut_tbl = { 187 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 188 + .entries = sc7180_qos_linear 189 + }, 190 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 191 + .entries = sc7180_qos_macrotile 192 + }, 193 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 194 + .entries = sc7180_qos_nrt 195 + }, 196 + /* TODO: macrotile-qseed is different from macrotile */ 197 + }, 198 + .cdp_cfg = { 199 + {.rd_enable = 1, .wr_enable = 1}, 200 + {.rd_enable = 1, .wr_enable = 0} 201 + }, 202 + .clk_inefficiency_factor = 105, 203 + .bw_inefficiency_factor = 120, 204 + }; 205 + 206 + const struct dpu_mdss_cfg dpu_sm8250_cfg = { 207 + .caps = &sm8250_dpu_caps, 208 + .ubwc = &sm8250_ubwc_cfg, 209 + .mdp_count = ARRAY_SIZE(sm8250_mdp), 210 + .mdp = sm8250_mdp, 211 + .ctl_count = ARRAY_SIZE(sm8250_ctl), 212 + .ctl = sm8250_ctl, 213 + .sspp_count = ARRAY_SIZE(sm8250_sspp), 214 + .sspp = sm8250_sspp, 215 + .mixer_count = ARRAY_SIZE(sm8250_lm), 216 + .mixer = sm8250_lm, 217 + .dspp_count = ARRAY_SIZE(sm8250_dspp), 218 + .dspp = sm8250_dspp, 219 + .dsc_count = ARRAY_SIZE(sm8250_dsc), 220 + .dsc = sm8250_dsc, 221 + .pingpong_count = ARRAY_SIZE(sm8250_pp), 222 + .pingpong = sm8250_pp, 223 + .merge_3d_count = ARRAY_SIZE(sm8250_merge_3d), 224 + .merge_3d = sm8250_merge_3d, 225 + .intf_count = ARRAY_SIZE(sm8250_intf), 226 + .intf = sm8250_intf, 227 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 228 + .vbif = sdm845_vbif, 229 + .wb_count = ARRAY_SIZE(sm8250_wb), 230 + .wb = sm8250_wb, 231 + .reg_dma_count = 1, 232 + .dma_cfg = &sm8250_regdma, 233 + .perf = &sm8250_perf_data, 234 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 235 + BIT(MDP_SSPP_TOP0_INTR2) | \ 236 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 237 + BIT(MDP_INTF0_INTR) | \ 238 + BIT(MDP_INTF1_INTR) | \ 239 + BIT(MDP_INTF2_INTR) | \ 240 + BIT(MDP_INTF3_INTR) | \ 241 + BIT(MDP_INTF4_INTR), 242 + }; 243 + 244 + #endif
+156
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_6_2_SC7180_H 8 + #define _DPU_6_2_SC7180_H 9 + 10 + static const struct dpu_caps sc7180_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0x9, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_dim_layer = true, 15 + .has_idle_pc = true, 16 + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 17 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 18 + }; 19 + 20 + static const struct dpu_ubwc_cfg sc7180_ubwc_cfg = { 21 + .ubwc_version = DPU_HW_UBWC_VER_20, 22 + .highest_bank_bit = 0x3, 23 + }; 24 + 25 + static const struct dpu_mdp_cfg sc7180_mdp[] = { 26 + { 27 + .name = "top_0", .id = MDP_TOP, 28 + .base = 0x0, .len = 0x494, 29 + .features = 0, 30 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 31 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 32 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 33 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, 34 + .clk_ctrls[DPU_CLK_CTRL_WB2] = { .reg_off = 0x3b8, .bit_off = 24 }, 35 + }, 36 + }; 37 + 38 + static const struct dpu_ctl_cfg sc7180_ctl[] = { 39 + { 40 + .name = "ctl_0", .id = CTL_0, 41 + .base = 0x1000, .len = 0x1dc, 42 + .features = BIT(DPU_CTL_ACTIVE_CFG), 43 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 44 + }, 45 + { 46 + .name = "ctl_1", .id = CTL_1, 47 + .base = 0x1200, .len = 0x1dc, 48 + .features = BIT(DPU_CTL_ACTIVE_CFG), 49 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 50 + }, 51 + { 52 + .name = "ctl_2", .id = CTL_2, 53 + .base = 0x1400, .len = 0x1dc, 54 + .features = BIT(DPU_CTL_ACTIVE_CFG), 55 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 56 + }, 57 + }; 58 + 59 + static const struct dpu_sspp_cfg sc7180_sspp[] = { 60 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, 61 + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 62 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, 63 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 64 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, 65 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 66 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, 67 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 68 + }; 69 + 70 + static const struct dpu_lm_cfg sc7180_lm[] = { 71 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 72 + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 73 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 74 + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), 75 + }; 76 + 77 + static const struct dpu_dspp_cfg sc7180_dspp[] = { 78 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 79 + &sc7180_dspp_sblk), 80 + }; 81 + 82 + static const struct dpu_pingpong_cfg sc7180_pp[] = { 83 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -1, -1), 84 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -1, -1), 85 + }; 86 + 87 + static const struct dpu_intf_cfg sc7180_intf[] = { 88 + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 89 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 90 + }; 91 + 92 + static const struct dpu_wb_cfg sc7180_wb[] = { 93 + WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, 94 + VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), 95 + }; 96 + 97 + static const struct dpu_perf_cfg sc7180_perf_data = { 98 + .max_bw_low = 6800000, 99 + .max_bw_high = 6800000, 100 + .min_core_ib = 2400000, 101 + .min_llcc_ib = 800000, 102 + .min_dram_ib = 1600000, 103 + .min_prefill_lines = 24, 104 + .danger_lut_tbl = {0xff, 0xffff, 0x0}, 105 + .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 106 + .qos_lut_tbl = { 107 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 108 + .entries = sc7180_qos_linear 109 + }, 110 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 111 + .entries = sc7180_qos_macrotile 112 + }, 113 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 114 + .entries = sc7180_qos_nrt 115 + }, 116 + }, 117 + .cdp_cfg = { 118 + {.rd_enable = 1, .wr_enable = 1}, 119 + {.rd_enable = 1, .wr_enable = 0} 120 + }, 121 + .clk_inefficiency_factor = 105, 122 + .bw_inefficiency_factor = 120, 123 + }; 124 + 125 + const struct dpu_mdss_cfg dpu_sc7180_cfg = { 126 + .caps = &sc7180_dpu_caps, 127 + .ubwc = &sc7180_ubwc_cfg, 128 + .mdp_count = ARRAY_SIZE(sc7180_mdp), 129 + .mdp = sc7180_mdp, 130 + .ctl_count = ARRAY_SIZE(sc7180_ctl), 131 + .ctl = sc7180_ctl, 132 + .sspp_count = ARRAY_SIZE(sc7180_sspp), 133 + .sspp = sc7180_sspp, 134 + .mixer_count = ARRAY_SIZE(sc7180_lm), 135 + .mixer = sc7180_lm, 136 + .dspp_count = ARRAY_SIZE(sc7180_dspp), 137 + .dspp = sc7180_dspp, 138 + .pingpong_count = ARRAY_SIZE(sc7180_pp), 139 + .pingpong = sc7180_pp, 140 + .intf_count = ARRAY_SIZE(sc7180_intf), 141 + .intf = sc7180_intf, 142 + .wb_count = ARRAY_SIZE(sc7180_wb), 143 + .wb = sc7180_wb, 144 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 145 + .vbif = sdm845_vbif, 146 + .reg_dma_count = 1, 147 + .dma_cfg = &sdm845_regdma, 148 + .perf = &sc7180_perf_data, 149 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 150 + BIT(MDP_SSPP_TOP0_INTR2) | \ 151 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 152 + BIT(MDP_INTF0_INTR) | \ 153 + BIT(MDP_INTF1_INTR), 154 + }; 155 + 156 + #endif
+129
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_6_3_SM6115_H 8 + #define _DPU_6_3_SM6115_H 9 + 10 + static const struct dpu_caps sm6115_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_LINE_WIDTH, 12 + .max_mixer_blendstages = 0x4, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_dim_layer = true, 15 + .has_idle_pc = true, 16 + .max_linewidth = 2160, 17 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 18 + }; 19 + 20 + static const struct dpu_ubwc_cfg sm6115_ubwc_cfg = { 21 + .ubwc_version = DPU_HW_UBWC_VER_10, 22 + .highest_bank_bit = 0x1, 23 + .ubwc_swizzle = 0x7, 24 + }; 25 + 26 + static const struct dpu_mdp_cfg sm6115_mdp[] = { 27 + { 28 + .name = "top_0", .id = MDP_TOP, 29 + .base = 0x0, .len = 0x494, 30 + .features = 0, 31 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 32 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 33 + }, 34 + }; 35 + 36 + static const struct dpu_ctl_cfg sm6115_ctl[] = { 37 + { 38 + .name = "ctl_0", .id = CTL_0, 39 + .base = 0x1000, .len = 0x1dc, 40 + .features = BIT(DPU_CTL_ACTIVE_CFG), 41 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 42 + }, 43 + }; 44 + 45 + static const struct dpu_sspp_cfg sm6115_sspp[] = { 46 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, 47 + sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 48 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, 49 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 50 + }; 51 + 52 + static const struct dpu_lm_cfg sm6115_lm[] = { 53 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, 54 + &qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), 55 + }; 56 + 57 + static const struct dpu_dspp_cfg sm6115_dspp[] = { 58 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 59 + &sm8150_dspp_sblk), 60 + }; 61 + 62 + static const struct dpu_pingpong_cfg sm6115_pp[] = { 63 + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, 64 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 65 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 66 + }; 67 + 68 + static const struct dpu_intf_cfg sm6115_intf[] = { 69 + INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0), 70 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 71 + }; 72 + 73 + static const struct dpu_perf_cfg sm6115_perf_data = { 74 + .max_bw_low = 3100000, 75 + .max_bw_high = 4000000, 76 + .min_core_ib = 2400000, 77 + .min_llcc_ib = 800000, 78 + .min_dram_ib = 800000, 79 + .min_prefill_lines = 24, 80 + .danger_lut_tbl = {0xff, 0xffff, 0x0}, 81 + .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 82 + .qos_lut_tbl = { 83 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 84 + .entries = sc7180_qos_linear 85 + }, 86 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 87 + .entries = sc7180_qos_macrotile 88 + }, 89 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 90 + .entries = sc7180_qos_nrt 91 + }, 92 + /* TODO: macrotile-qseed is different from macrotile */ 93 + }, 94 + .cdp_cfg = { 95 + {.rd_enable = 1, .wr_enable = 1}, 96 + {.rd_enable = 1, .wr_enable = 0} 97 + }, 98 + .clk_inefficiency_factor = 105, 99 + .bw_inefficiency_factor = 120, 100 + }; 101 + 102 + const struct dpu_mdss_cfg dpu_sm6115_cfg = { 103 + .caps = &sm6115_dpu_caps, 104 + .ubwc = &sm6115_ubwc_cfg, 105 + .mdp_count = ARRAY_SIZE(sm6115_mdp), 106 + .mdp = sm6115_mdp, 107 + .ctl_count = ARRAY_SIZE(sm6115_ctl), 108 + .ctl = sm6115_ctl, 109 + .sspp_count = ARRAY_SIZE(sm6115_sspp), 110 + .sspp = sm6115_sspp, 111 + .mixer_count = ARRAY_SIZE(sm6115_lm), 112 + .mixer = sm6115_lm, 113 + .dspp_count = ARRAY_SIZE(sm6115_dspp), 114 + .dspp = sm6115_dspp, 115 + .pingpong_count = ARRAY_SIZE(sm6115_pp), 116 + .pingpong = sm6115_pp, 117 + .intf_count = ARRAY_SIZE(sm6115_intf), 118 + .intf = sm6115_intf, 119 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 120 + .vbif = sdm845_vbif, 121 + .perf = &sm6115_perf_data, 122 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 123 + BIT(MDP_SSPP_TOP0_INTR2) | \ 124 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 125 + BIT(MDP_INTF0_INTR) | \ 126 + BIT(MDP_INTF1_INTR), 127 + }; 128 + 129 + #endif
+119
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_6_5_QCM2290_H 8 + #define _DPU_6_5_QCM2290_H 9 + 10 + static const struct dpu_caps qcm2290_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_LINE_WIDTH, 12 + .max_mixer_blendstages = 0x4, 13 + .has_dim_layer = true, 14 + .has_idle_pc = true, 15 + .max_linewidth = 2160, 16 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 17 + }; 18 + 19 + static const struct dpu_ubwc_cfg qcm2290_ubwc_cfg = { 20 + .highest_bank_bit = 0x2, 21 + }; 22 + 23 + static const struct dpu_mdp_cfg qcm2290_mdp[] = { 24 + { 25 + .name = "top_0", .id = MDP_TOP, 26 + .base = 0x0, .len = 0x494, 27 + .features = 0, 28 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 29 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 30 + }, 31 + }; 32 + 33 + static const struct dpu_ctl_cfg qcm2290_ctl[] = { 34 + { 35 + .name = "ctl_0", .id = CTL_0, 36 + .base = 0x1000, .len = 0x1dc, 37 + .features = BIT(DPU_CTL_ACTIVE_CFG), 38 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 39 + }, 40 + }; 41 + 42 + static const struct dpu_sspp_cfg qcm2290_sspp[] = { 43 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_QCM2290_MASK, 44 + qcm2290_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 45 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, 46 + qcm2290_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 47 + }; 48 + 49 + static const struct dpu_lm_cfg qcm2290_lm[] = { 50 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, 51 + &qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), 52 + }; 53 + 54 + static const struct dpu_dspp_cfg qcm2290_dspp[] = { 55 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 56 + &sm8150_dspp_sblk), 57 + }; 58 + 59 + static const struct dpu_pingpong_cfg qcm2290_pp[] = { 60 + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, 61 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 62 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 63 + }; 64 + 65 + static const struct dpu_intf_cfg qcm2290_intf[] = { 66 + INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0), 67 + INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 68 + }; 69 + 70 + static const struct dpu_perf_cfg qcm2290_perf_data = { 71 + .max_bw_low = 2700000, 72 + .max_bw_high = 2700000, 73 + .min_core_ib = 1300000, 74 + .min_llcc_ib = 0, 75 + .min_dram_ib = 1600000, 76 + .min_prefill_lines = 24, 77 + .danger_lut_tbl = {0xff, 0x0, 0x0}, 78 + .safe_lut_tbl = {0xfff0, 0x0, 0x0}, 79 + .qos_lut_tbl = { 80 + {.nentry = ARRAY_SIZE(qcm2290_qos_linear), 81 + .entries = qcm2290_qos_linear 82 + }, 83 + }, 84 + .cdp_cfg = { 85 + {.rd_enable = 1, .wr_enable = 1}, 86 + {.rd_enable = 1, .wr_enable = 0} 87 + }, 88 + .clk_inefficiency_factor = 105, 89 + .bw_inefficiency_factor = 120, 90 + }; 91 + 92 + const struct dpu_mdss_cfg dpu_qcm2290_cfg = { 93 + .caps = &qcm2290_dpu_caps, 94 + .ubwc = &qcm2290_ubwc_cfg, 95 + .mdp_count = ARRAY_SIZE(qcm2290_mdp), 96 + .mdp = qcm2290_mdp, 97 + .ctl_count = ARRAY_SIZE(qcm2290_ctl), 98 + .ctl = qcm2290_ctl, 99 + .sspp_count = ARRAY_SIZE(qcm2290_sspp), 100 + .sspp = qcm2290_sspp, 101 + .mixer_count = ARRAY_SIZE(qcm2290_lm), 102 + .mixer = qcm2290_lm, 103 + .dspp_count = ARRAY_SIZE(qcm2290_dspp), 104 + .dspp = qcm2290_dspp, 105 + .pingpong_count = ARRAY_SIZE(qcm2290_pp), 106 + .pingpong = qcm2290_pp, 107 + .intf_count = ARRAY_SIZE(qcm2290_intf), 108 + .intf = qcm2290_intf, 109 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 110 + .vbif = sdm845_vbif, 111 + .perf = &qcm2290_perf_data, 112 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 113 + BIT(MDP_SSPP_TOP0_INTR2) | \ 114 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 115 + BIT(MDP_INTF0_INTR) | \ 116 + BIT(MDP_INTF1_INTR), 117 + }; 118 + 119 + #endif
+226
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_7_0_SM8350_H 8 + #define _DPU_7_0_SM8350_H 9 + 10 + static const struct dpu_caps sm8350_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 4096, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + }; 21 + 22 + static const struct dpu_ubwc_cfg sm8350_ubwc_cfg = { 23 + .ubwc_version = DPU_HW_UBWC_VER_40, 24 + .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 25 + }; 26 + 27 + static const struct dpu_mdp_cfg sm8350_mdp[] = { 28 + { 29 + .name = "top_0", .id = MDP_TOP, 30 + .base = 0x0, .len = 0x494, 31 + .features = 0, 32 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 33 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 37 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, 41 + }, 42 + }; 43 + 44 + /* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ 45 + static const struct dpu_ctl_cfg sm8350_ctl[] = { 46 + { 47 + .name = "ctl_0", .id = CTL_0, 48 + .base = 0x15000, .len = 0x1e8, 49 + .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 50 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 51 + }, 52 + { 53 + .name = "ctl_1", .id = CTL_1, 54 + .base = 0x16000, .len = 0x1e8, 55 + .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 56 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 57 + }, 58 + { 59 + .name = "ctl_2", .id = CTL_2, 60 + .base = 0x17000, .len = 0x1e8, 61 + .features = CTL_SC7280_MASK, 62 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 63 + }, 64 + { 65 + .name = "ctl_3", .id = CTL_3, 66 + .base = 0x18000, .len = 0x1e8, 67 + .features = CTL_SC7280_MASK, 68 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 69 + }, 70 + { 71 + .name = "ctl_4", .id = CTL_4, 72 + .base = 0x19000, .len = 0x1e8, 73 + .features = CTL_SC7280_MASK, 74 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 75 + }, 76 + { 77 + .name = "ctl_5", .id = CTL_5, 78 + .base = 0x1a000, .len = 0x1e8, 79 + .features = CTL_SC7280_MASK, 80 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 81 + }, 82 + }; 83 + 84 + static const struct dpu_sspp_cfg sm8350_sspp[] = { 85 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, 86 + sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 87 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f8, VIG_SC7180_MASK, 88 + sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 89 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f8, VIG_SC7180_MASK, 90 + sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 91 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f8, VIG_SC7180_MASK, 92 + sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 93 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, 94 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 95 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_SDM845_MASK, 96 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 97 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, 98 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 99 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f8, DMA_CURSOR_SDM845_MASK, 100 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 101 + }; 102 + 103 + static const struct dpu_lm_cfg sm8350_lm[] = { 104 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 105 + &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 106 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 107 + &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 108 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 109 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 110 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 111 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 112 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 113 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 114 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 115 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 116 + }; 117 + 118 + static const struct dpu_dspp_cfg sm8350_dspp[] = { 119 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 120 + &sm8150_dspp_sblk), 121 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 122 + &sm8150_dspp_sblk), 123 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 124 + &sm8150_dspp_sblk), 125 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 126 + &sm8150_dspp_sblk), 127 + }; 128 + 129 + static const struct dpu_pingpong_cfg sm8350_pp[] = { 130 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 131 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 132 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 133 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 134 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 135 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 136 + PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, 137 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 138 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 139 + PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, 140 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 141 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 142 + PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, 143 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 144 + -1), 145 + PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, 146 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 147 + -1), 148 + }; 149 + 150 + static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = { 151 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 152 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 153 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 154 + }; 155 + 156 + static const struct dpu_intf_cfg sm8350_intf[] = { 157 + INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 158 + INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 159 + INTF_BLK("intf_2", INTF_2, 0x36000, 0x2c4, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 160 + INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 161 + }; 162 + 163 + static const struct dpu_perf_cfg sm8350_perf_data = { 164 + .max_bw_low = 11800000, 165 + .max_bw_high = 15500000, 166 + .min_core_ib = 2500000, 167 + .min_llcc_ib = 0, 168 + .min_dram_ib = 800000, 169 + .min_prefill_lines = 40, 170 + /* FIXME: lut tables */ 171 + .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, 172 + .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, 173 + .qos_lut_tbl = { 174 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 175 + .entries = sc7180_qos_linear 176 + }, 177 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 178 + .entries = sc7180_qos_macrotile 179 + }, 180 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 181 + .entries = sc7180_qos_nrt 182 + }, 183 + /* TODO: macrotile-qseed is different from macrotile */ 184 + }, 185 + .cdp_cfg = { 186 + {.rd_enable = 1, .wr_enable = 1}, 187 + {.rd_enable = 1, .wr_enable = 0} 188 + }, 189 + .clk_inefficiency_factor = 105, 190 + .bw_inefficiency_factor = 120, 191 + }; 192 + 193 + const struct dpu_mdss_cfg dpu_sm8350_cfg = { 194 + .caps = &sm8350_dpu_caps, 195 + .ubwc = &sm8350_ubwc_cfg, 196 + .mdp_count = ARRAY_SIZE(sm8350_mdp), 197 + .mdp = sm8350_mdp, 198 + .ctl_count = ARRAY_SIZE(sm8350_ctl), 199 + .ctl = sm8350_ctl, 200 + .sspp_count = ARRAY_SIZE(sm8350_sspp), 201 + .sspp = sm8350_sspp, 202 + .mixer_count = ARRAY_SIZE(sm8350_lm), 203 + .mixer = sm8350_lm, 204 + .dspp_count = ARRAY_SIZE(sm8350_dspp), 205 + .dspp = sm8350_dspp, 206 + .pingpong_count = ARRAY_SIZE(sm8350_pp), 207 + .pingpong = sm8350_pp, 208 + .merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), 209 + .merge_3d = sm8350_merge_3d, 210 + .intf_count = ARRAY_SIZE(sm8350_intf), 211 + .intf = sm8350_intf, 212 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 213 + .vbif = sdm845_vbif, 214 + .reg_dma_count = 1, 215 + .dma_cfg = &sm8350_regdma, 216 + .perf = &sm8350_perf_data, 217 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 218 + BIT(MDP_SSPP_TOP0_INTR2) | \ 219 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 220 + BIT(MDP_INTF0_7xxx_INTR) | \ 221 + BIT(MDP_INTF1_7xxx_INTR) | \ 222 + BIT(MDP_INTF2_7xxx_INTR) | \ 223 + BIT(MDP_INTF3_7xxx_INTR), 224 + }; 225 + 226 + #endif
+158
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_7_2_SC7280_H 8 + #define _DPU_7_2_SC7280_H 9 + 10 + static const struct dpu_caps sc7280_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0x7, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_dim_layer = true, 15 + .has_idle_pc = true, 16 + .max_linewidth = 2400, 17 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 18 + }; 19 + 20 + static const struct dpu_ubwc_cfg sc7280_ubwc_cfg = { 21 + .ubwc_version = DPU_HW_UBWC_VER_30, 22 + .highest_bank_bit = 0x1, 23 + .ubwc_swizzle = 0x6, 24 + }; 25 + 26 + static const struct dpu_mdp_cfg sc7280_mdp[] = { 27 + { 28 + .name = "top_0", .id = MDP_TOP, 29 + .base = 0x0, .len = 0x2014, 30 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 31 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 32 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 33 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, 34 + }, 35 + }; 36 + 37 + static const struct dpu_ctl_cfg sc7280_ctl[] = { 38 + { 39 + .name = "ctl_0", .id = CTL_0, 40 + .base = 0x15000, .len = 0x1e8, 41 + .features = CTL_SC7280_MASK, 42 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 43 + }, 44 + { 45 + .name = "ctl_1", .id = CTL_1, 46 + .base = 0x16000, .len = 0x1e8, 47 + .features = CTL_SC7280_MASK, 48 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 49 + }, 50 + { 51 + .name = "ctl_2", .id = CTL_2, 52 + .base = 0x17000, .len = 0x1e8, 53 + .features = CTL_SC7280_MASK, 54 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 55 + }, 56 + { 57 + .name = "ctl_3", .id = CTL_3, 58 + .base = 0x18000, .len = 0x1e8, 59 + .features = CTL_SC7280_MASK, 60 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 61 + }, 62 + }; 63 + 64 + static const struct dpu_sspp_cfg sc7280_sspp[] = { 65 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7280_MASK_SDMA, 66 + sc7280_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 67 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA, 68 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 69 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, 70 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 71 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, 72 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 73 + }; 74 + 75 + static const struct dpu_lm_cfg sc7280_lm[] = { 76 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 77 + &sc7180_lm_sblk, PINGPONG_0, 0, DSPP_0), 78 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 79 + &sc7180_lm_sblk, PINGPONG_2, LM_3, 0), 80 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 81 + &sc7180_lm_sblk, PINGPONG_3, LM_2, 0), 82 + }; 83 + 84 + static const struct dpu_dspp_cfg sc7280_dspp[] = { 85 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 86 + &sc7180_dspp_sblk), 87 + }; 88 + 89 + static const struct dpu_pingpong_cfg sc7280_pp[] = { 90 + PP_BLK("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1), 91 + PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), 92 + PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), 93 + PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), 94 + }; 95 + 96 + static const struct dpu_intf_cfg sc7280_intf[] = { 97 + INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 98 + INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 99 + INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 100 + }; 101 + 102 + static const struct dpu_perf_cfg sc7280_perf_data = { 103 + .max_bw_low = 4700000, 104 + .max_bw_high = 8800000, 105 + .min_core_ib = 2500000, 106 + .min_llcc_ib = 0, 107 + .min_dram_ib = 1600000, 108 + .min_prefill_lines = 24, 109 + .danger_lut_tbl = {0xffff, 0xffff, 0x0}, 110 + .safe_lut_tbl = {0xff00, 0xff00, 0xffff}, 111 + .qos_lut_tbl = { 112 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 113 + .entries = sc7180_qos_macrotile 114 + }, 115 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 116 + .entries = sc7180_qos_macrotile 117 + }, 118 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 119 + .entries = sc7180_qos_nrt 120 + }, 121 + }, 122 + .cdp_cfg = { 123 + {.rd_enable = 1, .wr_enable = 1}, 124 + {.rd_enable = 1, .wr_enable = 0} 125 + }, 126 + .clk_inefficiency_factor = 105, 127 + .bw_inefficiency_factor = 120, 128 + }; 129 + 130 + const struct dpu_mdss_cfg dpu_sc7280_cfg = { 131 + .caps = &sc7280_dpu_caps, 132 + .ubwc = &sc7280_ubwc_cfg, 133 + .mdp_count = ARRAY_SIZE(sc7280_mdp), 134 + .mdp = sc7280_mdp, 135 + .ctl_count = ARRAY_SIZE(sc7280_ctl), 136 + .ctl = sc7280_ctl, 137 + .sspp_count = ARRAY_SIZE(sc7280_sspp), 138 + .sspp = sc7280_sspp, 139 + .dspp_count = ARRAY_SIZE(sc7280_dspp), 140 + .dspp = sc7280_dspp, 141 + .mixer_count = ARRAY_SIZE(sc7280_lm), 142 + .mixer = sc7280_lm, 143 + .pingpong_count = ARRAY_SIZE(sc7280_pp), 144 + .pingpong = sc7280_pp, 145 + .intf_count = ARRAY_SIZE(sc7280_intf), 146 + .intf = sc7280_intf, 147 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 148 + .vbif = sdm845_vbif, 149 + .perf = &sc7280_perf_data, 150 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 151 + BIT(MDP_SSPP_TOP0_INTR2) | \ 152 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 153 + BIT(MDP_INTF0_7xxx_INTR) | \ 154 + BIT(MDP_INTF1_7xxx_INTR) | \ 155 + BIT(MDP_INTF5_7xxx_INTR), 156 + }; 157 + 158 + #endif
+222
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_8_0_SC8280XP_H 8 + #define _DPU_8_0_SC8280XP_H 9 + 10 + static const struct dpu_caps sc8280xp_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 11, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 5120, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + }; 21 + 22 + static const struct dpu_ubwc_cfg sc8280xp_ubwc_cfg = { 23 + .ubwc_version = DPU_HW_UBWC_VER_40, 24 + .highest_bank_bit = 2, 25 + .ubwc_swizzle = 6, 26 + }; 27 + 28 + static const struct dpu_mdp_cfg sc8280xp_mdp[] = { 29 + { 30 + .name = "top_0", .id = MDP_TOP, 31 + .base = 0x0, .len = 0x494, 32 + .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 33 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, 42 + }, 43 + }; 44 + 45 + static const struct dpu_ctl_cfg sc8280xp_ctl[] = { 46 + { 47 + .name = "ctl_0", .id = CTL_0, 48 + .base = 0x15000, .len = 0x204, 49 + .features = CTL_SC7280_MASK, 50 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 51 + }, 52 + { 53 + .name = "ctl_1", .id = CTL_1, 54 + .base = 0x16000, .len = 0x204, 55 + .features = CTL_SC7280_MASK, 56 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 57 + }, 58 + { 59 + .name = "ctl_2", .id = CTL_2, 60 + .base = 0x17000, .len = 0x204, 61 + .features = CTL_SC7280_MASK, 62 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 63 + }, 64 + { 65 + .name = "ctl_3", .id = CTL_3, 66 + .base = 0x18000, .len = 0x204, 67 + .features = CTL_SC7280_MASK, 68 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 69 + }, 70 + { 71 + .name = "ctl_4", .id = CTL_4, 72 + .base = 0x19000, .len = 0x204, 73 + .features = CTL_SC7280_MASK, 74 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 75 + }, 76 + { 77 + .name = "ctl_5", .id = CTL_5, 78 + .base = 0x1a000, .len = 0x204, 79 + .features = CTL_SC7280_MASK, 80 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 81 + }, 82 + }; 83 + 84 + static const struct dpu_sspp_cfg sc8280xp_sspp[] = { 85 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x2ac, VIG_SC7180_MASK, 86 + sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 87 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x2ac, VIG_SC7180_MASK, 88 + sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 89 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x2ac, VIG_SC7180_MASK, 90 + sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 91 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x2ac, VIG_SC7180_MASK, 92 + sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 93 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x2ac, DMA_SDM845_MASK, 94 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 95 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x2ac, DMA_SDM845_MASK, 96 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 97 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x2ac, DMA_CURSOR_SDM845_MASK, 98 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 99 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x2ac, DMA_CURSOR_SDM845_MASK, 100 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 101 + }; 102 + 103 + static const struct dpu_lm_cfg sc8280xp_lm[] = { 104 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 105 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 106 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_2, LM_3, DSPP_2), 107 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_3, LM_2, DSPP_3), 108 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 109 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 110 + }; 111 + 112 + static const struct dpu_dspp_cfg sc8280xp_dspp[] = { 113 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 114 + &sm8150_dspp_sblk), 115 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 116 + &sm8150_dspp_sblk), 117 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 118 + &sm8150_dspp_sblk), 119 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 120 + &sm8150_dspp_sblk), 121 + }; 122 + 123 + static const struct dpu_pingpong_cfg sc8280xp_pp[] = { 124 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 125 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1), 126 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 127 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1), 128 + PP_BLK_TE("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk_te, 129 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1), 130 + PP_BLK_TE("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk_te, 131 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1), 132 + PP_BLK_TE("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk_te, 133 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1), 134 + PP_BLK_TE("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk_te, 135 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1), 136 + }; 137 + 138 + static const struct dpu_merge_3d_cfg sc8280xp_merge_3d[] = { 139 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 140 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 141 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 142 + }; 143 + 144 + /* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */ 145 + static const struct dpu_intf_cfg sc8280xp_intf[] = { 146 + INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 147 + INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 148 + INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 149 + INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 150 + INTF_BLK("intf_4", INTF_4, 0x38000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21), 151 + INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 152 + INTF_BLK("intf_6", INTF_6, 0x3a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17), 153 + INTF_BLK("intf_7", INTF_7, 0x3b000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19), 154 + INTF_BLK("intf_8", INTF_8, 0x3c000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13), 155 + }; 156 + 157 + static const struct dpu_perf_cfg sc8280xp_perf_data = { 158 + .max_bw_low = 13600000, 159 + .max_bw_high = 18200000, 160 + .min_core_ib = 2500000, 161 + .min_llcc_ib = 0, 162 + .min_dram_ib = 800000, 163 + .danger_lut_tbl = {0xf, 0xffff, 0x0}, 164 + .qos_lut_tbl = { 165 + {.nentry = ARRAY_SIZE(sc8180x_qos_linear), 166 + .entries = sc8180x_qos_linear 167 + }, 168 + {.nentry = ARRAY_SIZE(sc8180x_qos_macrotile), 169 + .entries = sc8180x_qos_macrotile 170 + }, 171 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 172 + .entries = sc7180_qos_nrt 173 + }, 174 + /* TODO: macrotile-qseed is different from macrotile */ 175 + }, 176 + .cdp_cfg = { 177 + {.rd_enable = 1, .wr_enable = 1}, 178 + {.rd_enable = 1, .wr_enable = 0} 179 + }, 180 + .clk_inefficiency_factor = 105, 181 + .bw_inefficiency_factor = 120, 182 + }; 183 + 184 + const struct dpu_mdss_cfg dpu_sc8280xp_cfg = { 185 + .caps = &sc8280xp_dpu_caps, 186 + .ubwc = &sc8280xp_ubwc_cfg, 187 + .mdp_count = ARRAY_SIZE(sc8280xp_mdp), 188 + .mdp = sc8280xp_mdp, 189 + .ctl_count = ARRAY_SIZE(sc8280xp_ctl), 190 + .ctl = sc8280xp_ctl, 191 + .sspp_count = ARRAY_SIZE(sc8280xp_sspp), 192 + .sspp = sc8280xp_sspp, 193 + .mixer_count = ARRAY_SIZE(sc8280xp_lm), 194 + .mixer = sc8280xp_lm, 195 + .dspp_count = ARRAY_SIZE(sc8280xp_dspp), 196 + .dspp = sc8280xp_dspp, 197 + .pingpong_count = ARRAY_SIZE(sc8280xp_pp), 198 + .pingpong = sc8280xp_pp, 199 + .merge_3d_count = ARRAY_SIZE(sc8280xp_merge_3d), 200 + .merge_3d = sc8280xp_merge_3d, 201 + .intf_count = ARRAY_SIZE(sc8280xp_intf), 202 + .intf = sc8280xp_intf, 203 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 204 + .vbif = sdm845_vbif, 205 + .reg_dma_count = 1, 206 + .dma_cfg = &sc8280xp_regdma, 207 + .perf = &sc8280xp_perf_data, 208 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 209 + BIT(MDP_SSPP_TOP0_INTR2) | \ 210 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 211 + BIT(MDP_INTF0_7xxx_INTR) | \ 212 + BIT(MDP_INTF1_7xxx_INTR) | \ 213 + BIT(MDP_INTF2_7xxx_INTR) | \ 214 + BIT(MDP_INTF3_7xxx_INTR) | \ 215 + BIT(MDP_INTF4_7xxx_INTR) | \ 216 + BIT(MDP_INTF5_7xxx_INTR) | \ 217 + BIT(MDP_INTF6_7xxx_INTR) | \ 218 + BIT(MDP_INTF7_7xxx_INTR) | \ 219 + BIT(MDP_INTF8_7xxx_INTR), 220 + }; 221 + 222 + #endif
+234
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_8_1_SM8450_H 8 + #define _DPU_8_1_SM8450_H 9 + 10 + static const struct dpu_caps sm8450_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 5120, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + }; 21 + 22 + static const struct dpu_ubwc_cfg sm8450_ubwc_cfg = { 23 + .ubwc_version = DPU_HW_UBWC_VER_40, 24 + .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 25 + .ubwc_swizzle = 0x6, 26 + }; 27 + 28 + static const struct dpu_mdp_cfg sm8450_mdp[] = { 29 + { 30 + .name = "top_0", .id = MDP_TOP, 31 + .base = 0x0, .len = 0x494, 32 + .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 33 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, 41 + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, 42 + }, 43 + }; 44 + 45 + /* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ 46 + static const struct dpu_ctl_cfg sm8450_ctl[] = { 47 + { 48 + .name = "ctl_0", .id = CTL_0, 49 + .base = 0x15000, .len = 0x204, 50 + .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE), 51 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 52 + }, 53 + { 54 + .name = "ctl_1", .id = CTL_1, 55 + .base = 0x16000, .len = 0x204, 56 + .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 57 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 58 + }, 59 + { 60 + .name = "ctl_2", .id = CTL_2, 61 + .base = 0x17000, .len = 0x204, 62 + .features = CTL_SC7280_MASK, 63 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 64 + }, 65 + { 66 + .name = "ctl_3", .id = CTL_3, 67 + .base = 0x18000, .len = 0x204, 68 + .features = CTL_SC7280_MASK, 69 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 70 + }, 71 + { 72 + .name = "ctl_4", .id = CTL_4, 73 + .base = 0x19000, .len = 0x204, 74 + .features = CTL_SC7280_MASK, 75 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 76 + }, 77 + { 78 + .name = "ctl_5", .id = CTL_5, 79 + .base = 0x1a000, .len = 0x204, 80 + .features = CTL_SC7280_MASK, 81 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 82 + }, 83 + }; 84 + 85 + static const struct dpu_sspp_cfg sm8450_sspp[] = { 86 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x32c, VIG_SC7180_MASK, 87 + sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 88 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x32c, VIG_SC7180_MASK, 89 + sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 90 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x32c, VIG_SC7180_MASK, 91 + sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 92 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x32c, VIG_SC7180_MASK, 93 + sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 94 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x32c, DMA_SDM845_MASK, 95 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 96 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x32c, DMA_SDM845_MASK, 97 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 98 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x32c, DMA_CURSOR_SDM845_MASK, 99 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 100 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x32c, DMA_CURSOR_SDM845_MASK, 101 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 102 + }; 103 + 104 + static const struct dpu_lm_cfg sm8450_lm[] = { 105 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 106 + &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 107 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 108 + &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 109 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 110 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 111 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 112 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 113 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 114 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 115 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 116 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 117 + }; 118 + 119 + static const struct dpu_dspp_cfg sm8450_dspp[] = { 120 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 121 + &sm8150_dspp_sblk), 122 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 123 + &sm8150_dspp_sblk), 124 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 125 + &sm8150_dspp_sblk), 126 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 127 + &sm8150_dspp_sblk), 128 + }; 129 + /* FIXME: interrupts */ 130 + static const struct dpu_pingpong_cfg sm8450_pp[] = { 131 + PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 132 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 133 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 134 + PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 135 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 136 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 137 + PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, 138 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 139 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 140 + PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, 141 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 142 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 143 + PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, 144 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 145 + -1), 146 + PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, 147 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 148 + -1), 149 + PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk, 150 + -1, 151 + -1), 152 + PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk, 153 + -1, 154 + -1), 155 + }; 156 + 157 + static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = { 158 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 159 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 160 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 161 + MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00), 162 + }; 163 + 164 + static const struct dpu_intf_cfg sm8450_intf[] = { 165 + INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 166 + INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 167 + INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 168 + INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 169 + }; 170 + 171 + static const struct dpu_perf_cfg sm8450_perf_data = { 172 + .max_bw_low = 13600000, 173 + .max_bw_high = 18200000, 174 + .min_core_ib = 2500000, 175 + .min_llcc_ib = 0, 176 + .min_dram_ib = 800000, 177 + .min_prefill_lines = 35, 178 + /* FIXME: lut tables */ 179 + .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, 180 + .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, 181 + .qos_lut_tbl = { 182 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 183 + .entries = sc7180_qos_linear 184 + }, 185 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 186 + .entries = sc7180_qos_macrotile 187 + }, 188 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 189 + .entries = sc7180_qos_nrt 190 + }, 191 + /* TODO: macrotile-qseed is different from macrotile */ 192 + }, 193 + .cdp_cfg = { 194 + {.rd_enable = 1, .wr_enable = 1}, 195 + {.rd_enable = 1, .wr_enable = 0} 196 + }, 197 + .clk_inefficiency_factor = 105, 198 + .bw_inefficiency_factor = 120, 199 + }; 200 + 201 + const struct dpu_mdss_cfg dpu_sm8450_cfg = { 202 + .caps = &sm8450_dpu_caps, 203 + .ubwc = &sm8450_ubwc_cfg, 204 + .mdp_count = ARRAY_SIZE(sm8450_mdp), 205 + .mdp = sm8450_mdp, 206 + .ctl_count = ARRAY_SIZE(sm8450_ctl), 207 + .ctl = sm8450_ctl, 208 + .sspp_count = ARRAY_SIZE(sm8450_sspp), 209 + .sspp = sm8450_sspp, 210 + .mixer_count = ARRAY_SIZE(sm8450_lm), 211 + .mixer = sm8450_lm, 212 + .dspp_count = ARRAY_SIZE(sm8450_dspp), 213 + .dspp = sm8450_dspp, 214 + .pingpong_count = ARRAY_SIZE(sm8450_pp), 215 + .pingpong = sm8450_pp, 216 + .merge_3d_count = ARRAY_SIZE(sm8450_merge_3d), 217 + .merge_3d = sm8450_merge_3d, 218 + .intf_count = ARRAY_SIZE(sm8450_intf), 219 + .intf = sm8450_intf, 220 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 221 + .vbif = sdm845_vbif, 222 + .reg_dma_count = 1, 223 + .dma_cfg = &sm8450_regdma, 224 + .perf = &sm8450_perf_data, 225 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 226 + BIT(MDP_SSPP_TOP0_INTR2) | \ 227 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 228 + BIT(MDP_INTF0_7xxx_INTR) | \ 229 + BIT(MDP_INTF1_7xxx_INTR) | \ 230 + BIT(MDP_INTF2_7xxx_INTR) | \ 231 + BIT(MDP_INTF3_7xxx_INTR), 232 + }; 233 + 234 + #endif
+239
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. 5 + */ 6 + 7 + #ifndef _DPU_9_0_SM8550_H 8 + #define _DPU_9_0_SM8550_H 9 + 10 + static const struct dpu_caps sm8550_dpu_caps = { 11 + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 12 + .max_mixer_blendstages = 0xb, 13 + .qseed_type = DPU_SSPP_SCALER_QSEED4, 14 + .has_src_split = true, 15 + .has_dim_layer = true, 16 + .has_idle_pc = true, 17 + .has_3d_merge = true, 18 + .max_linewidth = 5120, 19 + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 20 + }; 21 + 22 + static const struct dpu_ubwc_cfg sm8550_ubwc_cfg = { 23 + .ubwc_version = DPU_HW_UBWC_VER_40, 24 + .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 25 + }; 26 + 27 + static const struct dpu_mdp_cfg sm8550_mdp[] = { 28 + { 29 + .name = "top_0", .id = MDP_TOP, 30 + .base = 0, .len = 0x494, 31 + .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 32 + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x4330, .bit_off = 0 }, 33 + .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x6330, .bit_off = 0 }, 34 + .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x8330, .bit_off = 0 }, 35 + .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0xa330, .bit_off = 0 }, 36 + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x24330, .bit_off = 0 }, 37 + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x26330, .bit_off = 0 }, 38 + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x28330, .bit_off = 0 }, 39 + .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2a330, .bit_off = 0 }, 40 + .clk_ctrls[DPU_CLK_CTRL_DMA4] = { .reg_off = 0x2c330, .bit_off = 0 }, 41 + .clk_ctrls[DPU_CLK_CTRL_DMA5] = { .reg_off = 0x2e330, .bit_off = 0 }, 42 + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, 43 + }, 44 + }; 45 + 46 + /* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ 47 + static const struct dpu_ctl_cfg sm8550_ctl[] = { 48 + { 49 + .name = "ctl_0", .id = CTL_0, 50 + .base = 0x15000, .len = 0x290, 51 + .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), 52 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 53 + }, 54 + { 55 + .name = "ctl_1", .id = CTL_1, 56 + .base = 0x16000, .len = 0x290, 57 + .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), 58 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 59 + }, 60 + { 61 + .name = "ctl_2", .id = CTL_2, 62 + .base = 0x17000, .len = 0x290, 63 + .features = CTL_SM8550_MASK, 64 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 65 + }, 66 + { 67 + .name = "ctl_3", .id = CTL_3, 68 + .base = 0x18000, .len = 0x290, 69 + .features = CTL_SM8550_MASK, 70 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 71 + }, 72 + { 73 + .name = "ctl_4", .id = CTL_4, 74 + .base = 0x19000, .len = 0x290, 75 + .features = CTL_SM8550_MASK, 76 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 77 + }, 78 + { 79 + .name = "ctl_5", .id = CTL_5, 80 + .base = 0x1a000, .len = 0x290, 81 + .features = CTL_SM8550_MASK, 82 + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 83 + }, 84 + }; 85 + 86 + static const struct dpu_sspp_cfg sm8550_sspp[] = { 87 + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x344, VIG_SC7180_MASK, 88 + sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 89 + SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x344, VIG_SC7180_MASK, 90 + sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 91 + SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x344, VIG_SC7180_MASK, 92 + sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 93 + SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x344, VIG_SC7180_MASK, 94 + sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 95 + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x344, DMA_SDM845_MASK, 96 + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 97 + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x344, DMA_SDM845_MASK, 98 + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 99 + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x344, DMA_SDM845_MASK, 100 + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 101 + SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x344, DMA_SDM845_MASK, 102 + sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 103 + SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, 0x344, DMA_CURSOR_SDM845_MASK, 104 + sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4), 105 + SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, 0x344, DMA_CURSOR_SDM845_MASK, 106 + sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5), 107 + }; 108 + 109 + static const struct dpu_lm_cfg sm8550_lm[] = { 110 + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 111 + &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 112 + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 113 + &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 114 + LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 115 + &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 116 + LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 117 + &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 118 + LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 119 + &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 120 + LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 121 + &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 122 + }; 123 + 124 + static const struct dpu_dspp_cfg sm8550_dspp[] = { 125 + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 126 + &sm8150_dspp_sblk), 127 + DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 128 + &sm8150_dspp_sblk), 129 + DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 130 + &sm8150_dspp_sblk), 131 + DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 132 + &sm8150_dspp_sblk), 133 + }; 134 + static const struct dpu_pingpong_cfg sm8550_pp[] = { 135 + PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, 136 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 137 + -1), 138 + PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, 139 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 140 + -1), 141 + PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, 142 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 143 + -1), 144 + PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, 145 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 146 + -1), 147 + PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, 148 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 149 + -1), 150 + PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, 151 + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 152 + -1), 153 + PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk, 154 + -1, 155 + -1), 156 + PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk, 157 + -1, 158 + -1), 159 + }; 160 + 161 + static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = { 162 + MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 163 + MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 164 + MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 165 + MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700), 166 + }; 167 + 168 + static const struct dpu_intf_cfg sm8550_intf[] = { 169 + INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 170 + /* TODO TE sub-blocks for intf1 & intf2 */ 171 + INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 172 + INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 173 + INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 174 + }; 175 + 176 + static const struct dpu_perf_cfg sm8550_perf_data = { 177 + .max_bw_low = 13600000, 178 + .max_bw_high = 18200000, 179 + .min_core_ib = 2500000, 180 + .min_llcc_ib = 0, 181 + .min_dram_ib = 800000, 182 + .min_prefill_lines = 35, 183 + /* FIXME: lut tables */ 184 + .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, 185 + .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, 186 + .qos_lut_tbl = { 187 + {.nentry = ARRAY_SIZE(sc7180_qos_linear), 188 + .entries = sc7180_qos_linear 189 + }, 190 + {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 191 + .entries = sc7180_qos_macrotile 192 + }, 193 + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 194 + .entries = sc7180_qos_nrt 195 + }, 196 + /* TODO: macrotile-qseed is different from macrotile */ 197 + }, 198 + .cdp_cfg = { 199 + {.rd_enable = 1, .wr_enable = 1}, 200 + {.rd_enable = 1, .wr_enable = 0} 201 + }, 202 + .clk_inefficiency_factor = 105, 203 + .bw_inefficiency_factor = 120, 204 + }; 205 + 206 + const struct dpu_mdss_cfg dpu_sm8550_cfg = { 207 + .caps = &sm8550_dpu_caps, 208 + .ubwc = &sm8550_ubwc_cfg, 209 + .mdp_count = ARRAY_SIZE(sm8550_mdp), 210 + .mdp = sm8550_mdp, 211 + .ctl_count = ARRAY_SIZE(sm8550_ctl), 212 + .ctl = sm8550_ctl, 213 + .sspp_count = ARRAY_SIZE(sm8550_sspp), 214 + .sspp = sm8550_sspp, 215 + .mixer_count = ARRAY_SIZE(sm8550_lm), 216 + .mixer = sm8550_lm, 217 + .dspp_count = ARRAY_SIZE(sm8550_dspp), 218 + .dspp = sm8550_dspp, 219 + .pingpong_count = ARRAY_SIZE(sm8550_pp), 220 + .pingpong = sm8550_pp, 221 + .merge_3d_count = ARRAY_SIZE(sm8550_merge_3d), 222 + .merge_3d = sm8550_merge_3d, 223 + .intf_count = ARRAY_SIZE(sm8550_intf), 224 + .intf = sm8550_intf, 225 + .vbif_count = ARRAY_SIZE(sdm845_vbif), 226 + .vbif = sdm845_vbif, 227 + .reg_dma_count = 1, 228 + .dma_cfg = &sm8450_regdma, 229 + .perf = &sm8550_perf_data, 230 + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ 231 + BIT(MDP_SSPP_TOP0_INTR2) | \ 232 + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 233 + BIT(MDP_INTF0_7xxx_INTR) | \ 234 + BIT(MDP_INTF1_7xxx_INTR) | \ 235 + BIT(MDP_INTF2_7xxx_INTR) | \ 236 + BIT(MDP_INTF3_7xxx_INTR), 237 + }; 238 + 239 + #endif
+115 -220
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
··· 21 21 #include <drm/drm_probe_helper.h> 22 22 #include <drm/drm_rect.h> 23 23 #include <drm/drm_vblank.h> 24 + #include <drm/drm_self_refresh_helper.h> 24 25 25 26 #include "dpu_kms.h" 26 27 #include "dpu_hw_lm.h" ··· 401 400 } 402 401 } 403 402 403 + static void _dpu_crtc_blend_setup_pipe(struct drm_crtc *crtc, 404 + struct drm_plane *plane, 405 + struct dpu_crtc_mixer *mixer, 406 + u32 num_mixers, 407 + enum dpu_stage stage, 408 + struct dpu_format *format, 409 + uint64_t modifier, 410 + struct dpu_sw_pipe *pipe, 411 + unsigned int stage_idx, 412 + struct dpu_hw_stage_cfg *stage_cfg 413 + ) 414 + { 415 + uint32_t lm_idx; 416 + enum dpu_sspp sspp_idx; 417 + struct drm_plane_state *state; 418 + 419 + sspp_idx = pipe->sspp->idx; 420 + 421 + state = plane->state; 422 + 423 + trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), 424 + state, to_dpu_plane_state(state), stage_idx, 425 + format->base.pixel_format, 426 + modifier); 427 + 428 + DRM_DEBUG_ATOMIC("crtc %d stage:%d - plane %d sspp %d fb %d multirect_idx %d\n", 429 + crtc->base.id, 430 + stage, 431 + plane->base.id, 432 + sspp_idx - SSPP_NONE, 433 + state->fb ? state->fb->base.id : -1, 434 + pipe->multirect_index); 435 + 436 + stage_cfg->stage[stage][stage_idx] = sspp_idx; 437 + stage_cfg->multirect_index[stage][stage_idx] = pipe->multirect_index; 438 + 439 + /* blend config update */ 440 + for (lm_idx = 0; lm_idx < num_mixers; lm_idx++) 441 + mixer[lm_idx].lm_ctl->ops.update_pending_flush_sspp(mixer[lm_idx].lm_ctl, sspp_idx); 442 + } 443 + 404 444 static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc, 405 445 struct dpu_crtc *dpu_crtc, struct dpu_crtc_mixer *mixer, 406 446 struct dpu_hw_stage_cfg *stage_cfg) ··· 454 412 struct dpu_format *format; 455 413 struct dpu_hw_ctl *ctl = mixer->lm_ctl; 456 414 457 - uint32_t stage_idx, lm_idx; 458 - int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 }; 415 + uint32_t lm_idx; 459 416 bool bg_alpha_enable = false; 460 417 DECLARE_BITMAP(fetch_active, SSPP_MAX); 461 418 462 419 memset(fetch_active, 0, sizeof(fetch_active)); 463 420 drm_atomic_crtc_for_each_plane(plane, crtc) { 464 - enum dpu_sspp sspp_idx; 465 - 466 421 state = plane->state; 467 422 if (!state) 468 423 continue; ··· 470 431 pstate = to_dpu_plane_state(state); 471 432 fb = state->fb; 472 433 473 - sspp_idx = dpu_plane_pipe(plane); 474 - set_bit(sspp_idx, fetch_active); 475 - 476 - DRM_DEBUG_ATOMIC("crtc %d stage:%d - plane %d sspp %d fb %d\n", 477 - crtc->base.id, 478 - pstate->stage, 479 - plane->base.id, 480 - sspp_idx - SSPP_VIG0, 481 - state->fb ? state->fb->base.id : -1); 482 - 483 434 format = to_dpu_format(msm_framebuffer_format(pstate->base.fb)); 484 435 485 436 if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable) 486 437 bg_alpha_enable = true; 487 438 488 - stage_idx = zpos_cnt[pstate->stage]++; 489 - stage_cfg->stage[pstate->stage][stage_idx] = 490 - sspp_idx; 491 - stage_cfg->multirect_index[pstate->stage][stage_idx] = 492 - pstate->multirect_index; 439 + set_bit(pstate->pipe.sspp->idx, fetch_active); 440 + _dpu_crtc_blend_setup_pipe(crtc, plane, 441 + mixer, cstate->num_mixers, 442 + pstate->stage, 443 + format, fb ? fb->modifier : 0, 444 + &pstate->pipe, 0, stage_cfg); 493 445 494 - trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), 495 - state, pstate, stage_idx, 496 - sspp_idx - SSPP_VIG0, 497 - format->base.pixel_format, 498 - fb ? fb->modifier : 0); 446 + if (pstate->r_pipe.sspp) { 447 + set_bit(pstate->r_pipe.sspp->idx, fetch_active); 448 + _dpu_crtc_blend_setup_pipe(crtc, plane, 449 + mixer, cstate->num_mixers, 450 + pstate->stage, 451 + format, fb ? fb->modifier : 0, 452 + &pstate->r_pipe, 1, stage_cfg); 453 + } 499 454 500 455 /* blend config update */ 501 456 for (lm_idx = 0; lm_idx < cstate->num_mixers; lm_idx++) { 502 - _dpu_crtc_setup_blend_cfg(mixer + lm_idx, 503 - pstate, format); 504 - 505 - mixer[lm_idx].lm_ctl->ops.update_pending_flush_sspp(mixer[lm_idx].lm_ctl, 506 - sspp_idx); 457 + _dpu_crtc_setup_blend_cfg(mixer + lm_idx, pstate, format); 507 458 508 459 if (bg_alpha_enable && !format->alpha_enable) 509 460 mixer[lm_idx].mixer_op_mode = 0; ··· 796 767 797 768 /* stage config flush mask */ 798 769 ctl->ops.update_pending_flush_dspp(ctl, 799 - mixer[i].hw_dspp->idx); 770 + mixer[i].hw_dspp->idx, DPU_DSPP_PCC); 800 771 } 801 772 } 802 773 ··· 1050 1021 1051 1022 DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); 1052 1023 1024 + /* If disable is triggered while in self refresh mode, 1025 + * reset the encoder software state so that in enable 1026 + * it won't trigger a warn while assigning crtc. 1027 + */ 1028 + if (old_crtc_state->self_refresh_active) { 1029 + drm_for_each_encoder_mask(encoder, crtc->dev, 1030 + old_crtc_state->encoder_mask) { 1031 + dpu_encoder_assign_crtc(encoder, NULL); 1032 + } 1033 + return; 1034 + } 1035 + 1053 1036 /* Disable/save vblank irq handling */ 1054 1037 drm_crtc_vblank_off(crtc); 1055 1038 ··· 1073 1032 */ 1074 1033 if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO) 1075 1034 release_bandwidth = true; 1076 - dpu_encoder_assign_crtc(encoder, NULL); 1035 + 1036 + /* 1037 + * If disable is triggered during psr active(e.g: screen dim in PSR), 1038 + * we will need encoder->crtc connection to process the device sleep & 1039 + * preserve it during psr sequence. 1040 + */ 1041 + if (!crtc->state->self_refresh_active) 1042 + dpu_encoder_assign_crtc(encoder, NULL); 1077 1043 } 1078 1044 1079 1045 /* wait for frame_event_done completion */ ··· 1128 1080 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); 1129 1081 struct drm_encoder *encoder; 1130 1082 bool request_bandwidth = false; 1083 + struct drm_crtc_state *old_crtc_state; 1084 + 1085 + old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc); 1131 1086 1132 1087 pm_runtime_get_sync(crtc->dev->dev); 1133 1088 ··· 1153 1102 trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc); 1154 1103 dpu_crtc->enabled = true; 1155 1104 1156 - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) 1157 - dpu_encoder_assign_crtc(encoder, crtc); 1105 + if (!old_crtc_state->self_refresh_active) { 1106 + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) 1107 + dpu_encoder_assign_crtc(encoder, crtc); 1108 + } 1158 1109 1159 1110 /* Enable/restore vblank irq handling */ 1160 1111 drm_crtc_vblank_on(crtc); 1161 1112 } 1162 1113 1163 - struct plane_state { 1164 - struct dpu_plane_state *dpu_pstate; 1165 - const struct drm_plane_state *drm_pstate; 1166 - int stage; 1167 - u32 pipe_id; 1168 - }; 1169 - 1170 1114 static bool dpu_crtc_needs_dirtyfb(struct drm_crtc_state *cstate) 1171 1115 { 1172 1116 struct drm_crtc *crtc = cstate->crtc; 1173 1117 struct drm_encoder *encoder; 1118 + 1119 + if (cstate->self_refresh_active) 1120 + return true; 1174 1121 1175 1122 drm_for_each_encoder_mask (encoder, crtc->dev, cstate->encoder_mask) { 1176 1123 if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_CMD) { ··· 1186 1137 crtc); 1187 1138 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); 1188 1139 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc_state); 1189 - struct plane_state *pstates; 1190 1140 1191 1141 const struct drm_plane_state *pstate; 1192 1142 struct drm_plane *plane; 1193 - struct drm_display_mode *mode; 1194 1143 1195 - int cnt = 0, rc = 0, mixer_width = 0, i, z_pos; 1144 + int rc = 0; 1196 1145 1197 - struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX * 2]; 1198 - int multirect_count = 0; 1199 - const struct drm_plane_state *pipe_staged[SSPP_MAX]; 1200 - int left_zpos_cnt = 0, right_zpos_cnt = 0; 1201 - struct drm_rect crtc_rect = { 0 }; 1202 1146 bool needs_dirtyfb = dpu_crtc_needs_dirtyfb(crtc_state); 1203 1147 1204 - pstates = kzalloc(sizeof(*pstates) * DPU_STAGE_MAX * 4, GFP_KERNEL); 1205 - if (!pstates) 1206 - return -ENOMEM; 1207 - 1208 - if (!crtc_state->enable || !crtc_state->active) { 1148 + if (!crtc_state->enable || !drm_atomic_crtc_effectively_active(crtc_state)) { 1209 1149 DRM_DEBUG_ATOMIC("crtc%d -> enable %d, active %d, skip atomic_check\n", 1210 1150 crtc->base.id, crtc_state->enable, 1211 1151 crtc_state->active); 1212 1152 memset(&cstate->new_perf, 0, sizeof(cstate->new_perf)); 1213 - goto end; 1153 + return 0; 1214 1154 } 1215 1155 1216 - mode = &crtc_state->adjusted_mode; 1217 1156 DRM_DEBUG_ATOMIC("%s: check\n", dpu_crtc->name); 1218 1157 1219 1158 /* force a full mode set if active state changed */ 1220 1159 if (crtc_state->active_changed) 1221 1160 crtc_state->mode_changed = true; 1222 1161 1223 - memset(pipe_staged, 0, sizeof(pipe_staged)); 1224 - 1225 - if (cstate->num_mixers) { 1226 - mixer_width = mode->hdisplay / cstate->num_mixers; 1227 - 1162 + if (cstate->num_mixers) 1228 1163 _dpu_crtc_setup_lm_bounds(crtc, crtc_state); 1229 - } 1230 1164 1231 - crtc_rect.x2 = mode->hdisplay; 1232 - crtc_rect.y2 = mode->vdisplay; 1233 - 1234 - /* get plane state for all drm planes associated with crtc state */ 1165 + /* FIXME: move this to dpu_plane_atomic_check? */ 1235 1166 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) { 1236 1167 struct dpu_plane_state *dpu_pstate = to_dpu_plane_state(pstate); 1237 - struct drm_rect dst, clip = crtc_rect; 1238 1168 1239 1169 if (IS_ERR_OR_NULL(pstate)) { 1240 1170 rc = PTR_ERR(pstate); 1241 1171 DPU_ERROR("%s: failed to get plane%d state, %d\n", 1242 1172 dpu_crtc->name, plane->base.id, rc); 1243 - goto end; 1173 + return rc; 1244 1174 } 1245 - if (cnt >= DPU_STAGE_MAX * 4) 1246 - continue; 1247 1175 1248 1176 if (!pstate->visible) 1249 1177 continue; 1250 1178 1251 - pstates[cnt].dpu_pstate = dpu_pstate; 1252 - pstates[cnt].drm_pstate = pstate; 1253 - pstates[cnt].stage = pstate->normalized_zpos; 1254 - pstates[cnt].pipe_id = dpu_plane_pipe(plane); 1255 - 1256 1179 dpu_pstate->needs_dirtyfb = needs_dirtyfb; 1257 - 1258 - if (pipe_staged[pstates[cnt].pipe_id]) { 1259 - multirect_plane[multirect_count].r0 = 1260 - pipe_staged[pstates[cnt].pipe_id]; 1261 - multirect_plane[multirect_count].r1 = pstate; 1262 - multirect_count++; 1263 - 1264 - pipe_staged[pstates[cnt].pipe_id] = NULL; 1265 - } else { 1266 - pipe_staged[pstates[cnt].pipe_id] = pstate; 1267 - } 1268 - 1269 - cnt++; 1270 - 1271 - dst = drm_plane_state_dest(pstate); 1272 - if (!drm_rect_intersect(&clip, &dst)) { 1273 - DPU_ERROR("invalid vertical/horizontal destination\n"); 1274 - DPU_ERROR("display: " DRM_RECT_FMT " plane: " 1275 - DRM_RECT_FMT "\n", DRM_RECT_ARG(&crtc_rect), 1276 - DRM_RECT_ARG(&dst)); 1277 - rc = -E2BIG; 1278 - goto end; 1279 - } 1280 - } 1281 - 1282 - for (i = 1; i < SSPP_MAX; i++) { 1283 - if (pipe_staged[i]) 1284 - dpu_plane_clear_multirect(pipe_staged[i]); 1285 - } 1286 - 1287 - z_pos = -1; 1288 - for (i = 0; i < cnt; i++) { 1289 - /* reset counts at every new blend stage */ 1290 - if (pstates[i].stage != z_pos) { 1291 - left_zpos_cnt = 0; 1292 - right_zpos_cnt = 0; 1293 - z_pos = pstates[i].stage; 1294 - } 1295 - 1296 - /* verify z_pos setting before using it */ 1297 - if (z_pos >= DPU_STAGE_MAX - DPU_STAGE_0) { 1298 - DPU_ERROR("> %d plane stages assigned\n", 1299 - DPU_STAGE_MAX - DPU_STAGE_0); 1300 - rc = -EINVAL; 1301 - goto end; 1302 - } else if (pstates[i].drm_pstate->crtc_x < mixer_width) { 1303 - if (left_zpos_cnt == 2) { 1304 - DPU_ERROR("> 2 planes @ stage %d on left\n", 1305 - z_pos); 1306 - rc = -EINVAL; 1307 - goto end; 1308 - } 1309 - left_zpos_cnt++; 1310 - 1311 - } else { 1312 - if (right_zpos_cnt == 2) { 1313 - DPU_ERROR("> 2 planes @ stage %d on right\n", 1314 - z_pos); 1315 - rc = -EINVAL; 1316 - goto end; 1317 - } 1318 - right_zpos_cnt++; 1319 - } 1320 - 1321 - pstates[i].dpu_pstate->stage = z_pos + DPU_STAGE_0; 1322 - DRM_DEBUG_ATOMIC("%s: zpos %d\n", dpu_crtc->name, z_pos); 1323 - } 1324 - 1325 - for (i = 0; i < multirect_count; i++) { 1326 - if (dpu_plane_validate_multirect_v2(&multirect_plane[i])) { 1327 - DPU_ERROR( 1328 - "multirect validation failed for planes (%d - %d)\n", 1329 - multirect_plane[i].r0->plane->base.id, 1330 - multirect_plane[i].r1->plane->base.id); 1331 - rc = -EINVAL; 1332 - goto end; 1333 - } 1334 1180 } 1335 1181 1336 1182 atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); ··· 1234 1290 if (rc) { 1235 1291 DPU_ERROR("crtc%d failed performance check %d\n", 1236 1292 crtc->base.id, rc); 1237 - goto end; 1293 + return rc; 1238 1294 } 1239 1295 1240 - /* validate source split: 1241 - * use pstates sorted by stage to check planes on same stage 1242 - * we assume that all pipes are in source split so its valid to compare 1243 - * without taking into account left/right mixer placement 1244 - */ 1245 - for (i = 1; i < cnt; i++) { 1246 - struct plane_state *prv_pstate, *cur_pstate; 1247 - struct drm_rect left_rect, right_rect; 1248 - int32_t left_pid, right_pid; 1249 - int32_t stage; 1250 - 1251 - prv_pstate = &pstates[i - 1]; 1252 - cur_pstate = &pstates[i]; 1253 - if (prv_pstate->stage != cur_pstate->stage) 1254 - continue; 1255 - 1256 - stage = cur_pstate->stage; 1257 - 1258 - left_pid = prv_pstate->dpu_pstate->base.plane->base.id; 1259 - left_rect = drm_plane_state_dest(prv_pstate->drm_pstate); 1260 - 1261 - right_pid = cur_pstate->dpu_pstate->base.plane->base.id; 1262 - right_rect = drm_plane_state_dest(cur_pstate->drm_pstate); 1263 - 1264 - if (right_rect.x1 < left_rect.x1) { 1265 - swap(left_pid, right_pid); 1266 - swap(left_rect, right_rect); 1267 - } 1268 - 1269 - /** 1270 - * - planes are enumerated in pipe-priority order such that 1271 - * planes with lower drm_id must be left-most in a shared 1272 - * blend-stage when using source split. 1273 - * - planes in source split must be contiguous in width 1274 - * - planes in source split must have same dest yoff and height 1275 - */ 1276 - if (right_pid < left_pid) { 1277 - DPU_ERROR( 1278 - "invalid src split cfg. priority mismatch. stage: %d left: %d right: %d\n", 1279 - stage, left_pid, right_pid); 1280 - rc = -EINVAL; 1281 - goto end; 1282 - } else if (right_rect.x1 != drm_rect_width(&left_rect)) { 1283 - DPU_ERROR("non-contiguous coordinates for src split. " 1284 - "stage: %d left: " DRM_RECT_FMT " right: " 1285 - DRM_RECT_FMT "\n", stage, 1286 - DRM_RECT_ARG(&left_rect), 1287 - DRM_RECT_ARG(&right_rect)); 1288 - rc = -EINVAL; 1289 - goto end; 1290 - } else if (left_rect.y1 != right_rect.y1 || 1291 - drm_rect_height(&left_rect) != drm_rect_height(&right_rect)) { 1292 - DPU_ERROR("source split at stage: %d. invalid " 1293 - "yoff/height: left: " DRM_RECT_FMT " right: " 1294 - DRM_RECT_FMT "\n", stage, 1295 - DRM_RECT_ARG(&left_rect), 1296 - DRM_RECT_ARG(&right_rect)); 1297 - rc = -EINVAL; 1298 - goto end; 1299 - } 1300 - } 1301 - 1302 - end: 1303 - kfree(pstates); 1304 - return rc; 1296 + return 0; 1305 1297 } 1306 1298 1307 1299 int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) ··· 1354 1474 seq_printf(s, "\tdst x:%4d dst_y:%4d dst_w:%4d dst_h:%4d\n", 1355 1475 state->crtc_x, state->crtc_y, state->crtc_w, 1356 1476 state->crtc_h); 1357 - seq_printf(s, "\tmultirect: mode: %d index: %d\n", 1358 - pstate->multirect_mode, pstate->multirect_index); 1477 + seq_printf(s, "\tsspp[0]:%s\n", 1478 + pstate->pipe.sspp->cap->name); 1479 + seq_printf(s, "\tmultirect[0]: mode: %d index: %d\n", 1480 + pstate->pipe.multirect_mode, pstate->pipe.multirect_index); 1481 + if (pstate->r_pipe.sspp) { 1482 + seq_printf(s, "\tsspp[1]:%s\n", 1483 + pstate->r_pipe.sspp->cap->name); 1484 + seq_printf(s, "\tmultirect[1]: mode: %d index: %d\n", 1485 + pstate->r_pipe.multirect_mode, pstate->r_pipe.multirect_index); 1486 + } 1359 1487 1360 1488 seq_puts(s, "\n"); 1361 1489 } ··· 1465 1577 { 1466 1578 struct drm_crtc *crtc = NULL; 1467 1579 struct dpu_crtc *dpu_crtc = NULL; 1468 - int i; 1580 + int i, ret; 1469 1581 1470 1582 dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL); 1471 1583 if (!dpu_crtc) ··· 1501 1613 1502 1614 /* initialize event handling */ 1503 1615 spin_lock_init(&dpu_crtc->event_lock); 1616 + 1617 + ret = drm_self_refresh_helper_init(crtc); 1618 + if (ret) { 1619 + DPU_ERROR("Failed to initialize %s with self-refresh helpers %d\n", 1620 + crtc->name, ret); 1621 + return ERR_PTR(ret); 1622 + } 1504 1623 1505 1624 DRM_DEBUG_KMS("%s: successfully initialized crtc\n", dpu_crtc->name); 1506 1625 return crtc;
+36 -45
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
··· 12 12 #include <linux/kthread.h> 13 13 #include <linux/seq_file.h> 14 14 15 + #include <drm/drm_atomic.h> 15 16 #include <drm/drm_crtc.h> 16 17 #include <drm/drm_file.h> 17 18 #include <drm/drm_probe_helper.h> ··· 545 544 static struct msm_display_topology dpu_encoder_get_topology( 546 545 struct dpu_encoder_virt *dpu_enc, 547 546 struct dpu_kms *dpu_kms, 548 - struct drm_display_mode *mode) 547 + struct drm_display_mode *mode, 548 + struct drm_crtc_state *crtc_state) 549 549 { 550 550 struct msm_display_topology topology = {0}; 551 551 int i, intf_count = 0; ··· 564 562 * 1 LM, 1 INTF 565 563 * 2 LM, 1 INTF (stream merge to support high resolution interfaces) 566 564 * 567 - * Adding color blocks only to primary interface if available in 568 - * sufficient number 565 + * Add dspps to the reservation requirements if ctm is requested 569 566 */ 570 567 if (intf_count == 2) 571 568 topology.num_lm = 2; ··· 573 572 else 574 573 topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1; 575 574 576 - if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI) { 577 - if (dpu_kms->catalog->dspp && 578 - (dpu_kms->catalog->dspp_count >= topology.num_lm)) 579 - topology.num_dspp = topology.num_lm; 580 - } 575 + if (crtc_state->ctm) 576 + topology.num_dspp = topology.num_lm; 581 577 582 578 topology.num_intf = intf_count; 583 579 ··· 635 637 if (ret) { 636 638 DPU_ERROR_ENC(dpu_enc, 637 639 "mode unsupported, phys idx %d\n", i); 638 - break; 640 + return ret; 639 641 } 640 642 } 641 643 642 - topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode); 644 + topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode, crtc_state); 643 645 644 - /* Reserve dynamic resources now. */ 645 - if (!ret) { 646 - /* 647 - * Release and Allocate resources on every modeset 648 - * Dont allocate when active is false. 649 - */ 650 - if (drm_atomic_crtc_needs_modeset(crtc_state)) { 651 - dpu_rm_release(global_state, drm_enc); 646 + /* 647 + * Release and Allocate resources on every modeset 648 + * Dont allocate when active is false. 649 + */ 650 + if (drm_atomic_crtc_needs_modeset(crtc_state)) { 651 + dpu_rm_release(global_state, drm_enc); 652 652 653 - if (!crtc_state->active_changed || crtc_state->active) 654 - ret = dpu_rm_reserve(&dpu_kms->rm, global_state, 655 - drm_enc, crtc_state, topology); 656 - } 653 + if (!crtc_state->active_changed || crtc_state->enable) 654 + ret = dpu_rm_reserve(&dpu_kms->rm, global_state, 655 + drm_enc, crtc_state, topology); 657 656 } 658 657 659 658 trace_dpu_enc_atomic_check_flags(DRMID(drm_enc), adj_mode->flags); ··· 1166 1171 mutex_unlock(&dpu_enc->enc_lock); 1167 1172 } 1168 1173 1169 - static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc) 1174 + static void dpu_encoder_virt_atomic_enable(struct drm_encoder *drm_enc, 1175 + struct drm_atomic_state *state) 1170 1176 { 1171 1177 struct dpu_encoder_virt *dpu_enc = NULL; 1172 1178 int ret = 0; ··· 1203 1207 mutex_unlock(&dpu_enc->enc_lock); 1204 1208 } 1205 1209 1206 - static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) 1210 + static void dpu_encoder_virt_atomic_disable(struct drm_encoder *drm_enc, 1211 + struct drm_atomic_state *state) 1207 1212 { 1208 1213 struct dpu_encoder_virt *dpu_enc = NULL; 1214 + struct drm_crtc *crtc; 1215 + struct drm_crtc_state *old_state = NULL; 1209 1216 int i = 0; 1210 1217 1211 1218 dpu_enc = to_dpu_encoder_virt(drm_enc); 1212 1219 DPU_DEBUG_ENC(dpu_enc, "\n"); 1220 + 1221 + crtc = drm_atomic_get_old_crtc_for_encoder(state, drm_enc); 1222 + if (crtc) 1223 + old_state = drm_atomic_get_old_crtc_state(state, crtc); 1224 + 1225 + /* 1226 + * The encoder is already disabled if self refresh mode was set earlier, 1227 + * in the old_state for the corresponding crtc. 1228 + */ 1229 + if (old_state && old_state->self_refresh_active) 1230 + return; 1213 1231 1214 1232 mutex_lock(&dpu_enc->enc_lock); 1215 1233 dpu_enc->enabled = false; ··· 2088 2078 ctl->ops.clear_pending_flush(ctl); 2089 2079 } 2090 2080 2091 - void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc) 2092 - { 2093 - struct dpu_encoder_virt *dpu_enc; 2094 - struct dpu_encoder_phys *phys; 2095 - int i; 2096 - 2097 - if (!drm_enc) { 2098 - DPU_ERROR("invalid encoder\n"); 2099 - return; 2100 - } 2101 - dpu_enc = to_dpu_encoder_virt(drm_enc); 2102 - 2103 - for (i = 0; i < dpu_enc->num_phys_encs; i++) { 2104 - phys = dpu_enc->phys_encs[i]; 2105 - if (phys->ops.prepare_commit) 2106 - phys->ops.prepare_commit(phys); 2107 - } 2108 - } 2109 - 2110 2081 #ifdef CONFIG_DEBUG_FS 2111 2082 static int _dpu_encoder_status_show(struct seq_file *s, void *data) 2112 2083 { ··· 2379 2388 2380 2389 static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = { 2381 2390 .atomic_mode_set = dpu_encoder_virt_atomic_mode_set, 2382 - .disable = dpu_encoder_virt_disable, 2383 - .enable = dpu_encoder_virt_enable, 2391 + .atomic_disable = dpu_encoder_virt_atomic_disable, 2392 + .atomic_enable = dpu_encoder_virt_atomic_enable, 2384 2393 .atomic_check = dpu_encoder_virt_atomic_check, 2385 2394 }; 2386 2395
-7
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
··· 147 147 struct msm_display_info *disp_info); 148 148 149 149 /** 150 - * dpu_encoder_prepare_commit - prepare encoder at the very beginning of an 151 - * atomic commit, before any registers are written 152 - * @drm_enc: Pointer to previously created drm encoder structure 153 - */ 154 - void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc); 155 - 156 - /** 157 150 * dpu_encoder_set_idle_timeout - set the idle timeout for video 158 151 * and command mode encoders. 159 152 * @drm_enc: Pointer to previously created drm encoder structure
+5 -3
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
··· 40 40 41 41 #define DPU_ENC_MAX_POLL_TIMEOUT_US 2000 42 42 43 + static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc); 44 + 43 45 static bool dpu_encoder_phys_cmd_is_master(struct dpu_encoder_phys *phys_enc) 44 46 { 45 47 return (phys_enc->split_role != ENC_ROLE_SLAVE); ··· 567 565 phys_enc->hw_pp->idx - PINGPONG_0); 568 566 } 569 567 568 + dpu_encoder_phys_cmd_enable_te(phys_enc); 569 + 570 570 DPU_DEBUG_CMDENC(cmd_enc, "pp:%d pending_cnt %d\n", 571 571 phys_enc->hw_pp->idx - PINGPONG_0, 572 572 atomic_read(&phys_enc->pending_kickoff_cnt)); ··· 590 586 return false; 591 587 } 592 588 593 - static void dpu_encoder_phys_cmd_prepare_commit( 594 - struct dpu_encoder_phys *phys_enc) 589 + static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc) 595 590 { 596 591 struct dpu_encoder_phys_cmd *cmd_enc = 597 592 to_dpu_encoder_phys_cmd(phys_enc); ··· 735 732 static void dpu_encoder_phys_cmd_init_ops( 736 733 struct dpu_encoder_phys_ops *ops) 737 734 { 738 - ops->prepare_commit = dpu_encoder_phys_cmd_prepare_commit; 739 735 ops->is_master = dpu_encoder_phys_cmd_is_master; 740 736 ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set; 741 737 ops->enable = dpu_encoder_phys_cmd_enable;
+22
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
··· 523 523 { 524 524 unsigned long lock_flags; 525 525 int ret; 526 + struct intf_status intf_status = {0}; 526 527 527 528 if (!phys_enc->parent || !phys_enc->parent->dev) { 528 529 DPU_ERROR("invalid encoder/device\n"); ··· 568 567 } 569 568 } 570 569 570 + if (phys_enc->hw_intf && phys_enc->hw_intf->ops.get_status) 571 + phys_enc->hw_intf->ops.get_status(phys_enc->hw_intf, &intf_status); 572 + 573 + /* 574 + * Wait for a vsync if timing en status is on after timing engine 575 + * is disabled. 576 + */ 577 + if (intf_status.is_en && dpu_encoder_phys_vid_is_master(phys_enc)) { 578 + spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags); 579 + dpu_encoder_phys_inc_pending(phys_enc); 580 + spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags); 581 + ret = dpu_encoder_phys_vid_wait_for_vblank(phys_enc); 582 + if (ret) { 583 + atomic_set(&phys_enc->pending_kickoff_cnt, 0); 584 + DRM_ERROR("wait disable failed: id:%u intf:%d ret:%d\n", 585 + DRMID(phys_enc->parent), 586 + phys_enc->hw_intf->idx - INTF_0, ret); 587 + } 588 + } 589 + 590 + dpu_encoder_helper_phys_cleanup(phys_enc); 571 591 phys_enc->enable_state = DPU_ENC_DISABLED; 572 592 } 573 593
+12 -9
drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
··· 536 536 true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED, 537 537 DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), 538 538 539 + /* XRGB2101010 and ARGB2101010 purposely have the same color 540 + * ordering. The hardware only supports ARGB2101010 UBWC 541 + * natively. 542 + */ 543 + INTERLEAVED_RGB_FMT_TILED(ARGB2101010, 544 + COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 545 + C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4, 546 + true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED, 547 + DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), 548 + 539 549 PSEUDO_YUV_FMT_TILED(NV12, 540 550 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, 541 551 C1_B_Cb, C2_R_Cr, ··· 601 591 {DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC}, 602 592 {DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC}, 603 593 {DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 594 + {DRM_FORMAT_ARGB2101010, COLOR_FMT_RGBA1010102_UBWC}, 604 595 {DRM_FORMAT_XRGB2101010, COLOR_FMT_RGBA1010102_UBWC}, 605 596 {DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 606 597 {DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC}, ··· 929 918 struct drm_framebuffer *fb, 930 919 struct dpu_hw_fmt_layout *layout) 931 920 { 932 - uint32_t plane_addr[DPU_MAX_PLANES]; 933 - int i, ret; 921 + int ret; 934 922 935 923 if (!fb || !layout) { 936 924 DRM_ERROR("invalid arguments\n"); ··· 950 940 if (ret) 951 941 return ret; 952 942 953 - for (i = 0; i < DPU_MAX_PLANES; ++i) 954 - plane_addr[i] = layout->plane_addr[i]; 955 - 956 943 /* Populate the addresses given the fb */ 957 944 if (DPU_FORMAT_IS_UBWC(layout->format) || 958 945 DPU_FORMAT_IS_TILE(layout->format)) 959 946 ret = _dpu_format_populate_addrs_ubwc(aspace, fb, layout); 960 947 else 961 948 ret = _dpu_format_populate_addrs_linear(aspace, fb, layout); 962 - 963 - /* check if anything changed */ 964 - if (!ret && !memcmp(plane_addr, layout->plane_addr, sizeof(plane_addr))) 965 - ret = -EAGAIN; 966 949 967 950 return ret; 968 951 }
+40 -2115
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
··· 27 27 #define VIG_SDM845_MASK \ 28 28 (VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED3)) 29 29 30 + #define VIG_SDM845_MASK_SDMA \ 31 + (VIG_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) 32 + 30 33 #define VIG_SC7180_MASK \ 31 34 (VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED4)) 35 + 36 + #define VIG_SC7180_MASK_SDMA \ 37 + (VIG_SC7180_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) 32 38 33 39 #define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL)) 34 40 ··· 46 40 #define VIG_SC7280_MASK \ 47 41 (VIG_SC7180_MASK | BIT(DPU_SSPP_INLINE_ROTATION)) 48 42 43 + #define VIG_SC7280_MASK_SDMA \ 44 + (VIG_SC7280_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) 45 + 49 46 #define DMA_SDM845_MASK \ 50 47 (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\ 51 48 BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\ ··· 56 47 57 48 #define DMA_CURSOR_SDM845_MASK \ 58 49 (DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR)) 50 + 51 + #define DMA_SDM845_MASK_SDMA \ 52 + (DMA_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) 53 + 54 + #define DMA_CURSOR_SDM845_MASK_SDMA \ 55 + (DMA_CURSOR_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) 59 56 60 57 #define DMA_CURSOR_MSM8998_MASK \ 61 58 (DMA_MSM8998_MASK | BIT(DPU_SSPP_CURSOR)) ··· 81 66 (PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2)) 82 67 83 68 #define CTL_SC7280_MASK \ 84 - (BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_FETCH_ACTIVE) | BIT(DPU_CTL_VM_CFG)) 69 + (BIT(DPU_CTL_ACTIVE_CFG) | \ 70 + BIT(DPU_CTL_FETCH_ACTIVE) | \ 71 + BIT(DPU_CTL_VM_CFG) | \ 72 + BIT(DPU_CTL_DSPP_SUB_BLOCK_FLUSH)) 85 73 86 74 #define CTL_SM8550_MASK \ 87 75 (CTL_SC7280_MASK | BIT(DPU_CTL_HAS_LAYER_EXT4)) ··· 97 79 98 80 #define INTF_SDM845_MASK (0) 99 81 100 - #define INTF_SC7180_MASK BIT(DPU_INTF_INPUT_CTRL) | BIT(DPU_INTF_TE) 82 + #define INTF_SC7180_MASK \ 83 + (BIT(DPU_INTF_INPUT_CTRL) | BIT(DPU_INTF_TE) | BIT(DPU_INTF_STATUS_SUPPORTED)) 101 84 102 85 #define INTF_SC7280_MASK INTF_SC7180_MASK | BIT(DPU_DATA_HCTL_EN) 103 - 104 - #define IRQ_SDM845_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 105 - BIT(MDP_SSPP_TOP0_INTR2) | \ 106 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 107 - BIT(MDP_INTF0_INTR) | \ 108 - BIT(MDP_INTF1_INTR) | \ 109 - BIT(MDP_INTF2_INTR) | \ 110 - BIT(MDP_INTF3_INTR) | \ 111 - BIT(MDP_AD4_0_INTR) | \ 112 - BIT(MDP_AD4_1_INTR)) 113 - 114 - #define IRQ_SC7180_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 115 - BIT(MDP_SSPP_TOP0_INTR2) | \ 116 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 117 - BIT(MDP_INTF0_INTR) | \ 118 - BIT(MDP_INTF1_INTR)) 119 - 120 - #define IRQ_SC7280_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 121 - BIT(MDP_SSPP_TOP0_INTR2) | \ 122 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 123 - BIT(MDP_INTF0_7xxx_INTR) | \ 124 - BIT(MDP_INTF1_7xxx_INTR) | \ 125 - BIT(MDP_INTF5_7xxx_INTR)) 126 - 127 - #define IRQ_SM8250_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 128 - BIT(MDP_SSPP_TOP0_INTR2) | \ 129 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 130 - BIT(MDP_INTF0_INTR) | \ 131 - BIT(MDP_INTF1_INTR) | \ 132 - BIT(MDP_INTF2_INTR) | \ 133 - BIT(MDP_INTF3_INTR) | \ 134 - BIT(MDP_INTF4_INTR)) 135 - 136 - #define IRQ_SM8350_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 137 - BIT(MDP_SSPP_TOP0_INTR2) | \ 138 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 139 - BIT(MDP_INTF0_7xxx_INTR) | \ 140 - BIT(MDP_INTF1_7xxx_INTR) | \ 141 - BIT(MDP_INTF2_7xxx_INTR) | \ 142 - BIT(MDP_INTF3_7xxx_INTR)) 143 - 144 - #define IRQ_SC8180X_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 145 - BIT(MDP_SSPP_TOP0_INTR2) | \ 146 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 147 - BIT(MDP_INTF0_INTR) | \ 148 - BIT(MDP_INTF1_INTR) | \ 149 - BIT(MDP_INTF2_INTR) | \ 150 - BIT(MDP_INTF3_INTR) | \ 151 - BIT(MDP_INTF4_INTR) | \ 152 - BIT(MDP_INTF5_INTR) | \ 153 - BIT(MDP_AD4_0_INTR) | \ 154 - BIT(MDP_AD4_1_INTR)) 155 - 156 - #define IRQ_SC8280XP_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 157 - BIT(MDP_SSPP_TOP0_INTR2) | \ 158 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 159 - BIT(MDP_INTF0_7xxx_INTR) | \ 160 - BIT(MDP_INTF1_7xxx_INTR) | \ 161 - BIT(MDP_INTF2_7xxx_INTR) | \ 162 - BIT(MDP_INTF3_7xxx_INTR) | \ 163 - BIT(MDP_INTF4_7xxx_INTR) | \ 164 - BIT(MDP_INTF5_7xxx_INTR) | \ 165 - BIT(MDP_INTF6_7xxx_INTR) | \ 166 - BIT(MDP_INTF7_7xxx_INTR) | \ 167 - BIT(MDP_INTF8_7xxx_INTR)) 168 - 169 - #define IRQ_SM8450_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ 170 - BIT(MDP_SSPP_TOP0_INTR2) | \ 171 - BIT(MDP_SSPP_TOP0_HIST_INTR) | \ 172 - BIT(MDP_INTF0_7xxx_INTR) | \ 173 - BIT(MDP_INTF1_7xxx_INTR) | \ 174 - BIT(MDP_INTF2_7xxx_INTR) | \ 175 - BIT(MDP_INTF3_7xxx_INTR)) 176 86 177 87 #define WB_SM8250_MASK (BIT(DPU_WB_LINE_MODE) | \ 178 88 BIT(DPU_WB_UBWC) | \ ··· 134 188 DRM_FORMAT_RGBX8888, 135 189 DRM_FORMAT_BGRX8888, 136 190 DRM_FORMAT_XBGR8888, 191 + DRM_FORMAT_ARGB2101010, 137 192 DRM_FORMAT_XRGB2101010, 138 193 DRM_FORMAT_RGB888, 139 194 DRM_FORMAT_BGR888, ··· 164 217 DRM_FORMAT_RGBA8888, 165 218 DRM_FORMAT_BGRX8888, 166 219 DRM_FORMAT_BGRA8888, 220 + DRM_FORMAT_ARGB2101010, 167 221 DRM_FORMAT_XRGB2101010, 168 222 DRM_FORMAT_XRGB8888, 169 223 DRM_FORMAT_XBGR8888, ··· 240 292 DRM_FORMAT_BGRA4444, 241 293 DRM_FORMAT_BGRX4444, 242 294 DRM_FORMAT_XBGR4444, 243 - }; 244 - 245 - /************************************************************* 246 - * DPU sub blocks config 247 - *************************************************************/ 248 - /* DPU top level caps */ 249 - static const struct dpu_caps msm8998_dpu_caps = { 250 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 251 - .max_mixer_blendstages = 0x7, 252 - .qseed_type = DPU_SSPP_SCALER_QSEED3, 253 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V1, 254 - .ubwc_version = DPU_HW_UBWC_VER_10, 255 - .has_src_split = true, 256 - .has_dim_layer = true, 257 - .has_idle_pc = true, 258 - .has_3d_merge = true, 259 - .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 260 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 261 - .max_hdeci_exp = MAX_HORZ_DECIMATION, 262 - .max_vdeci_exp = MAX_VERT_DECIMATION, 263 - }; 264 - 265 - static const struct dpu_caps qcm2290_dpu_caps = { 266 - .max_mixer_width = DEFAULT_DPU_LINE_WIDTH, 267 - .max_mixer_blendstages = 0x4, 268 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, 269 - .has_dim_layer = true, 270 - .has_idle_pc = true, 271 - .max_linewidth = 2160, 272 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 273 - }; 274 - 275 - static const struct dpu_caps sdm845_dpu_caps = { 276 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 277 - .max_mixer_blendstages = 0xb, 278 - .qseed_type = DPU_SSPP_SCALER_QSEED3, 279 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, 280 - .ubwc_version = DPU_HW_UBWC_VER_20, 281 - .has_src_split = true, 282 - .has_dim_layer = true, 283 - .has_idle_pc = true, 284 - .has_3d_merge = true, 285 - .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 286 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 287 - .max_hdeci_exp = MAX_HORZ_DECIMATION, 288 - .max_vdeci_exp = MAX_VERT_DECIMATION, 289 - }; 290 - 291 - static const struct dpu_caps sc7180_dpu_caps = { 292 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 293 - .max_mixer_blendstages = 0x9, 294 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 295 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, 296 - .ubwc_version = DPU_HW_UBWC_VER_20, 297 - .has_dim_layer = true, 298 - .has_idle_pc = true, 299 - .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 300 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 301 - }; 302 - 303 - static const struct dpu_caps sm6115_dpu_caps = { 304 - .max_mixer_width = DEFAULT_DPU_LINE_WIDTH, 305 - .max_mixer_blendstages = 0x4, 306 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 307 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 308 - .ubwc_version = DPU_HW_UBWC_VER_10, 309 - .has_dim_layer = true, 310 - .has_idle_pc = true, 311 - .max_linewidth = 2160, 312 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 313 - }; 314 - 315 - static const struct dpu_caps sm8150_dpu_caps = { 316 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 317 - .max_mixer_blendstages = 0xb, 318 - .qseed_type = DPU_SSPP_SCALER_QSEED3, 319 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 320 - .ubwc_version = DPU_HW_UBWC_VER_30, 321 - .has_src_split = true, 322 - .has_dim_layer = true, 323 - .has_idle_pc = true, 324 - .has_3d_merge = true, 325 - .max_linewidth = 4096, 326 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 327 - .max_hdeci_exp = MAX_HORZ_DECIMATION, 328 - .max_vdeci_exp = MAX_VERT_DECIMATION, 329 - }; 330 - 331 - static const struct dpu_caps sc8180x_dpu_caps = { 332 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 333 - .max_mixer_blendstages = 0xb, 334 - .qseed_type = DPU_SSPP_SCALER_QSEED3, 335 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 336 - .ubwc_version = DPU_HW_UBWC_VER_30, 337 - .has_src_split = true, 338 - .has_dim_layer = true, 339 - .has_idle_pc = true, 340 - .has_3d_merge = true, 341 - .max_linewidth = 4096, 342 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 343 - .max_hdeci_exp = MAX_HORZ_DECIMATION, 344 - .max_vdeci_exp = MAX_VERT_DECIMATION, 345 - }; 346 - 347 - static const struct dpu_caps sc8280xp_dpu_caps = { 348 - .max_mixer_width = 2560, 349 - .max_mixer_blendstages = 11, 350 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 351 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 352 - .ubwc_version = DPU_HW_UBWC_VER_40, 353 - .has_src_split = true, 354 - .has_dim_layer = true, 355 - .has_idle_pc = true, 356 - .has_3d_merge = true, 357 - .max_linewidth = 5120, 358 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 359 - }; 360 - 361 - static const struct dpu_caps sm8250_dpu_caps = { 362 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 363 - .max_mixer_blendstages = 0xb, 364 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 365 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 366 - .ubwc_version = DPU_HW_UBWC_VER_40, 367 - .has_src_split = true, 368 - .has_dim_layer = true, 369 - .has_idle_pc = true, 370 - .has_3d_merge = true, 371 - .max_linewidth = 4096, 372 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 373 - }; 374 - 375 - static const struct dpu_caps sm8350_dpu_caps = { 376 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 377 - .max_mixer_blendstages = 0xb, 378 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 379 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 380 - .ubwc_version = DPU_HW_UBWC_VER_40, 381 - .has_src_split = true, 382 - .has_dim_layer = true, 383 - .has_idle_pc = true, 384 - .has_3d_merge = true, 385 - .max_linewidth = 4096, 386 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 387 - }; 388 - 389 - static const struct dpu_caps sm8450_dpu_caps = { 390 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 391 - .max_mixer_blendstages = 0xb, 392 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 393 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 394 - .ubwc_version = DPU_HW_UBWC_VER_40, 395 - .has_src_split = true, 396 - .has_dim_layer = true, 397 - .has_idle_pc = true, 398 - .has_3d_merge = true, 399 - .max_linewidth = 5120, 400 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 401 - }; 402 - 403 - static const struct dpu_caps sm8550_dpu_caps = { 404 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 405 - .max_mixer_blendstages = 0xb, 406 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 407 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ 408 - .ubwc_version = DPU_HW_UBWC_VER_40, 409 - .has_src_split = true, 410 - .has_dim_layer = true, 411 - .has_idle_pc = true, 412 - .has_3d_merge = true, 413 - .max_linewidth = 5120, 414 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 415 - }; 416 - 417 - static const struct dpu_caps sc7280_dpu_caps = { 418 - .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 419 - .max_mixer_blendstages = 0x7, 420 - .qseed_type = DPU_SSPP_SCALER_QSEED4, 421 - .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, 422 - .ubwc_version = DPU_HW_UBWC_VER_30, 423 - .has_dim_layer = true, 424 - .has_idle_pc = true, 425 - .max_linewidth = 2400, 426 - .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 427 - }; 428 - 429 - static const struct dpu_mdp_cfg msm8998_mdp[] = { 430 - { 431 - .name = "top_0", .id = MDP_TOP, 432 - .base = 0x0, .len = 0x458, 433 - .features = 0, 434 - .highest_bank_bit = 0x2, 435 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 436 - .reg_off = 0x2AC, .bit_off = 0}, 437 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 438 - .reg_off = 0x2B4, .bit_off = 0}, 439 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 440 - .reg_off = 0x2BC, .bit_off = 0}, 441 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 442 - .reg_off = 0x2C4, .bit_off = 0}, 443 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 444 - .reg_off = 0x2AC, .bit_off = 8}, 445 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 446 - .reg_off = 0x2B4, .bit_off = 8}, 447 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 448 - .reg_off = 0x2C4, .bit_off = 8}, 449 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 450 - .reg_off = 0x2C4, .bit_off = 12}, 451 - .clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { 452 - .reg_off = 0x3A8, .bit_off = 15}, 453 - .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { 454 - .reg_off = 0x3B0, .bit_off = 15}, 455 - }, 456 - }; 457 - 458 - static const struct dpu_mdp_cfg sdm845_mdp[] = { 459 - { 460 - .name = "top_0", .id = MDP_TOP, 461 - .base = 0x0, .len = 0x45C, 462 - .features = BIT(DPU_MDP_AUDIO_SELECT), 463 - .highest_bank_bit = 0x2, 464 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 465 - .reg_off = 0x2AC, .bit_off = 0}, 466 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 467 - .reg_off = 0x2B4, .bit_off = 0}, 468 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 469 - .reg_off = 0x2BC, .bit_off = 0}, 470 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 471 - .reg_off = 0x2C4, .bit_off = 0}, 472 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 473 - .reg_off = 0x2AC, .bit_off = 8}, 474 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 475 - .reg_off = 0x2B4, .bit_off = 8}, 476 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 477 - .reg_off = 0x2BC, .bit_off = 8}, 478 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 479 - .reg_off = 0x2C4, .bit_off = 8}, 480 - }, 481 - }; 482 - 483 - static const struct dpu_mdp_cfg sc7180_mdp[] = { 484 - { 485 - .name = "top_0", .id = MDP_TOP, 486 - .base = 0x0, .len = 0x494, 487 - .features = 0, 488 - .highest_bank_bit = 0x3, 489 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 490 - .reg_off = 0x2AC, .bit_off = 0}, 491 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 492 - .reg_off = 0x2AC, .bit_off = 8}, 493 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 494 - .reg_off = 0x2B4, .bit_off = 8}, 495 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 496 - .reg_off = 0x2C4, .bit_off = 8}, 497 - .clk_ctrls[DPU_CLK_CTRL_WB2] = { 498 - .reg_off = 0x3B8, .bit_off = 24}, 499 - }, 500 - }; 501 - 502 - static const struct dpu_mdp_cfg sc8180x_mdp[] = { 503 - { 504 - .name = "top_0", .id = MDP_TOP, 505 - .base = 0x0, .len = 0x45C, 506 - .features = BIT(DPU_MDP_AUDIO_SELECT), 507 - .highest_bank_bit = 0x3, 508 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 509 - .reg_off = 0x2AC, .bit_off = 0}, 510 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 511 - .reg_off = 0x2B4, .bit_off = 0}, 512 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 513 - .reg_off = 0x2BC, .bit_off = 0}, 514 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 515 - .reg_off = 0x2C4, .bit_off = 0}, 516 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 517 - .reg_off = 0x2AC, .bit_off = 8}, 518 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 519 - .reg_off = 0x2B4, .bit_off = 8}, 520 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 521 - .reg_off = 0x2BC, .bit_off = 8}, 522 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 523 - .reg_off = 0x2C4, .bit_off = 8}, 524 - }, 525 - }; 526 - 527 - static const struct dpu_mdp_cfg sm6115_mdp[] = { 528 - { 529 - .name = "top_0", .id = MDP_TOP, 530 - .base = 0x0, .len = 0x494, 531 - .features = 0, 532 - .highest_bank_bit = 0x1, 533 - .ubwc_swizzle = 0x7, 534 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 535 - .reg_off = 0x2ac, .bit_off = 0}, 536 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 537 - .reg_off = 0x2ac, .bit_off = 8}, 538 - }, 539 - }; 540 - 541 - static const struct dpu_mdp_cfg sm8250_mdp[] = { 542 - { 543 - .name = "top_0", .id = MDP_TOP, 544 - .base = 0x0, .len = 0x494, 545 - .features = 0, 546 - .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 547 - .ubwc_swizzle = 0x6, 548 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 549 - .reg_off = 0x2AC, .bit_off = 0}, 550 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 551 - .reg_off = 0x2B4, .bit_off = 0}, 552 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 553 - .reg_off = 0x2BC, .bit_off = 0}, 554 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 555 - .reg_off = 0x2C4, .bit_off = 0}, 556 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 557 - .reg_off = 0x2AC, .bit_off = 8}, 558 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 559 - .reg_off = 0x2B4, .bit_off = 8}, 560 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 561 - .reg_off = 0x2BC, .bit_off = 8}, 562 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 563 - .reg_off = 0x2C4, .bit_off = 8}, 564 - .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { 565 - .reg_off = 0x2BC, .bit_off = 20}, 566 - .clk_ctrls[DPU_CLK_CTRL_WB2] = { 567 - .reg_off = 0x3B8, .bit_off = 24}, 568 - }, 569 - }; 570 - 571 - static const struct dpu_mdp_cfg sm8350_mdp[] = { 572 - { 573 - .name = "top_0", .id = MDP_TOP, 574 - .base = 0x0, .len = 0x494, 575 - .features = 0, 576 - .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 577 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 578 - .reg_off = 0x2ac, .bit_off = 0}, 579 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 580 - .reg_off = 0x2b4, .bit_off = 0}, 581 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 582 - .reg_off = 0x2bc, .bit_off = 0}, 583 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 584 - .reg_off = 0x2c4, .bit_off = 0}, 585 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 586 - .reg_off = 0x2ac, .bit_off = 8}, 587 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 588 - .reg_off = 0x2b4, .bit_off = 8}, 589 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 590 - .reg_off = 0x2bc, .bit_off = 8}, 591 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 592 - .reg_off = 0x2c4, .bit_off = 8}, 593 - .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { 594 - .reg_off = 0x2bc, .bit_off = 20}, 595 - }, 596 - }; 597 - 598 - static const struct dpu_mdp_cfg sm8450_mdp[] = { 599 - { 600 - .name = "top_0", .id = MDP_TOP, 601 - .base = 0x0, .len = 0x494, 602 - .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 603 - .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 604 - .ubwc_swizzle = 0x6, 605 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 606 - .reg_off = 0x2AC, .bit_off = 0}, 607 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 608 - .reg_off = 0x2B4, .bit_off = 0}, 609 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 610 - .reg_off = 0x2BC, .bit_off = 0}, 611 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 612 - .reg_off = 0x2C4, .bit_off = 0}, 613 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 614 - .reg_off = 0x2AC, .bit_off = 8}, 615 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 616 - .reg_off = 0x2B4, .bit_off = 8}, 617 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 618 - .reg_off = 0x2BC, .bit_off = 8}, 619 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 620 - .reg_off = 0x2C4, .bit_off = 8}, 621 - .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { 622 - .reg_off = 0x2BC, .bit_off = 20}, 623 - }, 624 - }; 625 - 626 - static const struct dpu_mdp_cfg sc7280_mdp[] = { 627 - { 628 - .name = "top_0", .id = MDP_TOP, 629 - .base = 0x0, .len = 0x2014, 630 - .highest_bank_bit = 0x1, 631 - .ubwc_swizzle = 0x6, 632 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 633 - .reg_off = 0x2AC, .bit_off = 0}, 634 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 635 - .reg_off = 0x2AC, .bit_off = 8}, 636 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 637 - .reg_off = 0x2B4, .bit_off = 8}, 638 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 639 - .reg_off = 0x2C4, .bit_off = 8}, 640 - }, 641 - }; 642 - 643 - static const struct dpu_mdp_cfg sc8280xp_mdp[] = { 644 - { 645 - .name = "top_0", .id = MDP_TOP, 646 - .base = 0x0, .len = 0x494, 647 - .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 648 - .highest_bank_bit = 2, 649 - .ubwc_swizzle = 6, 650 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0}, 651 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0}, 652 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0}, 653 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0}, 654 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8}, 655 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8}, 656 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8}, 657 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8}, 658 - .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20}, 659 - }, 660 - }; 661 - 662 - static const struct dpu_mdp_cfg sm8550_mdp[] = { 663 - { 664 - .name = "top_0", .id = MDP_TOP, 665 - .base = 0, .len = 0x494, 666 - .features = BIT(DPU_MDP_PERIPH_0_REMOVED), 667 - .highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ 668 - .ubwc_swizzle = 0x6, 669 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 670 - .reg_off = 0x4330, .bit_off = 0}, 671 - .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 672 - .reg_off = 0x6330, .bit_off = 0}, 673 - .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 674 - .reg_off = 0x8330, .bit_off = 0}, 675 - .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 676 - .reg_off = 0xa330, .bit_off = 0}, 677 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 678 - .reg_off = 0x24330, .bit_off = 0}, 679 - .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 680 - .reg_off = 0x26330, .bit_off = 0}, 681 - .clk_ctrls[DPU_CLK_CTRL_DMA2] = { 682 - .reg_off = 0x28330, .bit_off = 0}, 683 - .clk_ctrls[DPU_CLK_CTRL_DMA3] = { 684 - .reg_off = 0x2a330, .bit_off = 0}, 685 - .clk_ctrls[DPU_CLK_CTRL_DMA4] = { 686 - .reg_off = 0x2c330, .bit_off = 0}, 687 - .clk_ctrls[DPU_CLK_CTRL_DMA5] = { 688 - .reg_off = 0x2e330, .bit_off = 0}, 689 - .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { 690 - .reg_off = 0x2bc, .bit_off = 20}, 691 - }, 692 - }; 693 - 694 - static const struct dpu_mdp_cfg qcm2290_mdp[] = { 695 - { 696 - .name = "top_0", .id = MDP_TOP, 697 - .base = 0x0, .len = 0x494, 698 - .features = 0, 699 - .highest_bank_bit = 0x2, 700 - .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 701 - .reg_off = 0x2AC, .bit_off = 0}, 702 - .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 703 - .reg_off = 0x2AC, .bit_off = 8}, 704 - }, 705 - }; 706 - 707 - /************************************************************* 708 - * CTL sub blocks config 709 - *************************************************************/ 710 - static const struct dpu_ctl_cfg msm8998_ctl[] = { 711 - { 712 - .name = "ctl_0", .id = CTL_0, 713 - .base = 0x1000, .len = 0x94, 714 - .features = BIT(DPU_CTL_SPLIT_DISPLAY), 715 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 716 - }, 717 - { 718 - .name = "ctl_1", .id = CTL_1, 719 - .base = 0x1200, .len = 0x94, 720 - .features = 0, 721 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 722 - }, 723 - { 724 - .name = "ctl_2", .id = CTL_2, 725 - .base = 0x1400, .len = 0x94, 726 - .features = BIT(DPU_CTL_SPLIT_DISPLAY), 727 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 728 - }, 729 - { 730 - .name = "ctl_3", .id = CTL_3, 731 - .base = 0x1600, .len = 0x94, 732 - .features = 0, 733 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 734 - }, 735 - { 736 - .name = "ctl_4", .id = CTL_4, 737 - .base = 0x1800, .len = 0x94, 738 - .features = 0, 739 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 740 - }, 741 - }; 742 - 743 - static const struct dpu_ctl_cfg sdm845_ctl[] = { 744 - { 745 - .name = "ctl_0", .id = CTL_0, 746 - .base = 0x1000, .len = 0xE4, 747 - .features = BIT(DPU_CTL_SPLIT_DISPLAY), 748 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 749 - }, 750 - { 751 - .name = "ctl_1", .id = CTL_1, 752 - .base = 0x1200, .len = 0xE4, 753 - .features = BIT(DPU_CTL_SPLIT_DISPLAY), 754 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 755 - }, 756 - { 757 - .name = "ctl_2", .id = CTL_2, 758 - .base = 0x1400, .len = 0xE4, 759 - .features = 0, 760 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 761 - }, 762 - { 763 - .name = "ctl_3", .id = CTL_3, 764 - .base = 0x1600, .len = 0xE4, 765 - .features = 0, 766 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 767 - }, 768 - { 769 - .name = "ctl_4", .id = CTL_4, 770 - .base = 0x1800, .len = 0xE4, 771 - .features = 0, 772 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 773 - }, 774 - }; 775 - 776 - static const struct dpu_ctl_cfg sc7180_ctl[] = { 777 - { 778 - .name = "ctl_0", .id = CTL_0, 779 - .base = 0x1000, .len = 0x1dc, 780 - .features = BIT(DPU_CTL_ACTIVE_CFG), 781 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 782 - }, 783 - { 784 - .name = "ctl_1", .id = CTL_1, 785 - .base = 0x1200, .len = 0x1dc, 786 - .features = BIT(DPU_CTL_ACTIVE_CFG), 787 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 788 - }, 789 - { 790 - .name = "ctl_2", .id = CTL_2, 791 - .base = 0x1400, .len = 0x1dc, 792 - .features = BIT(DPU_CTL_ACTIVE_CFG), 793 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 794 - }, 795 - }; 796 - 797 - static const struct dpu_ctl_cfg sc8280xp_ctl[] = { 798 - { 799 - .name = "ctl_0", .id = CTL_0, 800 - .base = 0x15000, .len = 0x204, 801 - .features = CTL_SC7280_MASK, 802 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 803 - }, 804 - { 805 - .name = "ctl_1", .id = CTL_1, 806 - .base = 0x16000, .len = 0x204, 807 - .features = CTL_SC7280_MASK, 808 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 809 - }, 810 - { 811 - .name = "ctl_2", .id = CTL_2, 812 - .base = 0x17000, .len = 0x204, 813 - .features = CTL_SC7280_MASK, 814 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 815 - }, 816 - { 817 - .name = "ctl_3", .id = CTL_3, 818 - .base = 0x18000, .len = 0x204, 819 - .features = CTL_SC7280_MASK, 820 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 821 - }, 822 - { 823 - .name = "ctl_4", .id = CTL_4, 824 - .base = 0x19000, .len = 0x204, 825 - .features = CTL_SC7280_MASK, 826 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 827 - }, 828 - { 829 - .name = "ctl_5", .id = CTL_5, 830 - .base = 0x1a000, .len = 0x204, 831 - .features = CTL_SC7280_MASK, 832 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 833 - }, 834 - }; 835 - 836 - static const struct dpu_ctl_cfg sm8150_ctl[] = { 837 - { 838 - .name = "ctl_0", .id = CTL_0, 839 - .base = 0x1000, .len = 0x1e0, 840 - .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 841 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 842 - }, 843 - { 844 - .name = "ctl_1", .id = CTL_1, 845 - .base = 0x1200, .len = 0x1e0, 846 - .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), 847 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 848 - }, 849 - { 850 - .name = "ctl_2", .id = CTL_2, 851 - .base = 0x1400, .len = 0x1e0, 852 - .features = BIT(DPU_CTL_ACTIVE_CFG), 853 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 854 - }, 855 - { 856 - .name = "ctl_3", .id = CTL_3, 857 - .base = 0x1600, .len = 0x1e0, 858 - .features = BIT(DPU_CTL_ACTIVE_CFG), 859 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 860 - }, 861 - { 862 - .name = "ctl_4", .id = CTL_4, 863 - .base = 0x1800, .len = 0x1e0, 864 - .features = BIT(DPU_CTL_ACTIVE_CFG), 865 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 866 - }, 867 - { 868 - .name = "ctl_5", .id = CTL_5, 869 - .base = 0x1a00, .len = 0x1e0, 870 - .features = BIT(DPU_CTL_ACTIVE_CFG), 871 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 872 - }, 873 - }; 874 - 875 - static const struct dpu_ctl_cfg sm8350_ctl[] = { 876 - { 877 - .name = "ctl_0", .id = CTL_0, 878 - .base = 0x15000, .len = 0x1e8, 879 - .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 880 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 881 - }, 882 - { 883 - .name = "ctl_1", .id = CTL_1, 884 - .base = 0x16000, .len = 0x1e8, 885 - .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 886 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 887 - }, 888 - { 889 - .name = "ctl_2", .id = CTL_2, 890 - .base = 0x17000, .len = 0x1e8, 891 - .features = CTL_SC7280_MASK, 892 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 893 - }, 894 - { 895 - .name = "ctl_3", .id = CTL_3, 896 - .base = 0x18000, .len = 0x1e8, 897 - .features = CTL_SC7280_MASK, 898 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 899 - }, 900 - { 901 - .name = "ctl_4", .id = CTL_4, 902 - .base = 0x19000, .len = 0x1e8, 903 - .features = CTL_SC7280_MASK, 904 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 905 - }, 906 - { 907 - .name = "ctl_5", .id = CTL_5, 908 - .base = 0x1a000, .len = 0x1e8, 909 - .features = CTL_SC7280_MASK, 910 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 911 - }, 912 - }; 913 - 914 - static const struct dpu_ctl_cfg sm8450_ctl[] = { 915 - { 916 - .name = "ctl_0", .id = CTL_0, 917 - .base = 0x15000, .len = 0x204, 918 - .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE), 919 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 920 - }, 921 - { 922 - .name = "ctl_1", .id = CTL_1, 923 - .base = 0x16000, .len = 0x204, 924 - .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, 925 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 926 - }, 927 - { 928 - .name = "ctl_2", .id = CTL_2, 929 - .base = 0x17000, .len = 0x204, 930 - .features = CTL_SC7280_MASK, 931 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 932 - }, 933 - { 934 - .name = "ctl_3", .id = CTL_3, 935 - .base = 0x18000, .len = 0x204, 936 - .features = CTL_SC7280_MASK, 937 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 938 - }, 939 - { 940 - .name = "ctl_4", .id = CTL_4, 941 - .base = 0x19000, .len = 0x204, 942 - .features = CTL_SC7280_MASK, 943 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 944 - }, 945 - { 946 - .name = "ctl_5", .id = CTL_5, 947 - .base = 0x1a000, .len = 0x204, 948 - .features = CTL_SC7280_MASK, 949 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 950 - }, 951 - }; 952 - 953 - static const struct dpu_ctl_cfg sm8550_ctl[] = { 954 - { 955 - .name = "ctl_0", .id = CTL_0, 956 - .base = 0x15000, .len = 0x290, 957 - .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), 958 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 959 - }, 960 - { 961 - .name = "ctl_1", .id = CTL_1, 962 - .base = 0x16000, .len = 0x290, 963 - .features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), 964 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 965 - }, 966 - { 967 - .name = "ctl_2", .id = CTL_2, 968 - .base = 0x17000, .len = 0x290, 969 - .features = CTL_SM8550_MASK, 970 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 971 - }, 972 - { 973 - .name = "ctl_3", .id = CTL_3, 974 - .base = 0x18000, .len = 0x290, 975 - .features = CTL_SM8550_MASK, 976 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 977 - }, 978 - { 979 - .name = "ctl_4", .id = CTL_4, 980 - .base = 0x19000, .len = 0x290, 981 - .features = CTL_SM8550_MASK, 982 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), 983 - }, 984 - { 985 - .name = "ctl_5", .id = CTL_5, 986 - .base = 0x1a000, .len = 0x290, 987 - .features = CTL_SM8550_MASK, 988 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), 989 - }, 990 - }; 991 - 992 - static const struct dpu_ctl_cfg sc7280_ctl[] = { 993 - { 994 - .name = "ctl_0", .id = CTL_0, 995 - .base = 0x15000, .len = 0x1E8, 996 - .features = CTL_SC7280_MASK, 997 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 998 - }, 999 - { 1000 - .name = "ctl_1", .id = CTL_1, 1001 - .base = 0x16000, .len = 0x1E8, 1002 - .features = CTL_SC7280_MASK, 1003 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), 1004 - }, 1005 - { 1006 - .name = "ctl_2", .id = CTL_2, 1007 - .base = 0x17000, .len = 0x1E8, 1008 - .features = CTL_SC7280_MASK, 1009 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), 1010 - }, 1011 - { 1012 - .name = "ctl_3", .id = CTL_3, 1013 - .base = 0x18000, .len = 0x1E8, 1014 - .features = CTL_SC7280_MASK, 1015 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), 1016 - }, 1017 - }; 1018 - 1019 - static const struct dpu_ctl_cfg qcm2290_ctl[] = { 1020 - { 1021 - .name = "ctl_0", .id = CTL_0, 1022 - .base = 0x1000, .len = 0x1dc, 1023 - .features = BIT(DPU_CTL_ACTIVE_CFG), 1024 - .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), 1025 - }, 1026 295 }; 1027 296 1028 297 /************************************************************* ··· 329 1164 static const struct dpu_sspp_sub_blks sdm845_dma_sblk_2 = _DMA_SBLK("10", 3); 330 1165 static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4); 331 1166 332 - #define SSPP_BLK(_name, _id, _base, _features, \ 1167 + #define SSPP_BLK(_name, _id, _base, _len, _features, \ 333 1168 _sblk, _xinid, _type, _clkctrl) \ 334 1169 { \ 335 1170 .name = _name, .id = _id, \ 336 - .base = _base, .len = 0x1c8, \ 1171 + .base = _base, .len = _len, \ 337 1172 .features = _features, \ 338 1173 .sblk = &_sblk, \ 339 1174 .xin_id = _xinid, \ ··· 341 1176 .clk_ctrl = _clkctrl \ 342 1177 } 343 1178 344 - static const struct dpu_sspp_cfg msm8998_sspp[] = { 345 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_MSM8998_MASK, 346 - msm8998_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 347 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_MSM8998_MASK, 348 - msm8998_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 349 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_MSM8998_MASK, 350 - msm8998_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 351 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_MSM8998_MASK, 352 - msm8998_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 353 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_MSM8998_MASK, 354 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 355 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_MSM8998_MASK, 356 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 357 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_MSM8998_MASK, 358 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 359 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_MSM8998_MASK, 360 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 361 - }; 362 - 363 - static const struct dpu_sspp_cfg sdm845_sspp[] = { 364 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK, 365 - sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 366 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK, 367 - sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 368 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK, 369 - sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 370 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK, 371 - sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 372 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 373 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 374 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 375 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 376 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 377 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 378 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, 379 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 380 - }; 381 - 382 1179 static const struct dpu_sspp_sub_blks sc7180_vig_sblk_0 = 383 1180 _VIG_SBLK("0", 4, DPU_SSPP_SCALER_QSEED4); 384 1181 385 1182 static const struct dpu_sspp_sub_blks sc7280_vig_sblk_0 = 386 1183 _VIG_SBLK_ROT("0", 4, DPU_SSPP_SCALER_QSEED4, &dpu_rot_sc7280_cfg_v2); 387 1184 388 - static const struct dpu_sspp_cfg sc7180_sspp[] = { 389 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 390 - sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 391 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 392 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 393 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_CURSOR_SDM845_MASK, 394 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 395 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 396 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 397 - }; 398 - 399 1185 static const struct dpu_sspp_sub_blks sm6115_vig_sblk_0 = 400 1186 _VIG_SBLK("0", 2, DPU_SSPP_SCALER_QSEED4); 401 - 402 - static const struct dpu_sspp_cfg sm6115_sspp[] = { 403 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 404 - sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 405 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 406 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 407 - }; 408 1187 409 1188 static const struct dpu_sspp_sub_blks sm8250_vig_sblk_0 = 410 1189 _VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4); ··· 358 1249 _VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED4); 359 1250 static const struct dpu_sspp_sub_blks sm8250_vig_sblk_3 = 360 1251 _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); 361 - 362 - static const struct dpu_sspp_cfg sm8250_sspp[] = { 363 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 364 - sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 365 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, 366 - sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 367 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, 368 - sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 369 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, 370 - sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 371 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 372 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 373 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 374 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 375 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 376 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 377 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, 378 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 379 - }; 380 - 381 - static const struct dpu_sspp_sub_blks sm8450_vig_sblk_0 = 382 - _VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4); 383 - static const struct dpu_sspp_sub_blks sm8450_vig_sblk_1 = 384 - _VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED4); 385 - static const struct dpu_sspp_sub_blks sm8450_vig_sblk_2 = 386 - _VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED4); 387 - static const struct dpu_sspp_sub_blks sm8450_vig_sblk_3 = 388 - _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); 389 - 390 - static const struct dpu_sspp_cfg sm8450_sspp[] = { 391 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 392 - sm8450_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 393 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, 394 - sm8450_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 395 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, 396 - sm8450_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 397 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, 398 - sm8450_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 399 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 400 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 401 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 402 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 403 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 404 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 405 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, 406 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 407 - }; 408 1252 409 1253 static const struct dpu_sspp_sub_blks sm8550_vig_sblk_0 = 410 1254 _VIG_SBLK("0", 7, DPU_SSPP_SCALER_QSEED4); ··· 369 1307 _VIG_SBLK("3", 10, DPU_SSPP_SCALER_QSEED4); 370 1308 static const struct dpu_sspp_sub_blks sm8550_dma_sblk_4 = _DMA_SBLK("12", 5); 371 1309 static const struct dpu_sspp_sub_blks sm8550_dma_sblk_5 = _DMA_SBLK("13", 6); 372 - 373 - static const struct dpu_sspp_cfg sm8550_sspp[] = { 374 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 375 - sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 376 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, 377 - sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 378 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, 379 - sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 380 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, 381 - sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 382 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 383 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 384 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 385 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 386 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_SDM845_MASK, 387 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 388 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_SDM845_MASK, 389 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 390 - SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, DMA_CURSOR_SDM845_MASK, 391 - sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4), 392 - SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, DMA_CURSOR_SDM845_MASK, 393 - sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5), 394 - }; 395 - 396 - static const struct dpu_sspp_cfg sc7280_sspp[] = { 397 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7280_MASK, 398 - sc7280_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 399 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 400 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 401 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_CURSOR_SDM845_MASK, 402 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 403 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 404 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 405 - }; 406 - 407 - static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_0 = 408 - _VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4); 409 - static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_1 = 410 - _VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED4); 411 - static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_2 = 412 - _VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED4); 413 - static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_3 = 414 - _VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); 415 - 416 - static const struct dpu_sspp_cfg sc8280xp_sspp[] = { 417 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, 418 - sc8280xp_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 419 - SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, 420 - sc8280xp_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 421 - SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, 422 - sc8280xp_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 423 - SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, 424 - sc8280xp_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 425 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 426 - sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 427 - SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 428 - sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 429 - SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 430 - sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), 431 - SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, 432 - sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), 433 - }; 434 1310 435 1311 #define _VIG_SBLK_NOSCALE(num, sdma_pri) \ 436 1312 { \ ··· 385 1385 386 1386 static const struct dpu_sspp_sub_blks qcm2290_vig_sblk_0 = _VIG_SBLK_NOSCALE("0", 2); 387 1387 static const struct dpu_sspp_sub_blks qcm2290_dma_sblk_0 = _DMA_SBLK("8", 1); 388 - 389 - static const struct dpu_sspp_cfg qcm2290_sspp[] = { 390 - SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_QCM2290_MASK, 391 - qcm2290_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 392 - SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 393 - qcm2290_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 394 - }; 395 1388 396 1389 /************************************************************* 397 1390 * MIXER sub blocks config ··· 412 1419 }, 413 1420 }; 414 1421 415 - static const struct dpu_lm_cfg msm8998_lm[] = { 416 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK, 417 - &msm8998_lm_sblk, PINGPONG_0, LM_2, DSPP_0), 418 - LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK, 419 - &msm8998_lm_sblk, PINGPONG_1, LM_5, DSPP_1), 420 - LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK, 421 - &msm8998_lm_sblk, PINGPONG_2, LM_0, 0), 422 - LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK, 423 - &msm8998_lm_sblk, PINGPONG_MAX, 0, 0), 424 - LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK, 425 - &msm8998_lm_sblk, PINGPONG_MAX, 0, 0), 426 - LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK, 427 - &msm8998_lm_sblk, PINGPONG_3, LM_1, 0), 428 - }; 429 - 430 1422 /* SDM845 */ 431 1423 432 1424 static const struct dpu_lm_sub_blks sdm845_lm_sblk = { ··· 421 1443 0x20, 0x38, 0x50, 0x68, 0x80, 0x98, 422 1444 0xb0, 0xc8, 0xe0, 0xf8, 0x110 423 1445 }, 424 - }; 425 - 426 - static const struct dpu_lm_cfg sdm845_lm[] = { 427 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 428 - &sdm845_lm_sblk, PINGPONG_0, LM_1, 0), 429 - LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 430 - &sdm845_lm_sblk, PINGPONG_1, LM_0, 0), 431 - LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 432 - &sdm845_lm_sblk, PINGPONG_2, LM_5, 0), 433 - LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK, 434 - &sdm845_lm_sblk, PINGPONG_MAX, 0, 0), 435 - LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK, 436 - &sdm845_lm_sblk, PINGPONG_MAX, 0, 0), 437 - LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 438 - &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 439 1446 }; 440 1447 441 1448 /* SC7180 */ ··· 433 1470 }, 434 1471 }; 435 1472 436 - static const struct dpu_lm_cfg sc7180_lm[] = { 437 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 438 - &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 439 - LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 440 - &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), 441 - }; 442 - 443 - /* SC8280XP */ 444 - 445 - static const struct dpu_lm_cfg sc8280xp_lm[] = { 446 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 447 - LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 448 - LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_2, LM_3, DSPP_2), 449 - LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_3, LM_2, DSPP_3), 450 - LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 451 - LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 452 - }; 453 - 454 - /* SM8150 */ 455 - 456 - static const struct dpu_lm_cfg sm8150_lm[] = { 457 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 458 - &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), 459 - LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, 460 - &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), 461 - LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 462 - &sdm845_lm_sblk, PINGPONG_2, LM_3, 0), 463 - LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 464 - &sdm845_lm_sblk, PINGPONG_3, LM_2, 0), 465 - LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, 466 - &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), 467 - LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, 468 - &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), 469 - }; 470 - 471 - static const struct dpu_lm_cfg sc7280_lm[] = { 472 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, 473 - &sc7180_lm_sblk, PINGPONG_0, 0, DSPP_0), 474 - LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, 475 - &sc7180_lm_sblk, PINGPONG_2, LM_3, 0), 476 - LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, 477 - &sc7180_lm_sblk, PINGPONG_3, LM_2, 0), 478 - }; 479 - 480 1473 /* QCM2290 */ 481 1474 482 1475 static const struct dpu_lm_sub_blks qcm2290_lm_sblk = { ··· 441 1522 .blendstage_base = { /* offsets relative to mixer base */ 442 1523 0x20, 0x38, 0x50, 0x68 443 1524 }, 444 - }; 445 - 446 - static const struct dpu_lm_cfg qcm2290_lm[] = { 447 - LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, 448 - &qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), 449 1525 }; 450 1526 451 1527 /************************************************************* ··· 470 1556 .features = _mask, \ 471 1557 .sblk = _sblk \ 472 1558 } 473 - 474 - static const struct dpu_dspp_cfg msm8998_dspp[] = { 475 - DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_MSM8998_MASK, 476 - &msm8998_dspp_sblk), 477 - DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_MSM8998_MASK, 478 - &msm8998_dspp_sblk), 479 - }; 480 - 481 - static const struct dpu_dspp_cfg sc7180_dspp[] = { 482 - DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 483 - &sc7180_dspp_sblk), 484 - }; 485 - 486 - static const struct dpu_dspp_cfg sm8150_dspp[] = { 487 - DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 488 - &sm8150_dspp_sblk), 489 - DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, 490 - &sm8150_dspp_sblk), 491 - DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, 492 - &sm8150_dspp_sblk), 493 - DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, 494 - &sm8150_dspp_sblk), 495 - }; 496 - 497 - static const struct dpu_dspp_cfg qcm2290_dspp[] = { 498 - DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, 499 - &sm8150_dspp_sblk), 500 - }; 501 1559 502 1560 /************************************************************* 503 1561 * PINGPONG sub blocks config ··· 522 1636 .intr_rdptr = _rdptr, \ 523 1637 } 524 1638 525 - static const struct dpu_pingpong_cfg sdm845_pp[] = { 526 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, 527 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 528 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 529 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, 530 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 531 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 532 - PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, 533 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 534 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 535 - PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, 536 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 537 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 538 - }; 539 - 540 - static struct dpu_pingpong_cfg sc7180_pp[] = { 541 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -1, -1), 542 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -1, -1), 543 - }; 544 - 545 - static struct dpu_pingpong_cfg sc8280xp_pp[] = { 546 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 547 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1), 548 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 549 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1), 550 - PP_BLK_TE("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk_te, 551 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1), 552 - PP_BLK_TE("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk_te, 553 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1), 554 - PP_BLK_TE("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk_te, 555 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1), 556 - PP_BLK_TE("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk_te, 557 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1), 558 - }; 559 - 560 - static const struct dpu_pingpong_cfg sm8150_pp[] = { 561 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te, 562 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 563 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 564 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te, 565 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 566 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 567 - PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, 568 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 569 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 570 - PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, 571 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 572 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 573 - PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, 574 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 575 - -1), 576 - PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, 577 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 578 - -1), 579 - }; 580 - 581 - static const struct dpu_pingpong_cfg sm8350_pp[] = { 582 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 583 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 584 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 585 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 586 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 587 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 588 - PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, 589 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 590 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 591 - PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, 592 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 593 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 594 - PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, 595 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 596 - -1), 597 - PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, 598 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 599 - -1), 600 - }; 601 - 602 - static const struct dpu_pingpong_cfg sc7280_pp[] = { 603 - PP_BLK("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1), 604 - PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), 605 - PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), 606 - PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), 607 - }; 608 - 609 - static struct dpu_pingpong_cfg qcm2290_pp[] = { 610 - PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, 611 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 612 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 613 - }; 614 - 615 - /* FIXME: interrupts */ 616 - static const struct dpu_pingpong_cfg sm8450_pp[] = { 617 - PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, 618 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 619 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), 620 - PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, 621 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 622 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), 623 - PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, 624 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 625 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), 626 - PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, 627 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 628 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), 629 - PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, 630 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 631 - -1), 632 - PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, 633 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 634 - -1), 635 - PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk, 636 - -1, 637 - -1), 638 - PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk, 639 - -1, 640 - -1), 641 - }; 642 - 643 - static const struct dpu_pingpong_cfg sm8550_pp[] = { 644 - PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, 645 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), 646 - -1), 647 - PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, 648 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), 649 - -1), 650 - PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, 651 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), 652 - -1), 653 - PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, 654 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), 655 - -1), 656 - PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, 657 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), 658 - -1), 659 - PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, 660 - DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), 661 - -1), 662 - PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk, 663 - -1, 664 - -1), 665 - PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk, 666 - -1, 667 - -1), 668 - }; 669 - 670 1639 /************************************************************* 671 1640 * MERGE_3D sub blocks config 672 1641 *************************************************************/ ··· 533 1792 .sblk = NULL \ 534 1793 } 535 1794 536 - static const struct dpu_merge_3d_cfg sm8150_merge_3d[] = { 537 - MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), 538 - MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), 539 - MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), 540 - }; 541 - 542 - static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = { 543 - MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 544 - MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 545 - MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 546 - }; 547 - 548 - static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = { 549 - MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 550 - MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 551 - MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 552 - MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00), 553 - }; 554 - 555 - static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = { 556 - MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), 557 - MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), 558 - MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), 559 - MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700), 560 - }; 561 - 562 1795 /************************************************************* 563 1796 * DSC sub blocks config 564 1797 *************************************************************/ ··· 543 1828 .features = _features, \ 544 1829 } 545 1830 546 - static struct dpu_dsc_cfg sdm845_dsc[] = { 547 - DSC_BLK("dsc_0", DSC_0, 0x80000, 0), 548 - DSC_BLK("dsc_1", DSC_1, 0x80400, 0), 549 - DSC_BLK("dsc_2", DSC_2, 0x80800, 0), 550 - DSC_BLK("dsc_3", DSC_3, 0x80c00, 0), 551 - }; 552 - 553 - static struct dpu_dsc_cfg sm8150_dsc[] = { 554 - DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), 555 - DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), 556 - DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), 557 - DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), 558 - }; 559 - 560 1831 /************************************************************* 561 1832 * INTF sub blocks config 562 1833 *************************************************************/ 563 - #define INTF_BLK(_name, _id, _base, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \ 1834 + #define INTF_BLK(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \ 564 1835 {\ 565 1836 .name = _name, .id = _id, \ 566 - .base = _base, .len = 0x280, \ 1837 + .base = _base, .len = _len, \ 567 1838 .features = _features, \ 568 1839 .type = _type, \ 569 1840 .controller_id = _ctrl_id, \ ··· 557 1856 .intr_underrun = DPU_IRQ_IDX(_reg, _underrun_bit), \ 558 1857 .intr_vsync = DPU_IRQ_IDX(_reg, _vsync_bit), \ 559 1858 } 560 - 561 - static const struct dpu_intf_cfg msm8998_intf[] = { 562 - INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 563 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 564 - INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 565 - INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 566 - }; 567 - 568 - static const struct dpu_intf_cfg sdm845_intf[] = { 569 - INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 570 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 571 - INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 572 - INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 573 - }; 574 - 575 - static const struct dpu_intf_cfg sc7180_intf[] = { 576 - INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 577 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 578 - }; 579 - 580 - static const struct dpu_intf_cfg sm8150_intf[] = { 581 - INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 582 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 583 - INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 584 - INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 585 - }; 586 - 587 - static const struct dpu_intf_cfg sc7280_intf[] = { 588 - INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 589 - INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 590 - INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 591 - }; 592 - 593 - static const struct dpu_intf_cfg sm8350_intf[] = { 594 - INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 595 - INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 596 - INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 597 - INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 598 - }; 599 - 600 - static const struct dpu_intf_cfg sc8180x_intf[] = { 601 - INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 602 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 603 - INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 604 - /* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */ 605 - INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 606 - INTF_BLK("intf_4", INTF_4, 0x6C000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21), 607 - INTF_BLK("intf_5", INTF_5, 0x6C800, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 608 - }; 609 - 610 - /* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */ 611 - static const struct dpu_intf_cfg sc8280xp_intf[] = { 612 - INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 613 - INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 614 - INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 615 - INTF_BLK("intf_3", INTF_3, 0x37000, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 616 - INTF_BLK("intf_4", INTF_4, 0x38000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21), 617 - INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), 618 - INTF_BLK("intf_6", INTF_6, 0x3a000, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17), 619 - INTF_BLK("intf_7", INTF_7, 0x3b000, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19), 620 - INTF_BLK("intf_8", INTF_8, 0x3c000, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13), 621 - }; 622 - 623 - static const struct dpu_intf_cfg qcm2290_intf[] = { 624 - INTF_BLK("intf_0", INTF_0, 0x00000, INTF_NONE, 0, 0, 0, 0, 0, 0), 625 - INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 626 - }; 627 - 628 - static const struct dpu_intf_cfg sm8450_intf[] = { 629 - INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 630 - INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 631 - INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 632 - INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 633 - }; 634 - 635 - static const struct dpu_intf_cfg sm8550_intf[] = { 636 - INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), 637 - /* TODO TE sub-blocks for intf1 & intf2 */ 638 - INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), 639 - INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), 640 - INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), 641 - }; 642 1859 643 1860 /************************************************************* 644 1861 * Writeback blocks config ··· 575 1956 .maxlinewidth = _max_linewidth, \ 576 1957 .intr_wb_done = DPU_IRQ_IDX(_reg, _wb_done_bit) \ 577 1958 } 578 - 579 - static const struct dpu_wb_cfg sm8250_wb[] = { 580 - WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, 581 - VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), 582 - }; 583 1959 584 1960 /************************************************************* 585 1961 * VBIF sub blocks config ··· 780 2166 {.fl = 0, .lut = 0x0}, 781 2167 }; 782 2168 783 - static const struct dpu_perf_cfg msm8998_perf_data = { 784 - .max_bw_low = 6700000, 785 - .max_bw_high = 6700000, 786 - .min_core_ib = 2400000, 787 - .min_llcc_ib = 800000, 788 - .min_dram_ib = 800000, 789 - .undersized_prefill_lines = 2, 790 - .xtra_prefill_lines = 2, 791 - .dest_scale_prefill_lines = 3, 792 - .macrotile_prefill_lines = 4, 793 - .yuv_nv12_prefill_lines = 8, 794 - .linear_prefill_lines = 1, 795 - .downscaling_prefill_lines = 1, 796 - .amortizable_threshold = 25, 797 - .min_prefill_lines = 25, 798 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 799 - .safe_lut_tbl = {0xfffc, 0xff00, 0xffff}, 800 - .qos_lut_tbl = { 801 - {.nentry = ARRAY_SIZE(msm8998_qos_linear), 802 - .entries = msm8998_qos_linear 803 - }, 804 - {.nentry = ARRAY_SIZE(msm8998_qos_macrotile), 805 - .entries = msm8998_qos_macrotile 806 - }, 807 - {.nentry = ARRAY_SIZE(msm8998_qos_nrt), 808 - .entries = msm8998_qos_nrt 809 - }, 810 - }, 811 - .cdp_cfg = { 812 - {.rd_enable = 1, .wr_enable = 1}, 813 - {.rd_enable = 1, .wr_enable = 0} 814 - }, 815 - .clk_inefficiency_factor = 200, 816 - .bw_inefficiency_factor = 120, 817 - }; 818 - 819 - static const struct dpu_perf_cfg sdm845_perf_data = { 820 - .max_bw_low = 6800000, 821 - .max_bw_high = 6800000, 822 - .min_core_ib = 2400000, 823 - .min_llcc_ib = 800000, 824 - .min_dram_ib = 800000, 825 - .undersized_prefill_lines = 2, 826 - .xtra_prefill_lines = 2, 827 - .dest_scale_prefill_lines = 3, 828 - .macrotile_prefill_lines = 4, 829 - .yuv_nv12_prefill_lines = 8, 830 - .linear_prefill_lines = 1, 831 - .downscaling_prefill_lines = 1, 832 - .amortizable_threshold = 25, 833 - .min_prefill_lines = 24, 834 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 835 - .safe_lut_tbl = {0xfff0, 0xf000, 0xffff}, 836 - .qos_lut_tbl = { 837 - {.nentry = ARRAY_SIZE(sdm845_qos_linear), 838 - .entries = sdm845_qos_linear 839 - }, 840 - {.nentry = ARRAY_SIZE(sdm845_qos_macrotile), 841 - .entries = sdm845_qos_macrotile 842 - }, 843 - {.nentry = ARRAY_SIZE(sdm845_qos_nrt), 844 - .entries = sdm845_qos_nrt 845 - }, 846 - }, 847 - .cdp_cfg = { 848 - {.rd_enable = 1, .wr_enable = 1}, 849 - {.rd_enable = 1, .wr_enable = 0} 850 - }, 851 - .clk_inefficiency_factor = 105, 852 - .bw_inefficiency_factor = 120, 853 - }; 854 - 855 - static const struct dpu_perf_cfg sc7180_perf_data = { 856 - .max_bw_low = 6800000, 857 - .max_bw_high = 6800000, 858 - .min_core_ib = 2400000, 859 - .min_llcc_ib = 800000, 860 - .min_dram_ib = 1600000, 861 - .min_prefill_lines = 24, 862 - .danger_lut_tbl = {0xff, 0xffff, 0x0}, 863 - .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 864 - .qos_lut_tbl = { 865 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 866 - .entries = sc7180_qos_linear 867 - }, 868 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 869 - .entries = sc7180_qos_macrotile 870 - }, 871 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 872 - .entries = sc7180_qos_nrt 873 - }, 874 - }, 875 - .cdp_cfg = { 876 - {.rd_enable = 1, .wr_enable = 1}, 877 - {.rd_enable = 1, .wr_enable = 0} 878 - }, 879 - .clk_inefficiency_factor = 105, 880 - .bw_inefficiency_factor = 120, 881 - }; 882 - 883 - static const struct dpu_perf_cfg sm6115_perf_data = { 884 - .max_bw_low = 3100000, 885 - .max_bw_high = 4000000, 886 - .min_core_ib = 2400000, 887 - .min_llcc_ib = 800000, 888 - .min_dram_ib = 800000, 889 - .min_prefill_lines = 24, 890 - .danger_lut_tbl = {0xff, 0xffff, 0x0}, 891 - .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 892 - .qos_lut_tbl = { 893 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 894 - .entries = sc7180_qos_linear 895 - }, 896 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 897 - .entries = sc7180_qos_macrotile 898 - }, 899 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 900 - .entries = sc7180_qos_nrt 901 - }, 902 - /* TODO: macrotile-qseed is different from macrotile */ 903 - }, 904 - .cdp_cfg = { 905 - {.rd_enable = 1, .wr_enable = 1}, 906 - {.rd_enable = 1, .wr_enable = 0} 907 - }, 908 - .clk_inefficiency_factor = 105, 909 - .bw_inefficiency_factor = 120, 910 - }; 911 - 912 - static const struct dpu_perf_cfg sm8150_perf_data = { 913 - .max_bw_low = 12800000, 914 - .max_bw_high = 12800000, 915 - .min_core_ib = 2400000, 916 - .min_llcc_ib = 800000, 917 - .min_dram_ib = 800000, 918 - .min_prefill_lines = 24, 919 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 920 - .safe_lut_tbl = {0xfff8, 0xf000, 0xffff}, 921 - .qos_lut_tbl = { 922 - {.nentry = ARRAY_SIZE(sm8150_qos_linear), 923 - .entries = sm8150_qos_linear 924 - }, 925 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 926 - .entries = sc7180_qos_macrotile 927 - }, 928 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 929 - .entries = sc7180_qos_nrt 930 - }, 931 - /* TODO: macrotile-qseed is different from macrotile */ 932 - }, 933 - .cdp_cfg = { 934 - {.rd_enable = 1, .wr_enable = 1}, 935 - {.rd_enable = 1, .wr_enable = 0} 936 - }, 937 - .clk_inefficiency_factor = 105, 938 - .bw_inefficiency_factor = 120, 939 - }; 940 - 941 - static const struct dpu_perf_cfg sc8180x_perf_data = { 942 - .max_bw_low = 9600000, 943 - .max_bw_high = 9600000, 944 - .min_core_ib = 2400000, 945 - .min_llcc_ib = 800000, 946 - .min_dram_ib = 800000, 947 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 948 - .qos_lut_tbl = { 949 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 950 - .entries = sc7180_qos_linear 951 - }, 952 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 953 - .entries = sc7180_qos_macrotile 954 - }, 955 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 956 - .entries = sc7180_qos_nrt 957 - }, 958 - /* TODO: macrotile-qseed is different from macrotile */ 959 - }, 960 - .cdp_cfg = { 961 - {.rd_enable = 1, .wr_enable = 1}, 962 - {.rd_enable = 1, .wr_enable = 0} 963 - }, 964 - .clk_inefficiency_factor = 105, 965 - .bw_inefficiency_factor = 120, 966 - }; 967 - 968 - static const struct dpu_perf_cfg sc8280xp_perf_data = { 969 - .max_bw_low = 13600000, 970 - .max_bw_high = 18200000, 971 - .min_core_ib = 2500000, 972 - .min_llcc_ib = 0, 973 - .min_dram_ib = 800000, 974 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 975 - .qos_lut_tbl = { 976 - {.nentry = ARRAY_SIZE(sc8180x_qos_linear), 977 - .entries = sc8180x_qos_linear 978 - }, 979 - {.nentry = ARRAY_SIZE(sc8180x_qos_macrotile), 980 - .entries = sc8180x_qos_macrotile 981 - }, 982 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 983 - .entries = sc7180_qos_nrt 984 - }, 985 - /* TODO: macrotile-qseed is different from macrotile */ 986 - }, 987 - .cdp_cfg = { 988 - {.rd_enable = 1, .wr_enable = 1}, 989 - {.rd_enable = 1, .wr_enable = 0} 990 - }, 991 - .clk_inefficiency_factor = 105, 992 - .bw_inefficiency_factor = 120, 993 - }; 994 - 995 - static const struct dpu_perf_cfg sm8250_perf_data = { 996 - .max_bw_low = 13700000, 997 - .max_bw_high = 16600000, 998 - .min_core_ib = 4800000, 999 - .min_llcc_ib = 0, 1000 - .min_dram_ib = 800000, 1001 - .min_prefill_lines = 35, 1002 - .danger_lut_tbl = {0xf, 0xffff, 0x0}, 1003 - .safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, 1004 - .qos_lut_tbl = { 1005 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 1006 - .entries = sc7180_qos_linear 1007 - }, 1008 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1009 - .entries = sc7180_qos_macrotile 1010 - }, 1011 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 1012 - .entries = sc7180_qos_nrt 1013 - }, 1014 - /* TODO: macrotile-qseed is different from macrotile */ 1015 - }, 1016 - .cdp_cfg = { 1017 - {.rd_enable = 1, .wr_enable = 1}, 1018 - {.rd_enable = 1, .wr_enable = 0} 1019 - }, 1020 - .clk_inefficiency_factor = 105, 1021 - .bw_inefficiency_factor = 120, 1022 - }; 1023 - 1024 - static const struct dpu_perf_cfg sm8450_perf_data = { 1025 - .max_bw_low = 13600000, 1026 - .max_bw_high = 18200000, 1027 - .min_core_ib = 2500000, 1028 - .min_llcc_ib = 0, 1029 - .min_dram_ib = 800000, 1030 - .min_prefill_lines = 35, 1031 - /* FIXME: lut tables */ 1032 - .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, 1033 - .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, 1034 - .qos_lut_tbl = { 1035 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 1036 - .entries = sc7180_qos_linear 1037 - }, 1038 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1039 - .entries = sc7180_qos_macrotile 1040 - }, 1041 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 1042 - .entries = sc7180_qos_nrt 1043 - }, 1044 - /* TODO: macrotile-qseed is different from macrotile */ 1045 - }, 1046 - .cdp_cfg = { 1047 - {.rd_enable = 1, .wr_enable = 1}, 1048 - {.rd_enable = 1, .wr_enable = 0} 1049 - }, 1050 - .clk_inefficiency_factor = 105, 1051 - .bw_inefficiency_factor = 120, 1052 - }; 1053 - 1054 - static const struct dpu_perf_cfg sc7280_perf_data = { 1055 - .max_bw_low = 4700000, 1056 - .max_bw_high = 8800000, 1057 - .min_core_ib = 2500000, 1058 - .min_llcc_ib = 0, 1059 - .min_dram_ib = 1600000, 1060 - .min_prefill_lines = 24, 1061 - .danger_lut_tbl = {0xffff, 0xffff, 0x0}, 1062 - .safe_lut_tbl = {0xff00, 0xff00, 0xffff}, 1063 - .qos_lut_tbl = { 1064 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1065 - .entries = sc7180_qos_macrotile 1066 - }, 1067 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1068 - .entries = sc7180_qos_macrotile 1069 - }, 1070 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 1071 - .entries = sc7180_qos_nrt 1072 - }, 1073 - }, 1074 - .cdp_cfg = { 1075 - {.rd_enable = 1, .wr_enable = 1}, 1076 - {.rd_enable = 1, .wr_enable = 0} 1077 - }, 1078 - .clk_inefficiency_factor = 105, 1079 - .bw_inefficiency_factor = 120, 1080 - }; 1081 - 1082 - static const struct dpu_perf_cfg sm8350_perf_data = { 1083 - .max_bw_low = 11800000, 1084 - .max_bw_high = 15500000, 1085 - .min_core_ib = 2500000, 1086 - .min_llcc_ib = 0, 1087 - .min_dram_ib = 800000, 1088 - .min_prefill_lines = 40, 1089 - /* FIXME: lut tables */ 1090 - .danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, 1091 - .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, 1092 - .qos_lut_tbl = { 1093 - {.nentry = ARRAY_SIZE(sc7180_qos_linear), 1094 - .entries = sc7180_qos_linear 1095 - }, 1096 - {.nentry = ARRAY_SIZE(sc7180_qos_macrotile), 1097 - .entries = sc7180_qos_macrotile 1098 - }, 1099 - {.nentry = ARRAY_SIZE(sc7180_qos_nrt), 1100 - .entries = sc7180_qos_nrt 1101 - }, 1102 - /* TODO: macrotile-qseed is different from macrotile */ 1103 - }, 1104 - .cdp_cfg = { 1105 - {.rd_enable = 1, .wr_enable = 1}, 1106 - {.rd_enable = 1, .wr_enable = 0} 1107 - }, 1108 - .clk_inefficiency_factor = 105, 1109 - .bw_inefficiency_factor = 120, 1110 - }; 1111 - 1112 - static const struct dpu_perf_cfg qcm2290_perf_data = { 1113 - .max_bw_low = 2700000, 1114 - .max_bw_high = 2700000, 1115 - .min_core_ib = 1300000, 1116 - .min_llcc_ib = 0, 1117 - .min_dram_ib = 1600000, 1118 - .min_prefill_lines = 24, 1119 - .danger_lut_tbl = {0xff, 0x0, 0x0}, 1120 - .safe_lut_tbl = {0xfff0, 0x0, 0x0}, 1121 - .qos_lut_tbl = { 1122 - {.nentry = ARRAY_SIZE(qcm2290_qos_linear), 1123 - .entries = qcm2290_qos_linear 1124 - }, 1125 - }, 1126 - .cdp_cfg = { 1127 - {.rd_enable = 1, .wr_enable = 1}, 1128 - {.rd_enable = 1, .wr_enable = 0} 1129 - }, 1130 - .clk_inefficiency_factor = 105, 1131 - .bw_inefficiency_factor = 120, 1132 - }; 1133 2169 /************************************************************* 1134 2170 * Hardware catalog 1135 2171 *************************************************************/ 1136 2172 1137 - static const struct dpu_mdss_cfg msm8998_dpu_cfg = { 1138 - .caps = &msm8998_dpu_caps, 1139 - .mdp_count = ARRAY_SIZE(msm8998_mdp), 1140 - .mdp = msm8998_mdp, 1141 - .ctl_count = ARRAY_SIZE(msm8998_ctl), 1142 - .ctl = msm8998_ctl, 1143 - .sspp_count = ARRAY_SIZE(msm8998_sspp), 1144 - .sspp = msm8998_sspp, 1145 - .mixer_count = ARRAY_SIZE(msm8998_lm), 1146 - .mixer = msm8998_lm, 1147 - .dspp_count = ARRAY_SIZE(msm8998_dspp), 1148 - .dspp = msm8998_dspp, 1149 - .pingpong_count = ARRAY_SIZE(sdm845_pp), 1150 - .pingpong = sdm845_pp, 1151 - .intf_count = ARRAY_SIZE(msm8998_intf), 1152 - .intf = msm8998_intf, 1153 - .vbif_count = ARRAY_SIZE(msm8998_vbif), 1154 - .vbif = msm8998_vbif, 1155 - .reg_dma_count = 0, 1156 - .perf = &msm8998_perf_data, 1157 - .mdss_irqs = IRQ_SM8250_MASK, 1158 - }; 2173 + #include "catalog/dpu_3_0_msm8998.h" 1159 2174 1160 - static const struct dpu_mdss_cfg sdm845_dpu_cfg = { 1161 - .caps = &sdm845_dpu_caps, 1162 - .mdp_count = ARRAY_SIZE(sdm845_mdp), 1163 - .mdp = sdm845_mdp, 1164 - .ctl_count = ARRAY_SIZE(sdm845_ctl), 1165 - .ctl = sdm845_ctl, 1166 - .sspp_count = ARRAY_SIZE(sdm845_sspp), 1167 - .sspp = sdm845_sspp, 1168 - .mixer_count = ARRAY_SIZE(sdm845_lm), 1169 - .mixer = sdm845_lm, 1170 - .pingpong_count = ARRAY_SIZE(sdm845_pp), 1171 - .pingpong = sdm845_pp, 1172 - .dsc_count = ARRAY_SIZE(sdm845_dsc), 1173 - .dsc = sdm845_dsc, 1174 - .intf_count = ARRAY_SIZE(sdm845_intf), 1175 - .intf = sdm845_intf, 1176 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1177 - .vbif = sdm845_vbif, 1178 - .reg_dma_count = 1, 1179 - .dma_cfg = &sdm845_regdma, 1180 - .perf = &sdm845_perf_data, 1181 - .mdss_irqs = IRQ_SDM845_MASK, 1182 - }; 2175 + #include "catalog/dpu_4_0_sdm845.h" 1183 2176 1184 - static const struct dpu_mdss_cfg sc7180_dpu_cfg = { 1185 - .caps = &sc7180_dpu_caps, 1186 - .mdp_count = ARRAY_SIZE(sc7180_mdp), 1187 - .mdp = sc7180_mdp, 1188 - .ctl_count = ARRAY_SIZE(sc7180_ctl), 1189 - .ctl = sc7180_ctl, 1190 - .sspp_count = ARRAY_SIZE(sc7180_sspp), 1191 - .sspp = sc7180_sspp, 1192 - .mixer_count = ARRAY_SIZE(sc7180_lm), 1193 - .mixer = sc7180_lm, 1194 - .dspp_count = ARRAY_SIZE(sc7180_dspp), 1195 - .dspp = sc7180_dspp, 1196 - .pingpong_count = ARRAY_SIZE(sc7180_pp), 1197 - .pingpong = sc7180_pp, 1198 - .intf_count = ARRAY_SIZE(sc7180_intf), 1199 - .intf = sc7180_intf, 1200 - .wb_count = ARRAY_SIZE(sm8250_wb), 1201 - .wb = sm8250_wb, 1202 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1203 - .vbif = sdm845_vbif, 1204 - .reg_dma_count = 1, 1205 - .dma_cfg = &sdm845_regdma, 1206 - .perf = &sc7180_perf_data, 1207 - .mdss_irqs = IRQ_SC7180_MASK, 1208 - }; 2177 + #include "catalog/dpu_5_0_sm8150.h" 2178 + #include "catalog/dpu_5_1_sc8180x.h" 1209 2179 1210 - static const struct dpu_mdss_cfg sm6115_dpu_cfg = { 1211 - .caps = &sm6115_dpu_caps, 1212 - .mdp_count = ARRAY_SIZE(sm6115_mdp), 1213 - .mdp = sm6115_mdp, 1214 - .ctl_count = ARRAY_SIZE(qcm2290_ctl), 1215 - .ctl = qcm2290_ctl, 1216 - .sspp_count = ARRAY_SIZE(sm6115_sspp), 1217 - .sspp = sm6115_sspp, 1218 - .mixer_count = ARRAY_SIZE(qcm2290_lm), 1219 - .mixer = qcm2290_lm, 1220 - .dspp_count = ARRAY_SIZE(qcm2290_dspp), 1221 - .dspp = qcm2290_dspp, 1222 - .pingpong_count = ARRAY_SIZE(qcm2290_pp), 1223 - .pingpong = qcm2290_pp, 1224 - .intf_count = ARRAY_SIZE(qcm2290_intf), 1225 - .intf = qcm2290_intf, 1226 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1227 - .vbif = sdm845_vbif, 1228 - .perf = &sm6115_perf_data, 1229 - .mdss_irqs = IRQ_SC7180_MASK, 1230 - }; 2180 + #include "catalog/dpu_6_0_sm8250.h" 2181 + #include "catalog/dpu_6_2_sc7180.h" 2182 + #include "catalog/dpu_6_3_sm6115.h" 2183 + #include "catalog/dpu_6_5_qcm2290.h" 1231 2184 1232 - static const struct dpu_mdss_cfg sm8150_dpu_cfg = { 1233 - .caps = &sm8150_dpu_caps, 1234 - .mdp_count = ARRAY_SIZE(sdm845_mdp), 1235 - .mdp = sdm845_mdp, 1236 - .ctl_count = ARRAY_SIZE(sm8150_ctl), 1237 - .ctl = sm8150_ctl, 1238 - .sspp_count = ARRAY_SIZE(sdm845_sspp), 1239 - .sspp = sdm845_sspp, 1240 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1241 - .mixer = sm8150_lm, 1242 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1243 - .dspp = sm8150_dspp, 1244 - .dsc_count = ARRAY_SIZE(sm8150_dsc), 1245 - .dsc = sm8150_dsc, 1246 - .pingpong_count = ARRAY_SIZE(sm8150_pp), 1247 - .pingpong = sm8150_pp, 1248 - .merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), 1249 - .merge_3d = sm8150_merge_3d, 1250 - .intf_count = ARRAY_SIZE(sm8150_intf), 1251 - .intf = sm8150_intf, 1252 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1253 - .vbif = sdm845_vbif, 1254 - .reg_dma_count = 1, 1255 - .dma_cfg = &sm8150_regdma, 1256 - .perf = &sm8150_perf_data, 1257 - .mdss_irqs = IRQ_SDM845_MASK, 1258 - }; 2185 + #include "catalog/dpu_7_0_sm8350.h" 2186 + #include "catalog/dpu_7_2_sc7280.h" 1259 2187 1260 - static const struct dpu_mdss_cfg sc8180x_dpu_cfg = { 1261 - .caps = &sc8180x_dpu_caps, 1262 - .mdp_count = ARRAY_SIZE(sc8180x_mdp), 1263 - .mdp = sc8180x_mdp, 1264 - .ctl_count = ARRAY_SIZE(sm8150_ctl), 1265 - .ctl = sm8150_ctl, 1266 - .sspp_count = ARRAY_SIZE(sdm845_sspp), 1267 - .sspp = sdm845_sspp, 1268 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1269 - .mixer = sm8150_lm, 1270 - .pingpong_count = ARRAY_SIZE(sm8150_pp), 1271 - .pingpong = sm8150_pp, 1272 - .merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), 1273 - .merge_3d = sm8150_merge_3d, 1274 - .intf_count = ARRAY_SIZE(sc8180x_intf), 1275 - .intf = sc8180x_intf, 1276 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1277 - .vbif = sdm845_vbif, 1278 - .reg_dma_count = 1, 1279 - .dma_cfg = &sm8150_regdma, 1280 - .perf = &sc8180x_perf_data, 1281 - .mdss_irqs = IRQ_SC8180X_MASK, 1282 - }; 2188 + #include "catalog/dpu_8_0_sc8280xp.h" 2189 + #include "catalog/dpu_8_1_sm8450.h" 1283 2190 1284 - static const struct dpu_mdss_cfg sc8280xp_dpu_cfg = { 1285 - .caps = &sc8280xp_dpu_caps, 1286 - .mdp_count = ARRAY_SIZE(sc8280xp_mdp), 1287 - .mdp = sc8280xp_mdp, 1288 - .ctl_count = ARRAY_SIZE(sc8280xp_ctl), 1289 - .ctl = sc8280xp_ctl, 1290 - .sspp_count = ARRAY_SIZE(sc8280xp_sspp), 1291 - .sspp = sc8280xp_sspp, 1292 - .mixer_count = ARRAY_SIZE(sc8280xp_lm), 1293 - .mixer = sc8280xp_lm, 1294 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1295 - .dspp = sm8150_dspp, 1296 - .pingpong_count = ARRAY_SIZE(sc8280xp_pp), 1297 - .pingpong = sc8280xp_pp, 1298 - .merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), 1299 - .merge_3d = sm8350_merge_3d, 1300 - .intf_count = ARRAY_SIZE(sc8280xp_intf), 1301 - .intf = sc8280xp_intf, 1302 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1303 - .vbif = sdm845_vbif, 1304 - .reg_dma_count = 1, 1305 - .dma_cfg = &sc8280xp_regdma, 1306 - .perf = &sc8280xp_perf_data, 1307 - .mdss_irqs = IRQ_SC8280XP_MASK, 1308 - }; 1309 - 1310 - static const struct dpu_mdss_cfg sm8250_dpu_cfg = { 1311 - .caps = &sm8250_dpu_caps, 1312 - .mdp_count = ARRAY_SIZE(sm8250_mdp), 1313 - .mdp = sm8250_mdp, 1314 - .ctl_count = ARRAY_SIZE(sm8150_ctl), 1315 - .ctl = sm8150_ctl, 1316 - .sspp_count = ARRAY_SIZE(sm8250_sspp), 1317 - .sspp = sm8250_sspp, 1318 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1319 - .mixer = sm8150_lm, 1320 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1321 - .dspp = sm8150_dspp, 1322 - .dsc_count = ARRAY_SIZE(sm8150_dsc), 1323 - .dsc = sm8150_dsc, 1324 - .pingpong_count = ARRAY_SIZE(sm8150_pp), 1325 - .pingpong = sm8150_pp, 1326 - .merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), 1327 - .merge_3d = sm8150_merge_3d, 1328 - .intf_count = ARRAY_SIZE(sm8150_intf), 1329 - .intf = sm8150_intf, 1330 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1331 - .vbif = sdm845_vbif, 1332 - .wb_count = ARRAY_SIZE(sm8250_wb), 1333 - .wb = sm8250_wb, 1334 - .reg_dma_count = 1, 1335 - .dma_cfg = &sm8250_regdma, 1336 - .perf = &sm8250_perf_data, 1337 - .mdss_irqs = IRQ_SM8250_MASK, 1338 - }; 1339 - 1340 - static const struct dpu_mdss_cfg sm8350_dpu_cfg = { 1341 - .caps = &sm8350_dpu_caps, 1342 - .mdp_count = ARRAY_SIZE(sm8350_mdp), 1343 - .mdp = sm8350_mdp, 1344 - .ctl_count = ARRAY_SIZE(sm8350_ctl), 1345 - .ctl = sm8350_ctl, 1346 - .sspp_count = ARRAY_SIZE(sm8250_sspp), 1347 - .sspp = sm8250_sspp, 1348 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1349 - .mixer = sm8150_lm, 1350 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1351 - .dspp = sm8150_dspp, 1352 - .pingpong_count = ARRAY_SIZE(sm8350_pp), 1353 - .pingpong = sm8350_pp, 1354 - .merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), 1355 - .merge_3d = sm8350_merge_3d, 1356 - .intf_count = ARRAY_SIZE(sm8350_intf), 1357 - .intf = sm8350_intf, 1358 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1359 - .vbif = sdm845_vbif, 1360 - .reg_dma_count = 1, 1361 - .dma_cfg = &sm8350_regdma, 1362 - .perf = &sm8350_perf_data, 1363 - .mdss_irqs = IRQ_SM8350_MASK, 1364 - }; 1365 - 1366 - static const struct dpu_mdss_cfg sm8450_dpu_cfg = { 1367 - .caps = &sm8450_dpu_caps, 1368 - .mdp_count = ARRAY_SIZE(sm8450_mdp), 1369 - .mdp = sm8450_mdp, 1370 - .ctl_count = ARRAY_SIZE(sm8450_ctl), 1371 - .ctl = sm8450_ctl, 1372 - .sspp_count = ARRAY_SIZE(sm8450_sspp), 1373 - .sspp = sm8450_sspp, 1374 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1375 - .mixer = sm8150_lm, 1376 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1377 - .dspp = sm8150_dspp, 1378 - .pingpong_count = ARRAY_SIZE(sm8450_pp), 1379 - .pingpong = sm8450_pp, 1380 - .merge_3d_count = ARRAY_SIZE(sm8450_merge_3d), 1381 - .merge_3d = sm8450_merge_3d, 1382 - .intf_count = ARRAY_SIZE(sm8450_intf), 1383 - .intf = sm8450_intf, 1384 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1385 - .vbif = sdm845_vbif, 1386 - .reg_dma_count = 1, 1387 - .dma_cfg = &sm8450_regdma, 1388 - .perf = &sm8450_perf_data, 1389 - .mdss_irqs = IRQ_SM8450_MASK, 1390 - }; 1391 - 1392 - static const struct dpu_mdss_cfg sm8550_dpu_cfg = { 1393 - .caps = &sm8550_dpu_caps, 1394 - .mdp_count = ARRAY_SIZE(sm8550_mdp), 1395 - .mdp = sm8550_mdp, 1396 - .ctl_count = ARRAY_SIZE(sm8550_ctl), 1397 - .ctl = sm8550_ctl, 1398 - .sspp_count = ARRAY_SIZE(sm8550_sspp), 1399 - .sspp = sm8550_sspp, 1400 - .mixer_count = ARRAY_SIZE(sm8150_lm), 1401 - .mixer = sm8150_lm, 1402 - .dspp_count = ARRAY_SIZE(sm8150_dspp), 1403 - .dspp = sm8150_dspp, 1404 - .pingpong_count = ARRAY_SIZE(sm8550_pp), 1405 - .pingpong = sm8550_pp, 1406 - .merge_3d_count = ARRAY_SIZE(sm8550_merge_3d), 1407 - .merge_3d = sm8550_merge_3d, 1408 - .intf_count = ARRAY_SIZE(sm8550_intf), 1409 - .intf = sm8550_intf, 1410 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1411 - .vbif = sdm845_vbif, 1412 - .reg_dma_count = 1, 1413 - .dma_cfg = &sm8450_regdma, 1414 - .perf = &sm8450_perf_data, 1415 - .mdss_irqs = IRQ_SM8450_MASK, 1416 - }; 1417 - 1418 - static const struct dpu_mdss_cfg sc7280_dpu_cfg = { 1419 - .caps = &sc7280_dpu_caps, 1420 - .mdp_count = ARRAY_SIZE(sc7280_mdp), 1421 - .mdp = sc7280_mdp, 1422 - .ctl_count = ARRAY_SIZE(sc7280_ctl), 1423 - .ctl = sc7280_ctl, 1424 - .sspp_count = ARRAY_SIZE(sc7280_sspp), 1425 - .sspp = sc7280_sspp, 1426 - .dspp_count = ARRAY_SIZE(sc7180_dspp), 1427 - .dspp = sc7180_dspp, 1428 - .mixer_count = ARRAY_SIZE(sc7280_lm), 1429 - .mixer = sc7280_lm, 1430 - .pingpong_count = ARRAY_SIZE(sc7280_pp), 1431 - .pingpong = sc7280_pp, 1432 - .intf_count = ARRAY_SIZE(sc7280_intf), 1433 - .intf = sc7280_intf, 1434 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1435 - .vbif = sdm845_vbif, 1436 - .perf = &sc7280_perf_data, 1437 - .mdss_irqs = IRQ_SC7280_MASK, 1438 - }; 1439 - 1440 - static const struct dpu_mdss_cfg qcm2290_dpu_cfg = { 1441 - .caps = &qcm2290_dpu_caps, 1442 - .mdp_count = ARRAY_SIZE(qcm2290_mdp), 1443 - .mdp = qcm2290_mdp, 1444 - .ctl_count = ARRAY_SIZE(qcm2290_ctl), 1445 - .ctl = qcm2290_ctl, 1446 - .sspp_count = ARRAY_SIZE(qcm2290_sspp), 1447 - .sspp = qcm2290_sspp, 1448 - .mixer_count = ARRAY_SIZE(qcm2290_lm), 1449 - .mixer = qcm2290_lm, 1450 - .dspp_count = ARRAY_SIZE(qcm2290_dspp), 1451 - .dspp = qcm2290_dspp, 1452 - .pingpong_count = ARRAY_SIZE(qcm2290_pp), 1453 - .pingpong = qcm2290_pp, 1454 - .intf_count = ARRAY_SIZE(qcm2290_intf), 1455 - .intf = qcm2290_intf, 1456 - .vbif_count = ARRAY_SIZE(sdm845_vbif), 1457 - .vbif = sdm845_vbif, 1458 - .perf = &qcm2290_perf_data, 1459 - .mdss_irqs = IRQ_SC7180_MASK, 1460 - }; 1461 - 1462 - static const struct dpu_mdss_hw_cfg_handler cfg_handler[] = { 1463 - { .hw_rev = DPU_HW_VER_300, .dpu_cfg = &msm8998_dpu_cfg}, 1464 - { .hw_rev = DPU_HW_VER_301, .dpu_cfg = &msm8998_dpu_cfg}, 1465 - { .hw_rev = DPU_HW_VER_400, .dpu_cfg = &sdm845_dpu_cfg}, 1466 - { .hw_rev = DPU_HW_VER_401, .dpu_cfg = &sdm845_dpu_cfg}, 1467 - { .hw_rev = DPU_HW_VER_500, .dpu_cfg = &sm8150_dpu_cfg}, 1468 - { .hw_rev = DPU_HW_VER_501, .dpu_cfg = &sm8150_dpu_cfg}, 1469 - { .hw_rev = DPU_HW_VER_510, .dpu_cfg = &sc8180x_dpu_cfg}, 1470 - { .hw_rev = DPU_HW_VER_600, .dpu_cfg = &sm8250_dpu_cfg}, 1471 - { .hw_rev = DPU_HW_VER_620, .dpu_cfg = &sc7180_dpu_cfg}, 1472 - { .hw_rev = DPU_HW_VER_630, .dpu_cfg = &sm6115_dpu_cfg}, 1473 - { .hw_rev = DPU_HW_VER_650, .dpu_cfg = &qcm2290_dpu_cfg}, 1474 - { .hw_rev = DPU_HW_VER_700, .dpu_cfg = &sm8350_dpu_cfg}, 1475 - { .hw_rev = DPU_HW_VER_720, .dpu_cfg = &sc7280_dpu_cfg}, 1476 - { .hw_rev = DPU_HW_VER_800, .dpu_cfg = &sc8280xp_dpu_cfg}, 1477 - { .hw_rev = DPU_HW_VER_810, .dpu_cfg = &sm8450_dpu_cfg}, 1478 - { .hw_rev = DPU_HW_VER_900, .dpu_cfg = &sm8550_dpu_cfg}, 1479 - }; 1480 - 1481 - const struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev) 1482 - { 1483 - int i; 1484 - 1485 - for (i = 0; i < ARRAY_SIZE(cfg_handler); i++) { 1486 - if (cfg_handler[i].hw_rev == hw_rev) 1487 - return cfg_handler[i].dpu_cfg; 1488 - } 1489 - 1490 - DPU_ERROR("unsupported chipset id:%X\n", hw_rev); 1491 - 1492 - return ERR_PTR(-ENODEV); 1493 - } 1494 - 2191 + #include "catalog/dpu_9_0_sm8550.h"
+39 -67
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
··· 19 19 */ 20 20 #define MAX_BLOCKS 12 21 21 22 - #define DPU_HW_VER(MAJOR, MINOR, STEP) (((MAJOR & 0xF) << 28) |\ 23 - ((MINOR & 0xFFF) << 16) |\ 24 - (STEP & 0xFFFF)) 25 - 26 - #define DPU_HW_MAJOR(rev) ((rev) >> 28) 27 - #define DPU_HW_MINOR(rev) (((rev) >> 16) & 0xFFF) 28 - #define DPU_HW_STEP(rev) ((rev) & 0xFFFF) 29 - #define DPU_HW_MAJOR_MINOR(rev) ((rev) >> 16) 30 - 31 - #define IS_DPU_MAJOR_MINOR_SAME(rev1, rev2) \ 32 - (DPU_HW_MAJOR_MINOR((rev1)) == DPU_HW_MAJOR_MINOR((rev2))) 33 - 34 - #define DPU_HW_VER_170 DPU_HW_VER(1, 7, 0) /* 8996 v1.0 */ 35 - #define DPU_HW_VER_171 DPU_HW_VER(1, 7, 1) /* 8996 v2.0 */ 36 - #define DPU_HW_VER_172 DPU_HW_VER(1, 7, 2) /* 8996 v3.0 */ 37 - #define DPU_HW_VER_300 DPU_HW_VER(3, 0, 0) /* 8998 v1.0 */ 38 - #define DPU_HW_VER_301 DPU_HW_VER(3, 0, 1) /* 8998 v1.1 */ 39 - #define DPU_HW_VER_400 DPU_HW_VER(4, 0, 0) /* sdm845 v1.0 */ 40 - #define DPU_HW_VER_401 DPU_HW_VER(4, 0, 1) /* sdm845 v2.0 */ 41 - #define DPU_HW_VER_410 DPU_HW_VER(4, 1, 0) /* sdm670 v1.0 */ 42 - #define DPU_HW_VER_500 DPU_HW_VER(5, 0, 0) /* sm8150 v1.0 */ 43 - #define DPU_HW_VER_501 DPU_HW_VER(5, 0, 1) /* sm8150 v2.0 */ 44 - #define DPU_HW_VER_510 DPU_HW_VER(5, 1, 1) /* sc8180 */ 45 - #define DPU_HW_VER_600 DPU_HW_VER(6, 0, 0) /* sm8250 */ 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 */ 48 - #define DPU_HW_VER_650 DPU_HW_VER(6, 5, 0) /* qcm2290|sm4125 */ 49 - #define DPU_HW_VER_700 DPU_HW_VER(7, 0, 0) /* sm8350 */ 50 - #define DPU_HW_VER_720 DPU_HW_VER(7, 2, 0) /* sc7280 */ 51 - #define DPU_HW_VER_800 DPU_HW_VER(8, 0, 0) /* sc8280xp */ 52 - #define DPU_HW_VER_810 DPU_HW_VER(8, 1, 0) /* sm8450 */ 53 - #define DPU_HW_VER_900 DPU_HW_VER(9, 0, 0) /* sm8550 */ 54 - 55 - #define IS_MSM8996_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_170) 56 - #define IS_MSM8998_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_300) 57 - #define IS_SDM845_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_400) 58 - #define IS_SDM670_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_410) 59 - #define IS_SDM855_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_500) 60 - #define IS_SC7180_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_620) 61 - #define IS_SC7280_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_720) 62 - 63 22 #define DPU_HW_BLK_NAME_LEN 16 64 23 65 24 #define MAX_IMG_WIDTH 0x3fff ··· 128 169 * DSPP sub-blocks 129 170 * @DPU_DSPP_PCC Panel color correction block 130 171 * @DPU_DSPP_GC Gamma correction block 172 + * @DPU_DSPP_IGC Inverse gamma correction block 131 173 */ 132 174 enum { 133 175 DPU_DSPP_PCC = 0x1, 134 176 DPU_DSPP_GC, 177 + DPU_DSPP_IGC, 135 178 DPU_DSPP_MAX 136 179 }; 137 180 ··· 161 200 * @DPU_CTL_FETCH_ACTIVE: Active CTL for fetch HW (SSPPs) 162 201 * @DPU_CTL_VM_CFG: CTL config to support multiple VMs 163 202 * @DPU_CTL_HAS_LAYER_EXT4: CTL has the CTL_LAYER_EXT4 register 203 + * @DPU_CTL_DSPP_BLOCK_FLUSH: CTL config to support dspp sub-block flush 164 204 * @DPU_CTL_MAX 165 205 */ 166 206 enum { ··· 170 208 DPU_CTL_FETCH_ACTIVE, 171 209 DPU_CTL_VM_CFG, 172 210 DPU_CTL_HAS_LAYER_EXT4, 211 + DPU_CTL_DSPP_SUB_BLOCK_FLUSH, 173 212 DPU_CTL_MAX 174 213 }; 175 214 176 215 /** 177 216 * INTF sub-blocks 178 - * @DPU_INTF_INPUT_CTRL Supports the setting of pp block from which 179 - * pixel data arrives to this INTF 180 - * @DPU_INTF_TE INTF block has TE configuration support 181 - * @DPU_DATA_HCTL_EN Allows data to be transferred at different rate 182 - than video timing 217 + * @DPU_INTF_INPUT_CTRL Supports the setting of pp block from which 218 + * pixel data arrives to this INTF 219 + * @DPU_INTF_TE INTF block has TE configuration support 220 + * @DPU_DATA_HCTL_EN Allows data to be transferred at different rate 221 + * than video timing 222 + * @DPU_INTF_STATUS_SUPPORTED INTF block has INTF_STATUS register 183 223 * @DPU_INTF_MAX 184 224 */ 185 225 enum { 186 226 DPU_INTF_INPUT_CTRL = 0x1, 187 227 DPU_INTF_TE, 188 228 DPU_DATA_HCTL_EN, 229 + DPU_INTF_STATUS_SUPPORTED, 189 230 DPU_INTF_MAX 190 231 }; 191 232 ··· 358 393 * @max_mixer_blendstages max layer mixer blend stages or 359 394 * supported z order 360 395 * @qseed_type qseed2 or qseed3 support. 361 - * @smart_dma_rev Supported version of SmartDMA feature. 362 - * @ubwc_version UBWC feature version (0x0 for not supported) 363 396 * @has_src_split source split feature status 364 397 * @has_dim_layer dim layer feature status 365 398 * @has_idle_pc indicate if idle power collapse feature is supported ··· 371 408 u32 max_mixer_width; 372 409 u32 max_mixer_blendstages; 373 410 u32 qseed_type; 374 - u32 smart_dma_rev; 375 - u32 ubwc_version; 376 411 bool has_src_split; 377 412 bool has_dim_layer; 378 413 bool has_idle_pc; ··· 499 538 * @id: index identifying this block 500 539 * @base: register base offset to mdss 501 540 * @features bit mask identifying sub-blocks/features 502 - * @highest_bank_bit: UBWC parameter 503 - * @ubwc_swizzle: ubwc default swizzle setting 504 541 * @clk_ctrls clock control register definition 505 542 */ 506 543 struct dpu_mdp_cfg { 507 544 DPU_HW_BLK_INFO; 545 + struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX]; 546 + }; 547 + 548 + /** 549 + * struct dpu_ubwc_cfg - UBWC and memory configuration 550 + * 551 + * @ubwc_version UBWC feature version (0x0 for not supported) 552 + * @highest_bank_bit: UBWC parameter 553 + * @ubwc_swizzle: ubwc default swizzle setting 554 + */ 555 + struct dpu_ubwc_cfg { 556 + u32 ubwc_version; 508 557 u32 highest_bank_bit; 509 558 u32 ubwc_swizzle; 510 - struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX]; 511 559 }; 512 560 513 561 /* struct dpu_ctl_cfg : MDP CTL instance info ··· 818 848 struct dpu_mdss_cfg { 819 849 const struct dpu_caps *caps; 820 850 851 + const struct dpu_ubwc_cfg *ubwc; 852 + 821 853 u32 mdp_count; 822 854 const struct dpu_mdp_cfg *mdp; 823 855 ··· 839 867 const struct dpu_merge_3d_cfg *merge_3d; 840 868 841 869 u32 dsc_count; 842 - struct dpu_dsc_cfg *dsc; 870 + const struct dpu_dsc_cfg *dsc; 843 871 844 872 u32 intf_count; 845 873 const struct dpu_intf_cfg *intf; ··· 868 896 unsigned long mdss_irqs; 869 897 }; 870 898 871 - struct dpu_mdss_hw_cfg_handler { 872 - u32 hw_rev; 873 - const struct dpu_mdss_cfg *dpu_cfg; 874 - }; 875 - 876 - /** 877 - * dpu_hw_catalog_init - dpu hardware catalog init API retrieves 878 - * hardcoded target specific catalog information in config structure 879 - * @hw_rev: caller needs provide the hardware revision. 880 - * 881 - * Return: dpu config structure 882 - */ 883 - const struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev); 899 + extern const struct dpu_mdss_cfg dpu_msm8998_cfg; 900 + extern const struct dpu_mdss_cfg dpu_sdm845_cfg; 901 + extern const struct dpu_mdss_cfg dpu_sm8150_cfg; 902 + extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; 903 + extern const struct dpu_mdss_cfg dpu_sm8250_cfg; 904 + extern const struct dpu_mdss_cfg dpu_sc7180_cfg; 905 + extern const struct dpu_mdss_cfg dpu_sm6115_cfg; 906 + extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; 907 + extern const struct dpu_mdss_cfg dpu_sm8350_cfg; 908 + extern const struct dpu_mdss_cfg dpu_sc7280_cfg; 909 + extern const struct dpu_mdss_cfg dpu_sc8280xp_cfg; 910 + extern const struct dpu_mdss_cfg dpu_sm8450_cfg; 911 + extern const struct dpu_mdss_cfg dpu_sm8550_cfg; 884 912 885 913 #endif /* _DPU_HW_CATALOG_H */
+45 -4
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
··· 26 26 #define CTL_SW_RESET 0x030 27 27 #define CTL_LAYER_EXTN_OFFSET 0x40 28 28 #define CTL_MERGE_3D_ACTIVE 0x0E4 29 + #define CTL_DSC_ACTIVE 0x0E8 29 30 #define CTL_WB_ACTIVE 0x0EC 30 31 #define CTL_INTF_ACTIVE 0x0F4 32 + #define CTL_FETCH_PIPE_ACTIVE 0x0FC 31 33 #define CTL_MERGE_3D_FLUSH 0x100 32 - #define CTL_DSC_ACTIVE 0x0E8 33 34 #define CTL_DSC_FLUSH 0x104 34 35 #define CTL_WB_FLUSH 0x108 35 36 #define CTL_INTF_FLUSH 0x110 36 37 #define CTL_INTF_MASTER 0x134 37 - #define CTL_FETCH_PIPE_ACTIVE 0x0FC 38 + #define CTL_DSPP_n_FLUSH(n) ((0x13C) + ((n) * 4)) 38 39 39 40 #define CTL_MIXER_BORDER_OUT BIT(24) 40 41 #define CTL_FLUSH_MASK_CTL BIT(17) ··· 45 44 #define DSC_IDX 22 46 45 #define INTF_IDX 31 47 46 #define WB_IDX 16 47 + #define DSPP_IDX 29 /* From DPU hw rev 7.x.x */ 48 48 #define CTL_INVALID_BIT 0xffff 49 49 #define CTL_DEFAULT_GROUP_ID 0xf 50 50 ··· 117 115 trace_dpu_hw_ctl_clear_pending_flush(ctx->pending_flush_mask, 118 116 dpu_hw_ctl_get_flush_register(ctx)); 119 117 ctx->pending_flush_mask = 0x0; 118 + 119 + memset(ctx->pending_dspp_flush_mask, 0, 120 + sizeof(ctx->pending_dspp_flush_mask)); 120 121 } 121 122 122 123 static inline void dpu_hw_ctl_update_pending_flush(struct dpu_hw_ctl *ctx, ··· 137 132 138 133 static inline void dpu_hw_ctl_trigger_flush_v1(struct dpu_hw_ctl *ctx) 139 134 { 135 + int dspp; 136 + 140 137 if (ctx->pending_flush_mask & BIT(MERGE_3D_IDX)) 141 138 DPU_REG_WRITE(&ctx->hw, CTL_MERGE_3D_FLUSH, 142 139 ctx->pending_merge_3d_flush_mask); ··· 149 142 DPU_REG_WRITE(&ctx->hw, CTL_WB_FLUSH, 150 143 ctx->pending_wb_flush_mask); 151 144 145 + if (ctx->pending_flush_mask & BIT(DSPP_IDX)) 146 + for (dspp = DSPP_0; dspp < DSPP_MAX; dspp++) { 147 + if (ctx->pending_dspp_flush_mask[dspp - DSPP_0]) 148 + DPU_REG_WRITE(&ctx->hw, 149 + CTL_DSPP_n_FLUSH(dspp - DSPP_0), 150 + ctx->pending_dspp_flush_mask[dspp - DSPP_0]); 151 + } 152 152 DPU_REG_WRITE(&ctx->hw, CTL_FLUSH, ctx->pending_flush_mask); 153 153 } 154 154 ··· 303 289 } 304 290 305 291 static void dpu_hw_ctl_update_pending_flush_dspp(struct dpu_hw_ctl *ctx, 306 - enum dpu_dspp dspp) 292 + enum dpu_dspp dspp, u32 dspp_sub_blk) 307 293 { 308 294 switch (dspp) { 309 295 case DSPP_0: ··· 321 307 default: 322 308 break; 323 309 } 310 + } 311 + 312 + static void dpu_hw_ctl_update_pending_flush_dspp_sub_blocks( 313 + struct dpu_hw_ctl *ctx, enum dpu_dspp dspp, u32 dspp_sub_blk) 314 + { 315 + if (dspp >= DSPP_MAX) 316 + return; 317 + 318 + switch (dspp_sub_blk) { 319 + case DPU_DSPP_IGC: 320 + ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(2); 321 + break; 322 + case DPU_DSPP_PCC: 323 + ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(4); 324 + break; 325 + case DPU_DSPP_GC: 326 + ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(5); 327 + break; 328 + default: 329 + return; 330 + } 331 + 332 + ctx->pending_flush_mask |= BIT(DSPP_IDX); 324 333 } 325 334 326 335 static u32 dpu_hw_ctl_poll_reset_status(struct dpu_hw_ctl *ctx, u32 timeout_us) ··· 667 630 ops->setup_blendstage = dpu_hw_ctl_setup_blendstage; 668 631 ops->update_pending_flush_sspp = dpu_hw_ctl_update_pending_flush_sspp; 669 632 ops->update_pending_flush_mixer = dpu_hw_ctl_update_pending_flush_mixer; 670 - ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp; 633 + if (cap & BIT(DPU_CTL_DSPP_SUB_BLOCK_FLUSH)) 634 + ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp_sub_blocks; 635 + else 636 + ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp; 637 + 671 638 if (cap & BIT(DPU_CTL_FETCH_ACTIVE)) 672 639 ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active; 673 640 };
+4 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
··· 152 152 * No effect on hardware 153 153 * @ctx : ctl path ctx pointer 154 154 * @blk : DSPP block index 155 + * @dspp_sub_blk : DSPP sub-block index 155 156 */ 156 157 void (*update_pending_flush_dspp)(struct dpu_hw_ctl *ctx, 157 - enum dpu_dspp blk); 158 + enum dpu_dspp blk, u32 dspp_sub_blk); 159 + 158 160 /** 159 161 * Write the value of the pending_flush_mask to hardware 160 162 * @ctx : ctl path ctx pointer ··· 244 242 u32 pending_intf_flush_mask; 245 243 u32 pending_wb_flush_mask; 246 244 u32 pending_merge_3d_flush_mask; 245 + u32 pending_dspp_flush_mask[DSPP_MAX - DSPP_0]; 247 246 248 247 /* ops */ 249 248 struct dpu_hw_ctl_ops ops;
+2 -2
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
··· 175 175 DPU_REG_WRITE(c, dsc_ctl_offset, mux_cfg); 176 176 } 177 177 178 - static struct dpu_dsc_cfg *_dsc_offset(enum dpu_dsc dsc, 178 + static const struct dpu_dsc_cfg *_dsc_offset(enum dpu_dsc dsc, 179 179 const struct dpu_mdss_cfg *m, 180 180 void __iomem *addr, 181 181 struct dpu_hw_blk_reg_map *b) ··· 207 207 const struct dpu_mdss_cfg *m) 208 208 { 209 209 struct dpu_hw_dsc *c; 210 - struct dpu_dsc_cfg *cfg; 210 + const struct dpu_dsc_cfg *cfg; 211 211 212 212 c = kzalloc(sizeof(*c), GFP_KERNEL); 213 213 if (!c)
+7 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
··· 62 62 #define INTF_LINE_COUNT 0x0B0 63 63 64 64 #define INTF_MUX 0x25C 65 + #define INTF_STATUS 0x26C 65 66 66 67 #define INTF_CFG_ACTIVE_H_EN BIT(29) 67 68 #define INTF_CFG_ACTIVE_V_EN BIT(30) ··· 298 297 struct intf_status *s) 299 298 { 300 299 struct dpu_hw_blk_reg_map *c = &intf->hw; 300 + unsigned long cap = intf->cap->features; 301 301 302 - s->is_en = DPU_REG_READ(c, INTF_TIMING_ENGINE_EN); 302 + if (cap & BIT(DPU_INTF_STATUS_SUPPORTED)) 303 + s->is_en = DPU_REG_READ(c, INTF_STATUS) & BIT(0); 304 + else 305 + s->is_en = DPU_REG_READ(c, INTF_TIMING_ENGINE_EN); 306 + 303 307 s->is_prog_fetch_en = !!(DPU_REG_READ(c, INTF_CONFIG) & BIT(31)); 304 308 if (s->is_en) { 305 309 s->frame_count = DPU_REG_READ(c, INTF_FRAME_COUNT);
+98 -89
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
··· 136 136 #define TS_CLK 19200000 137 137 138 138 139 - static int _sspp_subblk_offset(struct dpu_hw_pipe *ctx, 139 + static int _sspp_subblk_offset(struct dpu_hw_sspp *ctx, 140 140 int s_id, 141 141 u32 *idx) 142 142 { ··· 168 168 return rc; 169 169 } 170 170 171 - static void dpu_hw_sspp_setup_multirect(struct dpu_hw_pipe *ctx, 172 - enum dpu_sspp_multirect_index index, 173 - enum dpu_sspp_multirect_mode mode) 171 + static void dpu_hw_sspp_setup_multirect(struct dpu_sw_pipe *pipe) 174 172 { 173 + struct dpu_hw_sspp *ctx = pipe->sspp; 175 174 u32 mode_mask; 176 175 u32 idx; 177 176 178 177 if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx)) 179 178 return; 180 179 181 - if (index == DPU_SSPP_RECT_SOLO) { 180 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) { 182 181 /** 183 182 * if rect index is RECT_SOLO, we cannot expect a 184 183 * virtual plane sharing the same SSPP id. So we go ··· 186 187 mode_mask = 0; 187 188 } else { 188 189 mode_mask = DPU_REG_READ(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx); 189 - mode_mask |= index; 190 - if (mode == DPU_SSPP_MULTIRECT_TIME_MX) 190 + mode_mask |= pipe->multirect_index; 191 + if (pipe->multirect_mode == DPU_SSPP_MULTIRECT_TIME_MX) 191 192 mode_mask |= BIT(2); 192 193 else 193 194 mode_mask &= ~BIT(2); ··· 196 197 DPU_REG_WRITE(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx, mode_mask); 197 198 } 198 199 199 - static void _sspp_setup_opmode(struct dpu_hw_pipe *ctx, 200 + static void _sspp_setup_opmode(struct dpu_hw_sspp *ctx, 200 201 u32 mask, u8 en) 201 202 { 202 203 u32 idx; ··· 217 218 DPU_REG_WRITE(&ctx->hw, SSPP_VIG_OP_MODE + idx, opmode); 218 219 } 219 220 220 - static void _sspp_setup_csc10_opmode(struct dpu_hw_pipe *ctx, 221 + static void _sspp_setup_csc10_opmode(struct dpu_hw_sspp *ctx, 221 222 u32 mask, u8 en) 222 223 { 223 224 u32 idx; ··· 238 239 /* 239 240 * Setup source pixel format, flip, 240 241 */ 241 - static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx, 242 - const struct dpu_format *fmt, u32 flags, 243 - enum dpu_sspp_multirect_index rect_mode) 242 + static void dpu_hw_sspp_setup_format(struct dpu_sw_pipe *pipe, 243 + const struct dpu_format *fmt, u32 flags) 244 244 { 245 + struct dpu_hw_sspp *ctx = pipe->sspp; 245 246 struct dpu_hw_blk_reg_map *c; 246 247 u32 chroma_samp, unpack, src_format; 247 248 u32 opmode = 0; ··· 252 253 if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !fmt) 253 254 return; 254 255 255 - if (rect_mode == DPU_SSPP_RECT_SOLO || rect_mode == DPU_SSPP_RECT_0) { 256 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || 257 + pipe->multirect_index == DPU_SSPP_RECT_0) { 256 258 op_mode_off = SSPP_SRC_OP_MODE; 257 259 unpack_pat_off = SSPP_SRC_UNPACK_PATTERN; 258 260 format_off = SSPP_SRC_FORMAT; ··· 307 307 src_format |= (fmt->fetch_mode & 3) << 30; /*FRAME_FORMAT */ 308 308 DPU_REG_WRITE(c, SSPP_FETCH_CONFIG, 309 309 DPU_FETCH_CONFIG_RESET_VALUE | 310 - ctx->mdp->highest_bank_bit << 18); 311 - switch (ctx->catalog->caps->ubwc_version) { 310 + ctx->ubwc->highest_bank_bit << 18); 311 + switch (ctx->ubwc->ubwc_version) { 312 312 case DPU_HW_UBWC_VER_10: 313 313 fast_clear = fmt->alpha_enable ? BIT(31) : 0; 314 314 DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, 315 - fast_clear | (ctx->mdp->ubwc_swizzle & 0x1) | 315 + fast_clear | (ctx->ubwc->ubwc_swizzle & 0x1) | 316 316 BIT(8) | 317 - (ctx->mdp->highest_bank_bit << 4)); 317 + (ctx->ubwc->highest_bank_bit << 4)); 318 318 break; 319 319 case DPU_HW_UBWC_VER_20: 320 320 fast_clear = fmt->alpha_enable ? BIT(31) : 0; 321 321 DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, 322 - fast_clear | (ctx->mdp->ubwc_swizzle) | 323 - (ctx->mdp->highest_bank_bit << 4)); 322 + fast_clear | (ctx->ubwc->ubwc_swizzle) | 323 + (ctx->ubwc->highest_bank_bit << 4)); 324 324 break; 325 325 case DPU_HW_UBWC_VER_30: 326 326 DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, 327 - BIT(30) | (ctx->mdp->ubwc_swizzle) | 328 - (ctx->mdp->highest_bank_bit << 4)); 327 + BIT(30) | (ctx->ubwc->ubwc_swizzle) | 328 + (ctx->ubwc->highest_bank_bit << 4)); 329 329 break; 330 330 case DPU_HW_UBWC_VER_40: 331 331 DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, ··· 360 360 DPU_REG_WRITE(c, SSPP_UBWC_ERROR_STATUS + idx, BIT(31)); 361 361 } 362 362 363 - static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_pipe *ctx, 363 + static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_sspp *ctx, 364 364 struct dpu_hw_pixel_ext *pe_ext) 365 365 { 366 366 struct dpu_hw_blk_reg_map *c; ··· 418 418 tot_req_pixels[3]); 419 419 } 420 420 421 - static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_pipe *ctx, 422 - struct dpu_hw_pipe_cfg *sspp, 423 - void *scaler_cfg) 421 + static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_sspp *ctx, 422 + struct dpu_hw_scaler3_cfg *scaler3_cfg, 423 + const struct dpu_format *format) 424 424 { 425 425 u32 idx; 426 - struct dpu_hw_scaler3_cfg *scaler3_cfg = scaler_cfg; 427 426 428 - if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx) || !sspp 427 + if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx) 429 428 || !scaler3_cfg) 430 429 return; 431 430 432 431 dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg, idx, 433 432 ctx->cap->sblk->scaler_blk.version, 434 - sspp->layout.format); 433 + format); 435 434 } 436 435 437 - static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_pipe *ctx) 436 + static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_sspp *ctx) 438 437 { 439 438 u32 idx; 440 439 ··· 446 447 /* 447 448 * dpu_hw_sspp_setup_rects() 448 449 */ 449 - static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx, 450 - struct dpu_hw_pipe_cfg *cfg, 451 - enum dpu_sspp_multirect_index rect_index) 450 + static void dpu_hw_sspp_setup_rects(struct dpu_sw_pipe *pipe, 451 + struct dpu_sw_pipe_cfg *cfg) 452 452 { 453 + struct dpu_hw_sspp *ctx = pipe->sspp; 453 454 struct dpu_hw_blk_reg_map *c; 454 - u32 src_size, src_xy, dst_size, dst_xy, ystride0, ystride1; 455 + u32 src_size, src_xy, dst_size, dst_xy; 455 456 u32 src_size_off, src_xy_off, out_size_off, out_xy_off; 456 457 u32 idx; 457 458 ··· 460 461 461 462 c = &ctx->hw; 462 463 463 - if (rect_index == DPU_SSPP_RECT_SOLO || rect_index == DPU_SSPP_RECT_0) { 464 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || 465 + pipe->multirect_index == DPU_SSPP_RECT_0) { 464 466 src_size_off = SSPP_SRC_SIZE; 465 467 src_xy_off = SSPP_SRC_XY; 466 468 out_size_off = SSPP_OUT_SIZE; ··· 482 482 dst_size = (drm_rect_height(&cfg->dst_rect) << 16) | 483 483 drm_rect_width(&cfg->dst_rect); 484 484 485 - if (rect_index == DPU_SSPP_RECT_SOLO) { 486 - ystride0 = (cfg->layout.plane_pitch[0]) | 487 - (cfg->layout.plane_pitch[1] << 16); 488 - ystride1 = (cfg->layout.plane_pitch[2]) | 489 - (cfg->layout.plane_pitch[3] << 16); 490 - } else { 491 - ystride0 = DPU_REG_READ(c, SSPP_SRC_YSTRIDE0 + idx); 492 - ystride1 = DPU_REG_READ(c, SSPP_SRC_YSTRIDE1 + idx); 493 - 494 - if (rect_index == DPU_SSPP_RECT_0) { 495 - ystride0 = (ystride0 & 0xFFFF0000) | 496 - (cfg->layout.plane_pitch[0] & 0x0000FFFF); 497 - ystride1 = (ystride1 & 0xFFFF0000)| 498 - (cfg->layout.plane_pitch[2] & 0x0000FFFF); 499 - } else { 500 - ystride0 = (ystride0 & 0x0000FFFF) | 501 - ((cfg->layout.plane_pitch[0] << 16) & 502 - 0xFFFF0000); 503 - ystride1 = (ystride1 & 0x0000FFFF) | 504 - ((cfg->layout.plane_pitch[2] << 16) & 505 - 0xFFFF0000); 506 - } 507 - } 508 - 509 485 /* rectangle register programming */ 510 486 DPU_REG_WRITE(c, src_size_off + idx, src_size); 511 487 DPU_REG_WRITE(c, src_xy_off + idx, src_xy); 512 488 DPU_REG_WRITE(c, out_size_off + idx, dst_size); 513 489 DPU_REG_WRITE(c, out_xy_off + idx, dst_xy); 514 - 515 - DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE0 + idx, ystride0); 516 - DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE1 + idx, ystride1); 517 490 } 518 491 519 - static void dpu_hw_sspp_setup_sourceaddress(struct dpu_hw_pipe *ctx, 520 - struct dpu_hw_pipe_cfg *cfg, 521 - enum dpu_sspp_multirect_index rect_mode) 492 + static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe, 493 + struct dpu_hw_fmt_layout *layout) 522 494 { 495 + struct dpu_hw_sspp *ctx = pipe->sspp; 496 + u32 ystride0, ystride1; 523 497 int i; 524 498 u32 idx; 525 499 526 500 if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx)) 527 501 return; 528 502 529 - if (rect_mode == DPU_SSPP_RECT_SOLO) { 530 - for (i = 0; i < ARRAY_SIZE(cfg->layout.plane_addr); i++) 503 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) { 504 + for (i = 0; i < ARRAY_SIZE(layout->plane_addr); i++) 531 505 DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx + i * 0x4, 532 - cfg->layout.plane_addr[i]); 533 - } else if (rect_mode == DPU_SSPP_RECT_0) { 506 + layout->plane_addr[i]); 507 + } else if (pipe->multirect_index == DPU_SSPP_RECT_0) { 534 508 DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx, 535 - cfg->layout.plane_addr[0]); 509 + layout->plane_addr[0]); 536 510 DPU_REG_WRITE(&ctx->hw, SSPP_SRC2_ADDR + idx, 537 - cfg->layout.plane_addr[2]); 511 + layout->plane_addr[2]); 538 512 } else { 539 513 DPU_REG_WRITE(&ctx->hw, SSPP_SRC1_ADDR + idx, 540 - cfg->layout.plane_addr[0]); 514 + layout->plane_addr[0]); 541 515 DPU_REG_WRITE(&ctx->hw, SSPP_SRC3_ADDR + idx, 542 - cfg->layout.plane_addr[2]); 516 + layout->plane_addr[2]); 543 517 } 518 + 519 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) { 520 + ystride0 = (layout->plane_pitch[0]) | 521 + (layout->plane_pitch[1] << 16); 522 + ystride1 = (layout->plane_pitch[2]) | 523 + (layout->plane_pitch[3] << 16); 524 + } else { 525 + ystride0 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx); 526 + ystride1 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx); 527 + 528 + if (pipe->multirect_index == DPU_SSPP_RECT_0) { 529 + ystride0 = (ystride0 & 0xFFFF0000) | 530 + (layout->plane_pitch[0] & 0x0000FFFF); 531 + ystride1 = (ystride1 & 0xFFFF0000)| 532 + (layout->plane_pitch[2] & 0x0000FFFF); 533 + } else { 534 + ystride0 = (ystride0 & 0x0000FFFF) | 535 + ((layout->plane_pitch[0] << 16) & 536 + 0xFFFF0000); 537 + ystride1 = (ystride1 & 0x0000FFFF) | 538 + ((layout->plane_pitch[2] << 16) & 539 + 0xFFFF0000); 540 + } 541 + } 542 + 543 + DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx, ystride0); 544 + DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx, ystride1); 544 545 } 545 546 546 - static void dpu_hw_sspp_setup_csc(struct dpu_hw_pipe *ctx, 547 + static void dpu_hw_sspp_setup_csc(struct dpu_hw_sspp *ctx, 547 548 const struct dpu_csc_cfg *data) 548 549 { 549 550 u32 idx; ··· 561 560 dpu_hw_csc_setup(&ctx->hw, idx, data, csc10); 562 561 } 563 562 564 - static void dpu_hw_sspp_setup_solidfill(struct dpu_hw_pipe *ctx, u32 color, enum 565 - dpu_sspp_multirect_index rect_index) 563 + static void dpu_hw_sspp_setup_solidfill(struct dpu_sw_pipe *pipe, u32 color) 566 564 { 565 + struct dpu_hw_sspp *ctx = pipe->sspp; 566 + struct dpu_hw_fmt_layout cfg; 567 567 u32 idx; 568 568 569 569 if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx)) 570 570 return; 571 571 572 - if (rect_index == DPU_SSPP_RECT_SOLO || rect_index == DPU_SSPP_RECT_0) 572 + /* cleanup source addresses */ 573 + memset(&cfg, 0, sizeof(cfg)); 574 + ctx->ops.setup_sourceaddress(pipe, &cfg); 575 + 576 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || 577 + pipe->multirect_index == DPU_SSPP_RECT_0) 573 578 DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR + idx, color); 574 579 else 575 580 DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR_REC1 + idx, 576 581 color); 577 582 } 578 583 579 - static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_pipe *ctx, 584 + static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_sspp *ctx, 580 585 u32 danger_lut, 581 586 u32 safe_lut) 582 587 { ··· 595 588 DPU_REG_WRITE(&ctx->hw, SSPP_SAFE_LUT + idx, safe_lut); 596 589 } 597 590 598 - static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_pipe *ctx, 591 + static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_sspp *ctx, 599 592 u64 creq_lut) 600 593 { 601 594 u32 idx; ··· 612 605 } 613 606 } 614 607 615 - static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_pipe *ctx, 608 + static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_sspp *ctx, 616 609 struct dpu_hw_pipe_qos_cfg *cfg) 617 610 { 618 611 u32 idx; ··· 637 630 DPU_REG_WRITE(&ctx->hw, SSPP_QOS_CTRL + idx, qos_ctrl); 638 631 } 639 632 640 - static void dpu_hw_sspp_setup_cdp(struct dpu_hw_pipe *ctx, 641 - struct dpu_hw_cdp_cfg *cfg, 642 - enum dpu_sspp_multirect_index index) 633 + static void dpu_hw_sspp_setup_cdp(struct dpu_sw_pipe *pipe, 634 + struct dpu_hw_cdp_cfg *cfg) 643 635 { 636 + struct dpu_hw_sspp *ctx = pipe->sspp; 644 637 u32 idx; 645 638 u32 cdp_cntl = 0; 646 639 u32 cdp_cntl_offset = 0; ··· 651 644 if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx)) 652 645 return; 653 646 654 - if (index == DPU_SSPP_RECT_SOLO || index == DPU_SSPP_RECT_0) 647 + if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || 648 + pipe->multirect_index == DPU_SSPP_RECT_0) 655 649 cdp_cntl_offset = SSPP_CDP_CNTL; 656 650 else 657 651 cdp_cntl_offset = SSPP_CDP_CNTL_REC1; ··· 669 661 DPU_REG_WRITE(&ctx->hw, cdp_cntl_offset, cdp_cntl); 670 662 } 671 663 672 - static void _setup_layer_ops(struct dpu_hw_pipe *c, 664 + static void _setup_layer_ops(struct dpu_hw_sspp *c, 673 665 unsigned long features) 674 666 { 675 667 if (test_bit(DPU_SSPP_SRC, &features)) { ··· 707 699 } 708 700 709 701 #ifdef CONFIG_DEBUG_FS 710 - int _dpu_hw_sspp_init_debugfs(struct dpu_hw_pipe *hw_pipe, struct dpu_kms *kms, struct dentry *entry) 702 + int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms, 703 + struct dentry *entry) 711 704 { 712 705 const struct dpu_sspp_cfg *cfg = hw_pipe->cap; 713 706 const struct dpu_sspp_sub_blks *sblk = cfg->sblk; ··· 792 783 return ERR_PTR(-ENOMEM); 793 784 } 794 785 795 - struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx, 786 + struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx, 796 787 void __iomem *addr, const struct dpu_mdss_cfg *catalog) 797 788 { 798 - struct dpu_hw_pipe *hw_pipe; 789 + struct dpu_hw_sspp *hw_pipe; 799 790 const struct dpu_sspp_cfg *cfg; 800 791 801 792 if (!addr || !catalog) ··· 813 804 814 805 /* Assign ops */ 815 806 hw_pipe->catalog = catalog; 816 - hw_pipe->mdp = &catalog->mdp[0]; 807 + hw_pipe->ubwc = catalog->ubwc; 817 808 hw_pipe->idx = idx; 818 809 hw_pipe->cap = cfg; 819 810 _setup_layer_ops(hw_pipe, hw_pipe->cap->features); ··· 821 812 return hw_pipe; 822 813 } 823 814 824 - void dpu_hw_sspp_destroy(struct dpu_hw_pipe *ctx) 815 + void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx) 825 816 { 826 817 kfree(ctx); 827 818 }
+53 -62
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
··· 10 10 #include "dpu_hw_util.h" 11 11 #include "dpu_formats.h" 12 12 13 - struct dpu_hw_pipe; 13 + struct dpu_hw_sspp; 14 14 15 15 /** 16 16 * Flags ··· 153 153 }; 154 154 155 155 /** 156 - * struct dpu_hw_pipe_cfg : Pipe description 157 - * @layout: format layout information for programming buffer to hardware 156 + * struct dpu_sw_pipe_cfg : software pipe configuration 158 157 * @src_rect: src ROI, caller takes into account the different operations 159 158 * such as decimation, flip etc to program this field 160 159 * @dest_rect: destination ROI. 161 - * @index: index of the rectangle of SSPP 162 - * @mode: parallel or time multiplex multirect mode 163 160 */ 164 - struct dpu_hw_pipe_cfg { 165 - struct dpu_hw_fmt_layout layout; 161 + struct dpu_sw_pipe_cfg { 166 162 struct drm_rect src_rect; 167 163 struct drm_rect dst_rect; 168 - enum dpu_sspp_multirect_index index; 169 - enum dpu_sspp_multirect_mode mode; 170 164 }; 171 165 172 166 /** ··· 196 202 }; 197 203 198 204 /** 205 + * struct dpu_sw_pipe - software pipe description 206 + * @sspp: backing SSPP pipe 207 + * @index: index of the rectangle of SSPP 208 + * @mode: parallel or time multiplex multirect mode 209 + */ 210 + struct dpu_sw_pipe { 211 + struct dpu_hw_sspp *sspp; 212 + enum dpu_sspp_multirect_index multirect_index; 213 + enum dpu_sspp_multirect_mode multirect_mode; 214 + }; 215 + 216 + /** 199 217 * struct dpu_hw_sspp_ops - interface to the SSPP Hw driver functions 200 218 * Caller must call the init function to get the pipe context for each pipe 201 219 * Assumption is these functions will be called after clocks are enabled ··· 215 209 struct dpu_hw_sspp_ops { 216 210 /** 217 211 * setup_format - setup pixel format cropping rectangle, flip 218 - * @ctx: Pointer to pipe context 212 + * @pipe: Pointer to software pipe context 219 213 * @cfg: Pointer to pipe config structure 220 214 * @flags: Extra flags for format config 221 - * @index: rectangle index in multirect 222 215 */ 223 - void (*setup_format)(struct dpu_hw_pipe *ctx, 224 - const struct dpu_format *fmt, u32 flags, 225 - enum dpu_sspp_multirect_index index); 216 + void (*setup_format)(struct dpu_sw_pipe *pipe, 217 + const struct dpu_format *fmt, u32 flags); 226 218 227 219 /** 228 220 * setup_rects - setup pipe ROI rectangles 229 - * @ctx: Pointer to pipe context 221 + * @pipe: Pointer to software pipe context 230 222 * @cfg: Pointer to pipe config structure 231 - * @index: rectangle index in multirect 232 223 */ 233 - void (*setup_rects)(struct dpu_hw_pipe *ctx, 234 - struct dpu_hw_pipe_cfg *cfg, 235 - enum dpu_sspp_multirect_index index); 224 + void (*setup_rects)(struct dpu_sw_pipe *pipe, 225 + struct dpu_sw_pipe_cfg *cfg); 236 226 237 227 /** 238 228 * setup_pe - setup pipe pixel extension 239 229 * @ctx: Pointer to pipe context 240 230 * @pe_ext: Pointer to pixel ext settings 241 231 */ 242 - void (*setup_pe)(struct dpu_hw_pipe *ctx, 232 + void (*setup_pe)(struct dpu_hw_sspp *ctx, 243 233 struct dpu_hw_pixel_ext *pe_ext); 244 234 245 235 /** 246 236 * setup_sourceaddress - setup pipe source addresses 247 - * @ctx: Pointer to pipe context 248 - * @cfg: Pointer to pipe config structure 249 - * @index: rectangle index in multirect 237 + * @pipe: Pointer to software pipe context 238 + * @layout: format layout information for programming buffer to hardware 250 239 */ 251 - void (*setup_sourceaddress)(struct dpu_hw_pipe *ctx, 252 - struct dpu_hw_pipe_cfg *cfg, 253 - enum dpu_sspp_multirect_index index); 240 + void (*setup_sourceaddress)(struct dpu_sw_pipe *ctx, 241 + struct dpu_hw_fmt_layout *layout); 254 242 255 243 /** 256 244 * setup_csc - setup color space coversion 257 245 * @ctx: Pointer to pipe context 258 246 * @data: Pointer to config structure 259 247 */ 260 - void (*setup_csc)(struct dpu_hw_pipe *ctx, const struct dpu_csc_cfg *data); 248 + void (*setup_csc)(struct dpu_hw_sspp *ctx, const struct dpu_csc_cfg *data); 261 249 262 250 /** 263 251 * setup_solidfill - enable/disable colorfill 264 - * @ctx: Pointer to pipe context 252 + * @pipe: Pointer to software pipe context 265 253 * @const_color: Fill color value 266 254 * @flags: Pipe flags 267 - * @index: rectangle index in multirect 268 255 */ 269 - void (*setup_solidfill)(struct dpu_hw_pipe *ctx, u32 color, 270 - enum dpu_sspp_multirect_index index); 256 + void (*setup_solidfill)(struct dpu_sw_pipe *pipe, u32 color); 271 257 272 258 /** 273 259 * setup_multirect - setup multirect configuration 274 - * @ctx: Pointer to pipe context 275 - * @index: rectangle index in multirect 276 - * @mode: parallel fetch / time multiplex multirect mode 260 + * @pipe: Pointer to software pipe context 277 261 */ 278 262 279 - void (*setup_multirect)(struct dpu_hw_pipe *ctx, 280 - enum dpu_sspp_multirect_index index, 281 - enum dpu_sspp_multirect_mode mode); 263 + void (*setup_multirect)(struct dpu_sw_pipe *pipe); 282 264 283 265 /** 284 266 * setup_sharpening - setup sharpening 285 267 * @ctx: Pointer to pipe context 286 268 * @cfg: Pointer to config structure 287 269 */ 288 - void (*setup_sharpening)(struct dpu_hw_pipe *ctx, 270 + void (*setup_sharpening)(struct dpu_hw_sspp *ctx, 289 271 struct dpu_hw_sharp_cfg *cfg); 290 272 291 273 /** ··· 283 289 * @safe_lut: LUT for generate safe level based on fill level 284 290 * 285 291 */ 286 - void (*setup_danger_safe_lut)(struct dpu_hw_pipe *ctx, 292 + void (*setup_danger_safe_lut)(struct dpu_hw_sspp *ctx, 287 293 u32 danger_lut, 288 294 u32 safe_lut); 289 295 ··· 293 299 * @creq_lut: LUT for generate creq level based on fill level 294 300 * 295 301 */ 296 - void (*setup_creq_lut)(struct dpu_hw_pipe *ctx, 302 + void (*setup_creq_lut)(struct dpu_hw_sspp *ctx, 297 303 u64 creq_lut); 298 304 299 305 /** ··· 302 308 * @cfg: Pointer to pipe QoS configuration 303 309 * 304 310 */ 305 - void (*setup_qos_ctrl)(struct dpu_hw_pipe *ctx, 311 + void (*setup_qos_ctrl)(struct dpu_hw_sspp *ctx, 306 312 struct dpu_hw_pipe_qos_cfg *cfg); 307 313 308 314 /** ··· 310 316 * @ctx: Pointer to pipe context 311 317 * @cfg: Pointer to histogram configuration 312 318 */ 313 - void (*setup_histogram)(struct dpu_hw_pipe *ctx, 319 + void (*setup_histogram)(struct dpu_hw_sspp *ctx, 314 320 void *cfg); 315 321 316 322 /** 317 323 * setup_scaler - setup scaler 318 - * @ctx: Pointer to pipe context 319 - * @pipe_cfg: Pointer to pipe configuration 320 - * @scaler_cfg: Pointer to scaler configuration 324 + * @scaler3_cfg: Pointer to scaler configuration 325 + * @format: pixel format parameters 321 326 */ 322 - void (*setup_scaler)(struct dpu_hw_pipe *ctx, 323 - struct dpu_hw_pipe_cfg *pipe_cfg, 324 - void *scaler_cfg); 327 + void (*setup_scaler)(struct dpu_hw_sspp *ctx, 328 + struct dpu_hw_scaler3_cfg *scaler3_cfg, 329 + const struct dpu_format *format); 325 330 326 331 /** 327 332 * get_scaler_ver - get scaler h/w version 328 333 * @ctx: Pointer to pipe context 329 334 */ 330 - u32 (*get_scaler_ver)(struct dpu_hw_pipe *ctx); 335 + u32 (*get_scaler_ver)(struct dpu_hw_sspp *ctx); 331 336 332 337 /** 333 338 * setup_cdp - setup client driven prefetch 334 - * @ctx: Pointer to pipe context 339 + * @pipe: Pointer to software pipe context 335 340 * @cfg: Pointer to cdp configuration 336 - * @index: rectangle index in multirect 337 341 */ 338 - void (*setup_cdp)(struct dpu_hw_pipe *ctx, 339 - struct dpu_hw_cdp_cfg *cfg, 340 - enum dpu_sspp_multirect_index index); 342 + void (*setup_cdp)(struct dpu_sw_pipe *pipe, 343 + struct dpu_hw_cdp_cfg *cfg); 341 344 }; 342 345 343 346 /** 344 - * struct dpu_hw_pipe - pipe description 347 + * struct dpu_hw_sspp - pipe description 345 348 * @base: hardware block base structure 346 349 * @hw: block hardware details 347 350 * @catalog: back pointer to catalog 348 - * @mdp: pointer to associated mdp portion of the catalog 351 + * @ubwc: ubwc configuration data 349 352 * @idx: pipe index 350 353 * @cap: pointer to layer_cfg 351 354 * @ops: pointer to operations possible for this pipe 352 355 */ 353 - struct dpu_hw_pipe { 356 + struct dpu_hw_sspp { 354 357 struct dpu_hw_blk base; 355 358 struct dpu_hw_blk_reg_map hw; 356 359 const struct dpu_mdss_cfg *catalog; 357 - const struct dpu_mdp_cfg *mdp; 360 + const struct dpu_ubwc_cfg *ubwc; 358 361 359 362 /* Pipe */ 360 363 enum dpu_sspp idx; ··· 369 378 * @addr: Mapped register io address of MDP 370 379 * @catalog : Pointer to mdss catalog data 371 380 */ 372 - struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx, 381 + struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx, 373 382 void __iomem *addr, const struct dpu_mdss_cfg *catalog); 374 383 375 384 /** ··· 377 386 * should be called during Hw pipe cleanup. 378 387 * @ctx: Pointer to SSPP driver context returned by dpu_hw_sspp_init 379 388 */ 380 - void dpu_hw_sspp_destroy(struct dpu_hw_pipe *ctx); 389 + void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx); 381 390 382 - void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root); 383 - int _dpu_hw_sspp_init_debugfs(struct dpu_hw_pipe *hw_pipe, struct dpu_kms *kms, struct dentry *entry); 391 + int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms, 392 + struct dentry *entry); 384 393 385 394 #endif /*_DPU_HW_SSPP_H */ 386 395
+39 -59
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 250 250 debugfs_create_file(name, mode, parent, regset, &dpu_regset32_fops); 251 251 } 252 252 253 + static void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) 254 + { 255 + struct dentry *entry = debugfs_create_dir("sspp", debugfs_root); 256 + int i; 257 + 258 + if (IS_ERR(entry)) 259 + return; 260 + 261 + for (i = SSPP_NONE; i < SSPP_MAX; i++) { 262 + struct dpu_hw_sspp *hw = dpu_rm_get_sspp(&dpu_kms->rm, i); 263 + 264 + if (!hw) 265 + continue; 266 + 267 + _dpu_hw_sspp_init_debugfs(hw, dpu_kms, entry); 268 + } 269 + } 270 + 253 271 static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor) 254 272 { 255 273 struct dpu_kms *dpu_kms = to_dpu_kms(kms); ··· 429 411 pm_runtime_put_sync(&dpu_kms->pdev->dev); 430 412 } 431 413 432 - static ktime_t dpu_kms_vsync_time(struct msm_kms *kms, struct drm_crtc *crtc) 433 - { 434 - struct drm_encoder *encoder; 435 - 436 - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { 437 - ktime_t vsync_time; 438 - 439 - if (dpu_encoder_vsync_time(encoder, &vsync_time) == 0) 440 - return vsync_time; 441 - } 442 - 443 - return ktime_get(); 444 - } 445 - 446 - static void dpu_kms_prepare_commit(struct msm_kms *kms, 447 - struct drm_atomic_state *state) 448 - { 449 - struct drm_crtc *crtc; 450 - struct drm_crtc_state *crtc_state; 451 - struct drm_encoder *encoder; 452 - int i; 453 - 454 - if (!kms) 455 - return; 456 - 457 - /* Call prepare_commit for all affected encoders */ 458 - for_each_new_crtc_in_state(state, crtc, crtc_state, i) { 459 - drm_for_each_encoder_mask(encoder, crtc->dev, 460 - crtc_state->encoder_mask) { 461 - dpu_encoder_prepare_commit(encoder); 462 - } 463 - } 464 - } 465 - 466 414 static void dpu_kms_flush_commit(struct msm_kms *kms, unsigned crtc_mask) 467 415 { 468 416 struct dpu_kms *dpu_kms = to_dpu_kms(kms); ··· 475 491 return; 476 492 } 477 493 478 - if (!crtc->state->active) { 494 + if (!drm_atomic_crtc_effectively_active(crtc->state)) { 479 495 DPU_DEBUG("[crtc:%d] not active\n", crtc->base.id); 480 496 return; 481 497 } ··· 937 953 .irq = dpu_core_irq, 938 954 .enable_commit = dpu_kms_enable_commit, 939 955 .disable_commit = dpu_kms_disable_commit, 940 - .vsync_time = dpu_kms_vsync_time, 941 - .prepare_commit = dpu_kms_prepare_commit, 942 956 .flush_commit = dpu_kms_flush_commit, 943 957 .wait_flush = dpu_kms_wait_flush, 944 958 .complete_commit = dpu_kms_complete_commit, ··· 995 1013 struct dpu_kms *dpu_kms; 996 1014 struct drm_device *dev; 997 1015 int i, rc = -EINVAL; 1016 + u32 core_rev; 998 1017 999 1018 if (!kms) { 1000 1019 DPU_ERROR("invalid kms\n"); ··· 1045 1062 if (rc < 0) 1046 1063 goto error; 1047 1064 1048 - dpu_kms->core_rev = readl_relaxed(dpu_kms->mmio + 0x0); 1065 + core_rev = readl_relaxed(dpu_kms->mmio + 0x0); 1049 1066 1050 - pr_info("dpu hardware revision:0x%x\n", dpu_kms->core_rev); 1067 + pr_info("dpu hardware revision:0x%x\n", core_rev); 1051 1068 1052 - dpu_kms->catalog = dpu_hw_catalog_init(dpu_kms->core_rev); 1053 - if (IS_ERR_OR_NULL(dpu_kms->catalog)) { 1054 - rc = PTR_ERR(dpu_kms->catalog); 1055 - if (!dpu_kms->catalog) 1056 - rc = -EINVAL; 1057 - DPU_ERROR("catalog init failed: %d\n", rc); 1058 - dpu_kms->catalog = NULL; 1069 + dpu_kms->catalog = of_device_get_match_data(dev->dev); 1070 + if (!dpu_kms->catalog) { 1071 + DPU_ERROR("device config not known!\n"); 1072 + rc = -EINVAL; 1059 1073 goto power_error; 1060 1074 } 1061 1075 ··· 1278 1298 }; 1279 1299 1280 1300 static const struct of_device_id dpu_dt_match[] = { 1281 - { .compatible = "qcom,msm8998-dpu", }, 1282 - { .compatible = "qcom,qcm2290-dpu", }, 1283 - { .compatible = "qcom,sdm845-dpu", }, 1284 - { .compatible = "qcom,sc7180-dpu", }, 1285 - { .compatible = "qcom,sc7280-dpu", }, 1286 - { .compatible = "qcom,sc8180x-dpu", }, 1287 - { .compatible = "qcom,sc8280xp-dpu", }, 1288 - { .compatible = "qcom,sm6115-dpu", }, 1289 - { .compatible = "qcom,sm8150-dpu", }, 1290 - { .compatible = "qcom,sm8250-dpu", }, 1291 - { .compatible = "qcom,sm8350-dpu", }, 1292 - { .compatible = "qcom,sm8450-dpu", }, 1293 - { .compatible = "qcom,sm8550-dpu", }, 1301 + { .compatible = "qcom,msm8998-dpu", .data = &dpu_msm8998_cfg, }, 1302 + { .compatible = "qcom,qcm2290-dpu", .data = &dpu_qcm2290_cfg, }, 1303 + { .compatible = "qcom,sdm845-dpu", .data = &dpu_sdm845_cfg, }, 1304 + { .compatible = "qcom,sc7180-dpu", .data = &dpu_sc7180_cfg, }, 1305 + { .compatible = "qcom,sc7280-dpu", .data = &dpu_sc7280_cfg, }, 1306 + { .compatible = "qcom,sc8180x-dpu", .data = &dpu_sc8180x_cfg, }, 1307 + { .compatible = "qcom,sc8280xp-dpu", .data = &dpu_sc8280xp_cfg, }, 1308 + { .compatible = "qcom,sm6115-dpu", .data = &dpu_sm6115_cfg, }, 1309 + { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, 1310 + { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, 1311 + { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, 1312 + { .compatible = "qcom,sm8450-dpu", .data = &dpu_sm8450_cfg, }, 1313 + { .compatible = "qcom,sm8550-dpu", .data = &dpu_sm8550_cfg, }, 1294 1314 {} 1295 1315 }; 1296 1316 MODULE_DEVICE_TABLE(of, dpu_dt_match);
-1
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
··· 68 68 struct dpu_kms { 69 69 struct msm_kms base; 70 70 struct drm_device *dev; 71 - int core_rev; 72 71 const struct dpu_mdss_cfg *catalog; 73 72 74 73 /* io/register spaces: */
+430 -439
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
··· 47 47 #define DPU_PLANE_COLOR_FILL_FLAG BIT(31) 48 48 #define DPU_ZPOS_MAX 255 49 49 50 - /* multirect rect index */ 51 - enum { 52 - R0, 53 - R1, 54 - R_MAX 55 - }; 56 - 57 50 /* 58 51 * Default Preload Values 59 52 */ ··· 62 69 DRM_FORMAT_ARGB8888, 63 70 DRM_FORMAT_XBGR8888, 64 71 DRM_FORMAT_XRGB8888, 72 + DRM_FORMAT_ARGB2101010, 65 73 DRM_FORMAT_XRGB2101010, 66 74 DRM_FORMAT_BGR565, 67 75 ··· 98 104 99 105 enum dpu_sspp pipe; 100 106 101 - struct dpu_hw_pipe *pipe_hw; 102 107 uint32_t color_fill; 103 108 bool is_error; 104 109 bool is_rt_pipe; ··· 121 128 122 129 /** 123 130 * _dpu_plane_calc_bw - calculate bandwidth required for a plane 124 - * @plane: Pointer to drm plane. 125 - * @fb: Pointer to framebuffer associated with the given plane 131 + * @catalog: Points to dpu catalog structure 132 + * @fmt: Pointer to source buffer format 133 + * @mode: Pointer to drm display mode 126 134 * @pipe_cfg: Pointer to pipe configuration 127 135 * Result: Updates calculated bandwidth in the plane state. 128 136 * BW Equation: src_w * src_h * bpp * fps * (v_total / v_dest) 129 137 * Prefill BW Equation: line src bytes * line_time 130 138 */ 131 - static void _dpu_plane_calc_bw(struct drm_plane *plane, 132 - struct drm_framebuffer *fb, 133 - struct dpu_hw_pipe_cfg *pipe_cfg) 139 + static u64 _dpu_plane_calc_bw(const struct dpu_mdss_cfg *catalog, 140 + const struct dpu_format *fmt, 141 + const struct drm_display_mode *mode, 142 + struct dpu_sw_pipe_cfg *pipe_cfg) 134 143 { 135 - struct dpu_plane_state *pstate; 136 - struct drm_display_mode *mode; 137 - const struct dpu_format *fmt = NULL; 138 - struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); 139 144 int src_width, src_height, dst_height, fps; 140 145 u64 plane_prefill_bw; 141 146 u64 plane_bw; 142 147 u32 hw_latency_lines; 143 148 u64 scale_factor; 144 149 int vbp, vpw, vfp; 145 - 146 - pstate = to_dpu_plane_state(plane->state); 147 - mode = &plane->state->crtc->mode; 148 - 149 - fmt = dpu_get_dpu_format_ext(fb->format->format, fb->modifier); 150 150 151 151 src_width = drm_rect_width(&pipe_cfg->src_rect); 152 152 src_height = drm_rect_height(&pipe_cfg->src_rect); ··· 148 162 vbp = mode->vtotal - mode->vsync_end; 149 163 vpw = mode->vsync_end - mode->vsync_start; 150 164 vfp = mode->vsync_start - mode->vdisplay; 151 - hw_latency_lines = dpu_kms->catalog->perf->min_prefill_lines; 165 + hw_latency_lines = catalog->perf->min_prefill_lines; 152 166 scale_factor = src_height > dst_height ? 153 167 mult_frac(src_height, 1, dst_height) : 1; 154 168 ··· 168 182 do_div(plane_prefill_bw, hw_latency_lines); 169 183 170 184 171 - pstate->plane_fetch_bw = max(plane_bw, plane_prefill_bw); 185 + return max(plane_bw, plane_prefill_bw); 172 186 } 173 187 174 188 /** 175 189 * _dpu_plane_calc_clk - calculate clock required for a plane 176 - * @plane: Pointer to drm plane. 190 + * @mode: Pointer to drm display mode 177 191 * @pipe_cfg: Pointer to pipe configuration 178 192 * Result: Updates calculated clock in the plane state. 179 193 * Clock equation: dst_w * v_total * fps * (src_h / dst_h) 180 194 */ 181 - static void _dpu_plane_calc_clk(struct drm_plane *plane, struct dpu_hw_pipe_cfg *pipe_cfg) 195 + static u64 _dpu_plane_calc_clk(const struct drm_display_mode *mode, 196 + struct dpu_sw_pipe_cfg *pipe_cfg) 182 197 { 183 - struct dpu_plane_state *pstate; 184 - struct drm_display_mode *mode; 185 198 int dst_width, src_height, dst_height, fps; 186 - 187 - pstate = to_dpu_plane_state(plane->state); 188 - mode = &plane->state->crtc->mode; 199 + u64 plane_clk; 189 200 190 201 src_height = drm_rect_height(&pipe_cfg->src_rect); 191 202 dst_width = drm_rect_width(&pipe_cfg->dst_rect); 192 203 dst_height = drm_rect_height(&pipe_cfg->dst_rect); 193 204 fps = drm_mode_vrefresh(mode); 194 205 195 - pstate->plane_clk = 206 + plane_clk = 196 207 dst_width * mode->vtotal * fps; 197 208 198 209 if (src_height > dst_height) { 199 - pstate->plane_clk *= src_height; 200 - do_div(pstate->plane_clk, dst_height); 210 + plane_clk *= src_height; 211 + do_div(plane_clk, dst_height); 201 212 } 213 + 214 + return plane_clk; 202 215 } 203 216 204 217 /** 205 218 * _dpu_plane_calc_fill_level - calculate fill level of the given source format 206 219 * @plane: Pointer to drm plane 220 + * @pipe: Pointer to software pipe 207 221 * @fmt: Pointer to source buffer format 208 222 * @src_width: width of source buffer 209 223 * Return: fill level corresponding to the source buffer/format or 0 if error 210 224 */ 211 225 static int _dpu_plane_calc_fill_level(struct drm_plane *plane, 226 + struct dpu_sw_pipe *pipe, 212 227 const struct dpu_format *fmt, u32 src_width) 213 228 { 214 229 struct dpu_plane *pdpu; 215 - struct dpu_plane_state *pstate; 216 230 u32 fixed_buff_size; 217 231 u32 total_fl; 218 232 219 - if (!fmt || !plane->state || !src_width || !fmt->bpp) { 233 + if (!fmt || !pipe || !src_width || !fmt->bpp) { 220 234 DPU_ERROR("invalid arguments\n"); 221 235 return 0; 222 236 } 223 237 224 238 pdpu = to_dpu_plane(plane); 225 - pstate = to_dpu_plane_state(plane->state); 226 239 fixed_buff_size = pdpu->catalog->caps->pixel_ram_size; 227 240 228 241 /* FIXME: in multirect case account for the src_width of all the planes */ ··· 237 252 ((src_width + 32) * fmt->bpp); 238 253 } 239 254 } else { 240 - if (pstate->multirect_mode == DPU_SSPP_MULTIRECT_PARALLEL) { 255 + if (pipe->multirect_mode == DPU_SSPP_MULTIRECT_PARALLEL) { 241 256 total_fl = (fixed_buff_size / 2) * 2 / 242 257 ((src_width + 32) * fmt->bpp); 243 258 } else { ··· 247 262 } 248 263 249 264 DPU_DEBUG_PLANE(pdpu, "pnum:%d fmt: %4.4s w:%u fl:%u\n", 250 - pdpu->pipe - SSPP_VIG0, 265 + pipe->sspp->idx - SSPP_VIG0, 251 266 (char *)&fmt->base.pixel_format, 252 267 src_width, total_fl); 253 268 ··· 257 272 /** 258 273 * _dpu_plane_set_qos_lut - set QoS LUT of the given plane 259 274 * @plane: Pointer to drm plane 260 - * @fb: Pointer to framebuffer associated with the given plane 275 + * @pipe: Pointer to software pipe 276 + * @fmt: Pointer to source buffer format 261 277 * @pipe_cfg: Pointer to pipe configuration 262 278 */ 263 279 static void _dpu_plane_set_qos_lut(struct drm_plane *plane, 264 - struct drm_framebuffer *fb, struct dpu_hw_pipe_cfg *pipe_cfg) 280 + struct dpu_sw_pipe *pipe, 281 + const struct dpu_format *fmt, struct dpu_sw_pipe_cfg *pipe_cfg) 265 282 { 266 283 struct dpu_plane *pdpu = to_dpu_plane(plane); 267 - const struct dpu_format *fmt = NULL; 268 284 u64 qos_lut; 269 285 u32 total_fl = 0, lut_usage; 270 286 271 287 if (!pdpu->is_rt_pipe) { 272 288 lut_usage = DPU_QOS_LUT_USAGE_NRT; 273 289 } else { 274 - fmt = dpu_get_dpu_format_ext( 275 - fb->format->format, 276 - fb->modifier); 277 - total_fl = _dpu_plane_calc_fill_level(plane, fmt, 290 + total_fl = _dpu_plane_calc_fill_level(plane, pipe, fmt, 278 291 drm_rect_width(&pipe_cfg->src_rect)); 279 292 280 293 if (fmt && DPU_FORMAT_IS_LINEAR(fmt)) ··· 284 301 qos_lut = _dpu_hw_get_qos_lut( 285 302 &pdpu->catalog->perf->qos_lut_tbl[lut_usage], total_fl); 286 303 287 - trace_dpu_perf_set_qos_luts(pdpu->pipe - SSPP_VIG0, 304 + trace_dpu_perf_set_qos_luts(pipe->sspp->idx - SSPP_VIG0, 288 305 (fmt) ? fmt->base.pixel_format : 0, 289 306 pdpu->is_rt_pipe, total_fl, qos_lut, lut_usage); 290 307 ··· 293 310 fmt ? (char *)&fmt->base.pixel_format : NULL, 294 311 pdpu->is_rt_pipe, total_fl, qos_lut); 295 312 296 - pdpu->pipe_hw->ops.setup_creq_lut(pdpu->pipe_hw, qos_lut); 313 + pipe->sspp->ops.setup_creq_lut(pipe->sspp, qos_lut); 297 314 } 298 315 299 316 /** 300 317 * _dpu_plane_set_danger_lut - set danger/safe LUT of the given plane 301 318 * @plane: Pointer to drm plane 302 - * @fb: Pointer to framebuffer associated with the given plane 319 + * @pipe: Pointer to software pipe 320 + * @fmt: Pointer to source buffer format 303 321 */ 304 322 static void _dpu_plane_set_danger_lut(struct drm_plane *plane, 305 - struct drm_framebuffer *fb) 323 + struct dpu_sw_pipe *pipe, 324 + const struct dpu_format *fmt) 306 325 { 307 326 struct dpu_plane *pdpu = to_dpu_plane(plane); 308 - const struct dpu_format *fmt = NULL; 309 327 u32 danger_lut, safe_lut; 310 328 311 329 if (!pdpu->is_rt_pipe) { ··· 315 331 safe_lut = pdpu->catalog->perf->safe_lut_tbl 316 332 [DPU_QOS_LUT_USAGE_NRT]; 317 333 } else { 318 - fmt = dpu_get_dpu_format_ext( 319 - fb->format->format, 320 - fb->modifier); 321 - 322 334 if (fmt && DPU_FORMAT_IS_LINEAR(fmt)) { 323 335 danger_lut = pdpu->catalog->perf->danger_lut_tbl 324 336 [DPU_QOS_LUT_USAGE_LINEAR]; ··· 341 361 danger_lut, 342 362 safe_lut); 343 363 344 - pdpu->pipe_hw->ops.setup_danger_safe_lut(pdpu->pipe_hw, 364 + pipe->sspp->ops.setup_danger_safe_lut(pipe->sspp, 345 365 danger_lut, safe_lut); 346 366 } 347 367 348 368 /** 349 369 * _dpu_plane_set_qos_ctrl - set QoS control of the given plane 350 370 * @plane: Pointer to drm plane 371 + * @pipe: Pointer to software pipe 351 372 * @enable: true to enable QoS control 352 373 * @flags: QoS control mode (enum dpu_plane_qos) 353 374 */ 354 375 static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane, 376 + struct dpu_sw_pipe *pipe, 355 377 bool enable, u32 flags) 356 378 { 357 379 struct dpu_plane *pdpu = to_dpu_plane(plane); ··· 362 380 memset(&pipe_qos_cfg, 0, sizeof(pipe_qos_cfg)); 363 381 364 382 if (flags & DPU_PLANE_QOS_VBLANK_CTRL) { 365 - pipe_qos_cfg.creq_vblank = pdpu->pipe_hw->cap->sblk->creq_vblank; 383 + pipe_qos_cfg.creq_vblank = pipe->sspp->cap->sblk->creq_vblank; 366 384 pipe_qos_cfg.danger_vblank = 367 - pdpu->pipe_hw->cap->sblk->danger_vblank; 385 + pipe->sspp->cap->sblk->danger_vblank; 368 386 pipe_qos_cfg.vblank_en = enable; 369 387 } 370 388 ··· 390 408 pipe_qos_cfg.danger_vblank, 391 409 pdpu->is_rt_pipe); 392 410 393 - pdpu->pipe_hw->ops.setup_qos_ctrl(pdpu->pipe_hw, 411 + pipe->sspp->ops.setup_qos_ctrl(pipe->sspp, 394 412 &pipe_qos_cfg); 395 413 } 396 414 397 415 /** 398 416 * _dpu_plane_set_ot_limit - set OT limit for the given plane 399 417 * @plane: Pointer to drm plane 400 - * @crtc: Pointer to drm crtc 418 + * @pipe: Pointer to software pipe 401 419 * @pipe_cfg: Pointer to pipe configuration 420 + * @frame_rate: CRTC's frame rate 402 421 */ 403 422 static void _dpu_plane_set_ot_limit(struct drm_plane *plane, 404 - struct drm_crtc *crtc, struct dpu_hw_pipe_cfg *pipe_cfg) 423 + struct dpu_sw_pipe *pipe, 424 + struct dpu_sw_pipe_cfg *pipe_cfg, 425 + int frame_rate) 405 426 { 406 427 struct dpu_plane *pdpu = to_dpu_plane(plane); 407 428 struct dpu_vbif_set_ot_params ot_params; 408 429 struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); 409 430 410 431 memset(&ot_params, 0, sizeof(ot_params)); 411 - ot_params.xin_id = pdpu->pipe_hw->cap->xin_id; 412 - ot_params.num = pdpu->pipe_hw->idx - SSPP_NONE; 432 + ot_params.xin_id = pipe->sspp->cap->xin_id; 433 + ot_params.num = pipe->sspp->idx - SSPP_NONE; 413 434 ot_params.width = drm_rect_width(&pipe_cfg->src_rect); 414 435 ot_params.height = drm_rect_height(&pipe_cfg->src_rect); 415 436 ot_params.is_wfd = !pdpu->is_rt_pipe; 416 - ot_params.frame_rate = drm_mode_vrefresh(&crtc->mode); 437 + ot_params.frame_rate = frame_rate; 417 438 ot_params.vbif_idx = VBIF_RT; 418 - ot_params.clk_ctrl = pdpu->pipe_hw->cap->clk_ctrl; 439 + ot_params.clk_ctrl = pipe->sspp->cap->clk_ctrl; 419 440 ot_params.rd = true; 420 441 421 442 dpu_vbif_set_ot_limit(dpu_kms, &ot_params); ··· 427 442 /** 428 443 * _dpu_plane_set_qos_remap - set vbif QoS for the given plane 429 444 * @plane: Pointer to drm plane 445 + * @pipe: Pointer to software pipe 430 446 */ 431 - static void _dpu_plane_set_qos_remap(struct drm_plane *plane) 447 + static void _dpu_plane_set_qos_remap(struct drm_plane *plane, 448 + struct dpu_sw_pipe *pipe) 432 449 { 433 450 struct dpu_plane *pdpu = to_dpu_plane(plane); 434 451 struct dpu_vbif_set_qos_params qos_params; ··· 438 451 439 452 memset(&qos_params, 0, sizeof(qos_params)); 440 453 qos_params.vbif_idx = VBIF_RT; 441 - qos_params.clk_ctrl = pdpu->pipe_hw->cap->clk_ctrl; 442 - qos_params.xin_id = pdpu->pipe_hw->cap->xin_id; 443 - qos_params.num = pdpu->pipe_hw->idx - SSPP_VIG0; 454 + qos_params.clk_ctrl = pipe->sspp->cap->clk_ctrl; 455 + qos_params.xin_id = pipe->sspp->cap->xin_id; 456 + qos_params.num = pipe->sspp->idx - SSPP_VIG0; 444 457 qos_params.is_rt = pdpu->is_rt_pipe; 445 458 446 459 DPU_DEBUG_PLANE(pdpu, "pipe:%d vbif:%d xin:%d rt:%d, clk_ctrl:%d\n", ··· 452 465 dpu_vbif_set_qos_remap(dpu_kms, &qos_params); 453 466 } 454 467 455 - static void _dpu_plane_set_scanout(struct drm_plane *plane, 456 - struct dpu_plane_state *pstate, 457 - struct dpu_hw_pipe_cfg *pipe_cfg, 458 - struct drm_framebuffer *fb) 459 - { 460 - struct dpu_plane *pdpu = to_dpu_plane(plane); 461 - struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base); 462 - struct msm_gem_address_space *aspace = kms->base.aspace; 463 - int ret; 464 - 465 - ret = dpu_format_populate_layout(aspace, fb, &pipe_cfg->layout); 466 - if (ret == -EAGAIN) 467 - DPU_DEBUG_PLANE(pdpu, "not updating same src addrs\n"); 468 - else if (ret) 469 - DPU_ERROR_PLANE(pdpu, "failed to get format layout, %d\n", ret); 470 - else if (pdpu->pipe_hw->ops.setup_sourceaddress) { 471 - trace_dpu_plane_set_scanout(pdpu->pipe_hw->idx, 472 - &pipe_cfg->layout, 473 - pstate->multirect_index); 474 - pdpu->pipe_hw->ops.setup_sourceaddress(pdpu->pipe_hw, pipe_cfg, 475 - pstate->multirect_index); 476 - } 477 - } 478 - 479 - static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu, 480 - struct dpu_plane_state *pstate, 468 + static void _dpu_plane_setup_scaler3(struct dpu_hw_sspp *pipe_hw, 481 469 uint32_t src_w, uint32_t src_h, uint32_t dst_w, uint32_t dst_h, 482 470 struct dpu_hw_scaler3_cfg *scale_cfg, 483 471 const struct dpu_format *fmt, 484 - uint32_t chroma_subsmpl_h, uint32_t chroma_subsmpl_v) 472 + uint32_t chroma_subsmpl_h, uint32_t chroma_subsmpl_v, 473 + unsigned int rotation) 485 474 { 486 475 uint32_t i; 487 - bool inline_rotation = pstate->rotation & DRM_MODE_ROTATE_90; 476 + bool inline_rotation = rotation & DRM_MODE_ROTATE_90; 488 477 489 478 /* 490 479 * For inline rotation cases, scaler config is post-rotation, ··· 499 536 scale_cfg->src_height[i] /= chroma_subsmpl_v; 500 537 } 501 538 502 - if (pdpu->pipe_hw->cap->features & 539 + if (pipe_hw->cap->features & 503 540 BIT(DPU_SSPP_SCALER_QSEED4)) { 504 541 scale_cfg->preload_x[i] = DPU_QSEED4_DEFAULT_PRELOAD_H; 505 542 scale_cfg->preload_y[i] = DPU_QSEED4_DEFAULT_PRELOAD_V; ··· 570 607 { 0x00, 0x3ff, 0x00, 0x3ff, 0x00, 0x3ff,}, 571 608 }; 572 609 573 - static const struct dpu_csc_cfg *_dpu_plane_get_csc(struct dpu_plane *pdpu, const struct dpu_format *fmt) 610 + static const struct dpu_csc_cfg *_dpu_plane_get_csc(struct dpu_sw_pipe *pipe, 611 + const struct dpu_format *fmt) 574 612 { 575 613 const struct dpu_csc_cfg *csc_ptr; 576 - 577 - if (!pdpu) { 578 - DPU_ERROR("invalid plane\n"); 579 - return NULL; 580 - } 581 614 582 615 if (!DPU_FORMAT_IS_YUV(fmt)) 583 616 return NULL; 584 617 585 - if (BIT(DPU_SSPP_CSC_10BIT) & pdpu->pipe_hw->cap->features) 618 + if (BIT(DPU_SSPP_CSC_10BIT) & pipe->sspp->cap->features) 586 619 csc_ptr = &dpu_csc10_YUV2RGB_601L; 587 620 else 588 621 csc_ptr = &dpu_csc_YUV2RGB_601L; 589 622 590 - DPU_DEBUG_PLANE(pdpu, "using 0x%X 0x%X 0x%X...\n", 591 - csc_ptr->csc_mv[0], 592 - csc_ptr->csc_mv[1], 593 - csc_ptr->csc_mv[2]); 594 - 595 623 return csc_ptr; 596 624 } 597 625 598 - static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu, 599 - struct dpu_plane_state *pstate, 626 + static void _dpu_plane_setup_scaler(struct dpu_sw_pipe *pipe, 600 627 const struct dpu_format *fmt, bool color_fill, 601 - struct dpu_hw_pipe_cfg *pipe_cfg) 628 + struct dpu_sw_pipe_cfg *pipe_cfg, 629 + unsigned int rotation) 602 630 { 631 + struct dpu_hw_sspp *pipe_hw = pipe->sspp; 603 632 const struct drm_format_info *info = drm_format_info(fmt->base.pixel_format); 604 633 struct dpu_hw_scaler3_cfg scaler3_cfg; 605 634 struct dpu_hw_pixel_ext pixel_ext; ··· 605 650 606 651 /* don't chroma subsample if decimating */ 607 652 /* update scaler. calculate default config for QSEED3 */ 608 - _dpu_plane_setup_scaler3(pdpu, pstate, 653 + _dpu_plane_setup_scaler3(pipe_hw, 609 654 src_width, 610 655 src_height, 611 656 dst_width, 612 657 dst_height, 613 658 &scaler3_cfg, fmt, 614 - info->hsub, info->vsub); 659 + info->hsub, info->vsub, 660 + rotation); 615 661 616 662 /* configure pixel extension based on scalar config */ 617 663 _dpu_plane_setup_pixel_ext(&scaler3_cfg, &pixel_ext, 618 664 src_width, src_height, info->hsub, info->vsub); 619 665 620 - if (pdpu->pipe_hw->ops.setup_pe) 621 - pdpu->pipe_hw->ops.setup_pe(pdpu->pipe_hw, 666 + if (pipe_hw->ops.setup_pe) 667 + pipe_hw->ops.setup_pe(pipe_hw, 622 668 &pixel_ext); 623 669 624 670 /** ··· 627 671 * bypassed. Still we need to update alpha and bitwidth 628 672 * ONLY for RECT0 629 673 */ 630 - if (pdpu->pipe_hw->ops.setup_scaler && 631 - pstate->multirect_index != DPU_SSPP_RECT_1) 632 - pdpu->pipe_hw->ops.setup_scaler(pdpu->pipe_hw, 633 - pipe_cfg, 634 - &scaler3_cfg); 674 + if (pipe_hw->ops.setup_scaler && 675 + pipe->multirect_index != DPU_SSPP_RECT_1) 676 + pipe_hw->ops.setup_scaler(pipe_hw, 677 + &scaler3_cfg, 678 + fmt); 679 + } 680 + 681 + static void _dpu_plane_color_fill_pipe(struct dpu_plane_state *pstate, 682 + struct dpu_sw_pipe *pipe, 683 + struct drm_rect *dst_rect, 684 + u32 fill_color, 685 + const struct dpu_format *fmt) 686 + { 687 + struct dpu_sw_pipe_cfg pipe_cfg; 688 + 689 + /* update sspp */ 690 + if (!pipe->sspp->ops.setup_solidfill) 691 + return; 692 + 693 + pipe->sspp->ops.setup_solidfill(pipe, fill_color); 694 + 695 + /* override scaler/decimation if solid fill */ 696 + pipe_cfg.dst_rect = *dst_rect; 697 + 698 + pipe_cfg.src_rect.x1 = 0; 699 + pipe_cfg.src_rect.y1 = 0; 700 + pipe_cfg.src_rect.x2 = 701 + drm_rect_width(&pipe_cfg.dst_rect); 702 + pipe_cfg.src_rect.y2 = 703 + drm_rect_height(&pipe_cfg.dst_rect); 704 + 705 + if (pipe->sspp->ops.setup_format) 706 + pipe->sspp->ops.setup_format(pipe, fmt, DPU_SSPP_SOLID_FILL); 707 + 708 + if (pipe->sspp->ops.setup_rects) 709 + pipe->sspp->ops.setup_rects(pipe, &pipe_cfg); 710 + 711 + _dpu_plane_setup_scaler(pipe, fmt, true, &pipe_cfg, pstate->rotation); 635 712 } 636 713 637 714 /** ··· 672 683 * @pdpu: Pointer to DPU plane object 673 684 * @color: RGB fill color value, [23..16] Blue, [15..8] Green, [7..0] Red 674 685 * @alpha: 8-bit fill alpha value, 255 selects 100% alpha 675 - * Returns: 0 on success 676 686 */ 677 - static int _dpu_plane_color_fill(struct dpu_plane *pdpu, 687 + static void _dpu_plane_color_fill(struct dpu_plane *pdpu, 678 688 uint32_t color, uint32_t alpha) 679 689 { 680 690 const struct dpu_format *fmt; 681 691 const struct drm_plane *plane = &pdpu->base; 682 692 struct dpu_plane_state *pstate = to_dpu_plane_state(plane->state); 683 - struct dpu_hw_pipe_cfg pipe_cfg; 693 + u32 fill_color = (color & 0xFFFFFF) | ((alpha & 0xFF) << 24); 684 694 685 695 DPU_DEBUG_PLANE(pdpu, "\n"); 686 696 ··· 688 700 * h/w only supports RGB variants 689 701 */ 690 702 fmt = dpu_get_dpu_format(DRM_FORMAT_ABGR8888); 703 + /* should not happen ever */ 704 + if (!fmt) 705 + return; 691 706 692 707 /* update sspp */ 693 - if (fmt && pdpu->pipe_hw->ops.setup_solidfill) { 694 - pdpu->pipe_hw->ops.setup_solidfill(pdpu->pipe_hw, 695 - (color & 0xFFFFFF) | ((alpha & 0xFF) << 24), 696 - pstate->multirect_index); 708 + _dpu_plane_color_fill_pipe(pstate, &pstate->pipe, &pstate->pipe_cfg.dst_rect, 709 + fill_color, fmt); 697 710 698 - /* override scaler/decimation if solid fill */ 699 - pipe_cfg.dst_rect = pstate->base.dst; 700 - 701 - pipe_cfg.src_rect.x1 = 0; 702 - pipe_cfg.src_rect.y1 = 0; 703 - pipe_cfg.src_rect.x2 = 704 - drm_rect_width(&pipe_cfg.dst_rect); 705 - pipe_cfg.src_rect.y2 = 706 - drm_rect_height(&pipe_cfg.dst_rect); 707 - 708 - if (pdpu->pipe_hw->ops.setup_format) 709 - pdpu->pipe_hw->ops.setup_format(pdpu->pipe_hw, 710 - fmt, DPU_SSPP_SOLID_FILL, 711 - pstate->multirect_index); 712 - 713 - if (pdpu->pipe_hw->ops.setup_rects) 714 - pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw, 715 - &pipe_cfg, 716 - pstate->multirect_index); 717 - 718 - _dpu_plane_setup_scaler(pdpu, pstate, fmt, true, &pipe_cfg); 719 - } 720 - 721 - return 0; 722 - } 723 - 724 - void dpu_plane_clear_multirect(const struct drm_plane_state *drm_state) 725 - { 726 - struct dpu_plane_state *pstate = to_dpu_plane_state(drm_state); 727 - 728 - pstate->multirect_index = DPU_SSPP_RECT_SOLO; 729 - pstate->multirect_mode = DPU_SSPP_MULTIRECT_NONE; 730 - } 731 - 732 - int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane) 733 - { 734 - struct dpu_plane_state *pstate[R_MAX]; 735 - const struct drm_plane_state *drm_state[R_MAX]; 736 - struct drm_rect src[R_MAX], dst[R_MAX]; 737 - struct dpu_plane *dpu_plane[R_MAX]; 738 - const struct dpu_format *fmt[R_MAX]; 739 - int i, buffer_lines; 740 - unsigned int max_tile_height = 1; 741 - bool parallel_fetch_qualified = true; 742 - bool has_tiled_rect = false; 743 - 744 - for (i = 0; i < R_MAX; i++) { 745 - const struct msm_format *msm_fmt; 746 - 747 - drm_state[i] = i ? plane->r1 : plane->r0; 748 - msm_fmt = msm_framebuffer_format(drm_state[i]->fb); 749 - fmt[i] = to_dpu_format(msm_fmt); 750 - 751 - if (DPU_FORMAT_IS_UBWC(fmt[i])) { 752 - has_tiled_rect = true; 753 - if (fmt[i]->tile_height > max_tile_height) 754 - max_tile_height = fmt[i]->tile_height; 755 - } 756 - } 757 - 758 - for (i = 0; i < R_MAX; i++) { 759 - int width_threshold; 760 - 761 - pstate[i] = to_dpu_plane_state(drm_state[i]); 762 - dpu_plane[i] = to_dpu_plane(drm_state[i]->plane); 763 - 764 - if (pstate[i] == NULL) { 765 - DPU_ERROR("DPU plane state of plane id %d is NULL\n", 766 - drm_state[i]->plane->base.id); 767 - return -EINVAL; 768 - } 769 - 770 - src[i].x1 = drm_state[i]->src_x >> 16; 771 - src[i].y1 = drm_state[i]->src_y >> 16; 772 - src[i].x2 = src[i].x1 + (drm_state[i]->src_w >> 16); 773 - src[i].y2 = src[i].y1 + (drm_state[i]->src_h >> 16); 774 - 775 - dst[i] = drm_plane_state_dest(drm_state[i]); 776 - 777 - if (drm_rect_calc_hscale(&src[i], &dst[i], 1, 1) != 1 || 778 - drm_rect_calc_vscale(&src[i], &dst[i], 1, 1) != 1) { 779 - DPU_ERROR_PLANE(dpu_plane[i], 780 - "scaling is not supported in multirect mode\n"); 781 - return -EINVAL; 782 - } 783 - 784 - if (DPU_FORMAT_IS_YUV(fmt[i])) { 785 - DPU_ERROR_PLANE(dpu_plane[i], 786 - "Unsupported format for multirect mode\n"); 787 - return -EINVAL; 788 - } 789 - 790 - /** 791 - * SSPP PD_MEM is split half - one for each RECT. 792 - * Tiled formats need 5 lines of buffering while fetching 793 - * whereas linear formats need only 2 lines. 794 - * So we cannot support more than half of the supported SSPP 795 - * width for tiled formats. 796 - */ 797 - width_threshold = dpu_plane[i]->catalog->caps->max_linewidth; 798 - if (has_tiled_rect) 799 - width_threshold /= 2; 800 - 801 - if (parallel_fetch_qualified && 802 - drm_rect_width(&src[i]) > width_threshold) 803 - parallel_fetch_qualified = false; 804 - 805 - } 806 - 807 - /* Validate RECT's and set the mode */ 808 - 809 - /* Prefer PARALLEL FETCH Mode over TIME_MX Mode */ 810 - if (parallel_fetch_qualified) { 811 - pstate[R0]->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; 812 - pstate[R1]->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; 813 - 814 - goto done; 815 - } 816 - 817 - /* TIME_MX Mode */ 818 - buffer_lines = 2 * max_tile_height; 819 - 820 - if (dst[R1].y1 >= dst[R0].y2 + buffer_lines || 821 - dst[R0].y1 >= dst[R1].y2 + buffer_lines) { 822 - pstate[R0]->multirect_mode = DPU_SSPP_MULTIRECT_TIME_MX; 823 - pstate[R1]->multirect_mode = DPU_SSPP_MULTIRECT_TIME_MX; 824 - } else { 825 - DPU_ERROR( 826 - "No multirect mode possible for the planes (%d - %d)\n", 827 - drm_state[R0]->plane->base.id, 828 - drm_state[R1]->plane->base.id); 829 - return -EINVAL; 830 - } 831 - 832 - done: 833 - pstate[R0]->multirect_index = DPU_SSPP_RECT_0; 834 - pstate[R1]->multirect_index = DPU_SSPP_RECT_1; 835 - 836 - DPU_DEBUG_PLANE(dpu_plane[R0], "R0: %d - %d\n", 837 - pstate[R0]->multirect_mode, pstate[R0]->multirect_index); 838 - DPU_DEBUG_PLANE(dpu_plane[R1], "R1: %d - %d\n", 839 - pstate[R1]->multirect_mode, pstate[R1]->multirect_index); 840 - return 0; 711 + if (pstate->r_pipe.sspp) 712 + _dpu_plane_color_fill_pipe(pstate, &pstate->r_pipe, &pstate->r_pipe_cfg.dst_rect, 713 + fill_color, fmt); 841 714 } 842 715 843 716 static int dpu_plane_prepare_fb(struct drm_plane *plane, ··· 763 914 old_pstate->needs_dirtyfb); 764 915 } 765 916 766 - static bool dpu_plane_validate_src(struct drm_rect *src, 767 - struct drm_rect *fb_rect, 768 - uint32_t min_src_size) 769 - { 770 - /* Ensure fb size is supported */ 771 - if (drm_rect_width(fb_rect) > MAX_IMG_WIDTH || 772 - drm_rect_height(fb_rect) > MAX_IMG_HEIGHT) 773 - return false; 774 - 775 - /* Ensure src rect is above the minimum size */ 776 - if (drm_rect_width(src) < min_src_size || 777 - drm_rect_height(src) < min_src_size) 778 - return false; 779 - 780 - /* Ensure src is fully encapsulated in fb */ 781 - return drm_rect_intersect(fb_rect, src) && 782 - drm_rect_equals(fb_rect, src); 783 - } 784 - 785 917 static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu, 786 918 const struct dpu_sspp_sub_blks *sblk, 787 919 struct drm_rect src, const struct dpu_format *fmt) ··· 791 961 return 0; 792 962 } 793 963 964 + static int dpu_plane_atomic_check_pipe(struct dpu_plane *pdpu, 965 + struct dpu_sw_pipe *pipe, 966 + struct dpu_sw_pipe_cfg *pipe_cfg, 967 + const struct dpu_format *fmt) 968 + { 969 + uint32_t min_src_size; 970 + 971 + min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1; 972 + 973 + if (DPU_FORMAT_IS_YUV(fmt) && 974 + (!(pipe->sspp->cap->features & DPU_SSPP_SCALER) || 975 + !(pipe->sspp->cap->features & DPU_SSPP_CSC_ANY))) { 976 + DPU_DEBUG_PLANE(pdpu, 977 + "plane doesn't have scaler/csc for yuv\n"); 978 + return -EINVAL; 979 + } 980 + 981 + /* check src bounds */ 982 + if (drm_rect_width(&pipe_cfg->src_rect) < min_src_size || 983 + drm_rect_height(&pipe_cfg->src_rect) < min_src_size) { 984 + DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n", 985 + DRM_RECT_ARG(&pipe_cfg->src_rect)); 986 + return -E2BIG; 987 + } 988 + 989 + /* valid yuv image */ 990 + if (DPU_FORMAT_IS_YUV(fmt) && 991 + (pipe_cfg->src_rect.x1 & 0x1 || 992 + pipe_cfg->src_rect.y1 & 0x1 || 993 + drm_rect_width(&pipe_cfg->src_rect) & 0x1 || 994 + drm_rect_height(&pipe_cfg->src_rect) & 0x1)) { 995 + DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n", 996 + DRM_RECT_ARG(&pipe_cfg->src_rect)); 997 + return -EINVAL; 998 + } 999 + 1000 + /* min dst support */ 1001 + if (drm_rect_width(&pipe_cfg->dst_rect) < 0x1 || 1002 + drm_rect_height(&pipe_cfg->dst_rect) < 0x1) { 1003 + DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n", 1004 + DRM_RECT_ARG(&pipe_cfg->dst_rect)); 1005 + return -EINVAL; 1006 + } 1007 + 1008 + return 0; 1009 + } 1010 + 794 1011 static int dpu_plane_atomic_check(struct drm_plane *plane, 795 1012 struct drm_atomic_state *state) 796 1013 { ··· 846 969 int ret = 0, min_scale; 847 970 struct dpu_plane *pdpu = to_dpu_plane(plane); 848 971 struct dpu_plane_state *pstate = to_dpu_plane_state(new_plane_state); 972 + struct dpu_sw_pipe *pipe = &pstate->pipe; 973 + struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; 849 974 const struct drm_crtc_state *crtc_state = NULL; 850 975 const struct dpu_format *fmt; 851 - struct drm_rect src, dst, fb_rect = { 0 }; 852 - uint32_t min_src_size, max_linewidth; 976 + struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; 977 + struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg; 978 + struct drm_rect fb_rect = { 0 }; 979 + uint32_t max_linewidth; 853 980 unsigned int rotation; 854 981 uint32_t supported_rotations; 855 - const struct dpu_sspp_cfg *pipe_hw_caps = pdpu->pipe_hw->cap; 856 - const struct dpu_sspp_sub_blks *sblk = pdpu->pipe_hw->cap->sblk; 982 + const struct dpu_sspp_cfg *pipe_hw_caps = pstate->pipe.sspp->cap; 983 + const struct dpu_sspp_sub_blks *sblk = pstate->pipe.sspp->cap->sblk; 857 984 858 985 if (new_plane_state->crtc) 859 986 crtc_state = drm_atomic_get_new_crtc_state(state, ··· 875 994 if (!new_plane_state->visible) 876 995 return 0; 877 996 878 - src.x1 = new_plane_state->src_x >> 16; 879 - src.y1 = new_plane_state->src_y >> 16; 880 - src.x2 = src.x1 + (new_plane_state->src_w >> 16); 881 - src.y2 = src.y1 + (new_plane_state->src_h >> 16); 997 + pipe->multirect_index = DPU_SSPP_RECT_SOLO; 998 + pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; 999 + r_pipe->multirect_index = DPU_SSPP_RECT_SOLO; 1000 + r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; 1001 + r_pipe->sspp = NULL; 882 1002 883 - dst = drm_plane_state_dest(new_plane_state); 1003 + pstate->stage = DPU_STAGE_0 + pstate->base.normalized_zpos; 1004 + if (pstate->stage >= pdpu->catalog->caps->max_mixer_blendstages) { 1005 + DPU_ERROR("> %d plane stages assigned\n", 1006 + pdpu->catalog->caps->max_mixer_blendstages - DPU_STAGE_0); 1007 + return -EINVAL; 1008 + } 1009 + 1010 + pipe_cfg->src_rect = new_plane_state->src; 1011 + 1012 + /* state->src is 16.16, src_rect is not */ 1013 + pipe_cfg->src_rect.x1 >>= 16; 1014 + pipe_cfg->src_rect.x2 >>= 16; 1015 + pipe_cfg->src_rect.y1 >>= 16; 1016 + pipe_cfg->src_rect.y2 >>= 16; 1017 + 1018 + pipe_cfg->dst_rect = new_plane_state->dst; 884 1019 885 1020 fb_rect.x2 = new_plane_state->fb->width; 886 1021 fb_rect.y2 = new_plane_state->fb->height; 887 1022 888 - max_linewidth = pdpu->catalog->caps->max_linewidth; 1023 + /* Ensure fb size is supported */ 1024 + if (drm_rect_width(&fb_rect) > MAX_IMG_WIDTH || 1025 + drm_rect_height(&fb_rect) > MAX_IMG_HEIGHT) { 1026 + DPU_DEBUG_PLANE(pdpu, "invalid framebuffer " DRM_RECT_FMT "\n", 1027 + DRM_RECT_ARG(&fb_rect)); 1028 + return -E2BIG; 1029 + } 889 1030 890 1031 fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb)); 891 1032 892 - min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1; 1033 + max_linewidth = pdpu->catalog->caps->max_linewidth; 893 1034 894 - if (DPU_FORMAT_IS_YUV(fmt) && 895 - (!(pipe_hw_caps->features & DPU_SSPP_SCALER) || 896 - !(pipe_hw_caps->features & DPU_SSPP_CSC_ANY))) { 897 - DPU_DEBUG_PLANE(pdpu, 898 - "plane doesn't have scaler/csc for yuv\n"); 899 - return -EINVAL; 1035 + if (drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) { 1036 + /* 1037 + * In parallel multirect case only the half of the usual width 1038 + * is supported for tiled formats. If we are here, we know that 1039 + * full width is more than max_linewidth, thus each rect is 1040 + * wider than allowed. 1041 + */ 1042 + if (DPU_FORMAT_IS_UBWC(fmt)) { 1043 + DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u, tiled format\n", 1044 + DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); 1045 + return -E2BIG; 1046 + } 900 1047 901 - /* check src bounds */ 902 - } else if (!dpu_plane_validate_src(&src, &fb_rect, min_src_size)) { 903 - DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n", 904 - DRM_RECT_ARG(&src)); 905 - return -E2BIG; 1048 + if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) { 1049 + DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", 1050 + DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); 1051 + return -E2BIG; 1052 + } 906 1053 907 - /* valid yuv image */ 908 - } else if (DPU_FORMAT_IS_YUV(fmt) && 909 - (src.x1 & 0x1 || src.y1 & 0x1 || 910 - drm_rect_width(&src) & 0x1 || 911 - drm_rect_height(&src) & 0x1)) { 912 - DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n", 913 - DRM_RECT_ARG(&src)); 914 - return -EINVAL; 1054 + if (drm_rect_width(&pipe_cfg->src_rect) != drm_rect_width(&pipe_cfg->dst_rect) || 1055 + drm_rect_height(&pipe_cfg->src_rect) != drm_rect_height(&pipe_cfg->dst_rect) || 1056 + (!test_bit(DPU_SSPP_SMART_DMA_V1, &pipe->sspp->cap->features) && 1057 + !test_bit(DPU_SSPP_SMART_DMA_V2, &pipe->sspp->cap->features)) || 1058 + DPU_FORMAT_IS_YUV(fmt)) { 1059 + DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u, can't use split source\n", 1060 + DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); 1061 + return -E2BIG; 1062 + } 915 1063 916 - /* min dst support */ 917 - } else if (drm_rect_width(&dst) < 0x1 || drm_rect_height(&dst) < 0x1) { 918 - DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n", 919 - DRM_RECT_ARG(&dst)); 920 - return -EINVAL; 1064 + /* 1065 + * Use multirect for wide plane. We do not support dynamic 1066 + * assignment of SSPPs, so we know the configuration. 1067 + */ 1068 + pipe->multirect_index = DPU_SSPP_RECT_0; 1069 + pipe->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; 921 1070 922 - /* check decimated source width */ 923 - } else if (drm_rect_width(&src) > max_linewidth) { 924 - DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", 925 - DRM_RECT_ARG(&src), max_linewidth); 926 - return -E2BIG; 1071 + r_pipe->sspp = pipe->sspp; 1072 + r_pipe->multirect_index = DPU_SSPP_RECT_1; 1073 + r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; 1074 + 1075 + *r_pipe_cfg = *pipe_cfg; 1076 + pipe_cfg->src_rect.x2 = (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x2) >> 1; 1077 + pipe_cfg->dst_rect.x2 = (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x2) >> 1; 1078 + r_pipe_cfg->src_rect.x1 = pipe_cfg->src_rect.x2; 1079 + r_pipe_cfg->dst_rect.x1 = pipe_cfg->dst_rect.x2; 1080 + } 1081 + 1082 + ret = dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg, fmt); 1083 + if (ret) 1084 + return ret; 1085 + 1086 + if (r_pipe->sspp) { 1087 + ret = dpu_plane_atomic_check_pipe(pdpu, r_pipe, r_pipe_cfg, fmt); 1088 + if (ret) 1089 + return ret; 927 1090 } 928 1091 929 1092 supported_rotations = DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0; ··· 980 1055 981 1056 if ((pipe_hw_caps->features & BIT(DPU_SSPP_INLINE_ROTATION)) && 982 1057 (rotation & DRM_MODE_ROTATE_90)) { 983 - ret = dpu_plane_check_inline_rotation(pdpu, sblk, src, fmt); 1058 + ret = dpu_plane_check_inline_rotation(pdpu, sblk, pipe_cfg->src_rect, fmt); 984 1059 if (ret) 985 1060 return ret; 986 1061 } ··· 989 1064 pstate->needs_qos_remap = drm_atomic_crtc_needs_modeset(crtc_state); 990 1065 991 1066 return 0; 1067 + } 1068 + 1069 + static void dpu_plane_flush_csc(struct dpu_plane *pdpu, struct dpu_sw_pipe *pipe) 1070 + { 1071 + const struct dpu_format *format = 1072 + to_dpu_format(msm_framebuffer_format(pdpu->base.state->fb)); 1073 + const struct dpu_csc_cfg *csc_ptr; 1074 + 1075 + if (!pipe->sspp || !pipe->sspp->ops.setup_csc) 1076 + return; 1077 + 1078 + csc_ptr = _dpu_plane_get_csc(pipe, format); 1079 + if (!csc_ptr) 1080 + return; 1081 + 1082 + DPU_DEBUG_PLANE(pdpu, "using 0x%X 0x%X 0x%X...\n", 1083 + csc_ptr->csc_mv[0], 1084 + csc_ptr->csc_mv[1], 1085 + csc_ptr->csc_mv[2]); 1086 + 1087 + pipe->sspp->ops.setup_csc(pipe->sspp, csc_ptr); 1088 + 992 1089 } 993 1090 994 1091 void dpu_plane_flush(struct drm_plane *plane) ··· 1036 1089 else if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) 1037 1090 /* force 100% alpha */ 1038 1091 _dpu_plane_color_fill(pdpu, pdpu->color_fill, 0xFF); 1039 - else if (pdpu->pipe_hw && pdpu->pipe_hw->ops.setup_csc) { 1040 - const struct dpu_format *fmt = to_dpu_format(msm_framebuffer_format(plane->state->fb)); 1041 - const struct dpu_csc_cfg *csc_ptr = _dpu_plane_get_csc(pdpu, fmt); 1042 - 1043 - if (csc_ptr) 1044 - pdpu->pipe_hw->ops.setup_csc(pdpu->pipe_hw, csc_ptr); 1092 + else { 1093 + dpu_plane_flush_csc(pdpu, &pstate->pipe); 1094 + dpu_plane_flush_csc(pdpu, &pstate->r_pipe); 1045 1095 } 1046 1096 1047 1097 /* flag h/w flush complete */ ··· 1062 1118 pdpu->is_error = error; 1063 1119 } 1064 1120 1065 - static void dpu_plane_sspp_atomic_update(struct drm_plane *plane) 1121 + static void dpu_plane_sspp_update_pipe(struct drm_plane *plane, 1122 + struct dpu_sw_pipe *pipe, 1123 + struct dpu_sw_pipe_cfg *pipe_cfg, 1124 + const struct dpu_format *fmt, 1125 + int frame_rate, 1126 + struct dpu_hw_fmt_layout *layout) 1066 1127 { 1067 1128 uint32_t src_flags; 1068 1129 struct dpu_plane *pdpu = to_dpu_plane(plane); 1069 1130 struct drm_plane_state *state = plane->state; 1070 1131 struct dpu_plane_state *pstate = to_dpu_plane_state(state); 1071 - struct drm_crtc *crtc = state->crtc; 1072 - struct drm_framebuffer *fb = state->fb; 1073 - bool is_rt_pipe; 1074 - const struct dpu_format *fmt = 1075 - to_dpu_format(msm_framebuffer_format(fb)); 1076 - struct dpu_hw_pipe_cfg pipe_cfg; 1077 1132 1078 - memset(&pipe_cfg, 0, sizeof(struct dpu_hw_pipe_cfg)); 1133 + if (layout && pipe->sspp->ops.setup_sourceaddress) { 1134 + trace_dpu_plane_set_scanout(pipe, layout); 1135 + pipe->sspp->ops.setup_sourceaddress(pipe, layout); 1136 + } 1079 1137 1080 - _dpu_plane_set_scanout(plane, pstate, &pipe_cfg, fb); 1081 - 1082 - pstate->pending = true; 1083 - 1084 - is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT); 1085 - pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe); 1086 - pdpu->is_rt_pipe = is_rt_pipe; 1087 - 1088 - _dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL); 1089 - 1090 - DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT 1091 - ", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src), 1092 - crtc->base.id, DRM_RECT_ARG(&state->dst), 1093 - (char *)&fmt->base.pixel_format, DPU_FORMAT_IS_UBWC(fmt)); 1094 - 1095 - pipe_cfg.src_rect = state->src; 1096 - 1097 - /* state->src is 16.16, src_rect is not */ 1098 - pipe_cfg.src_rect.x1 >>= 16; 1099 - pipe_cfg.src_rect.x2 >>= 16; 1100 - pipe_cfg.src_rect.y1 >>= 16; 1101 - pipe_cfg.src_rect.y2 >>= 16; 1102 - 1103 - pipe_cfg.dst_rect = state->dst; 1138 + _dpu_plane_set_qos_ctrl(plane, pipe, false, DPU_PLANE_QOS_PANIC_CTRL); 1104 1139 1105 1140 /* override for color fill */ 1106 1141 if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) { ··· 1087 1164 return; 1088 1165 } 1089 1166 1090 - if (pdpu->pipe_hw->ops.setup_rects) { 1091 - pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw, 1092 - &pipe_cfg, 1093 - pstate->multirect_index); 1167 + if (pipe->sspp->ops.setup_rects) { 1168 + pipe->sspp->ops.setup_rects(pipe, 1169 + pipe_cfg); 1094 1170 } 1095 1171 1096 - _dpu_plane_setup_scaler(pdpu, pstate, fmt, false, &pipe_cfg); 1172 + _dpu_plane_setup_scaler(pipe, fmt, false, pipe_cfg, pstate->rotation); 1097 1173 1098 - if (pdpu->pipe_hw->ops.setup_multirect) 1099 - pdpu->pipe_hw->ops.setup_multirect( 1100 - pdpu->pipe_hw, 1101 - pstate->multirect_index, 1102 - pstate->multirect_mode); 1174 + if (pipe->sspp->ops.setup_multirect) 1175 + pipe->sspp->ops.setup_multirect( 1176 + pipe); 1103 1177 1104 - if (pdpu->pipe_hw->ops.setup_format) { 1178 + if (pipe->sspp->ops.setup_format) { 1105 1179 unsigned int rotation = pstate->rotation; 1106 1180 1107 1181 src_flags = 0x0; ··· 1113 1193 src_flags |= DPU_SSPP_ROT_90; 1114 1194 1115 1195 /* update format */ 1116 - pdpu->pipe_hw->ops.setup_format(pdpu->pipe_hw, fmt, src_flags, 1117 - pstate->multirect_index); 1196 + pipe->sspp->ops.setup_format(pipe, fmt, src_flags); 1118 1197 1119 - if (pdpu->pipe_hw->ops.setup_cdp) { 1198 + if (pipe->sspp->ops.setup_cdp) { 1120 1199 struct dpu_hw_cdp_cfg cdp_cfg; 1121 1200 1122 1201 memset(&cdp_cfg, 0, sizeof(struct dpu_hw_cdp_cfg)); ··· 1129 1210 DPU_FORMAT_IS_TILE(fmt); 1130 1211 cdp_cfg.preload_ahead = DPU_SSPP_CDP_PRELOAD_AHEAD_64; 1131 1212 1132 - pdpu->pipe_hw->ops.setup_cdp(pdpu->pipe_hw, &cdp_cfg, pstate->multirect_index); 1213 + pipe->sspp->ops.setup_cdp(pipe, &cdp_cfg); 1133 1214 } 1134 1215 } 1135 1216 1136 - _dpu_plane_set_qos_lut(plane, fb, &pipe_cfg); 1137 - _dpu_plane_set_danger_lut(plane, fb); 1217 + _dpu_plane_set_qos_lut(plane, pipe, fmt, pipe_cfg); 1218 + _dpu_plane_set_danger_lut(plane, pipe, fmt); 1138 1219 1139 1220 if (plane->type != DRM_PLANE_TYPE_CURSOR) { 1140 - _dpu_plane_set_qos_ctrl(plane, true, DPU_PLANE_QOS_PANIC_CTRL); 1141 - _dpu_plane_set_ot_limit(plane, crtc, &pipe_cfg); 1221 + _dpu_plane_set_qos_ctrl(plane, pipe, true, DPU_PLANE_QOS_PANIC_CTRL); 1222 + _dpu_plane_set_ot_limit(plane, pipe, pipe_cfg, frame_rate); 1142 1223 } 1143 1224 1144 - if (pstate->needs_qos_remap) { 1225 + if (pstate->needs_qos_remap) 1226 + _dpu_plane_set_qos_remap(plane, pipe); 1227 + } 1228 + 1229 + static void dpu_plane_sspp_atomic_update(struct drm_plane *plane) 1230 + { 1231 + struct dpu_plane *pdpu = to_dpu_plane(plane); 1232 + struct drm_plane_state *state = plane->state; 1233 + struct dpu_plane_state *pstate = to_dpu_plane_state(state); 1234 + struct dpu_sw_pipe *pipe = &pstate->pipe; 1235 + struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; 1236 + struct drm_crtc *crtc = state->crtc; 1237 + struct drm_framebuffer *fb = state->fb; 1238 + bool is_rt_pipe; 1239 + const struct dpu_format *fmt = 1240 + to_dpu_format(msm_framebuffer_format(fb)); 1241 + struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; 1242 + struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg; 1243 + struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base); 1244 + struct msm_gem_address_space *aspace = kms->base.aspace; 1245 + struct dpu_hw_fmt_layout layout; 1246 + bool layout_valid = false; 1247 + int ret; 1248 + 1249 + ret = dpu_format_populate_layout(aspace, fb, &layout); 1250 + if (ret) 1251 + DPU_ERROR_PLANE(pdpu, "failed to get format layout, %d\n", ret); 1252 + else 1253 + layout_valid = true; 1254 + 1255 + pstate->pending = true; 1256 + 1257 + is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT); 1258 + pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe); 1259 + pdpu->is_rt_pipe = is_rt_pipe; 1260 + 1261 + DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT 1262 + ", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src), 1263 + crtc->base.id, DRM_RECT_ARG(&state->dst), 1264 + (char *)&fmt->base.pixel_format, DPU_FORMAT_IS_UBWC(fmt)); 1265 + 1266 + dpu_plane_sspp_update_pipe(plane, pipe, pipe_cfg, fmt, 1267 + drm_mode_vrefresh(&crtc->mode), 1268 + layout_valid ? &layout : NULL); 1269 + 1270 + if (r_pipe->sspp) { 1271 + dpu_plane_sspp_update_pipe(plane, r_pipe, r_pipe_cfg, fmt, 1272 + drm_mode_vrefresh(&crtc->mode), 1273 + layout_valid ? &layout : NULL); 1274 + } 1275 + 1276 + if (pstate->needs_qos_remap) 1145 1277 pstate->needs_qos_remap = false; 1146 - _dpu_plane_set_qos_remap(plane); 1278 + 1279 + pstate->plane_fetch_bw = _dpu_plane_calc_bw(pdpu->catalog, fmt, 1280 + &crtc->mode, pipe_cfg); 1281 + 1282 + pstate->plane_clk = _dpu_plane_calc_clk(&crtc->mode, pipe_cfg); 1283 + 1284 + if (r_pipe->sspp) { 1285 + pstate->plane_fetch_bw += _dpu_plane_calc_bw(pdpu->catalog, fmt, &crtc->mode, r_pipe_cfg); 1286 + 1287 + pstate->plane_clk = max(pstate->plane_clk, _dpu_plane_calc_clk(&crtc->mode, r_pipe_cfg)); 1147 1288 } 1148 - 1149 - _dpu_plane_calc_bw(plane, fb, &pipe_cfg); 1150 - 1151 - _dpu_plane_calc_clk(plane, &pipe_cfg); 1152 1289 } 1153 1290 1154 1291 static void _dpu_plane_atomic_disable(struct drm_plane *plane) 1155 1292 { 1156 1293 struct drm_plane_state *state = plane->state; 1157 1294 struct dpu_plane_state *pstate = to_dpu_plane_state(state); 1295 + struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; 1158 1296 1159 1297 trace_dpu_plane_disable(DRMID(plane), false, 1160 - pstate->multirect_mode); 1298 + pstate->pipe.multirect_mode); 1299 + 1300 + if (r_pipe->sspp) { 1301 + r_pipe->multirect_index = DPU_SSPP_RECT_SOLO; 1302 + r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; 1303 + 1304 + if (r_pipe->sspp->ops.setup_multirect) 1305 + r_pipe->sspp->ops.setup_multirect(r_pipe); 1306 + } 1161 1307 1162 1308 pstate->pending = true; 1163 1309 } ··· 1248 1264 static void dpu_plane_destroy(struct drm_plane *plane) 1249 1265 { 1250 1266 struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; 1267 + struct dpu_plane_state *pstate; 1251 1268 1252 1269 DPU_DEBUG_PLANE(pdpu, "\n"); 1253 1270 1254 1271 if (pdpu) { 1255 - _dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL); 1272 + pstate = to_dpu_plane_state(plane->state); 1273 + _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false, DPU_PLANE_QOS_PANIC_CTRL); 1274 + 1275 + if (pstate->r_pipe.sspp) 1276 + _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false, DPU_PLANE_QOS_PANIC_CTRL); 1256 1277 1257 1278 mutex_destroy(&pdpu->lock); 1258 1279 1259 1280 /* this will destroy the states as well */ 1260 1281 drm_plane_cleanup(plane); 1261 - 1262 - dpu_hw_sspp_destroy(pdpu->pipe_hw); 1263 1282 1264 1283 kfree(pdpu); 1265 1284 } ··· 1339 1352 const struct drm_plane_state *state) 1340 1353 { 1341 1354 const struct dpu_plane_state *pstate = to_dpu_plane_state(state); 1342 - const struct dpu_plane *pdpu = to_dpu_plane(state->plane); 1355 + const struct dpu_sw_pipe *pipe = &pstate->pipe; 1356 + const struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; 1357 + const struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; 1358 + const struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg; 1343 1359 1344 1360 drm_printf(p, "\tstage=%d\n", pstate->stage); 1345 - drm_printf(p, "\tsspp=%s\n", pdpu->pipe_hw->cap->name); 1346 - drm_printf(p, "\tmultirect_mode=%s\n", dpu_get_multirect_mode(pstate->multirect_mode)); 1347 - drm_printf(p, "\tmultirect_index=%s\n", dpu_get_multirect_index(pstate->multirect_index)); 1361 + 1362 + drm_printf(p, "\tsspp[0]=%s\n", pipe->sspp->cap->name); 1363 + drm_printf(p, "\tmultirect_mode[0]=%s\n", dpu_get_multirect_mode(pipe->multirect_mode)); 1364 + drm_printf(p, "\tmultirect_index[0]=%s\n", 1365 + dpu_get_multirect_index(pipe->multirect_index)); 1366 + drm_printf(p, "\tsrc[0]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&pipe_cfg->src_rect)); 1367 + drm_printf(p, "\tdst[0]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&pipe_cfg->dst_rect)); 1368 + 1369 + if (r_pipe->sspp) { 1370 + drm_printf(p, "\tsspp[1]=%s\n", r_pipe->sspp->cap->name); 1371 + drm_printf(p, "\tmultirect_mode[1]=%s\n", 1372 + dpu_get_multirect_mode(r_pipe->multirect_mode)); 1373 + drm_printf(p, "\tmultirect_index[1]=%s\n", 1374 + dpu_get_multirect_index(r_pipe->multirect_index)); 1375 + drm_printf(p, "\tsrc[1]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&r_pipe_cfg->src_rect)); 1376 + drm_printf(p, "\tdst[1]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&r_pipe_cfg->dst_rect)); 1377 + } 1348 1378 } 1349 1379 1350 1380 static void dpu_plane_reset(struct drm_plane *plane) 1351 1381 { 1352 1382 struct dpu_plane *pdpu; 1353 1383 struct dpu_plane_state *pstate; 1384 + struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); 1354 1385 1355 1386 if (!plane) { 1356 1387 DPU_ERROR("invalid plane\n"); ··· 1390 1385 return; 1391 1386 } 1392 1387 1388 + /* 1389 + * Set the SSPP here until we have proper virtualized DPU planes. 1390 + * This is the place where the state is allocated, so fill it fully. 1391 + */ 1392 + pstate->pipe.sspp = dpu_rm_get_sspp(&dpu_kms->rm, pdpu->pipe); 1393 + pstate->pipe.multirect_index = DPU_SSPP_RECT_SOLO; 1394 + pstate->pipe.multirect_mode = DPU_SSPP_MULTIRECT_NONE; 1395 + 1396 + pstate->r_pipe.sspp = NULL; 1397 + 1393 1398 __drm_atomic_helper_plane_reset(plane, &pstate->base); 1394 1399 } 1395 1400 ··· 1407 1392 void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable) 1408 1393 { 1409 1394 struct dpu_plane *pdpu = to_dpu_plane(plane); 1395 + struct dpu_plane_state *pstate = to_dpu_plane_state(plane->state); 1410 1396 struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); 1411 1397 1412 1398 if (!pdpu->is_rt_pipe) 1413 1399 return; 1414 1400 1415 1401 pm_runtime_get_sync(&dpu_kms->pdev->dev); 1416 - _dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL); 1402 + _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, enable, DPU_PLANE_QOS_PANIC_CTRL); 1403 + if (pstate->r_pipe.sspp) 1404 + _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, enable, DPU_PLANE_QOS_PANIC_CTRL); 1417 1405 pm_runtime_put_sync(&dpu_kms->pdev->dev); 1418 - } 1419 - 1420 - /* SSPP live inside dpu_plane private data only. Enumerate them here. */ 1421 - void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) 1422 - { 1423 - struct drm_plane *plane; 1424 - struct dentry *entry = debugfs_create_dir("sspp", debugfs_root); 1425 - 1426 - if (IS_ERR(entry)) 1427 - return; 1428 - 1429 - drm_for_each_plane(plane, dpu_kms->dev) { 1430 - struct dpu_plane *pdpu = to_dpu_plane(plane); 1431 - 1432 - _dpu_hw_sspp_init_debugfs(pdpu->pipe_hw, dpu_kms, entry); 1433 - } 1434 1406 } 1435 1407 #endif 1436 1408 ··· 1452 1450 .atomic_update = dpu_plane_atomic_update, 1453 1451 }; 1454 1452 1455 - enum dpu_sspp dpu_plane_pipe(struct drm_plane *plane) 1456 - { 1457 - return plane ? to_dpu_plane(plane)->pipe : SSPP_NONE; 1458 - } 1459 - 1460 1453 /* initialize plane */ 1461 1454 struct drm_plane *dpu_plane_init(struct drm_device *dev, 1462 1455 uint32_t pipe, enum drm_plane_type type, ··· 1462 1465 struct dpu_plane *pdpu; 1463 1466 struct msm_drm_private *priv = dev->dev_private; 1464 1467 struct dpu_kms *kms = to_dpu_kms(priv->kms); 1468 + struct dpu_hw_sspp *pipe_hw; 1465 1469 uint32_t num_formats; 1466 1470 uint32_t supported_rotations; 1467 1471 int ret = -EINVAL; ··· 1480 1482 pdpu->pipe = pipe; 1481 1483 1482 1484 /* initialize underlying h/w driver */ 1483 - pdpu->pipe_hw = dpu_hw_sspp_init(pipe, kms->mmio, kms->catalog); 1484 - if (IS_ERR(pdpu->pipe_hw)) { 1485 - DPU_ERROR("[%u]SSPP init failed\n", pipe); 1486 - ret = PTR_ERR(pdpu->pipe_hw); 1485 + pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe); 1486 + if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) { 1487 + DPU_ERROR("[%u]SSPP is invalid\n", pipe); 1487 1488 goto clean_plane; 1488 - } else if (!pdpu->pipe_hw->cap || !pdpu->pipe_hw->cap->sblk) { 1489 - DPU_ERROR("[%u]SSPP init returned invalid cfg\n", pipe); 1490 - goto clean_sspp; 1491 1489 } 1492 1490 1493 - format_list = pdpu->pipe_hw->cap->sblk->format_list; 1494 - num_formats = pdpu->pipe_hw->cap->sblk->num_formats; 1491 + format_list = pipe_hw->cap->sblk->format_list; 1492 + num_formats = pipe_hw->cap->sblk->num_formats; 1495 1493 1496 1494 ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs, 1497 1495 format_list, num_formats, 1498 1496 supported_format_modifiers, type, NULL); 1499 1497 if (ret) 1500 - goto clean_sspp; 1498 + goto clean_plane; 1501 1499 1502 1500 pdpu->catalog = kms->catalog; 1503 1501 ··· 1509 1515 1510 1516 supported_rotations = DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; 1511 1517 1512 - if (pdpu->pipe_hw->cap->features & BIT(DPU_SSPP_INLINE_ROTATION)) 1518 + if (pipe_hw->cap->features & BIT(DPU_SSPP_INLINE_ROTATION)) 1513 1519 supported_rotations |= DRM_MODE_ROTATE_MASK; 1514 1520 1515 1521 drm_plane_create_rotation_property(plane, ··· 1526 1532 pipe, plane->base.id); 1527 1533 return plane; 1528 1534 1529 - clean_sspp: 1530 - if (pdpu && pdpu->pipe_hw) 1531 - dpu_hw_sspp_destroy(pdpu->pipe_hw); 1532 1535 clean_plane: 1533 1536 kfree(pdpu); 1534 1537 return ERR_PTR(ret);
+8 -32
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
··· 18 18 * struct dpu_plane_state: Define dpu extension of drm plane state object 19 19 * @base: base drm plane state object 20 20 * @aspace: pointer to address space for input/output buffers 21 + * @pipe: software pipe description 22 + * @r_pipe: software pipe description of the second pipe 23 + * @pipe_cfg: software pipe configuration 24 + * @r_pipe_cfg: software pipe configuration for the second pipe 21 25 * @stage: assigned by crtc blender 22 26 * @needs_qos_remap: qos remap settings need to be updated 23 27 * @multirect_index: index of the rectangle of SSPP ··· 35 31 struct dpu_plane_state { 36 32 struct drm_plane_state base; 37 33 struct msm_gem_address_space *aspace; 34 + struct dpu_sw_pipe pipe; 35 + struct dpu_sw_pipe r_pipe; 36 + struct dpu_sw_pipe_cfg pipe_cfg; 37 + struct dpu_sw_pipe_cfg r_pipe_cfg; 38 38 enum dpu_stage stage; 39 39 bool needs_qos_remap; 40 - uint32_t multirect_index; 41 - uint32_t multirect_mode; 42 40 bool pending; 43 41 44 42 u64 plane_fetch_bw; ··· 50 44 unsigned int rotation; 51 45 }; 52 46 53 - /** 54 - * struct dpu_multirect_plane_states: Defines multirect pair of drm plane states 55 - * @r0: drm plane configured on rect 0 56 - * @r1: drm plane configured on rect 1 57 - */ 58 - struct dpu_multirect_plane_states { 59 - const struct drm_plane_state *r0; 60 - const struct drm_plane_state *r1; 61 - }; 62 - 63 47 #define to_dpu_plane_state(x) \ 64 48 container_of(x, struct dpu_plane_state, base) 65 - 66 - /** 67 - * dpu_plane_pipe - return sspp identifier for the given plane 68 - * @plane: Pointer to DRM plane object 69 - * Returns: sspp identifier of the given plane 70 - */ 71 - enum dpu_sspp dpu_plane_pipe(struct drm_plane *plane); 72 49 73 50 /** 74 51 * dpu_plane_flush - final plane operations before commit flush ··· 76 87 struct drm_plane *dpu_plane_init(struct drm_device *dev, 77 88 uint32_t pipe, enum drm_plane_type type, 78 89 unsigned long possible_crtcs); 79 - 80 - /** 81 - * dpu_plane_validate_multirecti_v2 - validate the multirect planes 82 - * against hw limitations 83 - * @plane: drm plate states of the multirect pair 84 - */ 85 - int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane); 86 - 87 - /** 88 - * dpu_plane_clear_multirect - clear multirect bits for the given pipe 89 - * @drm_state: Pointer to DRM plane state 90 - */ 91 - void dpu_plane_clear_multirect(const struct drm_plane_state *drm_state); 92 90 93 91 /** 94 92 * dpu_plane_color_fill - enables color fill on plane
+22
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
··· 8 8 #include "dpu_hw_lm.h" 9 9 #include "dpu_hw_ctl.h" 10 10 #include "dpu_hw_pingpong.h" 11 + #include "dpu_hw_sspp.h" 11 12 #include "dpu_hw_intf.h" 12 13 #include "dpu_hw_wb.h" 13 14 #include "dpu_hw_dspp.h" ··· 91 90 92 91 for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++) 93 92 dpu_hw_wb_destroy(rm->hw_wb[i]); 93 + 94 + for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++) 95 + dpu_hw_sspp_destroy(rm->hw_sspp[i]); 94 96 95 97 return 0; 96 98 } ··· 257 253 goto fail; 258 254 } 259 255 rm->dsc_blks[dsc->id - DSC_0] = &hw->base; 256 + } 257 + 258 + for (i = 0; i < cat->sspp_count; i++) { 259 + struct dpu_hw_sspp *hw; 260 + const struct dpu_sspp_cfg *sspp = &cat->sspp[i]; 261 + 262 + if (sspp->id < SSPP_NONE || sspp->id >= SSPP_MAX) { 263 + DPU_ERROR("skip intf %d with invalid id\n", sspp->id); 264 + continue; 265 + } 266 + 267 + hw = dpu_hw_sspp_init(sspp->id, mmio, cat); 268 + if (IS_ERR(hw)) { 269 + rc = PTR_ERR(hw); 270 + DPU_ERROR("failed sspp object creation: err %d\n", rc); 271 + goto fail; 272 + } 273 + rm->hw_sspp[sspp->id - SSPP_NONE] = hw; 260 274 } 261 275 262 276 return 0;
+12
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
··· 21 21 * @hw_intf: array of intf hardware resources 22 22 * @hw_wb: array of wb hardware resources 23 23 * @dspp_blks: array of dspp hardware resources 24 + * @hw_sspp: array of sspp hardware resources 24 25 */ 25 26 struct dpu_rm { 26 27 struct dpu_hw_blk *pingpong_blks[PINGPONG_MAX - PINGPONG_0]; ··· 32 31 struct dpu_hw_blk *dspp_blks[DSPP_MAX - DSPP_0]; 33 32 struct dpu_hw_blk *merge_3d_blks[MERGE_3D_MAX - MERGE_3D_0]; 34 33 struct dpu_hw_blk *dsc_blks[DSC_MAX - DSC_0]; 34 + struct dpu_hw_sspp *hw_sspp[SSPP_MAX - SSPP_NONE]; 35 35 }; 36 36 37 37 /** ··· 108 106 static inline struct dpu_hw_wb *dpu_rm_get_wb(struct dpu_rm *rm, enum dpu_wb wb_idx) 109 107 { 110 108 return rm->hw_wb[wb_idx - WB_0]; 109 + } 110 + 111 + /** 112 + * dpu_rm_get_sspp - Return a struct dpu_hw_sspp instance given it's index. 113 + * @rm: DPU Resource Manager handle 114 + * @sspp_idx: SSPP index 115 + */ 116 + static inline struct dpu_hw_sspp *dpu_rm_get_sspp(struct dpu_rm *rm, enum dpu_sspp sspp_idx) 117 + { 118 + return rm->hw_sspp[sspp_idx - SSPP_NONE]; 111 119 } 112 120 113 121 #endif /* __DPU_RM_H__ */
+9 -10
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
··· 633 633 TRACE_EVENT(dpu_crtc_setup_mixer, 634 634 TP_PROTO(uint32_t crtc_id, uint32_t plane_id, 635 635 struct drm_plane_state *state, struct dpu_plane_state *pstate, 636 - uint32_t stage_idx, enum dpu_sspp sspp, uint32_t pixel_format, 636 + uint32_t stage_idx, uint32_t pixel_format, 637 637 uint64_t modifier), 638 - TP_ARGS(crtc_id, plane_id, state, pstate, stage_idx, sspp, 638 + TP_ARGS(crtc_id, plane_id, state, pstate, stage_idx, 639 639 pixel_format, modifier), 640 640 TP_STRUCT__entry( 641 641 __field( uint32_t, crtc_id ) ··· 659 659 __entry->dst_rect = drm_plane_state_dest(state); 660 660 __entry->stage_idx = stage_idx; 661 661 __entry->stage = pstate->stage; 662 - __entry->sspp = sspp; 663 - __entry->multirect_idx = pstate->multirect_index; 664 - __entry->multirect_mode = pstate->multirect_mode; 662 + __entry->sspp = pstate->pipe.sspp->idx; 663 + __entry->multirect_idx = pstate->pipe.multirect_index; 664 + __entry->multirect_mode = pstate->pipe.multirect_mode; 665 665 __entry->pixel_format = pixel_format; 666 666 __entry->modifier = modifier; 667 667 ), ··· 762 762 ); 763 763 764 764 TRACE_EVENT(dpu_plane_set_scanout, 765 - TP_PROTO(enum dpu_sspp index, struct dpu_hw_fmt_layout *layout, 766 - enum dpu_sspp_multirect_index multirect_index), 767 - TP_ARGS(index, layout, multirect_index), 765 + TP_PROTO(struct dpu_sw_pipe *pipe, struct dpu_hw_fmt_layout *layout), 766 + TP_ARGS(pipe, layout), 768 767 TP_STRUCT__entry( 769 768 __field( enum dpu_sspp, index ) 770 769 __field_struct( struct dpu_hw_fmt_layout, layout ) 771 770 __field( enum dpu_sspp_multirect_index, multirect_index) 772 771 ), 773 772 TP_fast_assign( 774 - __entry->index = index; 773 + __entry->index = pipe->sspp->idx; 775 774 __entry->layout = *layout; 776 - __entry->multirect_index = multirect_index; 775 + __entry->multirect_index = pipe->multirect_index; 777 776 ), 778 777 TP_printk("index:%d layout:{%ux%u @ [%u/%u, %u/%u, %u/%u, %u/%u]} " 779 778 "multirect_index:%d", __entry->index, __entry->layout.width,
+19 -19
drivers/gpu/drm/msm/disp/mdp4/mdp4.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
-5
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
··· 84 84 mdp4_disable(mdp4_kms); 85 85 } 86 86 87 - static void mdp4_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state) 88 - { 89 - } 90 - 91 87 static void mdp4_flush_commit(struct msm_kms *kms, unsigned crtc_mask) 92 88 { 93 89 /* TODO */ ··· 150 154 .disable_vblank = mdp4_disable_vblank, 151 155 .enable_commit = mdp4_enable_commit, 152 156 .disable_commit = mdp4_disable_commit, 153 - .prepare_commit = mdp4_prepare_commit, 154 157 .flush_commit = mdp4_flush_commit, 155 158 .wait_flush = mdp4_wait_flush, 156 159 .complete_commit = mdp4_complete_commit,
+19 -19
drivers/gpu/drm/msm/disp/mdp5/mdp5.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+1 -1
drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c
··· 655 655 .max_clk = 412500000, 656 656 }; 657 657 658 - const struct mdp5_cfg_hw msm8x76_config = { 658 + static const struct mdp5_cfg_hw msm8x76_config = { 659 659 .name = "msm8x76", 660 660 .mdp = { 661 661 .count = 1,
+19 -19
drivers/gpu/drm/msm/disp/mdp_common.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
-3
drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
··· 129 129 } 130 130 131 131 priv = drm_dev->dev_private; 132 - if (!priv->kms) 133 - return; 134 - 135 132 kms = priv->kms; 136 133 137 134 if (kms->dump_worker)
+40 -50
drivers/gpu/drm/msm/dp/dp_aux.c
··· 162 162 return i; 163 163 } 164 164 165 - static void dp_aux_native_handler(struct dp_aux_private *aux, u32 isr) 166 - { 167 - if (isr & DP_INTR_AUX_I2C_DONE) 168 - aux->aux_error_num = DP_AUX_ERR_NONE; 169 - else if (isr & DP_INTR_WRONG_ADDR) 170 - aux->aux_error_num = DP_AUX_ERR_ADDR; 171 - else if (isr & DP_INTR_TIMEOUT) 172 - aux->aux_error_num = DP_AUX_ERR_TOUT; 173 - if (isr & DP_INTR_NACK_DEFER) 174 - aux->aux_error_num = DP_AUX_ERR_NACK; 175 - if (isr & DP_INTR_AUX_ERROR) { 176 - aux->aux_error_num = DP_AUX_ERR_PHY; 177 - dp_catalog_aux_clear_hw_interrupts(aux->catalog); 178 - } 179 - } 180 - 181 - static void dp_aux_i2c_handler(struct dp_aux_private *aux, u32 isr) 182 - { 183 - if (isr & DP_INTR_AUX_I2C_DONE) { 184 - if (isr & (DP_INTR_I2C_NACK | DP_INTR_I2C_DEFER)) 185 - aux->aux_error_num = DP_AUX_ERR_NACK; 186 - else 187 - aux->aux_error_num = DP_AUX_ERR_NONE; 188 - } else { 189 - if (isr & DP_INTR_WRONG_ADDR) 190 - aux->aux_error_num = DP_AUX_ERR_ADDR; 191 - else if (isr & DP_INTR_TIMEOUT) 192 - aux->aux_error_num = DP_AUX_ERR_TOUT; 193 - if (isr & DP_INTR_NACK_DEFER) 194 - aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; 195 - if (isr & DP_INTR_I2C_NACK) 196 - aux->aux_error_num = DP_AUX_ERR_NACK; 197 - if (isr & DP_INTR_I2C_DEFER) 198 - aux->aux_error_num = DP_AUX_ERR_DEFER; 199 - if (isr & DP_INTR_AUX_ERROR) { 200 - aux->aux_error_num = DP_AUX_ERR_PHY; 201 - dp_catalog_aux_clear_hw_interrupts(aux->catalog); 202 - } 203 - } 204 - } 205 - 206 165 static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux, 207 166 struct drm_dp_aux_msg *input_msg) 208 167 { ··· 368 409 return ret; 369 410 } 370 411 371 - void dp_aux_isr(struct drm_dp_aux *dp_aux) 412 + irqreturn_t dp_aux_isr(struct drm_dp_aux *dp_aux) 372 413 { 373 414 u32 isr; 374 415 struct dp_aux_private *aux; 375 416 376 417 if (!dp_aux) { 377 418 DRM_ERROR("invalid input\n"); 378 - return; 419 + return IRQ_NONE; 379 420 } 380 421 381 422 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); ··· 384 425 385 426 /* no interrupts pending, return immediately */ 386 427 if (!isr) 387 - return; 428 + return IRQ_NONE; 388 429 389 - if (!aux->cmd_busy) 390 - return; 430 + if (!aux->cmd_busy) { 431 + DRM_ERROR("Unexpected DP AUX IRQ %#010x when not busy\n", isr); 432 + return IRQ_NONE; 433 + } 391 434 392 - if (aux->native) 393 - dp_aux_native_handler(aux, isr); 394 - else 395 - dp_aux_i2c_handler(aux, isr); 435 + /* 436 + * The logic below assumes only one error bit is set (other than "done" 437 + * which can apparently be set at the same time as some of the other 438 + * bits). Warn if more than one get set so we know we need to improve 439 + * the logic. 440 + */ 441 + if (hweight32(isr & ~DP_INTR_AUX_XFER_DONE) > 1) 442 + DRM_WARN("Some DP AUX interrupts unhandled: %#010x\n", isr); 443 + 444 + if (isr & DP_INTR_AUX_ERROR) { 445 + aux->aux_error_num = DP_AUX_ERR_PHY; 446 + dp_catalog_aux_clear_hw_interrupts(aux->catalog); 447 + } else if (isr & DP_INTR_NACK_DEFER) { 448 + aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; 449 + } else if (isr & DP_INTR_WRONG_ADDR) { 450 + aux->aux_error_num = DP_AUX_ERR_ADDR; 451 + } else if (isr & DP_INTR_TIMEOUT) { 452 + aux->aux_error_num = DP_AUX_ERR_TOUT; 453 + } else if (!aux->native && (isr & DP_INTR_I2C_NACK)) { 454 + aux->aux_error_num = DP_AUX_ERR_NACK; 455 + } else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) { 456 + if (isr & DP_INTR_AUX_XFER_DONE) 457 + aux->aux_error_num = DP_AUX_ERR_NACK; 458 + else 459 + aux->aux_error_num = DP_AUX_ERR_DEFER; 460 + } else if (isr & DP_INTR_AUX_XFER_DONE) { 461 + aux->aux_error_num = DP_AUX_ERR_NONE; 462 + } else { 463 + DRM_WARN("Unexpected interrupt: %#010x\n", isr); 464 + return IRQ_NONE; 465 + } 396 466 397 467 complete(&aux->comp); 468 + 469 + return IRQ_HANDLED; 398 470 } 399 471 400 472 void dp_aux_reconfig(struct drm_dp_aux *dp_aux)
+1 -1
drivers/gpu/drm/msm/dp/dp_aux.h
··· 11 11 12 12 int dp_aux_register(struct drm_dp_aux *dp_aux); 13 13 void dp_aux_unregister(struct drm_dp_aux *dp_aux); 14 - void dp_aux_isr(struct drm_dp_aux *dp_aux); 14 + irqreturn_t dp_aux_isr(struct drm_dp_aux *dp_aux); 15 15 void dp_aux_init(struct drm_dp_aux *dp_aux); 16 16 void dp_aux_deinit(struct drm_dp_aux *dp_aux); 17 17 void dp_aux_reconfig(struct drm_dp_aux *dp_aux);
+81 -1
drivers/gpu/drm/msm/dp/dp_catalog.c
··· 27 27 #define DP_INTF_CONFIG_DATABUS_WIDEN BIT(4) 28 28 29 29 #define DP_INTERRUPT_STATUS1 \ 30 - (DP_INTR_AUX_I2C_DONE| \ 30 + (DP_INTR_AUX_XFER_DONE| \ 31 31 DP_INTR_WRONG_ADDR | DP_INTR_TIMEOUT | \ 32 32 DP_INTR_NACK_DEFER | DP_INTR_WRONG_DATA_CNT | \ 33 33 DP_INTR_I2C_NACK | DP_INTR_I2C_DEFER | \ ··· 46 46 (DP_INTERRUPT_STATUS2 << DP_INTERRUPT_STATUS_ACK_SHIFT) 47 47 #define DP_INTERRUPT_STATUS2_MASK \ 48 48 (DP_INTERRUPT_STATUS2 << DP_INTERRUPT_STATUS_MASK_SHIFT) 49 + 50 + #define DP_INTERRUPT_STATUS4 \ 51 + (PSR_UPDATE_INT | PSR_CAPTURE_INT | PSR_EXIT_INT | \ 52 + PSR_UPDATE_ERROR_INT | PSR_WAKE_ERROR_INT) 53 + 54 + #define DP_INTERRUPT_MASK4 \ 55 + (PSR_UPDATE_MASK | PSR_CAPTURE_MASK | PSR_EXIT_MASK | \ 56 + PSR_UPDATE_ERROR_MASK | PSR_WAKE_ERROR_MASK) 49 57 50 58 struct dp_catalog_private { 51 59 struct device *dev; ··· 367 359 ln_mapping); 368 360 } 369 361 362 + void dp_catalog_ctrl_psr_mainlink_enable(struct dp_catalog *dp_catalog, 363 + bool enable) 364 + { 365 + u32 val; 366 + struct dp_catalog_private *catalog = container_of(dp_catalog, 367 + struct dp_catalog_private, dp_catalog); 368 + 369 + val = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); 370 + 371 + if (enable) 372 + val |= DP_MAINLINK_CTRL_ENABLE; 373 + else 374 + val &= ~DP_MAINLINK_CTRL_ENABLE; 375 + 376 + dp_write_link(catalog, REG_DP_MAINLINK_CTRL, val); 377 + } 378 + 370 379 void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog, 371 380 bool enable) 372 381 { ··· 635 610 dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN); 636 611 } 637 612 613 + static void dp_catalog_enable_sdp(struct dp_catalog_private *catalog) 614 + { 615 + /* trigger sdp */ 616 + dp_write_link(catalog, MMSS_DP_SDP_CFG3, UPDATE_SDP); 617 + dp_write_link(catalog, MMSS_DP_SDP_CFG3, 0x0); 618 + } 619 + 620 + void dp_catalog_ctrl_config_psr(struct dp_catalog *dp_catalog) 621 + { 622 + struct dp_catalog_private *catalog = container_of(dp_catalog, 623 + struct dp_catalog_private, dp_catalog); 624 + u32 config; 625 + 626 + /* enable PSR1 function */ 627 + config = dp_read_link(catalog, REG_PSR_CONFIG); 628 + config |= PSR1_SUPPORTED; 629 + dp_write_link(catalog, REG_PSR_CONFIG, config); 630 + 631 + dp_write_ahb(catalog, REG_DP_INTR_MASK4, DP_INTERRUPT_MASK4); 632 + dp_catalog_enable_sdp(catalog); 633 + } 634 + 635 + void dp_catalog_ctrl_set_psr(struct dp_catalog *dp_catalog, bool enter) 636 + { 637 + struct dp_catalog_private *catalog = container_of(dp_catalog, 638 + struct dp_catalog_private, dp_catalog); 639 + u32 cmd; 640 + 641 + cmd = dp_read_link(catalog, REG_PSR_CMD); 642 + 643 + cmd &= ~(PSR_ENTER | PSR_EXIT); 644 + 645 + if (enter) 646 + cmd |= PSR_ENTER; 647 + else 648 + cmd |= PSR_EXIT; 649 + 650 + dp_catalog_enable_sdp(catalog); 651 + dp_write_link(catalog, REG_PSR_CMD, cmd); 652 + } 653 + 638 654 u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog) 639 655 { 640 656 struct dp_catalog_private *catalog = container_of(dp_catalog, ··· 709 643 * are pending. 710 644 */ 711 645 return isr & (mask | ~DP_DP_HPD_INT_MASK); 646 + } 647 + 648 + u32 dp_catalog_ctrl_read_psr_interrupt_status(struct dp_catalog *dp_catalog) 649 + { 650 + struct dp_catalog_private *catalog = container_of(dp_catalog, 651 + struct dp_catalog_private, dp_catalog); 652 + u32 intr, intr_ack; 653 + 654 + intr = dp_read_ahb(catalog, REG_DP_INTR_STATUS4); 655 + intr_ack = (intr & DP_INTERRUPT_STATUS4) 656 + << DP_INTERRUPT_STATUS_ACK_SHIFT; 657 + dp_write_ahb(catalog, REG_DP_INTR_STATUS4, intr_ack); 658 + 659 + return intr; 712 660 } 713 661 714 662 int dp_catalog_ctrl_get_interrupt(struct dp_catalog *dp_catalog)
+5 -1
drivers/gpu/drm/msm/dp/dp_catalog.h
··· 13 13 14 14 /* interrupts */ 15 15 #define DP_INTR_HPD BIT(0) 16 - #define DP_INTR_AUX_I2C_DONE BIT(3) 16 + #define DP_INTR_AUX_XFER_DONE BIT(3) 17 17 #define DP_INTR_WRONG_ADDR BIT(6) 18 18 #define DP_INTR_TIMEOUT BIT(9) 19 19 #define DP_INTR_NACK_DEFER BIT(12) ··· 93 93 void dp_catalog_ctrl_config_ctrl(struct dp_catalog *dp_catalog, u32 config); 94 94 void dp_catalog_ctrl_lane_mapping(struct dp_catalog *dp_catalog); 95 95 void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog, bool enable); 96 + void dp_catalog_ctrl_psr_mainlink_enable(struct dp_catalog *dp_catalog, bool enable); 96 97 void dp_catalog_ctrl_config_misc(struct dp_catalog *dp_catalog, u32 cc, u32 tb); 97 98 void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog, u32 rate, 98 99 u32 stream_rate_khz, bool fixed_nvid); ··· 105 104 void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog, 106 105 u32 intr_mask, bool en); 107 106 void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog); 107 + void dp_catalog_ctrl_config_psr(struct dp_catalog *dp_catalog); 108 + void dp_catalog_ctrl_set_psr(struct dp_catalog *dp_catalog, bool enter); 108 109 u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog); 109 110 u32 dp_catalog_hpd_get_intr_status(struct dp_catalog *dp_catalog); 110 111 void dp_catalog_ctrl_phy_reset(struct dp_catalog *dp_catalog); 111 112 int dp_catalog_ctrl_update_vx_px(struct dp_catalog *dp_catalog, u8 v_level, 112 113 u8 p_level); 113 114 int dp_catalog_ctrl_get_interrupt(struct dp_catalog *dp_catalog); 115 + u32 dp_catalog_ctrl_read_psr_interrupt_status(struct dp_catalog *dp_catalog); 114 116 void dp_catalog_ctrl_update_transfer_unit(struct dp_catalog *dp_catalog, 115 117 u32 dp_tu, u32 valid_boundary, 116 118 u32 valid_boundary2);
+88 -2
drivers/gpu/drm/msm/dp/dp_ctrl.c
··· 22 22 23 23 #define DP_KHZ_TO_HZ 1000 24 24 #define IDLE_PATTERN_COMPLETION_TIMEOUT_JIFFIES (30 * HZ / 1000) /* 30 ms */ 25 + #define PSR_OPERATION_COMPLETION_TIMEOUT_JIFFIES (300 * HZ / 1000) /* 300 ms */ 25 26 #define WAIT_FOR_VIDEO_READY_TIMEOUT_JIFFIES (HZ / 2) 26 27 27 28 #define DP_CTRL_INTR_READY_FOR_VIDEO BIT(0) ··· 81 80 struct dp_catalog *catalog; 82 81 83 82 struct completion idle_comp; 83 + struct completion psr_op_comp; 84 84 struct completion video_comp; 85 85 }; 86 86 ··· 154 152 /* sync clock & static Mvid */ 155 153 config |= DP_CONFIGURATION_CTRL_STATIC_DYNAMIC_CN; 156 154 config |= DP_CONFIGURATION_CTRL_SYNC_ASYNC_CLK; 155 + 156 + if (ctrl->panel->psr_cap.version) 157 + config |= DP_CONFIGURATION_CTRL_SEND_VSC; 157 158 158 159 dp_catalog_ctrl_config_ctrl(ctrl->catalog, config); 159 160 } ··· 1380 1375 dp_catalog_ctrl_enable_irq(ctrl->catalog, enable); 1381 1376 } 1382 1377 1378 + void dp_ctrl_config_psr(struct dp_ctrl *dp_ctrl) 1379 + { 1380 + u8 cfg; 1381 + struct dp_ctrl_private *ctrl = container_of(dp_ctrl, 1382 + struct dp_ctrl_private, dp_ctrl); 1383 + 1384 + if (!ctrl->panel->psr_cap.version) 1385 + return; 1386 + 1387 + dp_catalog_ctrl_config_psr(ctrl->catalog); 1388 + 1389 + cfg = DP_PSR_ENABLE; 1390 + drm_dp_dpcd_write(ctrl->aux, DP_PSR_EN_CFG, &cfg, 1); 1391 + } 1392 + 1393 + void dp_ctrl_set_psr(struct dp_ctrl *dp_ctrl, bool enter) 1394 + { 1395 + struct dp_ctrl_private *ctrl = container_of(dp_ctrl, 1396 + struct dp_ctrl_private, dp_ctrl); 1397 + 1398 + if (!ctrl->panel->psr_cap.version) 1399 + return; 1400 + 1401 + /* 1402 + * When entering PSR, 1403 + * 1. Send PSR enter SDP and wait for the PSR_UPDATE_INT 1404 + * 2. Turn off video 1405 + * 3. Disable the mainlink 1406 + * 1407 + * When exiting PSR, 1408 + * 1. Enable the mainlink 1409 + * 2. Send the PSR exit SDP 1410 + */ 1411 + if (enter) { 1412 + reinit_completion(&ctrl->psr_op_comp); 1413 + dp_catalog_ctrl_set_psr(ctrl->catalog, true); 1414 + 1415 + if (!wait_for_completion_timeout(&ctrl->psr_op_comp, 1416 + PSR_OPERATION_COMPLETION_TIMEOUT_JIFFIES)) { 1417 + DRM_ERROR("PSR_ENTRY timedout\n"); 1418 + dp_catalog_ctrl_set_psr(ctrl->catalog, false); 1419 + return; 1420 + } 1421 + 1422 + dp_ctrl_push_idle(dp_ctrl); 1423 + dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); 1424 + 1425 + dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, false); 1426 + } else { 1427 + dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, true); 1428 + 1429 + dp_catalog_ctrl_set_psr(ctrl->catalog, false); 1430 + dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); 1431 + dp_ctrl_wait4video_ready(ctrl); 1432 + dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); 1433 + } 1434 + } 1435 + 1383 1436 void dp_ctrl_phy_init(struct dp_ctrl *dp_ctrl) 1384 1437 { 1385 1438 struct dp_ctrl_private *ctrl; ··· 2042 1979 return ret; 2043 1980 } 2044 1981 2045 - void dp_ctrl_isr(struct dp_ctrl *dp_ctrl) 1982 + irqreturn_t dp_ctrl_isr(struct dp_ctrl *dp_ctrl) 2046 1983 { 2047 1984 struct dp_ctrl_private *ctrl; 2048 1985 u32 isr; 1986 + irqreturn_t ret = IRQ_NONE; 2049 1987 2050 1988 if (!dp_ctrl) 2051 - return; 1989 + return IRQ_NONE; 2052 1990 2053 1991 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); 2054 1992 1993 + if (ctrl->panel->psr_cap.version) { 1994 + isr = dp_catalog_ctrl_read_psr_interrupt_status(ctrl->catalog); 1995 + 1996 + if (isr) 1997 + complete(&ctrl->psr_op_comp); 1998 + 1999 + if (isr & PSR_EXIT_INT) 2000 + drm_dbg_dp(ctrl->drm_dev, "PSR exit done\n"); 2001 + 2002 + if (isr & PSR_UPDATE_INT) 2003 + drm_dbg_dp(ctrl->drm_dev, "PSR frame update done\n"); 2004 + 2005 + if (isr & PSR_CAPTURE_INT) 2006 + drm_dbg_dp(ctrl->drm_dev, "PSR frame capture done\n"); 2007 + } 2008 + 2055 2009 isr = dp_catalog_ctrl_get_interrupt(ctrl->catalog); 2010 + 2056 2011 2057 2012 if (isr & DP_CTRL_INTR_READY_FOR_VIDEO) { 2058 2013 drm_dbg_dp(ctrl->drm_dev, "dp_video_ready\n"); 2059 2014 complete(&ctrl->video_comp); 2015 + ret = IRQ_HANDLED; 2060 2016 } 2061 2017 2062 2018 if (isr & DP_CTRL_INTR_IDLE_PATTERN_SENT) { 2063 2019 drm_dbg_dp(ctrl->drm_dev, "idle_patterns_sent\n"); 2064 2020 complete(&ctrl->idle_comp); 2021 + ret = IRQ_HANDLED; 2065 2022 } 2023 + 2024 + return ret; 2066 2025 } 2067 2026 2068 2027 struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link, ··· 2120 2035 dev_err(dev, "failed to add DP OPP table\n"); 2121 2036 2122 2037 init_completion(&ctrl->idle_comp); 2038 + init_completion(&ctrl->psr_op_comp); 2123 2039 init_completion(&ctrl->video_comp); 2124 2040 2125 2041 /* in parameters */
+4 -1
drivers/gpu/drm/msm/dp/dp_ctrl.h
··· 25 25 int dp_ctrl_off_link(struct dp_ctrl *dp_ctrl); 26 26 int dp_ctrl_off(struct dp_ctrl *dp_ctrl); 27 27 void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl); 28 - void dp_ctrl_isr(struct dp_ctrl *dp_ctrl); 28 + irqreturn_t dp_ctrl_isr(struct dp_ctrl *dp_ctrl); 29 29 void dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl); 30 30 struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link, 31 31 struct dp_panel *panel, struct drm_dp_aux *aux, ··· 36 36 void dp_ctrl_phy_init(struct dp_ctrl *dp_ctrl); 37 37 void dp_ctrl_phy_exit(struct dp_ctrl *dp_ctrl); 38 38 void dp_ctrl_irq_phy_exit(struct dp_ctrl *dp_ctrl); 39 + 40 + void dp_ctrl_set_psr(struct dp_ctrl *dp_ctrl, bool enable); 41 + void dp_ctrl_config_psr(struct dp_ctrl *dp_ctrl); 39 42 40 43 #endif /* _DP_CTRL_H_ */
+30 -14
drivers/gpu/drm/msm/dp/dp_display.c
··· 406 406 407 407 edid = dp->panel->edid; 408 408 409 + dp->dp_display.psr_supported = dp->panel->psr_cap.version; 410 + 409 411 dp->audio_supported = drm_detect_monitor_audio(edid); 410 412 dp_panel_handle_sink_request(dp->panel); 411 413 ··· 912 910 913 911 /* signal the connect event late to synchronize video and display */ 914 912 dp_display_handle_plugged_change(dp_display, true); 913 + 914 + if (dp_display->psr_supported) 915 + dp_ctrl_config_psr(dp->ctrl); 916 + 915 917 return 0; 916 918 } 917 919 ··· 995 989 DRM_ERROR("invalid params\n"); 996 990 return -EINVAL; 997 991 } 998 - 999 - /* 1000 - * The eDP controller currently does not have a reliable way of 1001 - * enabling panel power to read sink capabilities. So, we rely 1002 - * on the panel driver to populate only supported modes for now. 1003 - */ 1004 - if (dp->is_edp) 1005 - return MODE_OK; 1006 992 1007 993 if (mode->clock > DP_MAX_PIXEL_CLK_KHZ) 1008 994 return MODE_CLOCK_HIGH; ··· 1102 1104 enable_irq(dp->irq); 1103 1105 } 1104 1106 1107 + void dp_display_set_psr(struct msm_dp *dp_display, bool enter) 1108 + { 1109 + struct dp_display_private *dp; 1110 + 1111 + if (!dp_display) { 1112 + DRM_ERROR("invalid params\n"); 1113 + return; 1114 + } 1115 + 1116 + dp = container_of(dp_display, struct dp_display_private, dp_display); 1117 + dp_ctrl_set_psr(dp->ctrl, enter); 1118 + } 1119 + 1105 1120 static int hpd_event_thread(void *data) 1106 1121 { 1107 1122 struct dp_display_private *dp_priv; ··· 1215 1204 static irqreturn_t dp_display_irq_handler(int irq, void *dev_id) 1216 1205 { 1217 1206 struct dp_display_private *dp = dev_id; 1218 - irqreturn_t ret = IRQ_HANDLED; 1207 + irqreturn_t ret = IRQ_NONE; 1219 1208 u32 hpd_isr_status; 1220 1209 1221 1210 if (!dp) { ··· 1243 1232 1244 1233 if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK) 1245 1234 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); 1235 + 1236 + ret = IRQ_HANDLED; 1246 1237 } 1247 1238 1248 1239 /* DP controller isr */ 1249 - dp_ctrl_isr(dp->ctrl); 1240 + ret |= dp_ctrl_isr(dp->ctrl); 1250 1241 1251 1242 /* DP aux isr */ 1252 - dp_aux_isr(dp->aux); 1243 + ret |= dp_aux_isr(dp->aux); 1253 1244 1254 1245 return ret; 1255 1246 } ··· 1665 1652 return 0; 1666 1653 } 1667 1654 1668 - void dp_bridge_enable(struct drm_bridge *drm_bridge) 1655 + void dp_bridge_atomic_enable(struct drm_bridge *drm_bridge, 1656 + struct drm_bridge_state *old_bridge_state) 1669 1657 { 1670 1658 struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); 1671 1659 struct msm_dp *dp = dp_bridge->dp_display; ··· 1721 1707 mutex_unlock(&dp_display->event_mutex); 1722 1708 } 1723 1709 1724 - void dp_bridge_disable(struct drm_bridge *drm_bridge) 1710 + void dp_bridge_atomic_disable(struct drm_bridge *drm_bridge, 1711 + struct drm_bridge_state *old_bridge_state) 1725 1712 { 1726 1713 struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); 1727 1714 struct msm_dp *dp = dp_bridge->dp_display; ··· 1733 1718 dp_ctrl_push_idle(dp_display->ctrl); 1734 1719 } 1735 1720 1736 - void dp_bridge_post_disable(struct drm_bridge *drm_bridge) 1721 + void dp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, 1722 + struct drm_bridge_state *old_bridge_state) 1737 1723 { 1738 1724 struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); 1739 1725 struct msm_dp *dp = dp_bridge->dp_display;
+2
drivers/gpu/drm/msm/dp/dp_display.h
··· 29 29 30 30 u32 max_dp_lanes; 31 31 struct dp_audio *dp_audio; 32 + bool psr_supported; 32 33 }; 33 34 34 35 int dp_display_set_plugged_cb(struct msm_dp *dp_display, ··· 40 39 int dp_display_get_test_bpp(struct msm_dp *dp_display); 41 40 void dp_display_signal_audio_start(struct msm_dp *dp_display); 42 41 void dp_display_signal_audio_complete(struct msm_dp *dp_display); 42 + void dp_display_set_psr(struct msm_dp *dp, bool enter); 43 43 44 44 #endif /* _DP_DISPLAY_H_ */
+169 -4
drivers/gpu/drm/msm/dp/dp_drm.c
··· 94 94 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 95 95 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 96 96 .atomic_reset = drm_atomic_helper_bridge_reset, 97 - .enable = dp_bridge_enable, 98 - .disable = dp_bridge_disable, 99 - .post_disable = dp_bridge_post_disable, 97 + .atomic_enable = dp_bridge_atomic_enable, 98 + .atomic_disable = dp_bridge_atomic_disable, 99 + .atomic_post_disable = dp_bridge_atomic_post_disable, 100 100 .mode_set = dp_bridge_mode_set, 101 101 .mode_valid = dp_bridge_mode_valid, 102 102 .get_modes = dp_bridge_get_modes, ··· 105 105 .hpd_enable = dp_bridge_hpd_enable, 106 106 .hpd_disable = dp_bridge_hpd_disable, 107 107 .hpd_notify = dp_bridge_hpd_notify, 108 + }; 109 + 110 + static int edp_bridge_atomic_check(struct drm_bridge *drm_bridge, 111 + struct drm_bridge_state *bridge_state, 112 + struct drm_crtc_state *crtc_state, 113 + struct drm_connector_state *conn_state) 114 + { 115 + struct msm_dp *dp = to_dp_bridge(drm_bridge)->dp_display; 116 + 117 + if (WARN_ON(!conn_state)) 118 + return -ENODEV; 119 + 120 + conn_state->self_refresh_aware = dp->psr_supported; 121 + 122 + if (!conn_state->crtc || !crtc_state) 123 + return 0; 124 + 125 + if (crtc_state->self_refresh_active && !dp->psr_supported) 126 + return -EINVAL; 127 + 128 + return 0; 129 + } 130 + 131 + static void edp_bridge_atomic_enable(struct drm_bridge *drm_bridge, 132 + struct drm_bridge_state *old_bridge_state) 133 + { 134 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 135 + struct drm_crtc *crtc; 136 + struct drm_crtc_state *old_crtc_state; 137 + struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); 138 + struct msm_dp *dp = dp_bridge->dp_display; 139 + 140 + /* 141 + * Check the old state of the crtc to determine if the panel 142 + * was put into psr state previously by the edp_bridge_atomic_disable. 143 + * If the panel is in psr, just exit psr state and skip the full 144 + * bridge enable sequence. 145 + */ 146 + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, 147 + drm_bridge->encoder); 148 + if (!crtc) 149 + return; 150 + 151 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 152 + 153 + if (old_crtc_state && old_crtc_state->self_refresh_active) { 154 + dp_display_set_psr(dp, false); 155 + return; 156 + } 157 + 158 + dp_bridge_atomic_enable(drm_bridge, old_bridge_state); 159 + } 160 + 161 + static void edp_bridge_atomic_disable(struct drm_bridge *drm_bridge, 162 + struct drm_bridge_state *old_bridge_state) 163 + { 164 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 165 + struct drm_crtc *crtc; 166 + struct drm_crtc_state *new_crtc_state = NULL, *old_crtc_state = NULL; 167 + struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); 168 + struct msm_dp *dp = dp_bridge->dp_display; 169 + 170 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, 171 + drm_bridge->encoder); 172 + if (!crtc) 173 + goto out; 174 + 175 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 176 + if (!new_crtc_state) 177 + goto out; 178 + 179 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 180 + if (!old_crtc_state) 181 + goto out; 182 + 183 + /* 184 + * Set self refresh mode if current crtc state is active. 185 + * 186 + * If old crtc state is active, then this is a display disable 187 + * call while the sink is in psr state. So, exit psr here. 188 + * The eDP controller will be disabled in the 189 + * edp_bridge_atomic_post_disable function. 190 + * 191 + * We observed sink is stuck in self refresh if psr exit is skipped 192 + * when display disable occurs while the sink is in psr state. 193 + */ 194 + if (new_crtc_state->self_refresh_active) { 195 + dp_display_set_psr(dp, true); 196 + return; 197 + } else if (old_crtc_state->self_refresh_active) { 198 + dp_display_set_psr(dp, false); 199 + return; 200 + } 201 + 202 + out: 203 + dp_bridge_atomic_disable(drm_bridge, old_bridge_state); 204 + } 205 + 206 + static void edp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, 207 + struct drm_bridge_state *old_bridge_state) 208 + { 209 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 210 + struct drm_crtc *crtc; 211 + struct drm_crtc_state *new_crtc_state = NULL; 212 + 213 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, 214 + drm_bridge->encoder); 215 + if (!crtc) 216 + return; 217 + 218 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 219 + if (!new_crtc_state) 220 + return; 221 + 222 + /* 223 + * Self refresh mode is already set in edp_bridge_atomic_disable. 224 + */ 225 + if (new_crtc_state->self_refresh_active) 226 + return; 227 + 228 + dp_bridge_atomic_post_disable(drm_bridge, old_bridge_state); 229 + } 230 + 231 + /** 232 + * edp_bridge_mode_valid - callback to determine if specified mode is valid 233 + * @bridge: Pointer to drm bridge structure 234 + * @info: display info 235 + * @mode: Pointer to drm mode structure 236 + * Returns: Validity status for specified mode 237 + */ 238 + static enum drm_mode_status edp_bridge_mode_valid(struct drm_bridge *bridge, 239 + const struct drm_display_info *info, 240 + const struct drm_display_mode *mode) 241 + { 242 + struct msm_dp *dp; 243 + int mode_pclk_khz = mode->clock; 244 + 245 + dp = to_dp_bridge(bridge)->dp_display; 246 + 247 + if (!dp || !mode_pclk_khz || !dp->connector) { 248 + DRM_ERROR("invalid params\n"); 249 + return -EINVAL; 250 + } 251 + 252 + if (mode->clock > DP_MAX_PIXEL_CLK_KHZ) 253 + return MODE_CLOCK_HIGH; 254 + 255 + /* 256 + * The eDP controller currently does not have a reliable way of 257 + * enabling panel power to read sink capabilities. So, we rely 258 + * on the panel driver to populate only supported modes for now. 259 + */ 260 + return MODE_OK; 261 + } 262 + 263 + static const struct drm_bridge_funcs edp_bridge_ops = { 264 + .atomic_enable = edp_bridge_atomic_enable, 265 + .atomic_disable = edp_bridge_atomic_disable, 266 + .atomic_post_disable = edp_bridge_atomic_post_disable, 267 + .mode_set = dp_bridge_mode_set, 268 + .mode_valid = edp_bridge_mode_valid, 269 + .atomic_reset = drm_atomic_helper_bridge_reset, 270 + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 271 + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 272 + .atomic_check = edp_bridge_atomic_check, 108 273 }; 109 274 110 275 struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev, ··· 286 121 dp_bridge->dp_display = dp_display; 287 122 288 123 bridge = &dp_bridge->bridge; 289 - bridge->funcs = &dp_bridge_ops; 124 + bridge->funcs = dp_display->is_edp ? &edp_bridge_ops : &dp_bridge_ops; 290 125 bridge->type = dp_display->connector_type; 291 126 292 127 /*
+6 -3
drivers/gpu/drm/msm/dp/dp_drm.h
··· 23 23 struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev, 24 24 struct drm_encoder *encoder); 25 25 26 - void dp_bridge_enable(struct drm_bridge *drm_bridge); 27 - void dp_bridge_disable(struct drm_bridge *drm_bridge); 28 - void dp_bridge_post_disable(struct drm_bridge *drm_bridge); 26 + void dp_bridge_atomic_enable(struct drm_bridge *drm_bridge, 27 + struct drm_bridge_state *old_bridge_state); 28 + void dp_bridge_atomic_disable(struct drm_bridge *drm_bridge, 29 + struct drm_bridge_state *old_bridge_state); 30 + void dp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, 31 + struct drm_bridge_state *old_bridge_state); 29 32 enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge, 30 33 const struct drm_display_info *info, 31 34 const struct drm_display_mode *mode);
+36
drivers/gpu/drm/msm/dp/dp_link.c
··· 937 937 return 0; 938 938 } 939 939 940 + static bool dp_link_read_psr_error_status(struct dp_link_private *link) 941 + { 942 + u8 status; 943 + 944 + drm_dp_dpcd_read(link->aux, DP_PSR_ERROR_STATUS, &status, 1); 945 + 946 + if (status & DP_PSR_LINK_CRC_ERROR) 947 + DRM_ERROR("PSR LINK CRC ERROR\n"); 948 + else if (status & DP_PSR_RFB_STORAGE_ERROR) 949 + DRM_ERROR("PSR RFB STORAGE ERROR\n"); 950 + else if (status & DP_PSR_VSC_SDP_UNCORRECTABLE_ERROR) 951 + DRM_ERROR("PSR VSC SDP UNCORRECTABLE ERROR\n"); 952 + else 953 + return false; 954 + 955 + return true; 956 + } 957 + 958 + static bool dp_link_psr_capability_changed(struct dp_link_private *link) 959 + { 960 + u8 status; 961 + 962 + drm_dp_dpcd_read(link->aux, DP_PSR_ESI, &status, 1); 963 + 964 + if (status & DP_PSR_CAPS_CHANGE) { 965 + drm_dbg_dp(link->drm_dev, "PSR Capability Change\n"); 966 + return true; 967 + } 968 + 969 + return false; 970 + } 971 + 940 972 static u8 get_link_status(const u8 link_status[DP_LINK_STATUS_SIZE], int r) 941 973 { 942 974 return link_status[r - DP_LANE0_1_STATUS]; ··· 1087 1055 dp_link->sink_request |= DP_TEST_LINK_TRAINING; 1088 1056 } else if (!dp_link_process_phy_test_pattern_request(link)) { 1089 1057 dp_link->sink_request |= DP_TEST_LINK_PHY_TEST_PATTERN; 1058 + } else if (dp_link_read_psr_error_status(link)) { 1059 + DRM_ERROR("PSR IRQ_HPD received\n"); 1060 + } else if (dp_link_psr_capability_changed(link)) { 1061 + drm_dbg_dp(link->drm_dev, "PSR Capability changed"); 1090 1062 } else { 1091 1063 ret = dp_link_process_link_status_update(link); 1092 1064 if (!ret) {
+22
drivers/gpu/drm/msm/dp/dp_panel.c
··· 20 20 bool aux_cfg_update_done; 21 21 }; 22 22 23 + static void dp_panel_read_psr_cap(struct dp_panel_private *panel) 24 + { 25 + ssize_t rlen; 26 + struct dp_panel *dp_panel; 27 + 28 + dp_panel = &panel->dp_panel; 29 + 30 + /* edp sink */ 31 + if (dp_panel->dpcd[DP_EDP_CONFIGURATION_CAP]) { 32 + rlen = drm_dp_dpcd_read(panel->aux, DP_PSR_SUPPORT, 33 + &dp_panel->psr_cap, sizeof(dp_panel->psr_cap)); 34 + if (rlen == sizeof(dp_panel->psr_cap)) { 35 + drm_dbg_dp(panel->drm_dev, 36 + "psr version: 0x%x, psr_cap: 0x%x\n", 37 + dp_panel->psr_cap.version, 38 + dp_panel->psr_cap.capabilities); 39 + } else 40 + DRM_ERROR("failed to read psr info, rlen=%zd\n", rlen); 41 + } 42 + } 43 + 23 44 static int dp_panel_read_dpcd(struct dp_panel *dp_panel) 24 45 { 25 46 int rc = 0; ··· 128 107 } 129 108 } 130 109 110 + dp_panel_read_psr_cap(panel); 131 111 end: 132 112 return rc; 133 113 }
+6
drivers/gpu/drm/msm/dp/dp_panel.h
··· 34 34 struct dp_catalog *catalog; 35 35 }; 36 36 37 + struct dp_panel_psr { 38 + u8 version; 39 + u8 capabilities; 40 + }; 41 + 37 42 struct dp_panel { 38 43 /* dpcd raw data */ 39 44 u8 dpcd[DP_RECEIVER_CAP_SIZE + 1]; ··· 51 46 struct edid *edid; 52 47 struct drm_connector *connector; 53 48 struct dp_display_mode dp_mode; 49 + struct dp_panel_psr psr_cap; 54 50 bool video_test; 55 51 56 52 u32 vic;
+27
drivers/gpu/drm/msm/dp/dp_reg.h
··· 22 22 #define REG_DP_INTR_STATUS2 (0x00000024) 23 23 #define REG_DP_INTR_STATUS3 (0x00000028) 24 24 25 + #define REG_DP_INTR_STATUS4 (0x0000002C) 26 + #define PSR_UPDATE_INT (0x00000001) 27 + #define PSR_CAPTURE_INT (0x00000004) 28 + #define PSR_EXIT_INT (0x00000010) 29 + #define PSR_UPDATE_ERROR_INT (0x00000040) 30 + #define PSR_WAKE_ERROR_INT (0x00000100) 31 + 32 + #define REG_DP_INTR_MASK4 (0x00000030) 33 + #define PSR_UPDATE_MASK (0x00000001) 34 + #define PSR_CAPTURE_MASK (0x00000002) 35 + #define PSR_EXIT_MASK (0x00000004) 36 + #define PSR_UPDATE_ERROR_MASK (0x00000008) 37 + #define PSR_WAKE_ERROR_MASK (0x00000010) 38 + 25 39 #define REG_DP_DP_HPD_CTRL (0x00000000) 26 40 #define DP_DP_HPD_CTRL_HPD_EN (0x00000001) 27 41 ··· 178 164 #define MMSS_DP_AUDIO_TIMING_RBR_48 (0x00000094) 179 165 #define MMSS_DP_AUDIO_TIMING_HBR_48 (0x00000098) 180 166 167 + #define REG_PSR_CONFIG (0x00000100) 168 + #define DISABLE_PSR (0x00000000) 169 + #define PSR1_SUPPORTED (0x00000001) 170 + #define PSR2_WITHOUT_FRAMESYNC (0x00000002) 171 + #define PSR2_WITH_FRAMESYNC (0x00000003) 172 + 173 + #define REG_PSR_CMD (0x00000110) 174 + #define PSR_ENTER (0x00000001) 175 + #define PSR_EXIT (0x00000002) 176 + 181 177 #define MMSS_DP_PSR_CRC_RG (0x00000154) 182 178 #define MMSS_DP_PSR_CRC_B (0x00000158) 183 179 ··· 207 183 208 184 #define MMSS_DP_AUDIO_STREAM_0 (0x00000240) 209 185 #define MMSS_DP_AUDIO_STREAM_1 (0x00000244) 186 + 187 + #define MMSS_DP_SDP_CFG3 (0x0000024c) 188 + #define UPDATE_SDP (0x00000001) 210 189 211 190 #define MMSS_DP_EXTENSION_0 (0x00000250) 212 191 #define MMSS_DP_EXTENSION_1 (0x00000254)
+4 -3
drivers/gpu/drm/msm/dsi/dsi.c
··· 4 4 */ 5 5 6 6 #include "dsi.h" 7 - #include "dsi_cfg.h" 8 7 9 8 bool msm_dsi_is_cmd_mode(struct msm_dsi *msm_dsi) 10 9 { ··· 172 173 } 173 174 174 175 static const struct of_device_id dt_match[] = { 175 - { .compatible = "qcom,mdss-dsi-ctrl", .data = NULL /* autodetect cfg */ }, 176 - { .compatible = "qcom,dsi-ctrl-6g-qcm2290", .data = &qcm2290_dsi_cfg_handler }, 176 + { .compatible = "qcom,mdss-dsi-ctrl" }, 177 + 178 + /* Deprecated, don't use */ 179 + { .compatible = "qcom,dsi-ctrl-6g-qcm2290" }, 177 180 {} 178 181 }; 179 182
+20 -19
drivers/gpu/drm/msm/dsi/dsi.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33 ··· 784 784 { 785 785 return ((val) << DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH__SHIFT) & DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH__MASK; 786 786 } 787 + 787 788 788 789 #endif /* DSI_XML */
+57 -104
drivers/gpu/drm/msm/dsi/dsi_cfg.c
··· 21 21 .num_regulators = ARRAY_SIZE(apq8064_dsi_regulators), 22 22 .bus_clk_names = dsi_v2_bus_clk_names, 23 23 .num_bus_clks = ARRAY_SIZE(dsi_v2_bus_clk_names), 24 - .io_start = { 0x4700000, 0x5800000 }, 25 - .num_dsi = 2, 24 + .io_start = { 25 + { 0x4700000, 0x5800000 }, 26 + }, 26 27 }; 27 28 28 29 static const char * const dsi_6g_bus_clk_names[] = { ··· 42 41 .num_regulators = ARRAY_SIZE(msm8974_apq8084_regulators), 43 42 .bus_clk_names = dsi_6g_bus_clk_names, 44 43 .num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), 45 - .io_start = { 0xfd922800, 0xfd922b00 }, 46 - .num_dsi = 2, 44 + .io_start = { 45 + { 0xfd922800, 0xfd922b00 }, 46 + }, 47 47 }; 48 48 49 - static const char * const dsi_8916_bus_clk_names[] = { 49 + static const char * const dsi_v1_3_1_clk_names[] = { 50 50 "mdp_core", "iface", "bus", 51 51 }; 52 52 53 - static const struct regulator_bulk_data msm8916_dsi_regulators[] = { 53 + static const struct regulator_bulk_data dsi_v1_3_1_regulators[] = { 54 54 { .supply = "vdda", .init_load_uA = 100000 }, /* 1.2 V */ 55 55 { .supply = "vddio", .init_load_uA = 100000 }, /* 1.8 V */ 56 56 }; 57 57 58 58 static const struct msm_dsi_config msm8916_dsi_cfg = { 59 59 .io_offset = DSI_6G_REG_SHIFT, 60 - .regulator_data = msm8916_dsi_regulators, 61 - .num_regulators = ARRAY_SIZE(msm8916_dsi_regulators), 62 - .bus_clk_names = dsi_8916_bus_clk_names, 63 - .num_bus_clks = ARRAY_SIZE(dsi_8916_bus_clk_names), 64 - .io_start = { 0x1a98000 }, 65 - .num_dsi = 1, 66 - }; 67 - 68 - static const char * const dsi_8976_bus_clk_names[] = { 69 - "mdp_core", "iface", "bus", 70 - }; 71 - 72 - static const struct regulator_bulk_data msm8976_dsi_regulators[] = { 73 - { .supply = "vdda", .init_load_uA = 100000 }, /* 1.2 V */ 74 - { .supply = "vddio", .init_load_uA = 100000 }, /* 1.8 V */ 60 + .regulator_data = dsi_v1_3_1_regulators, 61 + .num_regulators = ARRAY_SIZE(dsi_v1_3_1_regulators), 62 + .bus_clk_names = dsi_v1_3_1_clk_names, 63 + .num_bus_clks = ARRAY_SIZE(dsi_v1_3_1_clk_names), 64 + .io_start = { 65 + { 0x1a98000 }, 66 + }, 75 67 }; 76 68 77 69 static const struct msm_dsi_config msm8976_dsi_cfg = { 78 70 .io_offset = DSI_6G_REG_SHIFT, 79 - .regulator_data = msm8976_dsi_regulators, 80 - .num_regulators = ARRAY_SIZE(msm8976_dsi_regulators), 81 - .bus_clk_names = dsi_8976_bus_clk_names, 82 - .num_bus_clks = ARRAY_SIZE(dsi_8976_bus_clk_names), 83 - .io_start = { 0x1a94000, 0x1a96000 }, 84 - .num_dsi = 2, 71 + .regulator_data = dsi_v1_3_1_regulators, 72 + .num_regulators = ARRAY_SIZE(dsi_v1_3_1_regulators), 73 + .bus_clk_names = dsi_v1_3_1_clk_names, 74 + .num_bus_clks = ARRAY_SIZE(dsi_v1_3_1_clk_names), 75 + .io_start = { 76 + { 0x1a94000, 0x1a96000 }, 77 + }, 85 78 }; 86 79 87 80 static const struct regulator_bulk_data msm8994_dsi_regulators[] = { ··· 93 98 .num_regulators = ARRAY_SIZE(msm8994_dsi_regulators), 94 99 .bus_clk_names = dsi_6g_bus_clk_names, 95 100 .num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), 96 - .io_start = { 0xfd998000, 0xfd9a0000 }, 97 - .num_dsi = 2, 98 - }; 99 - 100 - static const char * const dsi_8996_bus_clk_names[] = { 101 - "mdp_core", "iface", "bus", "core_mmss", 101 + .io_start = { 102 + { 0xfd998000, 0xfd9a0000 }, 103 + }, 102 104 }; 103 105 104 106 static const struct regulator_bulk_data msm8996_dsi_regulators[] = { ··· 108 116 .io_offset = DSI_6G_REG_SHIFT, 109 117 .regulator_data = msm8996_dsi_regulators, 110 118 .num_regulators = ARRAY_SIZE(msm8996_dsi_regulators), 111 - .bus_clk_names = dsi_8996_bus_clk_names, 112 - .num_bus_clks = ARRAY_SIZE(dsi_8996_bus_clk_names), 113 - .io_start = { 0x994000, 0x996000 }, 114 - .num_dsi = 2, 119 + .bus_clk_names = dsi_6g_bus_clk_names, 120 + .num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), 121 + .io_start = { 122 + { 0x994000, 0x996000 }, 123 + }, 115 124 }; 116 125 117 126 static const char * const dsi_msm8998_bus_clk_names[] = { ··· 130 137 .num_regulators = ARRAY_SIZE(msm8998_dsi_regulators), 131 138 .bus_clk_names = dsi_msm8998_bus_clk_names, 132 139 .num_bus_clks = ARRAY_SIZE(dsi_msm8998_bus_clk_names), 133 - .io_start = { 0xc994000, 0xc996000 }, 134 - .num_dsi = 2, 140 + .io_start = { 141 + { 0xc994000, 0xc996000 }, 142 + }, 135 143 }; 136 144 137 145 static const char * const dsi_sdm660_bus_clk_names[] = { ··· 149 155 .num_regulators = ARRAY_SIZE(sdm660_dsi_regulators), 150 156 .bus_clk_names = dsi_sdm660_bus_clk_names, 151 157 .num_bus_clks = ARRAY_SIZE(dsi_sdm660_bus_clk_names), 152 - .io_start = { 0xc994000, 0xc996000 }, 153 - .num_dsi = 2, 158 + .io_start = { 159 + { 0xc994000, 0xc996000 }, 160 + }, 154 161 }; 155 162 156 - static const char * const dsi_sdm845_bus_clk_names[] = { 163 + static const char * const dsi_v2_4_clk_names[] = { 157 164 "iface", "bus", 158 165 }; 159 166 160 - static const char * const dsi_sc7180_bus_clk_names[] = { 161 - "iface", "bus", 162 - }; 163 - 164 - static const struct regulator_bulk_data sdm845_dsi_regulators[] = { 167 + static const struct regulator_bulk_data dsi_v2_4_regulators[] = { 165 168 { .supply = "vdda", .init_load_uA = 21800 }, /* 1.2 V */ 166 169 }; 167 170 168 171 static const struct msm_dsi_config sdm845_dsi_cfg = { 169 172 .io_offset = DSI_6G_REG_SHIFT, 170 - .regulator_data = sdm845_dsi_regulators, 171 - .num_regulators = ARRAY_SIZE(sdm845_dsi_regulators), 172 - .bus_clk_names = dsi_sdm845_bus_clk_names, 173 - .num_bus_clks = ARRAY_SIZE(dsi_sdm845_bus_clk_names), 174 - .io_start = { 0xae94000, 0xae96000 }, 175 - .num_dsi = 2, 173 + .regulator_data = dsi_v2_4_regulators, 174 + .num_regulators = ARRAY_SIZE(dsi_v2_4_regulators), 175 + .bus_clk_names = dsi_v2_4_clk_names, 176 + .num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), 177 + .io_start = { 178 + { 0xae94000, 0xae96000 }, /* SDM845 / SDM670 */ 179 + { 0x5e94000 }, /* QCM2290 / SM6115 / SM6125 / SM6375 */ 180 + }, 176 181 }; 177 182 178 183 static const struct regulator_bulk_data sm8550_dsi_regulators[] = { ··· 182 189 .io_offset = DSI_6G_REG_SHIFT, 183 190 .regulator_data = sm8550_dsi_regulators, 184 191 .num_regulators = ARRAY_SIZE(sm8550_dsi_regulators), 185 - .bus_clk_names = dsi_sdm845_bus_clk_names, 186 - .num_bus_clks = ARRAY_SIZE(dsi_sdm845_bus_clk_names), 187 - .io_start = { 0xae94000, 0xae96000 }, 188 - .num_dsi = 2, 189 - }; 190 - 191 - static const struct regulator_bulk_data sc7180_dsi_regulators[] = { 192 - { .supply = "vdda", .init_load_uA = 21800 }, /* 1.2 V */ 193 - }; 194 - 195 - static const struct msm_dsi_config sc7180_dsi_cfg = { 196 - .io_offset = DSI_6G_REG_SHIFT, 197 - .regulator_data = sc7180_dsi_regulators, 198 - .num_regulators = ARRAY_SIZE(sc7180_dsi_regulators), 199 - .bus_clk_names = dsi_sc7180_bus_clk_names, 200 - .num_bus_clks = ARRAY_SIZE(dsi_sc7180_bus_clk_names), 201 - .io_start = { 0xae94000 }, 202 - .num_dsi = 1, 203 - }; 204 - 205 - static const char * const dsi_sc7280_bus_clk_names[] = { 206 - "iface", "bus", 192 + .bus_clk_names = dsi_v2_4_clk_names, 193 + .num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), 194 + .io_start = { 195 + { 0xae94000, 0xae96000 }, 196 + }, 207 197 }; 208 198 209 199 static const struct regulator_bulk_data sc7280_dsi_regulators[] = { ··· 197 221 .io_offset = DSI_6G_REG_SHIFT, 198 222 .regulator_data = sc7280_dsi_regulators, 199 223 .num_regulators = ARRAY_SIZE(sc7280_dsi_regulators), 200 - .bus_clk_names = dsi_sc7280_bus_clk_names, 201 - .num_bus_clks = ARRAY_SIZE(dsi_sc7280_bus_clk_names), 202 - .io_start = { 0xae94000, 0xae96000 }, 203 - .num_dsi = 2, 204 - }; 205 - 206 - static const char * const dsi_qcm2290_bus_clk_names[] = { 207 - "iface", "bus", 208 - }; 209 - 210 - static const struct regulator_bulk_data qcm2290_dsi_cfg_regulators[] = { 211 - { .supply = "vdda", .init_load_uA = 21800 }, /* 1.2 V */ 212 - }; 213 - 214 - static const struct msm_dsi_config qcm2290_dsi_cfg = { 215 - .io_offset = DSI_6G_REG_SHIFT, 216 - .regulator_data = qcm2290_dsi_cfg_regulators, 217 - .num_regulators = ARRAY_SIZE(qcm2290_dsi_cfg_regulators), 218 - .bus_clk_names = dsi_qcm2290_bus_clk_names, 219 - .num_bus_clks = ARRAY_SIZE(dsi_qcm2290_bus_clk_names), 220 - .io_start = { 0x5e94000 }, 221 - .num_dsi = 1, 224 + .bus_clk_names = dsi_v2_4_clk_names, 225 + .num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), 226 + .io_start = { 227 + { 0xae94000, 0xae96000 }, 228 + }, 222 229 }; 223 230 224 231 static const struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = { ··· 270 311 {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_0, 271 312 &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops}, 272 313 {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_1, 273 - &sc7180_dsi_cfg, &msm_dsi_6g_v2_host_ops}, 314 + &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops}, 274 315 {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_5_0, 275 316 &sc7280_dsi_cfg, &msm_dsi_6g_v2_host_ops}, 276 317 {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_6_0, ··· 294 335 295 336 return cfg_hnd; 296 337 } 297 - 298 - /* Non autodetect configs */ 299 - const struct msm_dsi_cfg_handler qcm2290_dsi_cfg_handler = { 300 - .cfg = &qcm2290_dsi_cfg, 301 - .ops = &msm_dsi_6g_v2_host_ops, 302 - };
+4 -5
drivers/gpu/drm/msm/dsi/dsi_cfg.h
··· 32 32 33 33 #define DSI_6G_REG_SHIFT 4 34 34 35 + /* Maximum number of configurations matched against the same hw revision */ 36 + #define VARIANTS_MAX 2 37 + 35 38 struct msm_dsi_config { 36 39 u32 io_offset; 37 40 const struct regulator_bulk_data *regulator_data; 38 41 int num_regulators; 39 42 const char * const *bus_clk_names; 40 43 const int num_bus_clks; 41 - const resource_size_t io_start[DSI_MAX]; 42 - const int num_dsi; 44 + const resource_size_t io_start[VARIANTS_MAX][DSI_MAX]; 43 45 }; 44 46 45 47 struct msm_dsi_host_cfg_ops { ··· 64 62 }; 65 63 66 64 const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor); 67 - 68 - /* Non autodetect configs */ 69 - extern const struct msm_dsi_cfg_handler qcm2290_dsi_cfg_handler; 70 65 71 66 #endif /* __MSM_DSI_CFG_H__ */ 72 67
+5 -9
drivers/gpu/drm/msm/dsi/dsi_host.c
··· 214 214 int ret; 215 215 u32 major = 0, minor = 0; 216 216 217 - cfg_hnd = device_get_match_data(dev); 218 - if (cfg_hnd) 219 - return cfg_hnd; 220 - 221 217 ahb_clk = msm_clk_get(msm_host->pdev, "iface"); 222 218 if (IS_ERR(ahb_clk)) { 223 219 pr_err("%s: cannot get interface clock\n", __func__); ··· 1858 1862 struct platform_device *pdev = msm_host->pdev; 1859 1863 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; 1860 1864 struct resource *res; 1861 - int i; 1865 + int i, j; 1862 1866 1863 1867 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dsi_ctrl"); 1864 1868 if (!res) 1865 1869 return -EINVAL; 1866 1870 1867 - for (i = 0; i < cfg->num_dsi; i++) { 1868 - if (cfg->io_start[i] == res->start) 1869 - return i; 1870 - } 1871 + for (i = 0; i < VARIANTS_MAX; i++) 1872 + for (j = 0; j < DSI_MAX; j++) 1873 + if (cfg->io_start[i][j] == res->start) 1874 + return j; 1871 1875 1872 1876 return -EINVAL; 1873 1877 }
+19 -19
drivers/gpu/drm/msm/dsi/dsi_phy_10nm.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+19 -19
drivers/gpu/drm/msm/dsi/dsi_phy_14nm.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+19 -19
drivers/gpu/drm/msm/dsi/dsi_phy_20nm.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+19 -19
drivers/gpu/drm/msm/dsi/dsi_phy_28nm.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+19 -19
drivers/gpu/drm/msm/dsi/dsi_phy_28nm_8960.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+18 -18
drivers/gpu/drm/msm/dsi/dsi_phy_7nm.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 30 Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark)
+19 -19
drivers/gpu/drm/msm/dsi/mmss_cc.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+19 -19
drivers/gpu/drm/msm/dsi/sfpb.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+41 -19
drivers/gpu/drm/msm/hdmi/hdmi.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33 ··· 776 776 777 777 #define REG_HDMI_8x74_ANA_CFG1 0x00000004 778 778 779 + #define REG_HDMI_8x74_ANA_CFG2 0x00000008 780 + 781 + #define REG_HDMI_8x74_ANA_CFG3 0x0000000c 782 + 779 783 #define REG_HDMI_8x74_PD_CTRL0 0x00000010 780 784 781 785 #define REG_HDMI_8x74_PD_CTRL1 0x00000014 786 + 787 + #define REG_HDMI_8x74_GLB_CFG 0x00000018 788 + 789 + #define REG_HDMI_8x74_DCC_CFG0 0x0000001c 790 + 791 + #define REG_HDMI_8x74_DCC_CFG1 0x00000020 792 + 793 + #define REG_HDMI_8x74_TXCAL_CFG0 0x00000024 794 + 795 + #define REG_HDMI_8x74_TXCAL_CFG1 0x00000028 796 + 797 + #define REG_HDMI_8x74_TXCAL_CFG2 0x0000002c 798 + 799 + #define REG_HDMI_8x74_TXCAL_CFG3 0x00000030 782 800 783 801 #define REG_HDMI_8x74_BIST_CFG0 0x00000034 784 802 ··· 807 789 #define REG_HDMI_8x74_BIST_PATN2 0x00000044 808 790 809 791 #define REG_HDMI_8x74_BIST_PATN3 0x00000048 792 + 793 + #define REG_HDMI_8x74_STATUS 0x0000005c 810 794 811 795 #define REG_HDMI_28nm_PHY_PLL_REFCLK_CFG 0x00000000 812 796 ··· 896 876 #define REG_HDMI_28nm_PHY_PLL_EFUSE_CFG 0x0000009c 897 877 898 878 #define REG_HDMI_28nm_PHY_PLL_DEBUG_BUS_SEL 0x000000a0 879 + 880 + #define REG_HDMI_28nm_PHY_PLL_STATUS 0x000000c0 899 881 900 882 #define REG_HDMI_8996_PHY_CFG 0x00000000 901 883
+19 -19
drivers/gpu/drm/msm/hdmi/qfprom.xml.h
··· 8 8 git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 - - /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-03-03 01:18:13) 12 - - /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2020-12-31 19:26:32) 13 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2021-01-30 18:25:22) 14 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2021-01-30 18:25:22) 15 - - /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2021-01-30 18:25:22) 16 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml ( 17560 bytes, from 2021-09-16 22:37:02) 17 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2021-07-22 15:21:56) 18 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2021-07-22 15:21:56) 19 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2021-07-22 15:21:56) 20 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2021-07-22 15:21:56) 21 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2021-07-22 15:21:56) 22 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2021-07-22 15:21:56) 23 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-03 01:18:13) 24 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2021-01-30 18:25:22) 25 - - /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2021-01-30 18:25:22) 26 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2021-01-30 18:25:22) 27 - - /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 41874 bytes, from 2021-01-30 18:25:22) 28 - - /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2021-01-30 18:25:22) 11 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml ( 944 bytes, from 2022-07-23 20:21:46) 12 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml ( 1572 bytes, from 2022-07-23 20:21:46) 13 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml ( 20912 bytes, from 2022-03-08 17:40:42) 14 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml ( 2849 bytes, from 2022-03-08 17:40:42) 15 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml ( 37461 bytes, from 2022-03-08 17:40:42) 16 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml ( 18746 bytes, from 2022-04-28 17:29:36) 17 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml ( 3236 bytes, from 2022-03-08 17:40:42) 18 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml ( 4935 bytes, from 2022-03-08 17:40:42) 19 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml ( 7004 bytes, from 2022-03-08 17:40:42) 20 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml ( 3712 bytes, from 2022-03-08 17:40:42) 21 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml ( 5381 bytes, from 2022-03-08 17:40:42) 22 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml ( 4499 bytes, from 2022-03-08 17:40:42) 23 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml ( 11007 bytes, from 2022-03-08 17:40:42) 24 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml ( 602 bytes, from 2022-03-08 17:40:42) 25 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml ( 1686 bytes, from 2022-03-08 17:40:42) 26 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml ( 600 bytes, from 2022-03-08 17:40:42) 27 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml ( 42350 bytes, from 2022-09-20 17:45:56) 28 + - /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml ( 10416 bytes, from 2022-03-08 17:40:42) 29 29 30 - Copyright (C) 2013-2021 by the following authors: 30 + Copyright (C) 2013-2022 by the following authors: 31 31 - Rob Clark <robdclark@gmail.com> (robclark) 32 32 - Ilia Mirkin <imirkin@alum.mit.edu> (imirkin) 33 33
+25 -4
drivers/gpu/drm/msm/msm_atomic.c
··· 179 179 return mask; 180 180 } 181 181 182 + int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) 183 + { 184 + struct drm_crtc_state *old_crtc_state, *new_crtc_state; 185 + struct drm_crtc *crtc; 186 + int i; 187 + 188 + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 189 + new_crtc_state, i) { 190 + if ((old_crtc_state->ctm && !new_crtc_state->ctm) || 191 + (!old_crtc_state->ctm && new_crtc_state->ctm)) { 192 + new_crtc_state->mode_changed = true; 193 + state->allow_modeset = true; 194 + } 195 + } 196 + 197 + return drm_atomic_helper_check(dev, state); 198 + } 199 + 182 200 void msm_atomic_commit_tail(struct drm_atomic_state *state) 183 201 { 184 202 struct drm_device *dev = state->dev; ··· 204 186 struct msm_kms *kms = priv->kms; 205 187 struct drm_crtc *async_crtc = NULL; 206 188 unsigned crtc_mask = get_crtc_mask(state); 207 - bool async = kms->funcs->vsync_time && 208 - can_do_async(state, &async_crtc); 189 + bool async = can_do_async(state, &async_crtc); 209 190 210 191 trace_msm_atomic_commit_tail_start(async, crtc_mask); 211 192 ··· 223 206 * Now that there is no in-progress flush, prepare the 224 207 * current update: 225 208 */ 226 - kms->funcs->prepare_commit(kms, state); 209 + if (kms->funcs->prepare_commit) 210 + kms->funcs->prepare_commit(kms, state); 227 211 228 212 /* 229 213 * Push atomic updates down to hardware: ··· 249 231 250 232 kms->pending_crtc_mask |= crtc_mask; 251 233 252 - vsync_time = kms->funcs->vsync_time(kms, async_crtc); 234 + if (drm_crtc_next_vblank_start(async_crtc, &vsync_time)) 235 + goto fallback; 236 + 253 237 wakeup_time = ktime_sub(vsync_time, ms_to_ktime(1)); 254 238 255 239 msm_hrtimer_queue_work(&timer->work, wakeup_time, ··· 273 253 return; 274 254 } 275 255 256 + fallback: 276 257 /* 277 258 * If there is any async flush pending on updated crtcs, fold 278 259 * them into the current flush.
+3 -3
drivers/gpu/drm/msm/msm_debugfs.c
··· 10 10 #include <linux/fault-inject.h> 11 11 12 12 #include <drm/drm_debugfs.h> 13 + #include <drm/drm_fb_helper.h> 13 14 #include <drm/drm_file.h> 14 15 #include <drm/drm_framebuffer.h> 15 16 ··· 242 241 { 243 242 struct drm_info_node *node = (struct drm_info_node *) m->private; 244 243 struct drm_device *dev = node->minor->dev; 245 - struct msm_drm_private *priv = dev->dev_private; 246 244 struct drm_framebuffer *fb, *fbdev_fb = NULL; 247 245 248 - if (priv->fbdev) { 246 + if (dev->fb_helper && dev->fb_helper->fb) { 249 247 seq_printf(m, "fbcon "); 250 - fbdev_fb = priv->fbdev->fb; 248 + fbdev_fb = dev->fb_helper->fb; 251 249 msm_framebuffer_describe(fbdev_fb, m); 252 250 } 253 251
+62 -47
drivers/gpu/drm/msm/msm_drv.c
··· 8 8 #include <linux/dma-mapping.h> 9 9 #include <linux/fault-inject.h> 10 10 #include <linux/kthread.h> 11 + #include <linux/of_address.h> 11 12 #include <linux/sched/mm.h> 12 13 #include <linux/uaccess.h> 13 14 #include <uapi/linux/sched/types.h> 14 15 16 + #include <drm/drm_aperture.h> 15 17 #include <drm/drm_bridge.h> 16 18 #include <drm/drm_drv.h> 17 19 #include <drm/drm_file.h> ··· 48 46 * - 1.8.0 - Add MSM_BO_CACHED_COHERENT for supported GPUs (a6xx) 49 47 * - 1.9.0 - Add MSM_SUBMIT_FENCE_SN_IN 50 48 * - 1.10.0 - Add MSM_SUBMIT_BO_NO_IMPLICIT 49 + * - 1.11.0 - Add wait boost (MSM_WAIT_FENCE_BOOST, MSM_PREP_BOOST) 51 50 */ 52 51 #define MSM_VERSION_MAJOR 1 53 52 #define MSM_VERSION_MINOR 10 54 53 #define MSM_VERSION_PATCHLEVEL 0 55 54 55 + static void msm_deinit_vram(struct drm_device *ddev); 56 + 56 57 static const struct drm_mode_config_funcs mode_config_funcs = { 57 58 .fb_create = msm_framebuffer_create, 58 - .output_poll_changed = drm_fb_helper_output_poll_changed, 59 - .atomic_check = drm_atomic_helper_check, 59 + .atomic_check = msm_atomic_check, 60 60 .atomic_commit = drm_atomic_helper_commit, 61 61 }; 62 62 63 63 static const struct drm_mode_config_helper_funcs mode_config_helper_funcs = { 64 64 .atomic_commit_tail = msm_atomic_commit_tail, 65 65 }; 66 - 67 - #ifdef CONFIG_DRM_FBDEV_EMULATION 68 - static bool fbdev = true; 69 - MODULE_PARM_DESC(fbdev, "Enable fbdev compat layer"); 70 - module_param(fbdev, bool, 0600); 71 - #endif 72 66 73 67 static char *vram = "16m"; 74 68 MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without IOMMU/GPUMMU)"); ··· 147 149 { 148 150 struct msm_drm_private *priv = dev->dev_private; 149 151 struct msm_kms *kms = priv->kms; 150 - 151 - if (!priv->kms) 152 - return; 153 152 154 153 kms->funcs->irq_uninstall(kms); 155 154 if (kms->irq_requested) ··· 235 240 msm_perf_debugfs_cleanup(priv); 236 241 msm_rd_debugfs_cleanup(priv); 237 242 238 - #ifdef CONFIG_DRM_FBDEV_EMULATION 239 - if (fbdev && priv->fbdev) 240 - msm_fbdev_free(ddev); 241 - #endif 242 - 243 - msm_disp_snapshot_destroy(ddev); 243 + if (kms) 244 + msm_disp_snapshot_destroy(ddev); 244 245 245 246 drm_mode_config_cleanup(ddev); 246 247 ··· 244 253 drm_bridge_remove(priv->bridges[i]); 245 254 priv->num_bridges = 0; 246 255 247 - pm_runtime_get_sync(dev); 248 - msm_irq_uninstall(ddev); 249 - pm_runtime_put_sync(dev); 256 + if (kms) { 257 + pm_runtime_get_sync(dev); 258 + msm_irq_uninstall(ddev); 259 + pm_runtime_put_sync(dev); 260 + } 250 261 251 262 if (kms && kms->funcs) 252 263 kms->funcs->destroy(kms); 253 264 254 - if (priv->vram.paddr) { 255 - unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING; 256 - drm_mm_takedown(&priv->vram.mm); 257 - dma_free_attrs(dev, priv->vram.size, NULL, 258 - priv->vram.paddr, attrs); 259 - } 265 + msm_deinit_vram(ddev); 260 266 261 267 component_unbind_all(dev, ddev); 262 268 263 269 ddev->dev_private = NULL; 270 + drm_dev_put(ddev); 271 + 264 272 destroy_workqueue(priv->wq); 265 273 266 274 return 0; 267 275 } 268 - 269 - #include <linux/of_address.h> 270 276 271 277 struct msm_gem_address_space *msm_kms_init_aspace(struct drm_device *dev) 272 278 { ··· 389 401 return ret; 390 402 } 391 403 404 + static void msm_deinit_vram(struct drm_device *ddev) 405 + { 406 + struct msm_drm_private *priv = ddev->dev_private; 407 + unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING; 408 + 409 + if (!priv->vram.paddr) 410 + return; 411 + 412 + drm_mm_takedown(&priv->vram.mm); 413 + dma_free_attrs(ddev->dev, priv->vram.size, NULL, priv->vram.paddr, 414 + attrs); 415 + } 416 + 392 417 static int msm_drm_init(struct device *dev, const struct drm_driver *drv) 393 418 { 394 419 struct msm_drm_private *priv = dev_get_drvdata(dev); ··· 421 420 priv->dev = ddev; 422 421 423 422 priv->wq = alloc_ordered_workqueue("msm", 0); 424 - if (!priv->wq) 425 - return -ENOMEM; 423 + if (!priv->wq) { 424 + ret = -ENOMEM; 425 + goto err_put_dev; 426 + } 426 427 427 428 INIT_LIST_HEAD(&priv->objects); 428 429 mutex_init(&priv->obj_lock); ··· 447 444 448 445 ret = msm_init_vram(ddev); 449 446 if (ret) 450 - goto err_drm_dev_put; 447 + goto err_cleanup_mode_config; 451 448 452 449 /* Bind all our sub-components: */ 453 450 ret = component_bind_all(dev, ddev); 454 451 if (ret) 455 - goto err_drm_dev_put; 452 + goto err_deinit_vram; 453 + 454 + /* the fw fb could be anywhere in memory */ 455 + ret = drm_aperture_remove_framebuffers(false, drv); 456 + if (ret) 457 + goto err_msm_uninit; 456 458 457 459 dma_set_max_seg_size(dev, UINT_MAX); 458 460 ··· 537 529 } 538 530 drm_mode_config_reset(ddev); 539 531 540 - #ifdef CONFIG_DRM_FBDEV_EMULATION 541 - if (kms && fbdev) 542 - priv->fbdev = msm_fbdev_init(ddev); 543 - #endif 544 - 545 532 ret = msm_debugfs_late_init(ddev); 546 533 if (ret) 547 534 goto err_msm_uninit; 548 535 549 536 drm_kms_helper_poll_init(ddev); 550 537 538 + if (kms) 539 + msm_fbdev_setup(ddev); 540 + 551 541 return 0; 552 542 553 543 err_msm_uninit: 554 544 msm_drm_uninit(dev); 555 - err_drm_dev_put: 545 + 546 + return ret; 547 + 548 + err_deinit_vram: 549 + msm_deinit_vram(ddev); 550 + err_cleanup_mode_config: 551 + drm_mode_config_cleanup(ddev); 552 + destroy_workqueue(priv->wq); 553 + err_put_dev: 556 554 drm_dev_put(ddev); 555 + 557 556 return ret; 558 557 } 559 558 ··· 914 899 } 915 900 916 901 static int wait_fence(struct msm_gpu_submitqueue *queue, uint32_t fence_id, 917 - ktime_t timeout) 902 + ktime_t timeout, uint32_t flags) 918 903 { 919 904 struct dma_fence *fence; 920 905 int ret; ··· 933 918 * retired, so if the fence is not found it means there is nothing 934 919 * to wait for 935 920 */ 936 - ret = mutex_lock_interruptible(&queue->idr_lock); 937 - if (ret) 938 - return ret; 921 + spin_lock(&queue->idr_lock); 939 922 fence = idr_find(&queue->fence_idr, fence_id); 940 923 if (fence) 941 924 fence = dma_fence_get_rcu(fence); 942 - mutex_unlock(&queue->idr_lock); 925 + spin_unlock(&queue->idr_lock); 943 926 944 927 if (!fence) 945 928 return 0; 929 + 930 + if (flags & MSM_WAIT_FENCE_BOOST) 931 + dma_fence_set_deadline(fence, ktime_get()); 946 932 947 933 ret = dma_fence_wait_timeout(fence, true, timeout_to_jiffies(&timeout)); 948 934 if (ret == 0) { ··· 965 949 struct msm_gpu_submitqueue *queue; 966 950 int ret; 967 951 968 - if (args->pad) { 969 - DRM_ERROR("invalid pad: %08x\n", args->pad); 952 + if (args->flags & ~MSM_WAIT_FENCE_FLAGS) { 953 + DRM_ERROR("invalid flags: %08x\n", args->flags); 970 954 return -EINVAL; 971 955 } 972 956 ··· 977 961 if (!queue) 978 962 return -ENOENT; 979 963 980 - ret = wait_fence(queue, args->fence, to_ktime(args->timeout)); 964 + ret = wait_fence(queue, args->fence, to_ktime(args->timeout), args->flags); 981 965 982 966 msm_submitqueue_put(queue); 983 967 ··· 1084 1068 DRIVER_SYNCOBJ, 1085 1069 .open = msm_open, 1086 1070 .postclose = msm_postclose, 1087 - .lastclose = drm_fb_helper_lastclose, 1088 1071 .dumb_create = msm_gem_dumb_create, 1089 1072 .dumb_map_offset = msm_gem_dumb_map_offset, 1090 1073 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+9 -6
drivers/gpu/drm/msm/msm_drv.h
··· 29 29 #include <drm/drm_atomic.h> 30 30 #include <drm/drm_atomic_helper.h> 31 31 #include <drm/drm_probe_helper.h> 32 - #include <drm/drm_fb_helper.h> 33 32 #include <drm/display/drm_dsc.h> 34 33 #include <drm/msm_drm.h> 35 34 #include <drm/drm_gem.h> ··· 127 128 /* gpu is only set on open(), but we need this info earlier */ 128 129 bool is_a2xx; 129 130 bool has_cached_coherent; 130 - 131 - struct drm_fb_helper *fbdev; 132 131 133 132 struct msm_rd_state *rd; /* debugfs to dump all submits */ 134 133 struct msm_rd_state *hangrd; /* debugfs to dump hanging submits */ ··· 258 261 struct msm_kms *kms, int crtc_idx); 259 262 void msm_atomic_destroy_pending_timer(struct msm_pending_timer *timer); 260 263 void msm_atomic_commit_tail(struct drm_atomic_state *state); 264 + int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state); 261 265 struct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev); 262 266 void msm_atomic_state_clear(struct drm_atomic_state *state); 263 267 void msm_atomic_state_free(struct drm_atomic_state *state); ··· 304 306 struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev, 305 307 int w, int h, int p, uint32_t format); 306 308 307 - struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev); 308 - void msm_fbdev_free(struct drm_device *dev); 309 + #ifdef CONFIG_DRM_FBDEV_EMULATION 310 + void msm_fbdev_setup(struct drm_device *dev); 311 + #else 312 + static inline void msm_fbdev_setup(struct drm_device *dev) 313 + { 314 + } 315 + #endif 309 316 310 317 struct hdmi; 311 318 #ifdef CONFIG_DRM_MSM_HDMI ··· 551 548 remaining_jiffies = ktime_divns(rem, NSEC_PER_SEC / HZ); 552 549 } 553 550 554 - return clamp(remaining_jiffies, 0LL, (s64)INT_MAX); 551 + return clamp(remaining_jiffies, 1LL, (s64)INT_MAX); 555 552 } 556 553 557 554 /* Driver helpers */
+109 -72
drivers/gpu/drm/msm/msm_fbdev.c
··· 4 4 * Author: Rob Clark <robdclark@gmail.com> 5 5 */ 6 6 7 - #include <drm/drm_aperture.h> 8 - #include <drm/drm_crtc.h> 7 + #include <drm/drm_drv.h> 8 + #include <drm/drm_crtc_helper.h> 9 9 #include <drm/drm_fb_helper.h> 10 10 #include <drm/drm_fourcc.h> 11 11 #include <drm/drm_framebuffer.h> ··· 15 15 #include "msm_gem.h" 16 16 #include "msm_kms.h" 17 17 18 - static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma); 18 + static bool fbdev = true; 19 + MODULE_PARM_DESC(fbdev, "Enable fbdev compat layer"); 20 + module_param(fbdev, bool, 0600); 19 21 20 22 /* 21 23 * fbdev funcs, to implement legacy fbdev interface on top of drm driver 22 24 */ 23 25 24 - #define to_msm_fbdev(x) container_of(x, struct msm_fbdev, base) 26 + static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma) 27 + { 28 + struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; 29 + struct drm_gem_object *bo = msm_framebuffer_bo(helper->fb, 0); 25 30 26 - struct msm_fbdev { 27 - struct drm_fb_helper base; 28 - struct drm_framebuffer *fb; 29 - }; 31 + return drm_gem_prime_mmap(bo, vma); 32 + } 33 + 34 + static void msm_fbdev_fb_destroy(struct fb_info *info) 35 + { 36 + struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; 37 + struct drm_framebuffer *fb = helper->fb; 38 + struct drm_gem_object *bo = msm_framebuffer_bo(fb, 0); 39 + 40 + DBG(); 41 + 42 + drm_fb_helper_fini(helper); 43 + 44 + /* this will free the backing object */ 45 + msm_gem_put_vaddr(bo); 46 + drm_framebuffer_remove(fb); 47 + 48 + drm_client_release(&helper->client); 49 + drm_fb_helper_unprepare(helper); 50 + kfree(helper); 51 + } 30 52 31 53 static const struct fb_ops msm_fb_ops = { 32 54 .owner = THIS_MODULE, ··· 63 41 .fb_copyarea = drm_fb_helper_sys_copyarea, 64 42 .fb_imageblit = drm_fb_helper_sys_imageblit, 65 43 .fb_mmap = msm_fbdev_mmap, 44 + .fb_destroy = msm_fbdev_fb_destroy, 66 45 }; 67 - 68 - static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma) 69 - { 70 - struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; 71 - struct msm_fbdev *fbdev = to_msm_fbdev(helper); 72 - struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0); 73 - 74 - return drm_gem_prime_mmap(bo, vma); 75 - } 76 46 77 47 static int msm_fbdev_create(struct drm_fb_helper *helper, 78 48 struct drm_fb_helper_surface_size *sizes) 79 49 { 80 - struct msm_fbdev *fbdev = to_msm_fbdev(helper); 81 50 struct drm_device *dev = helper->dev; 82 51 struct msm_drm_private *priv = dev->dev_private; 83 52 struct drm_framebuffer *fb = NULL; ··· 115 102 116 103 DBG("fbi=%p, dev=%p", fbi, dev); 117 104 118 - fbdev->fb = fb; 119 105 helper->fb = fb; 120 106 121 107 fbi->fbops = &msm_fb_ops; ··· 131 119 fbi->fix.smem_len = bo->size; 132 120 133 121 DBG("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres); 134 - DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height); 122 + DBG("allocated %dx%d fb", fb->width, fb->height); 135 123 136 124 return 0; 137 125 ··· 144 132 .fb_probe = msm_fbdev_create, 145 133 }; 146 134 147 - /* initialize fbdev helper */ 148 - struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev) 135 + /* 136 + * struct drm_client 137 + */ 138 + 139 + static void msm_fbdev_client_unregister(struct drm_client_dev *client) 149 140 { 150 - struct msm_drm_private *priv = dev->dev_private; 151 - struct msm_fbdev *fbdev; 141 + struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); 142 + 143 + if (fb_helper->info) { 144 + drm_fb_helper_unregister_info(fb_helper); 145 + } else { 146 + drm_client_release(&fb_helper->client); 147 + drm_fb_helper_unprepare(fb_helper); 148 + kfree(fb_helper); 149 + } 150 + } 151 + 152 + static int msm_fbdev_client_restore(struct drm_client_dev *client) 153 + { 154 + drm_fb_helper_lastclose(client->dev); 155 + 156 + return 0; 157 + } 158 + 159 + static int msm_fbdev_client_hotplug(struct drm_client_dev *client) 160 + { 161 + struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); 162 + struct drm_device *dev = client->dev; 163 + int ret; 164 + 165 + if (dev->fb_helper) 166 + return drm_fb_helper_hotplug_event(dev->fb_helper); 167 + 168 + ret = drm_fb_helper_init(dev, fb_helper); 169 + if (ret) 170 + goto err_drm_err; 171 + 172 + if (!drm_drv_uses_atomic_modeset(dev)) 173 + drm_helper_disable_unused_functions(dev); 174 + 175 + ret = drm_fb_helper_initial_config(fb_helper); 176 + if (ret) 177 + goto err_drm_fb_helper_fini; 178 + 179 + return 0; 180 + 181 + err_drm_fb_helper_fini: 182 + drm_fb_helper_fini(fb_helper); 183 + err_drm_err: 184 + drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret); 185 + return ret; 186 + } 187 + 188 + static const struct drm_client_funcs msm_fbdev_client_funcs = { 189 + .owner = THIS_MODULE, 190 + .unregister = msm_fbdev_client_unregister, 191 + .restore = msm_fbdev_client_restore, 192 + .hotplug = msm_fbdev_client_hotplug, 193 + }; 194 + 195 + /* initialize fbdev helper */ 196 + void msm_fbdev_setup(struct drm_device *dev) 197 + { 152 198 struct drm_fb_helper *helper; 153 199 int ret; 154 200 155 - fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL); 156 201 if (!fbdev) 157 - return NULL; 202 + return; 158 203 159 - helper = &fbdev->base; 204 + drm_WARN(dev, !dev->registered, "Device has not been registered.\n"); 205 + drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); 160 206 207 + helper = kzalloc(sizeof(*helper), GFP_KERNEL); 208 + if (!helper) 209 + return; 161 210 drm_fb_helper_prepare(dev, helper, 32, &msm_fb_helper_funcs); 162 211 163 - ret = drm_fb_helper_init(dev, helper); 212 + ret = drm_client_init(dev, &helper->client, "fbdev", &msm_fbdev_client_funcs); 164 213 if (ret) { 165 - DRM_DEV_ERROR(dev->dev, "could not init fbdev: ret=%d\n", ret); 166 - goto fail; 214 + drm_err(dev, "Failed to register client: %d\n", ret); 215 + goto err_drm_fb_helper_unprepare; 167 216 } 168 217 169 - /* the fw fb could be anywhere in memory */ 170 - ret = drm_aperture_remove_framebuffers(false, dev->driver); 218 + ret = msm_fbdev_client_hotplug(&helper->client); 171 219 if (ret) 172 - goto fini; 220 + drm_dbg_kms(dev, "client hotplug ret=%d\n", ret); 173 221 174 - ret = drm_fb_helper_initial_config(helper); 175 - if (ret) 176 - goto fini; 222 + drm_client_register(&helper->client); 177 223 178 - priv->fbdev = helper; 224 + return; 179 225 180 - return helper; 181 - 182 - fini: 183 - drm_fb_helper_fini(helper); 184 - fail: 226 + err_drm_fb_helper_unprepare: 185 227 drm_fb_helper_unprepare(helper); 186 - kfree(fbdev); 187 - return NULL; 188 - } 189 - 190 - void msm_fbdev_free(struct drm_device *dev) 191 - { 192 - struct msm_drm_private *priv = dev->dev_private; 193 - struct drm_fb_helper *helper = priv->fbdev; 194 - struct msm_fbdev *fbdev; 195 - 196 - DBG(); 197 - 198 - drm_fb_helper_unregister_info(helper); 199 - 200 - drm_fb_helper_fini(helper); 201 - 202 - fbdev = to_msm_fbdev(priv->fbdev); 203 - 204 - /* this will free the backing object */ 205 - if (fbdev->fb) { 206 - struct drm_gem_object *bo = 207 - msm_framebuffer_bo(fbdev->fb, 0); 208 - msm_gem_put_vaddr(bo); 209 - drm_framebuffer_remove(fbdev->fb); 210 - } 211 - 212 - drm_fb_helper_unprepare(helper); 213 - kfree(fbdev); 214 - 215 - priv->fbdev = NULL; 228 + kfree(helper); 216 229 }
+83 -3
drivers/gpu/drm/msm/msm_fence.c
··· 8 8 9 9 #include "msm_drv.h" 10 10 #include "msm_fence.h" 11 + #include "msm_gpu.h" 12 + 13 + static struct msm_gpu *fctx2gpu(struct msm_fence_context *fctx) 14 + { 15 + struct msm_drm_private *priv = fctx->dev->dev_private; 16 + return priv->gpu; 17 + } 18 + 19 + static enum hrtimer_restart deadline_timer(struct hrtimer *t) 20 + { 21 + struct msm_fence_context *fctx = container_of(t, 22 + struct msm_fence_context, deadline_timer); 23 + 24 + kthread_queue_work(fctx2gpu(fctx)->worker, &fctx->deadline_work); 25 + 26 + return HRTIMER_NORESTART; 27 + } 28 + 29 + static void deadline_work(struct kthread_work *work) 30 + { 31 + struct msm_fence_context *fctx = container_of(work, 32 + struct msm_fence_context, deadline_work); 33 + 34 + /* If deadline fence has already passed, nothing to do: */ 35 + if (msm_fence_completed(fctx, fctx->next_deadline_fence)) 36 + return; 37 + 38 + msm_devfreq_boost(fctx2gpu(fctx), 2); 39 + } 11 40 12 41 13 42 struct msm_fence_context * ··· 65 36 fctx->completed_fence = fctx->last_fence; 66 37 *fctx->fenceptr = fctx->last_fence; 67 38 39 + hrtimer_init(&fctx->deadline_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); 40 + fctx->deadline_timer.function = deadline_timer; 41 + 42 + kthread_init_work(&fctx->deadline_work, deadline_work); 43 + 44 + fctx->next_deadline = ktime_get(); 45 + 68 46 return fctx; 69 47 } 70 48 ··· 98 62 spin_lock_irqsave(&fctx->spinlock, flags); 99 63 if (fence_after(fence, fctx->completed_fence)) 100 64 fctx->completed_fence = fence; 65 + if (msm_fence_completed(fctx, fctx->next_deadline_fence)) 66 + hrtimer_cancel(&fctx->deadline_timer); 101 67 spin_unlock_irqrestore(&fctx->spinlock, flags); 102 68 } 103 69 ··· 130 92 return msm_fence_completed(f->fctx, f->base.seqno); 131 93 } 132 94 95 + static void msm_fence_set_deadline(struct dma_fence *fence, ktime_t deadline) 96 + { 97 + struct msm_fence *f = to_msm_fence(fence); 98 + struct msm_fence_context *fctx = f->fctx; 99 + unsigned long flags; 100 + ktime_t now; 101 + 102 + spin_lock_irqsave(&fctx->spinlock, flags); 103 + now = ktime_get(); 104 + 105 + if (ktime_after(now, fctx->next_deadline) || 106 + ktime_before(deadline, fctx->next_deadline)) { 107 + fctx->next_deadline = deadline; 108 + fctx->next_deadline_fence = 109 + max(fctx->next_deadline_fence, (uint32_t)fence->seqno); 110 + 111 + /* 112 + * Set timer to trigger boost 3ms before deadline, or 113 + * if we are already less than 3ms before the deadline 114 + * schedule boost work immediately. 115 + */ 116 + deadline = ktime_sub(deadline, ms_to_ktime(3)); 117 + 118 + if (ktime_after(now, deadline)) { 119 + kthread_queue_work(fctx2gpu(fctx)->worker, 120 + &fctx->deadline_work); 121 + } else { 122 + hrtimer_start(&fctx->deadline_timer, deadline, 123 + HRTIMER_MODE_ABS); 124 + } 125 + } 126 + 127 + spin_unlock_irqrestore(&fctx->spinlock, flags); 128 + } 129 + 133 130 static const struct dma_fence_ops msm_fence_ops = { 134 131 .get_driver_name = msm_fence_get_driver_name, 135 132 .get_timeline_name = msm_fence_get_timeline_name, 136 133 .signaled = msm_fence_signaled, 134 + .set_deadline = msm_fence_set_deadline, 137 135 }; 138 136 139 137 struct dma_fence * 140 - msm_fence_alloc(struct msm_fence_context *fctx) 138 + msm_fence_alloc(void) 141 139 { 142 140 struct msm_fence *f; 143 141 ··· 181 107 if (!f) 182 108 return ERR_PTR(-ENOMEM); 183 109 110 + return &f->base; 111 + } 112 + 113 + void 114 + msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx) 115 + { 116 + struct msm_fence *f = to_msm_fence(fence); 117 + 184 118 f->fctx = fctx; 185 119 186 120 dma_fence_init(&f->base, &msm_fence_ops, &fctx->spinlock, 187 121 fctx->context, ++fctx->last_fence); 188 - 189 - return &f->base; 190 122 }
+22 -1
drivers/gpu/drm/msm/msm_fence.h
··· 52 52 volatile uint32_t *fenceptr; 53 53 54 54 spinlock_t spinlock; 55 + 56 + /* 57 + * TODO this doesn't really deal with multiple deadlines, like 58 + * if userspace got multiple frames ahead.. OTOH atomic updates 59 + * don't queue, so maybe that is ok 60 + */ 61 + 62 + /** next_deadline: Time of next deadline */ 63 + ktime_t next_deadline; 64 + 65 + /** 66 + * next_deadline_fence: 67 + * 68 + * Fence value for next pending deadline. The deadline timer is 69 + * canceled when this fence is signaled. 70 + */ 71 + uint32_t next_deadline_fence; 72 + 73 + struct hrtimer deadline_timer; 74 + struct kthread_work deadline_work; 55 75 }; 56 76 57 77 struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev, ··· 81 61 bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence); 82 62 void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence); 83 63 84 - struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx); 64 + struct dma_fence * msm_fence_alloc(void); 65 + void msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx); 85 66 86 67 static inline bool 87 68 fence_before(uint32_t a, uint32_t b)
+102 -48
drivers/gpu/drm/msm/msm_gem.c
··· 19 19 #include "msm_gpu.h" 20 20 #include "msm_mmu.h" 21 21 22 - static void update_lru(struct drm_gem_object *obj); 23 - 24 22 static dma_addr_t physaddr(struct drm_gem_object *obj) 25 23 { 26 24 struct msm_gem_object *msm_obj = to_msm_bo(obj); ··· 59 61 struct device *dev = msm_obj->base.dev->dev; 60 62 61 63 dma_unmap_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0); 64 + } 65 + 66 + static void update_lru_active(struct drm_gem_object *obj) 67 + { 68 + struct msm_drm_private *priv = obj->dev->dev_private; 69 + struct msm_gem_object *msm_obj = to_msm_bo(obj); 70 + 71 + GEM_WARN_ON(!msm_obj->pages); 72 + 73 + if (msm_obj->pin_count) { 74 + drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj); 75 + } else if (msm_obj->madv == MSM_MADV_WILLNEED) { 76 + drm_gem_lru_move_tail_locked(&priv->lru.willneed, obj); 77 + } else { 78 + GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED); 79 + 80 + drm_gem_lru_move_tail_locked(&priv->lru.dontneed, obj); 81 + } 82 + } 83 + 84 + static void update_lru_locked(struct drm_gem_object *obj) 85 + { 86 + struct msm_drm_private *priv = obj->dev->dev_private; 87 + struct msm_gem_object *msm_obj = to_msm_bo(obj); 88 + 89 + msm_gem_assert_locked(&msm_obj->base); 90 + 91 + if (!msm_obj->pages) { 92 + GEM_WARN_ON(msm_obj->pin_count); 93 + 94 + drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj); 95 + } else { 96 + update_lru_active(obj); 97 + } 98 + } 99 + 100 + static void update_lru(struct drm_gem_object *obj) 101 + { 102 + struct msm_drm_private *priv = obj->dev->dev_private; 103 + 104 + mutex_lock(&priv->lru.lock); 105 + update_lru_locked(obj); 106 + mutex_unlock(&priv->lru.lock); 62 107 } 63 108 64 109 /* allocate pages from VRAM carveout, used when no IOMMU: */ ··· 221 180 222 181 static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj) 223 182 { 183 + struct msm_drm_private *priv = obj->dev->dev_private; 224 184 struct msm_gem_object *msm_obj = to_msm_bo(obj); 225 185 struct page **p; 226 186 ··· 232 190 } 233 191 234 192 p = get_pages(obj); 235 - if (!IS_ERR(p)) { 236 - to_msm_bo(obj)->pin_count++; 237 - update_lru(obj); 238 - } 193 + if (IS_ERR(p)) 194 + return p; 195 + 196 + mutex_lock(&priv->lru.lock); 197 + msm_obj->pin_count++; 198 + update_lru_locked(obj); 199 + mutex_unlock(&priv->lru.lock); 239 200 240 201 return p; 241 202 } ··· 354 309 355 310 msm_gem_assert_locked(obj); 356 311 357 - vma = kzalloc(sizeof(*vma), GFP_KERNEL); 312 + vma = msm_gem_vma_new(aspace); 358 313 if (!vma) 359 314 return ERR_PTR(-ENOMEM); 360 - 361 - vma->aspace = aspace; 362 315 363 316 list_add_tail(&vma->list, &msm_obj->vmas); 364 317 ··· 404 361 405 362 list_for_each_entry(vma, &msm_obj->vmas, list) { 406 363 if (vma->aspace) { 407 - msm_gem_purge_vma(vma->aspace, vma); 364 + msm_gem_vma_purge(vma); 408 365 if (close) 409 - msm_gem_close_vma(vma->aspace, vma); 366 + msm_gem_vma_close(vma); 410 367 } 411 368 } 412 369 } ··· 442 399 if (IS_ERR(vma)) 443 400 return vma; 444 401 445 - ret = msm_gem_init_vma(aspace, vma, obj->size, 402 + ret = msm_gem_vma_init(vma, obj->size, 446 403 range_start, range_end); 447 404 if (ret) { 448 405 del_vma(vma); ··· 480 437 if (IS_ERR(pages)) 481 438 return PTR_ERR(pages); 482 439 483 - ret = msm_gem_map_vma(vma->aspace, vma, prot, msm_obj->sgt, obj->size); 440 + ret = msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size); 484 441 if (ret) 485 442 msm_gem_unpin_locked(obj); 486 443 ··· 489 446 490 447 void msm_gem_unpin_locked(struct drm_gem_object *obj) 491 448 { 449 + struct msm_drm_private *priv = obj->dev->dev_private; 492 450 struct msm_gem_object *msm_obj = to_msm_bo(obj); 493 451 494 452 msm_gem_assert_locked(obj); 495 453 454 + mutex_lock(&priv->lru.lock); 496 455 msm_obj->pin_count--; 497 456 GEM_WARN_ON(msm_obj->pin_count < 0); 457 + update_lru_locked(obj); 458 + mutex_unlock(&priv->lru.lock); 459 + } 498 460 499 - update_lru(obj); 461 + /* Special unpin path for use in fence-signaling path, avoiding the need 462 + * to hold the obj lock by only depending on things that a protected by 463 + * the LRU lock. In particular we know that that we already have backing 464 + * and and that the object's dma_resv has the fence for the current 465 + * submit/job which will prevent us racing against page eviction. 466 + */ 467 + void msm_gem_unpin_active(struct drm_gem_object *obj) 468 + { 469 + struct msm_drm_private *priv = obj->dev->dev_private; 470 + struct msm_gem_object *msm_obj = to_msm_bo(obj); 471 + 472 + mutex_lock(&priv->lru.lock); 473 + msm_obj->pin_count--; 474 + GEM_WARN_ON(msm_obj->pin_count < 0); 475 + update_lru_active(obj); 476 + mutex_unlock(&priv->lru.lock); 500 477 } 501 478 502 479 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj, ··· 602 539 if (msm_gem_vma_inuse(vma)) 603 540 return -EBUSY; 604 541 605 - msm_gem_purge_vma(vma->aspace, vma); 606 - msm_gem_close_vma(vma->aspace, vma); 542 + msm_gem_vma_purge(vma); 543 + msm_gem_vma_close(vma); 607 544 del_vma(vma); 608 545 609 546 return 0; ··· 652 589 msm_gem_lock(obj); 653 590 vma = lookup_vma(obj, aspace); 654 591 if (!GEM_WARN_ON(!vma)) { 655 - msm_gem_unpin_vma(vma); 592 + msm_gem_vma_unpin(vma); 656 593 msm_gem_unpin_locked(obj); 657 594 } 658 595 msm_gem_unlock(obj); ··· 691 628 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv) 692 629 { 693 630 struct msm_gem_object *msm_obj = to_msm_bo(obj); 631 + struct page **pages; 694 632 int ret = 0; 695 633 696 634 msm_gem_assert_locked(obj); ··· 705 641 return ERR_PTR(-EBUSY); 706 642 } 707 643 644 + pages = msm_gem_pin_pages_locked(obj); 645 + if (IS_ERR(pages)) 646 + return ERR_CAST(pages); 647 + 708 648 /* increment vmap_count *before* vmap() call, so shrinker can 709 649 * check vmap_count (is_vunmapable()) outside of msm_obj lock. 710 650 * This guarantees that we won't try to msm_gem_vunmap() this ··· 718 650 msm_obj->vmap_count++; 719 651 720 652 if (!msm_obj->vaddr) { 721 - struct page **pages = get_pages(obj); 722 - if (IS_ERR(pages)) { 723 - ret = PTR_ERR(pages); 724 - goto fail; 725 - } 726 653 msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, 727 654 VM_MAP, msm_gem_pgprot(msm_obj, PAGE_KERNEL)); 728 655 if (msm_obj->vaddr == NULL) { 729 656 ret = -ENOMEM; 730 657 goto fail; 731 658 } 732 - 733 - update_lru(obj); 734 659 } 735 660 736 661 return msm_obj->vaddr; 737 662 738 663 fail: 739 664 msm_obj->vmap_count--; 665 + msm_gem_unpin_locked(obj); 740 666 return ERR_PTR(ret); 741 667 } 742 668 ··· 769 707 GEM_WARN_ON(msm_obj->vmap_count < 1); 770 708 771 709 msm_obj->vmap_count--; 710 + msm_gem_unpin_locked(obj); 772 711 } 773 712 774 713 void msm_gem_put_vaddr(struct drm_gem_object *obj) ··· 784 721 */ 785 722 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv) 786 723 { 724 + struct msm_drm_private *priv = obj->dev->dev_private; 787 725 struct msm_gem_object *msm_obj = to_msm_bo(obj); 788 726 789 727 msm_gem_lock(obj); 728 + 729 + mutex_lock(&priv->lru.lock); 790 730 791 731 if (msm_obj->madv != __MSM_MADV_PURGED) 792 732 msm_obj->madv = madv; ··· 799 733 /* If the obj is inactive, we might need to move it 800 734 * between inactive lists 801 735 */ 802 - update_lru(obj); 736 + update_lru_locked(obj); 737 + 738 + mutex_unlock(&priv->lru.lock); 803 739 804 740 msm_gem_unlock(obj); 805 741 ··· 811 743 void msm_gem_purge(struct drm_gem_object *obj) 812 744 { 813 745 struct drm_device *dev = obj->dev; 746 + struct msm_drm_private *priv = obj->dev->dev_private; 814 747 struct msm_gem_object *msm_obj = to_msm_bo(obj); 815 748 816 749 msm_gem_assert_locked(obj); ··· 828 759 829 760 put_iova_vmas(obj); 830 761 762 + mutex_lock(&priv->lru.lock); 763 + /* A one-way transition: */ 831 764 msm_obj->madv = __MSM_MADV_PURGED; 765 + mutex_unlock(&priv->lru.lock); 832 766 833 767 drm_gem_free_mmap_offset(obj); 834 768 ··· 878 806 msm_obj->vaddr = NULL; 879 807 } 880 808 881 - static void update_lru(struct drm_gem_object *obj) 882 - { 883 - struct msm_drm_private *priv = obj->dev->dev_private; 884 - struct msm_gem_object *msm_obj = to_msm_bo(obj); 885 - 886 - msm_gem_assert_locked(&msm_obj->base); 887 - 888 - if (!msm_obj->pages) { 889 - GEM_WARN_ON(msm_obj->pin_count); 890 - GEM_WARN_ON(msm_obj->vmap_count); 891 - 892 - drm_gem_lru_move_tail(&priv->lru.unbacked, obj); 893 - } else if (msm_obj->pin_count || msm_obj->vmap_count) { 894 - drm_gem_lru_move_tail(&priv->lru.pinned, obj); 895 - } else if (msm_obj->madv == MSM_MADV_WILLNEED) { 896 - drm_gem_lru_move_tail(&priv->lru.willneed, obj); 897 - } else { 898 - GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED); 899 - 900 - drm_gem_lru_move_tail(&priv->lru.dontneed, obj); 901 - } 902 - } 903 - 904 809 bool msm_gem_active(struct drm_gem_object *obj) 905 810 { 906 811 msm_gem_assert_locked(obj); ··· 894 845 unsigned long remain = 895 846 op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout); 896 847 long ret; 848 + 849 + if (op & MSM_PREP_BOOST) { 850 + dma_resv_set_deadline(obj->resv, dma_resv_usage_rw(write), 851 + ktime_get()); 852 + } 897 853 898 854 ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(write), 899 855 true, remain);
+17 -12
drivers/gpu/drm/msm/msm_gem.h
··· 59 59 60 60 struct msm_gem_vma { 61 61 struct drm_mm_node node; 62 + spinlock_t lock; 62 63 uint64_t iova; 63 64 struct msm_gem_address_space *aspace; 64 65 struct list_head list; /* node in msm_gem_object::vmas */ ··· 70 69 struct msm_fence_context *fctx[MSM_GPU_MAX_RINGS]; 71 70 }; 72 71 73 - int msm_gem_init_vma(struct msm_gem_address_space *aspace, 74 - struct msm_gem_vma *vma, int size, 72 + struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace); 73 + int msm_gem_vma_init(struct msm_gem_vma *vma, int size, 75 74 u64 range_start, u64 range_end); 76 75 bool msm_gem_vma_inuse(struct msm_gem_vma *vma); 77 - void msm_gem_purge_vma(struct msm_gem_address_space *aspace, 78 - struct msm_gem_vma *vma); 79 - void msm_gem_unpin_vma(struct msm_gem_vma *vma); 80 - void msm_gem_unpin_vma_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx); 81 - int msm_gem_map_vma(struct msm_gem_address_space *aspace, 82 - struct msm_gem_vma *vma, int prot, 83 - struct sg_table *sgt, int size); 84 - void msm_gem_close_vma(struct msm_gem_address_space *aspace, 85 - struct msm_gem_vma *vma); 76 + void msm_gem_vma_purge(struct msm_gem_vma *vma); 77 + void msm_gem_vma_unpin(struct msm_gem_vma *vma); 78 + void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx); 79 + int msm_gem_vma_map(struct msm_gem_vma *vma, int prot, struct sg_table *sgt, int size); 80 + void msm_gem_vma_close(struct msm_gem_vma *vma); 86 81 87 82 struct msm_gem_object { 88 83 struct drm_gem_object base; ··· 86 89 uint32_t flags; 87 90 88 91 /** 89 - * Advice: are the backing pages purgeable? 92 + * madv: are the backing pages purgeable? 93 + * 94 + * Protected by obj lock and LRU lock 90 95 */ 91 96 uint8_t madv; 92 97 ··· 116 117 117 118 char name[32]; /* Identifier to print for the debugfs files */ 118 119 120 + /** 121 + * pin_count: Number of times the pages are pinned 122 + * 123 + * Protected by LRU lock. 124 + */ 119 125 int pin_count; 120 126 }; 121 127 #define to_msm_bo(x) container_of(x, struct msm_gem_object, base) ··· 128 124 uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj); 129 125 int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma); 130 126 void msm_gem_unpin_locked(struct drm_gem_object *obj); 127 + void msm_gem_unpin_active(struct drm_gem_object *obj); 131 128 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj, 132 129 struct msm_gem_address_space *aspace); 133 130 int msm_gem_get_iova(struct drm_gem_object *obj,
+22 -15
drivers/gpu/drm/msm/msm_gem_submit.c
··· 41 41 if (!submit) 42 42 return ERR_PTR(-ENOMEM); 43 43 44 + submit->hw_fence = msm_fence_alloc(); 45 + if (IS_ERR(submit->hw_fence)) { 46 + ret = PTR_ERR(submit->hw_fence); 47 + kfree(submit); 48 + return ERR_PTR(ret); 49 + } 50 + 44 51 ret = drm_sched_job_init(&submit->base, queue->entity, queue); 45 52 if (ret) { 53 + kfree(submit->hw_fence); 46 54 kfree(submit); 47 55 return ERR_PTR(ret); 48 56 } ··· 80 72 unsigned i; 81 73 82 74 if (submit->fence_id) { 83 - mutex_lock(&submit->queue->idr_lock); 75 + spin_lock(&submit->queue->idr_lock); 84 76 idr_remove(&submit->queue->fence_idr, submit->fence_id); 85 - mutex_unlock(&submit->queue->idr_lock); 77 + spin_unlock(&submit->queue->idr_lock); 86 78 } 87 79 88 80 dma_fence_put(submit->user_fence); ··· 250 242 submit->bos[i].flags &= ~cleanup_flags; 251 243 252 244 if (flags & BO_VMA_PINNED) 253 - msm_gem_unpin_vma(submit->bos[i].vma); 245 + msm_gem_vma_unpin(submit->bos[i].vma); 254 246 255 247 if (flags & BO_OBJ_PINNED) 256 248 msm_gem_unpin_locked(obj); ··· 573 565 574 566 for (i = 0; i < nr_in_syncobjs; ++i) { 575 567 uint64_t address = in_syncobjs_addr + i * syncobj_stride; 576 - struct dma_fence *fence; 577 568 578 569 if (copy_from_user(&syncobj_desc, 579 570 u64_to_user_ptr(address), ··· 592 585 break; 593 586 } 594 587 595 - ret = drm_syncobj_find_fence(file, syncobj_desc.handle, 596 - syncobj_desc.point, 0, &fence); 597 - if (ret) 598 - break; 599 - 600 - ret = drm_sched_job_add_dependency(&submit->base, fence); 588 + ret = drm_sched_job_add_syncobj_dependency(&submit->base, file, 589 + syncobj_desc.handle, syncobj_desc.point); 601 590 if (ret) 602 591 break; 603 592 ··· 877 874 878 875 submit->nr_cmds = i; 879 876 880 - mutex_lock(&queue->idr_lock); 877 + idr_preload(GFP_KERNEL); 878 + 879 + spin_lock(&queue->idr_lock); 881 880 882 881 /* 883 882 * If using userspace provided seqno fence, validate that the id ··· 889 884 */ 890 885 if ((args->flags & MSM_SUBMIT_FENCE_SN_IN) && 891 886 idr_find(&queue->fence_idr, args->fence)) { 892 - mutex_unlock(&queue->idr_lock); 887 + spin_unlock(&queue->idr_lock); 888 + idr_preload_end(); 893 889 ret = -EINVAL; 894 890 goto out; 895 891 } ··· 908 902 submit->fence_id = args->fence; 909 903 ret = idr_alloc_u32(&queue->fence_idr, submit->user_fence, 910 904 &submit->fence_id, submit->fence_id, 911 - GFP_KERNEL); 905 + GFP_NOWAIT); 912 906 /* 913 907 * We've already validated that the fence_id slot is valid, 914 908 * so if idr_alloc_u32 failed, it is a kernel bug ··· 921 915 */ 922 916 submit->fence_id = idr_alloc_cyclic(&queue->fence_idr, 923 917 submit->user_fence, 1, 924 - INT_MAX, GFP_KERNEL); 918 + INT_MAX, GFP_NOWAIT); 925 919 } 926 920 927 - mutex_unlock(&queue->idr_lock); 921 + spin_unlock(&queue->idr_lock); 922 + idr_preload_end(); 928 923 929 924 if (submit->fence_id < 0) { 930 925 ret = submit->fence_id;
+71 -22
drivers/gpu/drm/msm/msm_gem_vma.c
··· 40 40 41 41 bool msm_gem_vma_inuse(struct msm_gem_vma *vma) 42 42 { 43 + bool ret = true; 44 + 45 + spin_lock(&vma->lock); 46 + 43 47 if (vma->inuse > 0) 44 - return true; 48 + goto out; 45 49 46 50 while (vma->fence_mask) { 47 51 unsigned idx = ffs(vma->fence_mask) - 1; 48 52 49 53 if (!msm_fence_completed(vma->fctx[idx], vma->fence[idx])) 50 - return true; 54 + goto out; 51 55 52 56 vma->fence_mask &= ~BIT(idx); 53 57 } 54 58 55 - return false; 59 + ret = false; 60 + 61 + out: 62 + spin_unlock(&vma->lock); 63 + 64 + return ret; 56 65 } 57 66 58 67 /* Actually unmap memory for the vma */ 59 - void msm_gem_purge_vma(struct msm_gem_address_space *aspace, 60 - struct msm_gem_vma *vma) 68 + void msm_gem_vma_purge(struct msm_gem_vma *vma) 61 69 { 70 + struct msm_gem_address_space *aspace = vma->aspace; 62 71 unsigned size = vma->node.size; 63 72 64 73 /* Print a message if we try to purge a vma in use */ ··· 77 68 if (!vma->mapped) 78 69 return; 79 70 80 - if (aspace->mmu) 81 - aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, size); 71 + aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, size); 82 72 83 73 vma->mapped = false; 84 74 } 85 75 86 - /* Remove reference counts for the mapping */ 87 - void msm_gem_unpin_vma(struct msm_gem_vma *vma) 76 + static void vma_unpin_locked(struct msm_gem_vma *vma) 88 77 { 89 78 if (GEM_WARN_ON(!vma->inuse)) 90 79 return; ··· 90 83 vma->inuse--; 91 84 } 92 85 93 - /* Replace pin reference with fence: */ 94 - void msm_gem_unpin_vma_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx) 86 + /* Remove reference counts for the mapping */ 87 + void msm_gem_vma_unpin(struct msm_gem_vma *vma) 95 88 { 89 + spin_lock(&vma->lock); 90 + vma_unpin_locked(vma); 91 + spin_unlock(&vma->lock); 92 + } 93 + 94 + /* Replace pin reference with fence: */ 95 + void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx) 96 + { 97 + spin_lock(&vma->lock); 96 98 vma->fctx[fctx->index] = fctx; 97 99 vma->fence[fctx->index] = fctx->last_fence; 98 100 vma->fence_mask |= BIT(fctx->index); 99 - msm_gem_unpin_vma(vma); 101 + vma_unpin_locked(vma); 102 + spin_unlock(&vma->lock); 100 103 } 101 104 102 105 /* Map and pin vma: */ 103 106 int 104 - msm_gem_map_vma(struct msm_gem_address_space *aspace, 105 - struct msm_gem_vma *vma, int prot, 107 + msm_gem_vma_map(struct msm_gem_vma *vma, int prot, 106 108 struct sg_table *sgt, int size) 107 109 { 108 - int ret = 0; 110 + struct msm_gem_address_space *aspace = vma->aspace; 111 + int ret; 109 112 110 113 if (GEM_WARN_ON(!vma->iova)) 111 114 return -EINVAL; 112 115 113 116 /* Increase the usage counter */ 117 + spin_lock(&vma->lock); 114 118 vma->inuse++; 119 + spin_unlock(&vma->lock); 115 120 116 121 if (vma->mapped) 117 122 return 0; 118 123 119 124 vma->mapped = true; 120 125 121 - if (aspace && aspace->mmu) 122 - ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt, 123 - size, prot); 126 + if (!aspace) 127 + return 0; 128 + 129 + /* 130 + * NOTE: iommu/io-pgtable can allocate pages, so we cannot hold 131 + * a lock across map/unmap which is also used in the job_run() 132 + * path, as this can cause deadlock in job_run() vs shrinker/ 133 + * reclaim. 134 + * 135 + * Revisit this if we can come up with a scheme to pre-alloc pages 136 + * for the pgtable in map/unmap ops. 137 + */ 138 + ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt, size, prot); 124 139 125 140 if (ret) { 126 141 vma->mapped = false; 142 + spin_lock(&vma->lock); 127 143 vma->inuse--; 144 + spin_unlock(&vma->lock); 128 145 } 129 146 130 147 return ret; 131 148 } 132 149 133 150 /* Close an iova. Warn if it is still in use */ 134 - void msm_gem_close_vma(struct msm_gem_address_space *aspace, 135 - struct msm_gem_vma *vma) 151 + void msm_gem_vma_close(struct msm_gem_vma *vma) 136 152 { 153 + struct msm_gem_address_space *aspace = vma->aspace; 154 + 137 155 GEM_WARN_ON(msm_gem_vma_inuse(vma) || vma->mapped); 138 156 139 157 spin_lock(&aspace->lock); ··· 171 139 msm_gem_address_space_put(aspace); 172 140 } 173 141 142 + struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace) 143 + { 144 + struct msm_gem_vma *vma; 145 + 146 + vma = kzalloc(sizeof(*vma), GFP_KERNEL); 147 + if (!vma) 148 + return NULL; 149 + 150 + spin_lock_init(&vma->lock); 151 + vma->aspace = aspace; 152 + 153 + return vma; 154 + } 155 + 174 156 /* Initialize a new vma and allocate an iova for it */ 175 - int msm_gem_init_vma(struct msm_gem_address_space *aspace, 176 - struct msm_gem_vma *vma, int size, 157 + int msm_gem_vma_init(struct msm_gem_vma *vma, int size, 177 158 u64 range_start, u64 range_end) 178 159 { 160 + struct msm_gem_address_space *aspace = vma->aspace; 179 161 int ret; 162 + 163 + if (GEM_WARN_ON(!aspace)) 164 + return -EINVAL; 180 165 181 166 if (GEM_WARN_ON(vma->iova)) 182 167 return -EBUSY;
+2 -6
drivers/gpu/drm/msm/msm_gpu.c
··· 16 16 #include <generated/utsrelease.h> 17 17 #include <linux/string_helpers.h> 18 18 #include <linux/devcoredump.h> 19 - #include <linux/reset.h> 20 19 #include <linux/sched/task.h> 21 20 22 21 /* ··· 58 59 static int enable_clk(struct msm_gpu *gpu) 59 60 { 60 61 if (gpu->core_clk && gpu->fast_rate) 61 - clk_set_rate(gpu->core_clk, gpu->fast_rate); 62 + dev_pm_opp_set_rate(&gpu->pdev->dev, gpu->fast_rate); 62 63 63 64 /* Set the RBBM timer rate to 19.2Mhz */ 64 65 if (gpu->rbbmtimer_clk) ··· 77 78 * will be rounded down to zero anyway so it all works out. 78 79 */ 79 80 if (gpu->core_clk) 80 - clk_set_rate(gpu->core_clk, 27000000); 81 + dev_pm_opp_set_rate(&gpu->pdev->dev, 27000000); 81 82 82 83 if (gpu->rbbmtimer_clk) 83 84 clk_set_rate(gpu->rbbmtimer_clk, 0); ··· 933 934 DBG("gpu_cx: %p", gpu->gpu_cx); 934 935 if (IS_ERR(gpu->gpu_cx)) 935 936 gpu->gpu_cx = NULL; 936 - 937 - gpu->cx_collapse = devm_reset_control_get_optional_exclusive(&pdev->dev, 938 - "cx_collapse"); 939 937 940 938 gpu->pdev = pdev; 941 939 platform_set_drvdata(pdev, &gpu->adreno_smmu);
+7 -5
drivers/gpu/drm/msm/msm_gpu.h
··· 13 13 #include <linux/interconnect.h> 14 14 #include <linux/pm_opp.h> 15 15 #include <linux/regulator/consumer.h> 16 - #include <linux/reset.h> 17 16 18 17 #include "msm_drv.h" 19 18 #include "msm_fence.h" ··· 49 50 int (*set_param)(struct msm_gpu *gpu, struct msm_file_private *ctx, 50 51 uint32_t param, uint64_t value, uint32_t len); 51 52 int (*hw_init)(struct msm_gpu *gpu); 53 + 54 + /** 55 + * @ucode_load: Optional hook to upload fw to GEM objs 56 + */ 57 + int (*ucode_load)(struct msm_gpu *gpu); 58 + 52 59 int (*pm_suspend)(struct msm_gpu *gpu); 53 60 int (*pm_resume)(struct msm_gpu *gpu); 54 61 void (*submit)(struct msm_gpu *gpu, struct msm_gem_submit *submit); ··· 286 281 bool hw_apriv; 287 282 288 283 struct thermal_cooling_device *cooling; 289 - 290 - /* To poll for cx gdsc collapse during gpu recovery */ 291 - struct reset_control *cx_collapse; 292 284 }; 293 285 294 286 static inline struct msm_gpu *dev_to_gpu(struct device *dev) ··· 501 499 struct msm_file_private *ctx; 502 500 struct list_head node; 503 501 struct idr fence_idr; 504 - struct mutex idr_lock; 502 + struct spinlock idr_lock; 505 503 struct mutex lock; 506 504 struct kref ref; 507 505 struct drm_sched_entity *entity;
+1 -1
drivers/gpu/drm/msm/msm_gpu_devfreq.c
··· 48 48 gpu->funcs->gpu_set_freq(gpu, opp, df->suspended); 49 49 mutex_unlock(&df->lock); 50 50 } else { 51 - clk_set_rate(gpu->core_clk, *freq); 51 + dev_pm_opp_set_rate(dev, *freq); 52 52 } 53 53 54 54 dev_pm_opp_put(opp);
+1
drivers/gpu/drm/msm/msm_io_utils.c
··· 6 6 */ 7 7 8 8 #include <linux/interconnect.h> 9 + #include <linux/io.h> 9 10 10 11 #include "msm_drv.h" 11 12
+27 -11
drivers/gpu/drm/msm/msm_iommu.c
··· 237 237 if (!ttbr1_cfg) 238 238 return ERR_PTR(-ENODEV); 239 239 240 - /* 241 - * Defer setting the fault handler until we have a valid adreno_smmu 242 - * to avoid accidentially installing a GPU specific fault handler for 243 - * the display's iommu 244 - */ 245 - iommu_set_fault_handler(iommu->domain, msm_fault_handler, iommu); 246 - 247 240 pagetable = kzalloc(sizeof(*pagetable), GFP_KERNEL); 248 241 if (!pagetable) 249 242 return ERR_PTR(-ENOMEM); ··· 264 271 * the arm-smmu driver as a trigger to set up TTBR0 265 272 */ 266 273 if (atomic_inc_return(&iommu->pagetables) == 1) { 267 - /* Enable stall on iommu fault: */ 268 - adreno_smmu->set_stall(adreno_smmu->cookie, true); 269 - 270 274 ret = adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, &ttbr0_cfg); 271 275 if (ret) { 272 276 free_io_pgtable_ops(pagetable->pgtbl_ops); ··· 292 302 unsigned long iova, int flags, void *arg) 293 303 { 294 304 struct msm_iommu *iommu = arg; 305 + struct msm_mmu *mmu = &iommu->base; 295 306 struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(iommu->base.dev); 296 307 struct adreno_smmu_fault_info info, *ptr = NULL; 297 308 ··· 305 314 return iommu->base.handler(iommu->base.arg, iova, flags, ptr); 306 315 307 316 pr_warn_ratelimited("*** fault: iova=%16lx, flags=%d\n", iova, flags); 317 + 318 + if (mmu->funcs->resume_translation) 319 + mmu->funcs->resume_translation(mmu); 320 + 308 321 return 0; 309 322 } 310 323 ··· 316 321 { 317 322 struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(mmu->dev); 318 323 319 - adreno_smmu->resume_translation(adreno_smmu->cookie, true); 324 + if (adreno_smmu->resume_translation) 325 + adreno_smmu->resume_translation(adreno_smmu->cookie, true); 320 326 } 321 327 322 328 static void msm_iommu_detach(struct msm_mmu *mmu) ··· 401 405 } 402 406 403 407 return &iommu->base; 408 + } 409 + 410 + struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks) 411 + { 412 + struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(dev); 413 + struct msm_iommu *iommu; 414 + struct msm_mmu *mmu; 415 + 416 + mmu = msm_iommu_new(dev, quirks); 417 + if (IS_ERR(mmu)) 418 + return mmu; 419 + 420 + iommu = to_msm_iommu(mmu); 421 + iommu_set_fault_handler(iommu->domain, msm_fault_handler, iommu); 422 + 423 + /* Enable stall on iommu fault: */ 424 + if (adreno_smmu->set_stall) 425 + adreno_smmu->set_stall(adreno_smmu->cookie, true); 426 + 427 + return mmu; 404 428 }
-8
drivers/gpu/drm/msm/msm_kms.h
··· 60 60 void (*disable_commit)(struct msm_kms *kms); 61 61 62 62 /** 63 - * If the kms backend supports async commit, it should implement 64 - * this method to return the time of the next vsync. This is 65 - * used to determine a time slightly before vsync, for the async 66 - * commit timer to run and complete an async commit. 67 - */ 68 - ktime_t (*vsync_time)(struct msm_kms *kms, struct drm_crtc *crtc); 69 - 70 - /** 71 63 * Prepare for atomic commit. This is called after any previous 72 64 * (async or otherwise) commit has completed. 73 65 */
+120 -78
drivers/gpu/drm/msm/msm_mdss.c
··· 16 16 #include "msm_drv.h" 17 17 #include "msm_kms.h" 18 18 19 - /* for DPU_HW_* defines */ 20 - #include "disp/dpu1/dpu_hw_catalog.h" 21 - 22 19 #define HW_REV 0x0 23 20 #define HW_INTR_STATUS 0x0010 24 21 ··· 25 28 #define UBWC_PREDICTION_MODE 0x154 26 29 27 30 #define MIN_IB_BW 400000000UL /* Min ib vote 400MB */ 31 + 32 + struct msm_mdss_data { 33 + u32 ubwc_version; 34 + /* can be read from register 0x58 */ 35 + u32 ubwc_dec_version; 36 + u32 ubwc_swizzle; 37 + u32 ubwc_static; 38 + u32 highest_bank_bit; 39 + u32 macrotile_mode; 40 + }; 28 41 29 42 struct msm_mdss { 30 43 struct device *dev; ··· 47 40 unsigned long enabled_mask; 48 41 struct irq_domain *domain; 49 42 } irq_controller; 43 + const struct msm_mdss_data *mdss_data; 50 44 struct icc_path *path[2]; 51 45 u32 num_paths; 52 46 }; ··· 190 182 #define UBWC_3_0 0x30000000 191 183 #define UBWC_4_0 0x40000000 192 184 193 - static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss, 194 - u32 ubwc_static) 185 + static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss) 195 186 { 196 - writel_relaxed(ubwc_static, msm_mdss->mmio + UBWC_STATIC); 187 + const struct msm_mdss_data *data = msm_mdss->mdss_data; 188 + 189 + writel_relaxed(data->ubwc_static, msm_mdss->mmio + UBWC_STATIC); 197 190 } 198 191 199 - static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss, 200 - unsigned int ubwc_version, 201 - u32 ubwc_swizzle, 202 - u32 highest_bank_bit, 203 - u32 macrotile_mode) 192 + static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss) 204 193 { 205 - u32 value = (ubwc_swizzle & 0x1) | 206 - (highest_bank_bit & 0x3) << 4 | 207 - (macrotile_mode & 0x1) << 12; 194 + const struct msm_mdss_data *data = msm_mdss->mdss_data; 195 + u32 value = (data->ubwc_swizzle & 0x1) | 196 + (data->highest_bank_bit & 0x3) << 4 | 197 + (data->macrotile_mode & 0x1) << 12; 208 198 209 - if (ubwc_version == UBWC_3_0) 199 + if (data->ubwc_version == UBWC_3_0) 210 200 value |= BIT(10); 211 201 212 - if (ubwc_version == UBWC_1_0) 202 + if (data->ubwc_version == UBWC_1_0) 213 203 value |= BIT(8); 214 204 215 205 writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC); 216 206 } 217 207 218 - static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss, 219 - unsigned int ubwc_version, 220 - u32 ubwc_swizzle, 221 - u32 ubwc_static, 222 - u32 highest_bank_bit, 223 - u32 macrotile_mode) 208 + static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss) 224 209 { 225 - u32 value = (ubwc_swizzle & 0x7) | 226 - (ubwc_static & 0x1) << 3 | 227 - (highest_bank_bit & 0x7) << 4 | 228 - (macrotile_mode & 0x1) << 12; 210 + const struct msm_mdss_data *data = msm_mdss->mdss_data; 211 + u32 value = (data->ubwc_swizzle & 0x7) | 212 + (data->ubwc_static & 0x1) << 3 | 213 + (data->highest_bank_bit & 0x7) << 4 | 214 + (data->macrotile_mode & 0x1) << 12; 229 215 230 216 writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC); 231 217 232 - if (ubwc_version == UBWC_3_0) { 218 + if (data->ubwc_version == UBWC_3_0) { 233 219 writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2); 234 220 writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE); 235 221 } else { ··· 235 233 static int msm_mdss_enable(struct msm_mdss *msm_mdss) 236 234 { 237 235 int ret; 238 - u32 hw_rev; 239 236 240 237 /* 241 238 * Several components have AXI clocks that can only be turned on if ··· 250 249 } 251 250 252 251 /* 253 - * HW_REV requires MDSS_MDP_CLK, which is not enabled by the mdss on 254 - * mdp5 hardware. Skip reading it for now. 252 + * Register access requires MDSS_MDP_CLK, which is not enabled by the 253 + * mdss on mdp5 hardware. Skip it for now. 255 254 */ 256 - if (msm_mdss->is_mdp5) 255 + if (msm_mdss->is_mdp5 || !msm_mdss->mdss_data) 257 256 return 0; 258 - 259 - hw_rev = readl_relaxed(msm_mdss->mmio + HW_REV); 260 - dev_dbg(msm_mdss->dev, "HW_REV: 0x%x\n", hw_rev); 261 - dev_dbg(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n", 262 - readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION)); 263 257 264 258 /* 265 259 * ubwc config is part of the "mdss" region which is not accessible 266 260 * from the rest of the driver. hardcode known configurations here 267 261 * 268 262 * Decoder version can be read from the UBWC_DEC_HW_VERSION reg, 269 - * UBWC_n and the rest of params comes from hw_catalog. 270 - * Unforunately this driver can not access hw catalog, so we have to 271 - * hardcode them here. 263 + * UBWC_n and the rest of params comes from hw data. 272 264 */ 273 - switch (hw_rev) { 274 - case DPU_HW_VER_500: 275 - case DPU_HW_VER_501: 276 - msm_mdss_setup_ubwc_dec_30(msm_mdss, UBWC_3_0, 0, 2, 0); 265 + switch (msm_mdss->mdss_data->ubwc_dec_version) { 266 + case UBWC_2_0: 267 + msm_mdss_setup_ubwc_dec_20(msm_mdss); 277 268 break; 278 - case DPU_HW_VER_600: 279 - /* TODO: highest_bank_bit = 2 for LP_DDR4 */ 280 - msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); 269 + case UBWC_3_0: 270 + msm_mdss_setup_ubwc_dec_30(msm_mdss); 281 271 break; 282 - case DPU_HW_VER_620: 283 - /* UBWC_2_0 */ 284 - msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x1e); 272 + case UBWC_4_0: 273 + msm_mdss_setup_ubwc_dec_40(msm_mdss); 285 274 break; 286 - case DPU_HW_VER_630: 287 - /* UBWC_2_0 */ 288 - msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x11f); 289 - break; 290 - case DPU_HW_VER_700: 291 - /* TODO: highest_bank_bit = 2 for LP_DDR4 */ 292 - msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); 293 - break; 294 - case DPU_HW_VER_720: 295 - msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_3_0, 6, 1, 1, 1); 296 - break; 297 - case DPU_HW_VER_800: 298 - msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 2, 1); 299 - break; 300 - case DPU_HW_VER_810: 301 - case DPU_HW_VER_900: 302 - /* TODO: highest_bank_bit = 2 for LP_DDR4 */ 303 - msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); 275 + default: 276 + dev_err(msm_mdss->dev, "Unsupported UBWC decoder version %x\n", 277 + msm_mdss->mdss_data->ubwc_dec_version); 278 + dev_err(msm_mdss->dev, "HW_REV: 0x%x\n", 279 + readl_relaxed(msm_mdss->mmio + HW_REV)); 280 + dev_err(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n", 281 + readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION)); 304 282 break; 305 283 } 306 284 ··· 470 490 if (IS_ERR(mdss)) 471 491 return PTR_ERR(mdss); 472 492 493 + mdss->mdss_data = of_device_get_match_data(&pdev->dev); 494 + 473 495 platform_set_drvdata(pdev, mdss); 474 496 475 497 /* ··· 501 519 return 0; 502 520 } 503 521 522 + static const struct msm_mdss_data sc7180_data = { 523 + .ubwc_version = UBWC_2_0, 524 + .ubwc_dec_version = UBWC_2_0, 525 + .ubwc_static = 0x1e, 526 + }; 527 + 528 + static const struct msm_mdss_data sc7280_data = { 529 + .ubwc_version = UBWC_3_0, 530 + .ubwc_dec_version = UBWC_4_0, 531 + .ubwc_swizzle = 6, 532 + .ubwc_static = 1, 533 + .highest_bank_bit = 1, 534 + .macrotile_mode = 1, 535 + }; 536 + 537 + static const struct msm_mdss_data sc8180x_data = { 538 + .ubwc_version = UBWC_3_0, 539 + .ubwc_dec_version = UBWC_3_0, 540 + .highest_bank_bit = 3, 541 + .macrotile_mode = 1, 542 + }; 543 + 544 + static const struct msm_mdss_data sc8280xp_data = { 545 + .ubwc_version = UBWC_4_0, 546 + .ubwc_dec_version = UBWC_4_0, 547 + .ubwc_swizzle = 6, 548 + .ubwc_static = 1, 549 + .highest_bank_bit = 2, 550 + .macrotile_mode = 1, 551 + }; 552 + 553 + static const struct msm_mdss_data sdm845_data = { 554 + .ubwc_version = UBWC_2_0, 555 + .ubwc_dec_version = UBWC_2_0, 556 + .highest_bank_bit = 2, 557 + }; 558 + 559 + static const struct msm_mdss_data sm8150_data = { 560 + .ubwc_version = UBWC_3_0, 561 + .ubwc_dec_version = UBWC_3_0, 562 + .highest_bank_bit = 2, 563 + }; 564 + 565 + static const struct msm_mdss_data sm6115_data = { 566 + .ubwc_version = UBWC_1_0, 567 + .ubwc_dec_version = UBWC_2_0, 568 + .ubwc_swizzle = 7, 569 + .ubwc_static = 0x11f, 570 + }; 571 + 572 + static const struct msm_mdss_data sm8250_data = { 573 + .ubwc_version = UBWC_4_0, 574 + .ubwc_dec_version = UBWC_4_0, 575 + .ubwc_swizzle = 6, 576 + .ubwc_static = 1, 577 + /* TODO: highest_bank_bit = 2 for LP_DDR4 */ 578 + .highest_bank_bit = 3, 579 + .macrotile_mode = 1, 580 + }; 581 + 504 582 static const struct of_device_id mdss_dt_match[] = { 505 583 { .compatible = "qcom,mdss" }, 506 584 { .compatible = "qcom,msm8998-mdss" }, 507 585 { .compatible = "qcom,qcm2290-mdss" }, 508 - { .compatible = "qcom,sdm845-mdss" }, 509 - { .compatible = "qcom,sc7180-mdss" }, 510 - { .compatible = "qcom,sc7280-mdss" }, 511 - { .compatible = "qcom,sc8180x-mdss" }, 512 - { .compatible = "qcom,sc8280xp-mdss" }, 513 - { .compatible = "qcom,sm6115-mdss" }, 514 - { .compatible = "qcom,sm8150-mdss" }, 515 - { .compatible = "qcom,sm8250-mdss" }, 516 - { .compatible = "qcom,sm8350-mdss" }, 517 - { .compatible = "qcom,sm8450-mdss" }, 518 - { .compatible = "qcom,sm8550-mdss" }, 586 + { .compatible = "qcom,sdm845-mdss", .data = &sdm845_data }, 587 + { .compatible = "qcom,sc7180-mdss", .data = &sc7180_data }, 588 + { .compatible = "qcom,sc7280-mdss", .data = &sc7280_data }, 589 + { .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data }, 590 + { .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data }, 591 + { .compatible = "qcom,sm6115-mdss", .data = &sm6115_data }, 592 + { .compatible = "qcom,sm8150-mdss", .data = &sm8150_data }, 593 + { .compatible = "qcom,sm8250-mdss", .data = &sm8250_data }, 594 + { .compatible = "qcom,sm8350-mdss", .data = &sm8250_data }, 595 + { .compatible = "qcom,sm8450-mdss", .data = &sm8250_data }, 596 + { .compatible = "qcom,sm8550-mdss", .data = &sm8250_data }, 519 597 {} 520 598 }; 521 599 MODULE_DEVICE_TABLE(of, mdss_dt_match);
+1
drivers/gpu/drm/msm/msm_mmu.h
··· 41 41 } 42 42 43 43 struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks); 44 + struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks); 44 45 struct msm_mmu *msm_gpummu_new(struct device *dev, struct msm_gpu *gpu); 45 46 46 47 static inline void msm_mmu_set_fault_handler(struct msm_mmu *mmu, void *arg,
+3 -5
drivers/gpu/drm/msm/msm_ringbuffer.c
··· 18 18 struct msm_gpu *gpu = submit->gpu; 19 19 int i; 20 20 21 - submit->hw_fence = msm_fence_alloc(fctx); 21 + msm_fence_init(submit->hw_fence, fctx); 22 22 23 23 for (i = 0; i < submit->nr_bos; i++) { 24 24 struct drm_gem_object *obj = &submit->bos[i].obj->base; 25 25 26 - msm_gem_lock(obj); 27 - msm_gem_unpin_vma_fenced(submit->bos[i].vma, fctx); 28 - msm_gem_unpin_locked(obj); 26 + msm_gem_vma_unpin_fenced(submit->bos[i].vma, fctx); 27 + msm_gem_unpin_active(obj); 29 28 submit->bos[i].flags &= ~(BO_VMA_PINNED | BO_OBJ_PINNED); 30 - msm_gem_unlock(obj); 31 29 } 32 30 33 31 /* TODO move submit path over to using a per-ring lock.. */
+1 -1
drivers/gpu/drm/msm/msm_submitqueue.c
··· 200 200 *id = queue->id; 201 201 202 202 idr_init(&queue->fence_idr); 203 - mutex_init(&queue->idr_lock); 203 + spin_lock_init(&queue->idr_lock); 204 204 mutex_init(&queue->lock); 205 205 206 206 list_add_tail(&queue->node, &ctx->submitqueues);
+7
include/drm/drm_atomic.h
··· 528 528 drm_atomic_get_new_connector_for_encoder(const struct drm_atomic_state *state, 529 529 struct drm_encoder *encoder); 530 530 531 + struct drm_crtc * 532 + drm_atomic_get_old_crtc_for_encoder(struct drm_atomic_state *state, 533 + struct drm_encoder *encoder); 534 + struct drm_crtc * 535 + drm_atomic_get_new_crtc_for_encoder(struct drm_atomic_state *state, 536 + struct drm_encoder *encoder); 537 + 531 538 /** 532 539 * drm_atomic_get_existing_crtc_state - get CRTC state, if it exists 533 540 * @state: global atomic state object
+1
include/drm/drm_gem.h
··· 485 485 486 486 void drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock); 487 487 void drm_gem_lru_remove(struct drm_gem_object *obj); 488 + void drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_object *obj); 488 489 void drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj); 489 490 unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru, 490 491 unsigned int nr_to_scan,
+16 -2
include/uapi/drm/msm_drm.h
··· 151 151 #define MSM_PREP_READ 0x01 152 152 #define MSM_PREP_WRITE 0x02 153 153 #define MSM_PREP_NOSYNC 0x04 154 + #define MSM_PREP_BOOST 0x08 154 155 155 - #define MSM_PREP_FLAGS (MSM_PREP_READ | MSM_PREP_WRITE | MSM_PREP_NOSYNC) 156 + #define MSM_PREP_FLAGS (MSM_PREP_READ | \ 157 + MSM_PREP_WRITE | \ 158 + MSM_PREP_NOSYNC | \ 159 + MSM_PREP_BOOST | \ 160 + 0) 156 161 157 162 struct drm_msm_gem_cpu_prep { 158 163 __u32 handle; /* in */ ··· 186 181 */ 187 182 struct drm_msm_gem_submit_reloc { 188 183 __u32 submit_offset; /* in, offset from submit_bo */ 184 + #ifdef __cplusplus 185 + __u32 _or; /* in, value OR'd with result */ 186 + #else 189 187 __u32 or; /* in, value OR'd with result */ 188 + #endif 190 189 __s32 shift; /* in, amount of left shift (can be negative) */ 191 190 __u32 reloc_idx; /* in, index of reloc_bo buffer */ 192 191 __u64 reloc_offset; /* in, offset from start of reloc_bo */ ··· 295 286 296 287 }; 297 288 289 + #define MSM_WAIT_FENCE_BOOST 0x00000001 290 + #define MSM_WAIT_FENCE_FLAGS ( \ 291 + MSM_WAIT_FENCE_BOOST | \ 292 + 0) 293 + 298 294 /* The normal way to synchronize with the GPU is just to CPU_PREP on 299 295 * a buffer if you need to access it from the CPU (other cmdstream 300 296 * submission from same or other contexts, PAGE_FLIP ioctl, etc, all ··· 309 295 */ 310 296 struct drm_msm_wait_fence { 311 297 __u32 fence; /* in */ 312 - __u32 pad; 298 + __u32 flags; /* in, bitmask of MSM_WAIT_FENCE_x */ 313 299 struct drm_msm_timespec timeout; /* in */ 314 300 __u32 queueid; /* in, submitqueue id */ 315 301 };