OSDN Git Service

drm/msm/mdp5: Add msm8998 support
authorJeffrey Hugo <jeffrey.l.hugo@gmail.com>
Mon, 1 Jul 2019 17:45:06 +0000 (10:45 -0700)
committerRob Clark <robdclark@chromium.org>
Tue, 3 Sep 2019 23:16:58 +0000 (16:16 -0700)
Add support for MDP5 version v3.0 found on msm8998.

Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
Reviewed-by: Rob Clark <robdclark@gmail.com>
[silence unitialized variable warnings]
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c

index dd1daf0..f6e71ff 100644 (file)
@@ -630,7 +630,115 @@ const struct mdp5_cfg_hw msm8917_config = {
        .max_clk = 320000000,
 };
 
-static const struct mdp5_cfg_handler cfg_handlers[] = {
+const struct mdp5_cfg_hw msm8998_config = {
+       .name = "msm8998",
+       .mdp = {
+               .count = 1,
+               .caps = MDP_CAP_DSC |
+                       MDP_CAP_CDM |
+                       MDP_CAP_SRC_SPLIT |
+                       0,
+       },
+       .ctl = {
+               .count = 5,
+               .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
+               .flush_hw_mask = 0xf7ffffff,
+       },
+       .pipe_vig = {
+               .count = 4,
+               .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
+               .caps = MDP_PIPE_CAP_HFLIP      |
+                       MDP_PIPE_CAP_VFLIP      |
+                       MDP_PIPE_CAP_SCALE      |
+                       MDP_PIPE_CAP_CSC        |
+                       MDP_PIPE_CAP_DECIMATION |
+                       MDP_PIPE_CAP_SW_PIX_EXT |
+                       0,
+       },
+       .pipe_rgb = {
+               .count = 4,
+               .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
+               .caps = MDP_PIPE_CAP_HFLIP      |
+                       MDP_PIPE_CAP_VFLIP      |
+                       MDP_PIPE_CAP_SCALE      |
+                       MDP_PIPE_CAP_DECIMATION |
+                       MDP_PIPE_CAP_SW_PIX_EXT |
+                       0,
+       },
+       .pipe_dma = {
+               .count = 2, /* driver supports max of 2 currently */
+               .base = { 0x24000, 0x26000, 0x28000, 0x2a000 },
+               .caps = MDP_PIPE_CAP_HFLIP      |
+                       MDP_PIPE_CAP_VFLIP      |
+                       MDP_PIPE_CAP_SW_PIX_EXT |
+                       0,
+       },
+       .pipe_cursor = {
+               .count = 2,
+               .base = { 0x34000, 0x36000 },
+               .caps = MDP_PIPE_CAP_HFLIP      |
+                       MDP_PIPE_CAP_VFLIP      |
+                       MDP_PIPE_CAP_SW_PIX_EXT |
+                       MDP_PIPE_CAP_CURSOR     |
+                       0,
+       },
+
+       .lm = {
+               .count = 6,
+               .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
+               .instances = {
+                               { .id = 0, .pp = 0, .dspp = 0,
+                                 .caps = MDP_LM_CAP_DISPLAY |
+                                         MDP_LM_CAP_PAIR, },
+                               { .id = 1, .pp = 1, .dspp = 1,
+                                 .caps = MDP_LM_CAP_DISPLAY, },
+                               { .id = 2, .pp = 2, .dspp = -1,
+                                 .caps = MDP_LM_CAP_DISPLAY |
+                                         MDP_LM_CAP_PAIR, },
+                               { .id = 3, .pp = -1, .dspp = -1,
+                                 .caps = MDP_LM_CAP_WB, },
+                               { .id = 4, .pp = -1, .dspp = -1,
+                                 .caps = MDP_LM_CAP_WB, },
+                               { .id = 5, .pp = 3, .dspp = -1,
+                                 .caps = MDP_LM_CAP_DISPLAY, },
+                            },
+               .nb_stages = 8,
+               .max_width = 2560,
+               .max_height = 0xFFFF,
+       },
+       .dspp = {
+               .count = 2,
+               .base = { 0x54000, 0x56000 },
+       },
+       .ad = {
+               .count = 3,
+               .base = { 0x78000, 0x78800, 0x79000 },
+       },
+       .pp = {
+               .count = 4,
+               .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
+       },
+       .cdm = {
+               .count = 1,
+               .base = { 0x79200 },
+       },
+       .dsc = {
+               .count = 2,
+               .base = { 0x80000, 0x80400 },
+       },
+       .intf = {
+               .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
+               .connect = {
+                       [0] = INTF_eDP,
+                       [1] = INTF_DSI,
+                       [2] = INTF_DSI,
+                       [3] = INTF_HDMI,
+               },
+       },
+       .max_clk = 412500000,
+};
+
+static const struct mdp5_cfg_handler cfg_handlers_v1[] = {
        { .revision = 0, .config = { .hw = &msm8x74v1_config } },
        { .revision = 2, .config = { .hw = &msm8x74v2_config } },
        { .revision = 3, .config = { .hw = &apq8084_config } },
@@ -640,6 +748,10 @@ static const struct mdp5_cfg_handler cfg_handlers[] = {
        { .revision = 15, .config = { .hw = &msm8917_config } },
 };
 
+static const struct mdp5_cfg_handler cfg_handlers_v3[] = {
+       { .revision = 0, .config = { .hw = &msm8998_config } },
+};
+
 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev);
 
 const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
@@ -668,8 +780,9 @@ struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
        struct drm_device *dev = mdp5_kms->dev;
        struct platform_device *pdev = to_platform_device(dev->dev);
        struct mdp5_cfg_handler *cfg_handler;
+       const struct mdp5_cfg_handler *cfg_handlers;
        struct mdp5_cfg_platform *pconfig;
-       int i, ret = 0;
+       int i, ret = 0, num_handlers;
 
        cfg_handler = kzalloc(sizeof(*cfg_handler), GFP_KERNEL);
        if (unlikely(!cfg_handler)) {
@@ -677,15 +790,24 @@ struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
                goto fail;
        }
 
-       if (major != 1) {
+       switch (major) {
+       case 1:
+               cfg_handlers = cfg_handlers_v1;
+               num_handlers = ARRAY_SIZE(cfg_handlers_v1);
+               break;
+       case 3:
+               cfg_handlers = cfg_handlers_v3;
+               num_handlers = ARRAY_SIZE(cfg_handlers_v3);
+               break;
+       default:
                DRM_DEV_ERROR(dev->dev, "unexpected MDP major version: v%d.%d\n",
                                major, minor);
                ret = -ENXIO;
                goto fail;
-       }
+       };
 
        /* only after mdp5_cfg global pointer's init can we access the hw */
-       for (i = 0; i < ARRAY_SIZE(cfg_handlers); i++) {
+       for (i = 0; i < num_handlers; i++) {
                if (cfg_handlers[i].revision != minor)
                        continue;
                mdp5_cfg = cfg_handlers[i].config.hw;