drivers/gpu/drm/openchrome/openchrome_crtc.c | 64 ++++++++---- drivers/gpu/drm/openchrome/openchrome_display.c | 26 ++++ drivers/gpu/drm/openchrome/openchrome_drv.c | 128 ++++++++---------------- drivers/gpu/drm/openchrome/openchrome_drv.h | 11 +- drivers/gpu/drm/openchrome/openchrome_init.c | 68 ++++++++++++ 5 files changed, 189 insertions(+), 108 deletions(-)
New commits: commit 808eafb07ed3e7a5115982621435b463272d5c90 Author: Kevin Brace <kevinbr...@gmx.com> Date: Mon Sep 14 18:17:09 2020 -0700 drm/openchrome: Version bumped to 3.3.7 Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h index 09d97e97027e..1969f541d860 100644 --- a/drivers/gpu/drm/openchrome/openchrome_drv.h +++ b/drivers/gpu/drm/openchrome/openchrome_drv.h @@ -61,7 +61,7 @@ #define DRIVER_MAJOR 3 #define DRIVER_MINOR 3 -#define DRIVER_PATCHLEVEL 6 +#define DRIVER_PATCHLEVEL 7 #define DRIVER_NAME "openchrome" #define DRIVER_DESC "OpenChrome DRM for VIA Technologies Chrome IGP" #define DRIVER_DATE "20200914" commit f6890fe77c160a23c19797b75011ef126e72bfc4 Author: Kevin Brace <kevinbr...@gmx.com> Date: Mon Sep 14 17:33:11 2020 -0700 drm/openchrome: Migrate to using probe() callback for initialization This discontinues the use of load() / unload() callbacks of drm_driver struct. This is a long overdue change to the code. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.c b/drivers/gpu/drm/openchrome/openchrome_drv.c index a415d629d915..7a106b50f572 100644 --- a/drivers/gpu/drm/openchrome/openchrome_drv.c +++ b/drivers/gpu/drm/openchrome/openchrome_drv.c @@ -46,6 +46,33 @@ static struct pci_device_id via_pci_table[] = { }; MODULE_DEVICE_TABLE(pci, via_pci_table); +static int openchrome_drm_driver_open(struct drm_device *dev, + struct drm_file *file_priv) +{ + int ret = 0; + + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + DRM_DEBUG_KMS("Exiting %s.\n", __func__); + return ret; +} + +static void openchrome_drm_driver_postclose(struct drm_device *dev, + struct drm_file *file_priv) +{ + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + DRM_DEBUG_KMS("Exiting %s.\n", __func__); +} + +static void openchrome_drm_driver_lastclose(struct drm_device *dev) +{ + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + drm_fb_helper_lastclose(dev); + + DRM_DEBUG_KMS("Exiting %s.\n", __func__); +} static int openchrome_drm_driver_dumb_create( struct drm_file *file_priv, @@ -118,82 +145,6 @@ exit: return ret; } -static void openchrome_driver_unload(struct drm_device *dev) -{ - struct openchrome_drm_private *dev_private = dev->dev_private; - - DRM_DEBUG_KMS("Entered %s.\n", __func__); - - via_modeset_fini(dev); - - openchrome_mm_fini(dev_private); - openchrome_device_fini(dev_private); - - kfree(dev_private); - - DRM_DEBUG_KMS("Exiting %s.\n", __func__); - return; -} - -static int openchrome_driver_load(struct drm_device *dev, - unsigned long chipset) -{ - struct openchrome_drm_private *dev_private; - int ret = 0; - - DRM_DEBUG_KMS("Entered %s.\n", __func__); - - dev_private = kzalloc(sizeof(struct openchrome_drm_private), - GFP_KERNEL); - if (!dev_private) { - ret = -ENOMEM; - DRM_ERROR("Failed to allocate private " - "storage memory.\n"); - goto exit; - } - - dev->dev_private = (void *) dev_private; - dev_private->vram_mtrr = -ENXIO; - dev_private->dev = dev; - - ret = openchrome_device_init(dev_private); - if (ret) { - DRM_ERROR("Failed to initialize Chrome IGP.\n"); - goto init_error; - } - - ret = openchrome_mm_init(dev_private); - if (ret) { - DRM_ERROR("Failed to initialize TTM.\n"); - goto init_error; - } - - chip_revision_info(dev_private); - - ret = via_modeset_init(dev); - if (ret) { - DRM_ERROR("Failed to initialize mode setting.\n"); - goto init_error; - } - - goto exit; -init_error: - if (ret) - openchrome_driver_unload(dev); -exit: - DRM_DEBUG_KMS("Exiting %s.\n", __func__); - return ret; -} - -static void openchrome_driver_lastclose(struct drm_device *dev) -{ - DRM_DEBUG_KMS("Entered %s.\n", __func__); - - dev->mode_config.funcs->output_poll_changed(dev); - - DRM_DEBUG_KMS("Exiting %s.\n", __func__); -} - static int openchrome_drm_mmap(struct file *filp, struct vm_area_struct *vma) { struct drm_file *file_priv = filp->private_data; @@ -230,13 +181,13 @@ static const struct file_operations via_driver_fops = { .llseek = noop_llseek, }; -static struct drm_driver via_driver = { +static struct drm_driver openchrome_driver = { .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET, - .load = openchrome_driver_load, - .unload = openchrome_driver_unload, - .lastclose = openchrome_driver_lastclose, + .open = openchrome_drm_driver_open, + .postclose = openchrome_drm_driver_postclose, + .lastclose = openchrome_drm_driver_lastclose, .dumb_create = openchrome_drm_driver_dumb_create, .dumb_map_offset = openchrome_drm_driver_dumb_map_offset, @@ -258,20 +209,28 @@ static int openchrome_pci_probe(struct pci_dev *pdev, DRM_DEBUG_KMS("Entered %s.\n", __func__); + ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, + "openchromedrmfb"); + if (ret) { + goto exit; + } + ret = pci_enable_device(pdev); if (ret) { goto exit; } - dev = drm_dev_alloc(&via_driver, &pdev->dev); + dev = drm_dev_alloc(&openchrome_driver, &pdev->dev); if (IS_ERR(dev)) { ret = PTR_ERR(dev); - goto err_pci_disable_device; + goto error_disable_pci; } dev->pdev = pdev; pci_set_drvdata(pdev, dev); + ret = openchrome_drm_init(dev); + ret = drm_dev_register(dev, ent->driver_data); if (ret) { goto err_drm_dev_put; @@ -280,7 +239,7 @@ static int openchrome_pci_probe(struct pci_dev *pdev, goto exit; err_drm_dev_put: drm_dev_put(dev); -err_pci_disable_device: +error_disable_pci: pci_disable_device(pdev); exit: DRM_DEBUG_KMS("Exiting %s.\n", __func__); @@ -293,6 +252,7 @@ static void openchrome_pci_remove(struct pci_dev *pdev) DRM_DEBUG_KMS("Entered %s.\n", __func__); + openchrome_drm_fini(dev); drm_dev_unregister(dev); drm_dev_put(dev); @@ -313,7 +273,7 @@ static int __init openchrome_init(void) DRM_DEBUG_KMS("Entered %s.\n", __func__); - via_driver.num_ioctls = openchrome_max_ioctl; + openchrome_driver.num_ioctls = openchrome_max_ioctl; ret = pci_register_driver(&via_pci_driver); diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h index 31e5d040ed10..09d97e97027e 100644 --- a/drivers/gpu/drm/openchrome/openchrome_drv.h +++ b/drivers/gpu/drm/openchrome/openchrome_drv.h @@ -386,6 +386,8 @@ void openchrome_graphics_unlock( void chip_revision_info(struct openchrome_drm_private *dev_private); int openchrome_device_init(struct openchrome_drm_private *dev_private); void openchrome_device_fini(struct openchrome_drm_private *dev_private); +int openchrome_drm_init(struct drm_device *dev); +void openchrome_drm_fini(struct drm_device *dev); int openchrome_dev_pm_ops_suspend(struct device *dev); int openchrome_dev_pm_ops_resume(struct device *dev); diff --git a/drivers/gpu/drm/openchrome/openchrome_init.c b/drivers/gpu/drm/openchrome/openchrome_init.c index e0432595eda1..5b1a8ae23f80 100644 --- a/drivers/gpu/drm/openchrome/openchrome_init.c +++ b/drivers/gpu/drm/openchrome/openchrome_init.c @@ -1241,3 +1241,71 @@ void openchrome_device_fini(struct openchrome_drm_private *dev_private) DRM_DEBUG_KMS("Exiting %s.\n", __func__); } + +int openchrome_drm_init(struct drm_device *dev) +{ + struct openchrome_drm_private *dev_private; + int ret = 0; + + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + dev_private = kzalloc(sizeof(struct openchrome_drm_private), + GFP_KERNEL); + if (!dev_private) { + ret = -ENOMEM; + DRM_ERROR("Failed to allocate private " + "storage memory.\n"); + goto exit; + } + + dev->dev_private = (void *) dev_private; + dev_private->dev = dev; + dev_private->vram_mtrr = -ENXIO; + + ret = openchrome_device_init(dev_private); + if (ret) { + DRM_ERROR("Failed to initialize Chrome IGP.\n"); + goto error_free_private; + } + + ret = openchrome_mm_init(dev_private); + if (ret) { + DRM_ERROR("Failed to initialize TTM.\n"); + goto error_free_private; + } + + chip_revision_info(dev_private); + + ret = via_modeset_init(dev); + if (ret) { + DRM_ERROR("Failed to initialize mode setting.\n"); + goto error_modeset; + } + + goto exit; +error_modeset: + via_modeset_fini(dev); + openchrome_mm_fini(dev_private); + openchrome_mmio_fini(dev_private); + openchrome_vram_fini(dev_private); +error_free_private: + kfree(dev_private); +exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); + return ret; +} + +void openchrome_drm_fini(struct drm_device *dev) +{ + struct openchrome_drm_private *dev_private = dev->dev_private; + + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + via_modeset_fini(dev); + openchrome_mm_fini(dev_private); + openchrome_mmio_fini(dev_private); + openchrome_vram_fini(dev_private); + kfree(dev_private); + + DRM_DEBUG_KMS("Exiting %s.\n", __func__); +} commit e3a26f777b06e0d8a02868cbd2916484b51da940 Author: Kevin Brace <kevinbr...@gmx.com> Date: Mon Sep 14 16:54:50 2020 -0700 drm/openchrome: Initialize plane and crtc separately Also, improve the error condition handling. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/openchrome_crtc.c b/drivers/gpu/drm/openchrome/openchrome_crtc.c index b35fa2d1fd22..e42b98f906fe 100644 --- a/drivers/gpu/drm/openchrome/openchrome_crtc.c +++ b/drivers/gpu/drm/openchrome/openchrome_crtc.c @@ -2239,17 +2239,23 @@ static const uint32_t openchrome_primary_formats[] = { DRM_FORMAT_RGB332, }; -int openchrome_crtc_init(struct openchrome_drm_private *dev_private, - uint32_t index) +int openchrome_plane_init(struct openchrome_drm_private *dev_private, + struct drm_plane **p_primary, + struct drm_plane **p_cursor) { struct drm_device *dev = dev_private->dev; - struct via_crtc *iga; - struct drm_plane *primary; - struct drm_plane *cursor; + struct drm_plane *primary = NULL; + struct drm_plane *cursor = NULL; uint32_t possible_crtcs; + uint32_t i; int ret; - possible_crtcs = 1 << index; + DRM_DEBUG_KMS("Entered %s.\n", __func__); + + possible_crtcs = 0; + for (i = 0; i < OPENCHROME_MAX_CRTC; i++) { + possible_crtcs |= 1 << i; + } primary = kzalloc(sizeof(struct drm_plane), GFP_KERNEL); if (!primary) { @@ -2287,15 +2293,43 @@ int openchrome_crtc_init(struct openchrome_drm_private *dev_private, goto free_cursor; } + goto exit; +free_cursor: + kfree(cursor); + cursor = NULL; +cleanup_primary: + drm_plane_cleanup(primary); +free_primary: + kfree(primary); + primary = NULL; +exit: + *p_primary = primary; + *p_cursor = cursor; + + DRM_DEBUG_KMS("Exiting %s.\n", __func__); + return ret; +} + +int openchrome_crtc_init(struct openchrome_drm_private *dev_private, + struct drm_plane *primary, + struct drm_plane *cursor, + uint32_t i) +{ + struct drm_device *dev = dev_private->dev; + struct via_crtc *iga; + int ret; + + DRM_DEBUG_KMS("Entered %s.\n", __func__); + iga = kzalloc(sizeof(struct via_crtc), GFP_KERNEL); if (!iga) { ret = -ENOMEM; DRM_ERROR("Failed to allocate CRTC storage.\n"); - goto cleanup_cursor; + goto exit; } drm_crtc_helper_add(&iga->base, - &openchrome_drm_crtc_helper_funcs); + &openchrome_drm_crtc_helper_funcs); ret = drm_crtc_init_with_planes(dev, &iga->base, primary, cursor, &openchrome_drm_crtc_funcs, @@ -2305,20 +2339,12 @@ int openchrome_crtc_init(struct openchrome_drm_private *dev_private, goto free_crtc; } - iga->index = index; - - openchrome_crtc_param_init(dev_private, &iga->base, index); + iga->index = i; + openchrome_crtc_param_init(dev_private, &iga->base, i); goto exit; free_crtc: kfree(iga); -cleanup_cursor: - drm_plane_cleanup(cursor); -free_cursor: - kfree(cursor); -cleanup_primary: - drm_plane_cleanup(primary); -free_primary: - kfree(primary); exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); return ret; } diff --git a/drivers/gpu/drm/openchrome/openchrome_display.c b/drivers/gpu/drm/openchrome/openchrome_display.c index 63cee530bc45..9b91fd091282 100644 --- a/drivers/gpu/drm/openchrome/openchrome_display.c +++ b/drivers/gpu/drm/openchrome/openchrome_display.c @@ -460,9 +460,13 @@ int via_modeset_init(struct drm_device *dev) { struct openchrome_drm_private *dev_private = dev->dev_private; + struct drm_plane *primary; + struct drm_plane *cursor; uint32_t i; int ret = 0; + DRM_DEBUG_KMS("Entered %s.\n", __func__); + openchrome_mode_config_init(dev_private); /* Initialize the number of display connectors. */ @@ -474,10 +478,20 @@ via_modeset_init(struct drm_device *dev) via_i2c_init(dev); via_hwcursor_init(dev_private); + ret = openchrome_plane_init(dev_private, &primary, &cursor); + if (ret) { + DRM_ERROR("Failed to initialize planes!\n"); + goto free_i2c; + } + for (i = 0; i < OPENCHROME_MAX_CRTC; i++) { - ret = openchrome_crtc_init(dev_private, i); + ret = openchrome_crtc_init(dev_private, + primary, + cursor, + i); if (ret) { - goto exit; + DRM_ERROR("Failed to initialize CRTC!\n"); + goto free_crtc; } } @@ -507,11 +521,17 @@ via_modeset_init(struct drm_device *dev) /* Initialize the frame buffer device. */ ret = via_fbdev_init(dev); if (ret) { - goto exit; + goto free_crtc; } drm_kms_helper_poll_init(dev); + goto exit; +free_crtc: + drm_mode_config_cleanup(dev); +free_i2c: + via_i2c_exit(); exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); return ret; } diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h b/drivers/gpu/drm/openchrome/openchrome_drv.h index 641166eed88b..31e5d040ed10 100644 --- a/drivers/gpu/drm/openchrome/openchrome_drv.h +++ b/drivers/gpu/drm/openchrome/openchrome_drv.h @@ -451,8 +451,13 @@ extern void via_fbdev_fini(struct drm_device *dev); /* crtc */ extern void via_load_crtc_pixel_timing(struct drm_crtc *crtc, struct drm_display_mode *mode); +int openchrome_plane_init(struct openchrome_drm_private *dev_private, + struct drm_plane **p_primary, + struct drm_plane **p_cursor); int openchrome_crtc_init(struct openchrome_drm_private *dev_private, - uint32_t index); + struct drm_plane *primary, + struct drm_plane *cursor, + uint32_t i); /* encoders */ extern void via_set_sync_polarity(struct drm_encoder *encoder, _______________________________________________ openchrome-devel mailing list openchrome-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/openchrome-devel