platform: dce: fix compilation error with GCC 11

GCC 11 reports the array-bounds issue when passing an 32-bit variable
to find_first_bit but referencing it as 64-bit.

drivers/platform/tegra/dce/dce-debug.c: In function ‘dbg_dce_boot_status_fops_read’:
./include/linux/find.h:119:37: error: array subscript ‘long unsigned int[0]’ is partly outside array bounds of ‘hsp_sema_t[1]’ {aka ‘unsigned int[1]’} [-Werror=array-bounds]
  119 |                 unsigned long val = *addr & GENMASK(size - 1, 0);
      |                                     ^~~~~
drivers/platform/tegra/dce/dce-debug.c:493:20: note: while referencing ‘ss’
  493 |         hsp_sema_t ss = dce_ss_get_state(d, DCE_BOOT_SEMA);
      |                    ^~
...
from drivers/platform/tegra/dce/dce-debug.c:15:
./include/linux/find.h:119:37: error: array subscript ‘long unsigned int[0]’ is partly outside array bounds of ‘u32[1]’ {aka ‘unsigned int[1]’} [-Werror=array-bounds]
  119 |                 unsigned long val = *addr & GENMASK(size - 1, 0);
      |                                     ^~~~~
drivers/platform/tegra/dce/dce-debug.c:492:13: note: while referencing ‘boot_status’
  492 |         u32 boot_status = d->boot_status;
      |             ^~~~~~~~~~~
cc1: all warnings being treated as errors

Fix it by passing a 64-bit variable to find_first_bit directly.

Bug 200730650

Change-Id: Ibfb68a2ee175aeb60eb9248496c220b35ff98906
Signed-off-by: Vince Hsu <vinceh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2856358
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com>
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Reviewed-by: Vinod Gopalakrishnakurup <vinodg@nvidia.com>
Reviewed-by: Arun Swain <arswain@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Vince Hsu
2023-02-10 09:09:11 +00:00
committed by Laxman Dewangan
parent 47b8841a62
commit b25786578c

View File

@@ -487,7 +487,7 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file,
char buf[32];
u32 last_status;
ssize_t len = 0;
unsigned long *addr;
unsigned long bitmap;
struct tegra_dce *d = file->private_data;
u32 boot_status = d->boot_status;
hsp_sema_t ss = dce_ss_get_state(d, DCE_BOOT_SEMA);
@@ -497,9 +497,9 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file,
/* Clear BOOT_COMPLETE bit and bits set by OS */
ss &= ~(DCE_OS_BITMASK | DCE_BOOT_COMPLETE);
addr = (unsigned long *)&ss;
bitmap = ss;
fsb = find_first_bit(addr, 32U);
fsb = find_first_bit(&bitmap, 32U);
if (fsb > 31U) {
dce_info(d, "dce-fw boot not started yet");
goto core_boot_done;
@@ -547,8 +547,8 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file,
core_boot_done:
/* Clear DCE_STATUS_FAILED bit get actual failure reason*/
boot_status &= ~DCE_STATUS_FAILED;
addr = (unsigned long *)&boot_status;
last_status = DCE_BIT(find_first_bit(addr, 32));
bitmap = boot_status;
last_status = DCE_BIT(find_first_bit(&bitmap, 32));
switch (last_status) {
case DCE_FW_SUSPENDED: