anholt / linux

Other
134 stars 24 forks source link

rpi-4.14.y-userqpu: fail to detect qpu job completion #157

Open eguchi1904 opened 2 years ago

eguchi1904 commented 2 years ago

Hi, I am currently investigating rpi-4.14.y-userqpu branch to run vc4 programs (e.g. hello_fft) with dtovelay=vc4-kms-v3d enabled.

With this patch, I could confirm that several vc4 programs including hello_fft can be correctly executed under dtovelay=vc4-kms-v3d enabled. However, in every case, it seems that the driver does not properly detect QPU job completion because it fails to detect writes to a host_interrupt register at the end of qpu instructions, which suppose to trigger an interrupt from qpu.

More precisely, It seems that a write to the host_interrupt register doesn't trigger the interrupt handler vc4_irq , which is supposed to finish the qpu job. Instead, a hangcheck procedure vc4_hangcheck_elapsed, which is executed every single second, eventually determines that the job has hung, resets the GPU, and vc4_wait_for_seqno in vc4_firmware_qpu_execute finally returned. Also, whenever vc4_irq was executed, the contents of V3D_DBQITC were always 0, and a job termination procedure in vc4_irq never seemed to be executed.

I also try dtovelay=vc4-fkms-v3d instead, but the behavior is the same.

Is there anything you can tell about how to properly detect the end of a QPU job? I posted a related question in raspberrypi forum, but I asked here as well, hoping for some insight from the patch author's point of view.

This is config.txt I used.

``` # For more options and information see # http://rpf.io/configtxt # Some settings may impact device functionality. See link above for details # uncomment if you get no picture on HDMI for a default "safe" mode #hdmi_safe=1 # uncomment this if your display has a black border of unused pixels visible # and your display can output without overscan #disable_overscan=1 # uncomment the following to adjust overscan. Use positive numbers if console # goes off screen, and negative if there is too much border #overscan_left=16 #overscan_right=16 #overscan_top=16 #overscan_bottom=16 # uncomment to force a console size. By default it will be display's size minus # overscan. #framebuffer_width=1280 #framebuffer_height=720 # uncomment if hdmi display is not detected and composite is being output #hdmi_force_hotplug=1 # uncomment to force a specific HDMI mode (this will force VGA) #hdmi_group=1 #hdmi_mode=1 # uncomment to force a HDMI mode rather than DVI. This can make audio work in # DMT (computer monitor) modes #hdmi_drive=2 # uncomment to increase signal to HDMI, if you have interference, blanking, or # no display #config_hdmi_boost=4 # uncomment for composite PAL #sdtv_mode=2 #uncomment to overclock the arm. 700 MHz is the default. #arm_freq=800 # Uncomment some or all of these to enable the optional hardware interfaces #dtparam=i2c_arm=on #dtparam=i2s=on #dtparam=spi=on # Uncomment this to enable infrared communication. #dtoverlay=gpio-ir,gpio_pin=17 #dtoverlay=gpio-ir-tx,gpio_pin=18 # Additional overlays and parameters are documented /boot/overlays/README # Enable audio (loads snd_bcm2835) dtparam=audio=on [pi4] # Enable DRM VC4 V3D driver on top of the dispmanx display stack dtoverlay=vc4-fkms-v3d max_framebuffers=2 [all] dtoverlay=vc4-kms-v3d # using vc4-fkms-v3d instead didn't change the behavior ```

Regard,