A fix for vc4 to address a memory leak when allocating a buffer, a

Kconfig fix for panfrost and two fixes for i915 and fb-helper to
 address some bugs with vga-switcheroo.
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCY8j9NQAKCRDj7w1vZxhR
 xYDhAP4mPeqkQWEcKD0KOxd+vG3khWTcB8BrHS8gJfxZgDVUxQEA5hsRluQ9MsNV
 o1Q/qYvpAJzNYKJiPkff/SCOuy8JpQE=
 =1LL3
 -----END PGP SIGNATURE-----

Merge tag 'drm-misc-fixes-2023-01-19' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

A fix for vc4 to address a memory leak when allocating a buffer, a
Kconfig fix for panfrost and two fixes for i915 and fb-helper to
address some bugs with vga-switcheroo.

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20230119082059.h32bs7zqoxmjbcvn@houat
This commit is contained in:
Dave Airlie 2023-01-20 11:17:11 +10:00
commit 6bb517df54
5 changed files with 17 additions and 10 deletions

View File

@ -30,7 +30,9 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/console.h> #include <linux/console.h>
#include <linux/pci.h>
#include <linux/sysrq.h> #include <linux/sysrq.h>
#include <linux/vga_switcheroo.h>
#include <drm/drm_atomic.h> #include <drm/drm_atomic.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
@ -1909,6 +1911,11 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
return ret; return ret;
strcpy(fb_helper->fb->comm, "[fbcon]"); strcpy(fb_helper->fb->comm, "[fbcon]");
/* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */
if (dev_is_pci(dev->dev))
vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info);
return 0; return 0;
} }

View File

@ -1069,11 +1069,8 @@ static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
*/ */
static void i915_driver_lastclose(struct drm_device *dev) static void i915_driver_lastclose(struct drm_device *dev)
{ {
struct drm_i915_private *i915 = to_i915(dev);
intel_fbdev_restore_mode(dev); intel_fbdev_restore_mode(dev);
if (HAS_DISPLAY(i915))
vga_switcheroo_process_delayed_switch(); vga_switcheroo_process_delayed_switch();
} }

View File

@ -19,6 +19,10 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev,
dev_err(&pdev->dev, "DRM not initialized, aborting switch.\n"); dev_err(&pdev->dev, "DRM not initialized, aborting switch.\n");
return; return;
} }
if (!HAS_DISPLAY(i915)) {
dev_err(&pdev->dev, "Device state not initialized, aborting switch.\n");
return;
}
if (state == VGA_SWITCHEROO_ON) { if (state == VGA_SWITCHEROO_ON) {
drm_info(&i915->drm, "switched on\n"); drm_info(&i915->drm, "switched on\n");
@ -44,7 +48,7 @@ static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
* locking inversion with the driver load path. And the access here is * locking inversion with the driver load path. And the access here is
* completely racy anyway. So don't bother with locking for now. * completely racy anyway. So don't bother with locking for now.
*/ */
return i915 && atomic_read(&i915->drm.open_count) == 0; return i915 && HAS_DISPLAY(i915) && atomic_read(&i915->drm.open_count) == 0;
} }
static const struct vga_switcheroo_client_ops i915_switcheroo_ops = { static const struct vga_switcheroo_client_ops i915_switcheroo_ops = {

View File

@ -3,7 +3,8 @@
config DRM_PANFROST config DRM_PANFROST
tristate "Panfrost (DRM support for ARM Mali Midgard/Bifrost GPUs)" tristate "Panfrost (DRM support for ARM Mali Midgard/Bifrost GPUs)"
depends on DRM depends on DRM
depends on ARM || ARM64 || (COMPILE_TEST && !GENERIC_ATOMIC64) depends on ARM || ARM64 || COMPILE_TEST
depends on !GENERIC_ATOMIC64 # for IOMMU_IO_PGTABLE_LPAE
depends on MMU depends on MMU
select DRM_SCHED select DRM_SCHED
select IOMMU_SUPPORT select IOMMU_SUPPORT

View File

@ -179,6 +179,7 @@ static void vc4_bo_destroy(struct vc4_bo *bo)
bo->validated_shader = NULL; bo->validated_shader = NULL;
} }
mutex_destroy(&bo->madv_lock);
drm_gem_dma_free(&bo->base); drm_gem_dma_free(&bo->base);
} }
@ -394,7 +395,6 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
{ {
struct vc4_dev *vc4 = to_vc4_dev(dev); struct vc4_dev *vc4 = to_vc4_dev(dev);
struct vc4_bo *bo; struct vc4_bo *bo;
int ret;
if (WARN_ON_ONCE(vc4->is_vc5)) if (WARN_ON_ONCE(vc4->is_vc5))
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
@ -406,9 +406,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
bo->madv = VC4_MADV_WILLNEED; bo->madv = VC4_MADV_WILLNEED;
refcount_set(&bo->usecnt, 0); refcount_set(&bo->usecnt, 0);
ret = drmm_mutex_init(dev, &bo->madv_lock); mutex_init(&bo->madv_lock);
if (ret)
return ERR_PTR(ret);
mutex_lock(&vc4->bo_lock); mutex_lock(&vc4->bo_lock);
bo->label = VC4_BO_TYPE_KERNEL; bo->label = VC4_BO_TYPE_KERNEL;