mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-19 20:00:50 +00:00
Multiple fixes to fbdev to address a regression at unregistration, an
iommu detection improvement for nouveau, a memory leak fix for nouveau, pointer dereference fix for dma_buf_file_release(), and a build breakage fix for vc4 -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCYn4I8QAKCRDj7w1vZxhR xTQqAQCERNogpvxEuKGk1643nNiPtDLbYcwJMifqa7sQIQk13AD9EKR9oV+JyIZj 2tS06uFF1qWQeXAgS8wGToirZ2E3Fgo= =a0hl -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2022-05-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes Multiple fixes to fbdev to address a regression at unregistration, an iommu detection improvement for nouveau, a memory leak fix for nouveau, pointer dereference fix for dma_buf_file_release(), and a build breakage fix for vc4 Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20220513073044.ymayac7x7bzatrt7@houat
This commit is contained in:
commit
eb7bac3973
@ -543,10 +543,6 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
||||
file->f_mode |= FMODE_LSEEK;
|
||||
dmabuf->file = file;
|
||||
|
||||
ret = dma_buf_stats_setup(dmabuf);
|
||||
if (ret)
|
||||
goto err_sysfs;
|
||||
|
||||
mutex_init(&dmabuf->lock);
|
||||
INIT_LIST_HEAD(&dmabuf->attachments);
|
||||
|
||||
@ -554,6 +550,10 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
||||
list_add(&dmabuf->list_node, &db_list.head);
|
||||
mutex_unlock(&db_list.lock);
|
||||
|
||||
ret = dma_buf_stats_setup(dmabuf);
|
||||
if (ret)
|
||||
goto err_sysfs;
|
||||
|
||||
return dmabuf;
|
||||
|
||||
err_sysfs:
|
||||
|
@ -46,8 +46,9 @@ static bool
|
||||
nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE],
|
||||
struct nouveau_backlight *bl)
|
||||
{
|
||||
const int nb = ida_simple_get(&bl_ida, 0, 0, GFP_KERNEL);
|
||||
if (nb < 0 || nb >= 100)
|
||||
const int nb = ida_alloc_max(&bl_ida, 99, GFP_KERNEL);
|
||||
|
||||
if (nb < 0)
|
||||
return false;
|
||||
if (nb > 0)
|
||||
snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb);
|
||||
@ -414,7 +415,7 @@ nouveau_backlight_init(struct drm_connector *connector)
|
||||
nv_encoder, ops, &props);
|
||||
if (IS_ERR(bl->dev)) {
|
||||
if (bl->id >= 0)
|
||||
ida_simple_remove(&bl_ida, bl->id);
|
||||
ida_free(&bl_ida, bl->id);
|
||||
ret = PTR_ERR(bl->dev);
|
||||
goto fail_alloc;
|
||||
}
|
||||
@ -442,7 +443,7 @@ nouveau_backlight_fini(struct drm_connector *connector)
|
||||
return;
|
||||
|
||||
if (bl->id >= 0)
|
||||
ida_simple_remove(&bl_ida, bl->id);
|
||||
ida_free(&bl_ida, bl->id);
|
||||
|
||||
backlight_device_unregister(bl->dev);
|
||||
nv_conn->backlight = NULL;
|
||||
|
@ -123,7 +123,7 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
|
||||
|
||||
mutex_init(&tdev->iommu.mutex);
|
||||
|
||||
if (iommu_present(&platform_bus_type)) {
|
||||
if (device_iommu_mapped(dev)) {
|
||||
tdev->iommu.domain = iommu_domain_alloc(&platform_bus_type);
|
||||
if (!tdev->iommu.domain)
|
||||
goto error;
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <drm/drm_scdc_helper.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/component.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
@ -1434,10 +1434,7 @@ fb_release(struct inode *inode, struct file *file)
|
||||
__acquires(&info->lock)
|
||||
__releases(&info->lock)
|
||||
{
|
||||
struct fb_info * const info = file_fb_info(file);
|
||||
|
||||
if (!info)
|
||||
return -ENODEV;
|
||||
struct fb_info * const info = file->private_data;
|
||||
|
||||
lock_fb_info(info);
|
||||
if (info->fbops->fb_release)
|
||||
|
@ -80,6 +80,10 @@ void framebuffer_release(struct fb_info *info)
|
||||
{
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
if (WARN_ON(refcount_read(&info->count)))
|
||||
return;
|
||||
|
||||
kfree(info->apertures);
|
||||
kfree(info);
|
||||
}
|
||||
|
@ -243,6 +243,10 @@ error:
|
||||
static inline void efifb_show_boot_graphics(struct fb_info *info) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* fb_ops.fb_destroy is called by the last put_fb_info() call at the end
|
||||
* of unregister_framebuffer() or fb_release(). Do any cleanup here.
|
||||
*/
|
||||
static void efifb_destroy(struct fb_info *info)
|
||||
{
|
||||
if (efifb_pci_dev)
|
||||
@ -254,10 +258,13 @@ static void efifb_destroy(struct fb_info *info)
|
||||
else
|
||||
memunmap(info->screen_base);
|
||||
}
|
||||
|
||||
if (request_mem_succeeded)
|
||||
release_mem_region(info->apertures->ranges[0].base,
|
||||
info->apertures->ranges[0].size);
|
||||
fb_dealloc_cmap(&info->cmap);
|
||||
|
||||
framebuffer_release(info);
|
||||
}
|
||||
|
||||
static const struct fb_ops efifb_ops = {
|
||||
@ -620,9 +627,9 @@ static int efifb_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct fb_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
/* efifb_destroy takes care of info cleanup */
|
||||
unregister_framebuffer(info);
|
||||
sysfs_remove_groups(&pdev->dev.kobj, efifb_groups);
|
||||
framebuffer_release(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -84,6 +84,10 @@ struct simplefb_par {
|
||||
static void simplefb_clocks_destroy(struct simplefb_par *par);
|
||||
static void simplefb_regulators_destroy(struct simplefb_par *par);
|
||||
|
||||
/*
|
||||
* fb_ops.fb_destroy is called by the last put_fb_info() call at the end
|
||||
* of unregister_framebuffer() or fb_release(). Do any cleanup here.
|
||||
*/
|
||||
static void simplefb_destroy(struct fb_info *info)
|
||||
{
|
||||
struct simplefb_par *par = info->par;
|
||||
@ -94,6 +98,8 @@ static void simplefb_destroy(struct fb_info *info)
|
||||
if (info->screen_base)
|
||||
iounmap(info->screen_base);
|
||||
|
||||
framebuffer_release(info);
|
||||
|
||||
if (mem)
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
}
|
||||
@ -545,8 +551,8 @@ static int simplefb_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct fb_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
/* simplefb_destroy takes care of info cleanup */
|
||||
unregister_framebuffer(info);
|
||||
framebuffer_release(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -179,6 +179,10 @@ static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* fb_ops.fb_destroy is called by the last put_fb_info() call at the end
|
||||
* of unregister_framebuffer() or fb_release(). Do any cleanup here.
|
||||
*/
|
||||
static void vesafb_destroy(struct fb_info *info)
|
||||
{
|
||||
struct vesafb_par *par = info->par;
|
||||
@ -188,6 +192,8 @@ static void vesafb_destroy(struct fb_info *info)
|
||||
if (info->screen_base)
|
||||
iounmap(info->screen_base);
|
||||
release_mem_region(info->apertures->ranges[0].base, info->apertures->ranges[0].size);
|
||||
|
||||
framebuffer_release(info);
|
||||
}
|
||||
|
||||
static struct fb_ops vesafb_ops = {
|
||||
@ -484,10 +490,10 @@ static int vesafb_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct fb_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
/* vesafb_destroy takes care of info cleanup */
|
||||
unregister_framebuffer(info);
|
||||
if (((struct vesafb_par *)(info->par))->region)
|
||||
release_region(0x3c0, 32);
|
||||
framebuffer_release(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user