您尚未登录。

#1 2023-12-15 11:58:47

qileilu
会员
注册时间: 2012-10-12
帖子: 106

[已解决]编译6.x内核报错不兼容的指针类型间转换问题

求助,编译内核以支持国产phytium芯片。
为了驱动内核网卡,需打入补丁0001-add-phytium-id-from-acpi-to-stmmac.patch和0002-phytium-ethernet-stmmac.patch来源于铜豌豆 Linux / atzlinux-kernel
这两个补丁在内核5.x下可以使用,不报错。但是上到6.x就报不兼容的指针类型间转换问题。
本人就学了个入门C语言,但又急需解决这个问题,请高手帮我。
更多详情参看: 办公室统一换电脑了,arm架构,我希望我还能再来论坛

编译错误信息如下:

  CC [M]  drivers/media/pci/cx23885/cx23885-417.o
drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c: 在函数‘dwmac_generic_probe’中:
drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c:37:59: 错误:传递‘stmmac_probe_config_acpi’的第 2 个参数时在不兼容的指针类型间转换 [-Werror=incompatible-pointer-types]
   37 |                 plat_dat = stmmac_probe_config_acpi(pdev, &stmmac_res.mac);
      |                                                           ^~~~~~~~~~~~~~~
      |                                                           |
      |                                                           u8 (*)[6] {或称 unsigned char (*)[6]}
In file included from drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c:18:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h:17:69: 附注:需要类型‘const char **’,但实参的类型为‘u8 (*)[6]’ {或称 ‘unsigned char (*)[6]’}
   17 | stmmac_probe_config_acpi(struct platform_device *pdev, const char **mac);
      |                                                        ~~~~~~~~~~~~~^~~
cc1:有些警告被当作是错误
make[6]: *** [scripts/Makefile.build:252:drivers/net/ethernet/stmicro/stmmac/dwmac-generic.o] 错误 1
make[5]: *** [scripts/Makefile.build:504:drivers/net/ethernet/stmicro/stmmac] 错误 2
make[4]: *** [scripts/Makefile.build:504:drivers/net/ethernet/stmicro] 错误 2
make[3]: *** [scripts/Makefile.build:504:drivers/net/ethernet] 错误 2
make[2]: *** [scripts/Makefile.build:504:drivers/net] 错误 2
make[2]: *** 正在等待未完成的任务....
  CC      drivers/cpufreq/cpufreq_powersave.o

对应问题patch是:0001-add-phytium-id-from-acpi-to-stmmac.patch,具体字段为:

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
index b3365b34c..99d821c72 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
@@ -9,6 +9,7 @@
  * warranty of any kind, whether express or implied.
  */
 
+#include <linux/acpi.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
@@ -32,6 +33,12 @@ static int dwmac_generic_probe(struct platform_device *pdev)
 			dev_err(&pdev->dev, "dt configuration failed\n");
 			return PTR_ERR(plat_dat);
 		}
+	} else if (has_acpi_companion(&pdev->dev)) {
+		plat_dat = stmmac_probe_config_acpi(pdev, &stmmac_res.mac);
+		if (!plat_dat) {
+			dev_err(&pdev->dev, "acpi configuration failed\n");
+			return  -EINVAL;
+		}
 	} else {
 		plat_dat = dev_get_platdata(&pdev->dev);
 		if (!plat_dat) {
@@ -85,6 +92,17 @@ static const struct of_device_id dwmac_generic_match[] = {
 };
 MODULE_DEVICE_TABLE(of, dwmac_generic_match);
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id dwmac_acpi_ids[] = {
+	{ .id = "PHYT0004" },
+	{},
+};
+
+MODULE_DEVICE_TABLE(acpi, dwmac_acpi_ids);
+#else
+#define dwmac_acpi_ids NULL
+#endif
+
 static struct platform_driver dwmac_generic_driver = {
 	.probe  = dwmac_generic_probe,
 	.remove = stmmac_pltfr_remove,
@@ -92,6 +110,7 @@ static struct platform_driver dwmac_generic_driver = {
 		.name           = STMMAC_RESOURCE_NAME,
 		.pm		= &stmmac_pltfr_pm_ops,
 		.of_match_table = of_match_ptr(dwmac_generic_match),
+		.acpi_match_table = ACPI_PTR(dwmac_acpi_ids),
 	},
 };
 module_platform_driver(dwmac_generic_driver);

最近编辑记录 qileilu (2023-12-18 17:07:24)

离线

#2 2023-12-15 14:23:45

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,493
个人网站

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

你用 (char**) 强制类型转换试试?这么转问题应该不大。

离线

#3 2023-12-16 07:30:35

flygoat
会员
注册时间: 2016-10-27
帖子: 1

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

可以直接使用前人的包:
https://github.com/saeziae/pkgbuild-linux-phytium

离线

#4 2023-12-17 22:33:44

matrikslee
会员
注册时间: 2017-04-21
帖子: 443
个人网站

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

(..., &stmmac_res.mac)改成(..., &stmmac_res.mac[0])试试,

不过 u8和char应该只在非x86-64平台下是等价的,如果是x86-64平台,这样改就还是会warning,非x86-64平台应该是ok的

我又想起来kernel 好像在某个版本打开了将所有char当作u8的编译器开关,那样的话应该 改成(..., &stmmac_res.mac[0])就没问题了

最近编辑记录 matrikslee (2023-12-17 22:37:30)

离线

#5 2023-12-18 09:20:47

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

flygoat 说:

谢谢,这个好像比较新,之前没找到过,我试试

最近编辑记录 qileilu (2023-12-18 09:23:37)

离线

#6 2023-12-18 09:22:14

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

依云 说:

你用 (char**) 强制类型转换试试?这么转问题应该不大。

这个我搜索到了,可能我加的位置不对,冒似不行。

离线

#7 2023-12-18 09:26:46

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

matrikslee 说:

(..., &stmmac_res.mac)改成(..., &stmmac_res.mac[0])试试,

不过 u8和char应该只在非x86-64平台下是等价的,如果是x86-64平台,这样改就还是会warning,非x86-64平台应该是ok的

我又想起来kernel 好像在某个版本打开了将所有char当作u8的编译器开关,那样的话应该 改成(..., &stmmac_res.mac[0])就没问题了

谢谢指导,不仅说了办法,还讲述了原因,我这就试试看

离线

#8 2023-12-18 12:19:31

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

matrikslee 说:

(..., &stmmac_res.mac)改成(..., &stmmac_res.mac[0])试试,

不过 u8和char应该只在非x86-64平台下是等价的,如果是x86-64平台,这样改就还是会warning,非x86-64平台应该是ok的

我又想起来kernel 好像在某个版本打开了将所有char当作u8的编译器开关,那样的话应该 改成(..., &stmmac_res.mac[0])就没问题了

修改之后编译还是出错,问题变成这样了,之前好像是数组类型不对,现在看起来是数组里面的元素类型不对。

  CC [M]  drivers/vfio/vfio_main.o
drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c: 在函数‘dwmac_generic_probe’中:
drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c:37:59: 错误:传递‘stmmac_probe_config_acpi’的第 2 个参数时在不兼容的指针类型间转换 [-Werror=incompatible-pointer-types]
   37 |                 plat_dat = stmmac_probe_config_acpi(pdev, &stmmac_res.mac[0]);
      |                                                           ^~~~~~~~~~~~~~~~~~
      |                                                           |
      |                                                           u8 * {或称 unsigned char *}
In file included from drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c:18:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h:17:69: 附注:需要类型‘const char **’,但实参的类型为‘u8 *’ {或称 ‘unsigned char *’}
   17 | stmmac_probe_config_acpi(struct platform_device *pdev, const char **mac);
      |                                                        ~~~~~~~~~~~~~^~~
  CC [M]  drivers/mtd/mtdoops.o
cc1:有些警告被当作是错误
make[6]: *** [scripts/Makefile.build:252:drivers/net/ethernet/stmicro/stmmac/dwmac-generic.o] 错误 1
make[5]: *** [scripts/Makefile.build:504:drivers/net/ethernet/stmicro/stmmac] 错误 2
make[4]: *** [scripts/Makefile.build:504:drivers/net/ethernet/stmicro] 错误 2
make[3]: *** [scripts/Makefile.build:504:drivers/net/ethernet] 错误 2
make[2]: *** [scripts/Makefile.build:504:drivers/net] 错误 2
make[2]: *** 正在等待未完成的任务....
  CC [M]  drivers/atm/eni.o

离线

#9 2023-12-18 17:06:36

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

matrikslee 说:

(..., &stmmac_res.mac)改成(..., &stmmac_res.mac[0])试试,

不过 u8和char应该只在非x86-64平台下是等价的,如果是x86-64平台,这样改就还是会warning,非x86-64平台应该是ok的

我又想起来kernel 好像在某个版本打开了将所有char当作u8的编译器开关,那样的话应该 改成(..., &stmmac_res.mac[0])就没问题了

依云 说:

你用 (char**) 强制类型转换试试?这么转问题应该不大。

想了想,结合两位的办法,做了如下修改,总算不报错了,编译成功。
问题解决,谢谢各位大神!

plat_dat = stmmac_probe_config_acpi(pdev,(const char **)&stmmac_res.mac[0]);

安装新编译的内核启动,网卡总算有了,暂时还不能启动,后续再研究:

[lcc@LcArchArm ~]$ ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/tunnel6 :: brd :: permaddr ea43:5ade:106e::
4: enaphyt4i0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 98:0e:24:6f:1f:a7 brd ff:ff:ff:ff:ff:ff
[lcc@LcArchArm ~]$ sudo ip link set enaphyt4i0 up
[sudo] lcc 的密码:
RTNETLINK answers: Operation not supported

离线

#10 2023-12-19 10:05:50

qileilu
会员
注册时间: 2012-10-12
帖子: 106

Re: [已解决]编译6.x内核报错不兼容的指针类型间转换问题

flygoat 说:

这位大神的包太好了,按照他的config和pacth我编译了一下内核,没有出错,包括内核声音(需修改PKGBUILD增加包中的wip-phytium-audio.patch)均完美,也怪我之前么早发现这个包,不然可以少折腾这一两个月了。

这下终于可以彻底摆脱原装kylin系统的阴影了!!再也不用kylin的核,甚至连kylin的内核config都不用了,哈哈哈,爽!!!!

此条在新内核下回复。

$ uname -a
Linux LcArchArm 6.2.11-1-phytium #1 SMP PREEMPT Mon Dec 18 15:43:06 CST 2023 aarch64 GNU/Linux

最近编辑记录 qileilu (2023-12-19 12:24:48)

离线

页脚