Merge tag 'drm-misc-next-2018-11-07' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for v4.21, part 1: UAPI Changes: - Add syncobj timeline support to drm. Cross-subsystem Changes: - Remove shared fence staging in dma-buf's fence object, and allow reserving more than 1 fence and add more paranoia when debugging. - Constify infoframe functions in video/hdmi. Core Changes: - Add vkms todo, and a lot of assorted doc fixes. - Drop transitional helpers and convert drivers to use drm_atomic_helper_shutdown(). - Move atomic state helper functions to drm_atomic_state_helper.[ch] - Refactor drm selftests, and add new tests. - DP MST atomic state cleanups. - Drop EXPORT_SYMBOL from drm leases. - Lease cleanups and fixes. - Create render node for vgem. Driver Changes: - Fix build failure in imx without fbdev emulation. - Add rotation quirk for GPD win2 panel. - Add support for various CDTech panels, Banana Pi Panel, DLC1010GIG, Olimex LCD-O-LinuXino, Samsung S6D16D0, Truly NT35597 WQXGA, Himax HX8357D, simulated RTSM AEMv8. - Add dw_hdmi support to rockchip driver. - Fix YUV support in vc4. - Fix resource id handling in virtio. - Make rockchip use dw-mipi-dsi bridge driver, and add dual dsi support. - Advertise that tinydrm only supports DRM_FORMAT_MOD_LINEAR. - Convert many drivers to use atomic helpers, and drm_fbdev_generic_setup(). - Add Mali linear tiled formats, and enable them in the Mali-DP driver. - Add support for H6 DE3 mixer 0, DW HDMI, HDMI PHY and TCON TOP. - Assorted driver cleanups and fixes. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/be7ebd91-edd9-8fa4-4286-1c57e3165113@linux.intel.com
This commit is contained in:
@@ -133,6 +133,7 @@ struct dw_hdmi_plat_data {
|
||||
const struct dw_hdmi_phy_ops *phy_ops;
|
||||
const char *phy_name;
|
||||
void *phy_data;
|
||||
unsigned int phy_force_vendor;
|
||||
|
||||
/* Synopsys PHY support */
|
||||
const struct dw_hdmi_mpll_config *mpll_cfg;
|
||||
|
@@ -19,6 +19,13 @@ struct dw_mipi_dsi_phy_ops {
|
||||
unsigned int *lane_mbps);
|
||||
};
|
||||
|
||||
struct dw_mipi_dsi_host_ops {
|
||||
int (*attach)(void *priv_data,
|
||||
struct mipi_dsi_device *dsi);
|
||||
int (*detach)(void *priv_data,
|
||||
struct mipi_dsi_device *dsi);
|
||||
};
|
||||
|
||||
struct dw_mipi_dsi_plat_data {
|
||||
void __iomem *base;
|
||||
unsigned int max_data_lanes;
|
||||
@@ -27,6 +34,7 @@ struct dw_mipi_dsi_plat_data {
|
||||
const struct drm_display_mode *mode);
|
||||
|
||||
const struct dw_mipi_dsi_phy_ops *phy_ops;
|
||||
const struct dw_mipi_dsi_host_ops *host_ops;
|
||||
|
||||
void *priv_data;
|
||||
};
|
||||
@@ -35,10 +43,8 @@ struct dw_mipi_dsi *dw_mipi_dsi_probe(struct platform_device *pdev,
|
||||
const struct dw_mipi_dsi_plat_data
|
||||
*plat_data);
|
||||
void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi);
|
||||
struct dw_mipi_dsi *dw_mipi_dsi_bind(struct platform_device *pdev,
|
||||
struct drm_encoder *encoder,
|
||||
const struct dw_mipi_dsi_plat_data
|
||||
*plat_data);
|
||||
int dw_mipi_dsi_bind(struct dw_mipi_dsi *dsi, struct drm_encoder *encoder);
|
||||
void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi);
|
||||
void dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave);
|
||||
|
||||
#endif /* __DW_MIPI_DSI__ */
|
||||
|
@@ -110,4 +110,10 @@ static inline bool drm_can_sleep(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DRM_DEBUG_SELFTEST_MODULE)
|
||||
#define EXPORT_SYMBOL_FOR_TESTS_ONLY(x) EXPORT_SYMBOL(x)
|
||||
#else
|
||||
#define EXPORT_SYMBOL_FOR_TESTS_ONLY(x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@@ -265,7 +265,6 @@ struct __drm_private_objs_state {
|
||||
* struct drm_atomic_state - the global state object for atomic updates
|
||||
* @ref: count of all references to this state (will not be freed until zero)
|
||||
* @dev: parent DRM device
|
||||
* @allow_modeset: allow full modeset
|
||||
* @legacy_cursor_update: hint to enforce legacy cursor IOCTL semantics
|
||||
* @async_update: hint for asynchronous plane update
|
||||
* @planes: pointer to array of structures with per-plane data
|
||||
@@ -284,6 +283,15 @@ struct drm_atomic_state {
|
||||
struct kref ref;
|
||||
|
||||
struct drm_device *dev;
|
||||
|
||||
/**
|
||||
* @allow_modeset:
|
||||
*
|
||||
* Allow full modeset. This is used by the ATOMIC IOCTL handler to
|
||||
* implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should
|
||||
* never consult this flag, instead looking at the output of
|
||||
* drm_atomic_crtc_needs_modeset().
|
||||
*/
|
||||
bool allow_modeset : 1;
|
||||
bool legacy_cursor_update : 1;
|
||||
bool async_update : 1;
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_modeset_helper_vtables.h>
|
||||
#include <drm/drm_modeset_helper.h>
|
||||
#include <drm/drm_atomic_state_helper.h>
|
||||
#include <drm/drm_util.h>
|
||||
|
||||
struct drm_atomic_state;
|
||||
@@ -144,51 +145,6 @@ int drm_atomic_helper_page_flip_target(
|
||||
uint32_t flags,
|
||||
uint32_t target,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
struct drm_encoder *
|
||||
drm_atomic_helper_best_encoder(struct drm_connector *connector);
|
||||
|
||||
/* default implementations for state handling */
|
||||
void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc);
|
||||
void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
struct drm_crtc_state *
|
||||
drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc);
|
||||
void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state);
|
||||
void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
|
||||
void __drm_atomic_helper_plane_reset(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
void drm_atomic_helper_plane_reset(struct drm_plane *plane);
|
||||
void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
struct drm_plane_state *
|
||||
drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane);
|
||||
void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state);
|
||||
void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
|
||||
void __drm_atomic_helper_connector_reset(struct drm_connector *connector,
|
||||
struct drm_connector_state *conn_state);
|
||||
void drm_atomic_helper_connector_reset(struct drm_connector *connector);
|
||||
void
|
||||
__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
struct drm_connector_state *
|
||||
drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);
|
||||
struct drm_atomic_state *
|
||||
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void
|
||||
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
|
||||
void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
||||
u16 *red, u16 *green, u16 *blue,
|
||||
uint32_t size,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
|
||||
struct drm_private_state *state);
|
||||
|
||||
/**
|
||||
* drm_atomic_crtc_for_each_plane - iterate over planes currently attached to CRTC
|
||||
|
80
include/drm/drm_atomic_state_helper.h
Normal file
80
include/drm/drm_atomic_state_helper.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Intel Corp.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Rob Clark <robdclark@gmail.com>
|
||||
* Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_crtc;
|
||||
struct drm_crtc_state;
|
||||
struct drm_plane;
|
||||
struct drm_plane_state;
|
||||
struct drm_connector;
|
||||
struct drm_connector_state;
|
||||
struct drm_private_obj;
|
||||
struct drm_private_state;
|
||||
struct drm_modeset_acquire_ctx;
|
||||
struct drm_device;
|
||||
|
||||
void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc);
|
||||
void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
struct drm_crtc_state *
|
||||
drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc);
|
||||
void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state);
|
||||
void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state);
|
||||
|
||||
void __drm_atomic_helper_plane_reset(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
void drm_atomic_helper_plane_reset(struct drm_plane *plane);
|
||||
void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
struct drm_plane_state *
|
||||
drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane);
|
||||
void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state);
|
||||
void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
|
||||
void __drm_atomic_helper_connector_reset(struct drm_connector *connector,
|
||||
struct drm_connector_state *conn_state);
|
||||
void drm_atomic_helper_connector_reset(struct drm_connector *connector);
|
||||
void
|
||||
__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
struct drm_connector_state *
|
||||
drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);
|
||||
struct drm_atomic_state *
|
||||
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void
|
||||
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
|
||||
void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
|
||||
struct drm_connector_state *state);
|
||||
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
||||
u16 *red, u16 *green, u16 *blue,
|
||||
uint32_t size,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
|
||||
struct drm_private_state *state);
|
@@ -1133,6 +1133,7 @@ int drm_connector_init(struct drm_device *dev,
|
||||
struct drm_connector *connector,
|
||||
const struct drm_connector_funcs *funcs,
|
||||
int connector_type);
|
||||
void drm_connector_attach_edid_property(struct drm_connector *connector);
|
||||
int drm_connector_register(struct drm_connector *connector);
|
||||
void drm_connector_unregister(struct drm_connector *connector);
|
||||
int drm_connector_attach_encoder(struct drm_connector *connector,
|
||||
|
@@ -57,12 +57,6 @@ int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
|
||||
|
||||
void drm_helper_resume_force_mode(struct drm_device *dev);
|
||||
|
||||
int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode, int x, int y,
|
||||
struct drm_framebuffer *old_fb);
|
||||
int drm_helper_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
|
||||
struct drm_framebuffer *old_fb);
|
||||
|
||||
/* drm_probe_helper.c */
|
||||
int drm_helper_probe_single_connector_modes(struct drm_connector
|
||||
*connector, uint32_t maxX,
|
||||
|
@@ -685,6 +685,8 @@
|
||||
# define DP_EDP_12 0x01
|
||||
# define DP_EDP_13 0x02
|
||||
# define DP_EDP_14 0x03
|
||||
# define DP_EDP_14a 0x04 /* eDP 1.4a */
|
||||
# define DP_EDP_14b 0x05 /* eDP 1.4b */
|
||||
|
||||
#define DP_EDP_GENERAL_CAP_1 0x701
|
||||
# define DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP (1 << 0)
|
||||
|
@@ -409,7 +409,6 @@ struct drm_dp_payload {
|
||||
struct drm_dp_mst_topology_state {
|
||||
struct drm_private_state base;
|
||||
int avail_slots;
|
||||
struct drm_atomic_state *state;
|
||||
struct drm_dp_mst_topology_mgr *mgr;
|
||||
};
|
||||
|
||||
@@ -497,11 +496,6 @@ struct drm_dp_mst_topology_mgr {
|
||||
*/
|
||||
int pbn_div;
|
||||
|
||||
/**
|
||||
* @state: State information for topology manager
|
||||
*/
|
||||
struct drm_dp_mst_topology_state *state;
|
||||
|
||||
/**
|
||||
* @funcs: Atomic helper callbacks
|
||||
*/
|
||||
|
@@ -26,8 +26,6 @@ void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma);
|
||||
|
||||
void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
|
||||
void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
|
||||
void drm_fbdev_cma_set_suspend_unlocked(struct drm_fbdev_cma *fbdev_cma,
|
||||
bool state);
|
||||
|
||||
struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
|
||||
unsigned int plane);
|
||||
|
@@ -164,14 +164,14 @@ struct drm_file {
|
||||
* See also the :ref:`section on primary nodes and authentication
|
||||
* <drm_primary_node>`.
|
||||
*/
|
||||
unsigned authenticated :1;
|
||||
bool authenticated;
|
||||
|
||||
/**
|
||||
* @stereo_allowed:
|
||||
*
|
||||
* True when the client has asked us to expose stereo 3D mode flags.
|
||||
*/
|
||||
unsigned stereo_allowed :1;
|
||||
bool stereo_allowed;
|
||||
|
||||
/**
|
||||
* @universal_planes:
|
||||
@@ -179,10 +179,10 @@ struct drm_file {
|
||||
* True if client understands CRTC primary planes and cursor planes
|
||||
* in the plane list. Automatically set when @atomic is set.
|
||||
*/
|
||||
unsigned universal_planes:1;
|
||||
bool universal_planes;
|
||||
|
||||
/** @atomic: True if client understands atomic properties. */
|
||||
unsigned atomic:1;
|
||||
bool atomic;
|
||||
|
||||
/**
|
||||
* @aspect_ratio_allowed:
|
||||
@@ -190,14 +190,14 @@ struct drm_file {
|
||||
* True, if client can handle picture aspect ratios, and has requested
|
||||
* to pass this information along with the mode.
|
||||
*/
|
||||
unsigned aspect_ratio_allowed:1;
|
||||
bool aspect_ratio_allowed;
|
||||
|
||||
/**
|
||||
* @writeback_connectors:
|
||||
*
|
||||
* True if client understands writeback connectors
|
||||
*/
|
||||
unsigned writeback_connectors:1;
|
||||
bool writeback_connectors;
|
||||
|
||||
/**
|
||||
* @is_master:
|
||||
@@ -208,7 +208,7 @@ struct drm_file {
|
||||
* See also the :ref:`section on primary nodes and authentication
|
||||
* <drm_primary_node>`.
|
||||
*/
|
||||
unsigned is_master:1;
|
||||
bool is_master;
|
||||
|
||||
/**
|
||||
* @master:
|
||||
|
@@ -52,25 +52,86 @@ struct drm_mode_fb_cmd2;
|
||||
|
||||
/**
|
||||
* struct drm_format_info - information about a DRM format
|
||||
* @format: 4CC format identifier (DRM_FORMAT_*)
|
||||
* @depth: Color depth (number of bits per pixel excluding padding bits),
|
||||
* valid for a subset of RGB formats only. This is a legacy field, do not
|
||||
* use in new code and set to 0 for new formats.
|
||||
* @num_planes: Number of color planes (1 to 3)
|
||||
* @cpp: Number of bytes per pixel (per plane)
|
||||
* @hsub: Horizontal chroma subsampling factor
|
||||
* @vsub: Vertical chroma subsampling factor
|
||||
* @has_alpha: Does the format embeds an alpha component?
|
||||
* @is_yuv: Is it a YUV format?
|
||||
*/
|
||||
struct drm_format_info {
|
||||
/** @format: 4CC format identifier (DRM_FORMAT_*) */
|
||||
u32 format;
|
||||
|
||||
/**
|
||||
* @depth:
|
||||
*
|
||||
* Color depth (number of bits per pixel excluding padding bits),
|
||||
* valid for a subset of RGB formats only. This is a legacy field, do
|
||||
* not use in new code and set to 0 for new formats.
|
||||
*/
|
||||
u8 depth;
|
||||
|
||||
/** @num_planes: Number of color planes (1 to 3) */
|
||||
u8 num_planes;
|
||||
u8 cpp[3];
|
||||
|
||||
union {
|
||||
/**
|
||||
* @cpp:
|
||||
*
|
||||
* Number of bytes per pixel (per plane), this is aliased with
|
||||
* @char_per_block. It is deprecated in favour of using the
|
||||
* triplet @char_per_block, @block_w, @block_h for better
|
||||
* describing the pixel format.
|
||||
*/
|
||||
u8 cpp[3];
|
||||
|
||||
/**
|
||||
* @char_per_block:
|
||||
*
|
||||
* Number of bytes per block (per plane), where blocks are
|
||||
* defined as a rectangle of pixels which are stored next to
|
||||
* each other in a byte aligned memory region. Together with
|
||||
* @block_w and @block_h this is used to properly describe tiles
|
||||
* in tiled formats or to describe groups of pixels in packed
|
||||
* formats for which the memory needed for a single pixel is not
|
||||
* byte aligned.
|
||||
*
|
||||
* @cpp has been kept for historical reasons because there are
|
||||
* a lot of places in drivers where it's used. In drm core for
|
||||
* generic code paths the preferred way is to use
|
||||
* @char_per_block, drm_format_info_block_width() and
|
||||
* drm_format_info_block_height() which allows handling both
|
||||
* block and non-block formats in the same way.
|
||||
*
|
||||
* For formats that are intended to be used only with non-linear
|
||||
* modifiers both @cpp and @char_per_block must be 0 in the
|
||||
* generic format table. Drivers could supply accurate
|
||||
* information from their drm_mode_config.get_format_info hook
|
||||
* if they want the core to be validating the pitch.
|
||||
*/
|
||||
u8 char_per_block[3];
|
||||
};
|
||||
|
||||
/**
|
||||
* @block_w:
|
||||
*
|
||||
* Block width in pixels, this is intended to be accessed through
|
||||
* drm_format_info_block_width()
|
||||
*/
|
||||
u8 block_w[3];
|
||||
|
||||
/**
|
||||
* @block_h:
|
||||
*
|
||||
* Block height in pixels, this is intended to be accessed through
|
||||
* drm_format_info_block_height()
|
||||
*/
|
||||
u8 block_h[3];
|
||||
|
||||
/** @hsub: Horizontal chroma subsampling factor */
|
||||
u8 hsub;
|
||||
/** @vsub: Vertical chroma subsampling factor */
|
||||
u8 vsub;
|
||||
|
||||
/** @has_alpha: Does the format embeds an alpha component? */
|
||||
bool has_alpha;
|
||||
|
||||
/** @is_yuv: Is it a YUV format? */
|
||||
bool is_yuv;
|
||||
};
|
||||
|
||||
@@ -96,6 +157,12 @@ int drm_format_horz_chroma_subsampling(uint32_t format);
|
||||
int drm_format_vert_chroma_subsampling(uint32_t format);
|
||||
int drm_format_plane_width(int width, uint32_t format, int plane);
|
||||
int drm_format_plane_height(int height, uint32_t format, int plane);
|
||||
unsigned int drm_format_info_block_width(const struct drm_format_info *info,
|
||||
int plane);
|
||||
unsigned int drm_format_info_block_height(const struct drm_format_info *info,
|
||||
int plane);
|
||||
uint64_t drm_format_info_min_pitch(const struct drm_format_info *info,
|
||||
int plane, unsigned int buffer_width);
|
||||
const char *drm_get_format_name(uint32_t format, struct drm_format_name_buf *buf);
|
||||
|
||||
#endif /* __DRM_FOURCC_H__ */
|
||||
|
@@ -168,6 +168,12 @@ struct mipi_dsi_device_info {
|
||||
* @format: pixel format for video mode
|
||||
* @lanes: number of active data lanes
|
||||
* @mode_flags: DSI operation mode related flags
|
||||
* @hs_rate: maximum lane frequency for high speed mode in hertz, this should
|
||||
* be set to the real limits of the hardware, zero is only accepted for
|
||||
* legacy drivers
|
||||
* @lp_rate: maximum lane frequency for low power mode in hertz, this should
|
||||
* be set to the real limits of the hardware, zero is only accepted for
|
||||
* legacy drivers
|
||||
*/
|
||||
struct mipi_dsi_device {
|
||||
struct mipi_dsi_host *host;
|
||||
@@ -178,6 +184,8 @@ struct mipi_dsi_device {
|
||||
unsigned int lanes;
|
||||
enum mipi_dsi_pixel_format format;
|
||||
unsigned long mode_flags;
|
||||
unsigned long hs_rate;
|
||||
unsigned long lp_rate;
|
||||
};
|
||||
|
||||
#define MIPI_DSI_MODULE_PREFIX "mipi-dsi:"
|
||||
|
@@ -52,6 +52,12 @@ struct drm_mode_config_funcs {
|
||||
* requested metadata, but most of that is left to the driver. See
|
||||
* &struct drm_mode_fb_cmd2 for details.
|
||||
*
|
||||
* To validate the pixel format and modifier drivers can use
|
||||
* drm_any_plane_has_format() to make sure at least one plane supports
|
||||
* the requested values. Note that the driver must first determine the
|
||||
* actual modifier used if the request doesn't have it specified,
|
||||
* ie. when (@mode_cmd->flags & DRM_MODE_FB_MODIFIERS) == 0.
|
||||
*
|
||||
* If the parameters are deemed valid and the backing storage objects in
|
||||
* the underlying memory manager all exist, then the driver allocates
|
||||
* a new &drm_framebuffer structure, subclassed to contain
|
||||
@@ -809,6 +815,13 @@ struct drm_mode_config {
|
||||
|
||||
/* dumb ioctl parameters */
|
||||
uint32_t preferred_depth, prefer_shadow;
|
||||
|
||||
/**
|
||||
* @quirk_addfb_prefer_xbgr_30bpp:
|
||||
*
|
||||
* Special hack for legacy ADDFB to keep nouveau userspace happy. Should
|
||||
* only ever be set by the nouveau kernel driver.
|
||||
*/
|
||||
bool quirk_addfb_prefer_xbgr_30bpp;
|
||||
|
||||
/**
|
||||
|
@@ -798,5 +798,7 @@ static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
|
||||
#define drm_for_each_plane(plane, dev) \
|
||||
list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
|
||||
|
||||
bool drm_any_plane_has_format(struct drm_device *dev,
|
||||
u32 format, u64 modifier);
|
||||
|
||||
#endif
|
||||
|
@@ -38,42 +38,7 @@
|
||||
*/
|
||||
#define DRM_PLANE_HELPER_NO_SCALING (1<<16)
|
||||
|
||||
int drm_plane_helper_check_update(struct drm_plane *plane,
|
||||
struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
struct drm_rect *src,
|
||||
struct drm_rect *dest,
|
||||
unsigned int rotation,
|
||||
int min_scale,
|
||||
int max_scale,
|
||||
bool can_position,
|
||||
bool can_update_disabled,
|
||||
bool *visible);
|
||||
int drm_primary_helper_update(struct drm_plane *plane,
|
||||
struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
int crtc_x, int crtc_y,
|
||||
unsigned int crtc_w, unsigned int crtc_h,
|
||||
uint32_t src_x, uint32_t src_y,
|
||||
uint32_t src_w, uint32_t src_h,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
int drm_primary_helper_disable(struct drm_plane *plane,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
void drm_primary_helper_destroy(struct drm_plane *plane);
|
||||
extern const struct drm_plane_funcs drm_primary_helper_funcs;
|
||||
|
||||
int drm_plane_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
int crtc_x, int crtc_y,
|
||||
unsigned int crtc_w, unsigned int crtc_h,
|
||||
uint32_t src_x, uint32_t src_y,
|
||||
uint32_t src_w, uint32_t src_h,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
int drm_plane_helper_disable(struct drm_plane *plane,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
|
||||
/* For use by drm_crtc_helper.c */
|
||||
int drm_plane_helper_commit(struct drm_plane *plane,
|
||||
struct drm_plane_state *plane_state,
|
||||
struct drm_framebuffer *old_fb);
|
||||
#endif
|
||||
|
@@ -93,9 +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(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);
|
||||
int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma);
|
||||
|
||||
int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
|
||||
|
@@ -153,7 +153,8 @@ struct drm_property {
|
||||
* userspace. The kernel is allowed to update the value of these
|
||||
* properties. This is generally used to expose probe state to
|
||||
* userspace, e.g. the EDID, or the connector path property on DP
|
||||
* MST sinks.
|
||||
* MST sinks. Kernel can update the value of an immutable property
|
||||
* by calling drm_object_property_set_value().
|
||||
*/
|
||||
uint32_t flags;
|
||||
|
||||
|
@@ -30,10 +30,15 @@
|
||||
|
||||
struct drm_syncobj_cb;
|
||||
|
||||
enum drm_syncobj_type {
|
||||
DRM_SYNCOBJ_TYPE_BINARY,
|
||||
DRM_SYNCOBJ_TYPE_TIMELINE
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_syncobj - sync object.
|
||||
*
|
||||
* This structure defines a generic sync object which wraps a &dma_fence.
|
||||
* This structure defines a generic sync object which is timeline based.
|
||||
*/
|
||||
struct drm_syncobj {
|
||||
/**
|
||||
@@ -41,21 +46,42 @@ struct drm_syncobj {
|
||||
*/
|
||||
struct kref refcount;
|
||||
/**
|
||||
* @fence:
|
||||
* NULL or a pointer to the fence bound to this object.
|
||||
*
|
||||
* This field should not be used directly. Use drm_syncobj_fence_get()
|
||||
* and drm_syncobj_replace_fence() instead.
|
||||
* @type: indicate syncobj type
|
||||
*/
|
||||
struct dma_fence __rcu *fence;
|
||||
enum drm_syncobj_type type;
|
||||
/**
|
||||
* @cb_list: List of callbacks to call when the &fence gets replaced.
|
||||
* @wq: wait signal operation work queue
|
||||
*/
|
||||
wait_queue_head_t wq;
|
||||
/**
|
||||
* @timeline_context: fence context used by timeline
|
||||
*/
|
||||
u64 timeline_context;
|
||||
/**
|
||||
* @timeline: syncobj timeline value, which indicates point is signaled.
|
||||
*/
|
||||
u64 timeline;
|
||||
/**
|
||||
* @signal_point: which indicates the latest signaler point.
|
||||
*/
|
||||
u64 signal_point;
|
||||
/**
|
||||
* @signal_pt_list: signaler point list.
|
||||
*/
|
||||
struct list_head signal_pt_list;
|
||||
|
||||
/**
|
||||
* @cb_list: List of callbacks to call when the &fence gets replaced.
|
||||
*/
|
||||
struct list_head cb_list;
|
||||
/**
|
||||
* @lock: Protects &cb_list and write-locks &fence.
|
||||
* @pt_lock: Protects pt list.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
spinlock_t pt_lock;
|
||||
/**
|
||||
* @cb_mutex: Protects syncobj cb list.
|
||||
*/
|
||||
struct mutex cb_mutex;
|
||||
/**
|
||||
* @file: A file backing for this syncobj.
|
||||
*/
|
||||
@@ -68,7 +94,7 @@ typedef void (*drm_syncobj_func_t)(struct drm_syncobj *syncobj,
|
||||
/**
|
||||
* struct drm_syncobj_cb - callback for drm_syncobj_add_callback
|
||||
* @node: used by drm_syncob_add_callback to append this struct to
|
||||
* &drm_syncobj.cb_list
|
||||
* &drm_syncobj.cb_list
|
||||
* @func: drm_syncobj_func_t to call
|
||||
*
|
||||
* This struct will be initialized by drm_syncobj_add_callback, additional
|
||||
@@ -106,35 +132,12 @@ drm_syncobj_put(struct drm_syncobj *obj)
|
||||
kref_put(&obj->refcount, drm_syncobj_free);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_syncobj_fence_get - get a reference to a fence in a sync object
|
||||
* @syncobj: sync object.
|
||||
*
|
||||
* This acquires additional reference to &drm_syncobj.fence contained in @obj,
|
||||
* if not NULL. It is illegal to call this without already holding a reference.
|
||||
* No locks required.
|
||||
*
|
||||
* Returns:
|
||||
* Either the fence of @obj or NULL if there's none.
|
||||
*/
|
||||
static inline struct dma_fence *
|
||||
drm_syncobj_fence_get(struct drm_syncobj *syncobj)
|
||||
{
|
||||
struct dma_fence *fence;
|
||||
|
||||
rcu_read_lock();
|
||||
fence = dma_fence_get_rcu_safe(&syncobj->fence);
|
||||
rcu_read_unlock();
|
||||
|
||||
return fence;
|
||||
}
|
||||
|
||||
struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
|
||||
u32 handle);
|
||||
void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, u64 point,
|
||||
struct dma_fence *fence);
|
||||
int drm_syncobj_find_fence(struct drm_file *file_private,
|
||||
u32 handle, u64 point,
|
||||
u32 handle, u64 point, u64 flags,
|
||||
struct dma_fence **fence);
|
||||
void drm_syncobj_free(struct kref *kref);
|
||||
int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
|
||||
@@ -142,5 +145,7 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
|
||||
int drm_syncobj_get_handle(struct drm_file *file_private,
|
||||
struct drm_syncobj *syncobj, u32 *handle);
|
||||
int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd);
|
||||
int drm_syncobj_search_fence(struct drm_syncobj *syncobj, u64 point, u64 flags,
|
||||
struct dma_fence **fence);
|
||||
|
||||
#endif
|
||||
|
@@ -95,7 +95,7 @@ struct drm_vblank_crtc {
|
||||
/**
|
||||
* @queue: Wait queue for vblank waiters.
|
||||
*/
|
||||
wait_queue_head_t queue; /**< VBLANK wait queue */
|
||||
wait_queue_head_t queue;
|
||||
/**
|
||||
* @disable_timer: Disable timer for the delayed vblank disabling
|
||||
* hysteresis logic. Vblank disabling is controlled through the
|
||||
@@ -107,7 +107,7 @@ struct drm_vblank_crtc {
|
||||
/**
|
||||
* @seqlock: Protect vblank count and time.
|
||||
*/
|
||||
seqlock_t seqlock; /* protects vblank count and time */
|
||||
seqlock_t seqlock;
|
||||
|
||||
/**
|
||||
* @count: Current software vblank counter.
|
||||
@@ -123,7 +123,7 @@ struct drm_vblank_crtc {
|
||||
* this refcount reaches 0 can the hardware interrupt be disabled using
|
||||
* @disable_timer.
|
||||
*/
|
||||
atomic_t refcount; /* number of users of vblank interruptsper crtc */
|
||||
atomic_t refcount;
|
||||
/**
|
||||
* @last: Protected by &drm_device.vbl_lock, used for wraparound handling.
|
||||
*/
|
||||
@@ -136,7 +136,7 @@ struct drm_vblank_crtc {
|
||||
* call drm_crtc_vblank_off() and drm_crtc_vblank_on(), which explicitly
|
||||
* save and restore the vblank count.
|
||||
*/
|
||||
unsigned int inmodeset; /* Display driver is setting mode */
|
||||
unsigned int inmodeset;
|
||||
/**
|
||||
* @pipe: drm_crtc_index() of the &drm_crtc corresponding to this
|
||||
* structure.
|
||||
|
@@ -163,6 +163,9 @@ struct hdmi_avi_infoframe {
|
||||
int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
|
||||
ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
|
||||
size_t size);
|
||||
ssize_t hdmi_avi_infoframe_pack_only(const struct hdmi_avi_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
int hdmi_avi_infoframe_check(struct hdmi_avi_infoframe *frame);
|
||||
|
||||
enum hdmi_spd_sdi {
|
||||
HDMI_SPD_SDI_UNKNOWN,
|
||||
@@ -194,6 +197,9 @@ int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
|
||||
const char *vendor, const char *product);
|
||||
ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
|
||||
size_t size);
|
||||
ssize_t hdmi_spd_infoframe_pack_only(const struct hdmi_spd_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
int hdmi_spd_infoframe_check(struct hdmi_spd_infoframe *frame);
|
||||
|
||||
enum hdmi_audio_coding_type {
|
||||
HDMI_AUDIO_CODING_TYPE_STREAM,
|
||||
@@ -272,6 +278,9 @@ struct hdmi_audio_infoframe {
|
||||
int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
|
||||
ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
ssize_t hdmi_audio_infoframe_pack_only(const struct hdmi_audio_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
int hdmi_audio_infoframe_check(struct hdmi_audio_infoframe *frame);
|
||||
|
||||
enum hdmi_3d_structure {
|
||||
HDMI_3D_STRUCTURE_INVALID = -1,
|
||||
@@ -299,6 +308,9 @@ struct hdmi_vendor_infoframe {
|
||||
int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
|
||||
ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
ssize_t hdmi_vendor_infoframe_pack_only(const struct hdmi_vendor_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
int hdmi_vendor_infoframe_check(struct hdmi_vendor_infoframe *frame);
|
||||
|
||||
union hdmi_vendor_any_infoframe {
|
||||
struct {
|
||||
@@ -330,10 +342,14 @@ union hdmi_infoframe {
|
||||
struct hdmi_audio_infoframe audio;
|
||||
};
|
||||
|
||||
ssize_t
|
||||
hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
|
||||
int hdmi_infoframe_unpack(union hdmi_infoframe *frame, void *buffer);
|
||||
ssize_t hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer,
|
||||
size_t size);
|
||||
ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *frame,
|
||||
void *buffer, size_t size);
|
||||
int hdmi_infoframe_check(union hdmi_infoframe *frame);
|
||||
int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
|
||||
const void *buffer, size_t size);
|
||||
void hdmi_infoframe_log(const char *level, struct device *dev,
|
||||
union hdmi_infoframe *frame);
|
||||
const union hdmi_infoframe *frame);
|
||||
|
||||
#endif /* _DRM_HDMI_H */
|
||||
|
@@ -68,7 +68,6 @@ struct reservation_object_list {
|
||||
* @seq: sequence count for managing RCU read-side synchronization
|
||||
* @fence_excl: the exclusive fence, if there is one currently
|
||||
* @fence: list of current shared fences
|
||||
* @staged: staged copy of shared fences for RCU updates
|
||||
*/
|
||||
struct reservation_object {
|
||||
struct ww_mutex lock;
|
||||
@@ -76,7 +75,6 @@ struct reservation_object {
|
||||
|
||||
struct dma_fence __rcu *fence_excl;
|
||||
struct reservation_object_list __rcu *fence;
|
||||
struct reservation_object_list *staged;
|
||||
};
|
||||
|
||||
#define reservation_object_held(obj) lockdep_is_held(&(obj)->lock.base)
|
||||
@@ -95,7 +93,6 @@ reservation_object_init(struct reservation_object *obj)
|
||||
__seqcount_init(&obj->seq, reservation_seqcount_string, &reservation_seqcount_class);
|
||||
RCU_INIT_POINTER(obj->fence, NULL);
|
||||
RCU_INIT_POINTER(obj->fence_excl, NULL);
|
||||
obj->staged = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -124,7 +121,6 @@ reservation_object_fini(struct reservation_object *obj)
|
||||
|
||||
kfree(fobj);
|
||||
}
|
||||
kfree(obj->staged);
|
||||
|
||||
ww_mutex_destroy(&obj->lock);
|
||||
}
|
||||
@@ -218,6 +214,11 @@ reservation_object_trylock(struct reservation_object *obj)
|
||||
static inline void
|
||||
reservation_object_unlock(struct reservation_object *obj)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_MUTEXES
|
||||
/* Test shared fence slot reservation */
|
||||
if (obj->fence)
|
||||
obj->fence->shared_max = obj->fence->shared_count;
|
||||
#endif
|
||||
ww_mutex_unlock(&obj->lock);
|
||||
}
|
||||
|
||||
@@ -265,7 +266,8 @@ reservation_object_get_excl_rcu(struct reservation_object *obj)
|
||||
return fence;
|
||||
}
|
||||
|
||||
int reservation_object_reserve_shared(struct reservation_object *obj);
|
||||
int reservation_object_reserve_shared(struct reservation_object *obj,
|
||||
unsigned int num_fences);
|
||||
void reservation_object_add_shared_fence(struct reservation_object *obj,
|
||||
struct dma_fence *fence);
|
||||
|
||||
|
@@ -717,6 +717,7 @@ struct drm_prime_handle {
|
||||
struct drm_syncobj_create {
|
||||
__u32 handle;
|
||||
#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
|
||||
#define DRM_SYNCOBJ_CREATE_TYPE_TIMELINE (1 << 1)
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
|
@@ -152,6 +152,20 @@ extern "C" {
|
||||
|
||||
#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
|
||||
|
||||
/*
|
||||
* packed YCbCr420 2x2 tiled formats
|
||||
* first 64 bits will contain Y,Cb,Cr components for a 2x2 tile
|
||||
*/
|
||||
/* [63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
|
||||
#define DRM_FORMAT_Y0L0 fourcc_code('Y', '0', 'L', '0')
|
||||
/* [63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
|
||||
#define DRM_FORMAT_X0L0 fourcc_code('X', '0', 'L', '0')
|
||||
|
||||
/* [63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
|
||||
#define DRM_FORMAT_Y0L2 fourcc_code('Y', '0', 'L', '2')
|
||||
/* [63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
|
||||
#define DRM_FORMAT_X0L2 fourcc_code('X', '0', 'L', '2')
|
||||
|
||||
/*
|
||||
* 2 plane RGB + A
|
||||
* index 0 = RGB plane, same format as the corresponding non _A8 format has
|
||||
|
@@ -58,6 +58,11 @@ struct drm_v3d_submit_cl {
|
||||
* coordinate shader to determine where primitives land on the screen,
|
||||
* then writes out the state updates and draw calls necessary per tile
|
||||
* to the tile allocation BO.
|
||||
*
|
||||
* This BCL will block on any previous BCL submitted on the
|
||||
* same FD, but not on any RCL or BCLs submitted by other
|
||||
* clients -- that is left up to the submitter to control
|
||||
* using in_sync_bcl if necessary.
|
||||
*/
|
||||
__u32 bcl_start;
|
||||
|
||||
@@ -69,6 +74,11 @@ struct drm_v3d_submit_cl {
|
||||
* This is the second set of commands executed, which will either
|
||||
* execute the tiles that have been set up by the BCL, or a fixed set
|
||||
* of tiles (in the case of RCL-only blits).
|
||||
*
|
||||
* This RCL will block on this submit's BCL, and any previous
|
||||
* RCL submitted on the same FD, but not on any RCL or BCLs
|
||||
* submitted by other clients -- that is left up to the
|
||||
* submitter to control using in_sync_rcl if necessary.
|
||||
*/
|
||||
__u32 rcl_start;
|
||||
|
||||
|
Reference in New Issue
Block a user