On 27.09.2018 23:23, Noralf Trønnes wrote: > Den 27.09.2018 23.08, skrev Stefan Agner: >> On 08.09.2018 15:46, Noralf Trønnes wrote: >>> The CMA helper is already using the drm_fb_helper_generic_probe part of >>> the generic fbdev emulation. This patch makes full use of the generic >>> fbdev emulation by using its drm_client callbacks. This means that >>> drm_mode_config_funcs->output_poll_changed and drm_driver->lastclose are >>> now handled by the emulation code. Additionally fbdev unregister happens >>> automatically on drm_dev_unregister(). >>> >>> The drm_fbdev_generic_setup() call is put after drm_dev_register() in the >>> driver. This is done to highlight the fact that fbdev emulation is an >>> internal client that makes use of the driver, it is not part of the >>> driver as such. If fbdev setup fails, an error is printed, but the driver >>> succeeds probing. >> I think the last sentence is currently not implemented, I think it will >> silently succeed probing. Can we add something like this, similar to >> tinydrm-core.c? >> >> if (ret) >> DRM_ERROR("Failed to initialize fbdev: %d\n", ret); > > It was implemented in the first patch in the series, now applied: > > drm/fb-helper: Improve error reporting in setup > https://cgit.freedesktop.org/drm/drm-misc/commit/?id=6129369a96183f28c7912dfd37cb5869433aa904 That patch adds error reporting for drm_fb_helper_fbdev_setup(). But you are using drm_fbdev_generic_setup() here... -- Stefan > > Noralf. > >> -- >> Stefan >> >>> Cc: Stefan Agner <stefan@xxxxxxxx> >>> Cc: Alison Wang <alison.wang@xxxxxxx> >>> Signed-off-by: Noralf Trønnes <noralf@xxxxxxxxxxx> >>> --- >>> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 25 +++---------------------- >>> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 1 - >>> 2 files changed, 3 insertions(+), 23 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c >>> b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c >>> index 80232321a244..15816141e5fb 100644 >>> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c >>> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c >>> @@ -26,6 +26,7 @@ >>> #include <drm/drm_atomic_helper.h> >>> #include <drm/drm_crtc_helper.h> >>> #include <drm/drm_fb_cma_helper.h> >>> +#include <drm/drm_fb_helper.h> >>> #include <drm/drm_gem_cma_helper.h> >>> #include <drm/drm_modeset_helper.h> >>> @@ -89,20 +90,11 @@ static int fsl_dcu_load(struct drm_device *dev, >>> unsigned long flags) >>> "Invalid legacyfb_depth. Defaulting to 24bpp\n"); >>> legacyfb_depth = 24; >>> } >>> - fsl_dev->fbdev = drm_fbdev_cma_init(dev, legacyfb_depth, 1); >>> - if (IS_ERR(fsl_dev->fbdev)) { >>> - ret = PTR_ERR(fsl_dev->fbdev); >>> - fsl_dev->fbdev = NULL; >>> - goto done; >>> - } >>> return 0; >>> done: >>> drm_kms_helper_poll_fini(dev); >>> - if (fsl_dev->fbdev) >>> - drm_fbdev_cma_fini(fsl_dev->fbdev); >>> - >>> drm_mode_config_cleanup(dev); >>> drm_irq_uninstall(dev); >>> dev->dev_private = NULL; >>> @@ -112,14 +104,9 @@ static int fsl_dcu_load(struct drm_device *dev, >>> unsigned long flags) >>> static void fsl_dcu_unload(struct drm_device *dev) >>> { >>> - struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; >>> - >>> drm_atomic_helper_shutdown(dev); >>> drm_kms_helper_poll_fini(dev); >>> - if (fsl_dev->fbdev) >>> - drm_fbdev_cma_fini(fsl_dev->fbdev); >>> - >>> drm_mode_config_cleanup(dev); >>> drm_irq_uninstall(dev); >>> @@ -147,19 +134,11 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg) >>> return IRQ_HANDLED; >>> } >>> -static void fsl_dcu_drm_lastclose(struct drm_device *dev) >>> -{ >>> - struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; >>> - >>> - drm_fbdev_cma_restore_mode(fsl_dev->fbdev); >>> -} >>> - >>> DEFINE_DRM_GEM_CMA_FOPS(fsl_dcu_drm_fops); >>> static struct drm_driver fsl_dcu_drm_driver = { >>> .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET >>> | DRIVER_PRIME | DRIVER_ATOMIC, >>> - .lastclose = fsl_dcu_drm_lastclose, >>> .load = fsl_dcu_load, >>> .unload = fsl_dcu_unload, >>> .irq_handler = fsl_dcu_drm_irq, >>> @@ -355,6 +334,8 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev) >>> if (ret < 0) >>> goto unref; >>> + drm_fbdev_generic_setup(drm, legacyfb_depth); >>> + >>> return 0; >>> unref: >>> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h >>> b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h >>> index 93bfb98012d4..cb87bb74cb87 100644 >>> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h >>> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h >>> @@ -191,7 +191,6 @@ struct fsl_dcu_drm_device { >>> /*protects hardware register*/ >>> spinlock_t irq_lock; >>> struct drm_device *drm; >>> - struct drm_fbdev_cma *fbdev; >>> struct drm_crtc crtc; >>> struct drm_encoder encoder; >>> struct fsl_dcu_drm_connector connector; _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel