Message ID | 20230814-void-drivers-pci-controller-pcie-iproc-platform-v1-1-81a121607851@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | PCI: iproc: fix -Wvoid-pointer-to-enum-cast warning | expand |
On Mon, Aug 14, 2023 at 10:29:22PM +0000, Justin Stitt wrote: > When building with clang 18 I see the following warning: > | drivers/pci/controller/pcie-iproc-platform.c:55:15: warning: cast to smaller > | integer type 'enum iproc_pcie_type' from 'const void *' [-Wvoid-pointer-to-enum-cast] > | 55 | pcie->type = (enum iproc_pcie_type) of_device_get_match_data(dev); > > This is due to the fact that `of_device_get_match_data` returns a void* > while `enum iproc_pcie_type` has the size of an int. This leads to > truncation and possible data loss. > > Link: https://github.com/ClangBuiltLinux/linux/issues/1910 > Reported-by: Nathan Chancellor <nathan@kernel.org> > Signed-off-by: Justin Stitt <justinstitt@google.com> > --- > Note: There is likely no data loss occurring here since `enum > iproc_pcie_type` has only a few fields enumerated from 0. Definitely not > enough to cause data loss from pointer-width to int-width. > --- > drivers/pci/controller/pcie-iproc-platform.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c > index acdc583d2980..83cbc95f4384 100644 > --- a/drivers/pci/controller/pcie-iproc-platform.c > +++ b/drivers/pci/controller/pcie-iproc-platform.c > @@ -52,7 +52,7 @@ static int iproc_pltfm_pcie_probe(struct platform_device *pdev) > pcie = pci_host_bridge_priv(bridge); > > pcie->dev = dev; > - pcie->type = (enum iproc_pcie_type) of_device_get_match_data(dev); > + pcie->type = (uintptr_t) of_device_get_match_data(dev); This seems a little ugly on both ends: we have to cast the enum to (int *) in the of_device_id table: static const struct of_device_id iproc_pcie_of_match_table[] = { { .compatible = "brcm,iproc-pcie", .data = (int *)IPROC_PCIE_PAXB, }, and then we have to cast it back to the the enum type here, and we can't even use the actual enum type: pcie->type = (uintptr_t) of_device_get_match_data(dev); I think this would be nicer if we made a struct iproc_pcie_of_data along the lines of ks_pcie_of_data and put the enum values in instances of that struct. It's definitely a little more code and space, but it might also help us get rid of some of the "switch (pcie->type)" stuff scattered around this driver. Bjorn
diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c index acdc583d2980..83cbc95f4384 100644 --- a/drivers/pci/controller/pcie-iproc-platform.c +++ b/drivers/pci/controller/pcie-iproc-platform.c @@ -52,7 +52,7 @@ static int iproc_pltfm_pcie_probe(struct platform_device *pdev) pcie = pci_host_bridge_priv(bridge); pcie->dev = dev; - pcie->type = (enum iproc_pcie_type) of_device_get_match_data(dev); + pcie->type = (uintptr_t) of_device_get_match_data(dev); ret = of_address_to_resource(np, 0, ®); if (ret < 0) {
When building with clang 18 I see the following warning: | drivers/pci/controller/pcie-iproc-platform.c:55:15: warning: cast to smaller | integer type 'enum iproc_pcie_type' from 'const void *' [-Wvoid-pointer-to-enum-cast] | 55 | pcie->type = (enum iproc_pcie_type) of_device_get_match_data(dev); This is due to the fact that `of_device_get_match_data` returns a void* while `enum iproc_pcie_type` has the size of an int. This leads to truncation and possible data loss. Link: https://github.com/ClangBuiltLinux/linux/issues/1910 Reported-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Justin Stitt <justinstitt@google.com> --- Note: There is likely no data loss occurring here since `enum iproc_pcie_type` has only a few fields enumerated from 0. Definitely not enough to cause data loss from pointer-width to int-width. --- drivers/pci/controller/pcie-iproc-platform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- base-commit: 2ccdd1b13c591d306f0401d98dedc4bdcd02b421 change-id: 20230814-void-drivers-pci-controller-pcie-iproc-platform-ada4ac9a9a75 Best regards, -- Justin Stitt <justinstitt@google.com>