Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1361155

[PATCH] drm/radeon: evergreen_hpd_init()/_fini(): fix HPD IRQ bitset

Path csiph.com!aioe.org!gothmog.csi.it!bofh.it!news.nic.it!robomod
From Nicolai Stange <nicstange@gmail.com>
Newsgroups linux.kernel
Subject [PATCH] drm/radeon: evergreen_hpd_init()/_fini(): fix HPD IRQ bitset
Date Sat, 19 Mar 2016 21:00:01 +0100
Message-ID <revct-4om-9@gated-at.bofh.it> (permalink)
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=WFYhevcvnSwGc9J9bYL+wKoV8h29syZZRTB0pzcmXyA=; b=NbQjX5cBPngBi7MSZQYQ2BqLhdOsI5noeLAHBo1BgRRV1/tM/+18T3lNmnnsn1bOvp Rrd+VLp+Hm09uQmqht2oUrskTZAPLBCXfdqoIwOsl2QupMI3FEIf6iovT+zhXLLOQJ/x Z6udCvNVSiiID2uLOMcdlVO4ttHXNX5JOqYFv36cVqQTrjcPjJWjI+XwV0d5v9/W95vZ hjujH6H/1pVkZE0UQd4eEwkxbrGVtvF1CRiA0eGOb9wEn2XrxW0wn7rrmuf8BPujMTA6 CXbUMlvyiHZ9C7ZnLLwtolVB0zYFjT+yr/dYKqi1NnYVpPorVz3luCZfAWqc33UFZD8F eQQA==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=WFYhevcvnSwGc9J9bYL+wKoV8h29syZZRTB0pzcmXyA=; b=mVmP4W5xfukohH7gAKzujXP4ghPtjbNpFsXukGwEvhnyk++bew6ldLEy8E0Kzau9d3 5nJZQEDRkA3HtK+RTFPcz6zS/rYVrWIgiqERi7hAZWs9+sL0WVA5obvTVMBOOA9ScaFP qa0ScXjp4UtPP23zlQOUCJC3tRz2xuKn9/UQaHCqDwZ6KqDKQuUVRX9LCztXF+/6CJCD K00qYhm+CzEMrPJssYT5w6OCtfKFujR1cPUnGVVb4+O6Gvr76Ny4ubCLspBVypua9CDN rirZ4hmK8sizFIzXjcVIQmCoe4t/byZCALWFmlAvJq/DaXtKZATN6wAaJEd5t38Qjqng gRDQ==
X-Gm-Message-State AD7BkJK1ndlS/5cE4kLQtpNIZHYRSuP9X67veb+5IUcBUIhN6K067WAbCxv0DKxCa4T4rg==
X-Received by 10.194.11.67 with SMTP id o3mr21936537wjb.74.1458417404823; Sat, 19 Mar 2016 12:56:44 -0700 (PDT)
X-Mailer git-send-email 2.7.3
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 77
Organization linux.* mail to news gateway
X-Original-Cc dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Nicolai Stange <nicstange@gmail.com>
X-Original-Date Sat, 19 Mar 2016 20:56:41 +0100
X-Original-Message-ID <1458417401-3756-1-git-send-email-nicstange@gmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1361155

Show key headers only | View raw


The values of all but the RADEON_HPD_NONE members of the radeon_hpd_id
enum transform 1:1 into bit positions within the 'enabled' bitset as
assembled by evergreen_hpd_init():

  enabled |= 1 << radeon_connector->hpd.hpd;

However, if ->hpd.hpd happens to equal RADEON_HPD_NONE == 0xff, UBSAN
reports

  UBSAN: Undefined behaviour in drivers/gpu/drm/radeon/evergreen.c:1867:16
  shift exponent 255 is too large for 32-bit type 'int'
  [...]
  Call Trace:
   [<ffffffff818c4d35>] dump_stack+0xbc/0x117
   [<ffffffff818c4c79>] ? _atomic_dec_and_lock+0x169/0x169
   [<ffffffff819411bb>] ubsan_epilogue+0xd/0x4e
   [<ffffffff81941cbc>] __ubsan_handle_shift_out_of_bounds+0x1fb/0x254
   [<ffffffffa0ba7f2e>] ? atom_execute_table+0x3e/0x50 [radeon]
   [<ffffffff81941ac1>] ? __ubsan_handle_load_invalid_value+0x158/0x158
   [<ffffffffa0b87700>] ? radeon_get_pll_use_mask+0x130/0x130 [radeon]
   [<ffffffff81219930>] ? wake_up_klogd_work_func+0x60/0x60
   [<ffffffff8121a35e>] ? vprintk_default+0x3e/0x60
   [<ffffffffa0c603c4>] evergreen_hpd_init+0x274/0x2d0 [radeon]
   [<ffffffffa0c603c4>] ? evergreen_hpd_init+0x274/0x2d0 [radeon]
   [<ffffffffa0bd196e>] radeon_modeset_init+0x8ce/0x18d0 [radeon]
   [<ffffffffa0b71d86>] radeon_driver_load_kms+0x186/0x350 [radeon]
   [<ffffffffa03b6b16>] drm_dev_register+0xc6/0x100 [drm]
   [<ffffffffa03bc8c4>] drm_get_pci_dev+0xe4/0x490 [drm]
   [<ffffffff814b83f0>] ? kfree+0x220/0x370
   [<ffffffffa0b687c2>] radeon_pci_probe+0x112/0x140 [radeon]
   [...]
  =====================================================================
  radeon 0000:01:00.0: No connectors reported connected with modes

The net effect is that radeon_irq_kms_enable_hpd() enables the HPD
interrupts for all HPD pins in the range from 0 to RADEON_MAX_HPD_PINS.
The system seems to work without any noticeable glitches though.

All of the above applies analogously to evergreen_hpd_fini().

Silence UBSAN by checking ->hpd.hpd for RADEON_HPD_NONE before oring it
into the 'enabled' bitset in evergreen_hpd_init() or the 'disabled' bitset
in evergreen_hpd_fini() respectively.

Signed-off-by: Nicolai Stange <nicstange@gmail.com>
---
 Applicable to linux-next-20160318.

 drivers/gpu/drm/radeon/evergreen.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 76c4bdf..6360717 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1864,7 +1864,8 @@ void evergreen_hpd_init(struct radeon_device *rdev)
 			break;
 		}
 		radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
-		enabled |= 1 << radeon_connector->hpd.hpd;
+		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+			enabled |= 1 << radeon_connector->hpd.hpd;
 	}
 	radeon_irq_kms_enable_hpd(rdev, enabled);
 }
@@ -1907,7 +1908,8 @@ void evergreen_hpd_fini(struct radeon_device *rdev)
 		default:
 			break;
 		}
-		disabled |= 1 << radeon_connector->hpd.hpd;
+		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+			disabled |= 1 << radeon_connector->hpd.hpd;
 	}
 	radeon_irq_kms_disable_hpd(rdev, disabled);
 }
-- 
2.7.3

Back to linux.kernel | Previous | NextNext in thread | Find similar | Unroll thread


Thread

[PATCH] drm/radeon: evergreen_hpd_init()/_fini(): fix HPD IRQ bitset Nicolai Stange <nicstange@gmail.com> - 2016-03-19 21:00 +0100
  Re: [PATCH] drm/radeon: evergreen_hpd_init()/_fini(): fix HPD IRQ bitset Nicolai Stange <nicstange@gmail.com> - 2016-03-21 09:20 +0100

csiph-web