[PATCH] drm: lcdif: Set and enable FIFO Panic threshold
Marek Vasut
marex at denx.de
Thu Oct 27 10:03:42 UTC 2022
On 10/27/22 07:45, Liu Ying wrote:
Hi,
[...]
>> diff --git a/drivers/gpu/drm/mxsfb/lcdif_kms.c b/drivers/gpu/drm/mxsfb/lcdif_kms.c
>> index a5302006c02cd..aee7babb5fa5c 100644
>> --- a/drivers/gpu/drm/mxsfb/lcdif_kms.c
>> +++ b/drivers/gpu/drm/mxsfb/lcdif_kms.c
>> @@ -341,6 +341,18 @@ static void lcdif_enable_controller(struct lcdif_drm_private *lcdif)
>> reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
>> reg |= CTRLDESCL0_5_EN;
>> writel(reg, lcdif->base + LCDC_V8_CTRLDESCL0_5);
>> +
>> + /* Set FIFO Panic watermarks, low 1/3, high 2/3 . */
>> + writel(FIELD_PREP(PANIC0_THRES_LOW_MASK, 1 * PANIC0_THRES_RANGE / 3) |
>> + FIELD_PREP(PANIC0_THRES_HIGH_MASK, 2 * PANIC0_THRES_RANGE / 3),
>
> Better to define PANIC0_THRES_{LOW,HIGH}(n) macros in lcdif_regs.h?
>
> Downstream kernel uses the below threshold values:
> a) i.MX8mp EVK board with LPDDR4
> 1/3 and 2/3 for LCDIF{1,2} + DSI/LVDS - default values in driver
> 1/2 and 3/4 for LCDIF3 + HDMI - set in device tree
>
> b) i.MX8mp EVK board with DDR4
> 1/3 and 2/3 for LCDIF{1,2} + DSI/LVDS - default values in driver
> 2/3 and 3/3 for LCDIF3 + HDMI - set in devic tree
>
> Jian told me that LCDIF3 needs different sets of threshold values for
> different types of DDR to avoid 4k HDMI display issues and the
> threshold values impact overall DDR/bus utilization(?), so downstream
> kernel chooses to get optional threshold value properties from LCDIF DT
> node.
>
> Instead of always using 1/3 and 2/3, maybe there are three options:
> 1) Same to downstream kernel, take 1/3 and 2/3 as default values and
> get optional threshold values from DT properties - no additional
> properties are acceptable in the existing DT binding doc?
> 2) Check pixel clock rate, and if it is greater than a certain value,
> use 2/3 and 3/3. Otherwise, use 1/3 and 2/3.
> 3) Always use 2/3 and 3/3.
Why 2/3 and 3/3 instead of 1/3 and 2/3 ?
Seems like 1/3 and 2/3 provides enough FIFO margin for every scenario.
>> + lcdif->base + LCDC_V8_PANIC0_THRES);
>> +
>> + /*
>> + * Enable FIFO Panic, this does not generate interrupt, but
>> + * boosts NoC priority based on FIFO Panic watermarks.
>> + */
>> + writel(INT_ENABLE_D1_PLANE_PANIC_EN,
>> + lcdif->base + LCDC_V8_INT_ENABLE_D1);
>
> This should be enabled _before_ LCDIF controller starts to fetch
> pixels, otherwise, there is chance that the FIFO still underflows.
That means _before_ DISP_PARA_DISP_ON or CTRLDESCL0_5_EN ?
>> }
>>
>> static void lcdif_disable_controller(struct lcdif_drm_private *lcdif)
>> @@ -348,6 +360,9 @@ static void lcdif_disable_controller(struct lcdif_drm_private *lcdif)
>> u32 reg;
>> int ret;
>>
>> + /* Disable FIFO Panic NoC priority booster. */
>> + writel(0, lcdif->base + LCDC_V8_INT_ENABLE_D1);
>
> Similar to enablement, this should be disabled _after_ LCDIF controller
> stops fetching pixels.
Same question as above applies, which bits controls that part, DISP_ON
or CTRLDESCL0_5_EN ? I suspect the later.
>> +
>> reg = readl(lcdif->base + LCDC_V8_CTRLDESCL0_5);
>> reg &= ~CTRLDESCL0_5_EN;
>> writel(reg, lcdif->base + LCDC_V8_CTRLDESCL0_5);
>> diff --git a/drivers/gpu/drm/mxsfb/lcdif_regs.h b/drivers/gpu/drm/mxsfb/lcdif_regs.h
>> index fb74eb5ccbf1d..3d2f81d6f995e 100644
>> --- a/drivers/gpu/drm/mxsfb/lcdif_regs.h
>> +++ b/drivers/gpu/drm/mxsfb/lcdif_regs.h
>> @@ -255,6 +255,7 @@
>>
>> #define PANIC0_THRES_LOW_MASK GENMASK(24, 16)
>> #define PANIC0_THRES_HIGH_MASK GENMASK(8, 0)
>> +#define PANIC0_THRES_RANGE 512
>
> Should be 511? If high threshold is 3/3 and PANIC0_THRES_RANGE = 512,
> PANIC0_THRES_HIGH will overflow and zero is set.
Let's rename this to PANIC0_THRES_MAX too.
More information about the dri-devel
mailing list