disp: msm: sde: add support for LUTDMA VBIF clock split

Add support for localized CLK_CTRL access through LUTDMA
hardware block.

This change aggregates RD/WR LUTDMA CLK_CTRL in a single
ops.

Change-Id: Id5c24bebf7dfcd9f768b2a6f6fa03f8b01747354
Signed-off-by: Amine Najahi <anajahi@codeaurora.org>
This commit is contained in:
Amine Najahi
2021-08-12 13:22:39 -04:00
committed by Amine Najahi
父節點 0c0cf5f2ca
當前提交 f2ebcab793
共有 3 個文件被更改,包括 80 次插入9 次删除

查看文件

@@ -11,6 +11,7 @@
#include "msm_drv.h"
#include "msm_mmu.h"
#include "sde_dbg.h"
#include "sde_vbif.h"
#define GUARD_BYTES (BIT(8) - 1)
#define ALIGNED_OFFSET (U32_MAX & ~(GUARD_BYTES))
@@ -67,6 +68,8 @@
#define LUTBUS_TRANS_SZ_MASK 0xff0000
#define LUTBUS_LUT_SIZE_MASK 0x3fff
#define PMU_CLK_CTRL 0x1F0
static uint32_t reg_dma_register_count;
static uint32_t reg_dma_decode_sel;
static uint32_t reg_dma_opmode_offset;
@@ -741,6 +744,30 @@ static int write_kick_off_v1(struct sde_reg_dma_kickoff_cfg *cfg)
return 0;
}
static bool setup_clk_force_ctrl(struct sde_hw_blk_reg_map *hw,
enum sde_clk_ctrl_type clk_ctrl, bool enable)
{
u32 reg_val, new_val;
if (!hw)
return false;
if (!SDE_CLK_CTRL_LUTDMA_VALID(clk_ctrl))
return false;
reg_val = SDE_REG_READ(hw, PMU_CLK_CTRL);
if (enable)
new_val = reg_val | (BIT(0) | BIT(16));
else
new_val = reg_val & ~(BIT(0) | BIT(16));
SDE_REG_WRITE(hw, PMU_CLK_CTRL, new_val);
wmb(); /* ensure write finished before progressing */
return !(reg_val & (BIT(0) | BIT(16)));
}
int init_v1(struct sde_hw_reg_dma *cfg)
{
int i = 0, rc = 0;
@@ -888,6 +915,42 @@ int init_v12(struct sde_hw_reg_dma *cfg)
return 0;
}
static int init_reg_dma_vbif(struct sde_hw_reg_dma *cfg)
{
int ret = 0;
struct sde_hw_blk_reg_map *hw;
struct sde_vbif_clk_client clk_client;
struct msm_drm_private *priv = cfg->drm_dev->dev_private;
struct msm_kms *kms = priv->kms;
struct sde_kms *sde_kms = to_sde_kms(kms);
if (cfg->caps->clk_ctrl != SDE_CLK_CTRL_LUTDMA) {
SDE_ERROR("invalid lutdma clk ctrl type %d\n", cfg->caps->clk_ctrl);
return -EINVAL;
}
hw = kzalloc(sizeof(*hw), GFP_KERNEL);
if (!hw) {
SDE_ERROR("failed to create hw block\n");
return -ENOMEM;
}
hw->base_off = cfg->addr;
hw->blk_off = cfg->caps->reg_dma_blks[REG_DMA_TYPE_DB].base;
clk_client.hw = hw;
clk_client.clk_ctrl = cfg->caps->clk_ctrl;
clk_client.ops.setup_clk_force_ctrl = setup_clk_force_ctrl;
ret = sde_vbif_clk_register(sde_kms, &clk_client);
if (ret) {
SDE_ERROR("failed to register vbif client %d\n", cfg->caps->clk_ctrl);
kfree(hw);
}
return ret;
}
int init_v2(struct sde_hw_reg_dma *cfg)
{
int ret = 0, i = 0;
@@ -913,7 +976,10 @@ int init_v2(struct sde_hw_reg_dma *cfg)
if (cfg->caps->reg_dma_blks[REG_DMA_TYPE_SB].valid == true)
reg_dma->ops.last_command_sb = last_cmd_sb_v2;
return 0;
if (cfg->caps->split_vbif_supported)
ret = init_reg_dma_vbif(cfg);
return ret;
}
static int check_support_v1(enum sde_reg_dma_features feature,