[v2] drm: mediatek: change the variable type of rdma threshold
From: linux@roeck-us.net (Guenter Roeck)
Date: 2017-06-21 21:15:09
Also in:
dri-devel, linux-mediatek, lkml
On Fri, May 19, 2017 at 05:57:23PM +0800, Bibby Hsieh wrote:
quoted hunk ↗ jump to hunk
For some greater resolution, the rdma threshold variable will overflow. Signed-off-by: Bibby Hsieh <redacted> --- drivers/gpu/drm/mediatek/mtk_disp_rdma.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c index 0df05f9..9afdcd7 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c@@ -37,7 +37,7 @@ #define DISP_REG_RDMA_FIFO_CON 0x0040 #define RDMA_FIFO_UNDERFLOW_EN BIT(31) #define RDMA_FIFO_PSEUDO_SIZE(bytes) (((bytes) / 16) << 16) -#define RDMA_OUTPUT_VALID_FIFO_THRESHOLD(bytes) ((bytes) / 16) +#define RDMA_OUTPUT_VALID_FIFO_THRESHOLD(bytes) (((bytes) / 16) & 0x3ff)
I agree with the earlier comment; clamp_val() might be more appropriate here and would avoid unexpected results.
quoted hunk ↗ jump to hunk
/** * struct mtk_disp_rdma - DISP_RDMA driver structure@@ -109,7 +109,7 @@ static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width, unsigned int height, unsigned int vrefresh, unsigned int bpc) { - unsigned int threshold; + unsigned long long threshold; unsigned int reg; rdma_update_bits(comp, DISP_REG_RDMA_SIZE_CON_0, 0xfff, width);@@ -121,7 +121,8 @@ static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width, * output threshold to 6 microseconds with 7/6 overhead to * account for blanking, and with a pixel depth of 4 bytes: */ - threshold = width * height * vrefresh * 4 * 7 / 1000000; + threshold = (unsigned long long)width * height * vrefresh * + 4 * 7 / 1000000;
This is a 64 bit divide operation. It will result in a build failure if compiled for a 32 bit kernel (eg arm:allmodconfig). ERROR: "__aeabi_uldivmod" [drivers/gpu/drm/mediatek/mediatek-drm.ko] undefined! Guenter