页次: 1
求助,编译内核以支持国产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)
离线
你用 (char**) 强制类型转换试试?这么转问题应该不大。
离线
离线
(..., &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)
离线
谢谢,这个好像比较新,之前没找到过,我试试
最近编辑记录 qileilu (2023-12-18 09:23:37)
离线
你用 (char**) 强制类型转换试试?这么转问题应该不大。
这个我搜索到了,可能我加的位置不对,冒似不行。
离线
(..., &stmmac_res.mac)改成(..., &stmmac_res.mac[0])试试,
不过 u8和char应该只在非x86-64平台下是等价的,如果是x86-64平台,这样改就还是会warning,非x86-64平台应该是ok的我又想起来kernel 好像在某个版本打开了将所有char当作u8的编译器开关,那样的话应该 改成(..., &stmmac_res.mac[0])就没问题了
谢谢指导,不仅说了办法,还讲述了原因,我这就试试看
离线
(..., &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
离线
(..., &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
离线
这位大神的包太好了,按照他的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)
离线
页次: 1