disp: msm: sde: add cache hints support in fb

Add a cache_flag in msm_fb object to store the system cache state hints.
Writeback connector will store cache write hints if system cache write
is enabled while HW is writing into this buffer. Plane in the primary
display path, in a 2-pass composition strategy will use this cache hints
to enable the display HW to use system cache for reading the pixel data
from this buffer.

Change-Id: Iff92a453a36d4a60b5a0162832eebd5e8739b5c3
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran
2021-07-22 10:53:48 -07:00
parent 993f61c91d
commit 7cb040c3a6
4 changed files with 57 additions and 8 deletions

View File

@@ -1186,6 +1186,10 @@ void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...);
int msm_gem_delayed_import(struct drm_gem_object *obj);
#define MSM_FB_CACHE_NONE 0x0
#define MSM_FB_CACHE_WRITE_EN 0x1
#define MSM_FB_CACHE_READ_EN 0x2
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
struct msm_gem_address_space *aspace);
void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
@@ -1200,6 +1204,8 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
struct drm_gem_object **bos);
struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
void msm_framebuffer_set_cache_hint(struct drm_framebuffer *fb, u32 flags, u32 type);
void msm_framebuffer_get_cache_hint(struct drm_framebuffer *fb, u32 *flags, u32 *type);
struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
void msm_fbdev_free(struct drm_device *dev);

View File

@@ -29,6 +29,8 @@
struct msm_framebuffer {
struct drm_framebuffer base;
const struct msm_format *format;
u32 cache_flags;
u32 cache_type;
};
#define to_msm_framebuffer(x) container_of(x, struct msm_framebuffer, base)
@@ -281,3 +283,29 @@ fail:
return ERR_PTR(ret);
}
void msm_framebuffer_set_cache_hint(struct drm_framebuffer *fb, u32 flags, u32 type)
{
struct msm_framebuffer *msm_fb;
if (!fb)
return;
msm_fb = to_msm_framebuffer(fb);
msm_fb->cache_flags = flags;
msm_fb->cache_type = type;
}
void msm_framebuffer_get_cache_hint(struct drm_framebuffer *fb, u32 *flags, u32 *type)
{
struct msm_framebuffer *msm_fb;
if (!fb) {
*flags = 0;
*type = 0;
return;
}
msm_fb = to_msm_framebuffer(fb);
*flags = msm_fb->cache_flags;
*type = msm_fb->cache_type;
}

View File

@@ -961,7 +961,8 @@ static int sde_encoder_phys_wb_atomic_check(
return rc;
}
static void _sde_encoder_phys_wb_setup_cache(struct sde_encoder_phys_wb *wb_enc)
static void _sde_encoder_phys_wb_setup_cache(struct sde_encoder_phys_wb *wb_enc,
struct drm_framebuffer *fb)
{
struct sde_wb_device *wb_dev = wb_enc->wb_dev;
struct drm_connector_state *state = wb_dev->connector->state;
@@ -992,9 +993,11 @@ static void _sde_encoder_phys_wb_setup_cache(struct sde_encoder_phys_wb *wb_enc)
if (cache_enable) {
cfg->wr_scid = sc_cfg->llcc_scid;
cfg->type = SDE_SYS_CACHE_DISP_WB;
msm_framebuffer_set_cache_hint(fb, MSM_FB_CACHE_WRITE_EN, SDE_SYS_CACHE_DISP_WB);
} else {
cfg->wr_scid = 0x0;
cfg->type = SDE_SYS_CACHE_NONE;
msm_framebuffer_set_cache_hint(fb, MSM_FB_CACHE_NONE, SDE_SYS_CACHE_NONE);
}
sde_crtc->new_perf.llcc_active[SDE_SYS_CACHE_DISP_WB] = cache_enable;
@@ -1279,7 +1282,7 @@ static void sde_encoder_phys_wb_setup(
sde_encoder_phys_wb_setup_cdp(phys_enc, wb_enc->wb_fmt);
_sde_encoder_phys_wb_setup_cache(wb_enc);
_sde_encoder_phys_wb_setup_cache(wb_enc, fb);
_sde_encoder_phys_wb_setup_cwb(phys_enc, true);

View File

@@ -2782,32 +2782,44 @@ void sde_plane_set_error(struct drm_plane *plane, bool error)
static void _sde_plane_sspp_setup_sys_cache(struct sde_plane *psde,
struct sde_plane_state *pstate)
{
struct drm_plane_state *state = psde->base.state;
struct sde_sc_cfg *sc_cfg = psde->catalog->sc_cfg;
struct sde_hw_pipe_sc_cfg *cfg = &pstate->sc_cfg;
bool prev_rd_en = cfg->rd_en;
u32 fb_cache_flag, fb_cache_type;
if (!sc_cfg[SDE_SYS_CACHE_DISP].has_sys_cache)
return;
msm_framebuffer_get_cache_hint(state->fb, &fb_cache_flag, &fb_cache_type);
cfg->rd_en = false;
cfg->rd_scid = 0x0;
cfg->flags = SYS_CACHE_EN_FLAG | SYS_CACHE_SCID;
cfg->type = SDE_SYS_CACHE_NONE;
if ((pstate->static_cache_state == CACHE_STATE_FRAME_WRITE)
|| (pstate->static_cache_state == CACHE_STATE_FRAME_READ)) {
if ((sc_cfg[SDE_SYS_CACHE_DISP].has_sys_cache)
&& ((pstate->static_cache_state == CACHE_STATE_FRAME_WRITE)
|| (pstate->static_cache_state == CACHE_STATE_FRAME_READ))) {
cfg->rd_en = true;
cfg->rd_scid = sc_cfg[SDE_SYS_CACHE_DISP].llcc_scid;
cfg->rd_noallocate = (pstate->static_cache_state == CACHE_STATE_FRAME_READ);
cfg->flags |= SYS_CACHE_NO_ALLOC;
cfg->type = SDE_SYS_CACHE_DISP;
} else if ((sc_cfg[fb_cache_type].has_sys_cache)
&& (fb_cache_flag & MSM_FB_CACHE_WRITE_EN)) {
cfg->rd_en = true;
cfg->rd_scid = sc_cfg[fb_cache_type].llcc_scid;
cfg->rd_noallocate = true;
cfg->flags |= SYS_CACHE_NO_ALLOC;
cfg->type = fb_cache_type;
msm_framebuffer_set_cache_hint(state->fb, MSM_FB_CACHE_READ_EN, fb_cache_type);
}
if (!cfg->rd_en && !prev_rd_en)
return;
SDE_EVT32(DRMID(&psde->base), cfg->rd_scid, cfg->rd_en, cfg->rd_noallocate, cfg->flags);
SDE_EVT32(DRMID(&psde->base), cfg->rd_scid, cfg->rd_en, cfg->rd_noallocate, cfg->flags,
fb_cache_flag, fb_cache_type);
psde->pipe_hw->ops.setup_sys_cache(psde->pipe_hw, cfg);
}