diff options
author | Jacob Garber <jgarber1@ualberta.ca> | 2019-07-22 18:31:30 -0600 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2019-08-02 10:00:09 +0000 |
commit | 9904905b488cdc1e14cdae34c6040f2e9496c06f (patch) | |
tree | da60a3eac4291f077a29a121c0b0a253dc6d9faf /src/soc/samsung/exynos5420/fimd.c | |
parent | b2e75d2d1d410dd432f74e4cd46c3ee7fb9d512a (diff) | |
download | coreboot-9904905b488cdc1e14cdae34c6040f2e9496c06f.tar.xz |
soc/samsung/exynos5420: Refactor fimd vidtcon access
Accessing the higher vidtcon variables using pointer arithmetic from the
lower address FIMD_CTRL struct is undefined behaviour, since pointers
manipulations are not allowed outside the objects they point to. The
standard-blessed way is to perform the arithmetic using integer
addresses first, and then convert that to a pointer. The end result is
the same, but avoids the risk of unsafe optimizations from an
over-zealous compiler.
Signed-off-by: Jacob Garber <jgarber1@ualberta.ca>
Found-by: Coverity CID 1402096, 1402124, 1402131, 1402169
Change-Id: I13ed23836e8e9076ae0bfd88c05c4f2badac9c49
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34633
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/soc/samsung/exynos5420/fimd.c')
-rw-r--r-- | src/soc/samsung/exynos5420/fimd.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/soc/samsung/exynos5420/fimd.c b/src/soc/samsung/exynos5420/fimd.c index 756d2fba54..2b3552abdd 100644 --- a/src/soc/samsung/exynos5420/fimd.c +++ b/src/soc/samsung/exynos5420/fimd.c @@ -317,9 +317,10 @@ static void exynos5_set_system_display(void) void exynos_fimd_lcd_init(vidinfo_t *vid) { unsigned int cfg = 0, rgb_mode; - unsigned int offset; + struct exynos_fb *fimd; + + fimd = (void *)(FIMD_CTRL_ADDR + EXYNOS5_LCD_IF_BASE_OFFSET); - offset = exynos_fimd_get_base_offset(); printk(BIOS_SPEW, "%s\n", __func__); exynos5_set_system_display(); @@ -349,19 +350,19 @@ void exynos_fimd_lcd_init(vidinfo_t *vid) if (!vid->vl_dp) cfg |= EXYNOS_VIDCON1_IVDEN_INVERT; - lwritel(cfg, &FIMD_CTRL->vidcon1 + offset); + lwritel(cfg, &fimd->vidcon1); /* set timing */ cfg = EXYNOS_VIDTCON0_VFPD(vid->vl_vfpd - 1); cfg |= EXYNOS_VIDTCON0_VBPD(vid->vl_vbpd - 1); cfg |= EXYNOS_VIDTCON0_VSPW(vid->vl_vspw - 1); - lwritel(cfg, &FIMD_CTRL->vidtcon0 + offset); + lwritel(cfg, &fimd->vidtcon0); cfg = EXYNOS_VIDTCON1_HFPD(vid->vl_hfpd - 1); cfg |= EXYNOS_VIDTCON1_HBPD(vid->vl_hbpd - 1); cfg |= EXYNOS_VIDTCON1_HSPW(vid->vl_hspw - 1); - lwritel(cfg, &FIMD_CTRL->vidtcon1 + offset); + lwritel(cfg, &fimd->vidtcon1); /* set lcd size */ cfg = EXYNOS_VIDTCON2_HOZVAL(vid->vl_col - 1) | @@ -369,7 +370,7 @@ void exynos_fimd_lcd_init(vidinfo_t *vid) EXYNOS_VIDTCON2_HOZVAL_E(vid->vl_col - 1) | EXYNOS_VIDTCON2_LINEVAL_E(vid->vl_row - 1); - lwritel(cfg, &FIMD_CTRL->vidtcon2 + offset); + lwritel(cfg, &fimd->vidtcon2); } /* set display mode */ |