drivers/gpu/drm/ast: Fix infinite loop if read fails
Joel Stanley
joel at jms.id.au
Fri Dec 16 01:08:57 UTC 2016
On Thu, Dec 15, 2016 at 3:42 PM, Russell Currey <ruscur at russell.cc> wrote:
> ast_get_dram_info() configures a window in order to access BMC memory.
> A BMC register can be configured to disallow this, and if so, causes
> an infinite loop in the ast driver which renders the system unusable.
>
> Fix this by erroring out if an error is detected. On powerpc systems with
> EEH, this leads to the device being fenced and the system continuing to
> operate.
>
> Cc: <stable at vger.kernel.org> # 3.10+
> Signed-off-by: Russell Currey <ruscur at russell.cc>
Reviewed-by: Joel Stanley <joel at jms.id.au>
Thanks Russel.
Cheers,
Joel
> ---
> drivers/gpu/drm/ast/ast_main.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
> index 904beaa..f75c642 100644
> --- a/drivers/gpu/drm/ast/ast_main.c
> +++ b/drivers/gpu/drm/ast/ast_main.c
> @@ -223,7 +223,8 @@ static int ast_get_dram_info(struct drm_device *dev)
> ast_write32(ast, 0x10000, 0xfc600309);
>
> do {
> - ;
> + if (pci_channel_offline(dev->pdev))
> + return -EIO;
> } while (ast_read32(ast, 0x10000) != 0x01);
> data = ast_read32(ast, 0x10004);
>
> @@ -428,7 +429,9 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
> ast_detect_chip(dev, &need_post);
>
> if (ast->chip != AST1180) {
> - ast_get_dram_info(dev);
> + ret = ast_get_dram_info(dev);
> + if (ret)
> + goto out_free;
> ast->vram_size = ast_get_vram_info(dev);
> DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size);
> }
More information about the dri-devel
mailing list