// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
*/
#include "mdp5_kms.h"
#include "mdp5_cfg.h"
struct mdp5_cfg_handler {
int revision;
struct mdp5_cfg config;
};
/* mdp5_cfg must be exposed (used in mdp5.xml.h) */
const struct mdp5_cfg_hw *mdp5_cfg = NULL;
static const struct mdp5_cfg_hw msm8x74v1_config = {
.name = "msm8x74v1" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_SMP |
0 ,
},
.smp = {
.mmb_count = 22 ,
.mmb_size = 4096 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_VIG1] = 4 , [SSPP_VIG2] = 7 ,
[SSPP_DMA0] = 10 , [SSPP_DMA1] = 13 ,
[SSPP_RGB0] = 16 , [SSPP_RGB1] = 17 , [SSPP_RGB2] = 18 ,
},
},
.ctl = {
.count = 5 ,
.base = { 0 x00500, 0 x00600, 0 x00700, 0 x00800, 0 x00900 },
.flush_hw_mask = 0 x0003ffff,
},
.pipe_vig = {
.count = 3 ,
.base = { 0 x01100, 0 x01500, 0 x01900 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE |
MDP_PIPE_CAP_CSC |
0 ,
},
.pipe_rgb = {
.count = 3 ,
.base = { 0 x01d00, 0 x02100, 0 x02500 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE |
0 ,
},
.pipe_dma = {
.count = 2 ,
.base = { 0 x02900, 0 x02d00 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
0 ,
},
.lm = {
.count = 5 ,
.base = { 0 x03100, 0 x03500, 0 x03900, 0 x03d00, 0 x04100 },
.instances = {
{ .id = 0 , .pp = 0 , .dspp = 0 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 1 , .pp = 1 , .dspp = 1 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 2 , .pp = 2 , .dspp = 2 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 3 , .pp = -1 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB },
{ .id = 4 , .pp = -1 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB },
},
.nb_stages = 5 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 3 ,
.base = { 0 x04500, 0 x04900, 0 x04d00 },
},
.pp = {
.count = 3 ,
.base = { 0 x21a00, 0 x21b00, 0 x21c00 },
},
.intf = {
.base = { 0 x21000, 0 x21200, 0 x21400, 0 x21600 },
.connect = {
[0 ] = INTF_eDP,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.perf = {
.ab_inefficiency = 200 ,
.ib_inefficiency = 120 ,
.clk_inefficiency = 125
},
.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 = { 0 x00500, 0 x00600 },
.flush_hw_mask = 0 x0003ffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x01100 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE |
MDP_PIPE_CAP_CSC |
0 ,
},
.pipe_rgb = {
.count = 1 ,
.base = { 0 x01d00 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE |
0 ,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x02900 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
0 ,
},
.lm = {
.count = 2 ,
.base = { 0 x03100, 0 x03d00 },
.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 = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x04500 },
},
.pp = {
.count = 1 ,
.base = { 0 x21a00 },
},
.intf = {
.base = { 0 x00000, 0 x21200 },
.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 = {
.count = 1 ,
.caps = MDP_CAP_SMP |
0 ,
},
.smp = {
.mmb_count = 22 ,
.mmb_size = 4096 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_VIG1] = 4 , [SSPP_VIG2] = 7 ,
[SSPP_DMA0] = 10 , [SSPP_DMA1] = 13 ,
[SSPP_RGB0] = 16 , [SSPP_RGB1] = 17 , [SSPP_RGB2] = 18 ,
},
},
.ctl = {
.count = 5 ,
.base = { 0 x00500, 0 x00600, 0 x00700, 0 x00800, 0 x00900 },
.flush_hw_mask = 0 x0003ffff,
},
.pipe_vig = {
.count = 3 ,
.base = { 0 x01100, 0 x01500, 0 x01900 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_rgb = {
.count = 3 ,
.base = { 0 x01d00, 0 x02100, 0 x02500 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
},
.pipe_dma = {
.count = 2 ,
.base = { 0 x02900, 0 x02d00 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
},
.lm = {
.count = 5 ,
.base = { 0 x03100, 0 x03500, 0 x03900, 0 x03d00, 0 x04100 },
.instances = {
{ .id = 0 , .pp = 0 , .dspp = 0 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 1 , .pp = 1 , .dspp = 1 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 2 , .pp = 2 , .dspp = 2 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 3 , .pp = -1 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB, },
{ .id = 4 , .pp = -1 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB, },
},
.nb_stages = 5 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 3 ,
.base = { 0 x04500, 0 x04900, 0 x04d00 },
},
.ad = {
.count = 2 ,
.base = { 0 x13000, 0 x13200 },
},
.pp = {
.count = 3 ,
.base = { 0 x12c00, 0 x12d00, 0 x12e00 },
},
.intf = {
.base = { 0 x12400, 0 x12600, 0 x12800, 0 x12a00 },
.connect = {
[0 ] = INTF_eDP,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.perf = {
.ab_inefficiency = 200 ,
.ib_inefficiency = 120 ,
.clk_inefficiency = 125
},
.max_clk = 320000000 ,
};
static const struct mdp5_cfg_hw apq8084_config = {
.name = "apq8084" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_SMP |
MDP_CAP_SRC_SPLIT |
0 ,
},
.smp = {
.mmb_count = 44 ,
.mmb_size = 8192 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_VIG1] = 4 ,
[SSPP_VIG2] = 7 , [SSPP_VIG3] = 19 ,
[SSPP_DMA0] = 10 , [SSPP_DMA1] = 13 ,
[SSPP_RGB0] = 16 , [SSPP_RGB1] = 17 ,
[SSPP_RGB2] = 18 , [SSPP_RGB3] = 22 ,
},
.reserved_state[0 ] = GENMASK(7 , 0 ), /* first 8 MMBs */
.reserved = {
/* Two SMP blocks are statically tied to RGB pipes: */
[16 ] = 2 , [17 ] = 2 , [18 ] = 2 , [22 ] = 2 ,
},
},
.ctl = {
.count = 5 ,
.base = { 0 x00500, 0 x00600, 0 x00700, 0 x00800, 0 x00900 },
.flush_hw_mask = 0 x003fffff,
},
.pipe_vig = {
.count = 4 ,
.base = { 0 x01100, 0 x01500, 0 x01900, 0 x01d00 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_rgb = {
.count = 4 ,
.base = { 0 x02100, 0 x02500, 0 x02900, 0 x02d00 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
},
.pipe_dma = {
.count = 2 ,
.base = { 0 x03100, 0 x03500 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
},
.lm = {
.count = 6 ,
.base = { 0 x03900, 0 x03d00, 0 x04100, 0 x04500, 0 x04900, 0 x04d00 },
.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 = 2 ,
.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 = 3 ,
.caps = MDP_LM_CAP_DISPLAY, },
},
.nb_stages = 5 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 4 ,
.base = { 0 x05100, 0 x05500, 0 x05900, 0 x05d00 },
},
.ad = {
.count = 3 ,
.base = { 0 x13400, 0 x13600, 0 x13800 },
},
.pp = {
.count = 4 ,
.base = { 0 x12e00, 0 x12f00, 0 x13000, 0 x13100 },
},
.intf = {
.base = { 0 x12400, 0 x12600, 0 x12800, 0 x12a00, 0 x12c00 },
.connect = {
[0 ] = INTF_eDP,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.perf = {
.ab_inefficiency = 200 ,
.ib_inefficiency = 120 ,
.clk_inefficiency = 105
},
.max_clk = 320000000 ,
};
static const struct mdp5_cfg_hw msm8x16_config = {
.name = "msm8x16" ,
.mdp = {
.count = 1 ,
.base = { 0 x0 },
.caps = MDP_CAP_SMP |
0 ,
},
.smp = {
.mmb_count = 8 ,
.mmb_size = 8192 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_DMA0] = 4 ,
[SSPP_RGB0] = 7 , [SSPP_RGB1] = 8 ,
},
},
.ctl = {
.count = 5 ,
.base = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 x4003ffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_rgb = {
.count = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
},
.lm = {
.count = 2 , /* LM0 and LM3 */
.base = { 0 x44000, 0 x47000 },
.instances = {
{ .id = 0 , .pp = 0 , .dspp = 0 ,
.caps = MDP_LM_CAP_DISPLAY, },
{ .id = 3 , .pp = -1 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB },
},
.nb_stages = 8 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.intf = {
.base = { 0 x00000, 0 x6a800 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
},
},
.perf = {
.ab_inefficiency = 100 ,
.ib_inefficiency = 200 ,
.clk_inefficiency = 105
},
.max_clk = 320000000 ,
};
static const struct mdp5_cfg_hw msm8x36_config = {
.name = "msm8x36" ,
.mdp = {
.count = 1 ,
.base = { 0 x0 },
.caps = MDP_CAP_SMP |
0 ,
},
.smp = {
.mmb_count = 8 ,
.mmb_size = 10240 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_DMA0] = 4 ,
[SSPP_RGB0] = 7 , [SSPP_RGB1] = 8 ,
},
},
.ctl = {
.count = 3 ,
.base = { 0 x01000, 0 x01200, 0 x01400 },
.flush_hw_mask = 0 x4003ffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_rgb = {
.count = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
},
.lm = {
.count = 2 ,
.base = { 0 x44000, 0 x47000 },
.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 = 8 ,
.max_width = 2560 ,
.max_height = 0 xFFFF,
},
.pp = {
.count = 1 ,
.base = { 0 x70000 },
},
.ad = {
.count = 1 ,
.base = { 0 x78000 },
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.intf = {
.base = { 0 x00000, 0 x6a800, 0 x6b000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
},
},
.perf = {
.ab_inefficiency = 100 ,
.ib_inefficiency = 200 ,
.clk_inefficiency = 105
},
.max_clk = 366670000 ,
};
static const struct mdp5_cfg_hw msm8x94_config = {
.name = "msm8x94" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_SMP |
MDP_CAP_SRC_SPLIT |
0 ,
},
.smp = {
.mmb_count = 44 ,
.mmb_size = 8192 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_VIG1] = 4 ,
[SSPP_VIG2] = 7 , [SSPP_VIG3] = 19 ,
[SSPP_DMA0] = 10 , [SSPP_DMA1] = 13 ,
[SSPP_RGB0] = 16 , [SSPP_RGB1] = 17 ,
[SSPP_RGB2] = 18 , [SSPP_RGB3] = 22 ,
},
.reserved_state[0 ] = GENMASK(23 , 0 ), /* first 24 MMBs */
.reserved = {
[1 ] = 1 , [4 ] = 1 , [7 ] = 1 , [19 ] = 1 ,
[16 ] = 5 , [17 ] = 5 , [18 ] = 5 , [22 ] = 5 ,
},
},
.ctl = {
.count = 5 ,
.base = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 xf0ffffff,
},
.pipe_vig = {
.count = 4 ,
.base = { 0 x04000, 0 x06000, 0 x08000, 0 x0a000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
MDP_PIPE_CAP_DECIMATION,
},
.pipe_rgb = {
.count = 4 ,
.base = { 0 x14000, 0 x16000, 0 x18000, 0 x1a000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
},
.pipe_dma = {
.count = 2 ,
.base = { 0 x24000, 0 x26000 },
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
},
.lm = {
.count = 6 ,
.base = { 0 x44000, 0 x45000, 0 x46000, 0 x47000, 0 x48000, 0 x49000 },
.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 = 2 ,
.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 = 3 ,
.caps = MDP_LM_CAP_DISPLAY, },
},
.nb_stages = 8 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 4 ,
.base = { 0 x54000, 0 x56000, 0 x58000, 0 x5a000 },
},
.ad = {
.count = 3 ,
.base = { 0 x78000, 0 x78800, 0 x79000 },
},
.pp = {
.count = 4 ,
.base = { 0 x70000, 0 x70800, 0 x71000, 0 x71800 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000, 0 x6b800, 0 x6c000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.perf = {
.ab_inefficiency = 100 ,
.ib_inefficiency = 100 ,
.clk_inefficiency = 105
},
.max_clk = 400000000 ,
};
static const struct mdp5_cfg_hw msm8x96_config = {
.name = "msm8x96" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_DSC |
MDP_CAP_CDM |
MDP_CAP_SRC_SPLIT |
0 ,
},
.ctl = {
.count = 5 ,
.base = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 xf4ffffff,
},
.pipe_vig = {
.count = 4 ,
.base = { 0 x04000, 0 x06000, 0 x08000, 0 x0a000 },
.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 = { 0 x14000, 0 x16000, 0 x18000, 0 x1a000 },
.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 ,
.base = { 0 x24000, 0 x26000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 2 ,
.base = { 0 x34000, 0 x36000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 6 ,
.base = { 0 x44000, 0 x45000, 0 x46000, 0 x47000, 0 x48000, 0 x49000 },
.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 = 0 xFFFF,
},
.dspp = {
.count = 2 ,
.base = { 0 x54000, 0 x56000 },
},
.ad = {
.count = 3 ,
.base = { 0 x78000, 0 x78800, 0 x79000 },
},
.pp = {
.count = 4 ,
.base = { 0 x70000, 0 x70800, 0 x71000, 0 x71800 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.dsc = {
.count = 2 ,
.base = { 0 x80000, 0 x80400 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000, 0 x6b800, 0 x6c000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.perf = {
.ab_inefficiency = 100 ,
.ib_inefficiency = 200 ,
.clk_inefficiency = 105
},
.max_clk = 412500000 ,
};
static const struct mdp5_cfg_hw msm8x76_config = {
.name = "msm8x76" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_SMP |
MDP_CAP_DSC |
MDP_CAP_SRC_SPLIT |
0 ,
},
.ctl = {
.count = 3 ,
.base = { 0 x01000, 0 x01200, 0 x01400 },
.flush_hw_mask = 0 xffffffff,
},
.smp = {
.mmb_count = 10 ,
.mmb_size = 10240 ,
.clients = {
[SSPP_VIG0] = 1 , [SSPP_VIG1] = 9 ,
[SSPP_DMA0] = 4 ,
[SSPP_RGB0] = 7 , [SSPP_RGB1] = 8 ,
},
},
.pipe_vig = {
.count = 2 ,
.base = { 0 x04000, 0 x06000 },
.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 = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x440DC },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 2 ,
.base = { 0 x44000, 0 x45000 },
.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 = 8 ,
.max_width = 2560 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.pp = {
.count = 3 ,
.base = { 0 x70000, 0 x70800, 0 x72000 },
},
.dsc = {
.count = 2 ,
.base = { 0 x80000, 0 x80400 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
},
},
.max_clk = 360000000 ,
};
static const struct mdp5_cfg_hw msm8x53_config = {
.name = "msm8x53" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_CDM,
},
.ctl = {
.count = 3 ,
.base = { 0 x01000, 0 x01200, 0 x01400 },
.flush_hw_mask = 0 xffffffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.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 = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x34000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 3 ,
.base = { 0 x44000, 0 x45000 },
.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 },
},
.nb_stages = 5 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.pp = {
.count = 2 ,
.base = { 0 x70000, 0 x70800 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
},
},
.perf = {
.ab_inefficiency = 100 ,
.ib_inefficiency = 200 ,
.clk_inefficiency = 105
},
.max_clk = 400000000 ,
};
static const struct mdp5_cfg_hw msm8917_config = {
.name = "msm8917" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_CDM,
},
.ctl = {
.count = 3 ,
.base = { 0 x01000, 0 x01200, 0 x01400 },
.flush_hw_mask = 0 xffffffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.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 = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x34000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 2 ,
.base = { 0 x44000, 0 x45000 },
.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 = 8 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.pp = {
.count = 1 ,
.base = { 0 x70000 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
},
},
.max_clk = 320000000 ,
};
static const struct mdp5_cfg_hw msm8937_config = {
.name = "msm8937" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_CDM,
},
.ctl = {
.count = 3 ,
.base = { 0 x01000, 0 x01200, 0 x01400 },
.flush_hw_mask = 0 xffffffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.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 = 2 ,
.base = { 0 x14000, 0 x16000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_DECIMATION |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_dma = {
.count = 1 ,
.base = { 0 x24000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x34000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 2 ,
.base = { 0 x44000, 0 x45000 },
.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 },
},
.nb_stages = 5 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.pp = {
.count = 2 ,
.base = { 0 x70000, 0 x70800 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.intf = {
.base = { 0 x00000, 0 x6a800, 0 x6b000 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
},
},
.max_clk = 320000000 ,
};
static 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 = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 xf7ffffff,
},
.pipe_vig = {
.count = 4 ,
.base = { 0 x04000, 0 x06000, 0 x08000, 0 x0a000 },
.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 = { 0 x14000, 0 x16000, 0 x18000, 0 x1a000 },
.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 = { 0 x24000, 0 x26000, 0 x28000, 0 x2a000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 2 ,
.base = { 0 x34000, 0 x36000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 6 ,
.base = { 0 x44000, 0 x45000, 0 x46000, 0 x47000, 0 x48000, 0 x49000 },
.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 = 0 xFFFF,
},
.dspp = {
.count = 2 ,
.base = { 0 x54000, 0 x56000 },
},
.ad = {
.count = 3 ,
.base = { 0 x78000, 0 x78800, 0 x79000 },
},
.pp = {
.count = 4 ,
.base = { 0 x70000, 0 x70800, 0 x71000, 0 x71800 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.dsc = {
.count = 2 ,
.base = { 0 x80000, 0 x80400 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000, 0 x6b800, 0 x6c000 },
.connect = {
[0 ] = INTF_eDP,
[1 ] = INTF_DSI,
[2 ] = INTF_DSI,
[3 ] = INTF_HDMI,
},
},
.max_clk = 412500000 ,
};
static const struct mdp5_cfg_hw sdm630_config = {
.name = "sdm630" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_CDM |
MDP_CAP_SRC_SPLIT |
0 ,
},
.ctl = {
.count = 5 ,
.base = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 xf4ffffff,
},
.pipe_vig = {
.count = 1 ,
.base = { 0 x04000 },
.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 = { 0 x14000, 0 x16000, 0 x18000, 0 x1a000 },
.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 = { 0 x24000, 0 x26000, 0 x28000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x34000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 2 ,
.base = { 0 x44000, 0 x46000 },
.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_WB, },
},
.nb_stages = 8 ,
.max_width = 2048 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 1 ,
.base = { 0 x54000 },
},
.ad = {
.count = 2 ,
.base = { 0 x78000, 0 x78800 },
},
.pp = {
.count = 3 ,
.base = { 0 x70000, 0 x71000, 0 x72000 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800 },
.connect = {
[0 ] = INTF_DISABLED,
[1 ] = INTF_DSI,
},
},
.max_clk = 412500000 ,
};
static const struct mdp5_cfg_hw sdm660_config = {
.name = "sdm660" ,
.mdp = {
.count = 1 ,
.caps = MDP_CAP_DSC |
MDP_CAP_CDM |
MDP_CAP_SRC_SPLIT |
0 ,
},
.ctl = {
.count = 5 ,
.base = { 0 x01000, 0 x01200, 0 x01400, 0 x01600, 0 x01800 },
.flush_hw_mask = 0 xf4ffffff,
},
.pipe_vig = {
.count = 2 ,
.base = { 0 x04000, 0 x6000 },
.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 = { 0 x14000, 0 x16000, 0 x18000, 0 x1a000 },
.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 = { 0 x24000, 0 x26000, 0 x28000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
0 ,
},
.pipe_cursor = {
.count = 1 ,
.base = { 0 x34000 },
.caps = MDP_PIPE_CAP_HFLIP |
MDP_PIPE_CAP_VFLIP |
MDP_PIPE_CAP_SW_PIX_EXT |
MDP_PIPE_CAP_CURSOR |
0 ,
},
.lm = {
.count = 4 ,
.base = { 0 x44000, 0 x45000, 0 x46000, 0 x49000 },
.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 = 3 , .dspp = -1 ,
.caps = MDP_LM_CAP_WB, },
},
.nb_stages = 8 ,
.max_width = 2560 ,
.max_height = 0 xFFFF,
},
.dspp = {
.count = 2 ,
.base = { 0 x54000, 0 x56000 },
},
.ad = {
.count = 2 ,
.base = { 0 x78000, 0 x78800 },
},
.pp = {
.count = 5 ,
.base = { 0 x70000, 0 x70800, 0 x71000, 0 x71800, 0 x72000 },
},
.cdm = {
.count = 1 ,
.base = { 0 x79200 },
},
.dsc = {
.count = 2 ,
.base = { 0 x80000, 0 x80400 },
},
.intf = {
.base = { 0 x6a000, 0 x6a800, 0 x6b000, 0 x6b800 },
.connect = {
[0 ] = INTF_DISABLED,
[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 = 1 , .config = { .hw = &msm8x26_config } },
{ .revision = 2 , .config = { .hw = &msm8x74v2_config } },
{ .revision = 3 , .config = { .hw = &apq8084_config } },
{ .revision = 6 , .config = { .hw = &msm8x16_config } },
{ .revision = 8 , .config = { .hw = &msm8x36_config } },
{ .revision = 9 , .config = { .hw = &msm8x94_config } },
{ .revision = 7 , .config = { .hw = &msm8x96_config } },
{ .revision = 11 , .config = { .hw = &msm8x76_config } },
{ .revision = 14 , .config = { .hw = &msm8937_config } },
{ .revision = 15 , .config = { .hw = &msm8917_config } },
{ .revision = 16 , .config = { .hw = &msm8x53_config } },
};
static const struct mdp5_cfg_handler cfg_handlers_v3[] = {
{ .revision = 0 , .config = { .hw = &msm8998_config } },
{ .revision = 2 , .config = { .hw = &sdm660_config } },
{ .revision = 3 , .config = { .hw = &sdm630_config } },
};
const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
{
return cfg_handler->config.hw;
}
struct mdp5_cfg *mdp5_cfg_get_config(struct mdp5_cfg_handler *cfg_handler)
{
return &cfg_handler->config;
}
int mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler *cfg_handler)
{
return cfg_handler->revision;
}
struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
uint32_t major, uint32_t minor)
{
struct drm_device *dev = mdp5_kms->dev;
struct mdp5_cfg_handler *cfg_handler;
const struct mdp5_cfg_handler *cfg_handlers;
int i, num_handlers;
cfg_handler = devm_kzalloc(dev->dev, sizeof (*cfg_handler), GFP_KERNEL);
if (unlikely(!cfg_handler)) {
return ERR_PTR(-ENOMEM);
}
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);
return ERR_PTR(-ENXIO);
}
/* only after mdp5_cfg global pointer's init can we access the hw */
for (i = 0 ; i < num_handlers; i++) {
if (cfg_handlers[i].revision != minor)
continue ;
mdp5_cfg = cfg_handlers[i].config.hw;
break ;
}
if (unlikely(!mdp5_cfg)) {
DRM_DEV_ERROR(dev->dev, "unexpected MDP minor revision: v%d.%d\n" ,
major, minor);
return ERR_PTR(-ENXIO);
}
cfg_handler->revision = minor;
cfg_handler->config.hw = mdp5_cfg;
DBG("MDP5: %s hw config selected" , mdp5_cfg->name);
return cfg_handler;
}
Messung V0.5 in Prozent C=95 H=71 G=83
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland