Skip to content

Instantly share code, notes, and snippets.

@notro
Created June 9, 2021 15:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save notro/bddbb1c39fc1c1bc519d20c2bf373cd4 to your computer and use it in GitHub Desktop.
Save notro/bddbb1c39fc1c1bc519d20c2bf373cd4 to your computer and use it in GitHub Desktop.
I used ftrace to try and find where the problem is, and have tracked it to spi-bcm2835.
Pi4 spends 19.907 ms sending the pixel data and Pi zero spends 29.990 ms.
trace-cmd is available on the 'pi' image.
Pi4
---
# trace-cmd record -o /tmp/trace.dat -p function_graph -l mipi_dbi_fb_dirty -l spi_transfer_one_message
# trace-cmd report -i /tmp/trace.dat
kworker/0:2-348 [000] 577.767036: funcgraph_entry: | mipi_dbi_fb_dirty() {
kworker/0:2-348 [000] 577.770096: funcgraph_entry: + 27.518 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.770145: funcgraph_entry: + 28.889 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.770198: funcgraph_entry: + 26.500 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.770247: funcgraph_entry: + 28.944 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.770299: funcgraph_entry: + 26.055 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.770378: funcgraph_entry: # 19907.074 us | spi_transfer_one_message();
kworker/0:2-348 [000] 577.790293: funcgraph_exit: # 23258.000 us | }
The SPI hw can only handle buffers which length fits in a 16-bit register DLEN.
The driver works around this by splitting up the transfer.
# trace-cmd record -o /tmp/trace.dat -p function_graph -l mipi_dbi_fb_dirty -l spi_transfer_one_message -l bcm2835_spi_transfer_one
kworker/0:2-348 [000] 674.462743: funcgraph_entry: | mipi_dbi_fb_dirty() {
...
kworker/0:2-348 [000] 674.466270: funcgraph_entry: | spi_transfer_one_message() {
kworker/0:2-348 [000] 674.466283: funcgraph_entry: + 21.352 us | bcm2835_spi_transfer_one();
kworker/0:2-348 [000] 674.474748: funcgraph_entry: + 22.500 us | bcm2835_spi_transfer_one();
kworker/0:2-348 [000] 674.483216: funcgraph_entry: + 21.963 us | bcm2835_spi_transfer_one();
kworker/0:2-348 [000] 674.486192: funcgraph_exit: # 19922.037 us | }
kworker/0:2-348 [000] 674.486220: funcgraph_exit: # 23477.908 us | }
Pi Zero
-------
# trace-cmd record -o /tmp/trace.dat -p function_graph -l mipi_dbi_fb_dirty -l spi_transfer_one_message
# trace-cmd report -i /tmp/trace.dat
kworker/0:3-59 [000] 261.795885: funcgraph_entry: | mipi_dbi_fb_dirty() {
kworker/0:3-59 [000] 261.804197: funcgraph_entry: ! 112.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.804387: funcgraph_entry: + 54.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.804508: funcgraph_entry: + 47.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.804615: funcgraph_entry: + 49.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.804723: funcgraph_entry: + 42.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.804918: funcgraph_entry: # 29990.000 us | spi_transfer_one_message();
kworker/0:3-59 [000] 261.834974: funcgraph_exit: # 39099.000 us | }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment