disp: msm: sde: Add support for SB LUTDMA

A new LUTDMA HW instance has been added to support programming of
SB features via LUTDMA. This change adds corresponding support for
the new SB LUTDMA, including catalog parsing, reg_dma init/deinit/ops
updates and new opcode support.

Change-Id: I0fed7a6e93cd96fe9fe562d2470a8789b161d1bc
Signed-off-by: Ping Li <pingli@codeaurora.org>
Signed-off-by: Christopher Braga <cbraga@codeaurora.org>
This commit is contained in:
Christopher Braga
2020-01-14 13:53:14 -05:00
szülő aa818a2f5b
commit 5e28b86e3c
7 fájl változott, egészen pontosan 381 új sor hozzáadva és 86 régi sor törölve

Fájl megtekintése

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*/
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
@@ -11,6 +11,7 @@
#define REG_DMA_VER_1_0 0x00010000
#define REG_DMA_VER_1_1 0x00010001
#define REG_DMA_VER_1_2 0x00010002
#define REG_DMA_VER_2_0 0x00020000
static int default_check_support(enum sde_reg_dma_features feature,
enum sde_reg_dma_blk blk,
@@ -67,21 +68,34 @@ static int default_last_command(struct sde_hw_ctl *ctl,
return 0;
}
static int default_last_command_sb(struct sde_hw_ctl *ctl,
enum sde_reg_dma_queue q, enum sde_reg_dma_last_cmd_mode mode)
{
return 0;
}
static void default_dump_reg(void)
{
}
static struct sde_hw_reg_dma reg_dma = {
.ops = {default_check_support, default_setup_payload,
static void set_default_dma_ops(struct sde_hw_reg_dma *reg_dma)
{
const static struct sde_hw_reg_dma_ops ops = {
default_check_support, default_setup_payload,
default_kick_off, default_reset, default_alloc_reg_dma_buf,
default_dealloc_reg_dma, default_buf_reset_reg_dma,
default_last_command, default_dump_reg},
};
default_last_command, default_last_command_sb,
default_dump_reg};
memcpy(&reg_dma->ops, &ops, sizeof(ops));
}
static struct sde_hw_reg_dma reg_dma;
int sde_reg_dma_init(void __iomem *addr, struct sde_mdss_cfg *m,
struct drm_device *dev)
{
int rc = 0;
set_default_dma_ops(&reg_dma);
if (!addr || !m || !dev) {
DRM_DEBUG("invalid addr %pK catalog %pK dev %pK\n", addr, m,
@@ -89,13 +103,14 @@ int sde_reg_dma_init(void __iomem *addr, struct sde_mdss_cfg *m,
return 0;
}
reg_dma.drm_dev = dev;
reg_dma.caps = &m->dma_cfg;
reg_dma.addr = addr;
if (!m->reg_dma_count)
return 0;
reg_dma.reg_dma_count = m->reg_dma_count;
reg_dma.drm_dev = dev;
reg_dma.addr = addr;
reg_dma.caps = &m->dma_cfg;
switch (reg_dma.caps->version) {
case REG_DMA_VER_1_0:
rc = init_v1(&reg_dma);
@@ -110,13 +125,18 @@ int sde_reg_dma_init(void __iomem *addr, struct sde_mdss_cfg *m,
case REG_DMA_VER_1_2:
rc = init_v12(&reg_dma);
if (rc)
DRM_DEBUG("init v11 dma ops failed\n");
DRM_DEBUG("init v12 dma ops failed\n");
break;
case REG_DMA_VER_2_0:
rc = init_v2(&reg_dma);
if (rc)
DRM_DEBUG("init v2 dma ops failed\n");
break;
default:
break;
}
return 0;
return rc;
}
struct sde_hw_reg_dma_ops *sde_reg_dma_get_ops(void)
@@ -126,27 +146,19 @@ struct sde_hw_reg_dma_ops *sde_reg_dma_get_ops(void)
void sde_reg_dma_deinit(void)
{
struct sde_hw_reg_dma op = {
.ops = {default_check_support, default_setup_payload,
default_kick_off, default_reset, default_alloc_reg_dma_buf,
default_dealloc_reg_dma, default_buf_reset_reg_dma,
default_last_command, default_dump_reg},
};
if (!reg_dma.drm_dev || !reg_dma.caps)
return;
switch (reg_dma.caps->version) {
case REG_DMA_VER_1_0:
deinit_v1();
break;
case REG_DMA_VER_1_1:
case REG_DMA_VER_1_2:
case REG_DMA_VER_2_0:
deinit_v1();
break;
default:
break;
}
memset(&reg_dma, 0, sizeof(reg_dma));
memcpy(&reg_dma.ops, &op.ops, sizeof(op.ops));
set_default_dma_ops(&reg_dma);
}