mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 06:03:36 -04:00
drm-misc-next for 4.19:
Cross-subsystem Changes: - many dt-bindings Doc changes Core Changes: - Encoder clean ups (Ville Syrjälä) - Connector Writeback improvements(Boris Brezillon) - Fake vblank support (Boris Brezillon) - API for in-kernel clients (Noralf Trønnes) - improvements to the path of finding panels(Boris Brezillon) Driver Changes: - initial support for the virtual display driver - vkms(Haneen Mohammed and Rodrigo Siqueira) - panel: add Rocktech RK070ER9427 LCD support (Jagan Teki) - panel: add support for the EDT ETM0700G0EDH6 and EDT ETM0700G0BDH6(Jan Tuerk) - panel: add DLC DLC0700YZG-1 (Philipp Zabel) - panel: add support for BOE HV070WSA-100 (Andrzej Hajda) - panel: add newhaven, nhd-4.3-480272ef-atxl LCD (Tomi Valkeinen) - panel: add support for Innolux G070Y2-L01 (Christoph Fritz) - panel: add support for DataImage SCF0700C48GGU18 (Michal Vokáč) - panel: add support for Sharp LQ035Q7DB03 (Vladimir Zapolskiy) - panel: p079zca: Refactor panel driver to support multiple panels (Lin Huang) - sun4i: Add R40 display engine compatible(Jernej Skrabec) -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJbRqmlAAoJEEN0HIUfOBk0I2wQALu/Kk5y7gVGZWFMP/uImqB5 vbkNXX5rdzFfvXHbNE9GHVLtMLIJS705pou+wzuUzil3C/xjUUrP7mUdWEVgNl4s hj6norNP2Jhd6v+Jua5dwhamDi6RHcroWc6c3SYt//JjcZKtOb/oqwt+7Bu0I+yi I+62iMpOVjxOIaygthZiJD89Q0mRsFBELRC1iYm1SxXF0l1/9Hf5Xt9PbUvoMscb /74e0MqdqKNTopWz7TLIZT6mHDWLM8IklLkMBDEClZQUMQAfIvPSKhe7KGXnOB0T PzBd1MJeQ/rPyyJJtWY5BTng6C38XW5xmq+I4YUSIfRJZjJHf4vBEcJO3ErIxBGj LE957F/rT8IYxN0Z31wH0DZhP8KpL1KIXy3AOb7Yqqbu+SemKT/WaepAdFvKfFbO 5BxBgeFSQg9soHv7ndjOWDQal1AmuIhK/UP18ytYO9T54fPBJ1TaaHUWacYnvo/0 oQdCTghvFuZgpP3Tl3IisFO1xDpLq4Y4VqvP4xwSj2Id1MUp6MGh9W/A39bc8FA0 JJcvQYYCcnf4GVQQem+QFk+bpXmzLZW3+/cMpU72zrP+8OKrxD5PwxLmhuqdRzLR 2lMT5gXEuPl8K8wyOLJDiWbXfZB9jn7Mm+5lySKGKu6NYzLN+cbLPA7+tVsqrWMu XLd++4ntNy5hdvS/TO7j =Bepe -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-2018-07-11' of git://anongit.freedesktop.org/drm/drm-misc into drm-next drm-misc-next for 4.19: Cross-subsystem Changes: - many dt-bindings Doc changes Core Changes: - Encoder clean ups (Ville Syrjälä) - Connector Writeback improvements(Boris Brezillon) - Fake vblank support (Boris Brezillon) - API for in-kernel clients (Noralf Trønnes) - improvements to the path of finding panels(Boris Brezillon) Driver Changes: - initial support for the virtual display driver - vkms(Haneen Mohammed and Rodrigo Siqueira) - panel: add Rocktech RK070ER9427 LCD support (Jagan Teki) - panel: add support for the EDT ETM0700G0EDH6 and EDT ETM0700G0BDH6(Jan Tuerk) - panel: add DLC DLC0700YZG-1 (Philipp Zabel) - panel: add support for BOE HV070WSA-100 (Andrzej Hajda) - panel: add newhaven, nhd-4.3-480272ef-atxl LCD (Tomi Valkeinen) - panel: add support for Innolux G070Y2-L01 (Christoph Fritz) - panel: add support for DataImage SCF0700C48GGU18 (Michal Vokáč) - panel: add support for Sharp LQ035Q7DB03 (Vladimir Zapolskiy) - panel: p079zca: Refactor panel driver to support multiple panels (Lin Huang) - sun4i: Add R40 display engine compatible(Jernej Skrabec) Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180712011137.GA26620@juma
This commit is contained in:
commit
54c88a029a
108 changed files with 3239 additions and 905 deletions
|
|
@ -100,6 +100,7 @@ int __must_check drm_atomic_helper_swap_state(struct drm_atomic_state *state,
|
|||
int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
|
||||
bool nonblock);
|
||||
void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_fake_vblank(struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *state);
|
||||
|
||||
|
|
|
|||
139
include/drm/drm_client.h
Normal file
139
include/drm/drm_client.h
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef _DRM_CLIENT_H_
|
||||
#define _DRM_CLIENT_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_client_dev;
|
||||
struct drm_device;
|
||||
struct drm_file;
|
||||
struct drm_framebuffer;
|
||||
struct drm_gem_object;
|
||||
struct drm_minor;
|
||||
struct module;
|
||||
|
||||
/**
|
||||
* struct drm_client_funcs - DRM client callbacks
|
||||
*/
|
||||
struct drm_client_funcs {
|
||||
/**
|
||||
* @owner: The module owner
|
||||
*/
|
||||
struct module *owner;
|
||||
|
||||
/**
|
||||
* @unregister:
|
||||
*
|
||||
* Called when &drm_device is unregistered. The client should respond by
|
||||
* releasing it's resources using drm_client_release().
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void (*unregister)(struct drm_client_dev *client);
|
||||
|
||||
/**
|
||||
* @restore:
|
||||
*
|
||||
* Called on drm_lastclose(). The first client instance in the list that
|
||||
* returns zero gets the privilege to restore and no more clients are
|
||||
* called. This callback is not called after @unregister has been called.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
int (*restore)(struct drm_client_dev *client);
|
||||
|
||||
/**
|
||||
* @hotplug:
|
||||
*
|
||||
* Called on drm_kms_helper_hotplug_event().
|
||||
* This callback is not called after @unregister has been called.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
int (*hotplug)(struct drm_client_dev *client);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_client_dev - DRM client instance
|
||||
*/
|
||||
struct drm_client_dev {
|
||||
/**
|
||||
* @dev: DRM device
|
||||
*/
|
||||
struct drm_device *dev;
|
||||
|
||||
/**
|
||||
* @name: Name of the client.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* @list:
|
||||
*
|
||||
* List of all clients of a DRM device, linked into
|
||||
* &drm_device.clientlist. Protected by &drm_device.clientlist_mutex.
|
||||
*/
|
||||
struct list_head list;
|
||||
|
||||
/**
|
||||
* @funcs: DRM client functions (optional)
|
||||
*/
|
||||
const struct drm_client_funcs *funcs;
|
||||
|
||||
/**
|
||||
* @file: DRM file
|
||||
*/
|
||||
struct drm_file *file;
|
||||
};
|
||||
|
||||
int drm_client_new(struct drm_device *dev, struct drm_client_dev *client,
|
||||
const char *name, const struct drm_client_funcs *funcs);
|
||||
void drm_client_release(struct drm_client_dev *client);
|
||||
|
||||
void drm_client_dev_unregister(struct drm_device *dev);
|
||||
void drm_client_dev_hotplug(struct drm_device *dev);
|
||||
void drm_client_dev_restore(struct drm_device *dev);
|
||||
|
||||
/**
|
||||
* struct drm_client_buffer - DRM client buffer
|
||||
*/
|
||||
struct drm_client_buffer {
|
||||
/**
|
||||
* @client: DRM client
|
||||
*/
|
||||
struct drm_client_dev *client;
|
||||
|
||||
/**
|
||||
* @handle: Buffer handle
|
||||
*/
|
||||
u32 handle;
|
||||
|
||||
/**
|
||||
* @pitch: Buffer pitch
|
||||
*/
|
||||
u32 pitch;
|
||||
|
||||
/**
|
||||
* @gem: GEM object backing this buffer
|
||||
*/
|
||||
struct drm_gem_object *gem;
|
||||
|
||||
/**
|
||||
* @vaddr: Virtual address for the buffer
|
||||
*/
|
||||
void *vaddr;
|
||||
|
||||
/**
|
||||
* @fb: DRM framebuffer
|
||||
*/
|
||||
struct drm_framebuffer *fb;
|
||||
};
|
||||
|
||||
struct drm_client_buffer *
|
||||
drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
|
||||
void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
|
||||
|
||||
int drm_client_debugfs_init(struct drm_minor *minor);
|
||||
|
||||
#endif
|
||||
|
|
@ -290,6 +290,10 @@ struct drm_display_info {
|
|||
#define DRM_BUS_FLAG_DATA_MSB_TO_LSB (1<<4)
|
||||
/* data is transmitted LSB to MSB on the bus */
|
||||
#define DRM_BUS_FLAG_DATA_LSB_TO_MSB (1<<5)
|
||||
/* drive sync on pos. edge */
|
||||
#define DRM_BUS_FLAG_SYNC_POSEDGE (1<<6)
|
||||
/* drive sync on neg. edge */
|
||||
#define DRM_BUS_FLAG_SYNC_NEGEDGE (1<<7)
|
||||
|
||||
/**
|
||||
* @bus_flags: Additional information (like pixel signal polarity) for
|
||||
|
|
@ -1187,6 +1191,9 @@ struct drm_connector *
|
|||
drm_connector_list_iter_next(struct drm_connector_list_iter *iter);
|
||||
void drm_connector_list_iter_end(struct drm_connector_list_iter *iter);
|
||||
|
||||
bool drm_connector_has_possible_encoder(struct drm_connector *connector,
|
||||
struct drm_encoder *encoder);
|
||||
|
||||
/**
|
||||
* drm_for_each_connector_iter - connector_list iterator macro
|
||||
* @connector: &struct drm_connector pointer used as cursor
|
||||
|
|
@ -1199,4 +1206,17 @@ void drm_connector_list_iter_end(struct drm_connector_list_iter *iter);
|
|||
#define drm_for_each_connector_iter(connector, iter) \
|
||||
while ((connector = drm_connector_list_iter_next(iter)))
|
||||
|
||||
/**
|
||||
* drm_connector_for_each_possible_encoder - iterate connector's possible encoders
|
||||
* @connector: &struct drm_connector pointer
|
||||
* @encoder: &struct drm_encoder pointer used as cursor
|
||||
* @__i: int iteration cursor, for macro-internal use
|
||||
*/
|
||||
#define drm_connector_for_each_possible_encoder(connector, encoder, __i) \
|
||||
for ((__i) = 0; (__i) < ARRAY_SIZE((connector)->encoder_ids) && \
|
||||
(connector)->encoder_ids[(__i)] != 0; (__i)++) \
|
||||
for_each_if((encoder) = \
|
||||
drm_encoder_find((connector)->dev, NULL, \
|
||||
(connector)->encoder_ids[(__i)])) \
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -119,6 +119,29 @@ struct drm_crtc_state {
|
|||
bool zpos_changed : 1;
|
||||
bool color_mgmt_changed : 1;
|
||||
|
||||
/**
|
||||
* @no_vblank:
|
||||
*
|
||||
* Reflects the ability of a CRTC to send VBLANK events. This state
|
||||
* usually depends on the pipeline configuration, and the main usuage
|
||||
* is CRTCs feeding a writeback connector operating in oneshot mode.
|
||||
* In this case the VBLANK event is only generated when a job is queued
|
||||
* to the writeback connector, and we want the core to fake VBLANK
|
||||
* events when this part of the pipeline hasn't changed but others had
|
||||
* or when the CRTC and connectors are being disabled.
|
||||
*
|
||||
* __drm_atomic_helper_crtc_duplicate_state() will not reset the value
|
||||
* from the current state, the CRTC driver is then responsible for
|
||||
* updating this field when needed.
|
||||
*
|
||||
* Note that the combination of &drm_crtc_state.event == NULL and
|
||||
* &drm_crtc_state.no_blank == true is valid and usually used when the
|
||||
* writeback connector attached to the CRTC has a new job queued. In
|
||||
* this case the driver will send the VBLANK event on its own when the
|
||||
* writeback job is complete.
|
||||
*/
|
||||
bool no_vblank : 1;
|
||||
|
||||
/* attached planes bitmask:
|
||||
* WARNING: transitional helpers do not maintain plane_mask so
|
||||
* drivers not converted over to atomic helpers should not rely
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ struct drm_crtc_crc_entry {
|
|||
* @lock: protects the fields in this struct
|
||||
* @source: name of the currently configured source of CRCs
|
||||
* @opened: whether userspace has opened the data file for reading
|
||||
* @overflow: whether an overflow occured.
|
||||
* @entries: array of entries, with size of %DRM_CRC_ENTRIES_NR
|
||||
* @head: head of circular queue
|
||||
* @tail: tail of circular queue
|
||||
|
|
@ -52,7 +53,7 @@ struct drm_crtc_crc_entry {
|
|||
struct drm_crtc_crc {
|
||||
spinlock_t lock;
|
||||
const char *source;
|
||||
bool opened;
|
||||
bool opened, overflow;
|
||||
struct drm_crtc_crc_entry *entries;
|
||||
int head, tail;
|
||||
size_t values_cnt;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,27 @@ struct drm_device {
|
|||
struct mutex filelist_mutex;
|
||||
struct list_head filelist;
|
||||
|
||||
/**
|
||||
* @filelist_internal:
|
||||
*
|
||||
* List of open DRM files for in-kernel clients. Protected by @filelist_mutex.
|
||||
*/
|
||||
struct list_head filelist_internal;
|
||||
|
||||
/**
|
||||
* @clientlist_mutex:
|
||||
*
|
||||
* Protects @clientlist access.
|
||||
*/
|
||||
struct mutex clientlist_mutex;
|
||||
|
||||
/**
|
||||
* @clientlist:
|
||||
*
|
||||
* List of in-kernel clients. Protected by @clientlist_mutex.
|
||||
*/
|
||||
struct list_head clientlist;
|
||||
|
||||
/** \name Memory management */
|
||||
/*@{ */
|
||||
struct list_head maplist; /**< Linked list of regions */
|
||||
|
|
|
|||
|
|
@ -16,16 +16,10 @@ struct drm_mode_fb_cmd2;
|
|||
struct drm_plane;
|
||||
struct drm_plane_state;
|
||||
|
||||
int drm_fb_cma_fbdev_init_with_funcs(struct drm_device *dev,
|
||||
unsigned int preferred_bpp, unsigned int max_conn_count,
|
||||
const struct drm_framebuffer_funcs *funcs);
|
||||
int drm_fb_cma_fbdev_init(struct drm_device *dev, unsigned int preferred_bpp,
|
||||
unsigned int max_conn_count);
|
||||
void drm_fb_cma_fbdev_fini(struct drm_device *dev);
|
||||
|
||||
struct drm_fbdev_cma *drm_fbdev_cma_init_with_funcs(struct drm_device *dev,
|
||||
unsigned int preferred_bpp, unsigned int max_conn_count,
|
||||
const struct drm_framebuffer_funcs *funcs);
|
||||
struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
|
||||
unsigned int preferred_bpp, unsigned int max_conn_count);
|
||||
void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma);
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
struct drm_fb_helper;
|
||||
|
||||
#include <drm/drm_client.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <linux/kgdb.h>
|
||||
|
|
@ -154,6 +155,20 @@ struct drm_fb_helper_connector {
|
|||
* operations.
|
||||
*/
|
||||
struct drm_fb_helper {
|
||||
/**
|
||||
* @client:
|
||||
*
|
||||
* DRM client used by the generic fbdev emulation.
|
||||
*/
|
||||
struct drm_client_dev client;
|
||||
|
||||
/**
|
||||
* @buffer:
|
||||
*
|
||||
* Framebuffer used by the generic fbdev emulation.
|
||||
*/
|
||||
struct drm_client_buffer *buffer;
|
||||
|
||||
struct drm_framebuffer *fb;
|
||||
struct drm_device *dev;
|
||||
int crtc_count;
|
||||
|
|
@ -234,6 +249,12 @@ struct drm_fb_helper {
|
|||
int preferred_bpp;
|
||||
};
|
||||
|
||||
static inline struct drm_fb_helper *
|
||||
drm_fb_helper_from_client(struct drm_client_dev *client)
|
||||
{
|
||||
return container_of(client, struct drm_fb_helper, client);
|
||||
}
|
||||
|
||||
/**
|
||||
* define DRM_FB_HELPER_DEFAULT_OPS - helper define for drm drivers
|
||||
*
|
||||
|
|
@ -330,6 +351,10 @@ void drm_fb_helper_fbdev_teardown(struct drm_device *dev);
|
|||
|
||||
void drm_fb_helper_lastclose(struct drm_device *dev);
|
||||
void drm_fb_helper_output_poll_changed(struct drm_device *dev);
|
||||
|
||||
int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
int drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp);
|
||||
#else
|
||||
static inline void drm_fb_helper_prepare(struct drm_device *dev,
|
||||
struct drm_fb_helper *helper,
|
||||
|
|
@ -564,6 +589,19 @@ static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
|
|||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
|
|
|
|||
|
|
@ -980,11 +980,15 @@ struct drm_connector_helper_funcs {
|
|||
*
|
||||
* This hook is to be used by drivers implementing writeback connectors
|
||||
* that need a point when to commit the writeback job to the hardware.
|
||||
* The writeback_job to commit is available in
|
||||
* &drm_connector_state.writeback_job.
|
||||
*
|
||||
* This hook is optional.
|
||||
*
|
||||
* This callback is used by the atomic modeset helpers.
|
||||
*/
|
||||
void (*atomic_commit)(struct drm_connector *connector,
|
||||
struct drm_writeback_job *writeback_job);
|
||||
struct drm_connector_state *state);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np);
|
|||
#else
|
||||
static inline struct drm_panel *of_drm_find_panel(const struct device_node *np)
|
||||
{
|
||||
return NULL;
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -110,6 +110,12 @@ struct drm_writeback_job {
|
|||
struct dma_fence *out_fence;
|
||||
};
|
||||
|
||||
static inline struct drm_writeback_connector *
|
||||
drm_connector_to_writeback(struct drm_connector *connector)
|
||||
{
|
||||
return container_of(connector, struct drm_writeback_connector, base);
|
||||
}
|
||||
|
||||
int drm_writeback_connector_init(struct drm_device *dev,
|
||||
struct drm_writeback_connector *wb_connector,
|
||||
const struct drm_connector_funcs *con_funcs,
|
||||
|
|
|
|||
|
|
@ -16,16 +16,31 @@
|
|||
|
||||
/**
|
||||
* struct tinydrm_device - tinydrm device
|
||||
* @drm: DRM device
|
||||
* @pipe: Display pipe structure
|
||||
* @dirty_lock: Serializes framebuffer flushing
|
||||
* @fb_funcs: Framebuffer functions used when creating framebuffers
|
||||
*/
|
||||
struct tinydrm_device {
|
||||
/**
|
||||
* @drm: DRM device
|
||||
*/
|
||||
struct drm_device *drm;
|
||||
|
||||
/**
|
||||
* @pipe: Display pipe structure
|
||||
*/
|
||||
struct drm_simple_display_pipe pipe;
|
||||
|
||||
/**
|
||||
* @dirty_lock: Serializes framebuffer flushing
|
||||
*/
|
||||
struct mutex dirty_lock;
|
||||
|
||||
/**
|
||||
* @fb_funcs: Framebuffer functions used when creating framebuffers
|
||||
*/
|
||||
const struct drm_framebuffer_funcs *fb_funcs;
|
||||
|
||||
/**
|
||||
* @fb_dirty: Framebuffer dirty callback
|
||||
*/
|
||||
int (*fb_dirty)(struct drm_framebuffer *framebuffer,
|
||||
struct drm_file *file_priv, unsigned flags,
|
||||
unsigned color, struct drm_clip_rect *clips,
|
||||
|
|
|
|||
Loading…
Reference in a new issue