Merge branch 'drm-next' of git://anongit.freedesktop.org/drm/drm into msm-next-lumag...
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 12 Jun 2023 21:20:40 +0000 (00:20 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 12 Jun 2023 21:23:33 +0000 (00:23 +0300)
Merge the drm-next tree to pick up the DRM DSC helpers (merged via
drm-intel-next tree). MSM DSC v1.2 patches depend on these helpers.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
109 files changed:
Documentation/devicetree/bindings/display/msm/dp-controller.yaml
Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
Documentation/devicetree/bindings/display/msm/dsi-phy-28nm.yaml
Documentation/devicetree/bindings/display/msm/gmu.yaml
Documentation/devicetree/bindings/display/msm/qcom,mdp5.yaml
Documentation/devicetree/bindings/display/msm/qcom,mdss.yaml
Documentation/devicetree/bindings/display/msm/qcom,sc7180-dpu.yaml
Documentation/devicetree/bindings/display/msm/qcom,sm6350-mdss.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/msm/qcom,sm6375-mdss.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/msm/qcom,sm8350-mdss.yaml
MAINTAINERS
drivers/gpu/drm/msm/Makefile
drivers/gpu/drm/msm/adreno/a5xx_debugfs.c
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
drivers/gpu/drm/msm/adreno/a6xx_gmu.c
drivers/gpu/drm/msm/adreno/a6xx_gmu.h
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
drivers/gpu/drm/msm/adreno/a6xx_hfi.c
drivers/gpu/drm/msm/adreno/adreno_device.c
drivers/gpu/drm/msm/adreno/adreno_gpu.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h [new file with mode: 0644]
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h [new file with mode: 0644]
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
drivers/gpu/drm/msm/dp/dp_audio.c
drivers/gpu/drm/msm/dp/dp_audio.h
drivers/gpu/drm/msm/dp/dp_catalog.c
drivers/gpu/drm/msm/dp/dp_catalog.h
drivers/gpu/drm/msm/dp/dp_ctrl.h
drivers/gpu/drm/msm/dp/dp_debug.c
drivers/gpu/drm/msm/dp/dp_debug.h
drivers/gpu/drm/msm/dp/dp_display.c
drivers/gpu/drm/msm/dp/dp_hpd.c [deleted file]
drivers/gpu/drm/msm/dp/dp_hpd.h [deleted file]
drivers/gpu/drm/msm/dp/dp_panel.h
drivers/gpu/drm/msm/dp/dp_power.c
drivers/gpu/drm/msm/dp/dp_power.h
drivers/gpu/drm/msm/dsi/dsi_cfg.c
drivers/gpu/drm/msm/dsi/dsi_cfg.h
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/dsi/dsi_manager.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c
drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/msm_debugfs.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_iommu.c
drivers/gpu/drm/msm/msm_mdss.c
drivers/gpu/drm/msm/msm_rd.c
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

index f0c2237d5f82eb8d2d81e60d0ea7019fd3e12214..7a7cf3fb3e6da0012b57721d0e1d3965e26b41ff 100644 (file)
@@ -29,6 +29,7 @@ properties:
       - items:
           - enum:
               - qcom,sm8450-dp
+              - qcom,sm8550-dp
           - const: qcom,sm8350-dp
 
   reg:
index e6c1ebfe8a324773cab5a53a4a98fd294cdd9c99..01848bdd5873716b0d92a3b5e4d55c1249fbb29d 100644 (file)
@@ -15,6 +15,7 @@ properties:
       - items:
           - enum:
               - qcom,apq8064-dsi-ctrl
+              - qcom,msm8226-dsi-ctrl
               - qcom,msm8916-dsi-ctrl
               - qcom,msm8953-dsi-ctrl
               - qcom,msm8974-dsi-ctrl
@@ -26,6 +27,8 @@ properties:
               - qcom,sdm660-dsi-ctrl
               - qcom,sdm845-dsi-ctrl
               - qcom,sm6115-dsi-ctrl
+              - qcom,sm6350-dsi-ctrl
+              - qcom,sm6375-dsi-ctrl
               - qcom,sm8150-dsi-ctrl
               - qcom,sm8250-dsi-ctrl
               - qcom,sm8350-dsi-ctrl
@@ -82,6 +85,18 @@ properties:
       Indicates if the DSI controller is driving a panel which needs
       2 DSI links.
 
+  qcom,master-dsi:
+    type: boolean
+    description: |
+      Indicates if the DSI controller is the master DSI controller when
+      qcom,dual-dsi-mode enabled.
+
+  qcom,sync-dual-dsi:
+    type: boolean
+    description: |
+      Indicates if the DSI controller needs to sync the other DSI controller
+      with MIPI DCS commands when qcom,dual-dsi-mode enabled.
+
   assigned-clocks:
     minItems: 2
     maxItems: 4
@@ -244,6 +259,7 @@ allOf:
         compatible:
           contains:
             enum:
+              - qcom,msm8226-dsi-ctrl
               - qcom,msm8974-dsi-ctrl
     then:
       properties:
@@ -285,6 +301,7 @@ allOf:
           contains:
             enum:
               - qcom,msm8998-dsi-ctrl
+              - qcom,sm6350-dsi-ctrl
     then:
       properties:
         clocks:
@@ -352,6 +369,7 @@ allOf:
             enum:
               - qcom,sdm845-dsi-ctrl
               - qcom,sm6115-dsi-ctrl
+              - qcom,sm6375-dsi-ctrl
     then:
       properties:
         clocks:
index cf4a338c46610243a855f8b359e097d6f73ebde1..62fb3e484eb291adc7f4728737f592692c59b3fe 100644 (file)
@@ -15,10 +15,11 @@ allOf:
 properties:
   compatible:
     enum:
+      - qcom,dsi-phy-28nm-8226
+      - qcom,dsi-phy-28nm-8960
       - qcom,dsi-phy-28nm-hpm
       - qcom,dsi-phy-28nm-hpm-fam-b
       - qcom,dsi-phy-28nm-lp
-      - qcom,dsi-phy-28nm-8960
 
   reg:
     items:
index 029d72822d8b69c0a51c1a967bcfe0a05a752592..f31a26305ca9df491ce160cf8fda5d16755e5392 100644 (file)
@@ -122,6 +122,7 @@ allOf:
           contains:
             enum:
               - qcom,adreno-gmu-635.0
+              - qcom,adreno-gmu-660.1
     then:
       properties:
         reg:
index a763cf8da122f9bfd252f98081d58855f6940524..2fe032d0e8f8a99f904ff6f7c6f3779d25262289 100644 (file)
@@ -22,6 +22,7 @@ properties:
       - items:
           - enum:
               - qcom,apq8084-mdp5
+              - qcom,msm8226-mdp5
               - qcom,msm8916-mdp5
               - qcom,msm8917-mdp5
               - qcom,msm8953-mdp5
index b0100105e428e77e11e409ee210a93f376a31786..db9f07c6142d80ba59b6a86d12ebb3a210a3c677 100644 (file)
@@ -125,6 +125,7 @@ patternProperties:
           - qcom,dsi-phy-14nm-660
           - qcom,dsi-phy-14nm-8953
           - qcom,dsi-phy-20nm
+          - qcom,dsi-phy-28nm-8226
           - qcom,dsi-phy-28nm-hpm
           - qcom,dsi-phy-28nm-lp
           - qcom,hdmi-phy-8084
index 1fb8321d9ee80cdbf7e3ef4b52c518beb3b464cd..630b11480496f194ad7c190a809cb6e35ccdc4f6 100644 (file)
@@ -13,7 +13,10 @@ $ref: /schemas/display/msm/dpu-common.yaml#
 
 properties:
   compatible:
-    const: qcom,sc7180-dpu
+    enum:
+      - qcom,sc7180-dpu
+      - qcom,sm6350-dpu
+      - qcom,sm6375-dpu
 
   reg:
     items:
@@ -26,6 +29,7 @@ properties:
       - const: vbif
 
   clocks:
+    minItems: 6
     items:
       - description: Display hf axi clock
       - description: Display ahb clock
@@ -33,8 +37,10 @@ properties:
       - description: Display lut clock
       - description: Display core clock
       - description: Display vsync clock
+      - description: Display core throttle clock
 
   clock-names:
+    minItems: 6
     items:
       - const: bus
       - const: iface
@@ -42,6 +48,7 @@ properties:
       - const: lut
       - const: core
       - const: vsync
+      - const: throttle
 
 required:
   - compatible
@@ -52,6 +59,20 @@ required:
 
 unevaluatedProperties: false
 
+allOf:
+  - if:
+      properties:
+        compatible:
+          const: qcom,sm6375-dpu
+
+    then:
+      properties:
+        clocks:
+          minItems: 7
+
+        clock-names:
+          minItems: 7
+
 examples:
   - |
     #include <dt-bindings/clock/qcom,dispcc-sc7180.h>
diff --git a/Documentation/devicetree/bindings/display/msm/qcom,sm6350-mdss.yaml b/Documentation/devicetree/bindings/display/msm/qcom,sm6350-mdss.yaml
new file mode 100644 (file)
index 0000000..ed0ad19
--- /dev/null
@@ -0,0 +1,213 @@
+# SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/msm/qcom,sm6350-mdss.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm SM6350 Display MDSS
+
+maintainers:
+  - Krishna Manikandan <quic_mkrishn@quicinc.com>
+
+description:
+  SM6350 MSM Mobile Display Subsystem (MDSS), which encapsulates sub-blocks
+  like DPU display controller, DSI and DP interfaces etc.
+
+$ref: /schemas/display/msm/mdss-common.yaml#
+
+properties:
+  compatible:
+    const: qcom,sm6350-mdss
+
+  clocks:
+    items:
+      - description: Display AHB clock from gcc
+      - description: Display AXI clock from gcc
+      - description: Display core clock
+
+  clock-names:
+    items:
+      - const: iface
+      - const: bus
+      - const: core
+
+  iommus:
+    maxItems: 1
+
+  interconnects:
+    maxItems: 2
+
+  interconnect-names:
+    maxItems: 2
+
+patternProperties:
+  "^display-controller@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        const: qcom,sm6350-dpu
+
+  "^dsi@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        items:
+          - const: qcom,sm6350-dsi-ctrl
+          - const: qcom,mdss-dsi-ctrl
+
+  "^phy@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        const: qcom,dsi-phy-10nm
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,dispcc-sm6350.h>
+    #include <dt-bindings/clock/qcom,gcc-sm6350.h>
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
+
+    display-subsystem@ae00000 {
+        compatible = "qcom,sm6350-mdss";
+        reg = <0x0ae00000 0x1000>;
+        reg-names = "mdss";
+
+        power-domains = <&dispcc MDSS_GDSC>;
+
+        clocks = <&gcc GCC_DISP_AHB_CLK>,
+                 <&gcc GCC_DISP_AXI_CLK>,
+                 <&dispcc DISP_CC_MDSS_MDP_CLK>;
+        clock-names = "iface", "bus", "core";
+
+        interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <1>;
+
+        iommus = <&apps_smmu 0x800 0x2>;
+        #address-cells = <1>;
+        #size-cells = <1>;
+        ranges;
+
+        display-controller@ae01000 {
+            compatible = "qcom,sm6350-dpu";
+            reg = <0x0ae01000 0x8f000>,
+                  <0x0aeb0000 0x2008>;
+            reg-names = "mdp", "vbif";
+
+            clocks = <&gcc GCC_DISP_AXI_CLK>,
+              <&dispcc DISP_CC_MDSS_AHB_CLK>,
+              <&dispcc DISP_CC_MDSS_ROT_CLK>,
+              <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>,
+              <&dispcc DISP_CC_MDSS_MDP_CLK>,
+              <&dispcc DISP_CC_MDSS_VSYNC_CLK>;
+            clock-names = "bus", "iface", "rot", "lut", "core",
+                    "vsync";
+
+            assigned-clocks = <&dispcc DISP_CC_MDSS_MDP_CLK>,
+                              <&dispcc DISP_CC_MDSS_VSYNC_CLK>,
+                              <&dispcc DISP_CC_MDSS_ROT_CLK>,
+                              <&dispcc DISP_CC_MDSS_AHB_CLK>;
+            assigned-clock-rates = <300000000>,
+                                   <19200000>,
+                                   <19200000>,
+                                   <19200000>;
+
+            interrupt-parent = <&mdss>;
+            interrupts = <0>;
+            operating-points-v2 = <&mdp_opp_table>;
+            power-domains = <&rpmhpd SM6350_CX>;
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+                    dpu_intf1_out: endpoint {
+                        remote-endpoint = <&dsi0_in>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+                    dpu_intf2_out: endpoint {
+                        remote-endpoint = <&dsi1_in>;
+                    };
+                };
+            };
+        };
+
+        dsi@ae94000 {
+            compatible = "qcom,sm6350-dsi-ctrl", "qcom,mdss-dsi-ctrl";
+            reg = <0x0ae94000 0x400>;
+            reg-names = "dsi_ctrl";
+
+            interrupt-parent = <&mdss>;
+            interrupts = <4>;
+
+            clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>,
+                     <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>,
+                     <&dispcc DISP_CC_MDSS_PCLK0_CLK>,
+                     <&dispcc DISP_CC_MDSS_ESC0_CLK>,
+                     <&dispcc DISP_CC_MDSS_AHB_CLK>,
+                     <&gcc GCC_DISP_AXI_CLK>;
+            clock-names = "byte",
+                          "byte_intf",
+                          "pixel",
+                          "core",
+                          "iface",
+                          "bus";
+
+            assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>,
+                              <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>;
+            assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>;
+
+            operating-points-v2 = <&dsi_opp_table>;
+            power-domains = <&rpmhpd SM6350_MX>;
+
+            phys = <&dsi0_phy>;
+            phy-names = "dsi";
+
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+                    dsi0_in: endpoint {
+                        remote-endpoint = <&dpu_intf1_out>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+                    dsi0_out: endpoint {
+                    };
+                };
+            };
+        };
+
+        dsi0_phy: phy@ae94400 {
+            compatible = "qcom,dsi-phy-10nm";
+            reg = <0x0ae94400 0x200>,
+                  <0x0ae94600 0x280>,
+                  <0x0ae94a00 0x1e0>;
+            reg-names = "dsi_phy",
+                        "dsi_phy_lane",
+                        "dsi_pll";
+
+            #clock-cells = <1>;
+            #phy-cells = <0>;
+
+            clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>, <&rpmhcc RPMH_CXO_CLK>;
+            clock-names = "iface", "ref";
+        };
+    };
+...
diff --git a/Documentation/devicetree/bindings/display/msm/qcom,sm6375-mdss.yaml b/Documentation/devicetree/bindings/display/msm/qcom,sm6375-mdss.yaml
new file mode 100644 (file)
index 0000000..76369a4
--- /dev/null
@@ -0,0 +1,215 @@
+# SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/msm/qcom,sm6375-mdss.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm SM6375 Display MDSS
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@linaro.org>
+
+description:
+  SM6375 MSM Mobile Display Subsystem (MDSS), which encapsulates sub-blocks
+  like DPU display controller, DSI and DP interfaces etc.
+
+$ref: /schemas/display/msm/mdss-common.yaml#
+
+properties:
+  compatible:
+    const: qcom,sm6375-mdss
+
+  clocks:
+    items:
+      - description: Display AHB clock from gcc
+      - description: Display AHB clock
+      - description: Display core clock
+
+  clock-names:
+    items:
+      - const: iface
+      - const: ahb
+      - const: core
+
+  iommus:
+    maxItems: 1
+
+  interconnects:
+    maxItems: 2
+
+  interconnect-names:
+    maxItems: 2
+
+patternProperties:
+  "^display-controller@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        const: qcom,sm6375-dpu
+
+  "^dsi@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        items:
+          - const: qcom,sm6375-dsi-ctrl
+          - const: qcom,mdss-dsi-ctrl
+
+  "^phy@[0-9a-f]+$":
+    type: object
+    properties:
+      compatible:
+        const: qcom,sm6375-dsi-phy-7nm
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+    #include <dt-bindings/clock/qcom,sm6375-gcc.h>
+    #include <dt-bindings/clock/qcom,sm6375-dispcc.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
+
+    display-subsystem@5e00000 {
+        compatible = "qcom,sm6375-mdss";
+        reg = <0x05e00000 0x1000>;
+        reg-names = "mdss";
+
+        power-domains = <&dispcc MDSS_GDSC>;
+
+        clocks = <&gcc GCC_DISP_AHB_CLK>,
+                 <&dispcc DISP_CC_MDSS_AHB_CLK>,
+                 <&dispcc DISP_CC_MDSS_MDP_CLK>;
+        clock-names = "iface", "ahb", "core";
+
+        interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <1>;
+
+        iommus = <&apps_smmu 0x820 0x2>;
+        #address-cells = <1>;
+        #size-cells = <1>;
+        ranges;
+
+        display-controller@5e01000 {
+            compatible = "qcom,sm6375-dpu";
+            reg = <0x05e01000 0x8e030>,
+                  <0x05eb0000 0x2008>;
+            reg-names = "mdp", "vbif";
+
+            clocks = <&gcc GCC_DISP_HF_AXI_CLK>,
+                     <&dispcc DISP_CC_MDSS_AHB_CLK>,
+                     <&dispcc DISP_CC_MDSS_ROT_CLK>,
+                     <&dispcc DISP_CC_MDSS_MDP_LUT_CLK>,
+                     <&dispcc DISP_CC_MDSS_MDP_CLK>,
+                     <&dispcc DISP_CC_MDSS_VSYNC_CLK>,
+                     <&gcc GCC_DISP_THROTTLE_CORE_CLK>;
+            clock-names = "bus",
+                          "iface",
+                          "rot",
+                          "lut",
+                          "core",
+                          "vsync",
+                          "throttle";
+
+            assigned-clocks = <&dispcc DISP_CC_MDSS_VSYNC_CLK>;
+            assigned-clock-rates = <19200000>;
+
+            operating-points-v2 = <&mdp_opp_table>;
+            power-domains = <&rpmpd SM6375_VDDCX>;
+
+            interrupt-parent = <&mdss>;
+            interrupts = <0>;
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+                    dpu_intf1_out: endpoint {
+                        remote-endpoint = <&dsi0_in>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+                    dpu_intf2_out: endpoint {
+                        remote-endpoint = <&dsi1_in>;
+                    };
+                };
+            };
+        };
+
+        dsi@5e94000 {
+            compatible = "qcom,sm6375-dsi-ctrl", "qcom,mdss-dsi-ctrl";
+            reg = <0x05e94000 0x400>;
+            reg-names = "dsi_ctrl";
+
+            interrupt-parent = <&mdss>;
+            interrupts = <4>;
+
+            clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK>,
+                     <&dispcc DISP_CC_MDSS_BYTE0_INTF_CLK>,
+                     <&dispcc DISP_CC_MDSS_PCLK0_CLK>,
+                     <&dispcc DISP_CC_MDSS_ESC0_CLK>,
+                     <&dispcc DISP_CC_MDSS_AHB_CLK>,
+                     <&gcc GCC_DISP_HF_AXI_CLK>;
+            clock-names = "byte",
+                          "byte_intf",
+                          "pixel",
+                          "core",
+                          "iface",
+                          "bus";
+
+            assigned-clocks = <&dispcc DISP_CC_MDSS_BYTE0_CLK_SRC>,
+                              <&dispcc DISP_CC_MDSS_PCLK0_CLK_SRC>;
+            assigned-clock-parents = <&mdss_dsi0_phy 0>, <&mdss_dsi0_phy 1>;
+
+            operating-points-v2 = <&dsi_opp_table>;
+            power-domains = <&rpmpd SM6375_VDDMX>;
+
+            phys = <&mdss_dsi0_phy>;
+            phy-names = "dsi";
+
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+                    dsi0_in: endpoint {
+                        remote-endpoint = <&dpu_intf1_out>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+                    dsi0_out: endpoint {
+                    };
+                };
+            };
+        };
+
+        mdss_dsi0_phy: phy@5e94400 {
+            compatible = "qcom,sm6375-dsi-phy-7nm";
+            reg = <0x05e94400 0x200>,
+                  <0x05e94600 0x280>,
+                  <0x05e94900 0x264>;
+            reg-names = "dsi_phy",
+                        "dsi_phy_lane",
+                        "dsi_pll";
+
+            #clock-cells = <1>;
+            #phy-cells = <0>;
+
+            clocks = <&dispcc DISP_CC_MDSS_AHB_CLK>,
+                     <&rpmcc RPM_SMD_XO_CLK_SRC>;
+            clock-names = "iface", "ref";
+        };
+    };
+...
index 4d94dbff305415d9c02e3b03aacea1efc3dba5b9..79a226e4cc6a2027f642765dabf9850a707f856f 100644 (file)
@@ -64,7 +64,7 @@ patternProperties:
     type: object
     properties:
       compatible:
-        const: qcom,dsi-phy-5nm-8350
+        const: qcom,sm8350-dsi-phy-5nm
 
 unevaluatedProperties: false
 
index 4a53d061eebd7112f893ff18fc032f6d4a6d493d..60ecad7576ffce55b95417161f0ba6c7fcc07516 100644 (file)
@@ -6571,6 +6571,7 @@ M:        Rob Clark <robdclark@gmail.com>
 M:     Abhinav Kumar <quic_abhinavk@quicinc.com>
 M:     Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
 R:     Sean Paul <sean@poorly.run>
+R:     Marijn Suijten <marijn.suijten@somainline.org>
 L:     linux-arm-msm@vger.kernel.org
 L:     dri-devel@lists.freedesktop.org
 L:     freedreno@lists.freedesktop.org
index 7274c41228ed981bb8809340827e8d8c3ad4300e..39d9ac05c4b6cc4acc04f4d3e9d9235166eced59 100644 (file)
@@ -122,7 +122,6 @@ msm-$(CONFIG_DRM_MSM_DP)+= dp/dp_aux.o \
        dp/dp_ctrl.o \
        dp/dp_display.o \
        dp/dp_drm.o \
-       dp/dp_hpd.o \
        dp/dp_link.o \
        dp/dp_panel.o \
        dp/dp_parser.o \
index 6bd397a85834f40105f17fc840149db92f4a0e13..169b8fe688f896dc08ad59e1169c25965a4bd066 100644 (file)
@@ -69,7 +69,7 @@ static void roq_print(struct msm_gpu *gpu, struct drm_printer *p)
 
 static int show(struct seq_file *m, void *arg)
 {
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_printer p = drm_seq_file_printer(m);
index 1e8d2982d603cd17b0e2f95c772db43419d68245..a99310b68793205a07d0d088c9de251c00edff9a 100644 (file)
@@ -1743,6 +1743,7 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct platform_device *pdev = priv->gpu_pdev;
+       struct adreno_platform_config *config = pdev->dev.platform_data;
        struct a5xx_gpu *a5xx_gpu = NULL;
        struct adreno_gpu *adreno_gpu;
        struct msm_gpu *gpu;
@@ -1769,7 +1770,7 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
 
        nr_rings = 4;
 
-       if (adreno_is_a510(adreno_gpu))
+       if (adreno_cmp_rev(ADRENO_REV(5, 1, 0, ANY_ID), config->rev))
                nr_rings = 1;
 
        ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, nr_rings);
index e16b4b3f8535f718e8a6a0ba221a47189e613962..8914992378f21707e4a55f0452abe05ef10795ce 100644 (file)
@@ -1526,8 +1526,6 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
        if (!pdev)
                return -ENODEV;
 
-       mutex_init(&gmu->lock);
-
        gmu->dev = &pdev->dev;
 
        of_dma_configure(gmu->dev, node, true);
index 0bc3eb443fec80842fc5335b32bd4aff6481ebdb..4759a8ce51e4676dff4368c70147a0fd6c86cbe8 100644 (file)
@@ -51,8 +51,8 @@ struct a6xx_gmu {
 
        struct msm_gem_address_space *aspace;
 
-       void * __iomem mmio;
-       void * __iomem rscc;
+       void __iomem *mmio;
+       void __iomem *rscc;
 
        int hfi_irq;
        int gmu_irq;
index 9fb214f150dd47d98ba9dfb0786a366a3e45d5ce..ab5c446e4409b155d9a6613b079e35e3ed082264 100644 (file)
@@ -588,6 +588,63 @@ const struct adreno_reglist a660_hwcg[] = {
        {},
 };
 
+const struct adreno_reglist a690_hwcg[] = {
+       {REG_A6XX_RBBM_CLOCK_CNTL_SP0, 0x02222222},
+       {REG_A6XX_RBBM_CLOCK_CNTL2_SP0, 0x02222220},
+       {REG_A6XX_RBBM_CLOCK_DELAY_SP0, 0x00000080},
+       {REG_A6XX_RBBM_CLOCK_HYST_SP0, 0x0000F3CF},
+       {REG_A6XX_RBBM_CLOCK_CNTL_TP0, 0x22222222},
+       {REG_A6XX_RBBM_CLOCK_CNTL2_TP0, 0x22222222},
+       {REG_A6XX_RBBM_CLOCK_CNTL3_TP0, 0x22222222},
+       {REG_A6XX_RBBM_CLOCK_CNTL4_TP0, 0x00022222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_TP0, 0x11111111},
+       {REG_A6XX_RBBM_CLOCK_DELAY2_TP0, 0x11111111},
+       {REG_A6XX_RBBM_CLOCK_DELAY3_TP0, 0x11111111},
+       {REG_A6XX_RBBM_CLOCK_DELAY4_TP0, 0x00011111},
+       {REG_A6XX_RBBM_CLOCK_HYST_TP0, 0x77777777},
+       {REG_A6XX_RBBM_CLOCK_HYST2_TP0, 0x77777777},
+       {REG_A6XX_RBBM_CLOCK_HYST3_TP0, 0x77777777},
+       {REG_A6XX_RBBM_CLOCK_HYST4_TP0, 0x00077777},
+       {REG_A6XX_RBBM_CLOCK_CNTL_RB0, 0x22222222},
+       {REG_A6XX_RBBM_CLOCK_CNTL2_RB0, 0x01002222},
+       {REG_A6XX_RBBM_CLOCK_CNTL_CCU0, 0x00002220},
+       {REG_A6XX_RBBM_CLOCK_HYST_RB_CCU0, 0x00040F00},
+       {REG_A6XX_RBBM_CLOCK_CNTL_RAC, 0x25222022},
+       {REG_A6XX_RBBM_CLOCK_CNTL2_RAC, 0x00005555},
+       {REG_A6XX_RBBM_CLOCK_DELAY_RAC, 0x00000011},
+       {REG_A6XX_RBBM_CLOCK_HYST_RAC, 0x00445044},
+       {REG_A6XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM, 0x04222222},
+       {REG_A6XX_RBBM_CLOCK_MODE_VFD, 0x00002222},
+       {REG_A6XX_RBBM_CLOCK_MODE_GPC, 0x00222222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_HLSQ_2, 0x00000002},
+       {REG_A6XX_RBBM_CLOCK_MODE_HLSQ, 0x00002222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM, 0x00004000},
+       {REG_A6XX_RBBM_CLOCK_DELAY_VFD, 0x00002222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_GPC, 0x00000200},
+       {REG_A6XX_RBBM_CLOCK_DELAY_HLSQ, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_HYST_VFD, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_HYST_GPC, 0x04104004},
+       {REG_A6XX_RBBM_CLOCK_HYST_HLSQ, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_CNTL_TEX_FCHE, 0x00000222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_TEX_FCHE, 0x00000111},
+       {REG_A6XX_RBBM_CLOCK_HYST_TEX_FCHE, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_CNTL_UCHE, 0x22222222},
+       {REG_A6XX_RBBM_CLOCK_HYST_UCHE, 0x00000004},
+       {REG_A6XX_RBBM_CLOCK_DELAY_UCHE, 0x00000002},
+       {REG_A6XX_RBBM_CLOCK_CNTL, 0x8AA8AA82},
+       {REG_A6XX_RBBM_ISDB_CNT, 0x00000182},
+       {REG_A6XX_RBBM_RAC_THRESHOLD_CNT, 0x00000000},
+       {REG_A6XX_RBBM_SP_HYST_CNT, 0x00000000},
+       {REG_A6XX_RBBM_CLOCK_CNTL_GMU_GX, 0x00000222},
+       {REG_A6XX_RBBM_CLOCK_DELAY_GMU_GX, 0x00000111},
+       {REG_A6XX_RBBM_CLOCK_HYST_GMU_GX, 0x00000555},
+       {REG_A6XX_GPU_GMU_AO_GMU_CGC_MODE_CNTL, 0x20200},
+       {REG_A6XX_GPU_GMU_AO_GMU_CGC_DELAY_CNTL, 0x10111},
+       {REG_A6XX_GPU_GMU_AO_GMU_CGC_HYST_CNTL, 0x5555},
+       {}
+};
+
 static void a6xx_set_hwcg(struct msm_gpu *gpu, bool state)
 {
        struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
@@ -747,6 +804,45 @@ static const u32 a660_protect[] = {
        A6XX_PROTECT_NORDWR(0x1f8c0, 0x0000), /* note: infinite range */
 };
 
+/* These are for a690 */
+static const u32 a690_protect[] = {
+       A6XX_PROTECT_RDONLY(0x00000, 0x004ff),
+       A6XX_PROTECT_RDONLY(0x00501, 0x00001),
+       A6XX_PROTECT_RDONLY(0x0050b, 0x002f4),
+       A6XX_PROTECT_NORDWR(0x0050e, 0x00000),
+       A6XX_PROTECT_NORDWR(0x00510, 0x00000),
+       A6XX_PROTECT_NORDWR(0x00534, 0x00000),
+       A6XX_PROTECT_NORDWR(0x00800, 0x00082),
+       A6XX_PROTECT_NORDWR(0x008a0, 0x00008),
+       A6XX_PROTECT_NORDWR(0x008ab, 0x00024),
+       A6XX_PROTECT_RDONLY(0x008de, 0x000ae),
+       A6XX_PROTECT_NORDWR(0x00900, 0x0004d),
+       A6XX_PROTECT_NORDWR(0x0098d, 0x00272),
+       A6XX_PROTECT_NORDWR(0x00e00, 0x00001),
+       A6XX_PROTECT_NORDWR(0x00e03, 0x0000c),
+       A6XX_PROTECT_NORDWR(0x03c00, 0x000c3),
+       A6XX_PROTECT_RDONLY(0x03cc4, 0x01fff),
+       A6XX_PROTECT_NORDWR(0x08630, 0x001cf),
+       A6XX_PROTECT_NORDWR(0x08e00, 0x00000),
+       A6XX_PROTECT_NORDWR(0x08e08, 0x00007),
+       A6XX_PROTECT_NORDWR(0x08e50, 0x0001f),
+       A6XX_PROTECT_NORDWR(0x08e80, 0x0027f),
+       A6XX_PROTECT_NORDWR(0x09624, 0x001db),
+       A6XX_PROTECT_NORDWR(0x09e60, 0x00011),
+       A6XX_PROTECT_NORDWR(0x09e78, 0x00187),
+       A6XX_PROTECT_NORDWR(0x0a630, 0x001cf),
+       A6XX_PROTECT_NORDWR(0x0ae02, 0x00000),
+       A6XX_PROTECT_NORDWR(0x0ae50, 0x0012f),
+       A6XX_PROTECT_NORDWR(0x0b604, 0x00000),
+       A6XX_PROTECT_NORDWR(0x0b608, 0x00006),
+       A6XX_PROTECT_NORDWR(0x0be02, 0x00001),
+       A6XX_PROTECT_NORDWR(0x0be20, 0x0015f),
+       A6XX_PROTECT_NORDWR(0x0d000, 0x005ff),
+       A6XX_PROTECT_NORDWR(0x0f000, 0x00bff),
+       A6XX_PROTECT_RDONLY(0x0fc00, 0x01fff),
+       A6XX_PROTECT_NORDWR(0x11c00, 0x00000), /*note: infiite range */
+};
+
 static void a6xx_set_cp_protect(struct msm_gpu *gpu)
 {
        struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
@@ -758,6 +854,11 @@ static void a6xx_set_cp_protect(struct msm_gpu *gpu)
                count = ARRAY_SIZE(a650_protect);
                count_max = 48;
                BUILD_BUG_ON(ARRAY_SIZE(a650_protect) > 48);
+       } else if (adreno_is_a690(adreno_gpu)) {
+               regs = a690_protect;
+               count = ARRAY_SIZE(a690_protect);
+               count_max = 48;
+               BUILD_BUG_ON(ARRAY_SIZE(a690_protect) > 48);
        } else if (adreno_is_a660_family(adreno_gpu)) {
                regs = a660_protect;
                count = ARRAY_SIZE(a660_protect);
@@ -806,6 +907,13 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
                uavflagprd_inv = 2;
        }
 
+       if (adreno_is_a690(adreno_gpu)) {
+               lower_bit = 2;
+               amsbc = 1;
+               rgb565_predicator = 1;
+               uavflagprd_inv = 2;
+       }
+
        if (adreno_is_7c3(adreno_gpu)) {
                lower_bit = 1;
                amsbc = 1;
@@ -1084,7 +1192,7 @@ static int hw_init(struct msm_gpu *gpu)
        /* Setting the primFifo thresholds default values,
         * and vccCacheSkipDis=1 bit (0x200) for A640 and newer
        */
-       if (adreno_is_a650(adreno_gpu) || adreno_is_a660(adreno_gpu))
+       if (adreno_is_a650(adreno_gpu) || adreno_is_a660(adreno_gpu) || adreno_is_a690(adreno_gpu))
                gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00300200);
        else if (adreno_is_a640_family(adreno_gpu) || adreno_is_7c3(adreno_gpu))
                gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00200200);
@@ -1744,7 +1852,8 @@ a6xx_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev)
         * This allows GPU to set the bus attributes required to use system
         * cache on behalf of the iommu page table walker.
         */
-       if (!IS_ERR_OR_NULL(a6xx_gpu->htw_llc_slice))
+       if (!IS_ERR_OR_NULL(a6xx_gpu->htw_llc_slice) &&
+           !device_iommu_capable(&pdev->dev, IOMMU_CAP_CACHE_COHERENCY))
                quirks |= IO_PGTABLE_QUIRK_ARM_OUTER_WBWA;
 
        return adreno_iommu_create_address_space(gpu, pdev, quirks);
@@ -1981,6 +2090,8 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
        adreno_gpu = &a6xx_gpu->base;
        gpu = &adreno_gpu->base;
 
+       mutex_init(&a6xx_gpu->gmu.lock);
+
        adreno_gpu->registers = NULL;
 
        /*
@@ -1991,7 +2102,8 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
        info = adreno_info(config->rev);
 
        if (info && (info->revn == 650 || info->revn == 660 ||
-                       adreno_cmp_rev(ADRENO_REV(6, 3, 5, ANY_ID), info->rev)))
+                    info->revn == 690 ||
+                    adreno_cmp_rev(ADRENO_REV(6, 3, 5, ANY_ID), info->rev)))
                adreno_gpu->base.hw_apriv = true;
 
        a6xx_llc_slices_init(pdev, a6xx_gpu);
index 2cc83e049613308371eab877c26d60469fc0d3d2..25b235b49ebc212f1b4d35db1a1f1cd2040a5bbe 100644 (file)
@@ -414,6 +414,37 @@ static void a650_build_bw_table(struct a6xx_hfi_msg_bw_table *msg)
        msg->cnoc_cmds_data[1][0] =  0x60000001;
 }
 
+static void a690_build_bw_table(struct a6xx_hfi_msg_bw_table *msg)
+{
+       /*
+        * Send a single "off" entry just to get things running
+        * TODO: bus scaling
+        */
+       msg->bw_level_num = 1;
+
+       msg->ddr_cmds_num = 3;
+       msg->ddr_wait_bitmask = 0x01;
+
+       msg->ddr_cmds_addrs[0] = 0x50004;
+       msg->ddr_cmds_addrs[1] = 0x50000;
+       msg->ddr_cmds_addrs[2] = 0x500ac;
+
+       msg->ddr_cmds_data[0][0] =  0x40000000;
+       msg->ddr_cmds_data[0][1] =  0x40000000;
+       msg->ddr_cmds_data[0][2] =  0x40000000;
+
+       /*
+        * These are the CX (CNOC) votes - these are used by the GMU but the
+        * votes are known and fixed for the target
+        */
+       msg->cnoc_cmds_num = 1;
+       msg->cnoc_wait_bitmask = 0x01;
+
+       msg->cnoc_cmds_addrs[0] = 0x5003c;
+       msg->cnoc_cmds_data[0][0] =  0x40000000;
+       msg->cnoc_cmds_data[1][0] =  0x60000001;
+}
+
 static void a660_build_bw_table(struct a6xx_hfi_msg_bw_table *msg)
 {
        /*
@@ -531,6 +562,8 @@ static int a6xx_hfi_send_bw_table(struct a6xx_gmu *gmu)
                adreno_7c3_build_bw_table(&msg);
        else if (adreno_is_a660(adreno_gpu))
                a660_build_bw_table(&msg);
+       else if (adreno_is_a690(adreno_gpu))
+               a690_build_bw_table(&msg);
        else
                a6xx_build_bw_table(&msg);
 
index 8cff86e9d35c57cd1b04c5e4894dba8877dd72f8..e5a865024e942279345d8c7718d32773b9b4514d 100644 (file)
@@ -355,6 +355,20 @@ static const struct adreno_info gpulist[] = {
                .init = a6xx_gpu_init,
                .zapfw = "a640_zap.mdt",
                .hwcg = a640_hwcg,
+       }, {
+               .rev = ADRENO_REV(6, 9, 0, ANY_ID),
+               .revn = 690,
+               .name = "A690",
+               .fw = {
+                       [ADRENO_FW_SQE] = "a660_sqe.fw",
+                       [ADRENO_FW_GMU] = "a690_gmu.bin",
+               },
+               .gmem = SZ_4M,
+               .inactive_period = DRM_MSM_INACTIVE_PERIOD,
+               .init = a6xx_gpu_init,
+               .zapfw = "a690_zap.mdt",
+               .hwcg = a690_hwcg,
+               .address_space_size = SZ_16G,
        },
 };
 
index f62612a5c70f35194a690ee058b62780fbafb020..1283e5fe22d24e3691dab787ccb2e856bd2847a8 100644 (file)
@@ -55,7 +55,7 @@ struct adreno_reglist {
        u32 value;
 };
 
-extern const struct adreno_reglist a615_hwcg[], a630_hwcg[], a640_hwcg[], a650_hwcg[], a660_hwcg[];
+extern const struct adreno_reglist a615_hwcg[], a630_hwcg[], a640_hwcg[], a650_hwcg[], a660_hwcg[], a690_hwcg[];
 
 struct adreno_info {
        struct adreno_rev rev;
@@ -145,148 +145,170 @@ struct adreno_platform_config {
 
 bool adreno_cmp_rev(struct adreno_rev rev1, struct adreno_rev rev2);
 
-static inline bool adreno_is_a2xx(struct adreno_gpu *gpu)
+static inline bool adreno_is_revn(const struct adreno_gpu *gpu, uint32_t revn)
 {
+       WARN_ON_ONCE(!gpu->revn);
+
+       return gpu->revn == revn;
+}
+
+static inline bool adreno_is_a2xx(const struct adreno_gpu *gpu)
+{
+       WARN_ON_ONCE(!gpu->revn);
+
        return (gpu->revn < 300);
 }
 
-static inline bool adreno_is_a20x(struct adreno_gpu *gpu)
+static inline bool adreno_is_a20x(const struct adreno_gpu *gpu)
 {
+       WARN_ON_ONCE(!gpu->revn);
+
        return (gpu->revn < 210);
 }
 
-static inline bool adreno_is_a225(struct adreno_gpu *gpu)
+static inline bool adreno_is_a225(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 225;
+       return adreno_is_revn(gpu, 225);
 }
 
-static inline bool adreno_is_a305(struct adreno_gpu *gpu)
+static inline bool adreno_is_a305(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 305;
+       return adreno_is_revn(gpu, 305);
 }
 
-static inline bool adreno_is_a306(struct adreno_gpu *gpu)
+static inline bool adreno_is_a306(const struct adreno_gpu *gpu)
 {
        /* yes, 307, because a305c is 306 */
-       return gpu->revn == 307;
+       return adreno_is_revn(gpu, 307);
 }
 
-static inline bool adreno_is_a320(struct adreno_gpu *gpu)
+static inline bool adreno_is_a320(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 320;
+       return adreno_is_revn(gpu, 320);
 }
 
-static inline bool adreno_is_a330(struct adreno_gpu *gpu)
+static inline bool adreno_is_a330(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 330;
+       return adreno_is_revn(gpu, 330);
 }
 
-static inline bool adreno_is_a330v2(struct adreno_gpu *gpu)
+static inline bool adreno_is_a330v2(const struct adreno_gpu *gpu)
 {
        return adreno_is_a330(gpu) && (gpu->rev.patchid > 0);
 }
 
-static inline int adreno_is_a405(struct adreno_gpu *gpu)
+static inline int adreno_is_a405(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 405;
+       return adreno_is_revn(gpu, 405);
 }
 
-static inline int adreno_is_a420(struct adreno_gpu *gpu)
+static inline int adreno_is_a420(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 420;
+       return adreno_is_revn(gpu, 420);
 }
 
-static inline int adreno_is_a430(struct adreno_gpu *gpu)
+static inline int adreno_is_a430(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 430;
+       return adreno_is_revn(gpu, 430);
 }
 
-static inline int adreno_is_a506(struct adreno_gpu *gpu)
+static inline int adreno_is_a506(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 506;
+       return adreno_is_revn(gpu, 506);
 }
 
-static inline int adreno_is_a508(struct adreno_gpu *gpu)
+static inline int adreno_is_a508(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 508;
+       return adreno_is_revn(gpu, 508);
 }
 
-static inline int adreno_is_a509(struct adreno_gpu *gpu)
+static inline int adreno_is_a509(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 509;
+       return adreno_is_revn(gpu, 509);
 }
 
-static inline int adreno_is_a510(struct adreno_gpu *gpu)
+static inline int adreno_is_a510(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 510;
+       return adreno_is_revn(gpu, 510);
 }
 
-static inline int adreno_is_a512(struct adreno_gpu *gpu)
+static inline int adreno_is_a512(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 512;
+       return adreno_is_revn(gpu, 512);
 }
 
-static inline int adreno_is_a530(struct adreno_gpu *gpu)
+static inline int adreno_is_a530(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 530;
+       return adreno_is_revn(gpu, 530);
 }
 
-static inline int adreno_is_a540(struct adreno_gpu *gpu)
+static inline int adreno_is_a540(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 540;
+       return adreno_is_revn(gpu, 540);
 }
 
-static inline int adreno_is_a618(struct adreno_gpu *gpu)
+static inline int adreno_is_a618(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 618;
+       return adreno_is_revn(gpu, 618);
 }
 
-static inline int adreno_is_a619(struct adreno_gpu *gpu)
+static inline int adreno_is_a619(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 619;
+       return adreno_is_revn(gpu, 619);
 }
 
-static inline int adreno_is_a630(struct adreno_gpu *gpu)
+static inline int adreno_is_a630(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 630;
+       return adreno_is_revn(gpu, 630);
 }
 
-static inline int adreno_is_a640_family(struct adreno_gpu *gpu)
+static inline int adreno_is_a640_family(const struct adreno_gpu *gpu)
 {
-       return (gpu->revn == 640) || (gpu->revn == 680);
+       return adreno_is_revn(gpu, 640) ||
+               adreno_is_revn(gpu, 680);
 }
 
-static inline int adreno_is_a650(struct adreno_gpu *gpu)
+static inline int adreno_is_a650(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 650;
+       return adreno_is_revn(gpu, 650);
 }
 
-static inline int adreno_is_7c3(struct adreno_gpu *gpu)
+static inline int adreno_is_7c3(const struct adreno_gpu *gpu)
 {
        /* The order of args is important here to handle ANY_ID correctly */
        return adreno_cmp_rev(ADRENO_REV(6, 3, 5, ANY_ID), gpu->rev);
 }
 
-static inline int adreno_is_a660(struct adreno_gpu *gpu)
+static inline int adreno_is_a660(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 660;
+       return adreno_is_revn(gpu, 660);
 }
 
+static inline int adreno_is_a690(struct adreno_gpu *gpu)
+{
+       return gpu->revn == 690;
+};
+
 /* check for a615, a616, a618, a619 or any derivatives */
-static inline int adreno_is_a615_family(struct adreno_gpu *gpu)
+static inline int adreno_is_a615_family(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 615 || gpu->revn == 616 || gpu->revn == 618 || gpu->revn == 619;
+       return adreno_is_revn(gpu, 615) ||
+               adreno_is_revn(gpu, 616) ||
+               adreno_is_revn(gpu, 618) ||
+               adreno_is_revn(gpu, 619);
 }
 
-static inline int adreno_is_a660_family(struct adreno_gpu *gpu)
+static inline int adreno_is_a660_family(const struct adreno_gpu *gpu)
 {
-       return adreno_is_a660(gpu) || adreno_is_7c3(gpu);
+       return adreno_is_a660(gpu) || adreno_is_a690(gpu) || adreno_is_7c3(gpu);
 }
 
 /* check for a650, a660, or any derivatives */
-static inline int adreno_is_a650_family(struct adreno_gpu *gpu)
+static inline int adreno_is_a650_family(const struct adreno_gpu *gpu)
 {
-       return gpu->revn == 650 || gpu->revn == 620 || adreno_is_a660_family(gpu);
+       return adreno_is_revn(gpu, 650) ||
+               adreno_is_revn(gpu, 620) ||
+               adreno_is_a660_family(gpu);
 }
 
 u64 adreno_private_address_space_size(struct msm_gpu *gpu);
index 2b3ae84057dfe0fdc87ef73b40da378dd06979e3..7d0d0e74c3b0807bac2516015647b731d275635a 100644 (file)
@@ -30,7 +30,7 @@ static const struct dpu_mdp_cfg msm8998_mdp[] = {
        {
        .name = "top_0", .id = MDP_TOP,
        .base = 0x0, .len = 0x458,
-       .features = 0,
+       .features = BIT(DPU_MDP_VSYNC_SEL),
        .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 },
        .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 },
        .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 },
@@ -39,8 +39,8 @@ static const struct dpu_mdp_cfg msm8998_mdp[] = {
        .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 },
        .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 },
        .clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 12 },
-       .clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8, .bit_off = 15 },
-       .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0, .bit_off = 15 },
+       .clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8, .bit_off = 16 },
+       .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0, .bit_off = 16 },
        },
 };
 
@@ -98,46 +98,59 @@ static const struct dpu_sspp_cfg msm8998_sspp[] = {
 
 static const struct dpu_lm_cfg msm8998_lm[] = {
        LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_0, LM_2, DSPP_0),
+               &msm8998_lm_sblk, PINGPONG_0, LM_1, DSPP_0),
        LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_1, LM_5, DSPP_1),
+               &msm8998_lm_sblk, PINGPONG_1, LM_0, DSPP_1),
        LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_2, LM_0, 0),
+               &msm8998_lm_sblk, PINGPONG_2, LM_5, 0),
        LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_MAX, 0, 0),
+               &msm8998_lm_sblk, PINGPONG_NONE, 0, 0),
        LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_MAX, 0, 0),
+               &msm8998_lm_sblk, PINGPONG_NONE, 0, 0),
        LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_3, LM_1, 0),
+               &msm8998_lm_sblk, PINGPONG_3, LM_2, 0),
 };
 
 static const struct dpu_pingpong_cfg msm8998_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SDM845_TE2_MASK, 0, sdm845_pp_sblk_te,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SDM845_TE2_MASK, 0, sdm845_pp_sblk_te,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, PINGPONG_SDM845_MASK, 0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, PINGPONG_SDM845_MASK, 0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
 };
 
+static const struct dpu_dsc_cfg msm8998_dsc[] = {
+       DSC_BLK("dsc_0", DSC_0, 0x80000, 0),
+       DSC_BLK("dsc_1", DSC_1, 0x80400, 0),
+};
+
 static const struct dpu_dspp_cfg msm8998_dspp[] = {
-       DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_MSM8998_MASK,
+       DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
                 &msm8998_dspp_sblk),
-       DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_MSM8998_MASK,
+       DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK,
                 &msm8998_dspp_sblk),
 };
 
 static const struct dpu_intf_cfg msm8998_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 21, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 21, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27)),
+       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 21, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29)),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 21, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg msm8998_perf_data = {
@@ -191,11 +204,12 @@ const struct dpu_mdss_cfg dpu_msm8998_cfg = {
        .dspp = msm8998_dspp,
        .pingpong_count = ARRAY_SIZE(msm8998_pp),
        .pingpong = msm8998_pp,
+       .dsc_count = ARRAY_SIZE(msm8998_dsc),
+       .dsc = msm8998_dsc,
        .intf_count = ARRAY_SIZE(msm8998_intf),
        .intf = msm8998_intf,
        .vbif_count = ARRAY_SIZE(msm8998_vbif),
        .vbif = msm8998_vbif,
-       .reg_dma_count = 0,
        .perf = &msm8998_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
index ceca741e93c9b812af8a52fe6bffa6685ad8b6d6..36ea1af1089496502c62a67ce870902ebd25ec21 100644 (file)
@@ -30,7 +30,7 @@ static const struct dpu_mdp_cfg sdm845_mdp[] = {
        {
        .name = "top_0", .id = MDP_TOP,
        .base = 0x0, .len = 0x45c,
-       .features = BIT(DPU_MDP_AUDIO_SELECT),
+       .features = BIT(DPU_MDP_AUDIO_SELECT) | BIT(DPU_MDP_VSYNC_SEL),
        .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 },
        .clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 },
        .clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 },
@@ -102,24 +102,24 @@ static const struct dpu_lm_cfg sdm845_lm[] = {
        LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK,
                &sdm845_lm_sblk, PINGPONG_2, LM_5, 0),
        LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_MAX, 0, 0),
+               &sdm845_lm_sblk, PINGPONG_NONE, 0, 0),
        LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_MAX, 0, 0),
+               &sdm845_lm_sblk, PINGPONG_NONE, 0, 0),
        LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK,
                &sdm845_lm_sblk, PINGPONG_3, LM_2, 0),
 };
 
 static const struct dpu_pingpong_cfg sdm845_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SDM845_TE2_MASK, 0, sdm845_pp_sblk_te,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SDM845_TE2_MASK, 0, sdm845_pp_sblk_te,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, PINGPONG_SDM845_MASK, 0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, PINGPONG_SDM845_MASK, 0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
 };
@@ -132,10 +132,18 @@ static const struct dpu_dsc_cfg sdm845_dsc[] = {
 };
 
 static const struct dpu_intf_cfg sdm845_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 24, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27)),
+       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 24, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29)),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SDM845_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg sdm845_perf_data = {
@@ -193,8 +201,6 @@ const struct dpu_mdss_cfg dpu_sdm845_cfg = {
        .intf = sdm845_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sdm845_regdma,
        .perf = &sdm845_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
index 282d410269ff62b55108794a0c8479e665c855e6..b5f75135426781fc13e7839707b8f3ae00bf8a57 100644 (file)
@@ -128,22 +128,22 @@ static const struct dpu_dspp_cfg sm8150_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8150_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+                       -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
 };
@@ -162,10 +162,20 @@ static const struct dpu_dsc_cfg sm8150_dsc[] = {
 };
 
 static const struct dpu_intf_cfg sm8150_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg sm8150_perf_data = {
@@ -220,15 +230,15 @@ const struct dpu_mdss_cfg dpu_sm8150_cfg = {
        .intf = sm8150_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8150_regdma,
        .perf = &sm8150_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_INTR) | \
                     BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR) | \
                     BIT(MDP_INTF2_INTR) | \
+                    BIT(MDP_INTF2_TEAR_INTR) | \
                     BIT(MDP_INTF3_INTR) | \
                     BIT(MDP_AD4_0_INTR) | \
                     BIT(MDP_AD4_1_INTR),
index c57400265f288403f39b11d4f87fd489a248eca6..8ed2b263c5ea3d01cdc4deb472f33612fab483f4 100644 (file)
@@ -102,9 +102,9 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = {
 
 static const struct dpu_lm_cfg sc8180x_lm[] = {
        LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_0, LM_1, 0),
+               &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0),
        LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_1, LM_0, 0),
+               &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1),
        LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK,
                &sdm845_lm_sblk, PINGPONG_2, LM_3, 0),
        LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK,
@@ -115,23 +115,34 @@ static const struct dpu_lm_cfg sc8180x_lm[] = {
                &sdm845_lm_sblk, PINGPONG_5, LM_4, 0),
 };
 
+static const struct dpu_dspp_cfg sc8180x_dspp[] = {
+       DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
+                &sm8150_dspp_sblk),
+       DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK,
+                &sm8150_dspp_sblk),
+       DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK,
+                &sm8150_dspp_sblk),
+       DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK,
+                &sm8150_dspp_sblk),
+};
+
 static const struct dpu_pingpong_cfg sc8180x_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+                       -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
 };
@@ -142,14 +153,37 @@ static const struct dpu_merge_3d_cfg sc8180x_merge_3d[] = {
        MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200),
 };
 
+static const struct dpu_dsc_cfg sc8180x_dsc[] = {
+       DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)),
+       DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)),
+       DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)),
+       DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)),
+       DSC_BLK("dsc_4", DSC_4, 0x81000, BIT(DPU_DSC_OUTPUT_CTRL)),
+       DSC_BLK("dsc_5", DSC_5, 0x81400, BIT(DPU_DSC_OUTPUT_CTRL)),
+};
+
 static const struct dpu_intf_cfg sc8180x_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_TEAR_INTR, 2)),
        /* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
-       INTF_BLK("intf_4", INTF_4, 0x6c000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
-       INTF_BLK("intf_5", INTF_5, 0x6c800, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 999, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
+       INTF_BLK("intf_4", INTF_4, 0x6c000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 20),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 21)),
+       INTF_BLK("intf_5", INTF_5, 0x6c800, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 22),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 23)),
 };
 
 static const struct dpu_perf_cfg sc8180x_perf_data = {
@@ -190,6 +224,10 @@ const struct dpu_mdss_cfg dpu_sc8180x_cfg = {
        .sspp = sc8180x_sspp,
        .mixer_count = ARRAY_SIZE(sc8180x_lm),
        .mixer = sc8180x_lm,
+       .dspp_count = ARRAY_SIZE(sc8180x_dspp),
+       .dspp = sc8180x_dspp,
+       .dsc_count = ARRAY_SIZE(sc8180x_dsc),
+       .dsc = sc8180x_dsc,
        .pingpong_count = ARRAY_SIZE(sc8180x_pp),
        .pingpong = sc8180x_pp,
        .merge_3d_count = ARRAY_SIZE(sc8180x_merge_3d),
@@ -198,15 +236,15 @@ const struct dpu_mdss_cfg dpu_sc8180x_cfg = {
        .intf = sc8180x_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8150_regdma,
        .perf = &sc8180x_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_INTR) | \
                     BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR) | \
                     BIT(MDP_INTF2_INTR) | \
+                    BIT(MDP_INTF2_TEAR_INTR) | \
                     BIT(MDP_INTF3_INTR) | \
                     BIT(MDP_INTF4_INTR) | \
                     BIT(MDP_INTF5_INTR) | \
index 2c40229ea51594439a02acb7c16f04d05cfccb49..daebd217004135ba6f3cda0b4b2f07d4593fb526 100644 (file)
@@ -129,22 +129,22 @@ static const struct dpu_dspp_cfg sm8250_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8250_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+                       -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_2", PINGPONG_2, 0x71000, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_3", PINGPONG_3, 0x71800, PINGPONG_SM8150_MASK, MERGE_3D_1, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk,
+                       -1),
+       PP_BLK("pingpong_4", PINGPONG_4, 0x72000, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK("pingpong_5", PINGPONG_5, 0x72800, PINGPONG_SM8150_MASK, MERGE_3D_2, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
 };
@@ -163,10 +163,20 @@ static const struct dpu_dsc_cfg sm8250_dsc[] = {
 };
 
 static const struct dpu_intf_cfg sm8250_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2c0, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x6b000, 0x2c0, INTF_DSI, 1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_wb_cfg sm8250_wb[] = {
@@ -228,15 +238,15 @@ const struct dpu_mdss_cfg dpu_sm8250_cfg = {
        .vbif = sdm845_vbif,
        .wb_count = ARRAY_SIZE(sm8250_wb),
        .wb = sm8250_wb,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8250_regdma,
        .perf = &sm8250_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_INTR) | \
                     BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR) | \
                     BIT(MDP_INTF2_INTR) | \
+                    BIT(MDP_INTF2_TEAR_INTR) | \
                     BIT(MDP_INTF3_INTR) | \
                     BIT(MDP_INTF4_INTR),
 };
index 8799ed7571190fb7a4726d72a04a31b6dcf26458..0b05da2592c081a0c3a3725fd042bd9ddc4e5938 100644 (file)
@@ -76,17 +76,22 @@ static const struct dpu_lm_cfg sc7180_lm[] = {
 
 static const struct dpu_dspp_cfg sc7180_dspp[] = {
        DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
-                &sc7180_dspp_sblk),
+                &sm8150_dspp_sblk),
 };
 
 static const struct dpu_pingpong_cfg sc7180_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -1, -1),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -1, -1),
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, -1, -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, -1, -1),
 };
 
 static const struct dpu_intf_cfg sc7180_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
 };
 
 static const struct dpu_wb_cfg sc7180_wb[] = {
@@ -143,14 +148,13 @@ const struct dpu_mdss_cfg dpu_sc7180_cfg = {
        .wb = sc7180_wb,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sdm845_regdma,
        .perf = &sc7180_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_INTR) | \
-                    BIT(MDP_INTF1_INTR),
+                    BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR),
 };
 
 #endif
index 6f04d8f85c9250ef65aa7b2bc3e628d497a0c275..ba9de008519b9b7cd7835c4716540da99956c491 100644 (file)
@@ -60,14 +60,17 @@ static const struct dpu_dspp_cfg sm6115_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm6115_pp[] = {
-       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk,
                DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
+               -1),
 };
 
 static const struct dpu_intf_cfg sm6115_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+       INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
 };
 
 static const struct dpu_perf_cfg sm6115_perf_data = {
@@ -122,8 +125,8 @@ const struct dpu_mdss_cfg dpu_sm6115_cfg = {
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
-                    BIT(MDP_INTF0_INTR) | \
-                    BIT(MDP_INTF1_INTR),
+                    BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR),
 };
 
 #endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h
new file mode 100644 (file)
index 0000000..06eba23
--- /dev/null
@@ -0,0 +1,173 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DPU_6_4_SM6350_H
+#define _DPU_6_4_SM6350_H
+
+static const struct dpu_caps sm6350_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .max_mixer_blendstages = 0x7,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+       .has_src_split = true,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
+       .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+};
+
+static const struct dpu_ubwc_cfg sm6350_ubwc_cfg = {
+       .ubwc_version = DPU_HW_UBWC_VER_20,
+       .ubwc_swizzle = 6,
+       .highest_bank_bit = 1,
+};
+
+static const struct dpu_mdp_cfg sm6350_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 },
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 },
+       .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 },
+       .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 },
+       .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 },
+       },
+};
+
+static const struct dpu_ctl_cfg sm6350_ctl[] = {
+       {
+       .name = "ctl_0", .id = CTL_0,
+       .base = 0x1000, .len = 0x1dc,
+       .features = BIT(DPU_CTL_ACTIVE_CFG),
+       .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
+       },
+       {
+       .name = "ctl_1", .id = CTL_1,
+       .base = 0x1200, .len = 0x1dc,
+       .features = BIT(DPU_CTL_ACTIVE_CFG),
+       .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
+       },
+       {
+       .name = "ctl_2", .id = CTL_2,
+       .base = 0x1400, .len = 0x1dc,
+       .features = BIT(DPU_CTL_ACTIVE_CFG),
+       .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11),
+       },
+       {
+       .name = "ctl_3", .id = CTL_3,
+       .base = 0x1600, .len = 0x1dc,
+       .features = BIT(DPU_CTL_ACTIVE_CFG),
+       .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12),
+       },
+};
+
+static const struct dpu_sspp_cfg sm6350_sspp[] = {
+       SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK,
+               sc7180_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+       SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+       SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
+       SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK,
+               sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2),
+};
+
+static const struct dpu_lm_cfg sm6350_lm[] = {
+       LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK,
+               &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0),
+       LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK,
+               &sc7180_lm_sblk, PINGPONG_1, LM_0, 0),
+};
+
+static const struct dpu_dspp_cfg sm6350_dspp[] = {
+       DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
+               &sm8150_dspp_sblk),
+};
+
+static struct dpu_pingpong_cfg sm6350_pp[] = {
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
+               -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
+               -1),
+};
+
+static const struct dpu_dsc_cfg sm6350_dsc[] = {
+       DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)),
+};
+
+static const struct dpu_intf_cfg sm6350_intf[] = {
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 35, INTF_SC7180_MASK,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+               DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
+};
+
+static const struct dpu_perf_cfg sm6350_perf_data = {
+       .max_bw_low = 4200000,
+       .max_bw_high = 5100000,
+       .min_core_ib = 2500000,
+       .min_llcc_ib = 0,
+       .min_dram_ib = 1600000,
+       .min_prefill_lines = 35,
+       /* TODO: confirm danger_lut_tbl */
+       .danger_lut_tbl = {0xffff, 0xffff, 0x0},
+       .safe_lut_tbl = {0xff00, 0xff00, 0xffff},
+       .qos_lut_tbl = {
+               {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile),
+               .entries = sm6350_qos_linear_macrotile
+               },
+               {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile),
+               .entries = sm6350_qos_linear_macrotile
+               },
+               {.nentry = ARRAY_SIZE(sc7180_qos_nrt),
+               .entries = sc7180_qos_nrt
+               },
+       },
+       .cdp_cfg = {
+               {.rd_enable = 1, .wr_enable = 1},
+               {.rd_enable = 1, .wr_enable = 0}
+       },
+       .clk_inefficiency_factor = 105,
+       .bw_inefficiency_factor = 120,
+};
+
+const struct dpu_mdss_cfg dpu_sm6350_cfg = {
+       .caps = &sm6350_dpu_caps,
+       .ubwc = &sm6350_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm6350_mdp),
+       .mdp = sm6350_mdp,
+       .ctl_count = ARRAY_SIZE(sm6350_ctl),
+       .ctl = sm6350_ctl,
+       .sspp_count = ARRAY_SIZE(sm6350_sspp),
+       .sspp = sm6350_sspp,
+       .mixer_count = ARRAY_SIZE(sm6350_lm),
+       .mixer = sm6350_lm,
+       .dspp_count = ARRAY_SIZE(sm6350_dspp),
+       .dspp = sm6350_dspp,
+       .dsc_count = ARRAY_SIZE(sm6350_dsc),
+       .dsc = sm6350_dsc,
+       .pingpong_count = ARRAY_SIZE(sm6350_pp),
+       .pingpong = sm6350_pp,
+       .intf_count = ARRAY_SIZE(sm6350_intf),
+       .intf = sm6350_intf,
+       .vbif_count = ARRAY_SIZE(sdm845_vbif),
+       .vbif = sdm845_vbif,
+       .perf = &sm6350_perf_data,
+       .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
+                    BIT(MDP_SSPP_TOP0_INTR2) | \
+                    BIT(MDP_SSPP_TOP0_HIST_INTR) | \
+                    BIT(MDP_INTF0_INTR) | \
+                    BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR),
+};
+
+#endif
index 303492d62a5caaa38e39921289f35b672909a9c8..92ac348eea6b016e9efa50ddcb3173b8e0a6d005 100644 (file)
@@ -57,14 +57,17 @@ static const struct dpu_dspp_cfg qcm2290_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg qcm2290_pp[] = {
-       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk,
                DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
+               -1),
 };
 
 static const struct dpu_intf_cfg qcm2290_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+       INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
 };
 
 static const struct dpu_perf_cfg qcm2290_perf_data = {
@@ -112,8 +115,8 @@ const struct dpu_mdss_cfg dpu_qcm2290_cfg = {
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
-                    BIT(MDP_INTF0_INTR) | \
-                    BIT(MDP_INTF1_INTR),
+                    BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR),
 };
 
 #endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h
new file mode 100644 (file)
index 0000000..d7aae45
--- /dev/null
@@ -0,0 +1,139 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DPU_6_9_SM6375_H
+#define _DPU_6_9_SM6375_H
+
+static const struct dpu_caps sm6375_dpu_caps = {
+       .max_mixer_width = DEFAULT_DPU_LINE_WIDTH,
+       .max_mixer_blendstages = 0x4,
+       .qseed_type = DPU_SSPP_SCALER_QSEED4,
+       .has_dim_layer = true,
+       .has_idle_pc = true,
+       .max_linewidth = 2160,
+       .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
+};
+
+static const struct dpu_ubwc_cfg sm6375_ubwc_cfg = {
+       .ubwc_version = DPU_HW_UBWC_VER_20,
+       .ubwc_swizzle = 6,
+       .highest_bank_bit = 1,
+};
+
+static const struct dpu_mdp_cfg sm6375_mdp[] = {
+       {
+       .name = "top_0", .id = MDP_TOP,
+       .base = 0x0, .len = 0x494,
+       .features = 0,
+       .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 },
+       .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 },
+       },
+};
+
+static const struct dpu_ctl_cfg sm6375_ctl[] = {
+       {
+       .name = "ctl_0", .id = CTL_0,
+       .base = 0x1000, .len = 0x1dc,
+       .features = BIT(DPU_CTL_ACTIVE_CFG),
+       .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
+       },
+};
+
+static const struct dpu_sspp_cfg sm6375_sspp[] = {
+       SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK,
+               sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
+       SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK,
+               sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
+};
+
+static const struct dpu_lm_cfg sm6375_lm[] = {
+       LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK,
+               &qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0),
+};
+
+static const struct dpu_dspp_cfg sm6375_dspp[] = {
+       DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
+               &sm8150_dspp_sblk),
+};
+
+static const struct dpu_pingpong_cfg sm6375_pp[] = {
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
+               -1),
+};
+
+static const struct dpu_dsc_cfg sm6375_dsc[] = {
+       DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)),
+};
+
+static const struct dpu_intf_cfg sm6375_intf[] = {
+       INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK,
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+               DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+               DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)),
+};
+
+static const struct dpu_perf_cfg sm6375_perf_data = {
+       .max_bw_low = 5200000,
+       .max_bw_high = 6200000,
+       .min_core_ib = 2500000,
+       .min_llcc_ib = 0, /* No LLCC on this SoC */
+       .min_dram_ib = 1600000,
+       .min_prefill_lines = 24,
+       /* TODO: confirm danger_lut_tbl */
+       .danger_lut_tbl = {0xffff, 0xffff, 0x0},
+       .safe_lut_tbl = {0xfe00, 0xfe00, 0xffff},
+       .qos_lut_tbl = {
+               {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile),
+               .entries = sm6350_qos_linear_macrotile
+               },
+               {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile),
+               .entries = sm6350_qos_linear_macrotile
+               },
+               {.nentry = ARRAY_SIZE(sc7180_qos_nrt),
+               .entries = sc7180_qos_nrt
+               },
+       },
+       .cdp_cfg = {
+               {.rd_enable = 1, .wr_enable = 1},
+               {.rd_enable = 1, .wr_enable = 0}
+       },
+       .clk_inefficiency_factor = 105,
+       .bw_inefficiency_factor = 120,
+};
+
+const struct dpu_mdss_cfg dpu_sm6375_cfg = {
+       .caps = &sm6375_dpu_caps,
+       .ubwc = &sm6375_ubwc_cfg,
+       .mdp_count = ARRAY_SIZE(sm6375_mdp),
+       .mdp = sm6375_mdp,
+       .ctl_count = ARRAY_SIZE(sm6375_ctl),
+       .ctl = sm6375_ctl,
+       .sspp_count = ARRAY_SIZE(sm6375_sspp),
+       .sspp = sm6375_sspp,
+       .mixer_count = ARRAY_SIZE(sm6375_lm),
+       .mixer = sm6375_lm,
+       .dspp_count = ARRAY_SIZE(sm6375_dspp),
+       .dspp = sm6375_dspp,
+       .dsc_count = ARRAY_SIZE(sm6375_dsc),
+       .dsc = sm6375_dsc,
+       .pingpong_count = ARRAY_SIZE(sm6375_pp),
+       .pingpong = sm6375_pp,
+       .intf_count = ARRAY_SIZE(sm6375_intf),
+       .intf = sm6375_intf,
+       .vbif_count = ARRAY_SIZE(sdm845_vbif),
+       .vbif = sdm845_vbif,
+       .perf = &sm6375_perf_data,
+       .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
+                    BIT(MDP_SSPP_TOP0_INTR2) | \
+                    BIT(MDP_SSPP_TOP0_HIST_INTR) | \
+                    BIT(MDP_INTF1_INTR) | \
+                    BIT(MDP_INTF1_TEAR_INTR),
+};
+
+#endif
index ca107ca8de462482278c3799cf01b953504293ac..3c1b2c13398da0596b55ec38f21445cd9b7f6eca 100644 (file)
@@ -127,22 +127,22 @@ static const struct dpu_dspp_cfg sm8350_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8350_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
+                       -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
 };
@@ -154,10 +154,20 @@ static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = {
 };
 
 static const struct dpu_intf_cfg sm8350_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x36000, 0x2c4, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_7xxx_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x36000, 0x2c4, INTF_DSI, 1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_7xxx_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg sm8350_perf_data = {
@@ -211,15 +221,15 @@ const struct dpu_mdss_cfg dpu_sm8350_cfg = {
        .intf = sm8350_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8350_regdma,
        .perf = &sm8350_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_7xxx_INTR) | \
                     BIT(MDP_INTF1_7xxx_INTR) | \
+                    BIT(MDP_INTF1_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF2_7xxx_INTR) | \
+                    BIT(MDP_INTF2_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF3_7xxx_INTR),
 };
 
index 5957de1859844f633cc414d3e9059ab3203f78be..5d894cbb0a62fb25031d83415bf8fe0143c91f49 100644 (file)
@@ -31,6 +31,7 @@ static const struct dpu_mdp_cfg sc7280_mdp[] = {
        .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 },
        .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 },
        .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 },
+       .clk_ctrls[DPU_CLK_CTRL_WB2] = { .reg_off = 0x3b8, .bit_off = 24 },
        },
 };
 
@@ -83,20 +84,32 @@ static const struct dpu_lm_cfg sc7280_lm[] = {
 
 static const struct dpu_dspp_cfg sc7280_dspp[] = {
        DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK,
-                &sc7180_dspp_sblk),
+                &sm8150_dspp_sblk),
 };
 
 static const struct dpu_pingpong_cfg sc7280_pp[] = {
-       PP_BLK("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1),
+};
+
+static const struct dpu_wb_cfg sc7280_wb[] = {
+       WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6,
+                       VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4),
 };
 
 static const struct dpu_intf_cfg sc7280_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
+       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_7xxx_TEAR_INTR, 2)),
+       INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 22),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 23)),
 };
 
 static const struct dpu_perf_cfg sc7280_perf_data = {
@@ -142,6 +155,8 @@ const struct dpu_mdss_cfg dpu_sc7280_cfg = {
        .mixer = sc7280_lm,
        .pingpong_count = ARRAY_SIZE(sc7280_pp),
        .pingpong = sc7280_pp,
+       .wb_count = ARRAY_SIZE(sc7280_wb),
+       .wb = sc7280_wb,
        .intf_count = ARRAY_SIZE(sc7280_intf),
        .intf = sc7280_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
@@ -152,6 +167,7 @@ const struct dpu_mdss_cfg dpu_sc7280_cfg = {
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_7xxx_INTR) | \
                     BIT(MDP_INTF1_7xxx_INTR) | \
+                    BIT(MDP_INTF1_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF5_7xxx_INTR),
 };
 
index 9aab110b8c44d67458eb507a0bea99b54ed73553..c3f1ae000a2123607f2e7b2d9f4a2f52f28cee82 100644 (file)
@@ -42,17 +42,18 @@ static const struct dpu_mdp_cfg sc8280xp_mdp[] = {
        },
 };
 
+/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */
 static const struct dpu_ctl_cfg sc8280xp_ctl[] = {
        {
        .name = "ctl_0", .id = CTL_0,
        .base = 0x15000, .len = 0x204,
-       .features = CTL_SC7280_MASK,
+       .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK,
        .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
        },
        {
        .name = "ctl_1", .id = CTL_1,
        .base = 0x16000, .len = 0x204,
-       .features = CTL_SC7280_MASK,
+       .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK,
        .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10),
        },
        {
@@ -121,18 +122,18 @@ static const struct dpu_dspp_cfg sc8280xp_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sc8280xp_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1),
-       PP_BLK_TE("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1),
-       PP_BLK_TE("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1),
-       PP_BLK_TE("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1),
-       PP_BLK_TE("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1),
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1),
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1),
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1),
 };
 
 static const struct dpu_merge_3d_cfg sc8280xp_merge_3d[] = {
@@ -143,15 +144,35 @@ static const struct dpu_merge_3d_cfg sc8280xp_merge_3d[] = {
 
 /* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */
 static const struct dpu_intf_cfg sc8280xp_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
-       INTF_BLK("intf_4", INTF_4, 0x38000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21),
-       INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23),
-       INTF_BLK("intf_6", INTF_6, 0x3a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17),
-       INTF_BLK("intf_7", INTF_7, 0x3b000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19),
-       INTF_BLK("intf_8", INTF_8, 0x3c000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13),
+       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_7xxx_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_7xxx_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
+       INTF_BLK("intf_4", INTF_4, 0x38000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 20),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 21)),
+       INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 22),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 23)),
+       INTF_BLK("intf_6", INTF_6, 0x3a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 16),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 17)),
+       INTF_BLK("intf_7", INTF_7, 0x3b000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 18),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 19)),
+       INTF_BLK("intf_8", INTF_8, 0x3c000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
 };
 
 static const struct dpu_perf_cfg sc8280xp_perf_data = {
@@ -202,15 +223,15 @@ const struct dpu_mdss_cfg dpu_sc8280xp_cfg = {
        .intf = sc8280xp_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sc8280xp_regdma,
        .perf = &sc8280xp_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_7xxx_INTR) | \
                     BIT(MDP_INTF1_7xxx_INTR) | \
+                    BIT(MDP_INTF1_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF2_7xxx_INTR) | \
+                    BIT(MDP_INTF2_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF3_7xxx_INTR) | \
                     BIT(MDP_INTF4_7xxx_INTR) | \
                     BIT(MDP_INTF5_7xxx_INTR) | \
index 02a259b6b4268e8ac521e7b5069b5e0f024a01f7..86c2e68ebd2c8179292b29c2dcf07354b72d9ab0 100644 (file)
@@ -47,7 +47,7 @@ static const struct dpu_ctl_cfg sm8450_ctl[] = {
        {
        .name = "ctl_0", .id = CTL_0,
        .base = 0x15000, .len = 0x204,
-       .features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE),
+       .features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK,
        .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9),
        },
        {
@@ -107,9 +107,9 @@ static const struct dpu_lm_cfg sm8450_lm[] = {
        LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK,
                &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1),
        LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_2, LM_3, 0),
+               &sdm845_lm_sblk, PINGPONG_2, LM_3, DSPP_2),
        LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK,
-               &sdm845_lm_sblk, PINGPONG_3, LM_2, 0),
+               &sdm845_lm_sblk, PINGPONG_3, LM_2, DSPP_3),
        LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK,
                &sdm845_lm_sblk, PINGPONG_4, LM_5, 0),
        LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK,
@@ -126,30 +126,30 @@ static const struct dpu_dspp_cfg sm8450_dspp[] = {
        DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK,
                 &sm8150_dspp_sblk),
 };
-/* FIXME: interrupts */
+
 static const struct dpu_pingpong_cfg sm8450_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
+                       -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
-                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
+                       -1),
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
-       PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
-       PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
 };
@@ -162,10 +162,20 @@ static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = {
 };
 
 static const struct dpu_intf_cfg sm8450_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_7xxx_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_7xxx_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg sm8450_perf_data = {
@@ -219,15 +229,15 @@ const struct dpu_mdss_cfg dpu_sm8450_cfg = {
        .intf = sm8450_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8450_regdma,
        .perf = &sm8450_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_7xxx_INTR) | \
                     BIT(MDP_INTF1_7xxx_INTR) | \
+                    BIT(MDP_INTF1_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF2_7xxx_INTR) | \
+                    BIT(MDP_INTF2_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF3_7xxx_INTR),
 };
 
index 9e403034093fdc81cf04c90bce561afe14d3bca0..85dc34458b88a405e691e115cbdd16f7a6388ae2 100644 (file)
@@ -132,28 +132,28 @@ static const struct dpu_dspp_cfg sm8550_dspp[] = {
                 &sm8150_dspp_sblk),
 };
 static const struct dpu_pingpong_cfg sm8550_pp[] = {
-       PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        -1),
-       PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        -1),
-       PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        -1),
-       PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        -1),
-       PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
-       PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
-       PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
 };
@@ -166,11 +166,20 @@ static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = {
 };
 
 static const struct dpu_intf_cfg sm8550_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       /* TODO TE sub-blocks for intf1 & intf2 */
-       INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)),
+       INTF_BLK_DSI_TE("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
+                       DPU_IRQ_IDX(MDP_INTF1_7xxx_TEAR_INTR, 2)),
+       INTF_BLK_DSI_TE("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
+                       DPU_IRQ_IDX(MDP_INTF2_7xxx_TEAR_INTR, 2)),
+       INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31)),
 };
 
 static const struct dpu_perf_cfg sm8550_perf_data = {
@@ -224,15 +233,15 @@ const struct dpu_mdss_cfg dpu_sm8550_cfg = {
        .intf = sm8550_intf,
        .vbif_count = ARRAY_SIZE(sdm845_vbif),
        .vbif = sdm845_vbif,
-       .reg_dma_count = 1,
-       .dma_cfg = &sm8450_regdma,
        .perf = &sm8550_perf_data,
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
                     BIT(MDP_INTF0_7xxx_INTR) | \
                     BIT(MDP_INTF1_7xxx_INTR) | \
+                    BIT(MDP_INTF1_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF2_7xxx_INTR) | \
+                    BIT(MDP_INTF2_7xxx_TEAR_INTR) | \
                     BIT(MDP_INTF3_7xxx_INTR),
 };
 
index cc66ddffe6723b748134fd2a3def11096ff033e0..6e684a7b49a1798137a332caf7882fe4825c3f0c 100644 (file)
@@ -1392,7 +1392,7 @@ DEFINE_SHOW_ATTRIBUTE(_dpu_debugfs_status);
 
 static int dpu_crtc_debugfs_state_show(struct seq_file *s, void *v)
 {
-       struct drm_crtc *crtc = (struct drm_crtc *) s->private;
+       struct drm_crtc *crtc = s->private;
        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 
        seq_printf(s, "client type: %d\n", dpu_crtc_get_client_type(crtc));
index 1dc5dbe5857233a8ba89dad7a189c49f58d56e81..493905a5b63a6075102f11582bb4ca59853d920e 100644 (file)
@@ -339,7 +339,8 @@ void dpu_encoder_helper_report_irq_timeout(struct dpu_encoder_phys *phys_enc,
        DRM_ERROR("irq timeout id=%u, intf_mode=%s intf=%d wb=%d, pp=%d, intr=%d\n",
                        DRMID(phys_enc->parent),
                        dpu_encoder_helper_get_intf_type(phys_enc->intf_mode),
-                       phys_enc->intf_idx - INTF_0, phys_enc->wb_idx - WB_0,
+                       phys_enc->hw_intf ? phys_enc->hw_intf->idx - INTF_0 : -1,
+                       phys_enc->hw_wb ? phys_enc->hw_wb->idx - WB_0 : -1,
                        phys_enc->hw_pp->idx - PINGPONG_0, intr_idx);
 
        dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc,
@@ -495,7 +496,7 @@ void dpu_encoder_helper_split_config(
        hw_mdptop = phys_enc->hw_mdptop;
        disp_info = &dpu_enc->disp_info;
 
-       if (disp_info->intf_type != DRM_MODE_ENCODER_DSI)
+       if (disp_info->intf_type != INTF_DSI)
                return;
 
        /**
@@ -666,6 +667,7 @@ static void _dpu_encoder_update_vsync_source(struct dpu_encoder_virt *dpu_enc,
        struct dpu_kms *dpu_kms;
        struct dpu_hw_mdp *hw_mdptop;
        struct drm_encoder *drm_enc;
+       struct dpu_encoder_phys *phys_enc;
        int i;
 
        if (!dpu_enc || !disp_info) {
@@ -696,12 +698,22 @@ static void _dpu_encoder_update_vsync_source(struct dpu_encoder_virt *dpu_enc,
                        vsync_cfg.ppnumber[i] = dpu_enc->hw_pp[i]->idx;
 
                vsync_cfg.pp_count = dpu_enc->num_phys_encs;
+               vsync_cfg.frame_rate = drm_mode_vrefresh(&dpu_enc->base.crtc->state->adjusted_mode);
+
                if (disp_info->is_te_using_watchdog_timer)
                        vsync_cfg.vsync_source = DPU_VSYNC_SOURCE_WD_TIMER_0;
                else
                        vsync_cfg.vsync_source = DPU_VSYNC0_SOURCE_GPIO;
 
                hw_mdptop->ops.setup_vsync_source(hw_mdptop, &vsync_cfg);
+
+               for (i = 0; i < dpu_enc->num_phys_encs; i++) {
+                       phys_enc = dpu_enc->phys_encs[i];
+
+                       if (phys_enc->has_intf_te && phys_enc->hw_intf->ops.vsync_sel)
+                               phys_enc->hw_intf->ops.vsync_sel(phys_enc->hw_intf,
+                                               vsync_cfg.vsync_source);
+               }
        }
 }
 
@@ -1127,7 +1139,7 @@ static void _dpu_encoder_virt_enable_helper(struct drm_encoder *drm_enc)
        }
 
 
-       if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_TMDS &&
+       if (dpu_enc->disp_info.intf_type == INTF_DP &&
                dpu_enc->cur_master->hw_mdptop &&
                dpu_enc->cur_master->hw_mdptop->ops.intf_audio_select)
                dpu_enc->cur_master->hw_mdptop->ops.intf_audio_select(
@@ -1135,7 +1147,7 @@ static void _dpu_encoder_virt_enable_helper(struct drm_encoder *drm_enc)
 
        _dpu_encoder_update_vsync_source(dpu_enc, &dpu_enc->disp_info);
 
-       if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI &&
+       if (dpu_enc->disp_info.intf_type == INTF_DSI &&
                        !WARN_ON(dpu_enc->num_phys_encs == 0)) {
                unsigned bpc = dpu_enc->connector->display_info.bpc;
                for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) {
@@ -1258,38 +1270,23 @@ static void dpu_encoder_virt_atomic_disable(struct drm_encoder *drm_enc,
        mutex_unlock(&dpu_enc->enc_lock);
 }
 
-static enum dpu_intf dpu_encoder_get_intf(const struct dpu_mdss_cfg *catalog,
+static struct dpu_hw_intf *dpu_encoder_get_intf(const struct dpu_mdss_cfg *catalog,
+               struct dpu_rm *dpu_rm,
                enum dpu_intf_type type, u32 controller_id)
 {
        int i = 0;
 
        if (type == INTF_WB)
-               return INTF_MAX;
+               return NULL;
 
        for (i = 0; i < catalog->intf_count; i++) {
                if (catalog->intf[i].type == type
                    && catalog->intf[i].controller_id == controller_id) {
-                       return catalog->intf[i].id;
+                       return dpu_rm_get_intf(dpu_rm, catalog->intf[i].id);
                }
        }
 
-       return INTF_MAX;
-}
-
-static enum dpu_wb dpu_encoder_get_wb(const struct dpu_mdss_cfg *catalog,
-               enum dpu_intf_type type, u32 controller_id)
-{
-       int i = 0;
-
-       if (type != INTF_WB)
-               return WB_MAX;
-
-       for (i = 0; i < catalog->wb_count; i++) {
-               if (catalog->wb[i].id == controller_id)
-                       return catalog->wb[i].id;
-       }
-
-       return WB_MAX;
+       return NULL;
 }
 
 void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
@@ -1408,7 +1405,8 @@ void dpu_encoder_frame_done_callback(
                         */
                        trace_dpu_enc_frame_done_cb_not_busy(DRMID(drm_enc), event,
                                        dpu_encoder_helper_get_intf_type(ready_phys->intf_mode),
-                                       ready_phys->intf_idx, ready_phys->wb_idx);
+                                       ready_phys->hw_intf ? ready_phys->hw_intf->idx : -1,
+                                       ready_phys->hw_wb ? ready_phys->hw_wb->idx : -1);
                        return;
                }
 
@@ -1488,7 +1486,8 @@ static void _dpu_encoder_trigger_flush(struct drm_encoder *drm_enc,
 
        trace_dpu_enc_trigger_flush(DRMID(drm_enc),
                        dpu_encoder_helper_get_intf_type(phys->intf_mode),
-                       phys->intf_idx, phys->wb_idx,
+                       phys->hw_intf ? phys->hw_intf->idx : -1,
+                       phys->hw_wb ? phys->hw_wb->idx : -1,
                        pending_kickoff_cnt, ctl->idx,
                        extra_flush_bits, ret);
 }
@@ -1823,7 +1822,8 @@ dpu_encoder_dsc_initial_line_calc(struct drm_dsc_config *dsc,
        return DIV_ROUND_UP(total_pixels, dsc->slice_width);
 }
 
-static void dpu_encoder_dsc_pipe_cfg(struct dpu_hw_dsc *hw_dsc,
+static void dpu_encoder_dsc_pipe_cfg(struct dpu_hw_ctl *ctl,
+                                    struct dpu_hw_dsc *hw_dsc,
                                     struct dpu_hw_pingpong *hw_pp,
                                     struct drm_dsc_config *dsc,
                                     u32 common_mode,
@@ -1839,10 +1839,13 @@ static void dpu_encoder_dsc_pipe_cfg(struct dpu_hw_dsc *hw_dsc,
                hw_pp->ops.setup_dsc(hw_pp);
 
        if (hw_dsc->ops.dsc_bind_pingpong_blk)
-               hw_dsc->ops.dsc_bind_pingpong_blk(hw_dsc, true, hw_pp->idx);
+               hw_dsc->ops.dsc_bind_pingpong_blk(hw_dsc, hw_pp->idx);
 
        if (hw_pp->ops.enable_dsc)
                hw_pp->ops.enable_dsc(hw_pp);
+
+       if (ctl->ops.update_pending_flush_dsc)
+               ctl->ops.update_pending_flush_dsc(ctl, hw_dsc->idx);
 }
 
 static void dpu_encoder_prep_dsc(struct dpu_encoder_virt *dpu_enc,
@@ -1850,6 +1853,7 @@ static void dpu_encoder_prep_dsc(struct dpu_encoder_virt *dpu_enc,
 {
        /* coding only for 2LM, 2enc, 1 dsc config */
        struct dpu_encoder_phys *enc_master = dpu_enc->cur_master;
+       struct dpu_hw_ctl *ctl = enc_master->hw_ctl;
        struct dpu_hw_dsc *hw_dsc[MAX_CHANNELS_PER_ENC];
        struct dpu_hw_pingpong *hw_pp[MAX_CHANNELS_PER_ENC];
        int this_frame_slices;
@@ -1887,7 +1891,8 @@ static void dpu_encoder_prep_dsc(struct dpu_encoder_virt *dpu_enc,
        initial_lines = dpu_encoder_dsc_initial_line_calc(dsc, enc_ip_w);
 
        for (i = 0; i < MAX_CHANNELS_PER_ENC; i++)
-               dpu_encoder_dsc_pipe_cfg(hw_dsc[i], hw_pp[i], dsc, dsc_common_mode, initial_lines);
+               dpu_encoder_dsc_pipe_cfg(ctl, hw_dsc[i], hw_pp[i],
+                                        dsc, dsc_common_mode, initial_lines);
 }
 
 void dpu_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc)
@@ -1977,7 +1982,7 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
                        phys->ops.handle_post_kickoff(phys);
        }
 
-       if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI &&
+       if (dpu_enc->disp_info.intf_type == INTF_DSI &&
                        !dpu_encoder_vsync_time(drm_enc, &wakeup_time)) {
                trace_dpu_enc_early_kickoff(DRMID(drm_enc),
                                            ktime_to_ms(wakeup_time));
@@ -2019,6 +2024,41 @@ static void dpu_encoder_helper_reset_mixers(struct dpu_encoder_phys *phys_enc)
        }
 }
 
+static void dpu_encoder_dsc_pipe_clr(struct dpu_hw_ctl *ctl,
+                                    struct dpu_hw_dsc *hw_dsc,
+                                    struct dpu_hw_pingpong *hw_pp)
+{
+       if (hw_dsc->ops.dsc_disable)
+               hw_dsc->ops.dsc_disable(hw_dsc);
+
+       if (hw_pp->ops.disable_dsc)
+               hw_pp->ops.disable_dsc(hw_pp);
+
+       if (hw_dsc->ops.dsc_bind_pingpong_blk)
+               hw_dsc->ops.dsc_bind_pingpong_blk(hw_dsc, PINGPONG_NONE);
+
+       if (ctl->ops.update_pending_flush_dsc)
+               ctl->ops.update_pending_flush_dsc(ctl, hw_dsc->idx);
+}
+
+static void dpu_encoder_unprep_dsc(struct dpu_encoder_virt *dpu_enc)
+{
+       /* coding only for 2LM, 2enc, 1 dsc config */
+       struct dpu_encoder_phys *enc_master = dpu_enc->cur_master;
+       struct dpu_hw_ctl *ctl = enc_master->hw_ctl;
+       struct dpu_hw_dsc *hw_dsc[MAX_CHANNELS_PER_ENC];
+       struct dpu_hw_pingpong *hw_pp[MAX_CHANNELS_PER_ENC];
+       int i;
+
+       for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) {
+               hw_pp[i] = dpu_enc->hw_pp[i];
+               hw_dsc[i] = dpu_enc->hw_dsc[i];
+
+               if (hw_pp[i] && hw_dsc[i])
+                       dpu_encoder_dsc_pipe_clr(ctl, hw_dsc[i], hw_pp[i]);
+       }
+}
+
 void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc)
 {
        struct dpu_hw_ctl *ctl = phys_enc->hw_ctl;
@@ -2040,8 +2080,7 @@ void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc)
        if (phys_enc->hw_wb) {
                /* disable the PP block */
                if (phys_enc->hw_wb->ops.bind_pingpong_blk)
-                       phys_enc->hw_wb->ops.bind_pingpong_blk(phys_enc->hw_wb, false,
-                                       phys_enc->hw_pp->idx);
+                       phys_enc->hw_wb->ops.bind_pingpong_blk(phys_enc->hw_wb, PINGPONG_NONE);
 
                /* mark WB flush as pending */
                if (phys_enc->hw_ctl->ops.update_pending_flush_wb)
@@ -2050,8 +2089,8 @@ void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc)
                for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                        if (dpu_enc->phys_encs[i] && phys_enc->hw_intf->ops.bind_pingpong_blk)
                                phys_enc->hw_intf->ops.bind_pingpong_blk(
-                                               dpu_enc->phys_encs[i]->hw_intf, false,
-                                               dpu_enc->phys_encs[i]->hw_pp->idx);
+                                               dpu_enc->phys_encs[i]->hw_intf,
+                                               PINGPONG_NONE);
 
                        /* mark INTF flush as pending */
                        if (phys_enc->hw_ctl->ops.update_pending_flush_intf)
@@ -2069,8 +2108,12 @@ void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc)
                                        phys_enc->hw_pp->merge_3d->idx);
        }
 
+       if (dpu_enc->dsc)
+               dpu_encoder_unprep_dsc(dpu_enc);
+
        intf_cfg.stream_sel = 0; /* Don't care value for video mode */
        intf_cfg.mode_3d = dpu_encoder_helper_get_3d_blend_mode(phys_enc);
+       intf_cfg.dsc = dpu_encoder_helper_get_dsc(phys_enc);
 
        if (phys_enc->hw_intf)
                intf_cfg.intf = phys_enc->hw_intf->idx;
@@ -2099,7 +2142,8 @@ static int _dpu_encoder_status_show(struct seq_file *s, void *data)
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
                seq_printf(s, "intf:%d  wb:%d  vsync:%8d     underrun:%8d    ",
-                               phys->intf_idx - INTF_0, phys->wb_idx - WB_0,
+                               phys->hw_intf ? phys->hw_intf->idx - INTF_0 : -1,
+                               phys->hw_wb ? phys->hw_wb->idx - WB_0 : -1,
                                atomic_read(&phys->vsync_cnt),
                                atomic_read(&phys->underrun_cnt));
 
@@ -2115,16 +2159,15 @@ DEFINE_SHOW_ATTRIBUTE(_dpu_encoder_status);
 static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
 {
        struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
-       int i;
 
-       char name[DPU_NAME_SIZE];
+       char name[12];
 
        if (!drm_enc->dev) {
                DPU_ERROR("invalid encoder or kms\n");
                return -EINVAL;
        }
 
-       snprintf(name, DPU_NAME_SIZE, "encoder%u", drm_enc->base.id);
+       snprintf(name, sizeof(name), "encoder%u", drm_enc->base.id);
 
        /* create overall sub-directory for the encoder */
        dpu_enc->debugfs_root = debugfs_create_dir(name,
@@ -2134,12 +2177,6 @@ static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
        debugfs_create_file("status", 0600,
                dpu_enc->debugfs_root, dpu_enc, &_dpu_encoder_status_fops);
 
-       for (i = 0; i < dpu_enc->num_phys_encs; i++)
-               if (dpu_enc->phys_encs[i]->ops.late_register)
-                       dpu_enc->phys_encs[i]->ops.late_register(
-                                       dpu_enc->phys_encs[i],
-                                       dpu_enc->debugfs_root);
-
        return 0;
 }
 #else
@@ -2182,7 +2219,7 @@ static int dpu_encoder_virt_add_phys_encs(
        }
 
 
-       if (disp_info->intf_type == DRM_MODE_ENCODER_VIRTUAL) {
+       if (disp_info->intf_type == INTF_WB) {
                enc = dpu_encoder_phys_wb_init(params);
 
                if (IS_ERR(enc)) {
@@ -2231,7 +2268,6 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
 {
        int ret = 0;
        int i = 0;
-       enum dpu_intf_type intf_type = INTF_NONE;
        struct dpu_enc_phys_init_params phys_params;
 
        if (!dpu_enc) {
@@ -2246,23 +2282,11 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
        phys_params.parent = &dpu_enc->base;
        phys_params.enc_spinlock = &dpu_enc->enc_spinlock;
 
-       switch (disp_info->intf_type) {
-       case DRM_MODE_ENCODER_DSI:
-               intf_type = INTF_DSI;
-               break;
-       case DRM_MODE_ENCODER_TMDS:
-               intf_type = INTF_DP;
-               break;
-       case DRM_MODE_ENCODER_VIRTUAL:
-               intf_type = INTF_WB;
-               break;
-       }
-
        WARN_ON(disp_info->num_of_h_tiles < 1);
 
        DPU_DEBUG("dsi_info->num_of_h_tiles %d\n", disp_info->num_of_h_tiles);
 
-       if (disp_info->intf_type != DRM_MODE_ENCODER_VIRTUAL)
+       if (disp_info->intf_type != INTF_WB)
                dpu_enc->idle_pc_supported =
                                dpu_kms->catalog->caps->has_idle_pc;
 
@@ -2289,58 +2313,31 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
                DPU_DEBUG("h_tile_instance %d = %d, split_role %d\n",
                                i, controller_id, phys_params.split_role);
 
-               phys_params.intf_idx = dpu_encoder_get_intf(dpu_kms->catalog,
-                                                                                                       intf_type,
-                                                                                                       controller_id);
-
-               phys_params.wb_idx = dpu_encoder_get_wb(dpu_kms->catalog,
-                               intf_type, controller_id);
-               /*
-                * The phys_params might represent either an INTF or a WB unit, but not
-                * both of them at the same time.
-                */
-               if ((phys_params.intf_idx == INTF_MAX) &&
-                               (phys_params.wb_idx == WB_MAX)) {
-                       DPU_ERROR_ENC(dpu_enc, "could not get intf or wb: type %d, id %d\n",
-                                                 intf_type, controller_id);
-                       ret = -EINVAL;
-               }
-
-               if ((phys_params.intf_idx != INTF_MAX) &&
-                               (phys_params.wb_idx != WB_MAX)) {
-                       DPU_ERROR_ENC(dpu_enc, "both intf and wb present: type %d, id %d\n",
-                                                 intf_type, controller_id);
-                       ret = -EINVAL;
-               }
-
-               if (!ret) {
-                       ret = dpu_encoder_virt_add_phys_encs(disp_info,
-                                       dpu_enc, &phys_params);
-                       if (ret)
-                               DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
-               }
-       }
-
-       for (i = 0; i < dpu_enc->num_phys_encs; i++) {
-               struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-               atomic_set(&phys->vsync_cnt, 0);
-               atomic_set(&phys->underrun_cnt, 0);
-
-               if (phys->intf_idx >= INTF_0 && phys->intf_idx < INTF_MAX)
-                       phys->hw_intf = dpu_rm_get_intf(&dpu_kms->rm, phys->intf_idx);
+               phys_params.hw_intf = dpu_encoder_get_intf(dpu_kms->catalog, &dpu_kms->rm,
+                                                          disp_info->intf_type,
+                                                          controller_id);
 
-               if (phys->wb_idx >= WB_0 && phys->wb_idx < WB_MAX)
-                       phys->hw_wb = dpu_rm_get_wb(&dpu_kms->rm, phys->wb_idx);
+               if (disp_info->intf_type == INTF_WB && controller_id < WB_MAX)
+                       phys_params.hw_wb = dpu_rm_get_wb(&dpu_kms->rm, controller_id);
 
-               if (!phys->hw_intf && !phys->hw_wb) {
+               if (!phys_params.hw_intf && !phys_params.hw_wb) {
                        DPU_ERROR_ENC(dpu_enc, "no intf or wb block assigned at idx: %d\n", i);
                        ret = -EINVAL;
+                       break;
                }
 
-               if (phys->hw_intf && phys->hw_wb) {
+               if (phys_params.hw_intf && phys_params.hw_wb) {
                        DPU_ERROR_ENC(dpu_enc,
                                        "invalid phys both intf and wb block at idx: %d\n", i);
                        ret = -EINVAL;
+                       break;
+               }
+
+               ret = dpu_encoder_virt_add_phys_encs(disp_info,
+                               dpu_enc, &phys_params);
+               if (ret) {
+                       DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
+                       break;
                }
        }
 
@@ -2390,7 +2387,8 @@ static const struct drm_encoder_funcs dpu_encoder_funcs = {
                .early_unregister = dpu_encoder_early_unregister,
 };
 
-int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
+struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
+               int drm_enc_mode,
                struct msm_display_info *disp_info)
 {
        struct msm_drm_private *priv = dev->dev_private;
@@ -2399,7 +2397,23 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
        struct dpu_encoder_virt *dpu_enc = NULL;
        int ret = 0;
 
-       dpu_enc = to_dpu_encoder_virt(enc);
+       dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
+       if (!dpu_enc)
+               return ERR_PTR(-ENOMEM);
+
+       ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
+                              drm_enc_mode, NULL);
+       if (ret) {
+               devm_kfree(dev->dev, dpu_enc);
+               return ERR_PTR(ret);
+       }
+
+       drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
+
+       spin_lock_init(&dpu_enc->enc_spinlock);
+       dpu_enc->enabled = false;
+       mutex_init(&dpu_enc->enc_lock);
+       mutex_init(&dpu_enc->rc_lock);
 
        ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
        if (ret)
@@ -2409,11 +2423,11 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
        timer_setup(&dpu_enc->frame_done_timer,
                        dpu_encoder_frame_done_timeout, 0);
 
-       if (disp_info->intf_type == DRM_MODE_ENCODER_DSI)
+       if (disp_info->intf_type == INTF_DSI)
                timer_setup(&dpu_enc->vsync_event_timer,
                                dpu_encoder_vsync_event_handler,
                                0);
-       else if (disp_info->intf_type == DRM_MODE_ENCODER_TMDS)
+       else if (disp_info->intf_type == INTF_DP)
                dpu_enc->wide_bus_en = msm_dp_wide_bus_available(
                                priv->dp[disp_info->h_tile_instance[0]]);
 
@@ -2428,44 +2442,14 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
 
        DPU_DEBUG_ENC(dpu_enc, "created\n");
 
-       return ret;
+       return &dpu_enc->base;
 
 fail:
        DPU_ERROR("failed to create encoder\n");
        if (drm_enc)
                dpu_encoder_destroy(drm_enc);
 
-       return ret;
-
-
-}
-
-struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
-               int drm_enc_mode)
-{
-       struct dpu_encoder_virt *dpu_enc = NULL;
-       int rc = 0;
-
-       dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
-       if (!dpu_enc)
-               return ERR_PTR(-ENOMEM);
-
-
-       rc = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
-                                                         drm_enc_mode, NULL);
-       if (rc) {
-               devm_kfree(dev->dev, dpu_enc);
-               return ERR_PTR(rc);
-       }
-
-       drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
-
-       spin_lock_init(&dpu_enc->enc_spinlock);
-       dpu_enc->enabled = false;
-       mutex_init(&dpu_enc->enc_lock);
-       mutex_init(&dpu_enc->rc_lock);
-
-       return &dpu_enc->base;
+       return ERR_PTR(ret);
 }
 
 int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
@@ -2539,3 +2523,30 @@ unsigned int dpu_encoder_helper_get_dsc(struct dpu_encoder_phys *phys_enc)
 
        return dpu_enc->dsc_mask;
 }
+
+void dpu_encoder_phys_init(struct dpu_encoder_phys *phys_enc,
+                         struct dpu_enc_phys_init_params *p)
+{
+       int i;
+
+       phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
+       phys_enc->hw_intf = p->hw_intf;
+       phys_enc->hw_wb = p->hw_wb;
+       phys_enc->parent = p->parent;
+       phys_enc->dpu_kms = p->dpu_kms;
+       phys_enc->split_role = p->split_role;
+       phys_enc->enc_spinlock = p->enc_spinlock;
+       phys_enc->enable_state = DPU_ENC_DISABLED;
+
+       for (i = 0; i < ARRAY_SIZE(phys_enc->irq); i++)
+               phys_enc->irq[i] = -EINVAL;
+
+       atomic_set(&phys_enc->vblank_refcount, 0);
+       atomic_set(&phys_enc->pending_kickoff_cnt, 0);
+       atomic_set(&phys_enc->pending_ctlstart_cnt, 0);
+
+       atomic_set(&phys_enc->vsync_cnt, 0);
+       atomic_set(&phys_enc->underrun_cnt, 0);
+
+       init_waitqueue_head(&phys_enc->pending_kickoff_wq);
+}
index 2c9ef8d1b87799802c8acc586b054cd9a65f919f..90e1925d7770f9590e9d5492ff1e9fc6cefe7d13 100644 (file)
@@ -21,7 +21,7 @@
 
 /**
  * struct msm_display_info - defines display properties
- * @intf_type:          DRM_MODE_ENCODER_ type
+ * @intf_type:          INTF_ type
  * @num_of_h_tiles:     Number of horizontal tiles in case of split interface
  * @h_tile_instance:    Controller instance used per tile. Number of elements is
  *                      based on num_of_h_tiles
@@ -31,7 +31,7 @@
  * @dsc:               DSC configuration data for DSC-enabled displays
  */
 struct msm_display_info {
-       int intf_type;
+       enum dpu_intf_type intf_type;
        uint32_t num_of_h_tiles;
        uint32_t h_tile_instance[MAX_H_TILES_PER_DISPLAY];
        bool is_cmd_mode;
@@ -130,20 +130,12 @@ void dpu_encoder_virt_runtime_resume(struct drm_encoder *encoder);
 /**
  * dpu_encoder_init - initialize virtual encoder object
  * @dev:        Pointer to drm device structure
+ * @drm_enc_mode: corresponding DRM_MODE_ENCODER_* constant
  * @disp_info:  Pointer to display information structure
  * Returns:     Pointer to newly created drm encoder
  */
-struct drm_encoder *dpu_encoder_init(
-               struct drm_device *dev,
-               int drm_enc_mode);
-
-/**
- * dpu_encoder_setup - setup dpu_encoder for the display probed
- * @dev:               Pointer to drm device structure
- * @enc:               Pointer to the drm_encoder
- * @disp_info: Pointer to the display info
- */
-int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
+struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
+               int drm_enc_mode,
                struct msm_display_info *disp_info);
 
 /**
index 1d434b22180d9e152f5d88457c5884a0d279912b..d48558ede488d51e5b7bf36d58aabeb346f36103 100644 (file)
@@ -63,7 +63,6 @@ struct dpu_encoder_phys;
 /**
  * struct dpu_encoder_phys_ops - Interface the physical encoders provide to
  *     the containing virtual encoder.
- * @late_register:             DRM Call. Add Userspace interfaces, debugfs.
  * @prepare_commit:            MSM Atomic Call, start of atomic commit sequence
  * @is_master:                 Whether this phys_enc is the current master
  *                             encoder. Can be switched at enable time. Based
@@ -93,8 +92,6 @@ struct dpu_encoder_phys;
  */
 
 struct dpu_encoder_phys_ops {
-       int (*late_register)(struct dpu_encoder_phys *encoder,
-                       struct dentry *debugfs_root);
        void (*prepare_commit)(struct dpu_encoder_phys *encoder);
        bool (*is_master)(struct dpu_encoder_phys *encoder);
        void (*atomic_mode_set)(struct dpu_encoder_phys *encoder,
@@ -129,10 +126,10 @@ struct dpu_encoder_phys_ops {
 /**
  * enum dpu_intr_idx - dpu encoder interrupt index
  * @INTR_IDX_VSYNC:    Vsync interrupt for video mode panel
- * @INTR_IDX_PINGPONG: Pingpong done unterrupt for cmd mode panel
- * @INTR_IDX_UNDERRUN: Underrun unterrupt for video and cmd mode panel
- * @INTR_IDX_RDPTR:    Readpointer done unterrupt for cmd mode panel
- * @INTR_IDX_WB_DONE:  Writeback fone interrupt for virtual connector
+ * @INTR_IDX_PINGPONG: Pingpong done interrupt for cmd mode panel
+ * @INTR_IDX_UNDERRUN: Underrun interrupt for video and cmd mode panel
+ * @INTR_IDX_RDPTR:    Readpointer done interrupt for cmd mode panel
+ * @INTR_IDX_WB_DONE:  Writeback done interrupt for virtual connector
  */
 enum dpu_intr_idx {
        INTR_IDX_VSYNC,
@@ -161,8 +158,6 @@ enum dpu_intr_idx {
  * @enabled:           Whether the encoder has enabled and running a mode
  * @split_role:                Role to play in a split-panel configuration
  * @intf_mode:         Interface mode
- * @intf_idx:          Interface index on dpu hardware
- * @wb_idx:                    Writeback index on dpu hardware
  * @enc_spinlock:      Virtual-Encoder-Wide Spin Lock for IRQ purposes
  * @enable_state:      Enable state tracking
  * @vblank_refcount:   Reference count of vblank request
@@ -176,6 +171,7 @@ enum dpu_intr_idx {
  *                              pending.
  * @pending_kickoff_wq:                Wait queue for blocking until kickoff completes
  * @irq:                       IRQ indices
+ * @has_intf_te:               Interface TE configuration support
  */
 struct dpu_encoder_phys {
        struct drm_encoder *parent;
@@ -189,8 +185,6 @@ struct dpu_encoder_phys {
        struct drm_display_mode cached_mode;
        enum dpu_enc_split_role split_role;
        enum dpu_intf_mode intf_mode;
-       enum dpu_intf intf_idx;
-       enum dpu_wb wb_idx;
        spinlock_t *enc_spinlock;
        enum dpu_enc_enable_state enable_state;
        atomic_t vblank_refcount;
@@ -200,6 +194,7 @@ struct dpu_encoder_phys {
        atomic_t pending_kickoff_cnt;
        wait_queue_head_t pending_kickoff_wq;
        int irq[INTR_IDX_MAX];
+       bool has_intf_te;
 };
 
 static inline int dpu_encoder_phys_inc_pending(struct dpu_encoder_phys *phys)
@@ -256,16 +251,16 @@ struct dpu_encoder_phys_cmd {
  * @parent:            Pointer to the containing virtual encoder
  * @parent_ops:                Callbacks exposed by the parent to the phys_enc
  * @split_role:                Role to play in a split-panel configuration
- * @intf_idx:          Interface index this phys_enc will control
- * @wb_idx:                    Writeback index this phys_enc will control
+ * @hw_intf:           Hardware interface to the intf registers
+ * @hw_wb:             Hardware interface to the wb registers
  * @enc_spinlock:      Virtual-Encoder-Wide Spin Lock for IRQ purposes
  */
 struct dpu_enc_phys_init_params {
        struct dpu_kms *dpu_kms;
        struct drm_encoder *parent;
        enum dpu_enc_split_role split_role;
-       enum dpu_intf intf_idx;
-       enum dpu_wb wb_idx;
+       struct dpu_hw_intf *hw_intf;
+       struct dpu_hw_wb *hw_wb;
        spinlock_t *enc_spinlock;
 };
 
@@ -405,4 +400,7 @@ void dpu_encoder_frame_done_callback(
                struct drm_encoder *drm_enc,
                struct dpu_encoder_phys *ready_phys, u32 event);
 
+void dpu_encoder_phys_init(struct dpu_encoder_phys *phys,
+                          struct dpu_enc_phys_init_params *p);
+
 #endif /* __dpu_encoder_phys_H__ */
index 74470d068622e0d42f0c022a590ed3b8d7b85bf5..63ba0082b6ee485cabf04b9a4cc6922b296da4e8 100644 (file)
 #define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
                (e) && (e)->base.parent ? \
                (e)->base.parent->base.id : -1, \
-               (e) ? (e)->base.intf_idx - INTF_0 : -1, ##__VA_ARGS__)
+               (e) ? (e)->base.hw_intf->idx - INTF_0 : -1, ##__VA_ARGS__)
 
 #define DPU_ERROR_CMDENC(e, fmt, ...) DPU_ERROR("enc%d intf%d " fmt, \
                (e) && (e)->base.parent ? \
                (e)->base.parent->base.id : -1, \
-               (e) ? (e)->base.intf_idx - INTF_0 : -1, ##__VA_ARGS__)
+               (e) ? (e)->base.hw_intf->idx - INTF_0 : -1, ##__VA_ARGS__)
 
 #define to_dpu_encoder_phys_cmd(x) \
        container_of(x, struct dpu_encoder_phys_cmd, base)
 #define DEFAULT_TEARCHECK_SYNC_THRESH_START    4
 #define DEFAULT_TEARCHECK_SYNC_THRESH_CONTINUE 4
 
-#define DPU_ENC_WR_PTR_START_TIMEOUT_US 20000
-
-#define DPU_ENC_MAX_POLL_TIMEOUT_US    2000
-
 static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc);
 
 static bool dpu_encoder_phys_cmd_is_master(struct dpu_encoder_phys *phys_enc)
@@ -59,7 +55,7 @@ static void _dpu_encoder_phys_cmd_update_intf_cfg(
        if (!ctl->ops.setup_intf_cfg)
                return;
 
-       intf_cfg.intf = phys_enc->intf_idx;
+       intf_cfg.intf = phys_enc->hw_intf->idx;
        intf_cfg.intf_mode_sel = DPU_CTL_MODE_SEL_CMD;
        intf_cfg.stream_sel = cmd_enc->stream_sel;
        intf_cfg.mode_3d = dpu_encoder_helper_get_3d_blend_mode(phys_enc);
@@ -70,7 +66,6 @@ static void _dpu_encoder_phys_cmd_update_intf_cfg(
        if (test_bit(DPU_CTL_ACTIVE_CFG, &ctl->caps->features) && phys_enc->hw_intf->ops.bind_pingpong_blk)
                phys_enc->hw_intf->ops.bind_pingpong_blk(
                                phys_enc->hw_intf,
-                               true,
                                phys_enc->hw_pp->idx);
 }
 
@@ -101,13 +96,18 @@ static void dpu_encoder_phys_cmd_pp_tx_done_irq(void *arg, int irq_idx)
        DPU_ATRACE_END("pp_done_irq");
 }
 
-static void dpu_encoder_phys_cmd_pp_rd_ptr_irq(void *arg, int irq_idx)
+static void dpu_encoder_phys_cmd_te_rd_ptr_irq(void *arg, int irq_idx)
 {
        struct dpu_encoder_phys *phys_enc = arg;
        struct dpu_encoder_phys_cmd *cmd_enc;
 
-       if (!phys_enc->hw_pp)
-               return;
+       if (phys_enc->has_intf_te) {
+               if (!phys_enc->hw_intf)
+                       return;
+       } else {
+               if (!phys_enc->hw_pp)
+                       return;
+       }
 
        DPU_ATRACE_BEGIN("rd_ptr_irq");
        cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
@@ -148,7 +148,10 @@ static void dpu_encoder_phys_cmd_atomic_mode_set(
 
        phys_enc->irq[INTR_IDX_PINGPONG] = phys_enc->hw_pp->caps->intr_done;
 
-       phys_enc->irq[INTR_IDX_RDPTR] = phys_enc->hw_pp->caps->intr_rdptr;
+       if (phys_enc->has_intf_te)
+               phys_enc->irq[INTR_IDX_RDPTR] = phys_enc->hw_intf->cap->intr_tear_rd_ptr;
+       else
+               phys_enc->irq[INTR_IDX_RDPTR] = phys_enc->hw_pp->caps->intr_rdptr;
 
        phys_enc->irq[INTR_IDX_UNDERRUN] = phys_enc->hw_intf->cap->intr_underrun;
 }
@@ -259,7 +262,7 @@ static int dpu_encoder_phys_cmd_control_vblank_irq(
        if (enable && atomic_inc_return(&phys_enc->vblank_refcount) == 1)
                ret = dpu_core_irq_register_callback(phys_enc->dpu_kms,
                                phys_enc->irq[INTR_IDX_RDPTR],
-                               dpu_encoder_phys_cmd_pp_rd_ptr_irq,
+                               dpu_encoder_phys_cmd_te_rd_ptr_irq,
                                phys_enc);
        else if (!enable && atomic_dec_return(&phys_enc->vblank_refcount) == 0)
                ret = dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
@@ -320,23 +323,29 @@ static void dpu_encoder_phys_cmd_tearcheck_config(
        struct dpu_hw_tear_check tc_cfg = { 0 };
        struct drm_display_mode *mode;
        bool tc_enable = true;
-       u32 vsync_hz;
+       unsigned long vsync_hz;
        struct dpu_kms *dpu_kms;
 
-       if (!phys_enc->hw_pp) {
-               DPU_ERROR("invalid encoder\n");
-               return;
-       }
-       mode = &phys_enc->cached_mode;
+       if (phys_enc->has_intf_te) {
+               if (!phys_enc->hw_intf ||
+                   !phys_enc->hw_intf->ops.enable_tearcheck) {
+                       DPU_DEBUG_CMDENC(cmd_enc, "tearcheck not supported\n");
+                       return;
+               }
 
-       DPU_DEBUG_CMDENC(cmd_enc, "pp %d\n", phys_enc->hw_pp->idx - PINGPONG_0);
+               DPU_DEBUG_CMDENC(cmd_enc, "");
+       } else {
+               if (!phys_enc->hw_pp ||
+                   !phys_enc->hw_pp->ops.enable_tearcheck) {
+                       DPU_DEBUG_CMDENC(cmd_enc, "tearcheck not supported\n");
+                       return;
+               }
 
-       if (!phys_enc->hw_pp->ops.setup_tearcheck ||
-               !phys_enc->hw_pp->ops.enable_tearcheck) {
-               DPU_DEBUG_CMDENC(cmd_enc, "tearcheck not supported\n");
-               return;
+               DPU_DEBUG_CMDENC(cmd_enc, "pp %d\n", phys_enc->hw_pp->idx - PINGPONG_0);
        }
 
+       mode = &phys_enc->cached_mode;
+
        dpu_kms = phys_enc->dpu_kms;
 
        /*
@@ -349,9 +358,8 @@ static void dpu_encoder_phys_cmd_tearcheck_config(
         * frequency divided by the no. of rows (lines) in the LCDpanel.
         */
        vsync_hz = dpu_kms_get_clk_rate(dpu_kms, "vsync");
-       if (vsync_hz <= 0) {
-               DPU_DEBUG_CMDENC(cmd_enc, "invalid - vsync_hz %u\n",
-                                vsync_hz);
+       if (!vsync_hz) {
+               DPU_DEBUG_CMDENC(cmd_enc, "invalid - no vsync clock\n");
                return;
        }
 
@@ -371,24 +379,24 @@ static void dpu_encoder_phys_cmd_tearcheck_config(
        tc_cfg.rd_ptr_irq = mode->vdisplay + 1;
 
        DPU_DEBUG_CMDENC(cmd_enc,
-               "tc %d vsync_clk_speed_hz %u vtotal %u vrefresh %u\n",
-               phys_enc->hw_pp->idx - PINGPONG_0, vsync_hz,
-               mode->vtotal, drm_mode_vrefresh(mode));
+               "tc vsync_clk_speed_hz %lu vtotal %u vrefresh %u\n",
+               vsync_hz, mode->vtotal, drm_mode_vrefresh(mode));
        DPU_DEBUG_CMDENC(cmd_enc,
-               "tc %d enable %u start_pos %u rd_ptr_irq %u\n",
-               phys_enc->hw_pp->idx - PINGPONG_0, tc_enable, tc_cfg.start_pos,
-               tc_cfg.rd_ptr_irq);
+               "tc enable %u start_pos %u rd_ptr_irq %u\n",
+               tc_enable, tc_cfg.start_pos, tc_cfg.rd_ptr_irq);
        DPU_DEBUG_CMDENC(cmd_enc,
-               "tc %d hw_vsync_mode %u vsync_count %u vsync_init_val %u\n",
-               phys_enc->hw_pp->idx - PINGPONG_0, tc_cfg.hw_vsync_mode,
-               tc_cfg.vsync_count, tc_cfg.vsync_init_val);
+               "tc hw_vsync_mode %u vsync_count %u vsync_init_val %u\n",
+               tc_cfg.hw_vsync_mode, tc_cfg.vsync_count,
+               tc_cfg.vsync_init_val);
        DPU_DEBUG_CMDENC(cmd_enc,
-               "tc %d cfgheight %u thresh_start %u thresh_cont %u\n",
-               phys_enc->hw_pp->idx - PINGPONG_0, tc_cfg.sync_cfg_height,
-               tc_cfg.sync_threshold_start, tc_cfg.sync_threshold_continue);
+               "tc cfgheight %u thresh_start %u thresh_cont %u\n",
+               tc_cfg.sync_cfg_height, tc_cfg.sync_threshold_start,
+               tc_cfg.sync_threshold_continue);
 
-       phys_enc->hw_pp->ops.setup_tearcheck(phys_enc->hw_pp, &tc_cfg);
-       phys_enc->hw_pp->ops.enable_tearcheck(phys_enc->hw_pp, tc_enable);
+       if (phys_enc->has_intf_te)
+               phys_enc->hw_intf->ops.enable_tearcheck(phys_enc->hw_intf, &tc_cfg);
+       else
+               phys_enc->hw_pp->ops.enable_tearcheck(phys_enc->hw_pp, &tc_cfg);
 }
 
 static void _dpu_encoder_phys_cmd_pingpong_config(
@@ -430,7 +438,7 @@ static void dpu_encoder_phys_cmd_enable_helper(
                return;
        }
 
-       dpu_encoder_helper_split_config(phys_enc, phys_enc->intf_idx);
+       dpu_encoder_helper_split_config(phys_enc, phys_enc->hw_intf->idx);
 
        _dpu_encoder_phys_cmd_pingpong_config(phys_enc);
 
@@ -438,7 +446,7 @@ static void dpu_encoder_phys_cmd_enable_helper(
                return;
 
        ctl = phys_enc->hw_ctl;
-       ctl->ops.update_pending_flush_intf(ctl, phys_enc->intf_idx);
+       ctl->ops.update_pending_flush_intf(ctl, phys_enc->hw_intf->idx);
 }
 
 static void dpu_encoder_phys_cmd_enable(struct dpu_encoder_phys *phys_enc)
@@ -465,11 +473,19 @@ static void dpu_encoder_phys_cmd_enable(struct dpu_encoder_phys *phys_enc)
 static void _dpu_encoder_phys_cmd_connect_te(
                struct dpu_encoder_phys *phys_enc, bool enable)
 {
-       if (!phys_enc->hw_pp || !phys_enc->hw_pp->ops.connect_external_te)
-               return;
+       if (phys_enc->has_intf_te) {
+               if (!phys_enc->hw_intf || !phys_enc->hw_intf->ops.connect_external_te)
+                       return;
+
+               trace_dpu_enc_phys_cmd_connect_te(DRMID(phys_enc->parent), enable);
+               phys_enc->hw_intf->ops.connect_external_te(phys_enc->hw_intf, enable);
+       } else {
+               if (!phys_enc->hw_pp || !phys_enc->hw_pp->ops.connect_external_te)
+                       return;
 
-       trace_dpu_enc_phys_cmd_connect_te(DRMID(phys_enc->parent), enable);
-       phys_enc->hw_pp->ops.connect_external_te(phys_enc->hw_pp, enable);
+               trace_dpu_enc_phys_cmd_connect_te(DRMID(phys_enc->parent), enable);
+               phys_enc->hw_pp->ops.connect_external_te(phys_enc->hw_pp, enable);
+       }
 }
 
 static void dpu_encoder_phys_cmd_prepare_idle_pc(
@@ -482,17 +498,21 @@ static int dpu_encoder_phys_cmd_get_line_count(
                struct dpu_encoder_phys *phys_enc)
 {
        struct dpu_hw_pingpong *hw_pp;
-
-       if (!phys_enc->hw_pp)
-               return -EINVAL;
+       struct dpu_hw_intf *hw_intf;
 
        if (!dpu_encoder_phys_cmd_is_master(phys_enc))
                return -EINVAL;
 
+       if (phys_enc->has_intf_te) {
+               hw_intf = phys_enc->hw_intf;
+               if (!hw_intf || !hw_intf->ops.get_line_count)
+                       return -EINVAL;
+               return hw_intf->ops.get_line_count(hw_intf);
+       }
+
        hw_pp = phys_enc->hw_pp;
-       if (!hw_pp->ops.get_line_count)
+       if (!hw_pp || !hw_pp->ops.get_line_count)
                return -EINVAL;
-
        return hw_pp->ops.get_line_count(hw_pp);
 }
 
@@ -502,30 +522,39 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
                to_dpu_encoder_phys_cmd(phys_enc);
        struct dpu_hw_ctl *ctl;
 
-       if (!phys_enc->hw_pp) {
-               DPU_ERROR("invalid encoder\n");
-               return;
-       }
-       DRM_DEBUG_KMS("id:%u pp:%d state:%d\n", DRMID(phys_enc->parent),
-                     phys_enc->hw_pp->idx - PINGPONG_0,
-                     phys_enc->enable_state);
-
        if (phys_enc->enable_state == DPU_ENC_DISABLED) {
                DPU_ERROR_CMDENC(cmd_enc, "already disabled\n");
                return;
        }
 
-       if (phys_enc->hw_pp->ops.enable_tearcheck)
-               phys_enc->hw_pp->ops.enable_tearcheck(phys_enc->hw_pp, false);
+       if (phys_enc->has_intf_te) {
+               DRM_DEBUG_KMS("id:%u intf:%d state:%d\n", DRMID(phys_enc->parent),
+                             phys_enc->hw_intf->idx - INTF_0,
+                             phys_enc->enable_state);
+
+               if (phys_enc->hw_intf->ops.disable_tearcheck)
+                       phys_enc->hw_intf->ops.disable_tearcheck(phys_enc->hw_intf);
+       } else {
+               if (!phys_enc->hw_pp) {
+                       DPU_ERROR("invalid encoder\n");
+                       return;
+               }
+
+               DRM_DEBUG_KMS("id:%u pp:%d state:%d\n", DRMID(phys_enc->parent),
+                             phys_enc->hw_pp->idx - PINGPONG_0,
+                             phys_enc->enable_state);
+
+               if (phys_enc->hw_pp->ops.disable_tearcheck)
+                       phys_enc->hw_pp->ops.disable_tearcheck(phys_enc->hw_pp);
+       }
 
        if (phys_enc->hw_intf->ops.bind_pingpong_blk) {
                phys_enc->hw_intf->ops.bind_pingpong_blk(
                                phys_enc->hw_intf,
-                               false,
-                               phys_enc->hw_pp->idx);
+                               PINGPONG_NONE);
 
                ctl = phys_enc->hw_ctl;
-               ctl->ops.update_pending_flush_intf(ctl, phys_enc->intf_idx);
+               ctl->ops.update_pending_flush_intf(ctl, phys_enc->hw_intf->idx);
        }
 
        phys_enc->enable_state = DPU_ENC_DISABLED;
@@ -574,66 +603,31 @@ static void dpu_encoder_phys_cmd_prepare_for_kickoff(
                        atomic_read(&phys_enc->pending_kickoff_cnt));
 }
 
-static bool dpu_encoder_phys_cmd_is_ongoing_pptx(
-               struct dpu_encoder_phys *phys_enc)
-{
-       struct dpu_hw_pp_vsync_info info;
-
-       if (!phys_enc)
-               return false;
-
-       phys_enc->hw_pp->ops.get_vsync_info(phys_enc->hw_pp, &info);
-       if (info.wr_ptr_line_count > 0 &&
-           info.wr_ptr_line_count < phys_enc->cached_mode.vdisplay)
-               return true;
-
-       return false;
-}
-
 static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc)
 {
-       struct dpu_encoder_phys_cmd *cmd_enc =
-               to_dpu_encoder_phys_cmd(phys_enc);
-       int trial = 0;
-
        if (!phys_enc)
                return;
-       if (!phys_enc->hw_pp)
-               return;
        if (!dpu_encoder_phys_cmd_is_master(phys_enc))
                return;
 
-       /* If autorefresh is already disabled, we have nothing to do */
-       if (!phys_enc->hw_pp->ops.get_autorefresh(phys_enc->hw_pp, NULL))
-               return;
-
-       /*
-        * If autorefresh is enabled, disable it and make sure it is safe to
-        * proceed with current frame commit/push. Sequence fallowed is,
-        * 1. Disable TE
-        * 2. Disable autorefresh config
-        * 4. Poll for frame transfer ongoing to be false
-        * 5. Enable TE back
-        */
-       _dpu_encoder_phys_cmd_connect_te(phys_enc, false);
-       phys_enc->hw_pp->ops.setup_autorefresh(phys_enc->hw_pp, 0, false);
-
-       do {
-               udelay(DPU_ENC_MAX_POLL_TIMEOUT_US);
-               if ((trial * DPU_ENC_MAX_POLL_TIMEOUT_US)
-                               > (KICKOFF_TIMEOUT_MS * USEC_PER_MSEC)) {
-                       DPU_ERROR_CMDENC(cmd_enc,
-                                       "disable autorefresh failed\n");
-                       break;
-               }
-
-               trial++;
-       } while (dpu_encoder_phys_cmd_is_ongoing_pptx(phys_enc));
+       if (phys_enc->has_intf_te) {
+               if (!phys_enc->hw_intf->ops.disable_autorefresh)
+                       return;
 
-       _dpu_encoder_phys_cmd_connect_te(phys_enc, true);
-
-       DPU_DEBUG_CMDENC(to_dpu_encoder_phys_cmd(phys_enc),
-                        "disabled autorefresh\n");
+               phys_enc->hw_intf->ops.disable_autorefresh(
+                               phys_enc->hw_intf,
+                               DRMID(phys_enc->parent),
+                               phys_enc->cached_mode.vdisplay);
+       } else {
+               if (!phys_enc->hw_pp ||
+                   !phys_enc->hw_pp->ops.disable_autorefresh)
+                       return;
+
+               phys_enc->hw_pp->ops.disable_autorefresh(
+                               phys_enc->hw_pp,
+                               DRMID(phys_enc->parent),
+                               phys_enc->cached_mode.vdisplay);
+       }
 }
 
 static int _dpu_encoder_phys_cmd_wait_for_ctl_start(
@@ -670,7 +664,7 @@ static int dpu_encoder_phys_cmd_wait_for_tx_complete(
        if (rc) {
                DRM_ERROR("failed wait_for_idle: id:%u ret:%d intf:%d\n",
                          DRMID(phys_enc->parent), rc,
-                         phys_enc->intf_idx - INTF_0);
+                         phys_enc->hw_intf->idx - INTF_0);
        }
 
        return rc;
@@ -710,7 +704,7 @@ static int dpu_encoder_phys_cmd_wait_for_vblank(
 
        rc = dpu_encoder_helper_wait_for_irq(phys_enc,
                        phys_enc->irq[INTR_IDX_RDPTR],
-                       dpu_encoder_phys_cmd_pp_rd_ptr_irq,
+                       dpu_encoder_phys_cmd_te_rd_ptr_irq,
                        &wait_info);
 
        return rc;
@@ -759,36 +753,26 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
 {
        struct dpu_encoder_phys *phys_enc = NULL;
        struct dpu_encoder_phys_cmd *cmd_enc = NULL;
-       int i, ret = 0;
 
-       DPU_DEBUG("intf %d\n", p->intf_idx - INTF_0);
+       DPU_DEBUG("intf\n");
 
        cmd_enc = kzalloc(sizeof(*cmd_enc), GFP_KERNEL);
        if (!cmd_enc) {
-               ret = -ENOMEM;
                DPU_ERROR("failed to allocate\n");
-               return ERR_PTR(ret);
+               return ERR_PTR(-ENOMEM);
        }
        phys_enc = &cmd_enc->base;
-       phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
-       phys_enc->intf_idx = p->intf_idx;
+
+       dpu_encoder_phys_init(phys_enc, p);
 
        dpu_encoder_phys_cmd_init_ops(&phys_enc->ops);
-       phys_enc->parent = p->parent;
-       phys_enc->dpu_kms = p->dpu_kms;
-       phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_CMD;
-       phys_enc->enc_spinlock = p->enc_spinlock;
        cmd_enc->stream_sel = 0;
-       phys_enc->enable_state = DPU_ENC_DISABLED;
-       for (i = 0; i < ARRAY_SIZE(phys_enc->irq); i++)
-               phys_enc->irq[i] = -EINVAL;
 
-       atomic_set(&phys_enc->vblank_refcount, 0);
-       atomic_set(&phys_enc->pending_kickoff_cnt, 0);
-       atomic_set(&phys_enc->pending_ctlstart_cnt, 0);
+       phys_enc->has_intf_te = test_bit(DPU_INTF_TE,
+                                        &phys_enc->hw_intf->cap->features);
+
        atomic_set(&cmd_enc->pending_vblank_cnt, 0);
-       init_waitqueue_head(&phys_enc->pending_kickoff_wq);
        init_waitqueue_head(&cmd_enc->pending_vblank_wq);
 
        DPU_DEBUG_CMDENC(cmd_enc, "created\n");
index 3a374292f31167e3268657b50d7fa7962b96e0f3..662d74ded1b94207b22446ff565535448f04338b 100644 (file)
@@ -287,7 +287,6 @@ static void dpu_encoder_phys_vid_setup_timing_engine(
        if (phys_enc->hw_intf->ops.bind_pingpong_blk)
                phys_enc->hw_intf->ops.bind_pingpong_blk(
                                phys_enc->hw_intf,
-                               true,
                                phys_enc->hw_pp->idx);
 
        if (phys_enc->hw_pp->merge_3d)
@@ -699,7 +698,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
                struct dpu_enc_phys_init_params *p)
 {
        struct dpu_encoder_phys *phys_enc = NULL;
-       int i;
 
        if (!p) {
                DPU_ERROR("failed to create encoder due to invalid parameter\n");
@@ -712,26 +710,14 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
                return ERR_PTR(-ENOMEM);
        }
 
-       phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
-       phys_enc->intf_idx = p->intf_idx;
-
        DPU_DEBUG_VIDENC(phys_enc, "\n");
 
+       dpu_encoder_phys_init(phys_enc, p);
+
        dpu_encoder_phys_vid_init_ops(&phys_enc->ops);
-       phys_enc->parent = p->parent;
-       phys_enc->dpu_kms = p->dpu_kms;
-       phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_VIDEO;
-       phys_enc->enc_spinlock = p->enc_spinlock;
-       for (i = 0; i < ARRAY_SIZE(phys_enc->irq); i++)
-               phys_enc->irq[i] = -EINVAL;
-
-       atomic_set(&phys_enc->vblank_refcount, 0);
-       atomic_set(&phys_enc->pending_kickoff_cnt, 0);
-       init_waitqueue_head(&phys_enc->pending_kickoff_wq);
-       phys_enc->enable_state = DPU_ENC_DISABLED;
 
-       DPU_DEBUG_VIDENC(phys_enc, "created intf idx:%d\n", p->intf_idx);
+       DPU_DEBUG_VIDENC(phys_enc, "created intf idx:%d\n", p->hw_intf->idx);
 
        return phys_enc;
 }
index bac4aa807b4bc00991a104f55b4dcfd7b0145334..a466ff70a4d62beabee0117ea902b97f7673221e 100644 (file)
@@ -102,7 +102,7 @@ static void dpu_encoder_phys_wb_set_qos_remap(
 static void dpu_encoder_phys_wb_set_qos(struct dpu_encoder_phys *phys_enc)
 {
        struct dpu_hw_wb *hw_wb;
-       struct dpu_hw_wb_qos_cfg qos_cfg;
+       struct dpu_hw_qos_cfg qos_cfg;
        const struct dpu_mdss_cfg *catalog;
        const struct dpu_qos_lut_tbl *qos_lut_tb;
 
@@ -115,7 +115,7 @@ static void dpu_encoder_phys_wb_set_qos(struct dpu_encoder_phys *phys_enc)
 
        hw_wb = phys_enc->hw_wb;
 
-       memset(&qos_cfg, 0, sizeof(struct dpu_hw_wb_qos_cfg));
+       memset(&qos_cfg, 0, sizeof(struct dpu_hw_qos_cfg));
        qos_cfg.danger_safe_en = true;
        qos_cfg.danger_lut =
                catalog->perf->danger_lut_tbl[DPU_QOS_LUT_USAGE_NRT];
@@ -140,7 +140,6 @@ static void dpu_encoder_phys_wb_setup_fb(struct dpu_encoder_phys *phys_enc,
        struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys_enc);
        struct dpu_hw_wb *hw_wb;
        struct dpu_hw_wb_cfg *wb_cfg;
-       struct dpu_hw_cdp_cfg cdp_cfg;
 
        if (!phys_enc || !phys_enc->dpu_kms || !phys_enc->dpu_kms->catalog) {
                DPU_ERROR("invalid encoder\n");
@@ -163,18 +162,10 @@ static void dpu_encoder_phys_wb_setup_fb(struct dpu_encoder_phys *phys_enc,
                hw_wb->ops.setup_outformat(hw_wb, wb_cfg);
 
        if (hw_wb->ops.setup_cdp) {
-               memset(&cdp_cfg, 0, sizeof(struct dpu_hw_cdp_cfg));
-
-               cdp_cfg.enable = phys_enc->dpu_kms->catalog->perf->cdp_cfg
-                               [DPU_PERF_CDP_USAGE_NRT].wr_enable;
-               cdp_cfg.ubwc_meta_enable =
-                               DPU_FORMAT_IS_UBWC(wb_cfg->dest.format);
-               cdp_cfg.tile_amortize_enable =
-                               DPU_FORMAT_IS_UBWC(wb_cfg->dest.format) ||
-                               DPU_FORMAT_IS_TILE(wb_cfg->dest.format);
-               cdp_cfg.preload_ahead = DPU_WB_CDP_PRELOAD_AHEAD_64;
-
-               hw_wb->ops.setup_cdp(hw_wb, &cdp_cfg);
+               const struct dpu_perf_cfg *perf = phys_enc->dpu_kms->catalog->perf;
+
+               hw_wb->ops.setup_cdp(hw_wb, wb_cfg->dest.format,
+                                    perf->cdp_cfg[DPU_PERF_CDP_USAGE_NRT].wr_enable);
        }
 
        if (hw_wb->ops.setup_outaddress)
@@ -219,7 +210,7 @@ static void dpu_encoder_phys_wb_setup_cdp(struct dpu_encoder_phys *phys_enc)
 
                /* setup which pp blk will connect to this wb */
                if (hw_pp && phys_enc->hw_wb->ops.bind_pingpong_blk)
-                       phys_enc->hw_wb->ops.bind_pingpong_blk(phys_enc->hw_wb, true,
+                       phys_enc->hw_wb->ops.bind_pingpong_blk(phys_enc->hw_wb,
                                        phys_enc->hw_pp->idx);
 
                phys_enc->hw_ctl->ops.setup_intf_cfg(phys_enc->hw_ctl, &intf_cfg);
@@ -249,7 +240,7 @@ static int dpu_encoder_phys_wb_atomic_check(
        const struct drm_display_mode *mode = &crtc_state->mode;
 
        DPU_DEBUG("[atomic_check:%d, \"%s\",%d,%d]\n",
-                       phys_enc->wb_idx, mode->name, mode->hdisplay, mode->vdisplay);
+                       phys_enc->hw_wb->idx, mode->name, mode->hdisplay, mode->vdisplay);
 
        if (!conn_state || !conn_state->connector) {
                DPU_ERROR("invalid connector state\n");
@@ -570,7 +561,7 @@ static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
        if (!phys_enc)
                return;
 
-       DPU_DEBUG("[wb:%d]\n", phys_enc->wb_idx - WB_0);
+       DPU_DEBUG("[wb:%d]\n", phys_enc->hw_wb->idx - WB_0);
 
        kfree(phys_enc);
 }
@@ -693,53 +684,32 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
 {
        struct dpu_encoder_phys *phys_enc = NULL;
        struct dpu_encoder_phys_wb *wb_enc = NULL;
-       int ret = 0;
-       int i;
 
        DPU_DEBUG("\n");
 
        if (!p || !p->parent) {
                DPU_ERROR("invalid params\n");
-               ret = -EINVAL;
-               goto fail_alloc;
+               return ERR_PTR(-EINVAL);
        }
 
        wb_enc = kzalloc(sizeof(*wb_enc), GFP_KERNEL);
        if (!wb_enc) {
                DPU_ERROR("failed to allocate wb phys_enc enc\n");
-               ret = -ENOMEM;
-               goto fail_alloc;
+               return ERR_PTR(-ENOMEM);
        }
 
        phys_enc = &wb_enc->base;
-       phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
-       phys_enc->wb_idx = p->wb_idx;
+
+       dpu_encoder_phys_init(phys_enc, p);
 
        dpu_encoder_phys_wb_init_ops(&phys_enc->ops);
-       phys_enc->parent = p->parent;
-       phys_enc->dpu_kms = p->dpu_kms;
-       phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_WB_LINE;
-       phys_enc->wb_idx = p->wb_idx;
-       phys_enc->enc_spinlock = p->enc_spinlock;
 
        atomic_set(&wb_enc->wbirq_refcount, 0);
 
-       for (i = 0; i < ARRAY_SIZE(phys_enc->irq); i++)
-               phys_enc->irq[i] = -EINVAL;
-
-       atomic_set(&phys_enc->pending_kickoff_cnt, 0);
-       atomic_set(&phys_enc->vblank_refcount, 0);
        wb_enc->wb_done_timeout_cnt = 0;
 
-       init_waitqueue_head(&phys_enc->pending_kickoff_wq);
-       phys_enc->enable_state = DPU_ENC_DISABLED;
-
-       DPU_DEBUG("Created dpu_encoder_phys for wb %d\n",
-                       phys_enc->wb_idx);
+       DPU_DEBUG("Created dpu_encoder_phys for wb %d\n", phys_enc->hw_wb->idx);
 
        return phys_enc;
-
-fail_alloc:
-       return ERR_PTR(ret);
 }
index 03f162af1a50bcaa996576f99dc6c3ac23bbc6d5..b9f1d58a6cacefec7bffb85e4f9ae853ca76f0fe 100644 (file)
@@ -13,7 +13,7 @@
 #include "dpu_kms.h"
 
 #define VIG_BASE_MASK \
-       (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) |\
+       (BIT(DPU_SSPP_QOS) |\
        BIT(DPU_SSPP_CDP) |\
        BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_EXCL_RECT))
 
@@ -39,7 +39,7 @@
 #define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL))
 
 #define DMA_MSM8998_MASK \
-       (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) |\
+       (BIT(DPU_SSPP_QOS) |\
        BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
        BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT))
 
@@ -50,7 +50,7 @@
        (VIG_SC7280_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
 
 #define DMA_SDM845_MASK \
-       (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
+       (BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
        BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
        BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT))
 
 #define MIXER_QCM2290_MASK \
        (BIT(DPU_DIM_LAYER) | BIT(DPU_MIXER_COMBINED_ALPHA))
 
-#define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER)
+#define PINGPONG_SDM845_MASK \
+       (BIT(DPU_PINGPONG_DITHER) | BIT(DPU_PINGPONG_TE) | BIT(DPU_PINGPONG_DSC))
 
-#define PINGPONG_SDM845_SPLIT_MASK \
+#define PINGPONG_SDM845_TE2_MASK \
        (PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2))
 
+#define PINGPONG_SM8150_MASK \
+       (BIT(DPU_PINGPONG_DITHER) | BIT(DPU_PINGPONG_DSC))
+
 #define CTL_SC7280_MASK \
        (BIT(DPU_CTL_ACTIVE_CFG) | \
         BIT(DPU_CTL_FETCH_ACTIVE) | \
 
 #define MERGE_3D_SM8150_MASK (0)
 
-#define DSPP_MSM8998_MASK BIT(DPU_DSPP_PCC) | BIT(DPU_DSPP_GC)
-
 #define DSPP_SC7180_MASK BIT(DPU_DSPP_PCC)
 
 #define INTF_SDM845_MASK (0)
 
 #define INTF_SC7180_MASK \
-       (BIT(DPU_INTF_INPUT_CTRL) | BIT(DPU_INTF_TE) | BIT(DPU_INTF_STATUS_SUPPORTED))
+       (BIT(DPU_INTF_INPUT_CTRL) | \
+        BIT(DPU_INTF_TE) | \
+        BIT(DPU_INTF_STATUS_SUPPORTED) | \
+        BIT(DPU_DATA_HCTL_EN))
 
-#define INTF_SC7280_MASK INTF_SC7180_MASK | BIT(DPU_DATA_HCTL_EN)
+#define INTF_SC7280_MASK (INTF_SC7180_MASK)
 
 #define WB_SM8250_MASK (BIT(DPU_WB_LINE_MODE) | \
                         BIT(DPU_WB_UBWC) | \
@@ -252,8 +257,6 @@ static const uint32_t wb2_formats[] = {
        .maxdwnscale = MAX_DOWNSCALE_RATIO, \
        .maxupscale = MAX_UPSCALE_RATIO, \
        .smart_dma_priority = sdma_pri, \
-       .src_blk = {.name = STRCAT("sspp_src_", num), \
-               .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
        .scaler_blk = {.name = STRCAT("sspp_scaler", num), \
                .id = qseed_ver, \
                .base = 0xa00, .len = 0xa0,}, \
@@ -272,8 +275,6 @@ static const uint32_t wb2_formats[] = {
        .maxdwnscale = MAX_DOWNSCALE_RATIO, \
        .maxupscale = MAX_UPSCALE_RATIO, \
        .smart_dma_priority = sdma_pri, \
-       .src_blk = {.name = STRCAT("sspp_src_", num), \
-               .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
        .scaler_blk = {.name = STRCAT("sspp_scaler", num), \
                .id = qseed_ver, \
                .base = 0xa00, .len = 0xa0,}, \
@@ -292,8 +293,6 @@ static const uint32_t wb2_formats[] = {
        .maxdwnscale = SSPP_UNITY_SCALE, \
        .maxupscale = SSPP_UNITY_SCALE, \
        .smart_dma_priority = sdma_pri, \
-       .src_blk = {.name = STRCAT("sspp_src_", num), \
-               .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
        .format_list = plane_formats, \
        .num_formats = ARRAY_SIZE(plane_formats), \
        .virt_format_list = plane_formats, \
@@ -375,8 +374,6 @@ static const struct dpu_sspp_sub_blks sm8550_dma_sblk_5 = _DMA_SBLK("13", 6);
        .maxdwnscale = SSPP_UNITY_SCALE, \
        .maxupscale = SSPP_UNITY_SCALE, \
        .smart_dma_priority = sdma_pri, \
-       .src_blk = {.name = STRCAT("sspp_src_", num), \
-               .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
        .format_list = plane_formats_yuv, \
        .num_formats = ARRAY_SIZE(plane_formats_yuv), \
        .virt_format_list = plane_formats, \
@@ -449,13 +446,6 @@ static const struct dpu_lm_sub_blks qcm2290_lm_sblk = {
 static const struct dpu_dspp_sub_blks msm8998_dspp_sblk = {
        .pcc = {.id = DPU_DSPP_PCC, .base = 0x1700,
                .len = 0x90, .version = 0x10007},
-       .gc = { .id = DPU_DSPP_GC, .base = 0x17c0,
-               .len = 0x90, .version = 0x10007},
-};
-
-static const struct dpu_dspp_sub_blks sc7180_dspp_sblk = {
-       .pcc = {.id = DPU_DSPP_PCC, .base = 0x1700,
-               .len = 0x90, .version = 0x10000},
 };
 
 static const struct dpu_dspp_sub_blks sm8150_dspp_sblk = {
@@ -491,7 +481,7 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
        .len = 0x20, .version = 0x20000},
 };
 
-#define PP_BLK_DIPHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
+#define PP_BLK_DITHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
        {\
        .name = _name, .id = _id, \
        .base = _base, .len = 0, \
@@ -501,21 +491,11 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
        .intr_done = _done, \
        .intr_rdptr = _rdptr, \
        }
-#define PP_BLK_TE(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
+#define PP_BLK(_name, _id, _base, _features, _merge_3d, _sblk, _done, _rdptr) \
        {\
        .name = _name, .id = _id, \
        .base = _base, .len = 0xd4, \
-       .features = PINGPONG_SDM845_SPLIT_MASK, \
-       .merge_3d = _merge_3d, \
-       .sblk = &_sblk, \
-       .intr_done = _done, \
-       .intr_rdptr = _rdptr, \
-       }
-#define PP_BLK(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
-       {\
-       .name = _name, .id = _id, \
-       .base = _base, .len = 0xd4, \
-       .features = PINGPONG_SDM845_MASK, \
+       .features = _features, \
        .merge_3d = _merge_3d, \
        .sblk = &_sblk, \
        .intr_done = _done, \
@@ -546,7 +526,21 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
 /*************************************************************
  * INTF sub blocks config
  *************************************************************/
-#define INTF_BLK(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \
+#define INTF_BLK(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _underrun, _vsync) \
+       {\
+       .name = _name, .id = _id, \
+       .base = _base, .len = _len, \
+       .features = _features, \
+       .type = _type, \
+       .controller_id = _ctrl_id, \
+       .prog_fetch_lines_worst_case = _progfetch, \
+       .intr_underrun = _underrun, \
+       .intr_vsync = _vsync, \
+       .intr_tear_rd_ptr = -1, \
+       }
+
+/* DSI Interface sub-block with TEAR registers (since DPU 5.0.0) */
+#define INTF_BLK_DSI_TE(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _underrun, _vsync, _tear_rd_ptr) \
        {\
        .name = _name, .id = _id, \
        .base = _base, .len = _len, \
@@ -554,8 +548,9 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
        .type = _type, \
        .controller_id = _ctrl_id, \
        .prog_fetch_lines_worst_case = _progfetch, \
-       .intr_underrun = DPU_IRQ_IDX(_reg, _underrun_bit), \
-       .intr_vsync = DPU_IRQ_IDX(_reg, _vsync_bit), \
+       .intr_underrun = _underrun, \
+       .intr_vsync = _vsync, \
+       .intr_tear_rd_ptr = _tear_rd_ptr, \
        }
 
 /*************************************************************
@@ -587,12 +582,12 @@ static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
 
 static const struct dpu_vbif_dynamic_ot_cfg msm8998_ot_rdwr_cfg[] = {
        {
-               .pps = 1088 * 1920 * 30,
+               .pps = 1920 * 1080 * 30,
                .ot_limit = 2,
        },
        {
-               .pps = 1088 * 1920 * 60,
-               .ot_limit = 6,
+               .pps = 1920 * 1080 * 60,
+               .ot_limit = 4,
        },
        {
                .pps = 3840 * 2160 * 30,
@@ -650,46 +645,6 @@ static const struct dpu_vbif_cfg sdm845_vbif[] = {
        },
 };
 
-static const struct dpu_reg_dma_cfg sc8280xp_regdma = {
-       .base = 0x0,
-       .version = 0x00020000,
-       .trigger_sel_off = 0x119c,
-       .xin_id = 7,
-       .clk_ctrl = DPU_CLK_CTRL_REG_DMA,
-};
-
-static const struct dpu_reg_dma_cfg sdm845_regdma = {
-       .base = 0x0, .version = 0x1, .trigger_sel_off = 0x119c
-};
-
-static const struct dpu_reg_dma_cfg sm8150_regdma = {
-       .base = 0x0, .version = 0x00010001, .trigger_sel_off = 0x119c
-};
-
-static const struct dpu_reg_dma_cfg sm8250_regdma = {
-       .base = 0x0,
-       .version = 0x00010002,
-       .trigger_sel_off = 0x119c,
-       .xin_id = 7,
-       .clk_ctrl = DPU_CLK_CTRL_REG_DMA,
-};
-
-static const struct dpu_reg_dma_cfg sm8350_regdma = {
-       .base = 0x400,
-       .version = 0x00020000,
-       .trigger_sel_off = 0x119c,
-       .xin_id = 7,
-       .clk_ctrl = DPU_CLK_CTRL_REG_DMA,
-};
-
-static const struct dpu_reg_dma_cfg sm8450_regdma = {
-       .base = 0x0,
-       .version = 0x00020000,
-       .trigger_sel_off = 0x119c,
-       .xin_id = 7,
-       .clk_ctrl = DPU_CLK_CTRL_REG_DMA,
-};
-
 /*************************************************************
  * PERF data config
  *************************************************************/
@@ -705,10 +660,7 @@ static const struct dpu_qos_lut_entry msm8998_qos_linear[] = {
        {.fl = 10, .lut = 0x1555b},
        {.fl = 11, .lut = 0x5555b},
        {.fl = 12, .lut = 0x15555b},
-       {.fl = 13, .lut = 0x55555b},
-       {.fl = 14, .lut = 0},
-       {.fl = 1,  .lut = 0x1b},
-       {.fl = 0,  .lut = 0}
+       {.fl = 0,  .lut = 0x55555b}
 };
 
 static const struct dpu_qos_lut_entry sdm845_qos_linear[] = {
@@ -730,15 +682,17 @@ static const struct dpu_qos_lut_entry msm8998_qos_macrotile[] = {
        {.fl = 10, .lut = 0x1aaff},
        {.fl = 11, .lut = 0x5aaff},
        {.fl = 12, .lut = 0x15aaff},
-       {.fl = 13, .lut = 0x55aaff},
-       {.fl = 1,  .lut = 0x1aaff},
-       {.fl = 0,  .lut = 0},
+       {.fl = 0,  .lut = 0x55aaff},
 };
 
 static const struct dpu_qos_lut_entry sc7180_qos_linear[] = {
        {.fl = 0, .lut = 0x0011222222335777},
 };
 
+static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = {
+       {.fl = 0, .lut = 0x0011223445566777 },
+};
+
 static const struct dpu_qos_lut_entry sm8150_qos_linear[] = {
        {.fl = 0, .lut = 0x0011222222223357 },
 };
@@ -794,7 +748,9 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = {
 #include "catalog/dpu_6_0_sm8250.h"
 #include "catalog/dpu_6_2_sc7180.h"
 #include "catalog/dpu_6_3_sm6115.h"
+#include "catalog/dpu_6_4_sm6350.h"
 #include "catalog/dpu_6_5_qcm2290.h"
+#include "catalog/dpu_6_9_sm6375.h"
 
 #include "catalog/dpu_7_0_sm8350.h"
 #include "catalog/dpu_7_2_sc7280.h"
index 71584cd56fd759c2a2a6a792f7d76c42f2babb2e..ac4a9e73705cde8a17cd9174b92ffd03ba6337bd 100644 (file)
@@ -48,6 +48,8 @@ enum {
  * @DPU_MDP_UBWC_1_5,      Universal Bandwidth compression version 1.5
  * @DPU_MDP_PERIPH_0_REMOVED Indicates that access to periph top0 block results
  *                        in a failure
+ * @DPU_MDP_VSYNC_SEL      Enables vsync source selection via MDP_VSYNC_SEL register
+ *                         (moved into INTF block since DPU 5.0.0)
  * @DPU_MDP_MAX            Maximum value
 
  */
@@ -59,12 +61,12 @@ enum {
        DPU_MDP_UBWC_1_5,
        DPU_MDP_AUDIO_SELECT,
        DPU_MDP_PERIPH_0_REMOVED,
+       DPU_MDP_VSYNC_SEL,
        DPU_MDP_MAX
 };
 
 /**
  * SSPP sub-blocks/features
- * @DPU_SSPP_SRC             Src and fetch part of the pipes,
  * @DPU_SSPP_SCALER_QSEED2,  QSEED2 algorithm support
  * @DPU_SSPP_SCALER_QSEED3,  QSEED3 alogorithm support
  * @DPU_SSPP_SCALER_QSEED3LITE,  QSEED3 Lite alogorithm support
@@ -85,8 +87,7 @@ enum {
  * @DPU_SSPP_MAX             maximum value
  */
 enum {
-       DPU_SSPP_SRC = 0x1,
-       DPU_SSPP_SCALER_QSEED2,
+       DPU_SSPP_SCALER_QSEED2 = 0x1,
        DPU_SSPP_SCALER_QSEED3,
        DPU_SSPP_SCALER_QSEED3LITE,
        DPU_SSPP_SCALER_QSEED4,
@@ -127,13 +128,9 @@ enum {
 /**
  * DSPP sub-blocks
  * @DPU_DSPP_PCC             Panel color correction block
- * @DPU_DSPP_GC              Gamma correction block
- * @DPU_DSPP_IGC             Inverse gamma correction block
  */
 enum {
        DPU_DSPP_PCC = 0x1,
-       DPU_DSPP_GC,
-       DPU_DSPP_IGC,
        DPU_DSPP_MAX
 };
 
@@ -143,7 +140,8 @@ enum {
  * @DPU_PINGPONG_TE2        Additional tear check block for split pipes
  * @DPU_PINGPONG_SPLIT      PP block supports split fifo
  * @DPU_PINGPONG_SLAVE      PP block is a suitable slave for split fifo
- * @DPU_PINGPONG_DITHER,    Dither blocks
+ * @DPU_PINGPONG_DITHER     Dither blocks
+ * @DPU_PINGPONG_DSC        PP block supports DSC
  * @DPU_PINGPONG_MAX
  */
 enum {
@@ -152,6 +150,7 @@ enum {
        DPU_PINGPONG_SPLIT,
        DPU_PINGPONG_SLAVE,
        DPU_PINGPONG_DITHER,
+       DPU_PINGPONG_DSC,
        DPU_PINGPONG_MAX
 };
 
@@ -278,14 +277,6 @@ enum {
        u32 base; \
        u32 len
 
-/**
- * struct dpu_src_blk: SSPP part of the source pipes
- * @info:   HW register and features supported by this sub-blk
- */
-struct dpu_src_blk {
-       DPU_HW_SUBBLK_INFO;
-};
-
 /**
  * struct dpu_scaler_blk: Scaler information
  * @info:   HW register and features supported by this sub-blk
@@ -385,20 +376,13 @@ struct dpu_caps {
 /**
  * struct dpu_sspp_sub_blks : SSPP sub-blocks
  * common: Pointer to common configurations shared by sub blocks
- * @creq_vblank: creq priority during vertical blanking
- * @danger_vblank: danger priority during vertical blanking
  * @maxdwnscale: max downscale ratio supported(without DECIMATION)
  * @maxupscale:  maxupscale ratio supported
  * @smart_dma_priority: hw priority of rect1 of multirect pipe
  * @max_per_pipe_bw: maximum allowable bandwidth of this pipe in kBps
  * @qseed_ver: qseed version
- * @src_blk:
  * @scaler_blk:
  * @csc_blk:
- * @hsic:
- * @memcolor:
- * @pcc_blk:
- * @igc_blk:
  * @format_list: Pointer to list of supported formats
  * @num_formats: Number of supported formats
  * @virt_format_list: Pointer to list of supported formats for virtual planes
@@ -406,20 +390,13 @@ struct dpu_caps {
  * @dpu_rotation_cfg: inline rotation configuration
  */
 struct dpu_sspp_sub_blks {
-       u32 creq_vblank;
-       u32 danger_vblank;
        u32 maxdwnscale;
        u32 maxupscale;
        u32 smart_dma_priority;
        u32 max_per_pipe_bw;
        u32 qseed_ver;
-       struct dpu_src_blk src_blk;
        struct dpu_scaler_blk scaler_blk;
        struct dpu_pp_blk csc_blk;
-       struct dpu_pp_blk hsic_blk;
-       struct dpu_pp_blk memcolor_blk;
-       struct dpu_pp_blk pcc_blk;
-       struct dpu_pp_blk igc_blk;
 
        const u32 *format_list;
        u32 num_formats;
@@ -433,22 +410,18 @@ struct dpu_sspp_sub_blks {
  * @maxwidth:               Max pixel width supported by this mixer
  * @maxblendstages:         Max number of blend-stages supported
  * @blendstage_base:        Blend-stage register base offset
- * @gc: gamma correction block
  */
 struct dpu_lm_sub_blks {
        u32 maxwidth;
        u32 maxblendstages;
        u32 blendstage_base[MAX_BLOCKS];
-       struct dpu_pp_blk gc;
 };
 
 /**
  * struct dpu_dspp_sub_blks: Information of DSPP block
- * @gc : gamma correction block
  * @pcc: pixel color correction block
  */
 struct dpu_dspp_sub_blks {
-       struct dpu_pp_blk gc;
        struct dpu_pp_blk pcc;
 };
 
@@ -554,7 +527,7 @@ struct dpu_sspp_cfg {
  * @base               register offset of this block
  * @features           bit mask identifying sub-blocks/features
  * @sblk:              LM Sub-blocks information
- * @pingpong:          ID of connected PingPong, PINGPONG_MAX if unsupported
+ * @pingpong:          ID of connected PingPong, PINGPONG_NONE if unsupported
  * @lm_pair_mask:      Bitmask of LMs that can be controlled by same CTL
  */
 struct dpu_lm_cfg {
@@ -628,6 +601,7 @@ struct dpu_dsc_cfg {
  * @prog_fetch_lines_worst_case        Worst case latency num lines needed to prefetch
  * @intr_underrun:     index for INTF underrun interrupt
  * @intr_vsync:                index for INTF VSYNC interrupt
+ * @intr_tear_rd_ptr:  Index for INTF TEAR_RD_PTR interrupt
  */
 struct dpu_intf_cfg  {
        DPU_HW_BLK_INFO;
@@ -636,6 +610,7 @@ struct dpu_intf_cfg  {
        u32 prog_fetch_lines_worst_case;
        s32 intr_underrun;
        s32 intr_vsync;
+       s32 intr_tear_rd_ptr;
 };
 
 /**
@@ -720,21 +695,6 @@ struct dpu_vbif_cfg {
        u32 memtype_count;
        u32 memtype[MAX_XIN_COUNT];
 };
-/**
- * struct dpu_reg_dma_cfg - information of lut dma blocks
- * @id                 enum identifying this block
- * @base               register offset of this block
- * @features           bit mask identifying sub-blocks/features
- * @version            version of lutdma hw block
- * @trigger_sel_off    offset to trigger select registers of lutdma
- */
-struct dpu_reg_dma_cfg {
-       DPU_HW_BLK_INFO;
-       u32 version;
-       u32 trigger_sel_off;
-       u32 xin_id;
-       enum dpu_clk_ctrl_type clk_ctrl;
-};
 
 /**
  * Define CDP use cases
@@ -850,9 +810,6 @@ struct dpu_mdss_cfg {
        u32 wb_count;
        const struct dpu_wb_cfg *wb;
 
-       u32 reg_dma_count;
-       const struct dpu_reg_dma_cfg *dma_cfg;
-
        u32 ad_count;
 
        u32 dspp_count;
@@ -875,7 +832,9 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg;
 extern const struct dpu_mdss_cfg dpu_sm8250_cfg;
 extern const struct dpu_mdss_cfg dpu_sc7180_cfg;
 extern const struct dpu_mdss_cfg dpu_sm6115_cfg;
+extern const struct dpu_mdss_cfg dpu_sm6350_cfg;
 extern const struct dpu_mdss_cfg dpu_qcm2290_cfg;
+extern const struct dpu_mdss_cfg dpu_sm6375_cfg;
 extern const struct dpu_mdss_cfg dpu_sm8350_cfg;
 extern const struct dpu_mdss_cfg dpu_sc7280_cfg;
 extern const struct dpu_mdss_cfg dpu_sc8280xp_cfg;
index bbdc95ce374a754cfa64c4d8603bb2ddd3bde0c1..c278fb9d2b5b5bc1b69f13fe9a03c74119ef4128 100644 (file)
@@ -53,23 +53,6 @@ static const u32 fetch_tbl[SSPP_MAX] = {CTL_INVALID_BIT, 16, 17, 18, 19,
        CTL_INVALID_BIT, CTL_INVALID_BIT, CTL_INVALID_BIT, CTL_INVALID_BIT, 0,
        1, 2, 3, CTL_INVALID_BIT, CTL_INVALID_BIT};
 
-static const struct dpu_ctl_cfg *_ctl_offset(enum dpu_ctl ctl,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->ctl_count; i++) {
-               if (ctl == m->ctl[i].id) {
-                       b->blk_addr = addr + m->ctl[i].base;
-                       b->log_mask = DPU_DBG_MASK_CTL;
-                       return &m->ctl[i];
-               }
-       }
-       return ERR_PTR(-ENOMEM);
-}
-
 static int _mixer_stages(const struct dpu_lm_cfg *mixer, int count,
                enum dpu_lm lm)
 {
@@ -117,6 +100,10 @@ static inline void dpu_hw_ctl_clear_pending_flush(struct dpu_hw_ctl *ctx)
        trace_dpu_hw_ctl_clear_pending_flush(ctx->pending_flush_mask,
                                     dpu_hw_ctl_get_flush_register(ctx));
        ctx->pending_flush_mask = 0x0;
+       ctx->pending_intf_flush_mask = 0;
+       ctx->pending_wb_flush_mask = 0;
+       ctx->pending_merge_3d_flush_mask = 0;
+       ctx->pending_dsc_flush_mask = 0;
 
        memset(ctx->pending_dspp_flush_mask, 0,
                sizeof(ctx->pending_dspp_flush_mask));
@@ -156,6 +143,11 @@ static inline void dpu_hw_ctl_trigger_flush_v1(struct dpu_hw_ctl *ctx)
                                CTL_DSPP_n_FLUSH(dspp - DSPP_0),
                                ctx->pending_dspp_flush_mask[dspp - DSPP_0]);
                }
+
+       if (ctx->pending_flush_mask & BIT(DSC_IDX))
+               DPU_REG_WRITE(&ctx->hw, CTL_DSC_FLUSH,
+                             ctx->pending_dsc_flush_mask);
+
        DPU_REG_WRITE(&ctx->hw, CTL_FLUSH, ctx->pending_flush_mask);
 }
 
@@ -302,6 +294,13 @@ static void dpu_hw_ctl_update_pending_flush_merge_3d_v1(struct dpu_hw_ctl *ctx,
        ctx->pending_flush_mask |= BIT(MERGE_3D_IDX);
 }
 
+static void dpu_hw_ctl_update_pending_flush_dsc_v1(struct dpu_hw_ctl *ctx,
+                                                  enum dpu_dsc dsc_num)
+{
+       ctx->pending_dsc_flush_mask |= BIT(dsc_num - DSC_0);
+       ctx->pending_flush_mask |= BIT(DSC_IDX);
+}
+
 static void dpu_hw_ctl_update_pending_flush_dspp(struct dpu_hw_ctl *ctx,
        enum dpu_dspp dspp, u32 dspp_sub_blk)
 {
@@ -330,15 +329,9 @@ static void dpu_hw_ctl_update_pending_flush_dspp_sub_blocks(
                return;
 
        switch (dspp_sub_blk) {
-       case DPU_DSPP_IGC:
-               ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(2);
-               break;
        case DPU_DSPP_PCC:
                ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(4);
                break;
-       case DPU_DSPP_GC:
-               ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(5);
-               break;
        default:
                return;
        }
@@ -519,9 +512,6 @@ static void dpu_hw_ctl_intf_cfg_v1(struct dpu_hw_ctl *ctx,
        if ((test_bit(DPU_CTL_VM_CFG, &ctx->caps->features)))
                mode_sel = CTL_DEFAULT_GROUP_ID  << 28;
 
-       if (cfg->dsc)
-               DPU_REG_WRITE(&ctx->hw, CTL_DSC_FLUSH, cfg->dsc);
-
        if (cfg->intf_mode_sel == DPU_CTL_MODE_SEL_CMD)
                mode_sel |= BIT(17);
 
@@ -541,10 +531,9 @@ static void dpu_hw_ctl_intf_cfg_v1(struct dpu_hw_ctl *ctx,
        if (cfg->merge_3d)
                DPU_REG_WRITE(c, CTL_MERGE_3D_ACTIVE,
                              BIT(cfg->merge_3d - MERGE_3D_0));
-       if (cfg->dsc) {
-               DPU_REG_WRITE(&ctx->hw, CTL_FLUSH, DSC_IDX);
+
+       if (cfg->dsc)
                DPU_REG_WRITE(c, CTL_DSC_ACTIVE, cfg->dsc);
-       }
 }
 
 static void dpu_hw_ctl_intf_cfg(struct dpu_hw_ctl *ctx,
@@ -587,6 +576,7 @@ static void dpu_hw_ctl_reset_intf_cfg_v1(struct dpu_hw_ctl *ctx,
        u32 intf_active = 0;
        u32 wb_active = 0;
        u32 merge3d_active = 0;
+       u32 dsc_active;
 
        /*
         * This API resets each portion of the CTL path namely,
@@ -616,6 +606,12 @@ static void dpu_hw_ctl_reset_intf_cfg_v1(struct dpu_hw_ctl *ctx,
                wb_active &= ~BIT(cfg->wb - WB_0);
                DPU_REG_WRITE(c, CTL_WB_ACTIVE, wb_active);
        }
+
+       if (cfg->dsc) {
+               dsc_active = DPU_REG_READ(c, CTL_DSC_ACTIVE);
+               dsc_active &= ~cfg->dsc;
+               DPU_REG_WRITE(c, CTL_DSC_ACTIVE, dsc_active);
+       }
 }
 
 static void dpu_hw_ctl_set_fetch_pipe_active(struct dpu_hw_ctl *ctx,
@@ -647,6 +643,8 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
                ops->update_pending_flush_merge_3d =
                        dpu_hw_ctl_update_pending_flush_merge_3d_v1;
                ops->update_pending_flush_wb = dpu_hw_ctl_update_pending_flush_wb_v1;
+               ops->update_pending_flush_dsc =
+                       dpu_hw_ctl_update_pending_flush_dsc_v1;
        } else {
                ops->trigger_flush = dpu_hw_ctl_trigger_flush;
                ops->setup_intf_cfg = dpu_hw_ctl_intf_cfg;
@@ -676,29 +674,25 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
                ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;
 };
 
-struct dpu_hw_ctl *dpu_hw_ctl_init(enum dpu_ctl idx,
+struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
                void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+               u32 mixer_count,
+               const struct dpu_lm_cfg *mixer)
 {
        struct dpu_hw_ctl *c;
-       const struct dpu_ctl_cfg *cfg;
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _ctl_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               pr_err("failed to create dpu_hw_ctl %d\n", idx);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_CTL;
 
        c->caps = cfg;
        _setup_ctl_ops(&c->ops, c->caps->features);
-       c->idx = idx;
-       c->mixer_count = m->mixer_count;
-       c->mixer_hw_caps = m->mixer;
+       c->idx = cfg->id;
+       c->mixer_count = mixer_count;
+       c->mixer_hw_caps = mixer;
 
        return c;
 }
index 78611a8316974262756ec281d83ba0ebb36a5813..1c242298ff2ee0d47e2bc90f2c73259f79f7b746 100644 (file)
@@ -157,6 +157,15 @@ struct dpu_hw_ctl_ops {
        void (*update_pending_flush_dspp)(struct dpu_hw_ctl *ctx,
                enum dpu_dspp blk, u32 dspp_sub_blk);
 
+       /**
+        * OR in the given flushbits to the cached pending_(dsc_)flush_mask
+        * No effect on hardware
+        * @ctx: ctl path ctx pointer
+        * @blk: interface block index
+        */
+       void (*update_pending_flush_dsc)(struct dpu_hw_ctl *ctx,
+                                        enum dpu_dsc blk);
+
        /**
         * Write the value of the pending_flush_mask to hardware
         * @ctx       : ctl path ctx pointer
@@ -229,6 +238,7 @@ struct dpu_hw_ctl_ops {
  * @pending_flush_mask: storage for pending ctl_flush managed via ops
  * @pending_intf_flush_mask: pending INTF flush
  * @pending_wb_flush_mask: pending WB flush
+ * @pending_dsc_flush_mask: pending DSC flush
  * @ops: operation list
  */
 struct dpu_hw_ctl {
@@ -245,6 +255,7 @@ struct dpu_hw_ctl {
        u32 pending_wb_flush_mask;
        u32 pending_merge_3d_flush_mask;
        u32 pending_dspp_flush_mask[DSPP_MAX - DSPP_0];
+       u32 pending_dsc_flush_mask;
 
        /* ops */
        struct dpu_hw_ctl_ops ops;
@@ -261,15 +272,17 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
 }
 
 /**
- * dpu_hw_ctl_init(): Initializes the ctl_path hw driver object.
- * should be called before accessing every ctl path registers.
- * @idx:  ctl_path index for which driver object is required
+ * dpu_hw_ctl_init() - Initializes the ctl_path hw driver object.
+ * Should be called before accessing any ctl_path register.
+ * @cfg:  ctl_path catalog entry for which driver object is required
  * @addr: mapped register io address of MDP
- * @m :   pointer to mdss catalog data
+ * @mixer_count: Number of mixers in @mixer
+ * @mixer: Pointer to an array of Layer Mixers defined in the catalog
  */
-struct dpu_hw_ctl *dpu_hw_ctl_init(enum dpu_ctl idx,
+struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
                void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+               u32 mixer_count,
+               const struct dpu_lm_cfg *mixer);
 
 /**
  * dpu_hw_ctl_destroy(): Destroys ctl driver context
index 4e1396575e6aaaed2d0a25644f1d5d5c399bb504..64847912a20ff55a76aa06997c4d08b428b628aa 100644 (file)
@@ -154,7 +154,6 @@ static void dpu_hw_dsc_config_thresh(struct dpu_hw_dsc *hw_dsc,
 
 static void dpu_hw_dsc_bind_pingpong_blk(
                struct dpu_hw_dsc *hw_dsc,
-               bool enable,
                const enum dpu_pingpong pp)
 {
        struct dpu_hw_blk_reg_map *c = &hw_dsc->hw;
@@ -163,36 +162,19 @@ static void dpu_hw_dsc_bind_pingpong_blk(
 
        dsc_ctl_offset = DSC_CTL(hw_dsc->idx);
 
-       if (enable)
+       if (pp)
                mux_cfg = (pp - PINGPONG_0) & 0x7;
 
-       DRM_DEBUG_KMS("%s dsc:%d %s pp:%d\n",
-                       enable ? "Binding" : "Unbinding",
-                       hw_dsc->idx - DSC_0,
-                       enable ? "to" : "from",
-                       pp - PINGPONG_0);
+       if (pp)
+               DRM_DEBUG_KMS("Binding dsc:%d to pp:%d\n",
+                             hw_dsc->idx - DSC_0, pp - PINGPONG_0);
+       else
+               DRM_DEBUG_KMS("Unbinding dsc:%d from any pp\n",
+                             hw_dsc->idx - DSC_0);
 
        DPU_REG_WRITE(c, dsc_ctl_offset, mux_cfg);
 }
 
-static const struct dpu_dsc_cfg *_dsc_offset(enum dpu_dsc dsc,
-                                      const struct dpu_mdss_cfg *m,
-                                      void __iomem *addr,
-                                      struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->dsc_count; i++) {
-               if (dsc == m->dsc[i].id) {
-                       b->blk_addr = addr + m->dsc[i].base;
-                       b->log_mask = DPU_DBG_MASK_DSC;
-                       return &m->dsc[i];
-               }
-       }
-
-       return NULL;
-}
-
 static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
                           unsigned long cap)
 {
@@ -203,23 +185,19 @@ static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
                ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk;
 };
 
-struct dpu_hw_dsc *dpu_hw_dsc_init(enum dpu_dsc idx, void __iomem *addr,
-                                  const struct dpu_mdss_cfg *m)
+struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
+                                  void __iomem *addr)
 {
        struct dpu_hw_dsc *c;
-       const struct dpu_dsc_cfg *cfg;
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _dsc_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_DSC;
 
-       c->idx = idx;
+       c->idx = cfg->id;
        c->caps = cfg;
        _setup_dsc_ops(&c->ops, c->caps->features);
 
index ae9b5db53d7f648056a58e17dc1b240dc65d197a..138080aed9dd701d08f9461ee44823618d8ea640 100644 (file)
@@ -44,7 +44,6 @@ struct dpu_hw_dsc_ops {
                                  struct drm_dsc_config *dsc);
 
        void (*dsc_bind_pingpong_blk)(struct dpu_hw_dsc *hw_dsc,
-                                 bool enable,
                                  enum dpu_pingpong pp);
 };
 
@@ -61,14 +60,13 @@ struct dpu_hw_dsc {
 };
 
 /**
- * dpu_hw_dsc_init - initializes the dsc block for the passed dsc idx.
- * @idx:  DSC index for which driver object is required
+ * dpu_hw_dsc_init() - Initializes the DSC hw driver object.
+ * @cfg:  DSC catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
- * @m:    Pointer to mdss catalog data
- * Returns: Error code or allocated dpu_hw_dsc context
+ * Return: Error code or allocated dpu_hw_dsc context
  */
-struct dpu_hw_dsc *dpu_hw_dsc_init(enum dpu_dsc idx, void __iomem *addr,
-                                  const struct dpu_mdss_cfg *m);
+struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_dsc_destroy - destroys dsc driver context
index 8ab5ace34a2d5b7d0b372e7bfc46b7cd680b0e18..9419b2209af88ef500ae68552b5ca53f50778c5a 100644 (file)
@@ -68,49 +68,23 @@ static void _setup_dspp_ops(struct dpu_hw_dspp *c,
                c->ops.setup_pcc = dpu_setup_dspp_pcc;
 }
 
-static const struct dpu_dspp_cfg *_dspp_offset(enum dpu_dspp dspp,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       if (!m || !addr || !b)
-               return ERR_PTR(-EINVAL);
-
-       for (i = 0; i < m->dspp_count; i++) {
-               if (dspp == m->dspp[i].id) {
-                       b->blk_addr = addr + m->dspp[i].base;
-                       b->log_mask = DPU_DBG_MASK_DSPP;
-                       return &m->dspp[i];
-               }
-       }
-
-       return ERR_PTR(-EINVAL);
-}
-
-struct dpu_hw_dspp *dpu_hw_dspp_init(enum dpu_dspp idx,
-                       void __iomem *addr,
-                       const struct dpu_mdss_cfg *m)
+struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
+                       void __iomem *addr)
 {
        struct dpu_hw_dspp *c;
-       const struct dpu_dspp_cfg *cfg;
 
-       if (!addr || !m)
+       if (!addr)
                return ERR_PTR(-EINVAL);
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _dspp_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_DSPP;
 
        /* Assign ops */
-       c->idx = idx;
+       c->idx = cfg->id;
        c->cap = cfg;
        _setup_dspp_ops(c, c->cap->features);
 
index 05ecfdfac93b7d146aeef1b84653cfa3be5ab773..bea96568133011109ab6d5bf3dd1ec4216e62ab1 100644 (file)
@@ -79,14 +79,14 @@ static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
 }
 
 /**
- * dpu_hw_dspp_init - initializes the dspp hw driver object.
- * should be called once before accessing every dspp.
- * @idx:  DSPP index for which driver object is required
+ * dpu_hw_dspp_init() - Initializes the DSPP hw driver object.
+ * should be called once before accessing every DSPP.
+ * @cfg:  DSPP catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
- * @Return: pointer to structure or ERR_PTR
+ * Return: pointer to structure or ERR_PTR
  */
-struct dpu_hw_dspp *dpu_hw_dspp_init(enum dpu_dspp idx,
-       void __iomem *addr, const struct dpu_mdss_cfg *m);
+struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
+       void __iomem *addr);
 
 /**
  * dpu_hw_dspp_destroy(): Destroys DSPP driver context
index 53326f25e40ef10b22bb09da70b829d4defa0553..5e2d68ebb113e06f6eb4cc164d5bf904ccdb16c1 100644 (file)
 
 /*
  * Register offsets in MDSS register file for the interrupt registers
- * w.r.t. to the MDP base
+ * w.r.t. the MDP base
  */
-#define MDP_SSPP_TOP0_OFF              0x0
-#define MDP_INTF_0_OFF                 0x6A000
-#define MDP_INTF_1_OFF                 0x6A800
-#define MDP_INTF_2_OFF                 0x6B000
-#define MDP_INTF_3_OFF                 0x6B800
-#define MDP_INTF_4_OFF                 0x6C000
-#define MDP_INTF_5_OFF                 0x6C800
-#define MDP_AD4_0_OFF                  0x7C000
-#define MDP_AD4_1_OFF                  0x7D000
-#define MDP_AD4_INTR_EN_OFF            0x41c
-#define MDP_AD4_INTR_CLEAR_OFF         0x424
-#define MDP_AD4_INTR_STATUS_OFF                0x420
-#define MDP_INTF_0_OFF_REV_7xxx             0x34000
-#define MDP_INTF_1_OFF_REV_7xxx             0x35000
-#define MDP_INTF_2_OFF_REV_7xxx             0x36000
-#define MDP_INTF_3_OFF_REV_7xxx             0x37000
-#define MDP_INTF_4_OFF_REV_7xxx             0x38000
-#define MDP_INTF_5_OFF_REV_7xxx             0x39000
-#define MDP_INTF_6_OFF_REV_7xxx             0x3a000
-#define MDP_INTF_7_OFF_REV_7xxx             0x3b000
-#define MDP_INTF_8_OFF_REV_7xxx             0x3c000
+#define MDP_INTF_OFF(intf)                             (0x6A000 + 0x800 * (intf))
+#define MDP_INTF_INTR_EN(intf)                         (MDP_INTF_OFF(intf) + 0x1c0)
+#define MDP_INTF_INTR_STATUS(intf)                     (MDP_INTF_OFF(intf) + 0x1c4)
+#define MDP_INTF_INTR_CLEAR(intf)                      (MDP_INTF_OFF(intf) + 0x1c8)
+#define MDP_INTF_TEAR_OFF(intf)                                (0x6D700 + 0x100 * (intf))
+#define MDP_INTF_INTR_TEAR_EN(intf)                    (MDP_INTF_TEAR_OFF(intf) + 0x000)
+#define MDP_INTF_INTR_TEAR_STATUS(intf)                        (MDP_INTF_TEAR_OFF(intf) + 0x004)
+#define MDP_INTF_INTR_TEAR_CLEAR(intf)                 (MDP_INTF_TEAR_OFF(intf) + 0x008)
+#define MDP_AD4_OFF(ad4)                               (0x7C000 + 0x1000 * (ad4))
+#define MDP_AD4_INTR_EN_OFF(ad4)                       (MDP_AD4_OFF(ad4) + 0x41c)
+#define MDP_AD4_INTR_CLEAR_OFF(ad4)                    (MDP_AD4_OFF(ad4) + 0x424)
+#define MDP_AD4_INTR_STATUS_OFF(ad4)                   (MDP_AD4_OFF(ad4) + 0x420)
+#define MDP_INTF_REV_7xxx_OFF(intf)                    (0x34000 + 0x1000 * (intf))
+#define MDP_INTF_REV_7xxx_INTR_EN(intf)                        (MDP_INTF_REV_7xxx_OFF(intf) + 0x1c0)
+#define MDP_INTF_REV_7xxx_INTR_STATUS(intf)            (MDP_INTF_REV_7xxx_OFF(intf) + 0x1c4)
+#define MDP_INTF_REV_7xxx_INTR_CLEAR(intf)             (MDP_INTF_REV_7xxx_OFF(intf) + 0x1c8)
+#define MDP_INTF_REV_7xxx_TEAR_OFF(intf)               (0x34800 + 0x1000 * (intf))
+#define MDP_INTF_REV_7xxx_INTR_TEAR_EN(intf)           (MDP_INTF_REV_7xxx_TEAR_OFF(intf) + 0x000)
+#define MDP_INTF_REV_7xxx_INTR_TEAR_STATUS(intf)       (MDP_INTF_REV_7xxx_TEAR_OFF(intf) + 0x004)
+#define MDP_INTF_REV_7xxx_INTR_TEAR_CLEAR(intf)                (MDP_INTF_REV_7xxx_TEAR_OFF(intf) + 0x008)
 
 /**
  * struct dpu_intr_reg - array of DPU register sets
@@ -58,104 +57,124 @@ struct dpu_intr_reg {
  */
 static const struct dpu_intr_reg dpu_intr_set[] = {
        [MDP_SSPP_TOP0_INTR] = {
-               MDP_SSPP_TOP0_OFF+INTR_CLEAR,
-               MDP_SSPP_TOP0_OFF+INTR_EN,
-               MDP_SSPP_TOP0_OFF+INTR_STATUS
+               INTR_CLEAR,
+               INTR_EN,
+               INTR_STATUS
        },
        [MDP_SSPP_TOP0_INTR2] = {
-               MDP_SSPP_TOP0_OFF+INTR2_CLEAR,
-               MDP_SSPP_TOP0_OFF+INTR2_EN,
-               MDP_SSPP_TOP0_OFF+INTR2_STATUS
+               INTR2_CLEAR,
+               INTR2_EN,
+               INTR2_STATUS
        },
        [MDP_SSPP_TOP0_HIST_INTR] = {
-               MDP_SSPP_TOP0_OFF+HIST_INTR_CLEAR,
-               MDP_SSPP_TOP0_OFF+HIST_INTR_EN,
-               MDP_SSPP_TOP0_OFF+HIST_INTR_STATUS
+               HIST_INTR_CLEAR,
+               HIST_INTR_EN,
+               HIST_INTR_STATUS
        },
        [MDP_INTF0_INTR] = {
-               MDP_INTF_0_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_0_OFF+INTF_INTR_EN,
-               MDP_INTF_0_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(0),
+               MDP_INTF_INTR_EN(0),
+               MDP_INTF_INTR_STATUS(0)
        },
        [MDP_INTF1_INTR] = {
-               MDP_INTF_1_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_1_OFF+INTF_INTR_EN,
-               MDP_INTF_1_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(1),
+               MDP_INTF_INTR_EN(1),
+               MDP_INTF_INTR_STATUS(1)
        },
        [MDP_INTF2_INTR] = {
-               MDP_INTF_2_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_2_OFF+INTF_INTR_EN,
-               MDP_INTF_2_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(2),
+               MDP_INTF_INTR_EN(2),
+               MDP_INTF_INTR_STATUS(2)
        },
        [MDP_INTF3_INTR] = {
-               MDP_INTF_3_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_3_OFF+INTF_INTR_EN,
-               MDP_INTF_3_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(3),
+               MDP_INTF_INTR_EN(3),
+               MDP_INTF_INTR_STATUS(3)
        },
        [MDP_INTF4_INTR] = {
-               MDP_INTF_4_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_4_OFF+INTF_INTR_EN,
-               MDP_INTF_4_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(4),
+               MDP_INTF_INTR_EN(4),
+               MDP_INTF_INTR_STATUS(4)
        },
        [MDP_INTF5_INTR] = {
-               MDP_INTF_5_OFF+INTF_INTR_CLEAR,
-               MDP_INTF_5_OFF+INTF_INTR_EN,
-               MDP_INTF_5_OFF+INTF_INTR_STATUS
+               MDP_INTF_INTR_CLEAR(5),
+               MDP_INTF_INTR_EN(5),
+               MDP_INTF_INTR_STATUS(5)
+       },
+       [MDP_INTF1_TEAR_INTR] = {
+               MDP_INTF_INTR_TEAR_CLEAR(1),
+               MDP_INTF_INTR_TEAR_EN(1),
+               MDP_INTF_INTR_TEAR_STATUS(1)
+       },
+       [MDP_INTF2_TEAR_INTR] = {
+               MDP_INTF_INTR_TEAR_CLEAR(2),
+               MDP_INTF_INTR_TEAR_EN(2),
+               MDP_INTF_INTR_TEAR_STATUS(2)
        },
        [MDP_AD4_0_INTR] = {
-               MDP_AD4_0_OFF + MDP_AD4_INTR_CLEAR_OFF,
-               MDP_AD4_0_OFF + MDP_AD4_INTR_EN_OFF,
-               MDP_AD4_0_OFF + MDP_AD4_INTR_STATUS_OFF,
+               MDP_AD4_INTR_CLEAR_OFF(0),
+               MDP_AD4_INTR_EN_OFF(0),
+               MDP_AD4_INTR_STATUS_OFF(0),
        },
        [MDP_AD4_1_INTR] = {
-               MDP_AD4_1_OFF + MDP_AD4_INTR_CLEAR_OFF,
-               MDP_AD4_1_OFF + MDP_AD4_INTR_EN_OFF,
-               MDP_AD4_1_OFF + MDP_AD4_INTR_STATUS_OFF,
+               MDP_AD4_INTR_CLEAR_OFF(1),
+               MDP_AD4_INTR_EN_OFF(1),
+               MDP_AD4_INTR_STATUS_OFF(1),
        },
        [MDP_INTF0_7xxx_INTR] = {
-               MDP_INTF_0_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_0_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_0_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(0),
+               MDP_INTF_REV_7xxx_INTR_EN(0),
+               MDP_INTF_REV_7xxx_INTR_STATUS(0)
        },
        [MDP_INTF1_7xxx_INTR] = {
-               MDP_INTF_1_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_1_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_1_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(1),
+               MDP_INTF_REV_7xxx_INTR_EN(1),
+               MDP_INTF_REV_7xxx_INTR_STATUS(1)
+       },
+       [MDP_INTF1_7xxx_TEAR_INTR] = {
+               MDP_INTF_REV_7xxx_INTR_TEAR_CLEAR(1),
+               MDP_INTF_REV_7xxx_INTR_TEAR_EN(1),
+               MDP_INTF_REV_7xxx_INTR_TEAR_STATUS(1)
        },
        [MDP_INTF2_7xxx_INTR] = {
-               MDP_INTF_2_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_2_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_2_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(2),
+               MDP_INTF_REV_7xxx_INTR_EN(2),
+               MDP_INTF_REV_7xxx_INTR_STATUS(2)
+       },
+       [MDP_INTF2_7xxx_TEAR_INTR] = {
+               MDP_INTF_REV_7xxx_INTR_TEAR_CLEAR(2),
+               MDP_INTF_REV_7xxx_INTR_TEAR_EN(2),
+               MDP_INTF_REV_7xxx_INTR_TEAR_STATUS(2)
        },
        [MDP_INTF3_7xxx_INTR] = {
-               MDP_INTF_3_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_3_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_3_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(3),
+               MDP_INTF_REV_7xxx_INTR_EN(3),
+               MDP_INTF_REV_7xxx_INTR_STATUS(3)
        },
        [MDP_INTF4_7xxx_INTR] = {
-               MDP_INTF_4_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_4_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_4_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(4),
+               MDP_INTF_REV_7xxx_INTR_EN(4),
+               MDP_INTF_REV_7xxx_INTR_STATUS(4)
        },
        [MDP_INTF5_7xxx_INTR] = {
-               MDP_INTF_5_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_5_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_5_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(5),
+               MDP_INTF_REV_7xxx_INTR_EN(5),
+               MDP_INTF_REV_7xxx_INTR_STATUS(5)
        },
        [MDP_INTF6_7xxx_INTR] = {
-               MDP_INTF_6_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_6_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_6_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(6),
+               MDP_INTF_REV_7xxx_INTR_EN(6),
+               MDP_INTF_REV_7xxx_INTR_STATUS(6)
        },
        [MDP_INTF7_7xxx_INTR] = {
-               MDP_INTF_7_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_7_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_7_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(7),
+               MDP_INTF_REV_7xxx_INTR_EN(7),
+               MDP_INTF_REV_7xxx_INTR_STATUS(7)
        },
        [MDP_INTF8_7xxx_INTR] = {
-               MDP_INTF_8_OFF_REV_7xxx+INTF_INTR_CLEAR,
-               MDP_INTF_8_OFF_REV_7xxx+INTF_INTR_EN,
-               MDP_INTF_8_OFF_REV_7xxx+INTF_INTR_STATUS
+               MDP_INTF_REV_7xxx_INTR_CLEAR(8),
+               MDP_INTF_REV_7xxx_INTR_EN(8),
+               MDP_INTF_REV_7xxx_INTR_STATUS(8)
        },
 };
 
index 425465011c807f1caebc51428833166de3e47220..1f2dabc54c2299a7b982ff6b14ccffb55315e008 100644 (file)
@@ -23,11 +23,15 @@ enum dpu_hw_intr_reg {
        MDP_INTF3_INTR,
        MDP_INTF4_INTR,
        MDP_INTF5_INTR,
+       MDP_INTF1_TEAR_INTR,
+       MDP_INTF2_TEAR_INTR,
        MDP_AD4_0_INTR,
        MDP_AD4_1_INTR,
        MDP_INTF0_7xxx_INTR,
        MDP_INTF1_7xxx_INTR,
+       MDP_INTF1_7xxx_TEAR_INTR,
        MDP_INTF2_7xxx_INTR,
+       MDP_INTF2_7xxx_TEAR_INTR,
        MDP_INTF3_7xxx_INTR,
        MDP_INTF4_7xxx_INTR,
        MDP_INTF5_7xxx_INTR,
@@ -67,7 +71,7 @@ struct dpu_hw_intr {
 /**
  * dpu_hw_intr_init(): Initializes the interrupts hw object
  * @addr: mapped register io address of MDP
- * @m :   pointer to mdss catalog data
+ * @m:    pointer to MDSS catalog data
  */
 struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
                const struct dpu_mdss_cfg *m);
index 84ee2efa9c664e04c89e3d898cd11914c99cc275..530f82e34c1ec51e511df0757df40391c82cd3d6 100644 (file)
@@ -8,6 +8,9 @@
 #include "dpu_hw_catalog.h"
 #include "dpu_hw_intf.h"
 #include "dpu_kms.h"
+#include "dpu_trace.h"
+
+#include <linux/iopoll.h>
 
 #define INTF_TIMING_ENGINE_EN           0x000
 #define INTF_CONFIG                     0x004
 #define INTF_CONFIG2                    0x060
 #define INTF_DISPLAY_DATA_HCTL          0x064
 #define INTF_ACTIVE_DATA_HCTL           0x068
+
+#define INTF_DSI_CMD_MODE_TRIGGER_EN    0x084
+#define INTF_PANEL_FORMAT               0x090
+
 #define INTF_FRAME_LINE_COUNT_EN        0x0A8
 #define INTF_FRAME_COUNT                0x0AC
-#define   INTF_LINE_COUNT               0x0B0
-
-#define   INTF_DEFLICKER_CONFIG         0x0F0
-#define   INTF_DEFLICKER_STRNG_COEFF    0x0F4
-#define   INTF_DEFLICKER_WEAK_COEFF     0x0F8
-
-#define   INTF_DSI_CMD_MODE_TRIGGER_EN  0x084
-#define   INTF_PANEL_FORMAT             0x090
-#define   INTF_TPG_ENABLE               0x100
-#define   INTF_TPG_MAIN_CONTROL         0x104
-#define   INTF_TPG_VIDEO_CONFIG         0x108
-#define   INTF_TPG_COMPONENT_LIMITS     0x10C
-#define   INTF_TPG_RECTANGLE            0x110
-#define   INTF_TPG_INITIAL_VALUE        0x114
-#define   INTF_TPG_BLK_WHITE_PATTERN_FRAMES   0x118
-#define   INTF_TPG_RGB_MAPPING          0x11C
-#define   INTF_PROG_FETCH_START         0x170
-#define   INTF_PROG_ROT_START           0x174
-
-#define   INTF_FRAME_LINE_COUNT_EN      0x0A8
-#define   INTF_FRAME_COUNT              0x0AC
-#define   INTF_LINE_COUNT               0x0B0
-
-#define   INTF_MUX                      0x25C
-#define   INTF_STATUS                   0x26C
+#define INTF_LINE_COUNT                 0x0B0
+
+#define INTF_DEFLICKER_CONFIG           0x0F0
+#define INTF_DEFLICKER_STRNG_COEFF      0x0F4
+#define INTF_DEFLICKER_WEAK_COEFF       0x0F8
+
+#define INTF_TPG_ENABLE                 0x100
+#define INTF_TPG_MAIN_CONTROL           0x104
+#define INTF_TPG_VIDEO_CONFIG           0x108
+#define INTF_TPG_COMPONENT_LIMITS       0x10C
+#define INTF_TPG_RECTANGLE              0x110
+#define INTF_TPG_INITIAL_VALUE          0x114
+#define INTF_TPG_BLK_WHITE_PATTERN_FRAMES 0x118
+#define INTF_TPG_RGB_MAPPING            0x11C
+#define INTF_PROG_FETCH_START           0x170
+#define INTF_PROG_ROT_START             0x174
+
+#define INTF_MISR_CTRL                  0x180
+#define INTF_MISR_SIGNATURE             0x184
+
+#define INTF_MUX                        0x25C
+#define INTF_STATUS                     0x26C
+#define INTF_AVR_CONTROL                0x270
+#define INTF_AVR_MODE                   0x274
+#define INTF_AVR_TRIGGER                0x278
+#define INTF_AVR_VTOTAL                 0x27C
+#define INTF_TEAR_MDP_VSYNC_SEL         0x280
+#define INTF_TEAR_TEAR_CHECK_EN         0x284
+#define INTF_TEAR_SYNC_CONFIG_VSYNC     0x288
+#define INTF_TEAR_SYNC_CONFIG_HEIGHT    0x28C
+#define INTF_TEAR_SYNC_WRCOUNT          0x290
+#define INTF_TEAR_VSYNC_INIT_VAL        0x294
+#define INTF_TEAR_INT_COUNT_VAL         0x298
+#define INTF_TEAR_SYNC_THRESH           0x29C
+#define INTF_TEAR_START_POS             0x2A0
+#define INTF_TEAR_RD_PTR_IRQ            0x2A4
+#define INTF_TEAR_WR_PTR_IRQ            0x2A8
+#define INTF_TEAR_OUT_LINE_COUNT        0x2AC
+#define INTF_TEAR_LINE_COUNT            0x2B0
+#define INTF_TEAR_AUTOREFRESH_CONFIG    0x2B4
 
 #define INTF_CFG_ACTIVE_H_EN   BIT(29)
 #define INTF_CFG_ACTIVE_V_EN   BIT(30)
 #define INTF_CFG2_DATABUS_WIDEN        BIT(0)
 #define INTF_CFG2_DATA_HCTL_EN BIT(4)
 
-#define INTF_MISR_CTRL                 0x180
-#define INTF_MISR_SIGNATURE            0x184
-
-static const struct dpu_intf_cfg *_intf_offset(enum dpu_intf intf,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->intf_count; i++) {
-               if ((intf == m->intf[i].id) &&
-               (m->intf[i].type != INTF_NONE)) {
-                       b->blk_addr = addr + m->intf[i].base;
-                       b->log_mask = DPU_DBG_MASK_INTF;
-                       return &m->intf[i];
-               }
-       }
-
-       return ERR_PTR(-EINVAL);
-}
 
 static void dpu_hw_intf_setup_timing_engine(struct dpu_hw_intf *ctx,
                const struct intf_timing_params *p,
@@ -104,7 +105,7 @@ static void dpu_hw_intf_setup_timing_engine(struct dpu_hw_intf *ctx,
        u32 active_h_start, active_h_end;
        u32 active_v_start, active_v_end;
        u32 active_hctl, display_hctl, hsync_ctl;
-       u32 polarity_ctl, den_polarity, hsync_polarity, vsync_polarity;
+       u32 polarity_ctl, den_polarity;
        u32 panel_format;
        u32 intf_cfg, intf_cfg2 = 0;
        u32 display_data_hctl = 0, active_data_hctl = 0;
@@ -191,19 +192,9 @@ static void dpu_hw_intf_setup_timing_engine(struct dpu_hw_intf *ctx,
        }
 
        den_polarity = 0;
-       if (ctx->cap->type == INTF_HDMI) {
-               hsync_polarity = p->yres >= 720 ? 0 : 1;
-               vsync_polarity = p->yres >= 720 ? 0 : 1;
-       } else if (ctx->cap->type == INTF_DP) {
-               hsync_polarity = p->hsync_polarity;
-               vsync_polarity = p->vsync_polarity;
-       } else {
-               hsync_polarity = 0;
-               vsync_polarity = 0;
-       }
        polarity_ctl = (den_polarity << 2) | /*  DEN Polarity  */
-               (vsync_polarity << 1) | /* VSYNC Polarity */
-               (hsync_polarity << 0);  /* HSYNC Polarity */
+               (p->vsync_polarity << 1) | /* VSYNC Polarity */
+               (p->hsync_polarity << 0);  /* HSYNC Polarity */
 
        if (!DPU_FORMAT_IS_YUV(fmt))
                panel_format = (fmt->bits[C0_G_Y] |
@@ -276,7 +267,6 @@ static void dpu_hw_intf_setup_prg_fetch(
 
 static void dpu_hw_intf_bind_pingpong_blk(
                struct dpu_hw_intf *intf,
-               bool enable,
                const enum dpu_pingpong pp)
 {
        struct dpu_hw_blk_reg_map *c = &intf->hw;
@@ -285,7 +275,7 @@ static void dpu_hw_intf_bind_pingpong_blk(
        mux_cfg = DPU_REG_READ(c, INTF_MUX);
        mux_cfg &= ~0xf;
 
-       if (enable)
+       if (pp)
                mux_cfg |= (pp - PINGPONG_0) & 0x7;
        else
                mux_cfg |= 0xf;
@@ -337,6 +327,191 @@ static int dpu_hw_intf_collect_misr(struct dpu_hw_intf *intf, u32 *misr_value)
        return dpu_hw_collect_misr(&intf->hw, INTF_MISR_CTRL, INTF_MISR_SIGNATURE, misr_value);
 }
 
+static int dpu_hw_intf_enable_te(struct dpu_hw_intf *intf,
+               struct dpu_hw_tear_check *te)
+{
+       struct dpu_hw_blk_reg_map *c;
+       int cfg;
+
+       if (!intf)
+               return -EINVAL;
+
+       c = &intf->hw;
+
+       cfg = BIT(19); /* VSYNC_COUNTER_EN */
+       if (te->hw_vsync_mode)
+               cfg |= BIT(20);
+
+       cfg |= te->vsync_count;
+
+       DPU_REG_WRITE(c, INTF_TEAR_SYNC_CONFIG_VSYNC, cfg);
+       DPU_REG_WRITE(c, INTF_TEAR_SYNC_CONFIG_HEIGHT, te->sync_cfg_height);
+       DPU_REG_WRITE(c, INTF_TEAR_VSYNC_INIT_VAL, te->vsync_init_val);
+       DPU_REG_WRITE(c, INTF_TEAR_RD_PTR_IRQ, te->rd_ptr_irq);
+       DPU_REG_WRITE(c, INTF_TEAR_START_POS, te->start_pos);
+       DPU_REG_WRITE(c, INTF_TEAR_SYNC_THRESH,
+                       ((te->sync_threshold_continue << 16) |
+                        te->sync_threshold_start));
+       DPU_REG_WRITE(c, INTF_TEAR_SYNC_WRCOUNT,
+                       (te->start_pos + te->sync_threshold_start + 1));
+
+       DPU_REG_WRITE(c, INTF_TEAR_TEAR_CHECK_EN, 1);
+
+       return 0;
+}
+
+static void dpu_hw_intf_setup_autorefresh_config(struct dpu_hw_intf *intf,
+               u32 frame_count, bool enable)
+{
+       struct dpu_hw_blk_reg_map *c;
+       u32 refresh_cfg;
+
+       c = &intf->hw;
+       refresh_cfg = DPU_REG_READ(c, INTF_TEAR_AUTOREFRESH_CONFIG);
+       if (enable)
+               refresh_cfg = BIT(31) | frame_count;
+       else
+               refresh_cfg &= ~BIT(31);
+
+       DPU_REG_WRITE(c, INTF_TEAR_AUTOREFRESH_CONFIG, refresh_cfg);
+}
+
+/*
+ * dpu_hw_intf_get_autorefresh_config - Get autorefresh config from HW
+ * @intf:        DPU intf structure
+ * @frame_count: Used to return the current frame count from hw
+ *
+ * Returns: True if autorefresh enabled, false if disabled.
+ */
+static bool dpu_hw_intf_get_autorefresh_config(struct dpu_hw_intf *intf,
+               u32 *frame_count)
+{
+       u32 val = DPU_REG_READ(&intf->hw, INTF_TEAR_AUTOREFRESH_CONFIG);
+
+       if (frame_count != NULL)
+               *frame_count = val & 0xffff;
+       return !!((val & BIT(31)) >> 31);
+}
+
+static int dpu_hw_intf_disable_te(struct dpu_hw_intf *intf)
+{
+       struct dpu_hw_blk_reg_map *c;
+
+       if (!intf)
+               return -EINVAL;
+
+       c = &intf->hw;
+       DPU_REG_WRITE(c, INTF_TEAR_TEAR_CHECK_EN, 0);
+       return 0;
+}
+
+static int dpu_hw_intf_connect_external_te(struct dpu_hw_intf *intf,
+               bool enable_external_te)
+{
+       struct dpu_hw_blk_reg_map *c = &intf->hw;
+       u32 cfg;
+       int orig;
+
+       if (!intf)
+               return -EINVAL;
+
+       c = &intf->hw;
+       cfg = DPU_REG_READ(c, INTF_TEAR_SYNC_CONFIG_VSYNC);
+       orig = (bool)(cfg & BIT(20));
+       if (enable_external_te)
+               cfg |= BIT(20);
+       else
+               cfg &= ~BIT(20);
+       DPU_REG_WRITE(c, INTF_TEAR_SYNC_CONFIG_VSYNC, cfg);
+       trace_dpu_intf_connect_ext_te(intf->idx - INTF_0, cfg);
+
+       return orig;
+}
+
+static int dpu_hw_intf_get_vsync_info(struct dpu_hw_intf *intf,
+               struct dpu_hw_pp_vsync_info *info)
+{
+       struct dpu_hw_blk_reg_map *c = &intf->hw;
+       u32 val;
+
+       if (!intf || !info)
+               return -EINVAL;
+
+       c = &intf->hw;
+
+       val = DPU_REG_READ(c, INTF_TEAR_VSYNC_INIT_VAL);
+       info->rd_ptr_init_val = val & 0xffff;
+
+       val = DPU_REG_READ(c, INTF_TEAR_INT_COUNT_VAL);
+       info->rd_ptr_frame_count = (val & 0xffff0000) >> 16;
+       info->rd_ptr_line_count = val & 0xffff;
+
+       val = DPU_REG_READ(c, INTF_TEAR_LINE_COUNT);
+       info->wr_ptr_line_count = val & 0xffff;
+
+       val = DPU_REG_READ(c, INTF_FRAME_COUNT);
+       info->intf_frame_count = val;
+
+       return 0;
+}
+
+static void dpu_hw_intf_vsync_sel(struct dpu_hw_intf *intf,
+               u32 vsync_source)
+{
+       struct dpu_hw_blk_reg_map *c;
+
+       if (!intf)
+               return;
+
+       c = &intf->hw;
+
+       DPU_REG_WRITE(c, INTF_TEAR_MDP_VSYNC_SEL, (vsync_source & 0xf));
+}
+
+static void dpu_hw_intf_disable_autorefresh(struct dpu_hw_intf *intf,
+                                           uint32_t encoder_id, u16 vdisplay)
+{
+       struct dpu_hw_pp_vsync_info info;
+       int trial = 0;
+
+       /* If autorefresh is already disabled, we have nothing to do */
+       if (!dpu_hw_intf_get_autorefresh_config(intf, NULL))
+               return;
+
+       /*
+        * If autorefresh is enabled, disable it and make sure it is safe to
+        * proceed with current frame commit/push. Sequence followed is,
+        * 1. Disable TE
+        * 2. Disable autorefresh config
+        * 4. Poll for frame transfer ongoing to be false
+        * 5. Enable TE back
+        */
+
+       dpu_hw_intf_connect_external_te(intf, false);
+       dpu_hw_intf_setup_autorefresh_config(intf, 0, false);
+
+       do {
+               udelay(DPU_ENC_MAX_POLL_TIMEOUT_US);
+               if ((trial * DPU_ENC_MAX_POLL_TIMEOUT_US)
+                               > (KICKOFF_TIMEOUT_MS * USEC_PER_MSEC)) {
+                       DPU_ERROR("enc%d intf%d disable autorefresh failed\n",
+                                 encoder_id, intf->idx - INTF_0);
+                       break;
+               }
+
+               trial++;
+
+               dpu_hw_intf_get_vsync_info(intf, &info);
+       } while (info.wr_ptr_line_count > 0 &&
+                info.wr_ptr_line_count < vdisplay);
+
+       dpu_hw_intf_connect_external_te(intf, true);
+
+       DPU_DEBUG("enc%d intf%d disabled autorefresh\n",
+                 encoder_id, intf->idx - INTF_0);
+
+}
+
 static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
                unsigned long cap)
 {
@@ -349,32 +524,38 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
                ops->bind_pingpong_blk = dpu_hw_intf_bind_pingpong_blk;
        ops->setup_misr = dpu_hw_intf_setup_misr;
        ops->collect_misr = dpu_hw_intf_collect_misr;
+
+       if (cap & BIT(DPU_INTF_TE)) {
+               ops->enable_tearcheck = dpu_hw_intf_enable_te;
+               ops->disable_tearcheck = dpu_hw_intf_disable_te;
+               ops->connect_external_te = dpu_hw_intf_connect_external_te;
+               ops->vsync_sel = dpu_hw_intf_vsync_sel;
+               ops->disable_autorefresh = dpu_hw_intf_disable_autorefresh;
+       }
 }
 
-struct dpu_hw_intf *dpu_hw_intf_init(enum dpu_intf idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_intf *c;
-       const struct dpu_intf_cfg *cfg;
+
+       if (cfg->type == INTF_NONE) {
+               DPU_DEBUG("Skip intf %d with type NONE\n", cfg->id - INTF_0);
+               return NULL;
+       }
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _intf_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               pr_err("failed to create dpu_hw_intf %d\n", idx);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_INTF;
 
        /*
         * Assign ops
         */
-       c->idx = idx;
+       c->idx = cfg->id;
        c->cap = cfg;
-       c->mdss = m;
        _setup_intf_ops(&c->ops, c->cap->features);
 
        return c;
index 643dd10bc0306a02277d0dc01316fa0c2f44b8a8..33895eca12119f317acf4e0d62ef1e1d75e5299b 100644 (file)
@@ -60,6 +60,16 @@ struct intf_status {
  *                     feed pixels to this interface
  * @setup_misr: enable/disable MISR
  * @collect_misr: read MISR signature
+ * @enable_tearcheck:           Enables vsync generation and sets up init value of read
+ *                              pointer and programs the tear check configuration
+ * @disable_tearcheck:          Disables tearcheck block
+ * @connect_external_te:        Read, modify, write to either set or clear listening to external TE
+ *                              Return: 1 if TE was originally connected, 0 if not, or -ERROR
+ * @get_vsync_info:             Provides the programmed and current line_count
+ * @setup_autorefresh:          Configure and enable the autorefresh config
+ * @get_autorefresh:            Retrieve autorefresh config from hardware
+ *                              Return: 0 on success, -ETIMEDOUT on timeout
+ * @vsync_sel:                  Select vsync signal for tear-effect configuration
  */
 struct dpu_hw_intf_ops {
        void (*setup_timing_gen)(struct dpu_hw_intf *intf,
@@ -78,10 +88,24 @@ struct dpu_hw_intf_ops {
        u32 (*get_line_count)(struct dpu_hw_intf *intf);
 
        void (*bind_pingpong_blk)(struct dpu_hw_intf *intf,
-                       bool enable,
                        const enum dpu_pingpong pp);
        void (*setup_misr)(struct dpu_hw_intf *intf, bool enable, u32 frame_count);
        int (*collect_misr)(struct dpu_hw_intf *intf, u32 *misr_value);
+
+       // Tearcheck on INTF since DPU 5.0.0
+
+       int (*enable_tearcheck)(struct dpu_hw_intf *intf, struct dpu_hw_tear_check *cfg);
+
+       int (*disable_tearcheck)(struct dpu_hw_intf *intf);
+
+       int (*connect_external_te)(struct dpu_hw_intf *intf, bool enable_external_te);
+
+       void (*vsync_sel)(struct dpu_hw_intf *intf, u32 vsync_source);
+
+       /**
+        * Disable autorefresh if enabled
+        */
+       void (*disable_autorefresh)(struct dpu_hw_intf *intf, uint32_t encoder_id, u16 vdisplay);
 };
 
 struct dpu_hw_intf {
@@ -90,22 +114,19 @@ struct dpu_hw_intf {
        /* intf */
        enum dpu_intf idx;
        const struct dpu_intf_cfg *cap;
-       const struct dpu_mdss_cfg *mdss;
 
        /* ops */
        struct dpu_hw_intf_ops ops;
 };
 
 /**
- * dpu_hw_intf_init(): Initializes the intf driver for the passed
- * interface idx.
- * @idx:  interface index for which driver object is required
+ * dpu_hw_intf_init() - Initializes the INTF driver for the passed
+ * interface catalog entry.
+ * @cfg:  interface catalog entry for which driver object is required
  * @addr: mapped register io address of MDP
- * @m :   pointer to mdss catalog data
  */
-struct dpu_hw_intf *dpu_hw_intf_init(enum dpu_intf idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_intf_destroy(): Destroys INTF driver context
index f5120ea91edee8d7f269e7bc2e4df386c7c82179..d1c3bd8379ea947280d84516c607d7d70786c40b 100644 (file)
 #define LM_MISR_SIGNATURE                0x314
 
 
-static const struct dpu_lm_cfg *_lm_offset(enum dpu_lm mixer,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->mixer_count; i++) {
-               if (mixer == m->mixer[i].id) {
-                       b->blk_addr = addr + m->mixer[i].base;
-                       b->log_mask = DPU_DBG_MASK_LM;
-                       return &m->mixer[i];
-               }
-       }
-
-       return ERR_PTR(-ENOMEM);
-}
-
 /**
  * _stage_offset(): returns the relative offset of the blend registers
  * for the stage to be setup
@@ -160,8 +142,7 @@ static void dpu_hw_lm_setup_color3(struct dpu_hw_mixer *ctx,
        DPU_REG_WRITE(c, LM_OP_MODE, op_mode);
 }
 
-static void _setup_mixer_ops(const struct dpu_mdss_cfg *m,
-               struct dpu_hw_lm_ops *ops,
+static void _setup_mixer_ops(struct dpu_hw_lm_ops *ops,
                unsigned long features)
 {
        ops->setup_mixer_out = dpu_hw_lm_setup_out;
@@ -175,27 +156,27 @@ static void _setup_mixer_ops(const struct dpu_mdss_cfg *m,
        ops->collect_misr = dpu_hw_lm_collect_misr;
 }
 
-struct dpu_hw_mixer *dpu_hw_lm_init(enum dpu_lm idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_mixer *c;
-       const struct dpu_lm_cfg *cfg;
+
+       if (cfg->pingpong == PINGPONG_NONE) {
+               DPU_DEBUG("skip mixer %d without pingpong\n", cfg->id);
+               return NULL;
+       }
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _lm_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_LM;
 
        /* Assign ops */
-       c->idx = idx;
+       c->idx = cfg->id;
        c->cap = cfg;
-       _setup_mixer_ops(m, &c->ops, c->cap->features);
+       _setup_mixer_ops(&c->ops, c->cap->features);
 
        return c;
 }
index 652ddfdedec375b04f09fafd4e62a93360e70763..36992d046a533b979ab674808fe044a2a2a0ce85 100644 (file)
@@ -93,15 +93,13 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
 }
 
 /**
- * dpu_hw_lm_init(): Initializes the mixer hw driver object.
+ * dpu_hw_lm_init() - Initializes the mixer hw driver object.
  * should be called once before accessing every mixer.
- * @idx:  mixer index for which driver object is required
+ * @cfg:  mixer catalog entry for which driver object is required
  * @addr: mapped register io address of MDP
- * @m :   pointer to mdss catalog data
  */
-struct dpu_hw_mixer *dpu_hw_lm_init(enum dpu_lm idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_lm_destroy(): Destroys layer mixer driver context
index 2d9192a6ce006a1a9e37095aa593ae6053cf35b5..02a0f48aac94a5492f344bd3c64eb723297ec49c 100644 (file)
@@ -191,7 +191,8 @@ enum dpu_dsc {
 };
 
 enum dpu_pingpong {
-       PINGPONG_0 = 1,
+       PINGPONG_NONE,
+       PINGPONG_0,
        PINGPONG_1,
        PINGPONG_2,
        PINGPONG_3,
@@ -463,4 +464,52 @@ struct dpu_mdss_color {
 #define DPU_DBG_MASK_DSPP     (1 << 10)
 #define DPU_DBG_MASK_DSC      (1 << 11)
 
+/**
+ * struct dpu_hw_tear_check - Struct contains parameters to configure
+ * tear-effect module. This structure is used to configure tear-check
+ * logic present either in ping-pong or in interface module.
+ * @vsync_count:        Ratio of MDP VSYNC clk freq(Hz) to refresh rate divided
+ *                      by no of lines
+ * @sync_cfg_height:    Total vertical lines (display height - 1)
+ * @vsync_init_val:     Init value to which the read pointer gets loaded at
+ *                      vsync edge
+ * @sync_threshold_start:    Read pointer threshold start ROI for write operation
+ * @sync_threshold_continue: The minimum number of lines the write pointer
+ *                           needs to be above the read pointer
+ * @start_pos:          The position from which the start_threshold value is added
+ * @rd_ptr_irq:         The read pointer line at which interrupt has to be generated
+ * @hw_vsync_mode:      Sync with external frame sync input
+ */
+struct dpu_hw_tear_check {
+       /*
+        * This is ratio of MDP VSYNC clk freq(Hz) to
+        * refresh rate divided by no of lines
+        */
+       u32 vsync_count;
+       u32 sync_cfg_height;
+       u32 vsync_init_val;
+       u32 sync_threshold_start;
+       u32 sync_threshold_continue;
+       u32 start_pos;
+       u32 rd_ptr_irq;
+       u8 hw_vsync_mode;
+};
+
+/**
+ * struct dpu_hw_pp_vsync_info - Struct contains parameters to configure
+ * read and write pointers for command mode panels
+ * @rd_ptr_init_val:    Value of rd pointer at vsync edge
+ * @rd_ptr_frame_count: Num frames sent since enabling interface
+ * @rd_ptr_line_count:  Current line on panel (rd ptr)
+ * @wr_ptr_line_count:  Current line within pp fifo (wr ptr)
+ * @intf_frame_count:   Frames read from intf
+ */
+struct dpu_hw_pp_vsync_info {
+       u32 rd_ptr_init_val;
+       u32 rd_ptr_frame_count;
+       u32 rd_ptr_line_count;
+       u32 wr_ptr_line_count;
+       u32 intf_frame_count;
+};
+
 #endif  /* _DPU_HW_MDSS_H */
index def0a87fdba56711b6544d9ac3a64e362b106d0e..90e0e05eff8d312e85e8bb10e5fa78c15f26c639 100644 (file)
 #define MERGE_3D_MUX  0x000
 #define MERGE_3D_MODE 0x004
 
-static const struct dpu_merge_3d_cfg *_merge_3d_offset(enum dpu_merge_3d idx,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->merge_3d_count; i++) {
-               if (idx == m->merge_3d[i].id) {
-                       b->blk_addr = addr + m->merge_3d[i].base;
-                       b->log_mask = DPU_DBG_MASK_PINGPONG;
-                       return &m->merge_3d[i];
-               }
-       }
-
-       return ERR_PTR(-EINVAL);
-}
-
 static void dpu_hw_merge_3d_setup_3d_mode(struct dpu_hw_merge_3d *merge_3d,
                        enum dpu_3d_blend_mode mode_3d)
 {
@@ -55,24 +37,19 @@ static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
        c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
 };
 
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(enum dpu_merge_3d idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_merge_3d *c;
-       const struct dpu_merge_3d_cfg *cfg;
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _merge_3d_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_PINGPONG;
 
-       c->idx = idx;
+       c->idx = cfg->id;
        c->caps = cfg;
        _setup_merge_3d_ops(c, c->caps->features);
 
index 81fd1d5f718e7862391ef8d71102a849edbb36be..19cec5e8872219ebbc2a1649c27d26c369715247 100644 (file)
@@ -46,16 +46,14 @@ static inline struct dpu_hw_merge_3d *to_dpu_hw_merge_3d(struct dpu_hw_blk *hw)
 }
 
 /**
- * dpu_hw_merge_3d_init - initializes the merge_3d driver for the passed
- *     merge_3d idx.
- * @idx:  Pingpong index for which driver object is required
+ * dpu_hw_merge_3d_init() - Initializes the merge_3d driver for the passed
+ * merge3d catalog entry.
+ * @cfg:  Pingpong catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
- * @m:    Pointer to mdss catalog data
- * Returns: Error code or allocated dpu_hw_merge_3d context
+ * Return: Error code or allocated dpu_hw_merge_3d context
  */
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(enum dpu_merge_3d idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_merge_3d_destroy - destroys merge_3d driver context
index 0fcad9760b6fcde2770dbe2100c5cee0d4da6865..437d9e62a841b2421dfb0bdb78a49be8b506a798 100644 (file)
@@ -42,24 +42,6 @@ static u32 dither_depth_map[DITHER_DEPTH_MAP_INDEX] = {
        0, 0, 0, 0, 0, 0, 0, 1, 2
 };
 
-static const struct dpu_pingpong_cfg *_pingpong_offset(enum dpu_pingpong pp,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->pingpong_count; i++) {
-               if (pp == m->pingpong[i].id) {
-                       b->blk_addr = addr + m->pingpong[i].base;
-                       b->log_mask = DPU_DBG_MASK_PINGPONG;
-                       return &m->pingpong[i];
-               }
-       }
-
-       return ERR_PTR(-EINVAL);
-}
-
 static void dpu_hw_pp_setup_dither(struct dpu_hw_pingpong *pp,
                                    struct dpu_hw_dither_cfg *cfg)
 {
@@ -91,7 +73,7 @@ static void dpu_hw_pp_setup_dither(struct dpu_hw_pingpong *pp,
        DPU_REG_WRITE(c, base + PP_DITHER_EN, 1);
 }
 
-static int dpu_hw_pp_setup_te_config(struct dpu_hw_pingpong *pp,
+static int dpu_hw_pp_enable_te(struct dpu_hw_pingpong *pp,
                struct dpu_hw_tear_check *te)
 {
        struct dpu_hw_blk_reg_map *c;
@@ -118,6 +100,8 @@ static int dpu_hw_pp_setup_te_config(struct dpu_hw_pingpong *pp,
        DPU_REG_WRITE(c, PP_SYNC_WRCOUNT,
                        (te->start_pos + te->sync_threshold_start + 1));
 
+       DPU_REG_WRITE(c, PP_TEAR_CHECK_EN, 1);
+
        return 0;
 }
 
@@ -144,24 +128,7 @@ static bool dpu_hw_pp_get_autorefresh_config(struct dpu_hw_pingpong *pp,
        return !!((val & BIT(31)) >> 31);
 }
 
-static int dpu_hw_pp_poll_timeout_wr_ptr(struct dpu_hw_pingpong *pp,
-               u32 timeout_us)
-{
-       struct dpu_hw_blk_reg_map *c;
-       u32 val;
-       int rc;
-
-       if (!pp)
-               return -EINVAL;
-
-       c = &pp->hw;
-       rc = readl_poll_timeout(c->blk_addr + PP_LINE_COUNT,
-                       val, (val & 0xffff) >= 1, 10, timeout_us);
-
-       return rc;
-}
-
-static int dpu_hw_pp_enable_te(struct dpu_hw_pingpong *pp, bool enable)
+static int dpu_hw_pp_disable_te(struct dpu_hw_pingpong *pp)
 {
        struct dpu_hw_blk_reg_map *c;
 
@@ -169,7 +136,7 @@ static int dpu_hw_pp_enable_te(struct dpu_hw_pingpong *pp, bool enable)
                return -EINVAL;
        c = &pp->hw;
 
-       DPU_REG_WRITE(c, PP_TEAR_CHECK_EN, enable);
+       DPU_REG_WRITE(c, PP_TEAR_CHECK_EN, 0);
        return 0;
 }
 
@@ -245,6 +212,49 @@ static u32 dpu_hw_pp_get_line_count(struct dpu_hw_pingpong *pp)
        return line;
 }
 
+static void dpu_hw_pp_disable_autorefresh(struct dpu_hw_pingpong *pp,
+                                         uint32_t encoder_id, u16 vdisplay)
+{
+       struct dpu_hw_pp_vsync_info info;
+       int trial = 0;
+
+       /* If autorefresh is already disabled, we have nothing to do */
+       if (!dpu_hw_pp_get_autorefresh_config(pp, NULL))
+               return;
+
+       /*
+        * If autorefresh is enabled, disable it and make sure it is safe to
+        * proceed with current frame commit/push. Sequence followed is,
+        * 1. Disable TE
+        * 2. Disable autorefresh config
+        * 4. Poll for frame transfer ongoing to be false
+        * 5. Enable TE back
+        */
+
+       dpu_hw_pp_connect_external_te(pp, false);
+       dpu_hw_pp_setup_autorefresh_config(pp, 0, false);
+
+       do {
+               udelay(DPU_ENC_MAX_POLL_TIMEOUT_US);
+               if ((trial * DPU_ENC_MAX_POLL_TIMEOUT_US)
+                               > (KICKOFF_TIMEOUT_MS * USEC_PER_MSEC)) {
+                       DPU_ERROR("enc%d pp%d disable autorefresh failed\n",
+                                 encoder_id, pp->idx - PINGPONG_0);
+                       break;
+               }
+
+               trial++;
+
+               dpu_hw_pp_get_vsync_info(pp, &info);
+       } while (info.wr_ptr_line_count > 0 &&
+                info.wr_ptr_line_count < vdisplay);
+
+       dpu_hw_pp_connect_external_te(pp, true);
+
+       DPU_DEBUG("enc%d pp%d disabled autorefresh\n",
+                 encoder_id, pp->idx - PINGPONG_0);
+}
+
 static int dpu_hw_pp_dsc_enable(struct dpu_hw_pingpong *pp)
 {
        struct dpu_hw_blk_reg_map *c = &pp->hw;
@@ -274,40 +284,37 @@ static int dpu_hw_pp_setup_dsc(struct dpu_hw_pingpong *pp)
 static void _setup_pingpong_ops(struct dpu_hw_pingpong *c,
                                unsigned long features)
 {
-       c->ops.setup_tearcheck = dpu_hw_pp_setup_te_config;
-       c->ops.enable_tearcheck = dpu_hw_pp_enable_te;
-       c->ops.connect_external_te = dpu_hw_pp_connect_external_te;
-       c->ops.get_vsync_info = dpu_hw_pp_get_vsync_info;
-       c->ops.setup_autorefresh = dpu_hw_pp_setup_autorefresh_config;
-       c->ops.get_autorefresh = dpu_hw_pp_get_autorefresh_config;
-       c->ops.poll_timeout_wr_ptr = dpu_hw_pp_poll_timeout_wr_ptr;
-       c->ops.get_line_count = dpu_hw_pp_get_line_count;
-       c->ops.setup_dsc = dpu_hw_pp_setup_dsc;
-       c->ops.enable_dsc = dpu_hw_pp_dsc_enable;
-       c->ops.disable_dsc = dpu_hw_pp_dsc_disable;
+       if (test_bit(DPU_PINGPONG_TE, &features)) {
+               c->ops.enable_tearcheck = dpu_hw_pp_enable_te;
+               c->ops.disable_tearcheck = dpu_hw_pp_disable_te;
+               c->ops.connect_external_te = dpu_hw_pp_connect_external_te;
+               c->ops.get_line_count = dpu_hw_pp_get_line_count;
+               c->ops.disable_autorefresh = dpu_hw_pp_disable_autorefresh;
+       }
+
+       if (test_bit(DPU_PINGPONG_DSC, &features)) {
+               c->ops.setup_dsc = dpu_hw_pp_setup_dsc;
+               c->ops.enable_dsc = dpu_hw_pp_dsc_enable;
+               c->ops.disable_dsc = dpu_hw_pp_dsc_disable;
+       }
 
        if (test_bit(DPU_PINGPONG_DITHER, &features))
                c->ops.setup_dither = dpu_hw_pp_setup_dither;
 };
 
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(enum dpu_pingpong idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_pingpong *c;
-       const struct dpu_pingpong_cfg *cfg;
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _pingpong_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_PINGPONG;
 
-       c->idx = idx;
+       c->idx = cfg->id;
        c->caps = cfg;
        _setup_pingpong_ops(c, c->caps->features);
 
index c00223441d99020ae85bd30c2174a5c7904a22e0..d3246a9a5808fa62e49763be95abfc2d3059a71e 100644 (file)
 
 struct dpu_hw_pingpong;
 
-struct dpu_hw_tear_check {
-       /*
-        * This is ratio of MDP VSYNC clk freq(Hz) to
-        * refresh rate divided by no of lines
-        */
-       u32 vsync_count;
-       u32 sync_cfg_height;
-       u32 vsync_init_val;
-       u32 sync_threshold_start;
-       u32 sync_threshold_continue;
-       u32 start_pos;
-       u32 rd_ptr_irq;
-       u8 hw_vsync_mode;
-};
-
-struct dpu_hw_pp_vsync_info {
-       u32 rd_ptr_init_val;    /* value of rd pointer at vsync edge */
-       u32 rd_ptr_frame_count; /* num frames sent since enabling interface */
-       u32 rd_ptr_line_count;  /* current line on panel (rd ptr) */
-       u32 wr_ptr_line_count;  /* current line within pp fifo (wr ptr) */
-};
-
 /**
  * struct dpu_hw_dither_cfg - dither feature structure
  * @flags: for customizing operations
@@ -59,11 +37,8 @@ struct dpu_hw_dither_cfg {
  *
  * struct dpu_hw_pingpong_ops : Interface to the pingpong Hw driver functions
  *  Assumption is these functions will be called after clocks are enabled
- *  @setup_tearcheck : program tear check values
- *  @enable_tearcheck : enables tear check
- *  @get_vsync_info : retries timing info of the panel
- *  @setup_autorefresh : configure and enable the autorefresh config
- *  @get_autorefresh : retrieve autorefresh config from hardware
+ *  @enable_tearcheck: program and enable tear check block
+ *  @disable_tearcheck: disable able tear check block
  *  @setup_dither : function to program the dither hw block
  *  @get_line_count: obtain current vertical line counter
  */
@@ -72,14 +47,13 @@ struct dpu_hw_pingpong_ops {
         * enables vysnc generation and sets up init value of
         * read pointer and programs the tear check cofiguration
         */
-       int (*setup_tearcheck)(struct dpu_hw_pingpong *pp,
+       int (*enable_tearcheck)(struct dpu_hw_pingpong *pp,
                        struct dpu_hw_tear_check *cfg);
 
        /**
-        * enables tear check block
+        * disables tear check block
         */
-       int (*enable_tearcheck)(struct dpu_hw_pingpong *pp,
-                       bool enable);
+       int (*disable_tearcheck)(struct dpu_hw_pingpong *pp);
 
        /**
         * read, modify, write to either set or clear listening to external TE
@@ -89,34 +63,14 @@ struct dpu_hw_pingpong_ops {
                        bool enable_external_te);
 
        /**
-        * provides the programmed and current
-        * line_count
-        */
-       int (*get_vsync_info)(struct dpu_hw_pingpong *pp,
-                       struct dpu_hw_pp_vsync_info  *info);
-
-       /**
-        * configure and enable the autorefresh config
-        */
-       void (*setup_autorefresh)(struct dpu_hw_pingpong *pp,
-                                 u32 frame_count, bool enable);
-
-       /**
-        * retrieve autorefresh config from hardware
-        */
-       bool (*get_autorefresh)(struct dpu_hw_pingpong *pp,
-                               u32 *frame_count);
-
-       /**
-        * poll until write pointer transmission starts
-        * @Return: 0 on success, -ETIMEDOUT on timeout
+        * Obtain current vertical line counter
         */
-       int (*poll_timeout_wr_ptr)(struct dpu_hw_pingpong *pp, u32 timeout_us);
+       u32 (*get_line_count)(struct dpu_hw_pingpong *pp);
 
        /**
-        * Obtain current vertical line counter
+        * Disable autorefresh if enabled
         */
-       u32 (*get_line_count)(struct dpu_hw_pingpong *pp);
+       void (*disable_autorefresh)(struct dpu_hw_pingpong *pp, uint32_t encoder_id, u16 vdisplay);
 
        /**
         * Setup dither matix for pingpong block
@@ -165,16 +119,14 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
 }
 
 /**
- * dpu_hw_pingpong_init - initializes the pingpong driver for the passed
- *     pingpong idx.
- * @idx:  Pingpong index for which driver object is required
+ * dpu_hw_pingpong_init() - initializes the pingpong driver for the passed
+ * pingpong catalog entry.
+ * @cfg:  Pingpong catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
- * @m:    Pointer to mdss catalog data
- * Returns: Error code or allocated dpu_hw_pingpong context
+ * Return: Error code or allocated dpu_hw_pingpong context
  */
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(enum dpu_pingpong idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_pingpong_destroy - destroys pingpong driver context
index cf70a9bd1034f08654e9e27afcce752136db0ca7..b364cf75bb3f1059b867a341dcde8dd80f08eed2 100644 (file)
@@ -12,7 +12,7 @@
 
 #define DPU_FETCH_CONFIG_RESET_VALUE   0x00000087
 
-/* DPU_SSPP_SRC */
+/* SSPP registers */
 #define SSPP_SRC_SIZE                      0x00
 #define SSPP_SRC_XY                        0x08
 #define SSPP_OUT_SIZE                      0x0c
 #define SSPP_SRC_FORMAT                    0x30
 #define SSPP_SRC_UNPACK_PATTERN            0x34
 #define SSPP_SRC_OP_MODE                   0x38
-
-/* SSPP_MULTIRECT*/
-#define SSPP_SRC_SIZE_REC1                 0x16C
-#define SSPP_SRC_XY_REC1                   0x168
-#define SSPP_OUT_SIZE_REC1                 0x160
-#define SSPP_OUT_XY_REC1                   0x164
-#define SSPP_SRC_FORMAT_REC1               0x174
-#define SSPP_SRC_UNPACK_PATTERN_REC1       0x178
-#define SSPP_SRC_OP_MODE_REC1              0x17C
-#define SSPP_MULTIRECT_OPMODE              0x170
-#define SSPP_SRC_CONSTANT_COLOR_REC1       0x180
-#define SSPP_EXCL_REC_SIZE_REC1            0x184
-#define SSPP_EXCL_REC_XY_REC1              0x188
-
-#define MDSS_MDP_OP_DEINTERLACE            BIT(22)
-#define MDSS_MDP_OP_DEINTERLACE_ODD        BIT(23)
-#define MDSS_MDP_OP_IGC_ROM_1              BIT(18)
-#define MDSS_MDP_OP_IGC_ROM_0              BIT(17)
-#define MDSS_MDP_OP_IGC_EN                 BIT(16)
-#define MDSS_MDP_OP_FLIP_UD                BIT(14)
-#define MDSS_MDP_OP_FLIP_LR                BIT(13)
-#define MDSS_MDP_OP_BWC_EN                 BIT(0)
-#define MDSS_MDP_OP_PE_OVERRIDE            BIT(31)
-#define MDSS_MDP_OP_BWC_LOSSLESS           (0 << 1)
-#define MDSS_MDP_OP_BWC_Q_HIGH             (1 << 1)
-#define MDSS_MDP_OP_BWC_Q_MED              (2 << 1)
-
 #define SSPP_SRC_CONSTANT_COLOR            0x3c
 #define SSPP_EXCL_REC_CTL                  0x40
 #define SSPP_UBWC_STATIC_CTRL              0x44
-#define SSPP_FETCH_CONFIG                  0x048
+#define SSPP_FETCH_CONFIG                  0x48
 #define SSPP_DANGER_LUT                    0x60
 #define SSPP_SAFE_LUT                      0x64
 #define SSPP_CREQ_LUT                      0x68
 #define SSPP_QOS_CTRL                      0x6C
-#define SSPP_DECIMATION_CONFIG             0xB4
 #define SSPP_SRC_ADDR_SW_STATUS            0x70
 #define SSPP_CREQ_LUT_0                    0x74
 #define SSPP_CREQ_LUT_1                    0x78
+#define SSPP_DECIMATION_CONFIG             0xB4
 #define SSPP_SW_PIX_EXT_C0_LR              0x100
 #define SSPP_SW_PIX_EXT_C0_TB              0x104
 #define SSPP_SW_PIX_EXT_C0_REQ_PIXELS      0x108
 #define SSPP_TRAFFIC_SHAPER_PREFILL        0x150
 #define SSPP_TRAFFIC_SHAPER_REC1_PREFILL   0x154
 #define SSPP_TRAFFIC_SHAPER_REC1           0x158
+#define SSPP_OUT_SIZE_REC1                 0x160
+#define SSPP_OUT_XY_REC1                   0x164
+#define SSPP_SRC_XY_REC1                   0x168
+#define SSPP_SRC_SIZE_REC1                 0x16C
+#define SSPP_MULTIRECT_OPMODE              0x170
+#define SSPP_SRC_FORMAT_REC1               0x174
+#define SSPP_SRC_UNPACK_PATTERN_REC1       0x178
+#define SSPP_SRC_OP_MODE_REC1              0x17C
+#define SSPP_SRC_CONSTANT_COLOR_REC1       0x180
+#define SSPP_EXCL_REC_SIZE_REC1            0x184
+#define SSPP_EXCL_REC_XY_REC1              0x188
 #define SSPP_EXCL_REC_SIZE                 0x1B4
 #define SSPP_EXCL_REC_XY                   0x1B8
-#define SSPP_VIG_OP_MODE                   0x0
-#define SSPP_VIG_CSC_10_OP_MODE            0x0
-#define SSPP_TRAFFIC_SHAPER_BPC_MAX        0xFF
+
+/* SSPP_SRC_OP_MODE & OP_MODE_REC1 */
+#define MDSS_MDP_OP_DEINTERLACE            BIT(22)
+#define MDSS_MDP_OP_DEINTERLACE_ODD        BIT(23)
+#define MDSS_MDP_OP_IGC_ROM_1              BIT(18)
+#define MDSS_MDP_OP_IGC_ROM_0              BIT(17)
+#define MDSS_MDP_OP_IGC_EN                 BIT(16)
+#define MDSS_MDP_OP_FLIP_UD                BIT(14)
+#define MDSS_MDP_OP_FLIP_LR                BIT(13)
+#define MDSS_MDP_OP_BWC_EN                 BIT(0)
+#define MDSS_MDP_OP_PE_OVERRIDE            BIT(31)
+#define MDSS_MDP_OP_BWC_LOSSLESS           (0 << 1)
+#define MDSS_MDP_OP_BWC_Q_HIGH             (1 << 1)
+#define MDSS_MDP_OP_BWC_Q_MED              (2 << 1)
 
 /* SSPP_QOS_CTRL */
 #define SSPP_QOS_CTRL_VBLANK_EN            BIT(16)
@@ -96,6 +91,7 @@
 #define SSPP_QOS_CTRL_CREQ_VBLANK_OFF      20
 
 /* DPU_SSPP_SCALER_QSEED2 */
+#define SSPP_VIG_OP_MODE                   0x0
 #define SCALE_CONFIG                       0x04
 #define COMP0_3_PHASE_STEP_X               0x10
 #define COMP0_3_PHASE_STEP_Y               0x14
 #define COMP1_2_INIT_PHASE_Y               0x2C
 #define VIG_0_QSEED2_SHARP                 0x30
 
+/* SSPP_TRAFFIC_SHAPER and _REC1 */
+#define SSPP_TRAFFIC_SHAPER_BPC_MAX        0xFF
+
 /*
  * Definitions for ViG op modes
  */
 /*
  * Definitions for CSC 10 op modes
  */
+#define SSPP_VIG_CSC_10_OP_MODE            0x0
 #define VIG_CSC_10_SRC_DATAFMT BIT(1)
 #define VIG_CSC_10_EN          BIT(0)
 #define CSC_10BIT_OFFSET       4
 #define TS_CLK                 19200000
 
 
-static int _sspp_subblk_offset(struct dpu_hw_sspp *ctx,
-               int s_id,
-               u32 *idx)
-{
-       int rc = 0;
-       const struct dpu_sspp_sub_blks *sblk;
-
-       if (!ctx || !ctx->cap || !ctx->cap->sblk)
-               return -EINVAL;
-
-       sblk = ctx->cap->sblk;
-
-       switch (s_id) {
-       case DPU_SSPP_SRC:
-               *idx = sblk->src_blk.base;
-               break;
-       case DPU_SSPP_SCALER_QSEED2:
-       case DPU_SSPP_SCALER_QSEED3:
-       case DPU_SSPP_SCALER_RGB:
-               *idx = sblk->scaler_blk.base;
-               break;
-       case DPU_SSPP_CSC:
-       case DPU_SSPP_CSC_10BIT:
-               *idx = sblk->csc_blk.base;
-               break;
-       default:
-               rc = -EINVAL;
-       }
-
-       return rc;
-}
-
 static void dpu_hw_sspp_setup_multirect(struct dpu_sw_pipe *pipe)
 {
        struct dpu_hw_sspp *ctx = pipe->sspp;
        u32 mode_mask;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx)
                return;
 
        if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) {
@@ -185,7 +152,7 @@ static void dpu_hw_sspp_setup_multirect(struct dpu_sw_pipe *pipe)
                 */
                mode_mask = 0;
        } else {
-               mode_mask = DPU_REG_READ(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx);
+               mode_mask = DPU_REG_READ(&ctx->hw, SSPP_MULTIRECT_OPMODE);
                mode_mask |= pipe->multirect_index;
                if (pipe->multirect_mode == DPU_SSPP_MULTIRECT_TIME_MX)
                        mode_mask |= BIT(2);
@@ -193,46 +160,42 @@ static void dpu_hw_sspp_setup_multirect(struct dpu_sw_pipe *pipe)
                        mode_mask &= ~BIT(2);
        }
 
-       DPU_REG_WRITE(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx, mode_mask);
+       DPU_REG_WRITE(&ctx->hw, SSPP_MULTIRECT_OPMODE, mode_mask);
 }
 
 static void _sspp_setup_opmode(struct dpu_hw_sspp *ctx,
                u32 mask, u8 en)
 {
-       u32 idx;
+       const struct dpu_sspp_sub_blks *sblk = ctx->cap->sblk;
        u32 opmode;
 
        if (!test_bit(DPU_SSPP_SCALER_QSEED2, &ctx->cap->features) ||
-               _sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED2, &idx) ||
                !test_bit(DPU_SSPP_CSC, &ctx->cap->features))
                return;
 
-       opmode = DPU_REG_READ(&ctx->hw, SSPP_VIG_OP_MODE + idx);
+       opmode = DPU_REG_READ(&ctx->hw, sblk->scaler_blk.base + SSPP_VIG_OP_MODE);
 
        if (en)
                opmode |= mask;
        else
                opmode &= ~mask;
 
-       DPU_REG_WRITE(&ctx->hw, SSPP_VIG_OP_MODE + idx, opmode);
+       DPU_REG_WRITE(&ctx->hw, sblk->scaler_blk.base + SSPP_VIG_OP_MODE, opmode);
 }
 
 static void _sspp_setup_csc10_opmode(struct dpu_hw_sspp *ctx,
                u32 mask, u8 en)
 {
-       u32 idx;
+       const struct dpu_sspp_sub_blks *sblk = ctx->cap->sblk;
        u32 opmode;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_CSC_10BIT, &idx))
-               return;
-
-       opmode = DPU_REG_READ(&ctx->hw, SSPP_VIG_CSC_10_OP_MODE + idx);
+       opmode = DPU_REG_READ(&ctx->hw, sblk->csc_blk.base + SSPP_VIG_CSC_10_OP_MODE);
        if (en)
                opmode |= mask;
        else
                opmode &= ~mask;
 
-       DPU_REG_WRITE(&ctx->hw, SSPP_VIG_CSC_10_OP_MODE + idx, opmode);
+       DPU_REG_WRITE(&ctx->hw, sblk->csc_blk.base + SSPP_VIG_CSC_10_OP_MODE, opmode);
 }
 
 /*
@@ -247,9 +210,8 @@ static void dpu_hw_sspp_setup_format(struct dpu_sw_pipe *pipe,
        u32 opmode = 0;
        u32 fast_clear = 0;
        u32 op_mode_off, unpack_pat_off, format_off;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !fmt)
+       if (!ctx || !fmt)
                return;
 
        if (pipe->multirect_index == DPU_SSPP_RECT_SOLO ||
@@ -264,7 +226,7 @@ static void dpu_hw_sspp_setup_format(struct dpu_sw_pipe *pipe,
        }
 
        c = &ctx->hw;
-       opmode = DPU_REG_READ(c, op_mode_off + idx);
+       opmode = DPU_REG_READ(c, op_mode_off);
        opmode &= ~(MDSS_MDP_OP_FLIP_LR | MDSS_MDP_OP_FLIP_UD |
                        MDSS_MDP_OP_BWC_EN | MDSS_MDP_OP_PE_OVERRIDE);
 
@@ -352,12 +314,12 @@ static void dpu_hw_sspp_setup_format(struct dpu_sw_pipe *pipe,
                        VIG_CSC_10_EN | VIG_CSC_10_SRC_DATAFMT,
                        DPU_FORMAT_IS_YUV(fmt));
 
-       DPU_REG_WRITE(c, format_off + idx, src_format);
-       DPU_REG_WRITE(c, unpack_pat_off + idx, unpack);
-       DPU_REG_WRITE(c, op_mode_off + idx, opmode);
+       DPU_REG_WRITE(c, format_off, src_format);
+       DPU_REG_WRITE(c, unpack_pat_off, unpack);
+       DPU_REG_WRITE(c, op_mode_off, opmode);
 
        /* clear previous UBWC error */
-       DPU_REG_WRITE(c, SSPP_UBWC_ERROR_STATUS + idx, BIT(31));
+       DPU_REG_WRITE(c, SSPP_UBWC_ERROR_STATUS, BIT(31));
 }
 
 static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_sspp *ctx,
@@ -368,9 +330,8 @@ static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_sspp *ctx,
        u32 lr_pe[4], tb_pe[4], tot_req_pixels[4];
        const u32 bytemask = 0xff;
        const u32 shortmask = 0xffff;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !pe_ext)
+       if (!ctx || !pe_ext)
                return;
 
        c = &ctx->hw;
@@ -400,21 +361,21 @@ static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_sspp *ctx,
        }
 
        /* color 0 */
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_LR + idx, lr_pe[0]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_TB + idx, tb_pe[0]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_REQ_PIXELS + idx,
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_LR, lr_pe[0]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_TB, tb_pe[0]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C0_REQ_PIXELS,
                        tot_req_pixels[0]);
 
        /* color 1 and color 2 */
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_LR + idx, lr_pe[1]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_TB + idx, tb_pe[1]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_REQ_PIXELS + idx,
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_LR, lr_pe[1]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_TB, tb_pe[1]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C1C2_REQ_PIXELS,
                        tot_req_pixels[1]);
 
        /* color 3 */
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_LR + idx, lr_pe[3]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_TB + idx, lr_pe[3]);
-       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_REQ_PIXELS + idx,
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_LR, lr_pe[3]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_TB, lr_pe[3]);
+       DPU_REG_WRITE(c, SSPP_SW_PIX_EXT_C3_REQ_PIXELS,
                        tot_req_pixels[3]);
 }
 
@@ -422,25 +383,22 @@ static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_sspp *ctx,
                struct dpu_hw_scaler3_cfg *scaler3_cfg,
                const struct dpu_format *format)
 {
-       u32 idx;
-
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx)
-               || !scaler3_cfg)
+       if (!ctx || !scaler3_cfg)
                return;
 
-       dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg, idx,
+       dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg,
+                       ctx->cap->sblk->scaler_blk.base,
                        ctx->cap->sblk->scaler_blk.version,
                        format);
 }
 
 static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_sspp *ctx)
 {
-       u32 idx;
-
-       if (!ctx || _sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx))
+       if (!ctx)
                return 0;
 
-       return dpu_hw_get_scaler3_ver(&ctx->hw, idx);
+       return dpu_hw_get_scaler3_ver(&ctx->hw,
+                                     ctx->cap->sblk->scaler_blk.base);
 }
 
 /*
@@ -453,9 +411,8 @@ static void dpu_hw_sspp_setup_rects(struct dpu_sw_pipe *pipe,
        struct dpu_hw_blk_reg_map *c;
        u32 src_size, src_xy, dst_size, dst_xy;
        u32 src_size_off, src_xy_off, out_size_off, out_xy_off;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !cfg)
+       if (!ctx || !cfg)
                return;
 
        c = &ctx->hw;
@@ -483,10 +440,10 @@ static void dpu_hw_sspp_setup_rects(struct dpu_sw_pipe *pipe,
                drm_rect_width(&cfg->dst_rect);
 
        /* rectangle register programming */
-       DPU_REG_WRITE(c, src_size_off + idx, src_size);
-       DPU_REG_WRITE(c, src_xy_off + idx, src_xy);
-       DPU_REG_WRITE(c, out_size_off + idx, dst_size);
-       DPU_REG_WRITE(c, out_xy_off + idx, dst_xy);
+       DPU_REG_WRITE(c, src_size_off, src_size);
+       DPU_REG_WRITE(c, src_xy_off, src_xy);
+       DPU_REG_WRITE(c, out_size_off, dst_size);
+       DPU_REG_WRITE(c, out_xy_off, dst_xy);
 }
 
 static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe,
@@ -495,24 +452,23 @@ static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe,
        struct dpu_hw_sspp *ctx = pipe->sspp;
        u32 ystride0, ystride1;
        int i;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx)
                return;
 
        if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) {
                for (i = 0; i < ARRAY_SIZE(layout->plane_addr); i++)
-                       DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx + i * 0x4,
+                       DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + i * 0x4,
                                        layout->plane_addr[i]);
        } else if (pipe->multirect_index == DPU_SSPP_RECT_0) {
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx,
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR,
                                layout->plane_addr[0]);
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC2_ADDR + idx,
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC2_ADDR,
                                layout->plane_addr[2]);
        } else {
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC1_ADDR + idx,
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC1_ADDR,
                                layout->plane_addr[0]);
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC3_ADDR + idx,
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC3_ADDR,
                                layout->plane_addr[2]);
        }
 
@@ -522,8 +478,8 @@ static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe,
                ystride1 = (layout->plane_pitch[2]) |
                        (layout->plane_pitch[3] << 16);
        } else {
-               ystride0 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx);
-               ystride1 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx);
+               ystride0 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE0);
+               ystride1 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE1);
 
                if (pipe->multirect_index == DPU_SSPP_RECT_0) {
                        ystride0 = (ystride0 & 0xFFFF0000) |
@@ -540,34 +496,35 @@ static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe,
                }
        }
 
-       DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx, ystride0);
-       DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx, ystride1);
+       DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE0, ystride0);
+       DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE1, ystride1);
 }
 
 static void dpu_hw_sspp_setup_csc(struct dpu_hw_sspp *ctx,
                const struct dpu_csc_cfg *data)
 {
-       u32 idx;
+       u32 offset;
        bool csc10 = false;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_CSC, &idx) || !data)
+       if (!ctx || !data)
                return;
 
+       offset = ctx->cap->sblk->csc_blk.base;
+
        if (test_bit(DPU_SSPP_CSC_10BIT, &ctx->cap->features)) {
-               idx += CSC_10BIT_OFFSET;
+               offset += CSC_10BIT_OFFSET;
                csc10 = true;
        }
 
-       dpu_hw_csc_setup(&ctx->hw, idx, data, csc10);
+       dpu_hw_csc_setup(&ctx->hw, offset, data, csc10);
 }
 
 static void dpu_hw_sspp_setup_solidfill(struct dpu_sw_pipe *pipe, u32 color)
 {
        struct dpu_hw_sspp *ctx = pipe->sspp;
        struct dpu_hw_fmt_layout cfg;
-       u32 idx;
 
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx)
                return;
 
        /* cleanup source addresses */
@@ -576,79 +533,41 @@ static void dpu_hw_sspp_setup_solidfill(struct dpu_sw_pipe *pipe, u32 color)
 
        if (pipe->multirect_index == DPU_SSPP_RECT_SOLO ||
            pipe->multirect_index == DPU_SSPP_RECT_0)
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR + idx, color);
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR, color);
        else
-               DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR_REC1 + idx,
+               DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR_REC1,
                                color);
 }
 
-static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_sspp *ctx,
-                       u32 danger_lut,
-                       u32 safe_lut)
+static void dpu_hw_sspp_setup_qos_lut(struct dpu_hw_sspp *ctx,
+                                     struct dpu_hw_qos_cfg *cfg)
 {
-       u32 idx;
-
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
-               return;
-
-       DPU_REG_WRITE(&ctx->hw, SSPP_DANGER_LUT + idx, danger_lut);
-       DPU_REG_WRITE(&ctx->hw, SSPP_SAFE_LUT + idx, safe_lut);
-}
-
-static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_sspp *ctx,
-                       u64 creq_lut)
-{
-       u32 idx;
-
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx || !cfg)
                return;
 
-       if (ctx->cap && test_bit(DPU_SSPP_QOS_8LVL, &ctx->cap->features)) {
-               DPU_REG_WRITE(&ctx->hw, SSPP_CREQ_LUT_0 + idx, creq_lut);
-               DPU_REG_WRITE(&ctx->hw, SSPP_CREQ_LUT_1 + idx,
-                               creq_lut >> 32);
-       } else {
-               DPU_REG_WRITE(&ctx->hw, SSPP_CREQ_LUT + idx, creq_lut);
-       }
+       _dpu_hw_setup_qos_lut(&ctx->hw, SSPP_DANGER_LUT,
+                             test_bit(DPU_SSPP_QOS_8LVL, &ctx->cap->features),
+                             cfg);
 }
 
 static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_sspp *ctx,
-               struct dpu_hw_pipe_qos_cfg *cfg)
+                                      bool danger_safe_en)
 {
-       u32 idx;
-       u32 qos_ctrl = 0;
-
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx)
                return;
 
-       if (cfg->vblank_en) {
-               qos_ctrl |= ((cfg->creq_vblank &
-                               SSPP_QOS_CTRL_CREQ_VBLANK_MASK) <<
-                               SSPP_QOS_CTRL_CREQ_VBLANK_OFF);
-               qos_ctrl |= ((cfg->danger_vblank &
-                               SSPP_QOS_CTRL_DANGER_VBLANK_MASK) <<
-                               SSPP_QOS_CTRL_DANGER_VBLANK_OFF);
-               qos_ctrl |= SSPP_QOS_CTRL_VBLANK_EN;
-       }
-
-       if (cfg->danger_safe_en)
-               qos_ctrl |= SSPP_QOS_CTRL_DANGER_SAFE_EN;
-
-       DPU_REG_WRITE(&ctx->hw, SSPP_QOS_CTRL + idx, qos_ctrl);
+       DPU_REG_WRITE(&ctx->hw, SSPP_QOS_CTRL,
+                     danger_safe_en ? SSPP_QOS_CTRL_DANGER_SAFE_EN : 0);
 }
 
 static void dpu_hw_sspp_setup_cdp(struct dpu_sw_pipe *pipe,
-               struct dpu_hw_cdp_cfg *cfg)
+                                 const struct dpu_format *fmt,
+                                 bool enable)
 {
        struct dpu_hw_sspp *ctx = pipe->sspp;
-       u32 idx;
-       u32 cdp_cntl = 0;
        u32 cdp_cntl_offset = 0;
 
-       if (!ctx || !cfg)
-               return;
-
-       if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
+       if (!ctx)
                return;
 
        if (pipe->multirect_index == DPU_SSPP_RECT_SOLO ||
@@ -657,33 +576,20 @@ static void dpu_hw_sspp_setup_cdp(struct dpu_sw_pipe *pipe,
        else
                cdp_cntl_offset = SSPP_CDP_CNTL_REC1;
 
-       if (cfg->enable)
-               cdp_cntl |= BIT(0);
-       if (cfg->ubwc_meta_enable)
-               cdp_cntl |= BIT(1);
-       if (cfg->tile_amortize_enable)
-               cdp_cntl |= BIT(2);
-       if (cfg->preload_ahead == DPU_SSPP_CDP_PRELOAD_AHEAD_64)
-               cdp_cntl |= BIT(3);
-
-       DPU_REG_WRITE(&ctx->hw, cdp_cntl_offset, cdp_cntl);
+       dpu_setup_cdp(&ctx->hw, cdp_cntl_offset, fmt, enable);
 }
 
 static void _setup_layer_ops(struct dpu_hw_sspp *c,
                unsigned long features)
 {
-       if (test_bit(DPU_SSPP_SRC, &features)) {
-               c->ops.setup_format = dpu_hw_sspp_setup_format;
-               c->ops.setup_rects = dpu_hw_sspp_setup_rects;
-               c->ops.setup_sourceaddress = dpu_hw_sspp_setup_sourceaddress;
-               c->ops.setup_solidfill = dpu_hw_sspp_setup_solidfill;
-               c->ops.setup_pe = dpu_hw_sspp_setup_pe_config;
-       }
+       c->ops.setup_format = dpu_hw_sspp_setup_format;
+       c->ops.setup_rects = dpu_hw_sspp_setup_rects;
+       c->ops.setup_sourceaddress = dpu_hw_sspp_setup_sourceaddress;
+       c->ops.setup_solidfill = dpu_hw_sspp_setup_solidfill;
+       c->ops.setup_pe = dpu_hw_sspp_setup_pe_config;
 
        if (test_bit(DPU_SSPP_QOS, &features)) {
-               c->ops.setup_danger_safe_lut =
-                       dpu_hw_sspp_setup_danger_safe_lut;
-               c->ops.setup_creq_lut = dpu_hw_sspp_setup_creq_lut;
+               c->ops.setup_qos_lut = dpu_hw_sspp_setup_qos_lut;
                c->ops.setup_qos_ctrl = dpu_hw_sspp_setup_qos_ctrl;
        }
 
@@ -728,8 +634,8 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
        /* add register dump support */
        dpu_debugfs_create_regset32("src_blk", 0400,
                        debugfs_root,
-                       sblk->src_blk.base + cfg->base,
-                       sblk->src_blk.len,
+                       cfg->base,
+                       cfg->len,
                        kms);
 
        if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
@@ -758,63 +664,29 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
                        0400,
                        debugfs_root,
                        (u32 *) &cfg->clk_ctrl);
-       debugfs_create_x32("creq_vblank",
-                       0600,
-                       debugfs_root,
-                       (u32 *) &sblk->creq_vblank);
-       debugfs_create_x32("danger_vblank",
-                       0600,
-                       debugfs_root,
-                       (u32 *) &sblk->danger_vblank);
 
        return 0;
 }
 #endif
 
-
-static const struct dpu_sspp_cfg *_sspp_offset(enum dpu_sspp sspp,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *catalog,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       if ((sspp < SSPP_MAX) && catalog && addr && b) {
-               for (i = 0; i < catalog->sspp_count; i++) {
-                       if (sspp == catalog->sspp[i].id) {
-                               b->blk_addr = addr + catalog->sspp[i].base;
-                               b->log_mask = DPU_DBG_MASK_SSPP;
-                               return &catalog->sspp[i];
-                       }
-               }
-       }
-
-       return ERR_PTR(-ENOMEM);
-}
-
-struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx,
-               void __iomem *addr, const struct dpu_mdss_cfg *catalog)
+struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
+               void __iomem *addr, const struct dpu_ubwc_cfg *ubwc)
 {
        struct dpu_hw_sspp *hw_pipe;
-       const struct dpu_sspp_cfg *cfg;
 
-       if (!addr || !catalog)
+       if (!addr || !ubwc)
                return ERR_PTR(-EINVAL);
 
        hw_pipe = kzalloc(sizeof(*hw_pipe), GFP_KERNEL);
        if (!hw_pipe)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _sspp_offset(idx, addr, catalog, &hw_pipe->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(hw_pipe);
-               return ERR_PTR(-EINVAL);
-       }
+       hw_pipe->hw.blk_addr = addr + cfg->base;
+       hw_pipe->hw.log_mask = DPU_DBG_MASK_SSPP;
 
        /* Assign ops */
-       hw_pipe->catalog = catalog;
-       hw_pipe->ubwc = catalog->ubwc;
-       hw_pipe->idx = idx;
+       hw_pipe->ubwc = ubwc;
+       hw_pipe->idx = cfg->id;
        hw_pipe->cap = cfg;
        _setup_layer_ops(hw_pipe, hw_pipe->cap->features);
 
index 74b98b6b3bc3a19151ae0834079d0237847686d9..085f34bc6b88d430c8176c1e9d4850bc069f90c7 100644 (file)
@@ -163,28 +163,6 @@ struct dpu_sw_pipe_cfg {
        struct drm_rect dst_rect;
 };
 
-/**
- * struct dpu_hw_pipe_qos_cfg : Source pipe QoS configuration
- * @creq_vblank: creq value generated to vbif during vertical blanking
- * @danger_vblank: danger value generated during vertical blanking
- * @vblank_en: enable creq_vblank and danger_vblank during vblank
- * @danger_safe_en: enable danger safe generation
- */
-struct dpu_hw_pipe_qos_cfg {
-       u32 creq_vblank;
-       u32 danger_vblank;
-       bool vblank_en;
-       bool danger_safe_en;
-};
-
-/**
- * enum CDP preload ahead address size
- */
-enum {
-       DPU_SSPP_CDP_PRELOAD_AHEAD_32,
-       DPU_SSPP_CDP_PRELOAD_AHEAD_64
-};
-
 /**
  * struct dpu_hw_pipe_ts_cfg - traffic shaper configuration
  * @size: size to prefill in bytes, or zero to disable
@@ -276,34 +254,22 @@ struct dpu_hw_sspp_ops {
        void (*setup_sharpening)(struct dpu_hw_sspp *ctx,
                        struct dpu_hw_sharp_cfg *cfg);
 
-       /**
-        * setup_danger_safe_lut - setup danger safe LUTs
-        * @ctx: Pointer to pipe context
-        * @danger_lut: LUT for generate danger level based on fill level
-        * @safe_lut: LUT for generate safe level based on fill level
-        *
-        */
-       void (*setup_danger_safe_lut)(struct dpu_hw_sspp *ctx,
-                       u32 danger_lut,
-                       u32 safe_lut);
 
        /**
-        * setup_creq_lut - setup CREQ LUT
+        * setup_qos_lut - setup QoS LUTs
         * @ctx: Pointer to pipe context
-        * @creq_lut: LUT for generate creq level based on fill level
-        *
+        * @cfg: LUT configuration
         */
-       void (*setup_creq_lut)(struct dpu_hw_sspp *ctx,
-                       u64 creq_lut);
+       void (*setup_qos_lut)(struct dpu_hw_sspp *ctx,
+                       struct dpu_hw_qos_cfg *cfg);
 
        /**
         * setup_qos_ctrl - setup QoS control
         * @ctx: Pointer to pipe context
-        * @cfg: Pointer to pipe QoS configuration
-        *
+        * @danger_safe_en: flags controlling enabling of danger/safe QoS/LUT
         */
        void (*setup_qos_ctrl)(struct dpu_hw_sspp *ctx,
-                       struct dpu_hw_pipe_qos_cfg *cfg);
+                              bool danger_safe_en);
 
        /**
         * setup_histogram - setup histograms
@@ -331,18 +297,19 @@ struct dpu_hw_sspp_ops {
        /**
         * setup_cdp - setup client driven prefetch
         * @pipe: Pointer to software pipe context
-        * @cfg: Pointer to cdp configuration
+        * @fmt: format used by the sw pipe
+        * @enable: whether the CDP should be enabled for this pipe
         */
        void (*setup_cdp)(struct dpu_sw_pipe *pipe,
-                         struct dpu_hw_cdp_cfg *cfg);
+                         const struct dpu_format *fmt,
+                         bool enable);
 };
 
 /**
  * struct dpu_hw_sspp - pipe description
  * @base: hardware block base structure
  * @hw: block hardware details
- * @catalog: back pointer to catalog
- * @ubwc: ubwc configuration data
+ * @ubwc: UBWC configuration data
  * @idx: pipe index
  * @cap: pointer to layer_cfg
  * @ops: pointer to operations possible for this pipe
@@ -350,7 +317,6 @@ struct dpu_hw_sspp_ops {
 struct dpu_hw_sspp {
        struct dpu_hw_blk base;
        struct dpu_hw_blk_reg_map hw;
-       const struct dpu_mdss_cfg *catalog;
        const struct dpu_ubwc_cfg *ubwc;
 
        /* Pipe */
@@ -363,14 +329,14 @@ struct dpu_hw_sspp {
 
 struct dpu_kms;
 /**
- * dpu_hw_sspp_init - initializes the sspp hw driver object.
+ * dpu_hw_sspp_init() - Initializes the sspp hw driver object.
  * Should be called once before accessing every pipe.
- * @idx:  Pipe index for which driver object is required
+ * @cfg:  Pipe catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
- * @catalog : Pointer to mdss catalog data
+ * @ubwc: UBWC configuration data
  */
-struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx,
-               void __iomem *addr, const struct dpu_mdss_cfg *catalog);
+struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
+               void __iomem *addr, const struct dpu_ubwc_cfg *ubwc);
 
 /**
  * dpu_hw_sspp_destroy(): Destroys SSPP driver context
index 2bb02e17ee52c4d0664f1e83c7df90e038a9a026..963bdb5e025219649bff4833ad7d6d22740990a3 100644 (file)
@@ -130,24 +130,12 @@ static void dpu_hw_setup_vsync_source(struct dpu_hw_mdp *mdp,
                struct dpu_vsync_source_cfg *cfg)
 {
        struct dpu_hw_blk_reg_map *c;
-       u32 reg, wd_load_value, wd_ctl, wd_ctl2, i;
-       static const u32 pp_offset[PINGPONG_MAX] = {0xC, 0x8, 0x4, 0x13, 0x18};
+       u32 reg, wd_load_value, wd_ctl, wd_ctl2;
 
-       if (!mdp || !cfg || (cfg->pp_count > ARRAY_SIZE(cfg->ppnumber)))
+       if (!mdp || !cfg)
                return;
 
        c = &mdp->hw;
-       reg = DPU_REG_READ(c, MDP_VSYNC_SEL);
-       for (i = 0; i < cfg->pp_count; i++) {
-               int pp_idx = cfg->ppnumber[i] - PINGPONG_0;
-
-               if (pp_idx >= ARRAY_SIZE(pp_offset))
-                       continue;
-
-               reg &= ~(0xf << pp_offset[pp_idx]);
-               reg |= (cfg->vsync_source & 0xf) << pp_offset[pp_idx];
-       }
-       DPU_REG_WRITE(c, MDP_VSYNC_SEL, reg);
 
        if (cfg->vsync_source >= DPU_VSYNC_SOURCE_WD_TIMER_4 &&
                        cfg->vsync_source <= DPU_VSYNC_SOURCE_WD_TIMER_0) {
@@ -194,6 +182,33 @@ static void dpu_hw_setup_vsync_source(struct dpu_hw_mdp *mdp,
        }
 }
 
+static void dpu_hw_setup_vsync_source_and_vsync_sel(struct dpu_hw_mdp *mdp,
+               struct dpu_vsync_source_cfg *cfg)
+{
+       struct dpu_hw_blk_reg_map *c;
+       u32 reg, i;
+       static const u32 pp_offset[PINGPONG_MAX] = {0xC, 0x8, 0x4, 0x13, 0x18};
+
+       if (!mdp || !cfg || (cfg->pp_count > ARRAY_SIZE(cfg->ppnumber)))
+               return;
+
+       c = &mdp->hw;
+
+       reg = DPU_REG_READ(c, MDP_VSYNC_SEL);
+       for (i = 0; i < cfg->pp_count; i++) {
+               int pp_idx = cfg->ppnumber[i] - PINGPONG_0;
+
+               if (pp_idx >= ARRAY_SIZE(pp_offset))
+                       continue;
+
+               reg &= ~(0xf << pp_offset[pp_idx]);
+               reg |= (cfg->vsync_source & 0xf) << pp_offset[pp_idx];
+       }
+       DPU_REG_WRITE(c, MDP_VSYNC_SEL, reg);
+
+       dpu_hw_setup_vsync_source(mdp, cfg);
+}
+
 static void dpu_hw_get_safe_status(struct dpu_hw_mdp *mdp,
                struct dpu_danger_safe_status *status)
 {
@@ -241,7 +256,12 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
        ops->setup_split_pipe = dpu_hw_setup_split_pipe;
        ops->setup_clk_force_ctrl = dpu_hw_setup_clk_force_ctrl;
        ops->get_danger_status = dpu_hw_get_danger_status;
-       ops->setup_vsync_source = dpu_hw_setup_vsync_source;
+
+       if (cap & BIT(DPU_MDP_VSYNC_SEL))
+               ops->setup_vsync_source = dpu_hw_setup_vsync_source_and_vsync_sel;
+       else
+               ops->setup_vsync_source = dpu_hw_setup_vsync_source;
+
        ops->get_safe_status = dpu_hw_get_safe_status;
 
        if (cap & BIT(DPU_MDP_AUDIO_SELECT))
index 8062228eada687dcfb074b292eb97d6359e0730d..9d2273fd2fed58e5a58965d78958bfea49272b8d 100644 (file)
@@ -73,6 +73,19 @@ static u32 dpu_hw_util_log_mask = DPU_DBG_MASK_NONE;
 #define QSEED3LITE_SEP_LUT_SIZE \
                (QSEED3LITE_LUT_SIZE * QSEED3LITE_SEPARABLE_LUTS * sizeof(u32))
 
+/* QOS_LUT */
+#define QOS_DANGER_LUT                    0x00
+#define QOS_SAFE_LUT                      0x04
+#define QOS_CREQ_LUT                      0x08
+#define QOS_QOS_CTRL                      0x0C
+#define QOS_CREQ_LUT_0                    0x14
+#define QOS_CREQ_LUT_1                    0x18
+
+/* QOS_QOS_CTRL */
+#define QOS_QOS_CTRL_DANGER_SAFE_EN       BIT(0)
+#define QOS_QOS_CTRL_DANGER_VBLANK_MASK   GENMASK(5, 4)
+#define QOS_QOS_CTRL_VBLANK_EN            BIT(16)
+#define QOS_QOS_CTRL_CREQ_VBLANK_MASK     GENMASK(21, 20)
 
 void dpu_reg_write(struct dpu_hw_blk_reg_map *c,
                u32 reg_off,
@@ -450,6 +463,24 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl,
        return 0;
 }
 
+void _dpu_hw_setup_qos_lut(struct dpu_hw_blk_reg_map *c, u32 offset,
+                          bool qos_8lvl,
+                          const struct dpu_hw_qos_cfg *cfg)
+{
+       DPU_REG_WRITE(c, offset + QOS_DANGER_LUT, cfg->danger_lut);
+       DPU_REG_WRITE(c, offset + QOS_SAFE_LUT, cfg->safe_lut);
+
+       if (qos_8lvl) {
+               DPU_REG_WRITE(c, offset + QOS_CREQ_LUT_0, cfg->creq_lut);
+               DPU_REG_WRITE(c, offset + QOS_CREQ_LUT_1, cfg->creq_lut >> 32);
+       } else {
+               DPU_REG_WRITE(c, offset + QOS_CREQ_LUT, cfg->creq_lut);
+       }
+
+       DPU_REG_WRITE(c, offset + QOS_QOS_CTRL,
+                     cfg->danger_safe_en ? QOS_QOS_CTRL_DANGER_SAFE_EN : 0);
+}
+
 void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c,
                u32 misr_ctrl_offset,
                bool enable, u32 frame_count)
@@ -494,3 +525,24 @@ int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c,
 
        return 0;
 }
+
+#define CDP_ENABLE             BIT(0)
+#define CDP_UBWC_META_ENABLE   BIT(1)
+#define CDP_TILE_AMORTIZE_ENABLE BIT(2)
+#define CDP_PRELOAD_AHEAD_64   BIT(3)
+
+void dpu_setup_cdp(struct dpu_hw_blk_reg_map *c, u32 offset,
+                  const struct dpu_format *fmt, bool enable)
+{
+       u32 cdp_cntl = CDP_PRELOAD_AHEAD_64;
+
+       if (enable)
+               cdp_cntl |= CDP_ENABLE;
+       if (DPU_FORMAT_IS_UBWC(fmt))
+               cdp_cntl |= CDP_UBWC_META_ENABLE;
+       if (DPU_FORMAT_IS_UBWC(fmt) ||
+           DPU_FORMAT_IS_TILE(fmt))
+               cdp_cntl |= CDP_TILE_AMORTIZE_ENABLE;
+
+       DPU_REG_WRITE(c, offset, cdp_cntl);
+}
index 27f4c39e35ab3b70a83c33235835692c05182b05..1f6079f47071095774cd75d826038a93b57cac6c 100644 (file)
@@ -306,19 +306,20 @@ struct dpu_drm_scaler_v2 {
 };
 
 /**
- * struct dpu_hw_cdp_cfg : CDP configuration
- * @enable: true to enable CDP
- * @ubwc_meta_enable: true to enable ubwc metadata preload
- * @tile_amortize_enable: true to enable amortization control for tile format
- * @preload_ahead: number of request to preload ahead
- *     DPU_*_CDP_PRELOAD_AHEAD_32,
- *     DPU_*_CDP_PRELOAD_AHEAD_64
+ * struct dpu_hw_qos_cfg: pipe QoS configuration
+ * @danger_lut: LUT for generate danger level based on fill level
+ * @safe_lut: LUT for generate safe level based on fill level
+ * @creq_lut: LUT for generate creq level based on fill level
+ * @creq_vblank: creq value generated to vbif during vertical blanking
+ * @danger_vblank: danger value generated during vertical blanking
+ * @vblank_en: enable creq_vblank and danger_vblank during vblank
+ * @danger_safe_en: enable danger safe generation
  */
-struct dpu_hw_cdp_cfg {
-       bool enable;
-       bool ubwc_meta_enable;
-       bool tile_amortize_enable;
-       u32 preload_ahead;
+struct dpu_hw_qos_cfg {
+       u32 danger_lut;
+       u32 safe_lut;
+       u64 creq_lut;
+       bool danger_safe_en;
 };
 
 u32 *dpu_hw_util_get_log_mask_ptr(void);
@@ -346,9 +347,16 @@ void dpu_hw_csc_setup(struct dpu_hw_blk_reg_map  *c,
                u32 csc_reg_off,
                const struct dpu_csc_cfg *data, bool csc10);
 
+void dpu_setup_cdp(struct dpu_hw_blk_reg_map *c, u32 offset,
+                  const struct dpu_format *fmt, bool enable);
+
 u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl,
                u32 total_fl);
 
+void _dpu_hw_setup_qos_lut(struct dpu_hw_blk_reg_map *c, u32 offset,
+                          bool qos_8lvl,
+                          const struct dpu_hw_qos_cfg *cfg);
+
 void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c,
                u32 misr_ctrl_offset,
                bool enable,
index 16c56e2407064bd1c2e7611982ace5fd234a5849..a5121a50b2bbf8cc4b6cc7becbfd8c48510cd465 100644 (file)
@@ -211,45 +211,22 @@ static void _setup_vbif_ops(struct dpu_hw_vbif_ops *ops,
        ops->set_write_gather_en = dpu_hw_set_write_gather_en;
 }
 
-static const struct dpu_vbif_cfg *_top_offset(enum dpu_vbif vbif,
-               const struct dpu_mdss_cfg *m,
-               void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->vbif_count; i++) {
-               if (vbif == m->vbif[i].id) {
-                       b->blk_addr = addr + m->vbif[i].base;
-                       b->log_mask = DPU_DBG_MASK_VBIF;
-                       return &m->vbif[i];
-               }
-       }
-
-       return ERR_PTR(-EINVAL);
-}
-
-struct dpu_hw_vbif *dpu_hw_vbif_init(enum dpu_vbif idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m)
+struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_vbif *c;
-       const struct dpu_vbif_cfg *cfg;
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _top_offset(idx, m, addr, &c->hw);
-       if (IS_ERR_OR_NULL(cfg)) {
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_VBIF;
 
        /*
         * Assign ops
         */
-       c->idx = idx;
+       c->idx = cfg->id;
        c->cap = cfg;
        _setup_vbif_ops(&c->ops, c->cap->features);
 
index 6417aa28d32c336287e2d6f425113aa36c03619f..7e10d2a172b45aef00bc53a6686ae753741d6780 100644 (file)
@@ -106,14 +106,13 @@ struct dpu_hw_vbif {
 };
 
 /**
- * dpu_hw_vbif_init - initializes the vbif driver for the passed interface idx
- * @idx:  Interface index for which driver object is required
+ * dpu_hw_vbif_init() - Initializes the VBIF driver for the passed
+ * VBIF catalog entry.
+ * @cfg:  VBIF catalog entry for which driver object is required
  * @addr: Mapped register io address of MDSS
- * @m:    Pointer to mdss catalog data
  */
-struct dpu_hw_vbif *dpu_hw_vbif_init(enum dpu_vbif idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
+               void __iomem *addr);
 
 void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif);
 
index 2d28afdf860efc43709e1c648be6607763ef4603..ebc416400382202194550ed789f7f4c0bb3ecb64 100644 (file)
 #define WB_OUT_IMAGE_SIZE                     0x2C0
 #define WB_OUT_XY                             0x2C4
 
-/* WB_QOS_CTRL */
-#define WB_QOS_CTRL_DANGER_SAFE_EN            BIT(0)
-
-static const struct dpu_wb_cfg *_wb_offset(enum dpu_wb wb,
-               const struct dpu_mdss_cfg *m, void __iomem *addr,
-               struct dpu_hw_blk_reg_map *b)
-{
-       int i;
-
-       for (i = 0; i < m->wb_count; i++) {
-               if (wb == m->wb[i].id) {
-                       b->blk_addr = addr + m->wb[i].base;
-                       return &m->wb[i];
-               }
-       }
-       return ERR_PTR(-EINVAL);
-}
-
 static void dpu_hw_wb_setup_outaddress(struct dpu_hw_wb *ctx,
                struct dpu_hw_wb_cfg *data)
 {
@@ -150,58 +132,29 @@ static void dpu_hw_wb_roi(struct dpu_hw_wb *ctx, struct dpu_hw_wb_cfg *wb)
 }
 
 static void dpu_hw_wb_setup_qos_lut(struct dpu_hw_wb *ctx,
-               struct dpu_hw_wb_qos_cfg *cfg)
+               struct dpu_hw_qos_cfg *cfg)
 {
-       struct dpu_hw_blk_reg_map *c = &ctx->hw;
-       u32 qos_ctrl = 0;
-
        if (!ctx || !cfg)
                return;
 
-       DPU_REG_WRITE(c, WB_DANGER_LUT, cfg->danger_lut);
-       DPU_REG_WRITE(c, WB_SAFE_LUT, cfg->safe_lut);
-
-       /*
-        * for chipsets not using DPU_WB_QOS_8LVL but still using DPU
-        * driver such as msm8998, the reset value of WB_CREQ_LUT is
-        * sufficient for writeback to work. SW doesn't need to explicitly
-        * program a value.
-        */
-       if (ctx->caps && test_bit(DPU_WB_QOS_8LVL, &ctx->caps->features)) {
-               DPU_REG_WRITE(c, WB_CREQ_LUT_0, cfg->creq_lut);
-               DPU_REG_WRITE(c, WB_CREQ_LUT_1, cfg->creq_lut >> 32);
-       }
-
-       if (cfg->danger_safe_en)
-               qos_ctrl |= WB_QOS_CTRL_DANGER_SAFE_EN;
-
-       DPU_REG_WRITE(c, WB_QOS_CTRL, qos_ctrl);
+       _dpu_hw_setup_qos_lut(&ctx->hw, WB_DANGER_LUT,
+                             test_bit(DPU_WB_QOS_8LVL, &ctx->caps->features),
+                             cfg);
 }
 
 static void dpu_hw_wb_setup_cdp(struct dpu_hw_wb *ctx,
-               struct dpu_hw_cdp_cfg *cfg)
+                               const struct dpu_format *fmt,
+                               bool enable)
 {
-       struct dpu_hw_blk_reg_map *c;
-       u32 cdp_cntl = 0;
-
-       if (!ctx || !cfg)
+       if (!ctx)
                return;
 
-       c = &ctx->hw;
-
-       if (cfg->enable)
-               cdp_cntl |= BIT(0);
-       if (cfg->ubwc_meta_enable)
-               cdp_cntl |= BIT(1);
-       if (cfg->preload_ahead == DPU_WB_CDP_PRELOAD_AHEAD_64)
-               cdp_cntl |= BIT(3);
-
-       DPU_REG_WRITE(c, WB_CDP_CNTL, cdp_cntl);
+       dpu_setup_cdp(&ctx->hw, WB_CDP_CNTL, fmt, enable);
 }
 
 static void dpu_hw_wb_bind_pingpong_blk(
                struct dpu_hw_wb *ctx,
-               bool enable, const enum dpu_pingpong pp)
+               const enum dpu_pingpong pp)
 {
        struct dpu_hw_blk_reg_map *c;
        int mux_cfg;
@@ -214,7 +167,7 @@ static void dpu_hw_wb_bind_pingpong_blk(
        mux_cfg = DPU_REG_READ(c, WB_MUX);
        mux_cfg &= ~0xf;
 
-       if (enable)
+       if (pp)
                mux_cfg |= (pp - PINGPONG_0) & 0x7;
        else
                mux_cfg |= 0xf;
@@ -241,29 +194,23 @@ static void _setup_wb_ops(struct dpu_hw_wb_ops *ops,
                ops->bind_pingpong_blk = dpu_hw_wb_bind_pingpong_blk;
 }
 
-struct dpu_hw_wb *dpu_hw_wb_init(enum dpu_wb idx,
-               void __iomem *addr, const struct dpu_mdss_cfg *m)
+struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
+               void __iomem *addr)
 {
        struct dpu_hw_wb *c;
-       const struct dpu_wb_cfg *cfg;
 
-       if (!addr || !m)
+       if (!addr)
                return ERR_PTR(-EINVAL);
 
        c = kzalloc(sizeof(*c), GFP_KERNEL);
        if (!c)
                return ERR_PTR(-ENOMEM);
 
-       cfg = _wb_offset(idx, m, addr, &c->hw);
-       if (IS_ERR(cfg)) {
-               WARN(1, "Unable to find wb idx=%d\n", idx);
-               kfree(c);
-               return ERR_PTR(-EINVAL);
-       }
+       c->hw.blk_addr = addr + cfg->base;
+       c->hw.log_mask = DPU_DBG_MASK_WB;
 
        /* Assign ops */
-       c->mdp = &m->mdp[0];
-       c->idx = idx;
+       c->idx = cfg->id;
        c->caps = cfg;
        _setup_wb_ops(&c->ops, c->caps->features);
 
index 3ff5a48541e2ecfeab5915b2e9e2a562e5f7ab8b..2d7db2efa3d0181fa6ba5247d55ce2ac566ed9b3 100644 (file)
@@ -21,28 +21,6 @@ struct dpu_hw_wb_cfg {
        struct drm_rect crop;
 };
 
-/**
- * enum CDP preload ahead address size
- */
-enum {
-       DPU_WB_CDP_PRELOAD_AHEAD_32,
-       DPU_WB_CDP_PRELOAD_AHEAD_64
-};
-
-/**
- * struct dpu_hw_wb_qos_cfg : Writeback pipe QoS configuration
- * @danger_lut: LUT for generate danger level based on fill level
- * @safe_lut: LUT for generate safe level based on fill level
- * @creq_lut: LUT for generate creq level based on fill level
- * @danger_safe_en: enable danger safe generation
- */
-struct dpu_hw_wb_qos_cfg {
-       u32 danger_lut;
-       u32 safe_lut;
-       u64 creq_lut;
-       bool danger_safe_en;
-};
-
 /**
  *
  * struct dpu_hw_wb_ops : Interface to the wb hw driver functions
@@ -64,27 +42,25 @@ struct dpu_hw_wb_ops {
                        struct dpu_hw_wb_cfg *wb);
 
        void (*setup_qos_lut)(struct dpu_hw_wb *ctx,
-                       struct dpu_hw_wb_qos_cfg *cfg);
+                       struct dpu_hw_qos_cfg *cfg);
 
        void (*setup_cdp)(struct dpu_hw_wb *ctx,
-                       struct dpu_hw_cdp_cfg *cfg);
+                         const struct dpu_format *fmt,
+                         bool enable);
 
        void (*bind_pingpong_blk)(struct dpu_hw_wb *ctx,
-                       bool enable, const enum dpu_pingpong pp);
+                                 const enum dpu_pingpong pp);
 };
 
 /**
  * struct dpu_hw_wb : WB driver object
  * @hw: block hardware details
- * @mdp: pointer to associated mdp portion of the catalog
  * @idx: hardware index number within type
  * @wb_hw_caps: hardware capabilities
  * @ops: function pointers
- * @hw_mdp: MDP top level hardware block
  */
 struct dpu_hw_wb {
        struct dpu_hw_blk_reg_map hw;
-       const struct dpu_mdp_cfg *mdp;
 
        /* wb path */
        int idx;
@@ -92,19 +68,16 @@ struct dpu_hw_wb {
 
        /* ops */
        struct dpu_hw_wb_ops ops;
-
-       struct dpu_hw_mdp *hw_mdp;
 };
 
 /**
- * dpu_hw_wb_init(): Initializes and return writeback hw driver object.
- * @idx:  wb_path index for which driver object is required
+ * dpu_hw_wb_init() - Initializes the writeback hw driver object.
+ * @cfg:  wb_path catalog entry for which driver object is required
  * @addr: mapped register io address of MDP
- * @m :   pointer to mdss catalog data
+ * Return: Error code or allocated dpu_hw_wb context
  */
-struct dpu_hw_wb *dpu_hw_wb_init(enum dpu_wb idx,
-               void __iomem *addr,
-               const struct dpu_mdss_cfg *m);
+struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
+               void __iomem *addr);
 
 /**
  * dpu_hw_wb_destroy(): Destroy writeback hw driver object.
index feb9a729844a3c1488419e360382e48ac3f16e1b..5acd5683d25a4021950a80d341d732ac6d7fc856 100644 (file)
@@ -21,9 +21,6 @@
 #define HIST_INTR_EN                    0x01c
 #define HIST_INTR_STATUS                0x020
 #define HIST_INTR_CLEAR                 0x024
-#define INTF_INTR_EN                    0x1C0
-#define INTF_INTR_STATUS                0x1C4
-#define INTF_INTR_CLEAR                 0x1C8
 #define SPLIT_DISPLAY_EN                0x2F4
 #define SPLIT_DISPLAY_UPPER_PIPE_CTRL   0x2F8
 #define DSPP_IGC_COLOR0_RAM_LUTN        0x300
index 0e7a68714e9e16f158c8c84eebd99a113afc3228..aa8499de1b9f3179027e96775f940794059fe181 100644 (file)
@@ -57,8 +57,8 @@ static void _dpu_kms_mmu_destroy(struct dpu_kms *dpu_kms);
 static int _dpu_danger_signal_status(struct seq_file *s,
                bool danger_status)
 {
-       struct dpu_kms *kms = (struct dpu_kms *)s->private;
        struct dpu_danger_safe_status status;
+       struct dpu_kms *kms = s->private;
        int i;
 
        if (!kms->hw_mdp) {
@@ -535,15 +535,23 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
                    !msm_dsi_is_master_dsi(priv->dsi[i]))
                        continue;
 
-               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI);
+               memset(&info, 0, sizeof(info));
+               info.intf_type = INTF_DSI;
+
+               info.h_tile_instance[info.num_of_h_tiles++] = i;
+               if (msm_dsi_is_bonded_dsi(priv->dsi[i]))
+                       info.h_tile_instance[info.num_of_h_tiles++] = other;
+
+               info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);
+
+               info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);
+
+               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI, &info);
                if (IS_ERR(encoder)) {
                        DPU_ERROR("encoder init failed for dsi display\n");
                        return PTR_ERR(encoder);
                }
 
-               memset(&info, 0, sizeof(info));
-               info.intf_type = encoder->encoder_type;
-
                rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder);
                if (rc) {
                        DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n",
@@ -551,11 +559,6 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
                        break;
                }
 
-               info.h_tile_instance[info.num_of_h_tiles++] = i;
-               info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);
-
-               info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);
-
                if (msm_dsi_is_bonded_dsi(priv->dsi[i]) && priv->dsi[other]) {
                        rc = msm_dsi_modeset_init(priv->dsi[other], dev, encoder);
                        if (rc) {
@@ -563,14 +566,7 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
                                        other, rc);
                                break;
                        }
-
-                       info.h_tile_instance[info.num_of_h_tiles++] = other;
                }
-
-               rc = dpu_encoder_setup(dev, encoder, &info);
-               if (rc)
-                       DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
        }
 
        return rc;
@@ -589,67 +585,86 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
                if (!priv->dp[i])
                        continue;
 
-               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS);
+               memset(&info, 0, sizeof(info));
+               info.num_of_h_tiles = 1;
+               info.h_tile_instance[0] = i;
+               info.intf_type = INTF_DP;
+
+               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
                if (IS_ERR(encoder)) {
                        DPU_ERROR("encoder init failed for dsi display\n");
                        return PTR_ERR(encoder);
                }
 
-               memset(&info, 0, sizeof(info));
                rc = msm_dp_modeset_init(priv->dp[i], dev, encoder);
                if (rc) {
                        DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                        drm_encoder_cleanup(encoder);
                        return rc;
                }
-
-               info.num_of_h_tiles = 1;
-               info.h_tile_instance[0] = i;
-               info.intf_type = encoder->encoder_type;
-               rc = dpu_encoder_setup(dev, encoder, &info);
-               if (rc) {
-                       DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
-                       return rc;
-               }
        }
 
        return 0;
 }
 
-static int _dpu_kms_initialize_writeback(struct drm_device *dev,
-               struct msm_drm_private *priv, struct dpu_kms *dpu_kms,
-               const u32 *wb_formats, int n_formats)
+static int _dpu_kms_initialize_hdmi(struct drm_device *dev,
+                                   struct msm_drm_private *priv,
+                                   struct dpu_kms *dpu_kms)
 {
        struct drm_encoder *encoder = NULL;
        struct msm_display_info info;
        int rc;
 
-       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL);
+       if (!priv->hdmi)
+               return 0;
+
+       memset(&info, 0, sizeof(info));
+       info.num_of_h_tiles = 1;
+       info.h_tile_instance[0] = 0;
+       info.intf_type = INTF_HDMI;
+
+       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
        if (IS_ERR(encoder)) {
-               DPU_ERROR("encoder init failed for dsi display\n");
+               DPU_ERROR("encoder init failed for HDMI display\n");
                return PTR_ERR(encoder);
        }
 
-       memset(&info, 0, sizeof(info));
-
-       rc = dpu_writeback_init(dev, encoder, wb_formats,
-                       n_formats);
+       rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder);
        if (rc) {
-               DPU_ERROR("dpu_writeback_init, rc = %d\n", rc);
+               DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                drm_encoder_cleanup(encoder);
                return rc;
        }
 
+       return 0;
+}
+
+static int _dpu_kms_initialize_writeback(struct drm_device *dev,
+               struct msm_drm_private *priv, struct dpu_kms *dpu_kms,
+               const u32 *wb_formats, int n_formats)
+{
+       struct drm_encoder *encoder = NULL;
+       struct msm_display_info info;
+       int rc;
+
+       memset(&info, 0, sizeof(info));
+
        info.num_of_h_tiles = 1;
        /* use only WB idx 2 instance for DPU */
        info.h_tile_instance[0] = WB_2;
-       info.intf_type = encoder->encoder_type;
+       info.intf_type = INTF_WB;
 
-       rc = dpu_encoder_setup(dev, encoder, &info);
+       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL, &info);
+       if (IS_ERR(encoder)) {
+               DPU_ERROR("encoder init failed for dsi display\n");
+               return PTR_ERR(encoder);
+       }
+
+       rc = dpu_writeback_init(dev, encoder, wb_formats,
+                       n_formats);
        if (rc) {
-               DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
+               DPU_ERROR("dpu_writeback_init, rc = %d\n", rc);
+               drm_encoder_cleanup(encoder);
                return rc;
        }
 
@@ -683,6 +698,12 @@ static int _dpu_kms_setup_displays(struct drm_device *dev,
                return rc;
        }
 
+       rc = _dpu_kms_initialize_hdmi(dev, priv, dpu_kms);
+       if (rc) {
+               DPU_ERROR("initialize HDMI failed, rc = %d\n", rc);
+               return rc;
+       }
+
        /* Since WB isn't a driver check the catalog before initializing */
        if (dpu_kms->catalog->wb_count) {
                for (i = 0; i < dpu_kms->catalog->wb_count; i++) {
@@ -979,13 +1000,13 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
        return 0;
 }
 
-u64 dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name)
+unsigned long dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name)
 {
        struct clk *clk;
 
        clk = msm_clk_bulk_get_clock(dpu_kms->clocks, dpu_kms->num_clocks, clock_name);
        if (!clk)
-               return -EINVAL;
+               return 0;
 
        return clk_get_rate(clk);
 }
@@ -1005,6 +1026,9 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
        dpu_kms = to_dpu_kms(kms);
        dev = dpu_kms->dev;
 
+       dev->mode_config.cursor_width = 512;
+       dev->mode_config.cursor_height = 512;
+
        rc = dpu_kms_global_obj_init(dpu_kms);
        if (rc)
                return rc;
@@ -1033,12 +1057,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
                DPU_DEBUG("VBIF NRT is not defined");
        }
 
-       dpu_kms->reg_dma = msm_ioremap_quiet(dpu_kms->pdev, "regdma");
-       if (IS_ERR(dpu_kms->reg_dma)) {
-               dpu_kms->reg_dma = NULL;
-               DPU_DEBUG("REG_DMA is not defined");
-       }
-
        dpu_kms_parse_data_bus_icc_path(dpu_kms);
 
        rc = pm_runtime_resume_and_get(&dpu_kms->pdev->dev);
@@ -1084,16 +1102,17 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
        }
 
        for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
-               u32 vbif_idx = dpu_kms->catalog->vbif[i].id;
-
-               dpu_kms->hw_vbif[vbif_idx] = dpu_hw_vbif_init(vbif_idx,
-                               dpu_kms->vbif[vbif_idx], dpu_kms->catalog);
-               if (IS_ERR(dpu_kms->hw_vbif[vbif_idx])) {
-                       rc = PTR_ERR(dpu_kms->hw_vbif[vbif_idx]);
-                       DPU_ERROR("failed to init vbif %d: %d\n", vbif_idx, rc);
-                       dpu_kms->hw_vbif[vbif_idx] = NULL;
+               struct dpu_hw_vbif *hw;
+               const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
+
+               hw = dpu_hw_vbif_init(vbif, dpu_kms->vbif[vbif->id]);
+               if (IS_ERR(hw)) {
+                       rc = PTR_ERR(hw);
+                       DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
                        goto power_error;
                }
+
+               dpu_kms->hw_vbif[vbif->id] = hw;
        }
 
        rc = dpu_core_perf_init(&dpu_kms->perf, dev, dpu_kms->catalog,
@@ -1286,6 +1305,8 @@ static const struct of_device_id dpu_dt_match[] = {
        { .compatible = "qcom,sc8180x-dpu", .data = &dpu_sc8180x_cfg, },
        { .compatible = "qcom,sc8280xp-dpu", .data = &dpu_sc8280xp_cfg, },
        { .compatible = "qcom,sm6115-dpu", .data = &dpu_sm6115_cfg, },
+       { .compatible = "qcom,sm6350-dpu", .data = &dpu_sm6350_cfg, },
+       { .compatible = "qcom,sm6375-dpu", .data = &dpu_sm6375_cfg, },
        { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, },
        { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, },
        { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, },
index aca39a4689f489e1a7d603e7d2f646cd7ae5664a..f3bdd4f11108a1752991554319bdb7f87ffe6bf4 100644 (file)
 #define ktime_compare_safe(A, B) \
        ktime_compare(ktime_sub((A), (B)), ktime_set(0, 0))
 
-#define DPU_NAME_SIZE  12
-
 struct dpu_kms {
        struct msm_kms base;
        struct drm_device *dev;
        const struct dpu_mdss_cfg *catalog;
 
        /* io/register spaces: */
-       void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma;
+       void __iomem *mmio, *vbif[VBIF_MAX];
 
        struct regulator *vdd;
        struct regulator *mmagic;
@@ -118,6 +116,10 @@ struct vsync_info {
        u32 line_count;
 };
 
+#define DPU_ENC_WR_PTR_START_TIMEOUT_US 20000
+
+#define DPU_ENC_MAX_POLL_TIMEOUT_US    2000
+
 #define to_dpu_kms(x) container_of(x, struct dpu_kms, base)
 
 #define to_dpu_global_state(x) container_of(x, struct dpu_global_state, base)
@@ -201,6 +203,6 @@ void dpu_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc);
  *
  * Return: current clock rate
  */
-u64 dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name);
+unsigned long dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name);
 
 #endif /* __dpu_kms_H__ */
index 14b5cfe30611396d5ceee44e722b676d05697c33..c2aaaded07ed6a9808eb4b93fe945715203f0cf1 100644 (file)
@@ -42,8 +42,6 @@
 #define SHARP_SMOOTH_THR_DEFAULT       8
 #define SHARP_NOISE_THR_DEFAULT        2
 
-#define DPU_NAME_SIZE  12
-
 #define DPU_PLANE_COLOR_FILL_FLAG      BIT(31)
 #define DPU_ZPOS_MAX 255
 
@@ -70,20 +68,6 @@ static const uint32_t qcom_compressed_supported_formats[] = {
        DRM_FORMAT_P010,
 };
 
-/**
- * enum dpu_plane_qos - Different qos configurations for each pipe
- *
- * @DPU_PLANE_QOS_VBLANK_CTRL: Setup VBLANK qos for the pipe.
- * @DPU_PLANE_QOS_VBLANK_AMORTIZE: Enables Amortization within pipe.
- *     this configuration is mutually exclusive from VBLANK_CTRL.
- * @DPU_PLANE_QOS_PANIC_CTRL: Setup panic for the pipe.
- */
-enum dpu_plane_qos {
-       DPU_PLANE_QOS_VBLANK_CTRL = BIT(0),
-       DPU_PLANE_QOS_VBLANK_AMORTIZE = BIT(1),
-       DPU_PLANE_QOS_PANIC_CTRL = BIT(2),
-};
-
 /*
  * struct dpu_plane - local dpu plane structure
  * @aspace: address space pointer
@@ -204,12 +188,14 @@ static u64 _dpu_plane_calc_clk(const struct drm_display_mode *mode,
  * _dpu_plane_calc_fill_level - calculate fill level of the given source format
  * @plane:             Pointer to drm plane
  * @pipe:              Pointer to software pipe
+ * @lut_usage:         LUT usecase
  * @fmt:               Pointer to source buffer format
  * @src_width:         width of source buffer
  * Return: fill level corresponding to the source buffer/format or 0 if error
  */
 static int _dpu_plane_calc_fill_level(struct drm_plane *plane,
                struct dpu_sw_pipe *pipe,
+               enum dpu_qos_lut_usage lut_usage,
                const struct dpu_format *fmt, u32 src_width)
 {
        struct dpu_plane *pdpu;
@@ -221,6 +207,9 @@ static int _dpu_plane_calc_fill_level(struct drm_plane *plane,
                return 0;
        }
 
+       if (lut_usage == DPU_QOS_LUT_USAGE_NRT)
+               return 0;
+
        pdpu = to_dpu_plane(plane);
        fixed_buff_size = pdpu->catalog->caps->pixel_ram_size;
 
@@ -266,83 +255,58 @@ static void _dpu_plane_set_qos_lut(struct drm_plane *plane,
                const struct dpu_format *fmt, struct dpu_sw_pipe_cfg *pipe_cfg)
 {
        struct dpu_plane *pdpu = to_dpu_plane(plane);
-       u64 qos_lut;
-       u32 total_fl = 0, lut_usage;
+       struct dpu_hw_qos_cfg cfg;
+       u32 total_fl, lut_usage;
 
        if (!pdpu->is_rt_pipe) {
                lut_usage = DPU_QOS_LUT_USAGE_NRT;
        } else {
-               total_fl = _dpu_plane_calc_fill_level(plane, pipe, fmt,
-                               drm_rect_width(&pipe_cfg->src_rect));
-
                if (fmt && DPU_FORMAT_IS_LINEAR(fmt))
                        lut_usage = DPU_QOS_LUT_USAGE_LINEAR;
                else
                        lut_usage = DPU_QOS_LUT_USAGE_MACROTILE;
        }
 
-       qos_lut = _dpu_hw_get_qos_lut(
-                       &pdpu->catalog->perf->qos_lut_tbl[lut_usage], total_fl);
+       total_fl = _dpu_plane_calc_fill_level(plane, pipe, lut_usage, fmt,
+                               drm_rect_width(&pipe_cfg->src_rect));
+
+       cfg.creq_lut = _dpu_hw_get_qos_lut(&pdpu->catalog->perf->qos_lut_tbl[lut_usage], total_fl);
+       cfg.danger_lut = pdpu->catalog->perf->danger_lut_tbl[lut_usage];
+       cfg.safe_lut = pdpu->catalog->perf->safe_lut_tbl[lut_usage];
+
+       if (pipe->sspp->idx != SSPP_CURSOR0 &&
+           pipe->sspp->idx != SSPP_CURSOR1 &&
+           pdpu->is_rt_pipe)
+               cfg.danger_safe_en = true;
+
+       DPU_DEBUG_PLANE(pdpu, "pnum:%d ds:%d is_rt:%d\n",
+               pdpu->pipe - SSPP_VIG0,
+               cfg.danger_safe_en,
+               pdpu->is_rt_pipe);
 
        trace_dpu_perf_set_qos_luts(pipe->sspp->idx - SSPP_VIG0,
                        (fmt) ? fmt->base.pixel_format : 0,
-                       pdpu->is_rt_pipe, total_fl, qos_lut, lut_usage);
+                       pdpu->is_rt_pipe, total_fl, cfg.creq_lut, lut_usage);
 
        DPU_DEBUG_PLANE(pdpu, "pnum:%d fmt: %4.4s rt:%d fl:%u lut:0x%llx\n",
                        pdpu->pipe - SSPP_VIG0,
                        fmt ? (char *)&fmt->base.pixel_format : NULL,
-                       pdpu->is_rt_pipe, total_fl, qos_lut);
-
-       pipe->sspp->ops.setup_creq_lut(pipe->sspp, qos_lut);
-}
-
-/**
- * _dpu_plane_set_danger_lut - set danger/safe LUT of the given plane
- * @plane:             Pointer to drm plane
- * @pipe:              Pointer to software pipe
- * @fmt:               Pointer to source buffer format
- */
-static void _dpu_plane_set_danger_lut(struct drm_plane *plane,
-               struct dpu_sw_pipe *pipe,
-               const struct dpu_format *fmt)
-{
-       struct dpu_plane *pdpu = to_dpu_plane(plane);
-       u32 danger_lut, safe_lut;
-
-       if (!pdpu->is_rt_pipe) {
-               danger_lut = pdpu->catalog->perf->danger_lut_tbl
-                               [DPU_QOS_LUT_USAGE_NRT];
-               safe_lut = pdpu->catalog->perf->safe_lut_tbl
-                               [DPU_QOS_LUT_USAGE_NRT];
-       } else {
-               if (fmt && DPU_FORMAT_IS_LINEAR(fmt)) {
-                       danger_lut = pdpu->catalog->perf->danger_lut_tbl
-                                       [DPU_QOS_LUT_USAGE_LINEAR];
-                       safe_lut = pdpu->catalog->perf->safe_lut_tbl
-                                       [DPU_QOS_LUT_USAGE_LINEAR];
-               } else {
-                       danger_lut = pdpu->catalog->perf->danger_lut_tbl
-                                       [DPU_QOS_LUT_USAGE_MACROTILE];
-                       safe_lut = pdpu->catalog->perf->safe_lut_tbl
-                                       [DPU_QOS_LUT_USAGE_MACROTILE];
-               }
-       }
+                       pdpu->is_rt_pipe, total_fl, cfg.creq_lut);
 
        trace_dpu_perf_set_danger_luts(pdpu->pipe - SSPP_VIG0,
                        (fmt) ? fmt->base.pixel_format : 0,
                        (fmt) ? fmt->fetch_mode : 0,
-                       danger_lut,
-                       safe_lut);
+                       cfg.danger_lut,
+                       cfg.safe_lut);
 
        DPU_DEBUG_PLANE(pdpu, "pnum:%d fmt: %4.4s mode:%d luts[0x%x, 0x%x]\n",
                pdpu->pipe - SSPP_VIG0,
                fmt ? (char *)&fmt->base.pixel_format : NULL,
                fmt ? fmt->fetch_mode : -1,
-               danger_lut,
-               safe_lut);
+               cfg.danger_lut,
+               cfg.safe_lut);
 
-       pipe->sspp->ops.setup_danger_safe_lut(pipe->sspp,
-                       danger_lut, safe_lut);
+       pipe->sspp->ops.setup_qos_lut(pipe->sspp, &cfg);
 }
 
 /**
@@ -350,48 +314,23 @@ static void _dpu_plane_set_danger_lut(struct drm_plane *plane,
  * @plane:             Pointer to drm plane
  * @pipe:              Pointer to software pipe
  * @enable:            true to enable QoS control
- * @flags:             QoS control mode (enum dpu_plane_qos)
  */
 static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,
        struct dpu_sw_pipe *pipe,
-       bool enable, u32 flags)
+       bool enable)
 {
        struct dpu_plane *pdpu = to_dpu_plane(plane);
-       struct dpu_hw_pipe_qos_cfg pipe_qos_cfg;
-
-       memset(&pipe_qos_cfg, 0, sizeof(pipe_qos_cfg));
-
-       if (flags & DPU_PLANE_QOS_VBLANK_CTRL) {
-               pipe_qos_cfg.creq_vblank = pipe->sspp->cap->sblk->creq_vblank;
-               pipe_qos_cfg.danger_vblank =
-                               pipe->sspp->cap->sblk->danger_vblank;
-               pipe_qos_cfg.vblank_en = enable;
-       }
 
-       if (flags & DPU_PLANE_QOS_VBLANK_AMORTIZE) {
-               /* this feature overrules previous VBLANK_CTRL */
-               pipe_qos_cfg.vblank_en = false;
-               pipe_qos_cfg.creq_vblank = 0; /* clear vblank bits */
-       }
-
-       if (flags & DPU_PLANE_QOS_PANIC_CTRL)
-               pipe_qos_cfg.danger_safe_en = enable;
-
-       if (!pdpu->is_rt_pipe) {
-               pipe_qos_cfg.vblank_en = false;
-               pipe_qos_cfg.danger_safe_en = false;
-       }
+       if (!pdpu->is_rt_pipe)
+               enable = false;
 
-       DPU_DEBUG_PLANE(pdpu, "pnum:%d ds:%d vb:%d pri[0x%x, 0x%x] is_rt:%d\n",
+       DPU_DEBUG_PLANE(pdpu, "pnum:%d ds:%d is_rt:%d\n",
                pdpu->pipe - SSPP_VIG0,
-               pipe_qos_cfg.danger_safe_en,
-               pipe_qos_cfg.vblank_en,
-               pipe_qos_cfg.creq_vblank,
-               pipe_qos_cfg.danger_vblank,
+               enable,
                pdpu->is_rt_pipe);
 
        pipe->sspp->ops.setup_qos_ctrl(pipe->sspp,
-                       &pipe_qos_cfg);
+                                      enable);
 }
 
 /**
@@ -1079,10 +1018,10 @@ static void dpu_plane_sspp_update_pipe(struct drm_plane *plane,
                pipe->sspp->ops.setup_sourceaddress(pipe, layout);
        }
 
-       _dpu_plane_set_qos_ctrl(plane, pipe, false, DPU_PLANE_QOS_PANIC_CTRL);
-
        /* override for color fill */
        if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) {
+               _dpu_plane_set_qos_ctrl(plane, pipe, false);
+
                /* skip remaining processing on color fill */
                return;
        }
@@ -1116,30 +1055,18 @@ static void dpu_plane_sspp_update_pipe(struct drm_plane *plane,
                pipe->sspp->ops.setup_format(pipe, fmt, src_flags);
 
                if (pipe->sspp->ops.setup_cdp) {
-                       struct dpu_hw_cdp_cfg cdp_cfg;
-
-                       memset(&cdp_cfg, 0, sizeof(struct dpu_hw_cdp_cfg));
+                       const struct dpu_perf_cfg *perf = pdpu->catalog->perf;
 
-                       cdp_cfg.enable = pdpu->catalog->perf->cdp_cfg
-                                       [DPU_PERF_CDP_USAGE_RT].rd_enable;
-                       cdp_cfg.ubwc_meta_enable =
-                                       DPU_FORMAT_IS_UBWC(fmt);
-                       cdp_cfg.tile_amortize_enable =
-                                       DPU_FORMAT_IS_UBWC(fmt) ||
-                                       DPU_FORMAT_IS_TILE(fmt);
-                       cdp_cfg.preload_ahead = DPU_SSPP_CDP_PRELOAD_AHEAD_64;
-
-                       pipe->sspp->ops.setup_cdp(pipe, &cdp_cfg);
+                       pipe->sspp->ops.setup_cdp(pipe, fmt,
+                                                 perf->cdp_cfg[DPU_PERF_CDP_USAGE_RT].rd_enable);
                }
        }
 
        _dpu_plane_set_qos_lut(plane, pipe, fmt, pipe_cfg);
-       _dpu_plane_set_danger_lut(plane, pipe, fmt);
 
-       if (plane->type != DRM_PLANE_TYPE_CURSOR) {
-               _dpu_plane_set_qos_ctrl(plane, pipe, true, DPU_PLANE_QOS_PANIC_CTRL);
+       if (pipe->sspp->idx != SSPP_CURSOR0 &&
+           pipe->sspp->idx != SSPP_CURSOR1)
                _dpu_plane_set_ot_limit(plane, pipe, pipe_cfg, frame_rate);
-       }
 
        if (pstate->needs_qos_remap)
                _dpu_plane_set_qos_remap(plane, pipe);
@@ -1254,10 +1181,10 @@ static void dpu_plane_destroy(struct drm_plane *plane)
 
        if (pdpu) {
                pstate = to_dpu_plane_state(plane->state);
-               _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false, DPU_PLANE_QOS_PANIC_CTRL);
+               _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false);
 
                if (pstate->r_pipe.sspp)
-                       _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false, DPU_PLANE_QOS_PANIC_CTRL);
+                       _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
 
                mutex_destroy(&pdpu->lock);
 
@@ -1414,9 +1341,9 @@ void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
                return;
 
        pm_runtime_get_sync(&dpu_kms->pdev->dev);
-       _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, enable, DPU_PLANE_QOS_PANIC_CTRL);
+       _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, enable);
        if (pstate->r_pipe.sspp)
-               _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, enable, DPU_PLANE_QOS_PANIC_CTRL);
+               _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, enable);
        pm_runtime_put_sync(&dpu_kms->pdev->dev);
 }
 #endif
index f4dda88a73f7d376f0be010a2e30978eff56c5bd..2ca3c666e22ff4294a6a8b11b8d822a93850583f 100644 (file)
@@ -117,16 +117,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_mixer *hw;
                const struct dpu_lm_cfg *lm = &cat->mixer[i];
 
-               if (lm->pingpong == PINGPONG_MAX) {
-                       DPU_DEBUG("skip mixer %d without pingpong\n", lm->id);
-                       continue;
-               }
-
-               if (lm->id < LM_0 || lm->id >= LM_MAX) {
-                       DPU_ERROR("skip mixer %d with invalid id\n", lm->id);
-                       continue;
-               }
-               hw = dpu_hw_lm_init(lm->id, mmio, cat);
+               hw = dpu_hw_lm_init(lm, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed lm object creation: err %d\n", rc);
@@ -139,11 +130,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_merge_3d *hw;
                const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i];
 
-               if (merge_3d->id < MERGE_3D_0 || merge_3d->id >= MERGE_3D_MAX) {
-                       DPU_ERROR("skip merge_3d %d with invalid id\n", merge_3d->id);
-                       continue;
-               }
-               hw = dpu_hw_merge_3d_init(merge_3d->id, mmio, cat);
+               hw = dpu_hw_merge_3d_init(merge_3d, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed merge_3d object creation: err %d\n",
@@ -157,11 +144,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_pingpong *hw;
                const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
 
-               if (pp->id < PINGPONG_0 || pp->id >= PINGPONG_MAX) {
-                       DPU_ERROR("skip pingpong %d with invalid id\n", pp->id);
-                       continue;
-               }
-               hw = dpu_hw_pingpong_init(pp->id, mmio, cat);
+               hw = dpu_hw_pingpong_init(pp, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed pingpong object creation: err %d\n",
@@ -177,15 +160,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_intf *hw;
                const struct dpu_intf_cfg *intf = &cat->intf[i];
 
-               if (intf->type == INTF_NONE) {
-                       DPU_DEBUG("skip intf %d with type none\n", i);
-                       continue;
-               }
-               if (intf->id < INTF_0 || intf->id >= INTF_MAX) {
-                       DPU_ERROR("skip intf %d with invalid id\n", intf->id);
-                       continue;
-               }
-               hw = dpu_hw_intf_init(intf->id, mmio, cat);
+               hw = dpu_hw_intf_init(intf, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed intf object creation: err %d\n", rc);
@@ -198,12 +173,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_wb *hw;
                const struct dpu_wb_cfg *wb = &cat->wb[i];
 
-               if (wb->id < WB_0 || wb->id >= WB_MAX) {
-                       DPU_ERROR("skip intf %d with invalid id\n", wb->id);
-                       continue;
-               }
-
-               hw = dpu_hw_wb_init(wb->id, mmio, cat);
+               hw = dpu_hw_wb_init(wb, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed wb object creation: err %d\n", rc);
@@ -216,11 +186,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_ctl *hw;
                const struct dpu_ctl_cfg *ctl = &cat->ctl[i];
 
-               if (ctl->id < CTL_0 || ctl->id >= CTL_MAX) {
-                       DPU_ERROR("skip ctl %d with invalid id\n", ctl->id);
-                       continue;
-               }
-               hw = dpu_hw_ctl_init(ctl->id, mmio, cat);
+               hw = dpu_hw_ctl_init(ctl, mmio, cat->mixer_count, cat->mixer);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed ctl object creation: err %d\n", rc);
@@ -233,11 +199,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_dspp *hw;
                const struct dpu_dspp_cfg *dspp = &cat->dspp[i];
 
-               if (dspp->id < DSPP_0 || dspp->id >= DSPP_MAX) {
-                       DPU_ERROR("skip dspp %d with invalid id\n", dspp->id);
-                       continue;
-               }
-               hw = dpu_hw_dspp_init(dspp->id, mmio, cat);
+               hw = dpu_hw_dspp_init(dspp, mmio);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed dspp object creation: err %d\n", rc);
@@ -250,8 +212,8 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_dsc *hw;
                const struct dpu_dsc_cfg *dsc = &cat->dsc[i];
 
-               hw = dpu_hw_dsc_init(dsc->id, mmio, cat);
-               if (IS_ERR_OR_NULL(hw)) {
+               hw = dpu_hw_dsc_init(dsc, mmio);
+               if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed dsc object creation: err %d\n", rc);
                        goto fail;
@@ -263,12 +225,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_sspp *hw;
                const struct dpu_sspp_cfg *sspp = &cat->sspp[i];
 
-               if (sspp->id < SSPP_NONE || sspp->id >= SSPP_MAX) {
-                       DPU_ERROR("skip intf %d with invalid id\n", sspp->id);
-                       continue;
-               }
-
-               hw = dpu_hw_sspp_init(sspp->id, mmio, cat);
+               hw = dpu_hw_sspp_init(sspp, mmio, cat->ubwc);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed sspp object creation: err %d\n", rc);
index 0ad148cc2fb8e90bb6a9dc2f40142be091038105..1a92d21094f4188edaa3d5a3aa68378781c94409 100644 (file)
@@ -871,6 +871,20 @@ TRACE_EVENT(dpu_pp_connect_ext_te,
        TP_printk("pp:%d cfg:%u", __entry->pp, __entry->cfg)
 );
 
+TRACE_EVENT(dpu_intf_connect_ext_te,
+       TP_PROTO(enum dpu_intf intf, u32 cfg),
+       TP_ARGS(intf, cfg),
+       TP_STRUCT__entry(
+               __field(        enum dpu_intf,  intf    )
+               __field(        u32,                    cfg     )
+       ),
+       TP_fast_assign(
+               __entry->intf = intf;
+               __entry->cfg = cfg;
+       ),
+       TP_printk("intf:%d cfg:%u", __entry->intf, __entry->cfg)
+);
+
 TRACE_EVENT(dpu_core_irq_register_callback,
        TP_PROTO(int irq_idx, void *callback),
        TP_ARGS(irq_idx, callback),
index 2eec2d78f32a01e22c146af9aafcee10da14bd5d..694d5434133741cfd1f30ceec20ec79ca74177a8 100644 (file)
@@ -103,6 +103,87 @@ static const struct mdp5_cfg_hw msm8x74v1_config = {
        .max_clk = 200000000,
 };
 
+static const struct mdp5_cfg_hw msm8x26_config = {
+       .name = "msm8x26",
+       .mdp = {
+               .count = 1,
+               .caps = MDP_CAP_SMP |
+                       0,
+       },
+       .smp = {
+               .mmb_count = 7,
+               .mmb_size = 4096,
+               .clients = {
+                       [SSPP_VIG0] =  1,
+                       [SSPP_DMA0] = 4,
+                       [SSPP_RGB0] = 7,
+               },
+       },
+       .ctl = {
+               .count = 2,
+               .base = { 0x00500, 0x00600 },
+               .flush_hw_mask = 0x0003ffff,
+       },
+       .pipe_vig = {
+               .count = 1,
+               .base = { 0x01100 },
+               .caps = MDP_PIPE_CAP_HFLIP |
+                       MDP_PIPE_CAP_VFLIP |
+                       MDP_PIPE_CAP_SCALE |
+                       MDP_PIPE_CAP_CSC   |
+                       0,
+       },
+       .pipe_rgb = {
+               .count = 1,
+               .base = { 0x01d00 },
+               .caps = MDP_PIPE_CAP_HFLIP |
+                       MDP_PIPE_CAP_VFLIP |
+                       MDP_PIPE_CAP_SCALE |
+                       0,
+       },
+       .pipe_dma = {
+               .count = 1,
+               .base = { 0x02900 },
+               .caps = MDP_PIPE_CAP_HFLIP |
+                       MDP_PIPE_CAP_VFLIP |
+                       0,
+       },
+       .lm = {
+               .count = 2,
+               .base = { 0x03100, 0x03d00 },
+               .instances = {
+                               { .id = 0, .pp = 0, .dspp = 0,
+                                 .caps = MDP_LM_CAP_DISPLAY, },
+                               { .id = 1, .pp = -1, .dspp = -1,
+                                 .caps = MDP_LM_CAP_WB },
+                            },
+               .nb_stages = 2,
+               .max_width = 2048,
+               .max_height = 0xFFFF,
+       },
+       .dspp = {
+               .count = 1,
+               .base = { 0x04500 },
+       },
+       .pp = {
+               .count = 1,
+               .base = { 0x21a00 },
+       },
+       .intf = {
+               .base = { 0x00000, 0x21200 },
+               .connect = {
+                       [0] = INTF_DISABLED,
+                       [1] = INTF_DSI,
+               },
+       },
+       .perf = {
+               .ab_inefficiency = 100,
+               .ib_inefficiency = 200,
+               .clk_inefficiency = 125
+       },
+       .max_clk = 200000000,
+};
+
 static const struct mdp5_cfg_hw msm8x74v2_config = {
        .name = "msm8x74",
        .mdp = {
@@ -1236,6 +1317,7 @@ static const struct mdp5_cfg_hw sdm660_config = {
 
 static const struct mdp5_cfg_handler cfg_handlers_v1[] = {
        { .revision = 0, .config = { .hw = &msm8x74v1_config } },
+       { .revision = 1, .config = { .hw = &msm8x26_config } },
        { .revision = 2, .config = { .hw = &msm8x74v2_config } },
        { .revision = 3, .config = { .hw = &apq8084_config } },
        { .revision = 6, .config = { .hw = &msm8x16_config } },
index 29ae5c9613f36602877bacc5edb12bbce9bb4f6b..323079cfd698b3400908baa6fc6b54b84c355547 100644 (file)
@@ -229,7 +229,7 @@ static void mdp5_kms_destroy(struct msm_kms *kms)
 #ifdef CONFIG_DEBUG_FS
 static int smp_show(struct seq_file *m, void *arg)
 {
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct msm_drm_private *priv = dev->dev_private;
        struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
index 6666783e1468e33f3ddaefcfd51789de7588649f..1245c7aa49df844ce293207c6a74374eb0bee805 100644 (file)
@@ -593,6 +593,18 @@ static struct hdmi_codec_pdata codec_data = {
        .i2s = 1,
 };
 
+void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio)
+{
+       struct dp_audio_private *audio_priv;
+
+       audio_priv = container_of(dp_audio, struct dp_audio_private, dp_audio);
+
+       if (audio_priv->audio_pdev) {
+               platform_device_unregister(audio_priv->audio_pdev);
+               audio_priv->audio_pdev = NULL;
+       }
+}
+
 int dp_register_audio_driver(struct device *dev,
                struct dp_audio *dp_audio)
 {
index 84e5f4a5d26badb0bfc8d5f8858681ab5e310ec1..4ab78880af8296efd50654967e297eccf83adc17 100644 (file)
@@ -53,6 +53,8 @@ struct dp_audio *dp_audio_get(struct platform_device *pdev,
 int dp_register_audio_driver(struct device *dev,
                struct dp_audio *dp_audio);
 
+void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio);
+
 /**
  * dp_audio_put()
  *
index 7a8cf1c8233d07b64594485ee87ca778e4dbfb02..5142aeb705a44dd0891d875ba401d3ea735da71d 100644 (file)
@@ -620,7 +620,7 @@ void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog,
                                config & DP_DP_HPD_INT_MASK);
 }
 
-void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog)
+void dp_catalog_ctrl_hpd_enable(struct dp_catalog *dp_catalog)
 {
        struct dp_catalog_private *catalog = container_of(dp_catalog,
                                struct dp_catalog_private, dp_catalog);
@@ -635,6 +635,19 @@ void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog)
        dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN);
 }
 
+void dp_catalog_ctrl_hpd_disable(struct dp_catalog *dp_catalog)
+{
+       struct dp_catalog_private *catalog = container_of(dp_catalog,
+                               struct dp_catalog_private, dp_catalog);
+
+       u32 reftimer = dp_read_aux(catalog, REG_DP_DP_HPD_REFTIMER);
+
+       reftimer &= ~DP_DP_HPD_REFTIMER_ENABLE;
+       dp_write_aux(catalog, REG_DP_DP_HPD_REFTIMER, reftimer);
+
+       dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, 0);
+}
+
 static void dp_catalog_enable_sdp(struct dp_catalog_private *catalog)
 {
        /* trigger sdp */
index 82376a2697eff4e14f7b8d9315f19f8cfd5bf35e..38786e855b51a0439445f1571fb0979bfb7f4556 100644 (file)
@@ -104,7 +104,8 @@ bool dp_catalog_ctrl_mainlink_ready(struct dp_catalog *dp_catalog);
 void dp_catalog_ctrl_enable_irq(struct dp_catalog *dp_catalog, bool enable);
 void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog,
                        u32 intr_mask, bool en);
-void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog);
+void dp_catalog_ctrl_hpd_enable(struct dp_catalog *dp_catalog);
+void dp_catalog_ctrl_hpd_disable(struct dp_catalog *dp_catalog);
 void dp_catalog_ctrl_config_psr(struct dp_catalog *dp_catalog);
 void dp_catalog_ctrl_set_psr(struct dp_catalog *dp_catalog, bool enter);
 u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog);
index f712780149fd6823bf9146a70c0d93d474dd70f5..b2c27d3532bf57a42689254ed77629593c7ed8a0 100644 (file)
@@ -14,7 +14,6 @@
 #include "dp_catalog.h"
 
 struct dp_ctrl {
-       bool orientation;
        atomic_t aborted;
        bool wide_bus_en;
 };
index 5e35033ba3e43ea1fb421ff0b1d60ed202e52973..3bba901afe3354e65ad8fe4f035f15d93a762eda 100644 (file)
@@ -21,7 +21,6 @@
 struct dp_debug_private {
        struct dentry *root;
 
-       struct dp_usbpd *usbpd;
        struct dp_link *link;
        struct dp_panel *panel;
        struct drm_connector *connector;
@@ -232,14 +231,14 @@ static void dp_debug_init(struct dp_debug *dp_debug, struct drm_minor *minor)
 }
 
 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
-               struct dp_usbpd *usbpd, struct dp_link *link,
+               struct dp_link *link,
                struct drm_connector *connector, struct drm_minor *minor)
 {
        struct dp_debug_private *debug;
        struct dp_debug *dp_debug;
        int rc;
 
-       if (!dev || !panel || !usbpd || !link) {
+       if (!dev || !panel || !link) {
                DRM_ERROR("invalid input\n");
                rc = -EINVAL;
                goto error;
@@ -252,7 +251,6 @@ struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
        }
 
        debug->dp_debug.debug_en = false;
-       debug->usbpd = usbpd;
        debug->link = link;
        debug->panel = panel;
        debug->dev = dev;
index 8c0d0b5178fdf0617708b285d010dad4d08a6b52..124227873d58cb929e08ae5b13eca60fbda34726 100644 (file)
@@ -32,7 +32,6 @@ struct dp_debug {
  *
  * @dev: device instance of the caller
  * @panel: instance of panel module
- * @usbpd: instance of usbpd module
  * @link: instance of link module
  * @connector: double pointer to display connector
  * @minor: pointer to drm minor number after device registration
@@ -42,7 +41,7 @@ struct dp_debug {
  * for debugfs input to be communicated with existing modules
  */
 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
-               struct dp_usbpd *usbpd, struct dp_link *link,
+               struct dp_link *link,
                struct drm_connector *connector,
                struct drm_minor *minor);
 
@@ -59,7 +58,7 @@ void dp_debug_put(struct dp_debug *dp_debug);
 
 static inline
 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
-               struct dp_usbpd *usbpd, struct dp_link *link,
+               struct dp_link *link,
                struct drm_connector *connector, struct drm_minor *minor)
 {
        return ERR_PTR(-EINVAL);
index 3e13acdfa7e533825f5991ee8470a595d32d1327..f7d4c2b709bd39b8bb3022c4a918886d2299d495 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "msm_drv.h"
 #include "msm_kms.h"
-#include "dp_hpd.h"
 #include "dp_parser.h"
 #include "dp_power.h"
 #include "dp_catalog.h"
 #include "dp_audio.h"
 #include "dp_debug.h"
 
+static bool psr_enabled = false;
+module_param(psr_enabled, bool, 0);
+MODULE_PARM_DESC(psr_enabled, "enable PSR for eDP and DP displays");
+
 #define HPD_STRING_SIZE 30
 
 enum {
@@ -88,7 +91,6 @@ struct dp_display_private {
        struct platform_device *pdev;
        struct dentry *root;
 
-       struct dp_usbpd   *usbpd;
        struct dp_parser  *parser;
        struct dp_power   *power;
        struct dp_catalog *catalog;
@@ -98,7 +100,6 @@ struct dp_display_private {
        struct dp_ctrl    *ctrl;
        struct dp_debug   *debug;
 
-       struct dp_usbpd_cb usbpd_cb;
        struct dp_display_mode dp_mode;
        struct msm_dp dp_display;
 
@@ -326,6 +327,7 @@ static void dp_display_unbind(struct device *dev, struct device *master,
        kthread_stop(dp->ev_tsk);
 
        dp_power_client_deinit(dp->power);
+       dp_unregister_audio_driver(dev, dp->audio);
        dp_aux_unregister(dp->aux);
        dp->drm_dev = NULL;
        dp->aux->drm_dev = NULL;
@@ -406,7 +408,7 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
 
        edid = dp->panel->edid;
 
-       dp->dp_display.psr_supported = dp->panel->psr_cap.version;
+       dp->dp_display.psr_supported = dp->panel->psr_cap.version && psr_enabled;
 
        dp->audio_supported = drm_detect_monitor_audio(edid);
        dp_panel_handle_sink_request(dp->panel);
@@ -462,7 +464,7 @@ static void dp_display_host_init(struct dp_display_private *dp)
                dp->dp_display.connector_type, dp->core_initialized,
                dp->phy_initialized);
 
-       dp_power_init(dp->power, false);
+       dp_power_init(dp->power);
        dp_ctrl_reset_irq_ctrl(dp->ctrl, true);
        dp_aux_init(dp->aux);
        dp->core_initialized = true;
@@ -489,11 +491,6 @@ static int dp_display_usbpd_configure_cb(struct device *dev)
        return dp_display_process_hpd_high(dp);
 }
 
-static int dp_display_usbpd_disconnect_cb(struct device *dev)
-{
-       return 0;
-}
-
 static int dp_display_notify_disconnect(struct device *dev)
 {
        struct dp_display_private *dp = dev_get_dp_display_private(dev);
@@ -578,13 +575,9 @@ static int dp_display_usbpd_attention_cb(struct device *dev)
 
 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
 {
-       struct dp_usbpd *hpd = dp->usbpd;
        u32 state;
        int ret;
 
-       if (!hpd)
-               return 0;
-
        mutex_lock(&dp->event_mutex);
 
        state =  dp->hpd_state;
@@ -615,12 +608,6 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
                dp->hpd_state = ST_MAINLINK_READY;
        }
 
-       /* enable HDP irq_hpd/replug interrupt */
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog,
-                                          DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
-                                          true);
-
        drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
                        dp->dp_display.connector_type, state);
        mutex_unlock(&dp->event_mutex);
@@ -645,12 +632,8 @@ static void dp_display_handle_plugged_change(struct msm_dp *dp_display,
 
 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
 {
-       struct dp_usbpd *hpd = dp->usbpd;
        u32 state;
 
-       if (!hpd)
-               return 0;
-
        mutex_lock(&dp->event_mutex);
 
        state = dp->hpd_state;
@@ -658,12 +641,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
        drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",
                        dp->dp_display.connector_type, state);
 
-       /* disable irq_hpd/replug interrupts */
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog,
-                                          DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK,
-                                          false);
-
        /* unplugged, no more irq_hpd handle */
        dp_del_event(dp, EV_IRQ_HPD_INT);
 
@@ -687,10 +664,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
                return 0;
        }
 
-       /* disable HPD plug interrupts */
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false);
-
        /*
         * We don't need separate work for disconnect as
         * connect/attention interrupts are disabled
@@ -706,10 +679,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
        /* signal the disconnect event early to ensure proper teardown */
        dp_display_handle_plugged_change(&dp->dp_display, false);
 
-       /* enable HDP plug interrupt to prepare for next plugin */
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, true);
-
        drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
                        dp->dp_display.connector_type, state);
 
@@ -763,24 +732,10 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
 {
        int rc = 0;
        struct device *dev = &dp->pdev->dev;
-       struct dp_usbpd_cb *cb = &dp->usbpd_cb;
        struct dp_panel_in panel_in = {
                .dev = dev,
        };
 
-       /* Callback APIs used for cable status change event */
-       cb->configure  = dp_display_usbpd_configure_cb;
-       cb->disconnect = dp_display_usbpd_disconnect_cb;
-       cb->attention  = dp_display_usbpd_attention_cb;
-
-       dp->usbpd = dp_hpd_get(dev, cb);
-       if (IS_ERR(dp->usbpd)) {
-               rc = PTR_ERR(dp->usbpd);
-               DRM_ERROR("failed to initialize hpd, rc = %d\n", rc);
-               dp->usbpd = NULL;
-               goto error;
-       }
-
        dp->parser = dp_parser_get(dp->pdev);
        if (IS_ERR(dp->parser)) {
                rc = PTR_ERR(dp->parser);
@@ -1082,26 +1037,6 @@ void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp)
        mutex_unlock(&dp_display->event_mutex);
 }
 
-static void dp_display_config_hpd(struct dp_display_private *dp)
-{
-
-       dp_display_host_init(dp);
-       dp_catalog_ctrl_hpd_config(dp->catalog);
-
-       /* Enable plug and unplug interrupts only if requested */
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog,
-                               DP_DP_HPD_PLUG_INT_MASK |
-                               DP_DP_HPD_UNPLUG_INT_MASK,
-                               true);
-
-       /* Enable interrupt first time
-        * we are leaving dp clocks on during disconnect
-        * and never disable interrupt
-        */
-       enable_irq(dp->irq);
-}
-
 void dp_display_set_psr(struct msm_dp *dp_display, bool enter)
 {
        struct dp_display_private *dp;
@@ -1176,7 +1111,7 @@ static int hpd_event_thread(void *data)
 
                switch (todo->event_id) {
                case EV_HPD_INIT_SETUP:
-                       dp_display_config_hpd(dp_priv);
+                       dp_display_host_init(dp_priv);
                        break;
                case EV_HPD_PLUG_INT:
                        dp_hpd_plug_handle(dp_priv, todo->data);
@@ -1282,7 +1217,6 @@ int dp_display_request_irq(struct msm_dp *dp_display)
                                dp->irq, rc);
                return rc;
        }
-       disable_irq(dp->irq);
 
        return 0;
 }
@@ -1394,13 +1328,8 @@ static int dp_pm_resume(struct device *dev)
        /* turn on dp ctrl/phy */
        dp_display_host_init(dp);
 
-       dp_catalog_ctrl_hpd_config(dp->catalog);
-
-       if (dp->dp_display.internal_hpd)
-               dp_catalog_hpd_config_intr(dp->catalog,
-                               DP_DP_HPD_PLUG_INT_MASK |
-                               DP_DP_HPD_UNPLUG_INT_MASK,
-                               true);
+       if (dp_display->is_edp)
+               dp_catalog_ctrl_hpd_enable(dp->catalog);
 
        if (dp_catalog_link_is_connected(dp->catalog)) {
                /*
@@ -1540,7 +1469,7 @@ void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor)
        dp = container_of(dp_display, struct dp_display_private, dp_display);
        dev = &dp->pdev->dev;
 
-       dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
+       dp->debug = dp_debug_get(dev, dp->panel,
                                        dp->link, dp->dp_display.connector,
                                        minor);
        if (IS_ERR(dp->debug)) {
@@ -1568,9 +1497,8 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 
        if (aux_bus && dp->is_edp) {
                dp_display_host_init(dp_priv);
-               dp_catalog_ctrl_hpd_config(dp_priv->catalog);
+               dp_catalog_ctrl_hpd_enable(dp_priv->catalog);
                dp_display_host_phy_init(dp_priv);
-               enable_irq(dp_priv->irq);
 
                /*
                 * The code below assumes that the panel will finish probing
@@ -1612,7 +1540,6 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 
 error:
        if (dp->is_edp) {
-               disable_irq(dp_priv->irq);
                dp_display_host_phy_exit(dp_priv);
                dp_display_host_deinit(dp_priv);
        }
@@ -1801,16 +1728,31 @@ void dp_bridge_hpd_enable(struct drm_bridge *bridge)
 {
        struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
        struct msm_dp *dp_display = dp_bridge->dp_display;
+       struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+       mutex_lock(&dp->event_mutex);
+       dp_catalog_ctrl_hpd_enable(dp->catalog);
+
+       /* enable HDP interrupts */
+       dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, true);
 
        dp_display->internal_hpd = true;
+       mutex_unlock(&dp->event_mutex);
 }
 
 void dp_bridge_hpd_disable(struct drm_bridge *bridge)
 {
        struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
        struct msm_dp *dp_display = dp_bridge->dp_display;
+       struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+       mutex_lock(&dp->event_mutex);
+       /* disable HDP interrupts */
+       dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false);
+       dp_catalog_ctrl_hpd_disable(dp->catalog);
 
        dp_display->internal_hpd = false;
+       mutex_unlock(&dp->event_mutex);
 }
 
 void dp_bridge_hpd_notify(struct drm_bridge *bridge,
diff --git a/drivers/gpu/drm/msm/dp/dp_hpd.c b/drivers/gpu/drm/msm/dp/dp_hpd.c
deleted file mode 100644 (file)
index db98a1d..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
- */
-
-#define pr_fmt(fmt)    "[drm-dp] %s: " fmt, __func__
-
-#include <linux/slab.h>
-#include <linux/device.h>
-
-#include "dp_hpd.h"
-
-/* DP specific VDM commands */
-#define DP_USBPD_VDM_STATUS    0x10
-#define DP_USBPD_VDM_CONFIGURE 0x11
-
-/* USBPD-TypeC specific Macros */
-#define VDM_VERSION            0x0
-#define USB_C_DP_SID           0xFF01
-
-struct dp_hpd_private {
-       struct device *dev;
-       struct dp_usbpd_cb *dp_cb;
-       struct dp_usbpd dp_usbpd;
-};
-
-int dp_hpd_connect(struct dp_usbpd *dp_usbpd, bool hpd)
-{
-       int rc = 0;
-       struct dp_hpd_private *hpd_priv;
-
-       hpd_priv = container_of(dp_usbpd, struct dp_hpd_private,
-                                       dp_usbpd);
-
-       if (!hpd_priv->dp_cb || !hpd_priv->dp_cb->configure
-                               || !hpd_priv->dp_cb->disconnect) {
-               pr_err("hpd dp_cb not initialized\n");
-               return -EINVAL;
-       }
-       if (hpd)
-               hpd_priv->dp_cb->configure(hpd_priv->dev);
-       else
-               hpd_priv->dp_cb->disconnect(hpd_priv->dev);
-
-       return rc;
-}
-
-struct dp_usbpd *dp_hpd_get(struct device *dev, struct dp_usbpd_cb *cb)
-{
-       struct dp_hpd_private *dp_hpd;
-
-       if (!cb) {
-               pr_err("invalid cb data\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       dp_hpd = devm_kzalloc(dev, sizeof(*dp_hpd), GFP_KERNEL);
-       if (!dp_hpd)
-               return ERR_PTR(-ENOMEM);
-
-       dp_hpd->dev = dev;
-       dp_hpd->dp_cb = cb;
-
-       dp_hpd->dp_usbpd.connect = dp_hpd_connect;
-
-       return &dp_hpd->dp_usbpd;
-}
diff --git a/drivers/gpu/drm/msm/dp/dp_hpd.h b/drivers/gpu/drm/msm/dp/dp_hpd.h
deleted file mode 100644 (file)
index 8feec5a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
- */
-
-#ifndef _DP_HPD_H_
-#define _DP_HPD_H_
-
-//#include <linux/usb/usbpd.h>
-
-#include <linux/types.h>
-#include <linux/device.h>
-
-enum plug_orientation {
-       ORIENTATION_NONE,
-       ORIENTATION_CC1,
-       ORIENTATION_CC2,
-};
-
-/**
- * struct dp_usbpd - DisplayPort status
- *
- * @orientation: plug orientation configuration
- * @low_pow_st: low power state
- * @adaptor_dp_en: adaptor functionality enabled
- * @multi_func: multi-function preferred
- * @usb_config_req: request to switch to usb
- * @exit_dp_mode: request exit from displayport mode
- * @hpd_irq: Change in the status since last message
- * @alt_mode_cfg_done: bool to specify alt mode status
- * @debug_en: bool to specify debug mode
- * @connect: simulate disconnect or connect for debug mode
- */
-struct dp_usbpd {
-       enum plug_orientation orientation;
-       bool low_pow_st;
-       bool adaptor_dp_en;
-       bool multi_func;
-       bool usb_config_req;
-       bool exit_dp_mode;
-       bool hpd_irq;
-       bool alt_mode_cfg_done;
-       bool debug_en;
-
-       int (*connect)(struct dp_usbpd *dp_usbpd, bool hpd);
-};
-
-/**
- * struct dp_usbpd_cb - callback functions provided by the client
- *
- * @configure: called by usbpd module when PD communication has
- * been completed and the usb peripheral has been configured on
- * dp mode.
- * @disconnect: notify the cable disconnect issued by usb.
- * @attention: notify any attention message issued by usb.
- */
-struct dp_usbpd_cb {
-       int (*configure)(struct device *dev);
-       int (*disconnect)(struct device *dev);
-       int (*attention)(struct device *dev);
-};
-
-/**
- * dp_hpd_get() - setup hpd module
- *
- * @dev: device instance of the caller
- * @cb: struct containing callback function pointers.
- *
- * This function allows the client to initialize the usbpd
- * module. The module will communicate with HPD module.
- */
-struct dp_usbpd *dp_hpd_get(struct device *dev, struct dp_usbpd_cb *cb);
-
-int dp_hpd_register(struct dp_usbpd *dp_usbpd);
-void dp_hpd_unregister(struct dp_usbpd *dp_usbpd);
-int dp_hpd_connect(struct dp_usbpd *dp_usbpd, bool hpd);
-
-#endif /* _DP_HPD_H_ */
index 45208b45eb5357b8a40c7c99ae126c1e07e71031..ed1030e17e1b89bd2e6be18f3d1a832efb986cfa 100644 (file)
@@ -10,7 +10,6 @@
 
 #include "dp_aux.h"
 #include "dp_link.h"
-#include "dp_hpd.h"
 
 struct edid;
 
index c0aaabb033894c4b031fb1769543505d01097d4f..5cb84ca40e9ed6a97bbeb774015fc7ad0a72e043 100644 (file)
@@ -14,7 +14,6 @@
 
 struct dp_power_private {
        struct dp_parser *parser;
-       struct platform_device *pdev;
        struct device *dev;
        struct drm_device *drm_dev;
        struct clk *link_clk_src;
@@ -28,32 +27,23 @@ static int dp_power_clk_init(struct dp_power_private *power)
 {
        int rc = 0;
        struct dss_module_power *core, *ctrl, *stream;
-       struct device *dev = &power->pdev->dev;
+       struct device *dev = power->dev;
 
        core = &power->parser->mp[DP_CORE_PM];
        ctrl = &power->parser->mp[DP_CTRL_PM];
        stream = &power->parser->mp[DP_STREAM_PM];
 
        rc = devm_clk_bulk_get(dev, core->num_clk, core->clocks);
-       if (rc) {
-               DRM_ERROR("failed to get %s clk. err=%d\n",
-                       dp_parser_pm_name(DP_CORE_PM), rc);
+       if (rc)
                return rc;
-       }
 
        rc = devm_clk_bulk_get(dev, ctrl->num_clk, ctrl->clocks);
-       if (rc) {
-               DRM_ERROR("failed to get %s clk. err=%d\n",
-                       dp_parser_pm_name(DP_CTRL_PM), rc);
+       if (rc)
                return -ENODEV;
-       }
 
        rc = devm_clk_bulk_get(dev, stream->num_clk, stream->clocks);
-       if (rc) {
-               DRM_ERROR("failed to get %s clk. err=%d\n",
-                       dp_parser_pm_name(DP_CTRL_PM), rc);
+       if (rc)
                return -ENODEV;
-       }
 
        return 0;
 }
@@ -121,11 +111,9 @@ int dp_power_clk_enable(struct dp_power *dp_power,
                        mp = &power->parser->mp[DP_CORE_PM];
 
                        rc = clk_bulk_prepare_enable(mp->num_clk, mp->clocks);
-                       if (rc) {
-                               DRM_ERROR("fail to enable clks: %s. err=%d\n",
-                                       dp_parser_pm_name(DP_CORE_PM), rc);
+                       if (rc)
                                return rc;
-                       }
+
                        dp_power->core_clks_on = true;
                }
        }
@@ -133,10 +121,8 @@ int dp_power_clk_enable(struct dp_power *dp_power,
        mp = &power->parser->mp[pm_type];
        if (enable) {
                rc = clk_bulk_prepare_enable(mp->num_clk, mp->clocks);
-               if (rc) {
-                       DRM_ERROR("failed to enable clks, err: %d\n", rc);
+               if (rc)
                        return rc;
-               }
        } else {
                clk_bulk_disable_unprepare(mp->num_clk, mp->clocks);
        }
@@ -162,63 +148,37 @@ int dp_power_clk_enable(struct dp_power *dp_power,
 
 int dp_power_client_init(struct dp_power *dp_power)
 {
-       int rc = 0;
        struct dp_power_private *power;
 
-       if (!dp_power) {
-               DRM_ERROR("invalid power data\n");
-               return -EINVAL;
-       }
-
        power = container_of(dp_power, struct dp_power_private, dp_power);
 
-       pm_runtime_enable(&power->pdev->dev);
-
-       rc = dp_power_clk_init(power);
-       if (rc)
-               DRM_ERROR("failed to init clocks %d\n", rc);
+       pm_runtime_enable(power->dev);
 
-       return rc;
+       return dp_power_clk_init(power);
 }
 
 void dp_power_client_deinit(struct dp_power *dp_power)
 {
        struct dp_power_private *power;
 
-       if (!dp_power) {
-               DRM_ERROR("invalid power data\n");
-               return;
-       }
-
        power = container_of(dp_power, struct dp_power_private, dp_power);
 
-       pm_runtime_disable(&power->pdev->dev);
+       pm_runtime_disable(power->dev);
 }
 
-int dp_power_init(struct dp_power *dp_power, bool flip)
+int dp_power_init(struct dp_power *dp_power)
 {
        int rc = 0;
        struct dp_power_private *power = NULL;
 
-       if (!dp_power) {
-               DRM_ERROR("invalid power data\n");
-               return -EINVAL;
-       }
-
        power = container_of(dp_power, struct dp_power_private, dp_power);
 
-       pm_runtime_get_sync(&power->pdev->dev);
+       pm_runtime_get_sync(power->dev);
 
        rc = dp_power_clk_enable(dp_power, DP_CORE_PM, true);
-       if (rc) {
-               DRM_ERROR("failed to enable DP core clocks, %d\n", rc);
-               goto exit;
-       }
-
-       return 0;
+       if (rc)
+               pm_runtime_put_sync(power->dev);
 
-exit:
-       pm_runtime_put_sync(&power->pdev->dev);
        return rc;
 }
 
@@ -229,7 +189,7 @@ int dp_power_deinit(struct dp_power *dp_power)
        power = container_of(dp_power, struct dp_power_private, dp_power);
 
        dp_power_clk_enable(dp_power, DP_CORE_PM, false);
-       pm_runtime_put_sync(&power->pdev->dev);
+       pm_runtime_put_sync(power->dev);
        return 0;
 }
 
@@ -238,17 +198,11 @@ struct dp_power *dp_power_get(struct device *dev, struct dp_parser *parser)
        struct dp_power_private *power;
        struct dp_power *dp_power;
 
-       if (!parser) {
-               DRM_ERROR("invalid input\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       power = devm_kzalloc(&parser->pdev->dev, sizeof(*power), GFP_KERNEL);
+       power = devm_kzalloc(dev, sizeof(*power), GFP_KERNEL);
        if (!power)
                return ERR_PTR(-ENOMEM);
 
        power->parser = parser;
-       power->pdev = parser->pdev;
        power->dev = dev;
 
        dp_power = &power->dp_power;
index e3f959ffae12153d7fdd1b9602c864f731a4547e..a3dec200785e5f47cb344b00ee47ac390693983f 100644 (file)
@@ -26,13 +26,12 @@ struct dp_power {
  * dp_power_init() - enable power supplies for display controller
  *
  * @power: instance of power module
- * @flip: bool for flipping gpio direction
  * return: 0 if success or error if failure.
  *
  * This API will turn on the regulators and configures gpio's
  * aux/hpd.
  */
-int dp_power_init(struct dp_power *power, bool flip);
+int dp_power_init(struct dp_power *power);
 
 /**
  * dp_power_deinit() - turn off regulators and gpios.
index 29ccd755cc2e2606775ea06f70c81c0672aea5ee..8a5fb6df72103229d75ddf3cbddae50dedec09b2 100644 (file)
@@ -245,6 +245,8 @@ static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {
                &apq8064_dsi_cfg, &msm_dsi_v2_host_ops},
        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0,
                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
+       {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0_2,
+               &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1,
                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1_1,
index 91bdaf50bb1a4a26c64b781a77902464428220f1..43f0dd74edb656628ecceb18001f71e4c9ec3ee3 100644 (file)
@@ -11,6 +11,7 @@
 #define MSM_DSI_VER_MAJOR_V2   0x02
 #define MSM_DSI_VER_MAJOR_6G   0x03
 #define MSM_DSI_6G_VER_MINOR_V1_0      0x10000000
+#define MSM_DSI_6G_VER_MINOR_V1_0_2    0x10000002
 #define MSM_DSI_6G_VER_MINOR_V1_1      0x10010000
 #define MSM_DSI_6G_VER_MINOR_V1_1_1    0x10010001
 #define MSM_DSI_6G_VER_MINOR_V1_2      0x10020000
index 961689a255c476cba49d3deb9e8151467de07894..744f2398a6d6e4ce8e5abe4e6643fb7e27aeee23 100644 (file)
@@ -585,7 +585,7 @@ unsigned long dsi_byte_clk_get_rate(struct mipi_dsi_host *host, bool is_bonded_d
        u8 lanes = msm_host->lanes;
        u32 bpp = dsi_get_bpp(msm_host->format);
        unsigned long pclk_rate = dsi_get_pclk_rate(mode, is_bonded_dsi);
-       u64 pclk_bpp = (u64)pclk_rate * bpp;
+       unsigned long pclk_bpp;
 
        if (lanes == 0) {
                pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
@@ -594,9 +594,9 @@ unsigned long dsi_byte_clk_get_rate(struct mipi_dsi_host *host, bool is_bonded_d
 
        /* CPHY "byte_clk" is in units of 16 bits */
        if (msm_host->cphy_mode)
-               do_div(pclk_bpp, (16 * lanes));
+               pclk_bpp = mult_frac(pclk_rate, bpp, 16 * lanes);
        else
-               do_div(pclk_bpp, (8 * lanes));
+               pclk_bpp = mult_frac(pclk_rate, bpp, 8 * lanes);
 
        return pclk_bpp;
 }
@@ -627,15 +627,12 @@ int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
 int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
 {
        u32 bpp = dsi_get_bpp(msm_host->format);
-       u64 pclk_bpp;
        unsigned int esc_mhz, esc_div;
        unsigned long byte_mhz;
 
        dsi_calc_pclk(msm_host, is_bonded_dsi);
 
-       pclk_bpp = (u64)dsi_get_pclk_rate(msm_host->mode, is_bonded_dsi) * bpp;
-       do_div(pclk_bpp, 8);
-       msm_host->src_clk_rate = pclk_bpp;
+       msm_host->src_clk_rate = mult_frac(msm_host->pixel_clk_rate, bpp, 8);
 
        /*
         * esc clock is byte clock followed by a 4 bit divider,
index 1bbac72dad35ba079606f16752dfac93e59e9bf5..28b8012a21f2b3ba9d202797dcbeb93b73961f7a 100644 (file)
@@ -34,32 +34,6 @@ static struct msm_dsi_manager msm_dsim_glb;
 #define IS_SYNC_NEEDED()       (msm_dsim_glb.is_sync_needed)
 #define IS_MASTER_DSI_LINK(id) (msm_dsim_glb.master_dsi_link_id == id)
 
-#ifdef CONFIG_OF
-static bool dsi_mgr_power_on_early(struct drm_bridge *bridge)
-{
-       struct drm_bridge *next_bridge = drm_bridge_get_next_bridge(bridge);
-
-       /*
-        * If the next bridge in the chain is the Parade ps8640 bridge chip
-        * then don't power on early since it seems to violate the expectations
-        * of the firmware that the bridge chip is running.
-        *
-        * NOTE: this is expected to be a temporary special case. It's expected
-        * that we'll eventually have a framework that allows the next level
-        * bridge to indicate whether it needs us to power on before it or
-        * after it. When that framework is in place then we'll use it and
-        * remove this special case.
-        */
-       return !(next_bridge && next_bridge->of_node &&
-                of_device_is_compatible(next_bridge->of_node, "parade,ps8640"));
-}
-#else
-static inline bool dsi_mgr_power_on_early(struct drm_bridge *bridge)
-{
-       return true;
-}
-#endif
-
 static inline struct msm_dsi *dsi_mgr_get_dsi(int id)
 {
        return msm_dsim_glb.dsi[id];
@@ -254,7 +228,7 @@ static void msm_dsi_manager_set_split_display(u8 id)
        }
 }
 
-static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge)
+static int dsi_mgr_bridge_power_on(struct drm_bridge *bridge)
 {
        int id = dsi_mgr_bridge_get_id(bridge);
        struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
@@ -265,12 +239,6 @@ static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge)
        int ret;
 
        DBG("id=%d", id);
-       if (!msm_dsi_device_connected(msm_dsi))
-               return;
-
-       /* Do nothing with the host if it is slave-DSI in case of bonded DSI */
-       if (is_bonded_dsi && !IS_MASTER_DSI_LINK(id))
-               return;
 
        ret = dsi_mgr_phy_enable(id, phy_shared_timings);
        if (ret)
@@ -300,14 +268,31 @@ static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge)
        if (is_bonded_dsi && msm_dsi1)
                msm_dsi_host_enable_irq(msm_dsi1->host);
 
-       return;
+       return 0;
 
 host1_on_fail:
        msm_dsi_host_power_off(host);
 host_on_fail:
        dsi_mgr_phy_disable(id);
 phy_en_fail:
-       return;
+       return ret;
+}
+
+static void dsi_mgr_bridge_power_off(struct drm_bridge *bridge)
+{
+       int id = dsi_mgr_bridge_get_id(bridge);
+       struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
+       struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1);
+       struct mipi_dsi_host *host = msm_dsi->host;
+       bool is_bonded_dsi = IS_BONDED_DSI();
+
+       msm_dsi_host_disable_irq(host);
+       if (is_bonded_dsi && msm_dsi1) {
+               msm_dsi_host_disable_irq(msm_dsi1->host);
+               msm_dsi_host_power_off(msm_dsi1->host);
+       }
+       msm_dsi_host_power_off(host);
+       dsi_mgr_phy_disable(id);
 }
 
 static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)
@@ -327,8 +312,11 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)
        if (is_bonded_dsi && !IS_MASTER_DSI_LINK(id))
                return;
 
-       if (!dsi_mgr_power_on_early(bridge))
-               dsi_mgr_bridge_power_on(bridge);
+       ret = dsi_mgr_bridge_power_on(bridge);
+       if (ret) {
+               dev_err(&msm_dsi->pdev->dev, "Power on failed: %d\n", ret);
+               return;
+       }
 
        ret = msm_dsi_host_enable(host);
        if (ret) {
@@ -349,8 +337,7 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)
 host1_en_fail:
        msm_dsi_host_disable(host);
 host_en_fail:
-
-       return;
+       dsi_mgr_bridge_power_off(bridge);
 }
 
 void msm_dsi_manager_tpg_enable(void)
@@ -438,9 +425,6 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge,
        msm_dsi_host_set_display_mode(host, adjusted_mode);
        if (is_bonded_dsi && other_dsi)
                msm_dsi_host_set_display_mode(other_dsi->host, adjusted_mode);
-
-       if (dsi_mgr_power_on_early(bridge))
-               dsi_mgr_bridge_power_on(bridge);
 }
 
 static enum drm_mode_status dsi_mgr_bridge_mode_valid(struct drm_bridge *bridge,
index bb09cbe8ff86ba1f8fc6e71021eb3a016f9173c1..9d5795c58a98436f48e35c60a01c462f0e5273d0 100644 (file)
@@ -541,6 +541,8 @@ static const struct of_device_id dsi_phy_dt_match[] = {
          .data = &dsi_phy_28nm_hpm_famb_cfgs },
        { .compatible = "qcom,dsi-phy-28nm-lp",
          .data = &dsi_phy_28nm_lp_cfgs },
+       { .compatible = "qcom,dsi-phy-28nm-8226",
+         .data = &dsi_phy_28nm_8226_cfgs },
 #endif
 #ifdef CONFIG_DRM_MSM_DSI_20NM_PHY
        { .compatible = "qcom,dsi-phy-20nm",
index 7137a17ae5238c2d6c281b031927b324dbb0cb67..8b640d174785161bfdeeabbdafc7d500046f1a51 100644 (file)
@@ -46,8 +46,9 @@ struct msm_dsi_phy_cfg {
 extern const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_famb_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs;
-extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs;
+extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8226_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs;
+extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_660_cfgs;
 extern const struct msm_dsi_phy_cfg dsi_phy_14nm_2290_cfgs;
index 9f488adea7f543511de686e1725039fd489f8d97..3ce45b023e637a9cb5ae5e907231a463a0ee17d0 100644 (file)
@@ -539,6 +539,9 @@ static int dsi_pll_14nm_vco_prepare(struct clk_hw *hw)
        if (unlikely(pll_14nm->phy->pll_on))
                return 0;
 
+       if (dsi_pll_14nm_vco_recalc_rate(hw, VCO_REF_CLK_RATE) == 0)
+               dsi_pll_14nm_vco_set_rate(hw, pll_14nm->phy->cfg->min_pll_rate, VCO_REF_CLK_RATE);
+
        dsi_phy_write(base + REG_DSI_14nm_PHY_PLL_VREF_CFG1, 0x10);
        dsi_phy_write(cmn_base + REG_DSI_14nm_PHY_CMN_PLL_CNTRL, 1);
 
index 4c1bf55c5f382f552c7b733bb7b5e49e4e0f5f48..ceec7bb87bf138c0193eb4974d151b26c7ab1458 100644 (file)
@@ -37,6 +37,7 @@
 
 /* v2.0.0 28nm LP implementation */
 #define DSI_PHY_28NM_QUIRK_PHY_LP      BIT(0)
+#define DSI_PHY_28NM_QUIRK_PHY_8226    BIT(1)
 
 #define LPFR_LUT_SIZE                  10
 struct lpfr_cfg {
@@ -377,6 +378,74 @@ static int dsi_pll_28nm_vco_prepare_hpm(struct clk_hw *hw)
        return ret;
 }
 
+static int dsi_pll_28nm_vco_prepare_8226(struct clk_hw *hw)
+{
+       struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
+       struct device *dev = &pll_28nm->phy->pdev->dev;
+       void __iomem *base = pll_28nm->phy->pll_base;
+       u32 max_reads = 5, timeout_us = 100;
+       bool locked;
+       u32 val;
+       int i;
+
+       DBG("id=%d", pll_28nm->phy->id);
+
+       pll_28nm_software_reset(pll_28nm);
+
+       /*
+        * PLL power up sequence.
+        * Add necessary delays recommended by hardware.
+        */
+       dsi_phy_write(base + REG_DSI_28nm_PHY_PLL_CAL_CFG1, 0x34);
+
+       val = DSI_28nm_PHY_PLL_GLB_CFG_PLL_PWRDN_B;
+       dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_GLB_CFG, val, 200);
+
+       val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_PWRGEN_PWRDN_B;
+       dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_GLB_CFG, val, 200);
+
+       val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_LDO_PWRDN_B;
+       val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_ENABLE;
+       dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_GLB_CFG, val, 600);
+
+       for (i = 0; i < 7; i++) {
+               /* DSI Uniphy lock detect setting */
+               dsi_phy_write(base + REG_DSI_28nm_PHY_PLL_LKDET_CFG2, 0x0d);
+               dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_LKDET_CFG2,
+                               0x0c, 100);
+               dsi_phy_write(base + REG_DSI_28nm_PHY_PLL_LKDET_CFG2, 0x0d);
+
+               /* poll for PLL ready status */
+               locked = pll_28nm_poll_for_ready(pll_28nm,
+                                               max_reads, timeout_us);
+               if (locked)
+                       break;
+
+               pll_28nm_software_reset(pll_28nm);
+
+               /*
+                * PLL power up sequence.
+                * Add necessary delays recommended by hardware.
+                */
+               dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_PWRGEN_CFG, 0x00, 50);
+
+               val = DSI_28nm_PHY_PLL_GLB_CFG_PLL_PWRDN_B;
+               val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_PWRGEN_PWRDN_B;
+               dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_GLB_CFG, val, 100);
+
+               val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_LDO_PWRDN_B;
+               val |= DSI_28nm_PHY_PLL_GLB_CFG_PLL_ENABLE;
+               dsi_phy_write_udelay(base + REG_DSI_28nm_PHY_PLL_GLB_CFG, val, 600);
+       }
+
+       if (unlikely(!locked))
+               DRM_DEV_ERROR(dev, "DSI PLL lock failed\n");
+       else
+               DBG("DSI PLL Lock success");
+
+       return locked ? 0 : -EINVAL;
+}
+
 static int dsi_pll_28nm_vco_prepare_lp(struct clk_hw *hw)
 {
        struct dsi_pll_28nm *pll_28nm = to_pll_28nm(hw);
@@ -471,6 +540,15 @@ static const struct clk_ops clk_ops_dsi_pll_28nm_vco_lp = {
        .is_enabled = dsi_pll_28nm_clk_is_enabled,
 };
 
+static const struct clk_ops clk_ops_dsi_pll_28nm_vco_8226 = {
+       .round_rate = dsi_pll_28nm_clk_round_rate,
+       .set_rate = dsi_pll_28nm_clk_set_rate,
+       .recalc_rate = dsi_pll_28nm_clk_recalc_rate,
+       .prepare = dsi_pll_28nm_vco_prepare_8226,
+       .unprepare = dsi_pll_28nm_vco_unprepare,
+       .is_enabled = dsi_pll_28nm_clk_is_enabled,
+};
+
 /*
  * PLL Callbacks
  */
@@ -536,6 +614,8 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm, struct clk_hw **prov
 
        if (pll_28nm->phy->cfg->quirks & DSI_PHY_28NM_QUIRK_PHY_LP)
                vco_init.ops = &clk_ops_dsi_pll_28nm_vco_lp;
+       else if (pll_28nm->phy->cfg->quirks & DSI_PHY_28NM_QUIRK_PHY_8226)
+               vco_init.ops = &clk_ops_dsi_pll_28nm_vco_8226;
        else
                vco_init.ops = &clk_ops_dsi_pll_28nm_vco_hpm;
 
@@ -820,3 +900,20 @@ const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs = {
        .quirks = DSI_PHY_28NM_QUIRK_PHY_LP,
 };
 
+const struct msm_dsi_phy_cfg dsi_phy_28nm_8226_cfgs = {
+       .has_phy_regulator = true,
+       .regulator_data = dsi_phy_28nm_regulators,
+       .num_regulators = ARRAY_SIZE(dsi_phy_28nm_regulators),
+       .ops = {
+               .enable = dsi_28nm_phy_enable,
+               .disable = dsi_28nm_phy_disable,
+               .pll_init = dsi_pll_28nm_init,
+               .save_pll_state = dsi_28nm_pll_save_state,
+               .restore_pll_state = dsi_28nm_pll_restore_state,
+       },
+       .min_pll_rate = VCO_MIN_RATE,
+       .max_pll_rate = VCO_MAX_RATE,
+       .io_start = { 0xfd922b00 },
+       .num_dsi_phy = 1,
+       .quirks = DSI_PHY_28NM_QUIRK_PHY_8226,
+};
index d77fa9793c54dc7adb001f9e81dd12ecad891f2a..9c45d641b5212c11078ab38c13a519663d85e10a 100644 (file)
@@ -155,6 +155,8 @@ static bool can_do_async(struct drm_atomic_state *state,
        for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
                if (drm_atomic_crtc_needs_modeset(crtc_state))
                        return false;
+               if (!crtc_state->active)
+                       return false;
                if (++num_crtcs > 1)
                        return false;
                *async_crtc = crtc;
index 9c0e633a3a6114f755502a519b95a1f97c0c76bc..a0a936f80ae350c1633c5345ece5215f7960e579 100644 (file)
@@ -211,7 +211,7 @@ DEFINE_DEBUGFS_ATTRIBUTE(shrink_fops,
 
 static int msm_gem_show(struct seq_file *m, void *arg)
 {
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct msm_drm_private *priv = dev->dev_private;
        int ret;
@@ -229,7 +229,7 @@ static int msm_gem_show(struct seq_file *m, void *arg)
 
 static int msm_mm_show(struct seq_file *m, void *arg)
 {
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_printer p = drm_seq_file_printer(m);
 
@@ -240,7 +240,7 @@ static int msm_mm_show(struct seq_file *m, void *arg)
 
 static int msm_fb_show(struct seq_file *m, void *arg)
 {
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_framebuffer *fb, *fbdev_fb = NULL;
 
index 58264ff2c4b1987fea6d3c6c01cac3c4693f73aa..891eff8433a9cd691daa0b989da7fbfaf38cec8e 100644 (file)
@@ -449,6 +449,8 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
        if (ret)
                goto err_cleanup_mode_config;
 
+       dma_set_max_seg_size(dev, UINT_MAX);
+
        /* Bind all our sub-components: */
        ret = component_bind_all(dev, ddev);
        if (ret)
@@ -459,8 +461,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
        if (ret)
                goto err_msm_uninit;
 
-       dma_set_max_seg_size(dev, UINT_MAX);
-
        msm_gem_shrinker_init(ddev);
 
        if (priv->kms_init) {
index c32264234ea162c60add369a96e00d54240ca32b..20cfd86d2b324ae44287b51c30fd59f7e90425fb 100644 (file)
@@ -219,7 +219,8 @@ static void put_pages(struct drm_gem_object *obj)
        }
 }
 
-static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
+static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
+                                             unsigned madv)
 {
        struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@ -227,7 +228,9 @@ static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
 
        msm_gem_assert_locked(obj);
 
-       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
+       if (GEM_WARN_ON(msm_obj->madv > madv)) {
+               DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
+                       msm_obj->madv, madv);
                return ERR_PTR(-EBUSY);
        }
 
@@ -248,7 +251,7 @@ struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
        struct page **p;
 
        msm_gem_lock(obj);
-       p = msm_gem_pin_pages_locked(obj);
+       p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
        msm_gem_unlock(obj);
 
        return p;
@@ -473,10 +476,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
 
        msm_gem_assert_locked(obj);
 
-       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
-               return -EBUSY;
-
-       pages = msm_gem_pin_pages_locked(obj);
+       pages = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
@@ -699,13 +699,7 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
        if (obj->import_attach)
                return ERR_PTR(-ENODEV);
 
-       if (GEM_WARN_ON(msm_obj->madv > madv)) {
-               DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
-                       msm_obj->madv, madv);
-               return ERR_PTR(-EBUSY);
-       }
-
-       pages = msm_gem_pin_pages_locked(obj);
+       pages = msm_gem_pin_pages_locked(obj, madv);
        if (IS_ERR(pages))
                return ERR_CAST(pages);
 
index aff18c2f600ab2050d52cd05ba924d3b4ae68a20..3f1aa4de3b87302aaa1f48f999b37ef8d336454a 100644 (file)
@@ -558,8 +558,7 @@ static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit,
                                            struct drm_file *file,
                                            uint64_t in_syncobjs_addr,
                                            uint32_t nr_in_syncobjs,
-                                           size_t syncobj_stride,
-                                           struct msm_ringbuffer *ring)
+                                           size_t syncobj_stride)
 {
        struct drm_syncobj **syncobjs = NULL;
        struct drm_msm_gem_submit_syncobj syncobj_desc = {0};
@@ -722,7 +721,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_msm_gem_submit *args = data;
        struct msm_file_private *ctx = file->driver_priv;
-       struct msm_gem_submit *submit;
+       struct msm_gem_submit *submit = NULL;
        struct msm_gpu *gpu = priv->gpu;
        struct msm_gpu_submitqueue *queue;
        struct msm_ringbuffer *ring;
@@ -769,13 +768,15 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
                if (out_fence_fd < 0) {
                        ret = out_fence_fd;
-                       return ret;
+                       goto out_post_unlock;
                }
        }
 
        submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds);
-       if (IS_ERR(submit))
-               return PTR_ERR(submit);
+       if (IS_ERR(submit)) {
+               ret = PTR_ERR(submit);
+               goto out_post_unlock;
+       }
 
        trace_msm_gpu_submit(pid_nr(submit->pid), ring->id, submit->ident,
                args->nr_bos, args->nr_cmds);
@@ -806,7 +807,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                syncobjs_to_reset = msm_parse_deps(submit, file,
                                                   args->in_syncobjs,
                                                   args->nr_in_syncobjs,
-                                                  args->syncobj_stride, ring);
+                                                  args->syncobj_stride);
                if (IS_ERR(syncobjs_to_reset)) {
                        ret = PTR_ERR(syncobjs_to_reset);
                        goto out_unlock;
@@ -947,6 +948,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        /* The scheduler owns a ref now: */
        msm_gem_submit_get(submit);
 
+       msm_rd_dump_submit(priv->rd, submit, NULL);
+
        drm_sched_entity_push_job(&submit->base);
 
        args->fence = submit->fence_id;
@@ -962,11 +965,20 @@ out:
        if (has_ww_ticket)
                ww_acquire_fini(&submit->ticket);
 out_unlock:
-       if (ret && (out_fence_fd >= 0))
-               put_unused_fd(out_fence_fd);
        mutex_unlock(&queue->lock);
 out_post_unlock:
-       msm_gem_submit_put(submit);
+       if (ret && (out_fence_fd >= 0))
+               put_unused_fd(out_fence_fd);
+
+       if (!IS_ERR_OR_NULL(submit)) {
+               msm_gem_submit_put(submit);
+       } else {
+               /*
+                * If the submit hasn't yet taken ownership of the queue
+                * then we need to drop the reference ourself:
+                */
+               msm_submitqueue_put(queue);
+       }
        if (!IS_ERR_OR_NULL(post_deps)) {
                for (i = 0; i < args->nr_out_syncobjs; ++i) {
                        kfree(post_deps[i].chain);
index c403912d13ab795b85c82c85bf2c31d31b8860f4..52db90e34eadc37c8fc109c121910351348e367d 100644 (file)
@@ -746,8 +746,6 @@ void msm_gpu_retire(struct msm_gpu *gpu)
 /* add bo's to gpu's ring, and kick gpu: */
 void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
 {
-       struct drm_device *dev = gpu->dev;
-       struct msm_drm_private *priv = dev->dev_private;
        struct msm_ringbuffer *ring = submit->ring;
        unsigned long flags;
 
@@ -759,8 +757,6 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
 
        submit->seqno = submit->hw_fence->seqno;
 
-       msm_rd_dump_submit(priv->rd, submit, NULL);
-
        update_sw_cntrs(gpu);
 
        /*
index 418e1e06cddefd83b7cfd5aa57f2197de2f4f489..5cc8d358cc9759307a444cd62bce83c62b3dcdb7 100644 (file)
@@ -234,7 +234,12 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)
        /* Get the pagetable configuration from the domain */
        if (adreno_smmu->cookie)
                ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie);
-       if (!ttbr1_cfg)
+
+       /*
+        * If you hit this WARN_ONCE() you are probably missing an entry in
+        * qcom_smmu_impl_of_match[] in arm-smmu-qcom.c
+        */
+       if (WARN_ONCE(!ttbr1_cfg, "No per-process page tables"))
                return ERR_PTR(-ENODEV);
 
        pagetable = kzalloc(sizeof(*pagetable), GFP_KERNEL);
@@ -410,7 +415,7 @@ struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsig
        struct msm_mmu *mmu;
 
        mmu = msm_iommu_new(dev, quirks);
-       if (IS_ERR(mmu))
+       if (IS_ERR_OR_NULL(mmu))
                return mmu;
 
        iommu = to_msm_iommu(mmu);
index e8c93731aaa18f769d54a835dfac6612d1683d27..05648c910c68efe2785c0251606eb17368d9d755 100644 (file)
@@ -538,6 +538,14 @@ static const struct msm_mdss_data sdm845_data = {
        .highest_bank_bit = 2,
 };
 
+static const struct msm_mdss_data sm6350_data = {
+       .ubwc_version = UBWC_2_0,
+       .ubwc_dec_version = UBWC_2_0,
+       .ubwc_swizzle = 6,
+       .ubwc_static = 0x1e,
+       .highest_bank_bit = 1,
+};
+
 static const struct msm_mdss_data sm8150_data = {
        .ubwc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_3_0,
@@ -571,6 +579,8 @@ static const struct of_device_id mdss_dt_match[] = {
        { .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data },
        { .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data },
        { .compatible = "qcom,sm6115-mdss", .data = &sm6115_data },
+       { .compatible = "qcom,sm6350-mdss", .data = &sm6350_data },
+       { .compatible = "qcom,sm6375-mdss", .data = &sm6350_data },
        { .compatible = "qcom,sm8150-mdss", .data = &sm8150_data },
        { .compatible = "qcom,sm8250-mdss", .data = &sm8250_data },
        { .compatible = "qcom,sm8350-mdss", .data = &sm8250_data },
index db2f847c8535fc2c0768a62483db36da6a5e66e1..8d5687d5ed786ee2f3d7ba2bd5fbcf00fdd95838 100644 (file)
@@ -83,15 +83,10 @@ struct msm_rd_state {
 
        bool open;
 
-       /* current submit to read out: */
-       struct msm_gem_submit *submit;
-
        /* fifo access is synchronized on the producer side by
-        * gpu->lock held by submit code (otherwise we could
-        * end up w/ cmds logged in different order than they
-        * were executed).  And read_lock synchronizes the reads
+        * write_lock.  And read_lock synchronizes the reads
         */
-       struct mutex read_lock;
+       struct mutex read_lock, write_lock;
 
        wait_queue_head_t fifo_event;
        struct circ_buf fifo;
@@ -243,6 +238,7 @@ static void rd_cleanup(struct msm_rd_state *rd)
                return;
 
        mutex_destroy(&rd->read_lock);
+       mutex_destroy(&rd->write_lock);
        kfree(rd);
 }
 
@@ -258,6 +254,7 @@ static struct msm_rd_state *rd_init(struct drm_minor *minor, const char *name)
        rd->fifo.buf = rd->buf;
 
        mutex_init(&rd->read_lock);
+       mutex_init(&rd->write_lock);
 
        init_waitqueue_head(&rd->fifo_event);
 
@@ -338,19 +335,15 @@ static void snapshot_buf(struct msm_rd_state *rd,
        if (!(submit->bos[idx].flags & MSM_SUBMIT_BO_READ))
                return;
 
-       msm_gem_lock(&obj->base);
        buf = msm_gem_get_vaddr_active(&obj->base);
        if (IS_ERR(buf))
-               goto out_unlock;
+               return;
 
        buf += offset;
 
        rd_write_section(rd, RD_BUFFER_CONTENTS, buf, size);
 
        msm_gem_put_vaddr_locked(&obj->base);
-
-out_unlock:
-       msm_gem_unlock(&obj->base);
 }
 
 /* called under gpu->lock */
@@ -364,10 +357,7 @@ void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit,
        if (!rd->open)
                return;
 
-       /* writing into fifo is serialized by caller, and
-        * rd->read_lock is used to serialize the reads
-        */
-       WARN_ON(!mutex_is_locked(&submit->gpu->lock));
+       mutex_lock(&rd->write_lock);
 
        if (fmt) {
                va_list args;
@@ -424,5 +414,7 @@ void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit,
                        break;
                }
        }
+
+       mutex_unlock(&rd->write_lock);
 }
 #endif
index ae09c627bc8448b962f95f581ef213ff06b0ab58..c71afda79d6442f57026b945fd7ff8fe08cd35a4 100644 (file)
@@ -517,6 +517,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
        { .compatible = "qcom,qcm2290-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,qdu1000-smmu-500", .data = &qcom_smmu_500_impl0_data  },
        { .compatible = "qcom,sc7180-smmu-500", .data = &qcom_smmu_500_impl0_data },
+       { .compatible = "qcom,sc7180-smmu-v2", .data = &qcom_smmu_v2_data },
        { .compatible = "qcom,sc7280-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,sc8180x-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,sc8280xp-smmu-500", .data = &qcom_smmu_500_impl0_data },
@@ -561,5 +562,14 @@ struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
        if (match)
                return qcom_smmu_create(smmu, match->data);
 
+       /*
+        * If you hit this WARN_ON() you are missing an entry in the
+        * qcom_smmu_impl_of_match[] table, and GPU per-process page-
+        * tables will be broken.
+        */
+       WARN(of_device_is_compatible(np, "qcom,adreno-smmu"),
+            "Missing qcom_smmu_impl_of_match entry for: %s",
+            dev_name(smmu->dev));
+
        return smmu;
 }
This page took 0.465774 seconds and 4 git commands to generate.