Ok so, it's official that with 512MB you have to downgrade the CMA to
128MB:

https://git.launchpad.net/~ubuntu-
kernel/ubuntu/+source/linux/+git/xenial/tree/arch/arm/boot/dts/overlays/README?h=raspi2#n1317

so the dtoverlay line should go from:

dtoverlay=vc4-kms-v3d

to:

dtoverlay=vc4-kms-v3d,cma-128

and with this setup, the board works fine.

Still, i agree that it should fail gracefully if the wrong cma size is
specified - i fixed the OOPS on boot here:
https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1805117 but
once the board is running, we later hit another problem:

[  360.269693] INFO: task kworker/1:2:101 blocked for more than 120 seconds.
[  360.276605]       Not tainted 4.4.0-1101-raspi2 #109~vc4dbg5
[  360.282360] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[  360.290316] kworker/1:2     D 80895384     0   101      2 0x00000000
[  360.290338] Workqueue: events dbs_timer
[  360.290356] [<80895384>] (__schedule) from [<8089589c>] (schedule+0x50/0xa8)
[  360.290366] [<8089589c>] (schedule) from [<80898c80>] 
(schedule_timeout+0x218/0x2a0)
[  360.290376] [<80898c80>] (schedule_timeout) from [<80896668>] 
(wait_for_common+0xc8/0x1a0)
[  360.290384] [<80896668>] (wait_for_common) from [<80896760>] 
(wait_for_completion+0x20/0x24)
[  360.290395] [<80896760>] (wait_for_completion) from [<8073f0d4>] 
(rpi_firmware_transaction+0x78/0xd0)
[  360.290406] [<8073f0d4>] (rpi_firmware_transaction) from [<8073f20c>] 
(rpi_firmware_property_list+0xe0/0x24c)
[  360.290415] [<8073f20c>] (rpi_firmware_property_list) from [<8073f3ec>] 
(rpi_firmware_property+0x74/0xec)
[  360.290425] [<8073f3ec>] (rpi_firmware_property) from [<80712c80>] 
(bcm2835_cpufreq_clock_property.constprop.1+0x58/0x80)
[  360.290437] [<80712c80>] (bcm2835_cpufreq_clock_property.constprop.1) from 
[<80712d00>] (bcm2835_cpufreq_driver_target_index+0x58/0xdc)
[  360.290446] [<80712d00>] (bcm2835_cpufreq_driver_target_index) from 
[<8070bb94>] (__cpufreq_driver_target+0x234/0x3b4)
[  360.290456] [<8070bb94>] (__cpufreq_driver_target) from [<807101e8>] 
(od_check_cpu+0xdc/0xe0)
[  360.290465] [<807101e8>] (od_check_cpu) from [<80712170>] 
(dbs_check_cpu+0x1d0/0x22c)
[  360.290474] [<80712170>] (dbs_check_cpu) from [<8071045c>] 
(od_dbs_timer+0x60/0xf4)
[  360.290483] [<8071045c>] (od_dbs_timer) from [<807124f4>] 
(dbs_timer+0x15c/0x1a8)
[  360.290494] [<807124f4>] (dbs_timer) from [<80140ed0>] 
(process_one_work+0x160/0x50c)
[  360.290504] [<80140ed0>] (process_one_work) from [<801412dc>] 
(worker_thread+0x60/0x5d0)
[  360.290513] [<801412dc>] (worker_thread) from [<80147808>] 
(kthread+0x118/0x130)
[  360.290525] [<80147808>] (kthread) from [<80108ebc>] 
(ret_from_fork+0x14/0x38)
[  360.290533] INFO: task kworker/3:2:135 blocked for more than 120 seconds.
[  360.297430]       Not tainted 4.4.0-1101-raspi2 #109~vc4dbg5
[  360.303176] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[  360.311129] kworker/3:2     D 80895384     0   135      2 0x00000000
[  360.311141] Workqueue: events dbs_timer
[  360.311151] [<80895384>] (__schedule) from [<8089589c>] (schedule+0x50/0xa8)
[  360.311160] [<8089589c>] (schedule) from [<80895c78>] 
(schedule_preempt_disabled+0x18/0x1c)
[  360.311169] [<80895c78>] (schedule_preempt_disabled) from [<808975c4>] 
(__mutex_lock_slowpath+0xcc/0x184)
[  360.311177] [<808975c4>] (__mutex_lock_slowpath) from [<808976dc>] 
(mutex_lock+0x60/0x64)
[  360.311186] [<808976dc>] (mutex_lock) from [<807123e0>] 
(dbs_timer+0x48/0x1a8)
[  360.311195] [<807123e0>] (dbs_timer) from [<80140ed0>] 
(process_one_work+0x160/0x50c)
[  360.311204] [<80140ed0>] (process_one_work) from [<801412dc>] 
(worker_thread+0x60/0x5d0)
[  360.311212] [<801412dc>] (worker_thread) from [<80147808>] 
(kthread+0x118/0x130)
[  360.311221] [<80147808>] (kthread) from [<80108ebc>] 
(ret_from_fork+0x14/0x38)
...

the reason why that happens is because it takes a mutex:

drivers/cpufreq/cpufreq_governor.c::dbs_timer()
...
mutex_lock(&shared->timer_mutex);
...

and then calls into the firmware:

drivers/firmware/raspberrypi.c::rpi_firmware_transaction()
...
        ret = mbox_send_message(fw->chan, &message);
        if (ret >= 0) {
                wait_for_completion(&fw->c);
                ret = 0;
        }
...

the call into the firmwate is asyncrhnous, so it writes the message into the 
mailbox and then wait for an answer (while still holding the mutex in 
dbs_timer()).
In the mean time, the other cpus/workqueue take the same path to change 
frequency, and try to take the same mutex in dbs_timer(), but since it's 
already taken, they stop there and go to sleep - basically we are in deadlock 
waiting for an aswer from the firmware on CPU0/workqueue0, and all the other 
CPUs/workqueues queue there and wait indefinitely.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1805174

Title:
  Xenial/raspi2 and RaspberryPi3A+: video not working

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1805174/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to