| From 298360af3dab45659810fdc51aba0c9f4097e4f6 Mon Sep 17 00:00:00 2001 |
| From: Russell Currey <ruscur@russell.cc> |
| Date: Thu, 15 Dec 2016 16:12:41 +1100 |
| Subject: drivers/gpu/drm/ast: Fix infinite loop if read fails |
| |
| From: Russell Currey <ruscur@russell.cc> |
| |
| commit 298360af3dab45659810fdc51aba0c9f4097e4f6 upstream. |
| |
| 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. |
| |
| Signed-off-by: Russell Currey <ruscur@russell.cc> |
| Reviewed-by: Joel Stanley <joel@jms.id.au> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Link: http://patchwork.freedesktop.org/patch/msgid/20161215051241.20815-1-ruscur@russell.cc |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/ast/ast_main.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- 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_ |
| 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 *d |
| 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); |
| } |