Merge tag 'drm-msm-next-2023-08-20' of https://gitlab.freedesktop.org/drm/msm into...
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / msm_mdss.c
index 798bd4f..2e87dd6 100644 (file)
 #include <linux/irqchip.h>
 #include <linux/irqdesc.h>
 #include <linux/irqchip/chained_irq.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
 
-#include "msm_drv.h"
+#include "msm_mdss.h"
 #include "msm_kms.h"
 
 #define HW_REV                         0x0
 
 #define MIN_IB_BW      400000000UL /* Min ib vote 400MB */
 
-struct msm_mdss_data {
-       u32 ubwc_version;
-       /* can be read from register 0x58 */
-       u32 ubwc_dec_version;
-       u32 ubwc_swizzle;
-       u32 ubwc_static;
-       u32 highest_bank_bit;
-       u32 macrotile_mode;
-};
-
 struct msm_mdss {
        struct device *dev;
 
@@ -185,12 +177,6 @@ static int _msm_mdss_irq_domain_add(struct msm_mdss *msm_mdss)
        return 0;
 }
 
-#define UBWC_1_0 0x10000000
-#define UBWC_2_0 0x20000000
-#define UBWC_3_0 0x30000000
-#define UBWC_4_0 0x40000000
-#define UBWC_4_3 0x40030000
-
 static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)
 {
        const struct msm_mdss_data *data = msm_mdss->mdss_data;
@@ -205,10 +191,10 @@ static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)
                    (data->highest_bank_bit & 0x3) << 4 |
                    (data->macrotile_mode & 0x1) << 12;
 
-       if (data->ubwc_version == UBWC_3_0)
+       if (data->ubwc_enc_version == UBWC_3_0)
                value |= BIT(10);
 
-       if (data->ubwc_version == UBWC_1_0)
+       if (data->ubwc_enc_version == UBWC_1_0)
                value |= BIT(8);
 
        writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
@@ -224,7 +210,7 @@ static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
 
        writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
 
-       if (data->ubwc_version == UBWC_3_0) {
+       if (data->ubwc_enc_version == UBWC_3_0) {
                writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2);
                writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE);
        } else {
@@ -236,6 +222,18 @@ static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
        }
 }
 
+const struct msm_mdss_data *msm_mdss_get_mdss_data(struct device *dev)
+{
+       struct msm_mdss *mdss;
+
+       if (!dev)
+               return ERR_PTR(-EINVAL);
+
+       mdss = dev_get_drvdata(dev);
+
+       return mdss->mdss_data;
+}
+
 static int msm_mdss_enable(struct msm_mdss *msm_mdss)
 {
        int ret;
@@ -268,6 +266,10 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
         * UBWC_n and the rest of params comes from hw data.
         */
        switch (msm_mdss->mdss_data->ubwc_dec_version) {
+       case 0: /* no UBWC */
+       case UBWC_1_0:
+               /* do nothing */
+               break;
        case UBWC_2_0:
                msm_mdss_setup_ubwc_dec_20(msm_mdss);
                break;
@@ -506,14 +508,26 @@ static int mdss_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct msm_mdss_data msm8998_data = {
+       .ubwc_enc_version = UBWC_1_0,
+       .ubwc_dec_version = UBWC_1_0,
+       .highest_bank_bit = 1,
+};
+
+static const struct msm_mdss_data qcm2290_data = {
+       /* no UBWC */
+       .highest_bank_bit = 0x2,
+};
+
 static const struct msm_mdss_data sc7180_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_static = 0x1e,
+       .highest_bank_bit = 0x3,
 };
 
 static const struct msm_mdss_data sc7280_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
@@ -522,14 +536,14 @@ static const struct msm_mdss_data sc7280_data = {
 };
 
 static const struct msm_mdss_data sc8180x_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_3_0,
        .highest_bank_bit = 3,
        .macrotile_mode = 1,
 };
 
 static const struct msm_mdss_data sc8280xp_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
@@ -538,13 +552,13 @@ static const struct msm_mdss_data sc8280xp_data = {
 };
 
 static const struct msm_mdss_data sdm845_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .highest_bank_bit = 2,
 };
 
 static const struct msm_mdss_data sm6350_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 0x1e,
@@ -552,20 +566,28 @@ static const struct msm_mdss_data sm6350_data = {
 };
 
 static const struct msm_mdss_data sm8150_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_3_0,
        .highest_bank_bit = 2,
 };
 
 static const struct msm_mdss_data sm6115_data = {
-       .ubwc_version = UBWC_1_0,
+       .ubwc_enc_version = UBWC_1_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_swizzle = 7,
        .ubwc_static = 0x11f,
+       .highest_bank_bit = 0x1,
+};
+
+static const struct msm_mdss_data sm6125_data = {
+       .ubwc_enc_version = UBWC_1_0,
+       .ubwc_dec_version = UBWC_3_0,
+       .ubwc_swizzle = 1,
+       .highest_bank_bit = 1,
 };
 
 static const struct msm_mdss_data sm8250_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
@@ -575,7 +597,7 @@ static const struct msm_mdss_data sm8250_data = {
 };
 
 static const struct msm_mdss_data sm8550_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_3,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
@@ -583,17 +605,17 @@ static const struct msm_mdss_data sm8550_data = {
        .highest_bank_bit = 3,
        .macrotile_mode = 1,
 };
-
 static const struct of_device_id mdss_dt_match[] = {
        { .compatible = "qcom,mdss" },
-       { .compatible = "qcom,msm8998-mdss" },
-       { .compatible = "qcom,qcm2290-mdss" },
+       { .compatible = "qcom,msm8998-mdss", .data = &msm8998_data },
+       { .compatible = "qcom,qcm2290-mdss", .data = &qcm2290_data },
        { .compatible = "qcom,sdm845-mdss", .data = &sdm845_data },
        { .compatible = "qcom,sc7180-mdss", .data = &sc7180_data },
        { .compatible = "qcom,sc7280-mdss", .data = &sc7280_data },
        { .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data },
        { .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data },
        { .compatible = "qcom,sm6115-mdss", .data = &sm6115_data },
+       { .compatible = "qcom,sm6125-mdss", .data = &sm6125_data },
        { .compatible = "qcom,sm6350-mdss", .data = &sm6350_data },
        { .compatible = "qcom,sm6375-mdss", .data = &sm6350_data },
        { .compatible = "qcom,sm8150-mdss", .data = &sm8150_data },