Hi,
You still did not answer my previous question:
Now another aspect of the same problem: even if I detect display re-plug, I cannot reinitialize it using DRM and eventually Orin crashes.
To reproduce: save the attached patch as 08_video_dec_drm_test.diff
Then:
cp -rp /usr/src/jetson_multimedia_api ~/jetson_multimedia_api_test
cd ~/jetson_multimedia_api_test
patch -p4 < ../08_video_dec_drm_test.diff
cd ~/jetson_multimedia_api_test/samples/08_video_dec_drm
make
sudo init 3
sudo modprobe nvidia-drm modeset=1
./video_dec_drm --disable-video
It will display image. After 300 frames it will close DRM and prompt you to press Enter.
After you press Enter it will open DRM and show image again.
Now unplug and re-plug display while image is shown.
Now corrupted picture is displayed.
Note that reinitializing DRM does not help now - display remains corrupted.
If you continue this experiment, then orin will crash:
Jan 07 21:05:49 orin2 kernel: NVRM rpcRmApiControl_dce: NVRM_RPC_DCE: Failed RM ctrl call cmd:0x731341 result 0xffff:
Jan 07 21:06:01 orin2 kernel: NVRM rpcRmApiControl_dce: NVRM_RPC_DCE: Failed RM ctrl call cmd:0x731341 result 0xffff:
Jan 07 21:06:01 orin2 kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000000000003c9
Jan 07 21:06:01 orin2 kernel: Mem abort info:
Jan 07 21:06:01 orin2 kernel: ESR = 0x0000000096000004
Jan 07 21:06:01 orin2 kernel: EC = 0x25: DABT (current EL), IL = 32 bits
Jan 07 21:06:01 orin2 kernel: SET = 0, FnV = 0
Jan 07 21:06:01 orin2 kernel: EA = 0, S1PTW = 0
Jan 07 21:06:01 orin2 kernel: FSC = 0x04: level 0 translation fault
Jan 07 21:06:01 orin2 kernel: Data abort info:
Jan 07 21:06:01 orin2 kernel: ISV = 0, ISS = 0x00000004
Jan 07 21:06:01 orin2 kernel: CM = 0, WnR = 0
Jan 07 21:06:01 orin2 kernel: user pgtable: 4k pages, 48-bit VAs, pgdp=00000001387f9000
Jan 07 21:06:01 orin2 kernel: [00000000000003c9] pgd=0000000000000000, p4d=0000000000000000
Jan 07 21:06:01 orin2 kernel: Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
Jan 07 21:06:01 orin2 kernel: Modules linked in: nvidia_drm(O) exfat(E) nvidia_modeset(O) uvcvideo videobuf2_vmalloc algif_hash algif_skcipher af_alg bn
ep bridge stp llc usb_f_ncm usb_f_mass_storage rtk_btusb(O) lzo_rle btusb lzo_compress btrtl btintel btbcm zram zsmalloc nvme_fabrics usb_f_acm u_serial
usb_f_rndis u_ether ramoops reed_solomon libcomposite rtl8822ce(O) nvme snd_soc_tegra210_admaif(O) snd_soc_tegra186_asrc(O) snd_soc_tegra186_dspk(O) sn
d_soc_tegra210_ope(O) snd_soc_tegra210_dmic(O) snd_soc_tegra210_afc(O) snd_soc_tegra_pcm snd_soc_tegra210_mvc(O) snd_soc_tegra186_arad(O) snd_soc_tegra2
10_mixer(O) snd_soc_tegra210_adx(O) snd_soc_tegra210_amx(O) snd_soc_tegra210_sfc(O) nvme_core snd_soc_tegra210_i2s(O) tegra_pcie_dma_test(O) cfg80211 te
gra_pcie_edma(O) snd_soc_tegra210_ahub(O) tegra210_adma spidev nvvrs_pseq_rtc(O) crct10dif_ce snd_soc_tegra_machine_driver(O) snd_soc_tegra_utils(O) snd
_soc_simple_card_utils tegra234_oc_event(O) tegra23x_perf_uncore(O) nvpmodel_clk_cap(O) snd_hda_codec_hdmi
Jan 07 21:06:01 orin2 kernel: ucsi_ccg typec_ucsi tegra_mce(O) typec nvethernet(O) mttcan(O) can_dev thermal_trip_event(O) tegra_cactmon_mc_all(O) snd_
hda_tegra nvpps(O) tegra234_aon(O) tegra_aconnect snd_hda_codec snd_hda_core okicam(OE) phy_tegra194_p2u snd_soc_rt5640 tegra_xudc snd_soc_rl6231 at24 p
wm_tegra_tachometer(O) nvidia(O) mc_hwpm(O) pcie_tegra194 host1x_fence(O) spi_tegra114 lm90 i2c_nvvrs11(O) nvidia_vrs_pseq(O) tegra_dce(O) nvhost_vi5(O)
nvhost_isp5(O) nvhost_nvcsi_t194(O) tegra_camera(O) v4l2_dv_timings nvhost_nvcsi(O) tegra_camera_platform(O) capture_ivc(OE) tegra_camera_rtcpu(O) ivc_
bus(O) governor_userspace hsp_mailbox_client(O) ivc_ext(O) v4l2_fwnode v4l2_async videobuf2_dma_contig tegra_drm(O) nvhost_pva(O) videobuf2_memops nvhos
t_nvdla(O) tegra_wmark(O) videobuf2_v4l2 videobuf2_common tegra_se(O) cec videodev nvhost_capture(O) nvhwpm(O) mc crypto_engine tsecriscv(O) drm_kms_hel
per host1x_nvhost(O) nvidia_p2p(O) ina3221 nvgpu(O) governor_pod_scaling(O) host1x(O) mc_utils(O) nvmap(O)
Jan 07 21:06:01 orin2 kernel: nvsciipc(O) drm fuse nfsd ip_tables x_tables ipv6 pwm_fan pwm_tegra tegra_bpmp_thermal [last unloaded: nvidia_drm]
Jan 07 21:06:01 orin2 kernel: CPU: 0 PID: 10781 Comm: OutputPlane Tainted: G W OE 5.15.148-tegra #1
Jan 07 21:06:01 orin2 kernel: Hardware name: NVIDIA NVIDIA Jetson AGX Orin Developer Kit/Jetson, BIOS 36.4.0-gcid-37537400 09/13/2024
Jan 07 21:06:01 orin2 kernel: pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
Jan 07 21:06:01 orin2 kernel: pc : _ZN11DisplayPort10DeviceImpl14isFECSupportedEv+0x0/0x10 [nvidia_modeset]
Jan 07 21:06:01 orin2 kernel: lr : _ZN11DisplayPort13ConnectorImpl19compoundQueryAttachEPNS_5GroupERKNS_15DpModesetParamsEPNS_9DscParamsEPNS_12DP_IMP_ER
RORE+0xa88/0x10f0 [nvidia_modeset]
Jan 07 21:06:01 orin2 kernel: sp : ffff80001be1af30
Jan 07 21:06:01 orin2 kernel: x29: ffff80001be1b600 x28: ffff80001be1b0e8 x27: 0000000000000000
Jan 07 21:06:01 orin2 kernel: x26: ffff00008aaf8608 x25: ffff000087a41c08 x24: ffff80001be1b2b8
Jan 07 21:06:01 orin2 kernel: x23: ffff00010ca7e808 x22: ffff00010ca7f710 x21: 0000000000000000
Jan 07 21:06:01 orin2 kernel: x20: ffff0000ee439008 x19: ffff00010ca7f708 x18: ffff000108809208
Jan 07 21:06:01 orin2 kernel: x17: 0000000000000000 x16: ffffdbdc04815380 x15: 0000000000000000
Jan 07 21:06:01 orin2 kernel: x14: 00000000000002d5 x13: 0000000000000000 x12: 0000000000000000
Jan 07 21:06:01 orin2 kernel: x11: 0000000000000018 x10: ffff80000ca38ef4 x9 : 0000000000000000
Jan 07 21:06:01 orin2 kernel: x8 : ffffdbdbf2953110 x7 : 000002d000000500 x6 : ffff0000ee439278
Jan 07 21:06:01 orin2 kernel: x5 : ffffdbdbf2957b50 x4 : 0000000030479e80 x3 : ffff000087a41c08
Jan 07 21:06:01 orin2 kernel: x2 : ffff00010ca7e840 x1 : 0000000000000002 x0 : 0000000000000000
Jan 07 21:06:01 orin2 kernel: Call trace:
Jan 07 21:06:01 orin2 kernel: _ZN11DisplayPort10DeviceImpl14isFECSupportedEv+0x0/0x10 [nvidia_modeset]
Jan 07 21:06:01 orin2 kernel: nvKmsKapiSetSemaphoreSurfaceValue+0x2cbc/0x2cf0 [nvidia_modeset]
Jan 07 21:06:01 orin2 kernel: drm_connector_mode_valid+0x84/0xf0 [drm_kms_helper]
Jan 07 21:06:01 orin2 kernel: drm_helper_probe_single_connector_modes+0x314/0x7f0 [drm_kms_helper]
Jan 07 21:06:01 orin2 kernel: drm_client_modeset_probe+0x24c/0x10d0 [drm]
Jan 07 21:06:01 orin2 kernel: drm_fb_helper_set_par+0x1ec/0x250 [drm_kms_helper]
Jan 07 21:06:01 orin2 kernel: drm_fb_helper_lastclose+0x190/0x420 [drm_kms_helper]
Jan 07 21:06:01 orin2 kernel: drm_client_dev_restore+0x98/0x110 [drm]
Jan 07 21:06:01 orin2 kernel: drm_lastclose+0x78/0xa0 [drm]
Jan 07 21:06:01 orin2 kernel: drm_release+0x124/0x140 [drm]
Jan 07 21:06:01 orin2 kernel: __fput+0x7c/0x290
Jan 07 21:06:01 orin2 kernel: ____fput+0x28/0x40
Jan 07 21:06:01 orin2 kernel: task_work_run+0x90/0x100
Jan 07 21:06:01 orin2 kernel: do_notify_resume+0x230/0x9a0
Jan 07 21:06:01 orin2 kernel: el0_svc+0x74/0x90
Jan 07 21:06:01 orin2 kernel: el0t_64_sync_handler+0xac/0x130
Jan 07 21:06:01 orin2 kernel: el0t_64_sync+0x1a4/0x1a8
Jan 07 21:06:01 orin2 kernel: Code: 17fffe5b 00000000 00000000 00000000 (394f2400)
Jan 07 21:06:01 orin2 kernel: ---[ end trace 3dc58e7656f4d7cc ]---
Please, provide a reliable procedure to reinitialize DRM after re-plug.
Thank you
diff -ruN /usr/src/jetson_multimedia_api/samples/08_video_dec_drm/video_dec_drm.cpp /home/me/jetson_multimedia_api/samples/08_video_dec_drm/video_dec_drm.cpp
--- /usr/src/jetson_multimedia_api/samples/08_video_dec_drm/video_dec_drm.cpp 2024-09-12 21:28:59.000000000 -0700
+++ /home/me/jetson_multimedia_api/samples/08_video_dec_drm/video_dec_drm.cpp 2025-01-07 21:03:19.618925369 -0800
@@ -312,6 +312,11 @@
0, 0, ui_width << 16, ui_height << 16);
frame++;
+ if(frame > 300)
+ {
+ printf("Break loop\n");
+ break;
+ }
/**
* Get EOS signal from video capturing thread,
@@ -883,6 +888,7 @@
/* Render UI infinitely until user terminate it */
if (ctx.disable_video)
{
+ printf("NvDrmRenderer::createDrmRenderer\n");
ctx.drm_renderer = NvDrmRenderer::createDrmRenderer("renderer0",
image_w, image_h, 0, 0, ctx.connector, ctx.crtc, metadata, ctx.streamHDR);
@@ -1113,6 +1119,7 @@
*/
delete ctx.dec;
/* Similarly, NvDrmRenderer destructor does all the cleanup */
+ printf("delete ctx.drm_renderer\n");
delete ctx.drm_renderer;
delete ctx.out_file;
free(ctx.out_file_path);
@@ -1146,6 +1153,10 @@
/* Main loop to render UI(ARGB) or Video(YUV420) stream */
ret = drm_rendering(ctx, argc, argv, iteration);
+ printf("Press Enter\n");
+ getchar();
+ ctx.stress_iteration = 10;
+
} while (iteration++ < ctx.stress_iteration && ret == 0);
if (ret)
diff -ruN /usr/src/jetson_multimedia_api/samples/common/classes/NvDrmRenderer.cpp /home/me/jetson_multimedia_api/samples/common/classes/NvDrmRenderer.cpp
--- /usr/src/jetson_multimedia_api/samples/common/classes/NvDrmRenderer.cpp 2024-09-12 21:28:59.000000000 -0700
+++ /home/me/jetson_multimedia_api/samples/common/classes/NvDrmRenderer.cpp 2025-01-07 20:21:22.000000000 -0800
@@ -618,6 +618,8 @@
return drmModeObjectSetProperty(drm_fd, drm_crtc_id, DRM_MODE_OBJECT_CRTC, prop_id, hdrBlobId);
}
+std::vector< std::pair<void*,int> > kludge_maps;//Kludge to close maps before closing DRM
+
NvDrmRenderer::~NvDrmRenderer()
{
uint32_t fb;
@@ -655,7 +657,16 @@
}
if (drm_fd != -1)
+ {
+ for(auto & m : kludge_maps)
+ {
+ int res = munmap(m.first, m.second);
+ printf("munmap %p %d ret %d\n", m.first, m.second, res);
+ }
+ kludge_maps.clear();
+
drmClose(drm_fd);
+ }
}
int
@@ -933,6 +944,7 @@
COMP_ERROR_MSG("cannot mmap dumb buffer\n");
return 0;
}
+ kludge_maps.push_back(std::pair<void*,int>(map, creq.size));//Kludge to close maps before closing DRM
} else {
map = (uint8_t *) (mreq.offset);
}