exynos4: power domain issue with hdmi out
Hi, with Odroid U2 (exynos4412 quad) + a custom kernel based on linux-next 20130912 and before I am unable to get a hdmi output other than vertical lines (a few whites on black background, sometimes yellow ) that are static (no changes whatever the content sent to the hdmi output. The issue disappeared as soon as I enabled fimd ... I narrowed it further, ie nowI can get hdmi output without fimd but with pd_lcd0 commented as to avoid it goind into power off at boot. Find that via fbcon enabled and content is displayed fined until the kernel turns off the unused power domains (just before freeing unused kernel memory). What could be the root issue ? Could pd_lcd0 wake up a parent item that should be too by pd_tv ? For one the non devicetree kernel from hardkernel setup s5p_fimd_device even if it does not use it. So the issue would be hidden. I also wonder if while developping s5p_device_hdmi such an issue appeared . Best regards Alban ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH] exynos/drm: fix no hdmi output
Le vendredi 30 janvier 2015 à 16:29 +0900, Joonyoung Shim a écrit : > Hi, > > OK, i also get blank screen from hdmi after enable vidi. > > The pipe value for crtc is increased in mixer_initialize so it should be > called before exynos_drm_crtc_create because the pipe value is used in > exynos_drm_crtc_create. > > Acked-by: Joonyoung Shim > > Fimd and VIDI driver also have same issue. I will post the patch to fix > this for Fimd and VIDI driver. > Thank you . I missed the rationale thus the related issues. My bad the ack will not be included as I took too long, the patch is already in Inki Dae repository exynos-drm-next branch as is. Best regards, Alban
[PATCH] RFC: drm/lima: fix calling drm_mm_init with an empty range
For the empty_vm initialization the range is empty which is not supported by drm_mm_init. With CONFIG_DRM_DEBUG_MM set, I get: [ cut here ] kernel BUG at drivers/gpu/drm/drm_mm.c:965! Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM Modules linked in: lima(+) drm_shmem_helper gpu_sched s5p_jpeg s5p_g2d videobuf2_dma_contig videobuf2_memops v4l2_mem2mem videobuf2_v4l2 videobuf2_common s5p_cec tun fuse configfs auth_rpcgss sunrpc ip_tables x_tables autofs4 btrfs lzo_compress zlib_deflate raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor xor_neon raid6_pq libcrc32c raid1 raid0 linear md_mod dm_mirror dm_region_hash dm_log hid_logitech_hidpp hid_logitech_dj CPU: 0 PID: 1033 Comm: systemd-udevd Not tainted 6.4.0-rc1-debug+ #230 Hardware name: Samsung Exynos (Flattened Device Tree) PC is at drm_mm_init+0x94/0x98 LR is at 0x0 Flags: nZCv IRQs on FIQs off Mode SVC_32 ISA ARM Segment none drm_mm_init from lima_vm_create+0xcc/0x108 [lima] lima_vm_create [lima] from lima_device_init+0xd8/0x4a0 [lima] lima_device_init [lima] from lima_pdev_probe.part.0+0x6c/0x158 [lima] lima_pdev_probe.part.0 [lima] from platform_probe+0x64/0xc0 platform_probe from call_driver_probe+0x2c/0x110 The drm_mm.c line 965 is: drivers/gpu/drm/drm_mm.c void drm_mm_init(struct drm_mm *mm, u64 start, u64 size) { DRM_MM_BUG_ON(start + size <= start); lima_vm_create is called with va_start and va_end both unset in lima_device_init line 371: ldev->empty_vm = lima_vm_create(ldev); Signed-off-by: Alban Browaeys --- drivers/gpu/drm/lima/lima_device.c | 2 +- drivers/gpu/drm/lima/lima_drv.c| 2 +- drivers/gpu/drm/lima/lima_vm.c | 10 +++--- drivers/gpu/drm/lima/lima_vm.h | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/lima/lima_device.c b/drivers/gpu/drm/lima/lima_device.c index 02cef0cea657..bd3afff0f44a 100644 --- a/drivers/gpu/drm/lima/lima_device.c +++ b/drivers/gpu/drm/lima/lima_device.c @@ -368,7 +368,7 @@ int lima_device_init(struct lima_device *ldev) if (err) goto err_out0; - ldev->empty_vm = lima_vm_create(ldev); + ldev->empty_vm = lima_vm_create(ldev, false); if (!ldev->empty_vm) { err = -ENOMEM; goto err_out1; diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index 10fd9154cc46..ca09142e0ac1 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -219,7 +219,7 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file) if (!priv) return -ENOMEM; - priv->vm = lima_vm_create(ldev); + priv->vm = lima_vm_create(ldev, true); if (!priv->vm) { err = -ENOMEM; goto err_out0; diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c index 2b2739adc7f5..7f9775eefd78 100644 --- a/drivers/gpu/drm/lima/lima_vm.c +++ b/drivers/gpu/drm/lima/lima_vm.c @@ -197,7 +197,7 @@ u32 lima_vm_get_va(struct lima_vm *vm, struct lima_bo *bo) return ret; } -struct lima_vm *lima_vm_create(struct lima_device *dev) +struct lima_vm *lima_vm_create(struct lima_device *dev, bool has_drm_mm) { struct lima_vm *vm; @@ -221,7 +221,10 @@ struct lima_vm *lima_vm_create(struct lima_device *dev) goto err_out1; } - drm_mm_init(>mm, dev->va_start, dev->va_end - dev->va_start); + if (has_drm_mm) { + vm->has_drm_mm = true; + drm_mm_init(>mm, dev->va_start, dev->va_end - dev->va_start); + } return vm; @@ -237,7 +240,8 @@ void lima_vm_release(struct kref *kref) struct lima_vm *vm = container_of(kref, struct lima_vm, refcount); int i; - drm_mm_takedown(>mm); + if (vm->has_drm_mm) + drm_mm_takedown(>mm); for (i = 0; i < LIMA_VM_NUM_BT; i++) { if (vm->bts[i].cpu) diff --git a/drivers/gpu/drm/lima/lima_vm.h b/drivers/gpu/drm/lima/lima_vm.h index 3a7c74822d8b..e7443f410d6d 100644 --- a/drivers/gpu/drm/lima/lima_vm.h +++ b/drivers/gpu/drm/lima/lima_vm.h @@ -30,6 +30,7 @@ struct lima_vm { struct mutex lock; struct kref refcount; + bool has_drm_mm; struct drm_mm mm; struct lima_device *dev; @@ -43,7 +44,7 @@ void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo); u32 lima_vm_get_va(struct lima_vm *vm, struct lima_bo *bo); -struct lima_vm *lima_vm_create(struct lima_device *dev); +struct lima_vm *lima_vm_create(struct lima_device *dev, bool has_drm_mm); void lima_vm_release(struct kref *kref); static inline struct lima_vm *lima_vm_get(struct lima_vm *vm) -- 2.39.2
Re: [PATCH] RFC: drm/lima: fix calling drm_mm_init with an empty range
Le lundi 18 décembre 2023 à 10:50 +0800, Qiang Yu a écrit : > Thanks for the fix. It could be done in a simpler way that swap the > va_start/va_end init/fini and empty_vm create/release. The thing is I do not get what you suggest by swaping :-/ Do you mean I should check for "dev->va_end - dev->va_start" not to be zero instead of passing a boolean and setting a flag on the structure? PS: This was an RFC to raise the issue, that would be fine to me if you take it further. Alban > On Thu, Dec 14, 2023 at 5:04 PM Alban Browaeys > wrote: > > > > For the empty_vm initialization the range is empty which is not > > supported > > by drm_mm_init. > > > > With CONFIG_DRM_DEBUG_MM set, I get: > > [ cut here ] > > kernel BUG at drivers/gpu/drm/drm_mm.c:965! > > Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM > > Modules linked in: lima(+) drm_shmem_helper gpu_sched s5p_jpeg > > s5p_g2d > > videobuf2_dma_contig videobuf2_memops v4l2_mem2mem videobuf2_v4l2 > > videobuf2_common s5p_cec tun fuse configfs auth_rpcgss sunrpc > > ip_tables > > x_tables autofs4 btrfs lzo_compress zlib_deflate raid10 raid456 > > async_raid6_recov async_memcpy async_pq async_xor async_tx xor > > xor_neon > > raid6_pq libcrc32c raid1 raid0 linear md_mod dm_mirror > > dm_region_hash > > dm_log hid_logitech_hidpp hid_logitech_dj > > CPU: 0 PID: 1033 Comm: systemd-udevd Not tainted 6.4.0-rc1-debug+ > > #230 > > Hardware name: Samsung Exynos (Flattened Device Tree) > > PC is at drm_mm_init+0x94/0x98 > > LR is at 0x0 > > Flags: nZCv IRQs on FIQs off Mode SVC_32 ISA ARM Segment none > > drm_mm_init from lima_vm_create+0xcc/0x108 [lima] > > lima_vm_create [lima] from lima_device_init+0xd8/0x4a0 [lima] > > lima_device_init [lima] from lima_pdev_probe.part.0+0x6c/0x158 > > [lima] > > lima_pdev_probe.part.0 [lima] from platform_probe+0x64/0xc0 > > platform_probe from call_driver_probe+0x2c/0x110 > > > > The drm_mm.c line 965 is: > > drivers/gpu/drm/drm_mm.c > > void drm_mm_init(struct drm_mm *mm, u64 start, u64 size) > > { > > DRM_MM_BUG_ON(start + size <= start); > > > > lima_vm_create is called with va_start and va_end both unset > > in lima_device_init line 371: > > ldev->empty_vm = lima_vm_create(ldev); > > > > Signed-off-by: Alban Browaeys > > --- > > drivers/gpu/drm/lima/lima_device.c | 2 +- > > drivers/gpu/drm/lima/lima_drv.c | 2 +- > > drivers/gpu/drm/lima/lima_vm.c | 10 +++--- > > drivers/gpu/drm/lima/lima_vm.h | 3 ++- > > 4 files changed, 11 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/gpu/drm/lima/lima_device.c > > b/drivers/gpu/drm/lima/lima_device.c > > index 02cef0cea657..bd3afff0f44a 100644 > > --- a/drivers/gpu/drm/lima/lima_device.c > > +++ b/drivers/gpu/drm/lima/lima_device.c > > @@ -368,7 +368,7 @@ int lima_device_init(struct lima_device *ldev) > > if (err) > > goto err_out0; > > > > - ldev->empty_vm = lima_vm_create(ldev); > > + ldev->empty_vm = lima_vm_create(ldev, false); > > if (!ldev->empty_vm) { > > err = -ENOMEM; > > goto err_out1; > > diff --git a/drivers/gpu/drm/lima/lima_drv.c > > b/drivers/gpu/drm/lima/lima_drv.c > > index 10fd9154cc46..ca09142e0ac1 100644 > > --- a/drivers/gpu/drm/lima/lima_drv.c > > +++ b/drivers/gpu/drm/lima/lima_drv.c > > @@ -219,7 +219,7 @@ static int lima_drm_driver_open(struct > > drm_device *dev, struct drm_file *file) > > if (!priv) > > return -ENOMEM; > > > > - priv->vm = lima_vm_create(ldev); > > + priv->vm = lima_vm_create(ldev, true); > > if (!priv->vm) { > > err = -ENOMEM; > > goto err_out0; > > diff --git a/drivers/gpu/drm/lima/lima_vm.c > > b/drivers/gpu/drm/lima/lima_vm.c > > index 2b2739adc7f5..7f9775eefd78 100644 > > --- a/drivers/gpu/drm/lima/lima_vm.c > > +++ b/drivers/gpu/drm/lima/lima_vm.c > > @@ -197,7 +197,7 @@ u32 lima_vm_get_va(struct lima_vm *vm, struct > > lima_bo *bo) > > return ret; > > } > > > > -struct lima_vm *lima_vm_create(struct lima_device *dev) > > +struct lima_vm *lima_vm_create(struct lima_device *dev, bool > > has_drm_mm) > > { > > struct lima_vm *vm; > > > > @@ -221,7 +221,10 @@ struct lima_vm *lima_vm_create(struct > > lima_device *dev) > >