On 28.09.2018 16:57, Noralf Trønnes wrote: > Den 28.09.2018 16.11, skrev Stefan Agner: >> 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... > > Yep, this is the callchain: > > drm_fbdev_generic_setup() > -> drm_fbdev_client_hotplug() > -> drm_fb_helper_fbdev_setup() > > The benefit of having setup in the hotplug callback is that now fbdev is > supported in the case where there are no connectors at driver load. > Oh ok, I see. Then, this patch looks good for me: Acked-by: Stefan Agner <stefan@xxxxxxxx> -- Stefan > Noralf. > >> -- >> 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