Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6c7b228 authored by Jeffrey Hugo's avatar Jeffrey Hugo Committed by Rob Clark
Browse files

drm/msm/mdp5: Add msm8998 support



Add support for MDP5 version v3.0 found on msm8998.

Signed-off-by: default avatarJeffrey Hugo <jeffrey.l.hugo@gmail.com>
Reviewed-by: default avatarRob Clark <robdclark@gmail.com>
[silence unitialized variable warnings]
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 1569fcd7
Loading
Loading
Loading
Loading
+127 −5
Original line number Diff line number Diff line
@@ -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;