Merge tag 'drm-misc-next-2017-10-05' of git://anongit.freedesktop.org/git/drm-misc into drm-next
More drm-misc for 4.15: Cross-subsystem Changes: - bunch more simple outreachy patches (Meghana Madhyastha, Aishwarya Pant, Haneen Mohammed) - Quite a pile of static checker/cocci/spelling fixups all over. - Final driver patches+core cleanup of Noralf's new drm_gem_fb_create helper. Core Changes: - legacy DPMS docs improved - add dri-devel m-l to fbdev to catch people who try to fix fbcon-on-kms bugs in the wrong place Driver Changes: - vc4: prep for dsi panels (Eric) * tag 'drm-misc-next-2017-10-05' of git://anongit.freedesktop.org/git/drm-misc: (34 commits) drm: fix typo in drm_gem_get_pages() comment MAINTAINERS: Add dri-devel as a mailing list for anything fbdev drm/virtio: Replace instances of reference/unreference with get/put drm/fb-cma-helper: Remove unused functions drm/tve200: Use drm_gem_fb_create() and drm_gem_fb_prepare_fb() drm/sun4i: Use drm_gem_fb_create() drm/shmobile: Use drm_gem_fb_create() drm/rcar-du: Use drm_gem_fb_create() drm/mxsfb: Use drm_gem_fb_create() and drm_gem_fb_prepare_fb() drm/meson: Use drm_gem_fb_create() drm/hisilicon/kirin: Use drm_gem_fb_create() drm/fsl-dcu: Use drm_gem_fb_create() drm/tinydrm: Use drm_gem_framebuffer_helper drm: of: always initialize panel in drm_of_find_panel_or_bridge() drm/tve200: Check for IS_ERR instead of NULL in probe drm/tve200: make two functions static drm/armada: Remove unused #include <drmP.h> drm/rockchip: Rely on the default best_encoder() behavior drm/vc4: Set up the DSI host at pdev probe time, not component bind. drm/vc4: Avoid using vrefresh==0 mode in DSI htotal math. ...
This commit is contained in:
commit
15438ab065
|
@ -184,12 +184,6 @@ Contact: Sean Paul, Maintainer of the driver you plan to convert
|
|||
Core refactorings
|
||||
=================
|
||||
|
||||
Use new IDR deletion interface to clean up drm_gem_handle_delete()
|
||||
------------------------------------------------------------------
|
||||
|
||||
See the "This is gross" comment -- apparently the IDR system now can return an
|
||||
error code instead of oopsing.
|
||||
|
||||
Clean up the DRM header mess
|
||||
----------------------------
|
||||
|
||||
|
@ -357,7 +351,16 @@ those drivers as simple as possible, so lots of room for refactoring:
|
|||
- backlight helpers, probably best to put them into a new drm_backlight.c.
|
||||
This is because drivers/video is de-facto unmaintained. We could also
|
||||
move drivers/video/backlight to drivers/gpu/backlight and take it all
|
||||
over within drm-misc, but that's more work.
|
||||
over within drm-misc, but that's more work. Backlight helpers require a fair
|
||||
bit of reworking and refactoring. A simple example is the enabling of a backlight.
|
||||
Tinydrm has helpers for this. It would be good if other drivers can also use the
|
||||
helper. However, there are various cases we need to consider i.e different
|
||||
drivers seem to have different ways of enabling/disabling a backlight.
|
||||
We also need to consider the backlight drivers (like gpio_backlight). The situation
|
||||
is further complicated by the fact that the backlight is tied to fbdev
|
||||
via fb_notifier_callback() which has complicated logic. For further details, refer
|
||||
to the following discussion thread:
|
||||
https://groups.google.com/forum/#!topic/outreachy-kernel/8rBe30lwtdA
|
||||
|
||||
- spi helpers, probably best put into spi core/helper code. Thierry said
|
||||
the spi maintainer is fast&reactive, so shouldn't be a big issue.
|
||||
|
|
|
@ -5461,6 +5461,7 @@ F: drivers/net/wan/sdla.c
|
|||
|
||||
FRAMEBUFFER LAYER
|
||||
M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
T: git git://github.com/bzolnier/linux.git
|
||||
Q: http://patchwork.kernel.org/project/linux-fbdev/list/
|
||||
|
|
|
@ -625,7 +625,7 @@ EXPORT_SYMBOL_GPL(dma_buf_detach);
|
|||
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
struct sg_table *sg_table = ERR_PTR(-EINVAL);
|
||||
struct sg_table *sg_table;
|
||||
|
||||
might_sleep();
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
*/
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include "armada_crtc.h"
|
||||
#include "armada_drm.h"
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
#include <linux/component.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include "armada_crtc.h"
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include "armada_drm.h"
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include "armada_crtc.h"
|
||||
#include "armada_drm.h"
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include <linux/dma-buf.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <drm/drmP.h>
|
||||
#include "armada_drm.h"
|
||||
#include "armada_gem.h"
|
||||
#include <drm/armada_drm.h>
|
||||
|
|
|
@ -70,7 +70,6 @@ int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_agp_info);
|
||||
|
||||
int drm_agp_info_ioctl(struct drm_device *dev, void *data,
|
||||
|
@ -95,18 +94,18 @@ int drm_agp_info_ioctl(struct drm_device *dev, void *data,
|
|||
* Verifies the AGP device hasn't been acquired before and calls
|
||||
* \c agp_backend_acquire.
|
||||
*/
|
||||
int drm_agp_acquire(struct drm_device * dev)
|
||||
int drm_agp_acquire(struct drm_device *dev)
|
||||
{
|
||||
if (!dev->agp)
|
||||
return -ENODEV;
|
||||
if (dev->agp->acquired)
|
||||
return -EBUSY;
|
||||
if (!(dev->agp->bridge = agp_backend_acquire(dev->pdev)))
|
||||
dev->agp->bridge = agp_backend_acquire(dev->pdev);
|
||||
if (!dev->agp->bridge)
|
||||
return -ENODEV;
|
||||
dev->agp->acquired = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_agp_acquire);
|
||||
|
||||
/**
|
||||
|
@ -135,7 +134,7 @@ int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
|
|||
*
|
||||
* Verifies the AGP device has been acquired and calls \c agp_backend_release.
|
||||
*/
|
||||
int drm_agp_release(struct drm_device * dev)
|
||||
int drm_agp_release(struct drm_device *dev)
|
||||
{
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
|
@ -161,7 +160,7 @@ int drm_agp_release_ioctl(struct drm_device *dev, void *data,
|
|||
* Verifies the AGP device has been acquired but not enabled, and calls
|
||||
* \c agp_enable.
|
||||
*/
|
||||
int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode)
|
||||
int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode)
|
||||
{
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
|
@ -171,7 +170,6 @@ int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode)
|
|||
dev->agp->enabled = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_agp_enable);
|
||||
|
||||
int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
|
||||
|
@ -203,12 +201,14 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
|
|||
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
if (!(entry = kzalloc(sizeof(*entry), GFP_KERNEL)))
|
||||
entry = kzalloc(sizeof(*entry), GFP_KERNEL);
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
|
||||
pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
type = (u32) request->type;
|
||||
if (!(memory = agp_allocate_memory(dev->agp->bridge, pages, type))) {
|
||||
memory = agp_allocate_memory(dev->agp->bridge, pages, type);
|
||||
if (!memory) {
|
||||
kfree(entry);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -244,8 +244,8 @@ int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
|
|||
*
|
||||
* Walks through drm_agp_head::memory until finding a matching handle.
|
||||
*/
|
||||
static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device * dev,
|
||||
unsigned long handle)
|
||||
static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device *dev,
|
||||
unsigned long handle)
|
||||
{
|
||||
struct drm_agp_mem *entry;
|
||||
|
||||
|
@ -275,9 +275,8 @@ int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request)
|
|||
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
|
||||
return -EINVAL;
|
||||
if (!entry->bound)
|
||||
entry = drm_agp_lookup_entry(dev, request->handle);
|
||||
if (!entry || !entry->bound)
|
||||
return -EINVAL;
|
||||
ret = drm_unbind_agp(entry->memory);
|
||||
if (ret == 0)
|
||||
|
@ -316,12 +315,12 @@ int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request)
|
|||
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
|
||||
return -EINVAL;
|
||||
if (entry->bound)
|
||||
entry = drm_agp_lookup_entry(dev, request->handle);
|
||||
if (!entry || entry->bound)
|
||||
return -EINVAL;
|
||||
page = (request->offset + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
if ((retcode = drm_bind_agp(entry->memory, page)))
|
||||
retcode = drm_bind_agp(entry->memory, page);
|
||||
if (retcode)
|
||||
return retcode;
|
||||
entry->bound = dev->agp->base + (page << PAGE_SHIFT);
|
||||
DRM_DEBUG("base = 0x%lx entry->bound = 0x%lx\n",
|
||||
|
@ -359,7 +358,8 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
|
|||
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
|
||||
entry = drm_agp_lookup_entry(dev, request->handle);
|
||||
if (!entry)
|
||||
return -EINVAL;
|
||||
if (entry->bound)
|
||||
drm_unbind_agp(entry->memory);
|
||||
|
@ -373,7 +373,6 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
|
|||
EXPORT_SYMBOL(drm_agp_free);
|
||||
|
||||
|
||||
|
||||
int drm_agp_free_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
|
@ -398,11 +397,13 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
|
|||
{
|
||||
struct drm_agp_head *head = NULL;
|
||||
|
||||
if (!(head = kzalloc(sizeof(*head), GFP_KERNEL)))
|
||||
head = kzalloc(sizeof(*head), GFP_KERNEL);
|
||||
if (!head)
|
||||
return NULL;
|
||||
head->bridge = agp_find_bridge(dev->pdev);
|
||||
if (!head->bridge) {
|
||||
if (!(head->bridge = agp_backend_acquire(dev->pdev))) {
|
||||
head->bridge = agp_backend_acquire(dev->pdev);
|
||||
if (!head->bridge) {
|
||||
kfree(head);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -719,6 +719,29 @@ DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
|
|||
* callback. For atomic drivers the remapping to the "ACTIVE" property is
|
||||
* implemented in the DRM core. This is the only standard connector
|
||||
* property that userspace can change.
|
||||
*
|
||||
* Note that this property cannot be set through the MODE_ATOMIC ioctl,
|
||||
* userspace must use "ACTIVE" on the CRTC instead.
|
||||
*
|
||||
* WARNING:
|
||||
*
|
||||
* For userspace also running on legacy drivers the "DPMS" semantics are a
|
||||
* lot more complicated. First, userspace cannot rely on the "DPMS" value
|
||||
* returned by the GETCONNECTOR actually reflecting reality, because many
|
||||
* drivers fail to update it. For atomic drivers this is taken care of in
|
||||
* drm_atomic_helper_update_legacy_modeset_state().
|
||||
*
|
||||
* The second issue is that the DPMS state is only well-defined when the
|
||||
* connector is connected to a CRTC. In atomic the DRM core enforces that
|
||||
* "ACTIVE" is off in such a case, no such checks exists for "DPMS".
|
||||
*
|
||||
* Finally, when enabling an output using the legacy SETCONFIG ioctl then
|
||||
* "DPMS" is forced to ON. But see above, that might not be reflected in
|
||||
* the software value on legacy drivers.
|
||||
*
|
||||
* Summarizing: Only set "DPMS" when the connector is known to be enabled,
|
||||
* assume that a successful SETCONFIG call also sets "DPMS" to on, and
|
||||
* never read back the value of "DPMS" because it can be incorrect.
|
||||
* PATH:
|
||||
* Connector path property to identify how this sink is physically
|
||||
* connected. Used by DP MST. This should be set by calling
|
||||
|
|
|
@ -286,13 +286,13 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
|
|||
spin_lock_irqsave(&drm_minor_lock, flags);
|
||||
minor = idr_find(&drm_minors_idr, minor_id);
|
||||
if (minor)
|
||||
drm_dev_ref(minor->dev);
|
||||
drm_dev_get(minor->dev);
|
||||
spin_unlock_irqrestore(&drm_minor_lock, flags);
|
||||
|
||||
if (!minor) {
|
||||
return ERR_PTR(-ENODEV);
|
||||
} else if (drm_dev_is_unplugged(minor->dev)) {
|
||||
drm_dev_unref(minor->dev);
|
||||
drm_dev_put(minor->dev);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
|
@ -301,7 +301,7 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
|
|||
|
||||
void drm_minor_release(struct drm_minor *minor)
|
||||
{
|
||||
drm_dev_unref(minor->dev);
|
||||
drm_dev_put(minor->dev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -326,11 +326,11 @@ void drm_minor_release(struct drm_minor *minor)
|
|||
* When cleaning up a device instance everything needs to be done in reverse:
|
||||
* First unpublish the device instance with drm_dev_unregister(). Then clean up
|
||||
* any other resources allocated at device initialization and drop the driver's
|
||||
* reference to &drm_device using drm_dev_unref().
|
||||
* reference to &drm_device using drm_dev_put().
|
||||
*
|
||||
* Note that the lifetime rules for &drm_device instance has still a lot of
|
||||
* historical baggage. Hence use the reference counting provided by
|
||||
* drm_dev_ref() and drm_dev_unref() only carefully.
|
||||
* drm_dev_get() and drm_dev_put() only carefully.
|
||||
*
|
||||
* It is recommended that drivers embed &struct drm_device into their own device
|
||||
* structure, which is supported through drm_dev_init().
|
||||
|
@ -345,7 +345,7 @@ void drm_minor_release(struct drm_minor *minor)
|
|||
* Cleans up all DRM device, calling drm_lastclose().
|
||||
*
|
||||
* Note: Use of this function is deprecated. It will eventually go away
|
||||
* completely. Please use drm_dev_unregister() and drm_dev_unref() explicitly
|
||||
* completely. Please use drm_dev_unregister() and drm_dev_put() explicitly
|
||||
* instead to make sure that the device isn't userspace accessible any more
|
||||
* while teardown is in progress, ensuring that userspace can't access an
|
||||
* inconsistent state.
|
||||
|
@ -360,7 +360,7 @@ void drm_put_dev(struct drm_device *dev)
|
|||
}
|
||||
|
||||
drm_dev_unregister(dev);
|
||||
drm_dev_unref(dev);
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_put_dev);
|
||||
|
||||
|
@ -386,7 +386,7 @@ void drm_dev_unplug(struct drm_device *dev)
|
|||
mutex_lock(&drm_global_mutex);
|
||||
drm_device_set_unplugged(dev);
|
||||
if (dev->open_count == 0)
|
||||
drm_dev_unref(dev);
|
||||
drm_dev_put(dev);
|
||||
mutex_unlock(&drm_global_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dev_unplug);
|
||||
|
@ -475,8 +475,8 @@ static void drm_fs_inode_free(struct inode *inode)
|
|||
* initialization sequence to make sure userspace can't access an inconsistent
|
||||
* state.
|
||||
*
|
||||
* The initial ref-count of the object is 1. Use drm_dev_ref() and
|
||||
* drm_dev_unref() to take and drop further ref-counts.
|
||||
* The initial ref-count of the object is 1. Use drm_dev_get() and
|
||||
* drm_dev_put() to take and drop further ref-counts.
|
||||
*
|
||||
* Note that for purely virtual devices @parent can be NULL.
|
||||
*
|
||||
|
@ -626,8 +626,8 @@ EXPORT_SYMBOL(drm_dev_fini);
|
|||
* initialization sequence to make sure userspace can't access an inconsistent
|
||||
* state.
|
||||
*
|
||||
* The initial ref-count of the object is 1. Use drm_dev_ref() and
|
||||
* drm_dev_unref() to take and drop further ref-counts.
|
||||
* The initial ref-count of the object is 1. Use drm_dev_get() and
|
||||
* drm_dev_put() to take and drop further ref-counts.
|
||||
*
|
||||
* Note that for purely virtual devices @parent can be NULL.
|
||||
*
|
||||
|
@ -670,36 +670,49 @@ static void drm_dev_release(struct kref *ref)
|
|||
}
|
||||
|
||||
/**
|
||||
* drm_dev_ref - Take reference of a DRM device
|
||||
* drm_dev_get - Take reference of a DRM device
|
||||
* @dev: device to take reference of or NULL
|
||||
*
|
||||
* This increases the ref-count of @dev by one. You *must* already own a
|
||||
* reference when calling this. Use drm_dev_unref() to drop this reference
|
||||
* reference when calling this. Use drm_dev_put() to drop this reference
|
||||
* again.
|
||||
*
|
||||
* This function never fails. However, this function does not provide *any*
|
||||
* guarantee whether the device is alive or running. It only provides a
|
||||
* reference to the object and the memory associated with it.
|
||||
*/
|
||||
void drm_dev_ref(struct drm_device *dev)
|
||||
void drm_dev_get(struct drm_device *dev)
|
||||
{
|
||||
if (dev)
|
||||
kref_get(&dev->ref);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dev_ref);
|
||||
EXPORT_SYMBOL(drm_dev_get);
|
||||
|
||||
/**
|
||||
* drm_dev_unref - Drop reference of a DRM device
|
||||
* drm_dev_put - Drop reference of a DRM device
|
||||
* @dev: device to drop reference of or NULL
|
||||
*
|
||||
* This decreases the ref-count of @dev by one. The device is destroyed if the
|
||||
* ref-count drops to zero.
|
||||
*/
|
||||
void drm_dev_unref(struct drm_device *dev)
|
||||
void drm_dev_put(struct drm_device *dev)
|
||||
{
|
||||
if (dev)
|
||||
kref_put(&dev->ref, drm_dev_release);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dev_put);
|
||||
|
||||
/**
|
||||
* drm_dev_unref - Drop reference of a DRM device
|
||||
* @dev: device to drop reference of or NULL
|
||||
*
|
||||
* This is a compatibility alias for drm_dev_put() and should not be used by new
|
||||
* code.
|
||||
*/
|
||||
void drm_dev_unref(struct drm_device *dev)
|
||||
{
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dev_unref);
|
||||
|
||||
static int create_compat_control_link(struct drm_device *dev)
|
||||
|
@ -839,7 +852,7 @@ EXPORT_SYMBOL(drm_dev_register);
|
|||
*
|
||||
* Unregister the DRM device from the system. This does the reverse of
|
||||
* drm_dev_register() but does not deallocate the device. The caller must call
|
||||
* drm_dev_unref() to drop their final reference.
|
||||
* drm_dev_put() to drop their final reference.
|
||||
*
|
||||
* A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
|
||||
* which can be called while there are still open users of @dev.
|
||||
|
|
|
@ -38,7 +38,7 @@ struct drm_fbdev_cma {
|
|||
* Provides helper functions for creating a cma (contiguous memory allocator)
|
||||
* backed framebuffer.
|
||||
*
|
||||
* drm_fb_cma_create() is used in the &drm_mode_config_funcs.fb_create
|
||||
* drm_gem_fb_create() is used in the &drm_mode_config_funcs.fb_create
|
||||
* callback function to create a cma backed framebuffer.
|
||||
*
|
||||
* An fbdev framebuffer backed by cma is also available by calling
|
||||
|
@ -61,8 +61,8 @@ struct drm_fbdev_cma {
|
|||
* }
|
||||
*
|
||||
* static struct drm_framebuffer_funcs driver_fb_funcs = {
|
||||
* .destroy = drm_fb_cma_destroy,
|
||||
* .create_handle = drm_fb_cma_create_handle,
|
||||
* .destroy = drm_gem_fb_destroy,
|
||||
* .create_handle = drm_gem_fb_create_handle,
|
||||
* .dirty = driver_fb_dirty,
|
||||
* };
|
||||
*
|
||||
|
@ -80,57 +80,6 @@ static inline struct drm_fbdev_cma *to_fbdev_cma(struct drm_fb_helper *helper)
|
|||
return container_of(helper, struct drm_fbdev_cma, fb_helper);
|
||||
}
|
||||
|
||||
void drm_fb_cma_destroy(struct drm_framebuffer *fb)
|
||||
{
|
||||
drm_gem_fb_destroy(fb);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_cma_destroy);
|
||||
|
||||
int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
|
||||
struct drm_file *file_priv, unsigned int *handle)
|
||||
{
|
||||
return drm_gem_fb_create_handle(fb, file_priv, handle);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_cma_create_handle);
|
||||
|
||||
/**
|
||||
* drm_fb_cma_create_with_funcs() - helper function for the
|
||||
* &drm_mode_config_funcs.fb_create
|
||||
* callback
|
||||
* @dev: DRM device
|
||||
* @file_priv: drm file for the ioctl call
|
||||
* @mode_cmd: metadata from the userspace fb creation request
|
||||
* @funcs: vtable to be used for the new framebuffer object
|
||||
*
|
||||
* This can be used to set &drm_framebuffer_funcs for drivers that need the
|
||||
* &drm_framebuffer_funcs.dirty callback. Use drm_fb_cma_create() if you don't
|
||||
* need to change &drm_framebuffer_funcs.
|
||||
*/
|
||||
struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_framebuffer_funcs *funcs)
|
||||
{
|
||||
return drm_gem_fb_create_with_funcs(dev, file_priv, mode_cmd, funcs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_fb_cma_create_with_funcs);
|
||||
|
||||
/**
|
||||
* drm_fb_cma_create() - &drm_mode_config_funcs.fb_create callback function
|
||||
* @dev: DRM device
|
||||
* @file_priv: drm file for the ioctl call
|
||||
* @mode_cmd: metadata from the userspace fb creation request
|
||||
*
|
||||
* If your hardware has special alignment or pitch requirements these should be
|
||||
* checked before calling this function. Use drm_fb_cma_create_with_funcs() if
|
||||
* you need to set &drm_framebuffer_funcs.dirty.
|
||||
*/
|
||||
struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
return drm_gem_fb_create(dev, file_priv, mode_cmd);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_fb_cma_create);
|
||||
|
||||
/**
|
||||
* drm_fb_cma_get_gem_obj() - Get CMA GEM object for framebuffer
|
||||
* @fb: The framebuffer
|
||||
|
@ -181,26 +130,6 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_addr);
|
||||
|
||||
/**
|
||||
* drm_fb_cma_prepare_fb() - Prepare CMA framebuffer
|
||||
* @plane: Which plane
|
||||
* @state: Plane state attach fence to
|
||||
*
|
||||
* This should be set as the &struct drm_plane_helper_funcs.prepare_fb hook.
|
||||
*
|
||||
* This function checks if the plane FB has an dma-buf attached, extracts
|
||||
* the exclusive fence and attaches it to plane state for the atomic helper
|
||||
* to wait on.
|
||||
*
|
||||
* There is no need for cleanup_fb for CMA based framebuffer drivers.
|
||||
*/
|
||||
int drm_fb_cma_prepare_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *state)
|
||||
{
|
||||
return drm_gem_fb_prepare_fb(plane, state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_fb_cma_prepare_fb);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m)
|
||||
{
|
||||
|
|
|
@ -282,15 +282,6 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
|
|||
{
|
||||
struct drm_gem_object *obj;
|
||||
|
||||
/* This is gross. The idr system doesn't let us try a delete and
|
||||
* return an error code. It just spews if you fail at deleting.
|
||||
* So, we have to grab a lock around finding the object and then
|
||||
* doing the delete on it and dropping the refcount, or the user
|
||||
* could race us to double-decrement the refcount and cause a
|
||||
* use-after-free later. Given the frequency of our handle lookups,
|
||||
* we may want to use ida for number allocation and a hash table
|
||||
* for the pointers, anyway.
|
||||
*/
|
||||
spin_lock(&filp->table_lock);
|
||||
|
||||
/* Check if we currently have a reference on the object */
|
||||
|
@ -543,7 +534,7 @@ EXPORT_SYMBOL(drm_gem_create_mmap_offset);
|
|||
* Note that you are not allowed to change gfp-zones during runtime. That is,
|
||||
* shmem_read_mapping_page_gfp() must be called with the same gfp_zone(gfp) as
|
||||
* set during initialization. If you have special zone constraints, set them
|
||||
* after drm_gem_init_object() via mapping_set_gfp_mask(). shmem-core takes care
|
||||
* after drm_gem_object_init() via mapping_set_gfp_mask(). shmem-core takes care
|
||||
* to keep pages in the required zone during swap-in.
|
||||
*/
|
||||
struct page **drm_gem_get_pages(struct drm_gem_object *obj)
|
||||
|
|
|
@ -233,6 +233,8 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
|
|||
|
||||
if (!panel && !bridge)
|
||||
return -EINVAL;
|
||||
if (panel)
|
||||
*panel = NULL;
|
||||
|
||||
remote = of_graph_get_remote_node(np, port, endpoint);
|
||||
if (!remote)
|
||||
|
|
|
@ -274,7 +274,7 @@ err_agp:
|
|||
drm_pci_agp_destroy(dev);
|
||||
pci_disable_device(pdev);
|
||||
err_free:
|
||||
drm_dev_unref(dev);
|
||||
drm_dev_put(dev);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_pci_dev);
|
||||
|
|
|
@ -318,7 +318,7 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
|
|||
if (IS_ERR(dma_buf))
|
||||
return dma_buf;
|
||||
|
||||
drm_dev_ref(dev);
|
||||
drm_dev_get(dev);
|
||||
drm_gem_object_get(exp_info->priv);
|
||||
|
||||
return dma_buf;
|
||||
|
@ -342,7 +342,7 @@ void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
|
|||
/* drop the reference on the export fd holds */
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
|
||||
drm_dev_unref(dev);
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_dmabuf_release);
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
|
||||
#include "fsl_dcu_drm_crtc.h"
|
||||
#include "fsl_dcu_drm_drv.h"
|
||||
|
@ -20,7 +21,7 @@
|
|||
static const struct drm_mode_config_funcs fsl_dcu_drm_mode_config_funcs = {
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
};
|
||||
|
||||
int fsl_dcu_drm_modeset_init(struct fsl_dcu_drm_device *fsl_dev)
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <drm/drmP.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_of.h>
|
||||
|
@ -56,7 +57,7 @@ static void kirin_fbdev_output_poll_changed(struct drm_device *dev)
|
|||
}
|
||||
|
||||
static const struct drm_mode_config_funcs kirin_drm_mode_config_funcs = {
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
.output_poll_changed = kirin_fbdev_output_poll_changed,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_plane_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_rect.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
|
@ -78,7 +79,7 @@ static const struct drm_mode_config_funcs meson_mode_config_funcs = {
|
|||
.output_poll_changed = meson_fb_output_poll_changed,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
};
|
||||
|
||||
static irqreturn_t meson_irq(int irq, void *arg)
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
@ -92,7 +93,7 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb)
|
|||
}
|
||||
|
||||
static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = {
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
};
|
||||
|
@ -127,7 +128,7 @@ static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe,
|
|||
static int mxsfb_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
|
||||
return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
|
||||
}
|
||||
|
||||
static struct drm_simple_display_pipe_funcs mxsfb_funcs = {
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/wait.h>
|
||||
|
@ -213,7 +214,7 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
|||
}
|
||||
}
|
||||
|
||||
return drm_fb_cma_create(dev, file_priv, mode_cmd);
|
||||
return drm_gem_fb_create(dev, file_priv, mode_cmd);
|
||||
}
|
||||
|
||||
static void rcar_du_output_poll_changed(struct drm_device *dev)
|
||||
|
|
|
@ -287,14 +287,6 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct drm_encoder *
|
||||
cdn_dp_connector_best_encoder(struct drm_connector *connector)
|
||||
{
|
||||
struct cdn_dp_device *dp = connector_to_dp(connector);
|
||||
|
||||
return &dp->encoder;
|
||||
}
|
||||
|
||||
static int cdn_dp_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
|
@ -346,7 +338,6 @@ static int cdn_dp_connector_mode_valid(struct drm_connector *connector,
|
|||
|
||||
static struct drm_connector_helper_funcs cdn_dp_connector_helper_funcs = {
|
||||
.get_modes = cdn_dp_connector_get_modes,
|
||||
.best_encoder = cdn_dp_connector_best_encoder,
|
||||
.mode_valid = cdn_dp_connector_mode_valid,
|
||||
};
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ static int rockchip_drm_gem_object_mmap_iommu(struct drm_gem_object *obj,
|
|||
{
|
||||
struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
|
||||
unsigned int i, count = obj->size >> PAGE_SHIFT;
|
||||
unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
||||
unsigned long user_count = vma_pages(vma);
|
||||
unsigned long uaddr = vma->vm_start;
|
||||
unsigned long offset = vma->vm_pgoff;
|
||||
unsigned long end = user_count + offset;
|
||||
|
|
|
@ -346,7 +346,7 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
|
|||
struct drm_connector *connector;
|
||||
struct device_node *remote = NULL;
|
||||
struct device_node *port, *endpoint;
|
||||
int ret;
|
||||
int ret = 0, child_count = 0;
|
||||
const char *name;
|
||||
u32 endpoint_id;
|
||||
|
||||
|
@ -358,15 +358,20 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
|
|||
return -EINVAL;
|
||||
}
|
||||
for_each_child_of_node(port, endpoint) {
|
||||
child_count++;
|
||||
of_property_read_u32(endpoint, "reg", &endpoint_id);
|
||||
ret = drm_of_find_panel_or_bridge(dev->of_node, 1, endpoint_id,
|
||||
&lvds->panel, &lvds->bridge);
|
||||
if (!ret)
|
||||
break;
|
||||
}
|
||||
if (ret) {
|
||||
if (!child_count) {
|
||||
DRM_DEV_ERROR(dev, "lvds port does not have any children\n");
|
||||
ret = -EINVAL;
|
||||
goto err_put_port;
|
||||
} else if (ret) {
|
||||
DRM_DEV_ERROR(dev, "failed to find panel and bridge node\n");
|
||||
ret = -EPROBE_DEFER;
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err_put_port;
|
||||
}
|
||||
if (lvds->panel)
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
|
||||
#include <video/sh_mobile_meram.h>
|
||||
|
||||
|
@ -131,7 +132,7 @@ shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
|||
}
|
||||
}
|
||||
|
||||
return drm_fb_cma_create(dev, file_priv, mode_cmd);
|
||||
return drm_gem_fb_create(dev, file_priv, mode_cmd);
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs shmob_drm_mode_config_funcs = {
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drmP.h>
|
||||
|
||||
#include "sun4i_drv.h"
|
||||
|
@ -28,7 +29,7 @@ static const struct drm_mode_config_funcs sun4i_de_mode_config_funcs = {
|
|||
.output_poll_changed = sun4i_de_output_poll_changed,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
};
|
||||
|
||||
struct drm_fbdev_cma *sun4i_framebuffer_init(struct drm_device *drm)
|
||||
|
|
|
@ -75,7 +75,7 @@ static void unref_worker(struct drm_flip_work *work, void *val)
|
|||
struct drm_device *dev = tilcdc_crtc->base.dev;
|
||||
|
||||
mutex_lock(&dev->mode_config.mutex);
|
||||
drm_framebuffer_unreference(val);
|
||||
drm_framebuffer_put(val);
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
}
|
||||
|
||||
|
@ -456,7 +456,7 @@ static void tilcdc_crtc_set_mode(struct drm_crtc *crtc)
|
|||
|
||||
set_scanout(crtc, fb);
|
||||
|
||||
drm_framebuffer_reference(fb);
|
||||
drm_framebuffer_get(fb);
|
||||
|
||||
crtc->hwmode = crtc->state->adjusted_mode;
|
||||
}
|
||||
|
@ -633,7 +633,7 @@ int tilcdc_crtc_update_fb(struct drm_crtc *crtc,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
drm_framebuffer_reference(fb);
|
||||
drm_framebuffer_get(fb);
|
||||
|
||||
crtc->primary->fb = fb;
|
||||
tilcdc_crtc->event = event;
|
||||
|
|
|
@ -226,7 +226,7 @@ static void tilcdc_fini(struct drm_device *dev)
|
|||
|
||||
pm_runtime_disable(dev->dev);
|
||||
|
||||
drm_dev_unref(dev);
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
|
||||
static int tilcdc_init(struct drm_driver *ddrv, struct device *dev)
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/tinydrm/tinydrm.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-buf.h>
|
||||
|
@ -128,7 +129,7 @@ tinydrm_fb_create(struct drm_device *drm, struct drm_file *file_priv,
|
|||
{
|
||||
struct tinydrm_device *tdev = drm->dev_private;
|
||||
|
||||
return drm_fb_cma_create_with_funcs(drm, file_priv, mode_cmd,
|
||||
return drm_gem_fb_create_with_funcs(drm, file_priv, mode_cmd,
|
||||
tdev->fb_funcs);
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_modes.h>
|
||||
#include <drm/tinydrm/tinydrm.h>
|
||||
|
||||
|
@ -144,7 +145,7 @@ EXPORT_SYMBOL(tinydrm_display_pipe_update);
|
|||
* @pipe: Simple display pipe
|
||||
* @plane_state: Plane state
|
||||
*
|
||||
* This function uses drm_fb_cma_prepare_fb() to check if the plane FB has an
|
||||
* This function uses drm_gem_fb_prepare_fb() to check if the plane FB has an
|
||||
* dma-buf attached, extracts the exclusive fence and attaches it to plane
|
||||
* state for the atomic helper to wait on. Drivers can use this as their
|
||||
* &drm_simple_display_pipe_funcs->prepare_fb callback.
|
||||
|
@ -152,7 +153,7 @@ EXPORT_SYMBOL(tinydrm_display_pipe_update);
|
|||
int tinydrm_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
|
||||
return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
|
||||
}
|
||||
EXPORT_SYMBOL(tinydrm_display_pipe_prepare_fb);
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/tinydrm/mipi-dbi.h>
|
||||
#include <drm/tinydrm/tinydrm-helpers.h>
|
||||
#include <linux/debugfs.h>
|
||||
|
@ -253,8 +254,8 @@ out_unlock:
|
|||
}
|
||||
|
||||
static const struct drm_framebuffer_funcs mipi_dbi_fb_funcs = {
|
||||
.destroy = drm_fb_cma_destroy,
|
||||
.create_handle = drm_fb_cma_create_handle,
|
||||
.destroy = drm_gem_fb_destroy,
|
||||
.create_handle = drm_gem_fb_create_handle,
|
||||
.dirty = mipi_dbi_fb_dirty,
|
||||
};
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/thermal.h>
|
||||
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/tinydrm/tinydrm.h>
|
||||
#include <drm/tinydrm/tinydrm-helpers.h>
|
||||
|
||||
|
@ -636,8 +637,8 @@ out_unlock:
|
|||
}
|
||||
|
||||
static const struct drm_framebuffer_funcs repaper_fb_funcs = {
|
||||
.destroy = drm_fb_cma_destroy,
|
||||
.create_handle = drm_fb_cma_create_handle,
|
||||
.destroy = drm_gem_fb_destroy,
|
||||
.create_handle = drm_gem_fb_create_handle,
|
||||
.dirty = repaper_fb_dirty,
|
||||
};
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <video/mipi_display.h>
|
||||
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/tinydrm/mipi-dbi.h>
|
||||
#include <drm/tinydrm/tinydrm-helpers.h>
|
||||
|
||||
|
@ -167,8 +168,8 @@ out_unlock:
|
|||
}
|
||||
|
||||
static const struct drm_framebuffer_funcs st7586_fb_funcs = {
|
||||
.destroy = drm_fb_cma_destroy,
|
||||
.create_handle = drm_fb_cma_create_handle,
|
||||
.destroy = drm_gem_fb_destroy,
|
||||
.create_handle = drm_gem_fb_create_handle,
|
||||
.dirty = st7586_fb_dirty,
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <drm/drmP.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
|
||||
#include "tve200_drm.h"
|
||||
|
@ -221,7 +222,7 @@ static void tve200_display_enable(struct drm_simple_display_pipe *pipe,
|
|||
drm_crtc_vblank_on(crtc);
|
||||
}
|
||||
|
||||
void tve200_display_disable(struct drm_simple_display_pipe *pipe)
|
||||
static void tve200_display_disable(struct drm_simple_display_pipe *pipe)
|
||||
{
|
||||
struct drm_crtc *crtc = &pipe->crtc;
|
||||
struct drm_device *drm = crtc->dev;
|
||||
|
@ -290,10 +291,10 @@ void tve200_disable_vblank(struct drm_device *drm, unsigned int crtc)
|
|||
static int tve200_display_prepare_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
|
||||
return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
|
||||
}
|
||||
|
||||
const struct drm_simple_display_pipe_funcs tve200_display_funcs = {
|
||||
static const struct drm_simple_display_pipe_funcs tve200_display_funcs = {
|
||||
.check = tve200_display_check,
|
||||
.enable = tve200_display_enable,
|
||||
.disable = tve200_display_disable,
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_of.h>
|
||||
|
@ -55,7 +56,7 @@
|
|||
#define DRIVER_DESC "DRM module for Faraday TVE200"
|
||||
|
||||
static const struct drm_mode_config_funcs mode_config_funcs = {
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.fb_create = drm_gem_fb_create,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
};
|
||||
|
@ -225,7 +226,7 @@ static int tve200_probe(struct platform_device *pdev)
|
|||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
priv->regs = devm_ioremap_resource(dev, res);
|
||||
if (!priv->regs) {
|
||||
if (IS_ERR(priv->regs)) {
|
||||
dev_err(dev, "%s failed mmio\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto clk_disable;
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_edid.h>
|
||||
#include <drm/drm_mipi_dsi.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
|
@ -504,7 +505,6 @@ struct vc4_dsi {
|
|||
struct mipi_dsi_host dsi_host;
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_bridge *bridge;
|
||||
bool is_panel_bridge;
|
||||
|
||||
void __iomem *regs;
|
||||
|
||||
|
@ -866,7 +866,8 @@ static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder *encoder,
|
|||
adjusted_mode->clock = pixel_clock_hz / 1000 + 1;
|
||||
|
||||
/* Given the new pixel clock, adjust HFP to keep vrefresh the same. */
|
||||
adjusted_mode->htotal = pixel_clock_hz / (mode->vrefresh * mode->vtotal);
|
||||
adjusted_mode->htotal = adjusted_mode->clock * mode->htotal /
|
||||
mode->clock;
|
||||
adjusted_mode->hsync_end += adjusted_mode->htotal - mode->htotal;
|
||||
adjusted_mode->hsync_start += adjusted_mode->htotal - mode->htotal;
|
||||
|
||||
|
@ -1288,7 +1289,6 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
int ret = 0;
|
||||
|
||||
dsi->lanes = device->lanes;
|
||||
dsi->channel = device->channel;
|
||||
|
@ -1323,34 +1323,12 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
return 0;
|
||||
}
|
||||
|
||||
dsi->bridge = of_drm_find_bridge(device->dev.of_node);
|
||||
if (!dsi->bridge) {
|
||||
struct drm_panel *panel =
|
||||
of_drm_find_panel(device->dev.of_node);
|
||||
|
||||
dsi->bridge = drm_panel_bridge_add(panel,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (IS_ERR(dsi->bridge)) {
|
||||
ret = PTR_ERR(dsi->bridge);
|
||||
dsi->bridge = NULL;
|
||||
return ret;
|
||||
}
|
||||
dsi->is_panel_bridge = true;
|
||||
}
|
||||
|
||||
return drm_bridge_attach(dsi->encoder, dsi->bridge, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
|
||||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
|
||||
if (dsi->is_panel_bridge) {
|
||||
drm_panel_bridge_remove(dsi->bridge);
|
||||
dsi->bridge = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1492,16 +1470,13 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
|||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct drm_device *drm = dev_get_drvdata(master);
|
||||
struct vc4_dev *vc4 = to_vc4_dev(drm);
|
||||
struct vc4_dsi *dsi;
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
struct vc4_dsi_encoder *vc4_dsi_encoder;
|
||||
struct drm_panel *panel;
|
||||
const struct of_device_id *match;
|
||||
dma_cap_mask_t dma_mask;
|
||||
int ret;
|
||||
|
||||
dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
|
||||
if (!dsi)
|
||||
return -ENOMEM;
|
||||
|
||||
match = of_match_device(vc4_dsi_dt_match, dev);
|
||||
if (!match)
|
||||
return -ENODEV;
|
||||
|
@ -1516,7 +1491,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
|||
vc4_dsi_encoder->dsi = dsi;
|
||||
dsi->encoder = &vc4_dsi_encoder->base.base;
|
||||
|
||||
dsi->pdev = pdev;
|
||||
dsi->regs = vc4_ioremap_regs(pdev, 0);
|
||||
if (IS_ERR(dsi->regs))
|
||||
return PTR_ERR(dsi->regs);
|
||||
|
@ -1597,6 +1571,18 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0,
|
||||
&panel, &dsi->bridge);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (panel) {
|
||||
dsi->bridge = devm_drm_panel_bridge_add(dev, panel,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (IS_ERR(dsi->bridge))
|
||||
return PTR_ERR(dsi->bridge);
|
||||
}
|
||||
|
||||
/* The esc clock rate is supposed to always be 100Mhz. */
|
||||
ret = clk_set_rate(dsi->escape_clock, 100 * 1000000);
|
||||
if (ret) {
|
||||
|
@ -1615,12 +1601,11 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
|
|||
DRM_MODE_ENCODER_DSI, NULL);
|
||||
drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs);
|
||||
|
||||
dsi->dsi_host.ops = &vc4_dsi_host_ops;
|
||||
dsi->dsi_host.dev = dev;
|
||||
|
||||
mipi_dsi_host_register(&dsi->dsi_host);
|
||||
|
||||
dev_set_drvdata(dev, dsi);
|
||||
ret = drm_bridge_attach(dsi->encoder, dsi->bridge, NULL);
|
||||
if (ret) {
|
||||
dev_err(dev, "bridge attach failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
|
@ -1638,8 +1623,6 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master,
|
|||
|
||||
vc4_dsi_encoder_destroy(dsi->encoder);
|
||||
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
|
||||
if (dsi->port == 1)
|
||||
vc4->dsi1 = NULL;
|
||||
}
|
||||
|
@ -1651,12 +1634,47 @@ static const struct component_ops vc4_dsi_ops = {
|
|||
|
||||
static int vc4_dsi_dev_probe(struct platform_device *pdev)
|
||||
{
|
||||
return component_add(&pdev->dev, &vc4_dsi_ops);
|
||||
struct device *dev = &pdev->dev;
|
||||
struct vc4_dsi *dsi;
|
||||
int ret;
|
||||
|
||||
dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
|
||||
if (!dsi)
|
||||
return -ENOMEM;
|
||||
dev_set_drvdata(dev, dsi);
|
||||
|
||||
dsi->pdev = pdev;
|
||||
|
||||
/* Note, the initialization sequence for DSI and panels is
|
||||
* tricky. The component bind above won't get past its
|
||||
* -EPROBE_DEFER until the panel/bridge probes. The
|
||||
* panel/bridge will return -EPROBE_DEFER until it has a
|
||||
* mipi_dsi_host to register its device to. So, we register
|
||||
* the host during pdev probe time, so vc4 as a whole can then
|
||||
* -EPROBE_DEFER its component bind process until the panel
|
||||
* successfully attaches.
|
||||
*/
|
||||
dsi->dsi_host.ops = &vc4_dsi_host_ops;
|
||||
dsi->dsi_host.dev = dev;
|
||||
mipi_dsi_host_register(&dsi->dsi_host);
|
||||
|
||||
ret = component_add(&pdev->dev, &vc4_dsi_ops);
|
||||
if (ret) {
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vc4_dsi_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
|
||||
component_del(&pdev->dev, &vc4_dsi_ops);
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ static void virtio_gpu_user_framebuffer_destroy(struct drm_framebuffer *fb)
|
|||
struct virtio_gpu_framebuffer *virtio_gpu_fb
|
||||
= to_virtio_gpu_framebuffer(fb);
|
||||
|
||||
drm_gem_object_unreference_unlocked(virtio_gpu_fb->obj);
|
||||
drm_gem_object_put_unlocked(virtio_gpu_fb->obj);
|
||||
drm_framebuffer_cleanup(fb);
|
||||
kfree(virtio_gpu_fb);
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev,
|
|||
ret = virtio_gpu_framebuffer_init(dev, virtio_gpu_fb, mode_cmd, obj);
|
||||
if (ret) {
|
||||
kfree(virtio_gpu_fb);
|
||||
drm_gem_object_unreference_unlocked(obj);
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ int virtio_gpu_gem_create(struct drm_file *file,
|
|||
*obj_p = &obj->gem_base;
|
||||
|
||||
/* drop reference from allocate - handle holds it now */
|
||||
drm_gem_object_unreference_unlocked(&obj->gem_base);
|
||||
drm_gem_object_put_unlocked(&obj->gem_base);
|
||||
|
||||
*handle_p = handle;
|
||||
return 0;
|
||||
|
@ -130,7 +130,7 @@ int virtio_gpu_mode_dumb_mmap(struct drm_file *file_priv,
|
|||
return -ENOENT;
|
||||
obj = gem_to_virtio_gpu_obj(gobj);
|
||||
*offset_p = virtio_gpu_object_mmap_offset(obj);
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ static void virtio_gpu_unref_list(struct list_head *head)
|
|||
bo = buf->bo;
|
||||
qobj = container_of(bo, struct virtio_gpu_object, tbo);
|
||||
|
||||
drm_gem_object_unreference_unlocked(&qobj->gem_base);
|
||||
drm_gem_object_put_unlocked(&qobj->gem_base);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,7 +304,7 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
drm_gem_object_unreference_unlocked(obj);
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
|
||||
rc->res_handle = res_id; /* similiar to a VM address */
|
||||
rc->bo_handle = handle;
|
||||
|
@ -341,7 +341,7 @@ static int virtio_gpu_resource_info_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
ri->size = qobj->gem_base.size;
|
||||
ri->res_handle = qobj->hw_res_handle;
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -389,7 +389,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
|
|||
out_unres:
|
||||
virtio_gpu_object_unreserve(qobj);
|
||||
out:
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -439,7 +439,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
|
|||
out_unres:
|
||||
virtio_gpu_object_unreserve(qobj);
|
||||
out:
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -462,7 +462,7 @@ static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data,
|
|||
nowait = true;
|
||||
ret = virtio_gpu_object_wait(qobj, nowait);
|
||||
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ struct drm_driver {
|
|||
* reverse order of the initialization. Similarly to the load
|
||||
* hook, this handler is deprecated and its usage should be
|
||||
* dropped in favor of an open-coded teardown function at the
|
||||
* driver layer. See drm_dev_unregister() and drm_dev_unref()
|
||||
* driver layer. See drm_dev_unregister() and drm_dev_put()
|
||||
* for the proper way to remove a &struct drm_device.
|
||||
*
|
||||
* The unload() hook is called right after unregistering
|
||||
|
@ -611,7 +611,8 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
|
|||
int drm_dev_register(struct drm_device *dev, unsigned long flags);
|
||||
void drm_dev_unregister(struct drm_device *dev);
|
||||
|
||||
void drm_dev_ref(struct drm_device *dev);
|
||||
void drm_dev_get(struct drm_device *dev);
|
||||
void drm_dev_put(struct drm_device *dev);
|
||||
void drm_dev_unref(struct drm_device *dev);
|
||||
void drm_put_dev(struct drm_device *dev);
|
||||
void drm_dev_unplug(struct drm_device *dev);
|
||||
|
|
|
@ -28,16 +28,6 @@ void drm_fbdev_cma_set_suspend(struct drm_fbdev_cma *fbdev_cma, bool state);
|
|||
void drm_fbdev_cma_set_suspend_unlocked(struct drm_fbdev_cma *fbdev_cma,
|
||||
bool state);
|
||||
|
||||
void drm_fb_cma_destroy(struct drm_framebuffer *fb);
|
||||
int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
|
||||
struct drm_file *file_priv, unsigned int *handle);
|
||||
|
||||
struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_framebuffer_funcs *funcs);
|
||||
struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
|
||||
unsigned int plane);
|
||||
|
||||
|
@ -45,9 +35,6 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb,
|
|||
struct drm_plane_state *state,
|
||||
unsigned int plane);
|
||||
|
||||
int drm_fb_cma_prepare_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct seq_file;
|
||||
|
||||
|
|
|
@ -50,6 +50,9 @@ expression object;
|
|||
|
|
||||
- drm_property_unreference_blob(object)
|
||||
+ drm_property_blob_put(object)
|
||||
|
|
||||
- drm_dev_unref(object)
|
||||
+ drm_dev_put(object)
|
||||
)
|
||||
|
||||
@r depends on report@
|
||||
|
@ -81,6 +84,8 @@ drm_gem_object_unreference_unlocked(object)
|
|||
drm_property_unreference_blob@p(object)
|
||||
|
|
||||
drm_property_reference_blob@p(object)
|
||||
|
|
||||
drm_dev_unref@p(object)
|
||||
)
|
||||
|
||||
@script:python depends on report@
|
||||
|
|
Loading…
Reference in New Issue