Trouble with allocating memory on platform driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello list,

Trying to create a device driver for a raspberry pi zero (BCM2835) to control a gpio and an spi device.
This eventually will be done in a FIQ interrupt handler.
A simplified version of this batradio-driver can be found at:
 https://github.com/SietseAchterop/Batradio/blob/master/batradio_module/alloctest.c

The problem is that modprobe-ing this driver directly yields the following in dmesg.

Apr  4 16:50:23 raspberrypi kernel: [  139.636850] batradio: loading out-of-tree module taints kernel.
Apr  4 16:50:23 raspberrypi kernel: [  139.653580] ------------[ cut here ]------------
Apr  4 16:50:23 raspberrypi kernel: [  139.653650] WARNING: CPU: 0 PID: 1208 at include/linux/dma-mapping.h:516 init_module+0x164/0x1e0 [batradio]
Apr 4 16:50:23 raspberrypi kernel: [ 139.653664] Modules linked in: batradio(O+) fuse rfcomm cmac bnep hci_uart btbcm serdev bluetooth ecdh_generic 8021q garp stp llc sg uas brcmfmac brcmutil sha256_generic cfg80211 rfkill snd_bcm2835(C) raspberrypi_hwmon snd_pcm hwmon snd_timer snd bcm2835_v4l2(C) bcm2835_codec(C) v4l2_mem2mem bcm2835_mmal_vchiq(C) v4l2_common videobuf2_vmalloc videobuf2_dma_contig videobuf2_memops videobuf2_v4l2 videobuf2_common videodev media vc_sm_cma(C) fixed uio_pdrv_genirq uio i2c_dev ip_tables x_tables ipv6
Apr  4 16:50:23 raspberrypi kernel: [  139.653835] CPU: 0 PID: 1208 Comm: modprobe Tainted: G         C O      4.19.108+ #1
Apr  4 16:50:23 raspberrypi kernel: [  139.653844] Hardware name: BCM2835
Apr  4 16:50:23 raspberrypi kernel: [  139.653897] [<c00184f8>] (unwind_backtrace) from [<c0015064>] (show_stack+0x20/0x24)
Apr  4 16:50:23 raspberrypi kernel: [  139.653931] [<c0015064>] (show_stack) from [<c0753394>] (dump_stack+0x20/0x28)
Apr  4 16:50:23 raspberrypi kernel: [  139.653970] [<c0753394>] (dump_stack) from [<c0025b58>] (__warn.part.3+0xb8/0xe0)
Apr  4 16:50:23 raspberrypi kernel: [  139.653998] [<c0025b58>] (__warn.part.3) from [<c0025cf8>] (warn_slowpath_null+0x50/0x5c)
Apr  4 16:50:23 raspberrypi kernel: [  139.654037] [<c0025cf8>] (warn_slowpath_null) from [<bf698164>] (init_module+0x164/0x1e0 [batradio])
Apr  4 16:50:23 raspberrypi kernel: [  139.654110] [<bf698164>] (init_module [batradio]) from [<c000ae8c>] (do_one_initcall+0x4c/0x234)
Apr  4 16:50:23 raspberrypi kernel: [  139.654151] [<c000ae8c>] (do_one_initcall) from [<c00a7898>] (do_init_module+0x6c/0x1f8)
Apr  4 16:50:23 raspberrypi kernel: [  139.654181] [<c00a7898>] (do_init_module) from [<c00a9cdc>] (load_module+0x21ec/0x24cc)
Apr  4 16:50:23 raspberrypi kernel: [  139.654209] [<c00a9cdc>] (load_module) from [<c00aa1f8>] (sys_finit_module+0xcc/0xec)
Apr  4 16:50:23 raspberrypi kernel: [  139.654232] [<c00aa1f8>] (sys_finit_module) from [<c0009000>] (ret_fast_syscall+0x0/0x28)
Apr  4 16:50:23 raspberrypi kernel: [  139.654244] Exception stack(0xcc037fa8 to 0xcc037ff0)
Apr  4 16:50:23 raspberrypi kernel: [  139.654261] 7fa0:                   93da3c00 00401760 00000003 0002d064 00000000 0002ec3c
Apr  4 16:50:23 raspberrypi kernel: [  139.654279] 7fc0: 93da3c00 00401760 00000000 0000017b 00402f10 00000000 00402e68 00000000
Apr  4 16:50:23 raspberrypi kernel: [  139.654294] 7fe0: bed56338 bed56328 00022cb8 b6c26af0
Apr  4 16:50:23 raspberrypi kernel: [  139.654307] ---[ end trace deb280ac68ce7734 ]---
Apr  4 16:50:23 raspberrypi kernel: [  139.654330] platform batradio__.0: coherent DMA mask is unset
Apr  4 16:50:23 raspberrypi kernel: [  139.654344] platform batradio__.0: Couldn't allocate memory!

The crash is at the very beginning of the init function of the module, here is the first part of that function:

  pdev = platform_device_register_simple("batradio__", 0, NULL, 0);
  if (IS_ERR(pdev))
    return PTR_ERR(pdev);
	
  batradio_data = devm_kzalloc(&pdev->dev,
			       sizeof(*batradio_data),
			       GFP_KERNEL);
  if (!batradio_data)
    return -ENOMEM;

  batradio_data->fiq_base = dma_zalloc_coherent(&pdev->dev,
						FIQ_BUFFER_SIZE,
						&batradio_data->dma_handle,
						GFP_KERNEL);
  if (!batradio_data->fiq_base) {
    dev_err(&pdev->dev, "Couldn't allocate memory!\n");
    return -ENOMEM;
  }

Note that the crash seems to occur because of the call to dma_zalloc_coherent.
The allocation does not work, FIQ_BUFFER_SIZE is 256*1024. and this is directly after reboot.
Also note that I start the rpizero only with the console, so no X. And login with ssh.

Why is this happening? What does "coherent DMA mask is unset" means.
I do not intend to use dma, but I understood that allocating in this way is what I should do if I want to use this data also from my FIQ handler.

Does it has to do with the use of platform_device_register_simple? Maybe the device structure isn't initialized properly for this?
I actually use this function because I don't know which compatible value I have to use when using the devicetree, everything I tried failed.

I also read the following in platform_device.h about platform_device_register_simple:
      In particular, when such drivers are built as modules, they can't be "hotplugged".
Is this relevant. is using modprobe meant by this?

  Thanks in advance,
      Sietse


_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]

  Powered by Linux