intel / ipu6-drivers

GNU General Public License v2.0
165 stars 52 forks source link

Ipu6 kernel 6.7 and 6.8 fixes #213

Closed jwrdegoede closed 4 months ago

jwrdegoede commented 7 months ago

Here is a set of 3 fixes to make ipu6-drivers work with the 6.7 and 6.8 kernels

  1. The first commit fixes the ipu6-isys driver crashing (due to a bug in a cleanup on error paths) after a failure in isys_probe() (this fixes #205)
  2. The second commit fixes the drivers not compiling against kernel 6.8
  3. The third commit fixes the kernel crashing with kernel 6.8 due to the cio2-bridge code making the .name attribute of 2 long-lived software_nodes point to on stack memory

Cc: @vicamo @smallorange

kupietz commented 7 months ago

Thanks!

I built the ipu6-driver with your changes using dkms for kernel 6.7.7 and get duplicate symbol ljca_register_event_cb again:

[ 10.352971] intel-ipu6 0000:00:05.0: Device 0xa75d (rev: 0x1)
[ 10.353003] intel-ipu6 0000:00:05.0: physical base address 0x603c000000
[ 10.353006] intel-ipu6 0000:00:05.0: mapped as: 0x000000002e52d503
[ 10.353054] intel-ipu6 0000:00:05.0: IPU in secure mode
[ 10.353056] intel-ipu6 0000:00:05.0: IPU secure touch = 0x0
[ 10.353058] intel-ipu6 0000:00:05.0: IPU camera mask = 0xff
[ 10.355560] intel-ipu6 0000:00:05.0: IPC reset done
[ 10.355564] intel-ipu6 0000:00:05.0: cpd file name: intel/ipu6ep_fw.bin
[ 10.356613] intel-ipu6 0000:00:05.0: FW version: 20220510
[ 10.357793] ljca: exports duplicate symbol ljca_register_event_cb (owned by usb_ljca)
[ 10.364994] int3472-discrete INT3472:05: cannot find GPIO chip INTC1096:00, deferring
jwrdegoede commented 7 months ago

I built the ipu6-driver with your changes using dkms for kernel 6.7.7 and get duplicate symbol ljca_register_event_cb again:

This is caused by the latest kernels having an upstream version of the ljca driver. To fix this remove the ljca.ko files installed by dkms (typically under /lib/modules/$kver/updates/ IIRC) and then run "sudo depmod -a" followed by a reboot.

kupietz commented 7 months ago

I built the ipu6-driver with your changes using dkms for kernel 6.7.7 and get duplicate symbol ljca_register_event_cb again:

This is caused by the latest kernels having an upstream version of the ljca driver. To fix this remove the ljca.ko files installed by dkms (typically under /lib/modules/$kver/updates/ IIRC) and then run "sudo depmod -a" followed by a reboot.

Thanks, that removed the message, but I still get the cannot find GPIO chip INTC1096:00 and no camera picture.

EmilienMottet commented 7 months ago

Thanks a lot for your patch.

I can setup my camera now on my X1 carbon gen 11th.

using the OV2740 kernel module and compile ipu6* mod outside kernel

cstickel commented 6 months ago

Update: Nevermind... as soon as i found out where to find the log file it was simple to track down and it was my fault. Somehow missed, that not only ipu6-drivers had a PR with fixes for 6.8 kernels, but also ivsc-driver. as soon as i used also the fixed ivsc-driver branch it compiled without any issues (while the webcam still doesn't work, but that's another topic). sorry for the unnecessary comment :-D but i don't delete it, maybe someone else has the same issue and it might help.

Hey,

I naively tried to compile with dkms with really not much clue about drivers on linux. Just trying to get the camera on a XPS 14 9440 up and running. I followed the steps for 3. Build with dkms, but still, might also just be my fault. Just in case it isn't these were the logs I got (Using freshly installed Ubuntu 23.10 with Mainline Kernel 6.8.1):

Sign command: /usr/bin/kmodsign
Signing key: /var/lib/shim-signed/mok/MOK.priv
Public certificate (MOK): /var/lib/shim-signed/mok/MOK.der

Building module:
Cleaning build area...
make -j22 KERNELRELEASE=6.8.1-060801-generic KERNELRELEASE=6.8.1-060801-generic KERNEL_SRC=/lib/modules/6.8.1-060801-generic/build....(bad exit status: 2)
ERROR (dkms apport): binary package for ipu6-drivers: 0.0.0 not found
Error! Bad return status for module build on kernel: 6.8.1-060801-generic (x86_64)
Consult /var/lib/dkms/ipu6-drivers/0.0.0/build/make.log for more information.
dkms autoinstall on 6.8.1-060801-generic/x86_64 succeeded for nvidia
dkms autoinstall on 6.8.1-060801-generic/x86_64 failed for ipu6-drivers(10)

Can't see much details in the logs, is there any other place to get more details in which file it actually failed?

Have to use Kernel >= 6.7, to get proper support for the Meteorlake components, so hoped with your fixes I would be able to get the camera drivers up and running.

Update: Just found the location of the make.log file (sorry as said, no clue about the details). Maybe this helps (sorry that the system seems to write some stuff even in the log files in german -.-):

DKMS make.log for ipu6-drivers-0.0.0 for kernel 6.8.1-060801-generic (x86_64)
Do 21. Mär 14:08:41 CET 2024
make -C /lib/modules/6.8.1-060801-generic/build M=/var/lib/dkms/ipu6-drivers/0.0.0/build modules
make[1]: Verzeichnis „/usr/src/linux-headers-6.8.1-060801-generic“ wird betreten
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-17ubuntu2) 13.2.0
  You are using:           gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/gpio/gpio-ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/i2c/busses/i2c-ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/hm11b1.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/mei/spi-vsc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/gc5035.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/mei/hw-vsc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/ov01a1s.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/ov01a10.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/intel_vsc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/ov02c10.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/ov02e10.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_csi.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/ov2740.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/hm2170.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_ace.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/hm2172.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/i2c/hi556.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_pse.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_ace_debug.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu.o
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_ace.c:314:5: warning: no previous prototype for ‘ipu_own_camera’ [-Wmissing-prototypes]
  314 | int ipu_own_camera(void *ace, struct camera_status *status)
      |     ^~~~~~~~~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_ace.c:321:5: warning: no previous prototype for ‘ace_own_camera’ [-Wmissing-prototypes]
  321 | int ace_own_camera(void *ace, struct camera_status *status)
      |     ^~~~~~~~~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/misc/ivsc/mei_ace.c:328:5: warning: no previous prototype for ‘get_camera_status’ [-Wmissing-prototypes]
  328 | int get_camera_status(void *ace, struct camera_status *status)
      |     ^~~~~~~~~~~~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/gpio/gpio-ljca.c:256:6: warning: no previous prototype for ‘ljca_gpio_event_cb’ [-Wmissing-prototypes]
  256 | void ljca_gpio_event_cb(struct platform_device *pdev, u8 cmd,
      |      ^~~~~~~~~~~~~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.c: In function ‘try_match_acpi_hid’:
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.c:224:17: error: implicit declaration of function ‘strlcpy’; did you mean ‘strscpy’? [-Werror=implicit-function-declaration]
  224 |                 strlcpy(ids[0].id, hids[i], sizeof(ids[0].id));
      |                 ^~~~~~~
      |                 strscpy
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.c: At top level:
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.c:323:6: warning: no previous prototype for ‘ljca_dump’ [-Wmissing-prototypes]
  323 | void ljca_dump(struct ljca_dev *ljca, void *buf, int len)
      |      ^~~~~~~~~
In file included from ./include/linux/printk.h:564,
                 from ./include/asm-generic/bug.h:22,
                 from ./arch/x86/include/asm/bug.h:87,
                 from ./include/linux/bug.h:5,
                 from ./arch/x86/include/asm/paravirt.h:19,
                 from ./arch/x86/include/asm/irqflags.h:60,
                 from ./include/linux/irqflags.h:18,
                 from ./include/linux/spinlock.h:59,
                 from ./include/linux/mmzone.h:8,
                 from ./include/linux/gfp.h:7,
                 from ./include/linux/slab.h:16,
                 from ./include/linux/resource_ext.h:11,
                 from ./include/linux/acpi.h:13,
                 from /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.c:8:
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.c: In function ‘ljca_spi_prepare_message’:
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.c:216:39: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘u8 *’ {aka ‘unsigned char *’} [-Wformat=]
  216 |         dev_dbg(&ljca_spi->pdev->dev, "cs %d\n", spi->chip_select);
      |                                       ^~~~~~~~~
./include/linux/dynamic_debug.h:224:29: note: in definition of macro ‘__dynamic_func_call_cls’
  224 |                 func(&id, ##__VA_ARGS__);                       \
      |                             ^~~~~~~~~~~
./include/linux/dynamic_debug.h:250:9: note: in expansion of macro ‘_dynamic_func_call_cls’
  250 |         _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
      |         ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/dynamic_debug.h:273:9: note: in expansion of macro ‘_dynamic_func_call’
  273 |         _dynamic_func_call(fmt, __dynamic_dev_dbg,              \
      |         ^~~~~~~~~~~~~~~~~~
./include/linux/dev_printk.h:155:9: note: in expansion of macro ‘dynamic_dev_dbg’
  155 |         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
      |         ^~~~~~~~~~~~~~~
./include/linux/dev_printk.h:155:30: note: in expansion of macro ‘dev_fmt’
  155 |         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
      |                              ^~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.c:216:9: note: in expansion of macro ‘dev_dbg’
  216 |         dev_dbg(&ljca_spi->pdev->dev, "cs %d\n", spi->chip_select);
      |         ^~~~~~~
/var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/spi/spi-ljca.c:216:44: note: format string is defined here
  216 |         dev_dbg(&ljca_spi->pdev->dev, "cs %d\n", spi->chip_select);
      |                                           ~^
      |                                            |
      |                                            int
      |                                           %hhn
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/mei_csi.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-bus.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-dma.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/mei_ace.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/mei_ace_debug.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-mmu.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/gpio-ljca.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/spi-ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-buttress.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-trace.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/intel_vsc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-cpd.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/mei_pse.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-fw-com.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/i2c-ljca.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../cio2-bridge.o
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:243: /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/mfd/ljca.o] Fehler 1
make[3]: *** Auf noch nicht beendete Prozesse wird gewartet …
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys-csi2.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-isys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-isys-phy.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-isys-dwc-phy.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-isys-gpc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys-csi2-be-soc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-fw-isys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys-video.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys-queue.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-isys-subdev.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-psys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-psys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu-resources.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-psys-gpc.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-l-scheduler.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-ppg.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu-fw-resources.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6-fw-resources.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6se-fw-resources.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/ipu6ep-fw-resources.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-fw-psys.o
  CC [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/../ipu-psys-compat32.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/intel-ipu6.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/intel-ipu6-isys.o
  LD [M]  /var/lib/dkms/ipu6-drivers/0.0.0/build/drivers/media/pci/intel/ipu6/intel-ipu6-psys.o
make[2]: *** [/usr/src/linux-headers-6.8.1-060801-generic/Makefile:1927: /var/lib/dkms/ipu6-drivers/0.0.0/build] Fehler 2
make[1]: *** [Makefile:240: __sub-make] Fehler 2
make[1]: Verzeichnis „/usr/src/linux-headers-6.8.1-060801-generic“ wird verlassen
make: *** [Makefile:78: all] Fehler 2
alexhulbert commented 6 months ago

Hi, I'm trying to build this branch of ipu6-drivers against kernel 6.9.0-rc1, but I get the following errors when I run sudo dkms install ipu6-drivers/r164.0ab15e0 -k 6.9.0-rc1-linux-rc: https://pastebin.com/v8C4mkjm

Looks like spi_master is now spi_controller in 6.9

kop7 commented 6 months ago

I get some strange error : /ipu6-drivers/drivers/media/i2c/ov01a1s.c:21:10: fatal error: linux/vsc.h: No such file or directory 21 | #include <linux/vsc.h> | ^~~~~ compilation terminated.

vicamo commented 5 months ago

This should have been included in https://github.com/intel/ipu6-drivers/pull/220.

jwrdegoede commented 5 months ago

This should have been included in #220.

The compile fixes are in #220 but the issue with cio2-bridge.c code setting long living pointers to point to on stack memory remains.

I'll do a new push to the branch for this pull-request rebased on the latest master, so this will now just contain the 1 remaining fix.

hao-yao commented 4 months ago

LGTM, will internal review it. By the way, seems in upstream kernel, include/media/ipu-bridge.h is also missing #include <linux/mod_devicetable.h>.