drm/malidp: Enable MMU prefetch on Mali-DP650
Mali-DP650 supports warming up the SMMU translations, by sending requsts to the SMMU before a buffer is read. There are two modes supported: - PARTIAL: could be enabled when the buffer is composed of 4K or 64K pages, the display hardware will send a configurable number of requests before the actual reading. - FULL: could be enabled when the buffer is composed of 1M or 2M pages, the display hardware will send requests before reading for all pages composing the buffer. This patch adds a mechanism for detecting the page size and set the MMU prefetch mode if possible. Changes since v1: - For imported buffers use the already populated drm_gem_cma_object.sgt instead of calling driver.gem_prime_get_sg_table, which works just for buffers allocated through the gem_cma API. Signed-off-by: Jamie Fox <jamie.fox@arm.com> Signed-off-by: Alexandru Gheorghe <alexandru-cosmin.gheorghe@arm.com> Acked-by: Liviu Dudau <liviu.dudau@arm.com> [rebased and re-ordered functions] Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
This commit is contained in:
@@ -84,16 +84,45 @@ static const struct malidp_format_id malidp550_de_formats[] = {
|
||||
};
|
||||
|
||||
static const struct malidp_layer malidp500_layers[] = {
|
||||
{ DE_VIDEO1, MALIDP500_DE_LV_BASE, MALIDP500_DE_LV_PTR_BASE, MALIDP_DE_LV_STRIDE0, MALIDP500_LV_YUV2RGB },
|
||||
{ DE_GRAPHICS1, MALIDP500_DE_LG1_BASE, MALIDP500_DE_LG1_PTR_BASE, MALIDP_DE_LG_STRIDE, 0 },
|
||||
{ DE_GRAPHICS2, MALIDP500_DE_LG2_BASE, MALIDP500_DE_LG2_PTR_BASE, MALIDP_DE_LG_STRIDE, 0 },
|
||||
/* id, base address, fb pointer address base, stride offset,
|
||||
* yuv2rgb matrix offset, mmu control register offset
|
||||
*/
|
||||
{ DE_VIDEO1, MALIDP500_DE_LV_BASE, MALIDP500_DE_LV_PTR_BASE,
|
||||
MALIDP_DE_LV_STRIDE0, MALIDP500_LV_YUV2RGB, 0 },
|
||||
{ DE_GRAPHICS1, MALIDP500_DE_LG1_BASE, MALIDP500_DE_LG1_PTR_BASE,
|
||||
MALIDP_DE_LG_STRIDE, 0, 0 },
|
||||
{ DE_GRAPHICS2, MALIDP500_DE_LG2_BASE, MALIDP500_DE_LG2_PTR_BASE,
|
||||
MALIDP_DE_LG_STRIDE, 0, 0 },
|
||||
};
|
||||
|
||||
static const struct malidp_layer malidp550_layers[] = {
|
||||
{ DE_VIDEO1, MALIDP550_DE_LV1_BASE, MALIDP550_DE_LV1_PTR_BASE, MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB },
|
||||
{ DE_GRAPHICS1, MALIDP550_DE_LG_BASE, MALIDP550_DE_LG_PTR_BASE, MALIDP_DE_LG_STRIDE, 0 },
|
||||
{ DE_VIDEO2, MALIDP550_DE_LV2_BASE, MALIDP550_DE_LV2_PTR_BASE, MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB },
|
||||
{ DE_SMART, MALIDP550_DE_LS_BASE, MALIDP550_DE_LS_PTR_BASE, MALIDP550_DE_LS_R1_STRIDE, 0 },
|
||||
/* id, base address, fb pointer address base, stride offset,
|
||||
* yuv2rgb matrix offset, mmu control register offset
|
||||
*/
|
||||
{ DE_VIDEO1, MALIDP550_DE_LV1_BASE, MALIDP550_DE_LV1_PTR_BASE,
|
||||
MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0 },
|
||||
{ DE_GRAPHICS1, MALIDP550_DE_LG_BASE, MALIDP550_DE_LG_PTR_BASE,
|
||||
MALIDP_DE_LG_STRIDE, 0, 0 },
|
||||
{ DE_VIDEO2, MALIDP550_DE_LV2_BASE, MALIDP550_DE_LV2_PTR_BASE,
|
||||
MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0 },
|
||||
{ DE_SMART, MALIDP550_DE_LS_BASE, MALIDP550_DE_LS_PTR_BASE,
|
||||
MALIDP550_DE_LS_R1_STRIDE, 0, 0 },
|
||||
};
|
||||
|
||||
static const struct malidp_layer malidp650_layers[] = {
|
||||
/* id, base address, fb pointer address base, stride offset,
|
||||
* yuv2rgb matrix offset, mmu control register offset
|
||||
*/
|
||||
{ DE_VIDEO1, MALIDP550_DE_LV1_BASE, MALIDP550_DE_LV1_PTR_BASE,
|
||||
MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB,
|
||||
MALIDP650_DE_LV_MMU_CTRL },
|
||||
{ DE_GRAPHICS1, MALIDP550_DE_LG_BASE, MALIDP550_DE_LG_PTR_BASE,
|
||||
MALIDP_DE_LG_STRIDE, 0, MALIDP650_DE_LG_MMU_CTRL },
|
||||
{ DE_VIDEO2, MALIDP550_DE_LV2_BASE, MALIDP550_DE_LV2_PTR_BASE,
|
||||
MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB,
|
||||
MALIDP650_DE_LV_MMU_CTRL },
|
||||
{ DE_SMART, MALIDP550_DE_LS_BASE, MALIDP550_DE_LS_PTR_BASE,
|
||||
MALIDP550_DE_LS_R1_STRIDE, 0, MALIDP650_DE_LS_MMU_CTRL },
|
||||
};
|
||||
|
||||
#define SE_N_SCALING_COEFFS 96
|
||||
@@ -853,8 +882,8 @@ const struct malidp_hw malidp_device[MALIDP_MAX_DEVICES] = {
|
||||
.dc_base = MALIDP550_DC_BASE,
|
||||
.out_depth_base = MALIDP550_DE_OUTPUT_DEPTH,
|
||||
.features = MALIDP_REGMAP_HAS_CLEARIRQ,
|
||||
.n_layers = ARRAY_SIZE(malidp550_layers),
|
||||
.layers = malidp550_layers,
|
||||
.n_layers = ARRAY_SIZE(malidp650_layers),
|
||||
.layers = malidp650_layers,
|
||||
.de_irq_map = {
|
||||
.irq_mask = MALIDP_DE_IRQ_UNDERRUN |
|
||||
MALIDP650_DE_IRQ_DRIFT |
|
||||
|
Reference in New Issue
Block a user