Merge tag 'drm-misc-next-2018-06-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 4.19: UAPI Changes: - Add writeback connector (Brian Starkey/Liviu Dudau) - Add "content type" property to HDMI connectors (Stanislav Lisovskiy) Cross-subsystem Changes: - some devicetree Docs update - fix compile breakage on ION due to the dma-buf cleanups (Christian König) Core Changes: - Reject over-sized allocation requests early (Chris Wilson) - gem-fb-helper: Always do implicit sync (Daniel Vetter) - dma-buf cleanups (Christian König) Driver Changes: - Fixes for the otm8009a panel driver (Philippe Cornu) - Add Innolux TV123WAM panel driver support (Sandeep Panda) - Move GEM BO to drm_framebuffer in few drivers (Daniel Stone) - i915 pinning improvements (Chris Wilson) - Stop consulting plane->fb/crtc in a few drivers (Ville Syrjälä) Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180621105428.GA20795@juma
This commit is contained in:
@@ -160,6 +160,14 @@ struct __drm_crtcs_state {
|
||||
struct __drm_connnectors_state {
|
||||
struct drm_connector *ptr;
|
||||
struct drm_connector_state *state, *old_state, *new_state;
|
||||
/**
|
||||
* @out_fence_ptr:
|
||||
*
|
||||
* User-provided pointer which the kernel uses to return a sync_file
|
||||
* file descriptor. Used by writeback connectors to signal completion of
|
||||
* the writeback.
|
||||
*/
|
||||
s32 __user *out_fence_ptr;
|
||||
};
|
||||
|
||||
struct drm_private_obj;
|
||||
@@ -594,6 +602,9 @@ void drm_atomic_set_fence_for_plane(struct drm_plane_state *plane_state,
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
||||
struct drm_crtc *crtc);
|
||||
int drm_atomic_set_writeback_fb_for_connector(
|
||||
struct drm_connector_state *conn_state,
|
||||
struct drm_framebuffer *fb);
|
||||
int __must_check
|
||||
drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc);
|
||||
@@ -601,9 +612,6 @@ int __must_check
|
||||
drm_atomic_add_affected_planes(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc);
|
||||
|
||||
void
|
||||
drm_atomic_clean_old_fb(struct drm_device *dev, unsigned plane_mask, int ret);
|
||||
|
||||
int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
|
||||
int __must_check drm_atomic_commit(struct drm_atomic_state *state);
|
||||
int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
|
||||
|
||||
@@ -97,7 +97,7 @@ struct drm_bridge_funcs {
|
||||
/**
|
||||
* @mode_fixup:
|
||||
*
|
||||
* This callback is used to validate and adjust a mode. The paramater
|
||||
* This callback is used to validate and adjust a mode. The parameter
|
||||
* mode is the display mode that should be fed to the next element in
|
||||
* the display chain, either the final &drm_connector or the next
|
||||
* &drm_bridge. The parameter adjusted_mode is the input mode the bridge
|
||||
@@ -178,6 +178,22 @@ struct drm_bridge_funcs {
|
||||
* then this would be &drm_encoder_helper_funcs.mode_set. The display
|
||||
* pipe (i.e. clocks and timing signals) is off when this function is
|
||||
* called.
|
||||
*
|
||||
* The adjusted_mode parameter is the mode output by the CRTC for the
|
||||
* first bridge in the chain. It can be different from the mode
|
||||
* parameter that contains the desired mode for the connector at the end
|
||||
* of the bridges chain, for instance when the first bridge in the chain
|
||||
* performs scaling. The adjusted mode is mostly useful for the first
|
||||
* bridge in the chain and is likely irrelevant for the other bridges.
|
||||
*
|
||||
* For atomic drivers the adjusted_mode is the mode stored in
|
||||
* &drm_crtc_state.adjusted_mode.
|
||||
*
|
||||
* NOTE:
|
||||
*
|
||||
* If a need arises to store and access modes adjusted for other
|
||||
* locations than the connection between the CRTC and the first bridge,
|
||||
* the DRM framework will have to be extended with DRM bridge states.
|
||||
*/
|
||||
void (*mode_set)(struct drm_bridge *bridge,
|
||||
struct drm_display_mode *mode,
|
||||
@@ -285,15 +301,15 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
|
||||
struct drm_bridge *previous);
|
||||
|
||||
bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
const struct drm_display_mode *mode);
|
||||
void drm_bridge_disable(struct drm_bridge *bridge);
|
||||
void drm_bridge_post_disable(struct drm_bridge *bridge);
|
||||
void drm_bridge_mode_set(struct drm_bridge *bridge,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
void drm_bridge_pre_enable(struct drm_bridge *bridge);
|
||||
void drm_bridge_enable(struct drm_bridge *bridge);
|
||||
|
||||
|
||||
@@ -418,6 +418,14 @@ struct drm_connector_state {
|
||||
*/
|
||||
enum hdmi_picture_aspect picture_aspect_ratio;
|
||||
|
||||
/**
|
||||
* @content_type: Connector property to control the
|
||||
* HDMI infoframe content type setting.
|
||||
* The %DRM_MODE_CONTENT_TYPE_\* values much
|
||||
* match the values.
|
||||
*/
|
||||
unsigned int content_type;
|
||||
|
||||
/**
|
||||
* @scaling_mode: Connector property to control the
|
||||
* upscaling, mostly used for built-in panels.
|
||||
@@ -429,6 +437,19 @@ struct drm_connector_state {
|
||||
* protection. This is most commonly used for HDCP.
|
||||
*/
|
||||
unsigned int content_protection;
|
||||
|
||||
/**
|
||||
* @writeback_job: Writeback job for writeback connectors
|
||||
*
|
||||
* Holds the framebuffer and out-fence for a writeback connector. As
|
||||
* the writeback completion may be asynchronous to the normal commit
|
||||
* cycle, the writeback job lifetime is managed separately from the
|
||||
* normal atomic state by this object.
|
||||
*
|
||||
* See also: drm_writeback_queue_job() and
|
||||
* drm_writeback_signal_completion()
|
||||
*/
|
||||
struct drm_writeback_job *writeback_job;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -608,6 +629,8 @@ struct drm_connector_funcs {
|
||||
* cleaned up by calling the @atomic_destroy_state hook in this
|
||||
* structure.
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*
|
||||
* Atomic drivers which don't subclass &struct drm_connector_state should use
|
||||
* drm_atomic_helper_connector_duplicate_state(). Drivers that subclass the
|
||||
* state structure to extend it with driver-private state should use
|
||||
@@ -634,6 +657,8 @@ struct drm_connector_funcs {
|
||||
*
|
||||
* Destroy a state duplicated with @atomic_duplicate_state and release
|
||||
* or unreference all resources it references
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*/
|
||||
void (*atomic_destroy_state)(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
@@ -1089,11 +1114,16 @@ int drm_mode_create_tv_properties(struct drm_device *dev,
|
||||
unsigned int num_modes,
|
||||
const char * const modes[]);
|
||||
int drm_mode_create_scaling_mode_property(struct drm_device *dev);
|
||||
int drm_connector_attach_content_type_property(struct drm_connector *dev);
|
||||
int drm_connector_attach_scaling_mode_property(struct drm_connector *connector,
|
||||
u32 scaling_mode_mask);
|
||||
int drm_connector_attach_content_protection_property(
|
||||
struct drm_connector *connector);
|
||||
int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
|
||||
int drm_mode_create_content_type_property(struct drm_device *dev);
|
||||
void drm_hdmi_avi_infoframe_content_type(struct hdmi_avi_infoframe *frame,
|
||||
const struct drm_connector_state *conn_state);
|
||||
|
||||
int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
|
||||
|
||||
int drm_mode_connector_set_path_property(struct drm_connector *connector,
|
||||
|
||||
@@ -134,10 +134,13 @@ struct drm_crtc_state {
|
||||
*
|
||||
* Internal display timings which can be used by the driver to handle
|
||||
* differences between the mode requested by userspace in @mode and what
|
||||
* is actually programmed into the hardware. It is purely driver
|
||||
* implementation defined what exactly this adjusted mode means. Usually
|
||||
* it is used to store the hardware display timings used between the
|
||||
* CRTC and encoder blocks.
|
||||
* is actually programmed into the hardware.
|
||||
*
|
||||
* For drivers using drm_bridge, this stores hardware display timings
|
||||
* used between the CRTC and the first bridge. For other drivers, the
|
||||
* meaning of the adjusted_mode field is purely driver implementation
|
||||
* defined information, and will usually be used to store the hardware
|
||||
* display timings used between the CRTC and encoder blocks.
|
||||
*/
|
||||
struct drm_display_mode adjusted_mode;
|
||||
|
||||
@@ -503,6 +506,8 @@ struct drm_crtc_funcs {
|
||||
* cleaned up by calling the @atomic_destroy_state hook in this
|
||||
* structure.
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*
|
||||
* Atomic drivers which don't subclass &struct drm_crtc_state should use
|
||||
* drm_atomic_helper_crtc_duplicate_state(). Drivers that subclass the
|
||||
* state structure to extend it with driver-private state should use
|
||||
@@ -529,6 +534,8 @@ struct drm_crtc_funcs {
|
||||
*
|
||||
* Destroy a state duplicated with @atomic_duplicate_state and release
|
||||
* or unreference all resources it references
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*/
|
||||
void (*atomic_destroy_state)(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
|
||||
@@ -192,6 +192,13 @@ struct drm_file {
|
||||
*/
|
||||
unsigned aspect_ratio_allowed:1;
|
||||
|
||||
/**
|
||||
* @writeback_connectors:
|
||||
*
|
||||
* True if client understands writeback connectors
|
||||
*/
|
||||
unsigned writeback_connectors:1;
|
||||
|
||||
/**
|
||||
* @is_master:
|
||||
*
|
||||
|
||||
@@ -109,6 +109,38 @@ enum drm_mm_insert_mode {
|
||||
* Allocates the node from the bottom of the found hole.
|
||||
*/
|
||||
DRM_MM_INSERT_EVICT,
|
||||
|
||||
/**
|
||||
* @DRM_MM_INSERT_ONCE:
|
||||
*
|
||||
* Only check the first hole for suitablity and report -ENOSPC
|
||||
* immediately otherwise, rather than check every hole until a
|
||||
* suitable one is found. Can only be used in conjunction with another
|
||||
* search method such as DRM_MM_INSERT_HIGH or DRM_MM_INSERT_LOW.
|
||||
*/
|
||||
DRM_MM_INSERT_ONCE = BIT(31),
|
||||
|
||||
/**
|
||||
* @DRM_MM_INSERT_HIGHEST:
|
||||
*
|
||||
* Only check the highest hole (the hole with the largest address) and
|
||||
* insert the node at the top of the hole or report -ENOSPC if
|
||||
* unsuitable.
|
||||
*
|
||||
* Does not search all holes.
|
||||
*/
|
||||
DRM_MM_INSERT_HIGHEST = DRM_MM_INSERT_HIGH | DRM_MM_INSERT_ONCE,
|
||||
|
||||
/**
|
||||
* @DRM_MM_INSERT_LOWEST:
|
||||
*
|
||||
* Only check the lowest hole (the hole with the smallest address) and
|
||||
* insert the node at the bottom of the hole or report -ENOSPC if
|
||||
* unsuitable.
|
||||
*
|
||||
* Does not search all holes.
|
||||
*/
|
||||
DRM_MM_INSERT_LOWEST = DRM_MM_INSERT_LOW | DRM_MM_INSERT_ONCE,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -173,7 +205,7 @@ struct drm_mm {
|
||||
struct drm_mm_node head_node;
|
||||
/* Keep an interval_tree for fast lookup of drm_mm_nodes by address. */
|
||||
struct rb_root_cached interval_tree;
|
||||
struct rb_root holes_size;
|
||||
struct rb_root_cached holes_size;
|
||||
struct rb_root holes_addr;
|
||||
|
||||
unsigned long scan_active;
|
||||
|
||||
@@ -726,6 +726,11 @@ struct drm_mode_config {
|
||||
* HDMI infoframe aspect ratio setting.
|
||||
*/
|
||||
struct drm_property *aspect_ratio_property;
|
||||
/**
|
||||
* @content_type_property: Optional connector property to control the
|
||||
* HDMI infoframe content type setting.
|
||||
*/
|
||||
struct drm_property *content_type_property;
|
||||
/**
|
||||
* @degamma_lut_property: Optional CRTC property to set the LUT used to
|
||||
* convert the framebuffer's colors to linear gamma.
|
||||
@@ -779,6 +784,29 @@ struct drm_mode_config {
|
||||
*/
|
||||
struct drm_property *panel_orientation_property;
|
||||
|
||||
/**
|
||||
* @writeback_fb_id_property: Property for writeback connectors, storing
|
||||
* the ID of the output framebuffer.
|
||||
* See also: drm_writeback_connector_init()
|
||||
*/
|
||||
struct drm_property *writeback_fb_id_property;
|
||||
|
||||
/**
|
||||
* @writeback_pixel_formats_property: Property for writeback connectors,
|
||||
* storing an array of the supported pixel formats for the writeback
|
||||
* engine (read-only).
|
||||
* See also: drm_writeback_connector_init()
|
||||
*/
|
||||
struct drm_property *writeback_pixel_formats_property;
|
||||
/**
|
||||
* @writeback_out_fence_ptr_property: Property for writeback connectors,
|
||||
* fd pointer representing the outgoing fences for a writeback
|
||||
* connector. Userspace should provide a pointer to a value of type s32,
|
||||
* and then cast that pointer to u64.
|
||||
* See also: drm_writeback_connector_init()
|
||||
*/
|
||||
struct drm_property *writeback_out_fence_ptr_property;
|
||||
|
||||
/* dumb ioctl parameters */
|
||||
uint32_t preferred_depth, prefer_shadow;
|
||||
|
||||
|
||||
@@ -974,6 +974,17 @@ struct drm_connector_helper_funcs {
|
||||
*/
|
||||
int (*atomic_check)(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
|
||||
/**
|
||||
* @atomic_commit:
|
||||
*
|
||||
* This hook is to be used by drivers implementing writeback connectors
|
||||
* that need a point when to commit the writeback job to the hardware.
|
||||
*
|
||||
* This callback is used by the atomic modeset helpers.
|
||||
*/
|
||||
void (*atomic_commit)(struct drm_connector *connector,
|
||||
struct drm_writeback_job *writeback_job);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -89,6 +89,7 @@ struct drm_panel {
|
||||
struct drm_device *drm;
|
||||
struct drm_connector *connector;
|
||||
struct device *dev;
|
||||
struct device_link *link;
|
||||
|
||||
const struct drm_panel_funcs *funcs;
|
||||
|
||||
|
||||
@@ -288,6 +288,8 @@ struct drm_plane_funcs {
|
||||
* cleaned up by calling the @atomic_destroy_state hook in this
|
||||
* structure.
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*
|
||||
* Atomic drivers which don't subclass &struct drm_plane_state should use
|
||||
* drm_atomic_helper_plane_duplicate_state(). Drivers that subclass the
|
||||
* state structure to extend it with driver-private state should use
|
||||
@@ -314,6 +316,8 @@ struct drm_plane_funcs {
|
||||
*
|
||||
* Destroy a state duplicated with @atomic_duplicate_state and release
|
||||
* or unreference all resources it references
|
||||
*
|
||||
* This callback is mandatory for atomic drivers.
|
||||
*/
|
||||
void (*atomic_destroy_state)(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
@@ -431,7 +435,10 @@ struct drm_plane_funcs {
|
||||
* This optional hook is used for the DRM to determine if the given
|
||||
* format/modifier combination is valid for the plane. This allows the
|
||||
* DRM to generate the correct format bitmask (which formats apply to
|
||||
* which modifier).
|
||||
* which modifier), and to valdiate modifiers at atomic_check time.
|
||||
*
|
||||
* If not present, then any modifier in the plane's modifier
|
||||
* list is allowed with any of the plane's formats.
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
|
||||
@@ -82,7 +82,7 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev,
|
||||
struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
|
||||
struct dma_buf_export_info *exp_info);
|
||||
void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
|
||||
int drm_gem_map_attach(struct dma_buf *dma_buf, struct device *target_dev,
|
||||
int drm_gem_map_attach(struct dma_buf *dma_buf,
|
||||
struct dma_buf_attachment *attach);
|
||||
void drm_gem_map_detach(struct dma_buf *dma_buf,
|
||||
struct dma_buf_attachment *attach);
|
||||
@@ -93,10 +93,6 @@ void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
|
||||
enum dma_data_direction dir);
|
||||
void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf);
|
||||
void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr);
|
||||
void *drm_gem_dmabuf_kmap_atomic(struct dma_buf *dma_buf,
|
||||
unsigned long page_num);
|
||||
void drm_gem_dmabuf_kunmap_atomic(struct dma_buf *dma_buf,
|
||||
unsigned long page_num, void *addr);
|
||||
void *drm_gem_dmabuf_kmap(struct dma_buf *dma_buf, unsigned long page_num);
|
||||
void drm_gem_dmabuf_kunmap(struct dma_buf *dma_buf, unsigned long page_num,
|
||||
void *addr);
|
||||
|
||||
130
include/drm/drm_writeback.h
Normal file
130
include/drm/drm_writeback.h
Normal file
@@ -0,0 +1,130 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
|
||||
* Author: Brian Starkey <brian.starkey@arm.com>
|
||||
*
|
||||
* This program is free software and is provided to you under the terms of the
|
||||
* GNU General Public License version 2 as published by the Free Software
|
||||
* Foundation, and any use by you of this program is subject to the terms
|
||||
* of such GNU licence.
|
||||
*/
|
||||
|
||||
#ifndef __DRM_WRITEBACK_H__
|
||||
#define __DRM_WRITEBACK_H__
|
||||
#include <drm/drm_connector.h>
|
||||
#include <drm/drm_encoder.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct drm_writeback_connector {
|
||||
struct drm_connector base;
|
||||
|
||||
/**
|
||||
* @encoder: Internal encoder used by the connector to fulfill
|
||||
* the DRM framework requirements. The users of the
|
||||
* @drm_writeback_connector control the behaviour of the @encoder
|
||||
* by passing the @enc_funcs parameter to drm_writeback_connector_init()
|
||||
* function.
|
||||
*/
|
||||
struct drm_encoder encoder;
|
||||
|
||||
/**
|
||||
* @pixel_formats_blob_ptr:
|
||||
*
|
||||
* DRM blob property data for the pixel formats list on writeback
|
||||
* connectors
|
||||
* See also drm_writeback_connector_init()
|
||||
*/
|
||||
struct drm_property_blob *pixel_formats_blob_ptr;
|
||||
|
||||
/** @job_lock: Protects job_queue */
|
||||
spinlock_t job_lock;
|
||||
|
||||
/**
|
||||
* @job_queue:
|
||||
*
|
||||
* Holds a list of a connector's writeback jobs; the last item is the
|
||||
* most recent. The first item may be either waiting for the hardware
|
||||
* to begin writing, or currently being written.
|
||||
*
|
||||
* See also: drm_writeback_queue_job() and
|
||||
* drm_writeback_signal_completion()
|
||||
*/
|
||||
struct list_head job_queue;
|
||||
|
||||
/**
|
||||
* @fence_context:
|
||||
*
|
||||
* timeline context used for fence operations.
|
||||
*/
|
||||
unsigned int fence_context;
|
||||
/**
|
||||
* @fence_lock:
|
||||
*
|
||||
* spinlock to protect the fences in the fence_context.
|
||||
*/
|
||||
spinlock_t fence_lock;
|
||||
/**
|
||||
* @fence_seqno:
|
||||
*
|
||||
* Seqno variable used as monotonic counter for the fences
|
||||
* created on the connector's timeline.
|
||||
*/
|
||||
unsigned long fence_seqno;
|
||||
/**
|
||||
* @timeline_name:
|
||||
*
|
||||
* The name of the connector's fence timeline.
|
||||
*/
|
||||
char timeline_name[32];
|
||||
};
|
||||
|
||||
struct drm_writeback_job {
|
||||
/**
|
||||
* @cleanup_work:
|
||||
*
|
||||
* Used to allow drm_writeback_signal_completion to defer dropping the
|
||||
* framebuffer reference to a workqueue
|
||||
*/
|
||||
struct work_struct cleanup_work;
|
||||
|
||||
/**
|
||||
* @list_entry:
|
||||
*
|
||||
* List item for the writeback connector's @job_queue
|
||||
*/
|
||||
struct list_head list_entry;
|
||||
|
||||
/**
|
||||
* @fb:
|
||||
*
|
||||
* Framebuffer to be written to by the writeback connector. Do not set
|
||||
* directly, use drm_atomic_set_writeback_fb_for_connector()
|
||||
*/
|
||||
struct drm_framebuffer *fb;
|
||||
|
||||
/**
|
||||
* @out_fence:
|
||||
*
|
||||
* Fence which will signal once the writeback has completed
|
||||
*/
|
||||
struct dma_fence *out_fence;
|
||||
};
|
||||
|
||||
int drm_writeback_connector_init(struct drm_device *dev,
|
||||
struct drm_writeback_connector *wb_connector,
|
||||
const struct drm_connector_funcs *con_funcs,
|
||||
const struct drm_encoder_helper_funcs *enc_helper_funcs,
|
||||
const u32 *formats, int n_formats);
|
||||
|
||||
void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
|
||||
struct drm_writeback_job *job);
|
||||
|
||||
void drm_writeback_cleanup_job(struct drm_writeback_job *job);
|
||||
|
||||
void
|
||||
drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
|
||||
int status);
|
||||
|
||||
struct dma_fence *
|
||||
drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
|
||||
#endif
|
||||
Reference in New Issue
Block a user