mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
Merge tag 'drm-misc-next-2017-11-30' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
Cross-subsystem Changes: - device tree doc for the Mitsubishi AA070MC01 and Tianma TM070RVHG71 panels (Lukasz Majewski) and for a 2nd endpoint on stm32 (Philippe Cornu) Core Changes: The most important changes are: - Add drm_driver .last_close and .output_poll_changed helpers to reduce fbdev emulation footprint in drivers (Noralf) - Fix plane clipping in core and for vmwgfx (Ville) Then we have a bunch of of improvement for print and debug such as the addition of a framebuffer debugfs file. ELD connector, HDMI and improvements. And a bunch of misc improvements, clean ups and style changes and doc updates [airlied: drop eld bits from amdgpu_dm] Driver Changes: - sii8620: filter unsupported modes and add DVI mode support (Maciej Purski) - rockchip: analogix_dp: Remove unnecessary init code (Jeffy Chen) - virtio, cirrus: add fb create_handle support to enable screenshots(Lepton Wu) - virtio: replace reference/unreference with get/put (Aastha Gupta) - vc4, gma500: Convert timers to use timer_setup() (Kees Cook) - vc4: Reject HDMI modes with too high of clocks (Eric) - vc4: Add support for more pixel formats (Dave Stevenson) - stm: dsi: Rename driver name to "stm32-display-dsi" (Philippe Cornu) - stm: ltdc: add a 2nd endpoint (Philippe Cornu) - via: use monotonic time for VIA_WAIT_IRQ (Arnd Bergmann) * tag 'drm-misc-next-2017-11-30' of git://anongit.freedesktop.org/drm/drm-misc: (96 commits) drm/bridge: tc358767: add copyright lines MAINTAINERS: change maintainer for Rockchip drm drivers drm/vblank: Fix vblank timestamp debugs drm/via: use monotonic time for VIA_WAIT_IRQ dma-buf: Fix ifnullfree.cocci warnings drm/printer: Add drm_vprintf() drm/edid: Allow HDMI infoframe without VIC or S3D video/hdmi: Allow "empty" HDMI infoframes dma-buf/fence: Fix lock inversion within dma-fence-array drm/sti: Handle return value of platform_get_irq_byname drm/vc4: Add support for NV21 and NV61. drm/vc4: Use .pixel_order instead of custom .flip_cbcr drm/vc4: Add support for DRM_FORMAT_RGB888 and DRM_FORMAT_BGR888 drm: Move drm_plane_helper_check_state() into drm_atomic_helper.c drm: Check crtc_state->enable rather than crtc->enabled in drm_plane_helper_check_state() drm/vmwgfx: Try to fix plane clipping drm/vmwgfx: Use drm_plane_helper_check_state() drm/vmwgfx: Remove bogus crtc coords vs fb size check gpu: gma500: remove unneeded DRIVER_LICENSE #define drm: don't link DP aux i2c adapter to the hardware device node ...
This commit is contained in:
commit
2c1c55cb75
113 changed files with 1325 additions and 873 deletions
|
@ -75,6 +75,7 @@
|
|||
#include <drm/drm_sarea.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_prime.h>
|
||||
#include <drm/drm_print.h>
|
||||
#include <drm/drm_pci.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_debugfs.h>
|
||||
|
@ -94,212 +95,16 @@ struct dma_buf_attachment;
|
|||
struct pci_dev;
|
||||
struct pci_controller;
|
||||
|
||||
/*
|
||||
* The following categories are defined:
|
||||
*
|
||||
* CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...
|
||||
* This is the category used by the DRM_DEBUG() macro.
|
||||
*
|
||||
* DRIVER: Used in the vendor specific part of the driver: i915, radeon, ...
|
||||
* This is the category used by the DRM_DEBUG_DRIVER() macro.
|
||||
*
|
||||
* KMS: used in the modesetting code.
|
||||
* This is the category used by the DRM_DEBUG_KMS() macro.
|
||||
*
|
||||
* PRIME: used in the prime code.
|
||||
* This is the category used by the DRM_DEBUG_PRIME() macro.
|
||||
*
|
||||
* ATOMIC: used in the atomic code.
|
||||
* This is the category used by the DRM_DEBUG_ATOMIC() macro.
|
||||
*
|
||||
* VBL: used for verbose debug message in the vblank code
|
||||
* This is the category used by the DRM_DEBUG_VBL() macro.
|
||||
*
|
||||
* Enabling verbose debug messages is done through the drm.debug parameter,
|
||||
* each category being enabled by a bit.
|
||||
*
|
||||
* drm.debug=0x1 will enable CORE messages
|
||||
* drm.debug=0x2 will enable DRIVER messages
|
||||
* drm.debug=0x3 will enable CORE and DRIVER messages
|
||||
* ...
|
||||
* drm.debug=0x3f will enable all messages
|
||||
*
|
||||
* An interesting feature is that it's possible to enable verbose logging at
|
||||
* run-time by echoing the debug value in its sysfs node:
|
||||
* # echo 0xf > /sys/module/drm/parameters/debug
|
||||
*/
|
||||
#define DRM_UT_NONE 0x00
|
||||
#define DRM_UT_CORE 0x01
|
||||
#define DRM_UT_DRIVER 0x02
|
||||
#define DRM_UT_KMS 0x04
|
||||
#define DRM_UT_PRIME 0x08
|
||||
#define DRM_UT_ATOMIC 0x10
|
||||
#define DRM_UT_VBL 0x20
|
||||
#define DRM_UT_STATE 0x40
|
||||
#define DRM_UT_LEASE 0x80
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name DRM template customization defaults */
|
||||
/*@{*/
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name Macros to make printk easier */
|
||||
/*@{*/
|
||||
|
||||
#define _DRM_PRINTK(once, level, fmt, ...) \
|
||||
do { \
|
||||
printk##once(KERN_##level "[" DRM_NAME "] " fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_INFO(fmt, ...) \
|
||||
_DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__)
|
||||
#define DRM_NOTE(fmt, ...) \
|
||||
_DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__)
|
||||
#define DRM_WARN(fmt, ...) \
|
||||
_DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_INFO_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__)
|
||||
#define DRM_NOTE_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__)
|
||||
#define DRM_WARN_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Error output.
|
||||
*
|
||||
* \param fmt printf() like format string.
|
||||
* \param arg arguments
|
||||
*/
|
||||
#define DRM_DEV_ERROR(dev, fmt, ...) \
|
||||
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
|
||||
fmt, ##__VA_ARGS__)
|
||||
#define DRM_ERROR(fmt, ...) \
|
||||
drm_printk(KERN_ERR, DRM_UT_NONE, fmt, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Rate limited error output. Like DRM_ERROR() but won't flood the log.
|
||||
*
|
||||
* \param fmt printf() like format string.
|
||||
* \param arg arguments
|
||||
*/
|
||||
#define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \
|
||||
({ \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
DEFAULT_RATELIMIT_INTERVAL, \
|
||||
DEFAULT_RATELIMIT_BURST); \
|
||||
\
|
||||
if (__ratelimit(&_rs)) \
|
||||
DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \
|
||||
})
|
||||
#define DRM_ERROR_RATELIMITED(fmt, ...) \
|
||||
DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_INFO(dev, fmt, ...) \
|
||||
drm_dev_printk(dev, KERN_INFO, DRM_UT_NONE, __func__, "", fmt, \
|
||||
##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_INFO_ONCE(dev, fmt, ...) \
|
||||
({ \
|
||||
static bool __print_once __read_mostly; \
|
||||
if (!__print_once) { \
|
||||
__print_once = true; \
|
||||
DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
})
|
||||
|
||||
/**
|
||||
* Debug output.
|
||||
*
|
||||
* \param fmt printf() like format string.
|
||||
* \param arg arguments
|
||||
*/
|
||||
#define DRM_DEV_DEBUG(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_CORE, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_DRIVER(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_DRIVER, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_DRIVER(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_KMS(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_KMS, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG_KMS(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_KMS, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_PRIME(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_PRIME, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_PRIME(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_PRIME, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_ATOMIC(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_ATOMIC, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_ATOMIC(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_VBL(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_VBL, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG_VBL(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_VBL, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEBUG_LEASE(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_LEASE, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, level, fmt, args...) \
|
||||
({ \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
DEFAULT_RATELIMIT_INTERVAL, \
|
||||
DEFAULT_RATELIMIT_BURST); \
|
||||
if (__ratelimit(&_rs)) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_ ## level, \
|
||||
__func__, "", fmt, ##args); \
|
||||
})
|
||||
|
||||
/**
|
||||
* Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
|
||||
*
|
||||
* \param fmt printf() like format string.
|
||||
* \param arg arguments
|
||||
*/
|
||||
#define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...) \
|
||||
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
|
||||
#define DRM_DEBUG_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRIVER, fmt, ##args)
|
||||
#define DRM_DEBUG_DRIVER_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, KMS, fmt, ##args)
|
||||
#define DRM_DEBUG_KMS_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_PRIME_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, PRIME, fmt, ##args)
|
||||
#define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
|
||||
|
||||
/* Format strings and argument splitters to simplify printing
|
||||
* various "complex" objects
|
||||
*/
|
||||
|
||||
/*@}*/
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name Internal types and structures */
|
||||
/*@{*/
|
||||
|
||||
#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
|
||||
|
||||
|
||||
/**
|
||||
* drm_drv_uses_atomic_modeset - check if the driver implements
|
||||
* atomic_commit()
|
||||
|
|
|
@ -38,6 +38,13 @@ struct drm_private_state;
|
|||
|
||||
int drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
|
||||
const struct drm_crtc_state *crtc_state,
|
||||
const struct drm_rect *clip,
|
||||
int min_scale,
|
||||
int max_scale,
|
||||
bool can_position,
|
||||
bool can_update_disabled);
|
||||
int drm_atomic_helper_check_planes(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
int drm_atomic_helper_check(struct drm_device *dev,
|
||||
|
|
|
@ -269,6 +269,11 @@ struct drm_display_info {
|
|||
*/
|
||||
bool dvi_dual;
|
||||
|
||||
/**
|
||||
* @has_hdmi_infoframe: Does the sink support the HDMI infoframe?
|
||||
*/
|
||||
bool has_hdmi_infoframe;
|
||||
|
||||
/**
|
||||
* @edid_hdmi_dc_modes: Mask of supported hdmi deep color modes. Even
|
||||
* more stuff redundant with @bus_formats.
|
||||
|
@ -704,7 +709,6 @@ struct drm_cmdline_mode {
|
|||
* @force: a DRM_FORCE_<foo> state for forced mode sets
|
||||
* @override_edid: has the EDID been overwritten through debugfs for testing?
|
||||
* @encoder_ids: valid encoders for this connector
|
||||
* @encoder: encoder driving this connector, if any
|
||||
* @eld: EDID-like data, if present
|
||||
* @latency_present: AV delay info from ELD, if found
|
||||
* @video_latency: video latency info from ELD, if found
|
||||
|
@ -874,7 +878,13 @@ struct drm_connector {
|
|||
|
||||
#define DRM_CONNECTOR_MAX_ENCODER 3
|
||||
uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
|
||||
struct drm_encoder *encoder; /* currently active encoder */
|
||||
/**
|
||||
* @encoder: Currently bound encoder driving this connector, if any.
|
||||
* Only really meaningful for non-atomic drivers. Atomic drivers should
|
||||
* instead look at &drm_connector_state.best_encoder, and in case they
|
||||
* need the CRTC driving this output, &drm_connector_state.crtc.
|
||||
*/
|
||||
struct drm_encoder *encoder;
|
||||
|
||||
#define MAX_ELD_BYTES 128
|
||||
/* EDID bits */
|
||||
|
|
|
@ -17,6 +17,7 @@ struct drm_vblank_crtc;
|
|||
struct drm_sg_mem;
|
||||
struct drm_local_map;
|
||||
struct drm_vma_offset_manager;
|
||||
struct drm_fb_helper;
|
||||
|
||||
struct inode;
|
||||
|
||||
|
@ -185,6 +186,14 @@ struct drm_device {
|
|||
struct drm_vma_offset_manager *vma_offset_manager;
|
||||
/*@} */
|
||||
int switch_power_state;
|
||||
|
||||
/**
|
||||
* @fb_helper:
|
||||
*
|
||||
* Pointer to the fbdev emulation structure.
|
||||
* Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini().
|
||||
*/
|
||||
struct drm_fb_helper *fb_helper;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -635,6 +635,7 @@
|
|||
# define DP_SET_POWER_D0 0x1
|
||||
# define DP_SET_POWER_D3 0x2
|
||||
# define DP_SET_POWER_MASK 0x3
|
||||
# define DP_SET_POWER_D3_AUX_ON 0x5
|
||||
|
||||
#define DP_EDP_DPCD_REV 0x700 /* eDP 1.2 */
|
||||
# define DP_EDP_11 0x00
|
||||
|
|
|
@ -39,6 +39,7 @@ struct drm_minor;
|
|||
struct dma_buf_attachment;
|
||||
struct drm_display_mode;
|
||||
struct drm_mode_create_dumb;
|
||||
struct drm_printer;
|
||||
|
||||
/* driver capabilities and requirements mask */
|
||||
#define DRIVER_USE_AGP 0x1
|
||||
|
@ -428,6 +429,20 @@ struct drm_driver {
|
|||
*/
|
||||
void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
|
||||
|
||||
/**
|
||||
* @gem_print_info:
|
||||
*
|
||||
* If driver subclasses struct &drm_gem_object, it can implement this
|
||||
* optional hook for printing additional driver specific info.
|
||||
*
|
||||
* drm_printf_indent() should be used in the callback passing it the
|
||||
* indent argument.
|
||||
*
|
||||
* This callback is called from drm_gem_print_info().
|
||||
*/
|
||||
void (*gem_print_info)(struct drm_printer *p, unsigned int indent,
|
||||
const struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @gem_create_object: constructor for gem objects
|
||||
*
|
||||
|
@ -592,13 +607,6 @@ struct drm_driver {
|
|||
int dev_priv_size;
|
||||
};
|
||||
|
||||
__printf(6, 7)
|
||||
void drm_dev_printk(const struct device *dev, const char *level,
|
||||
unsigned int category, const char *function_name,
|
||||
const char *prefix, const char *format, ...);
|
||||
__printf(3, 4)
|
||||
void drm_printk(const char *level, unsigned int category,
|
||||
const char *format, ...);
|
||||
extern unsigned int drm_debug;
|
||||
|
||||
int drm_dev_init(struct drm_device *dev,
|
||||
|
|
|
@ -333,7 +333,6 @@ struct drm_encoder;
|
|||
struct drm_connector;
|
||||
struct drm_display_mode;
|
||||
|
||||
void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
|
||||
int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads);
|
||||
int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb);
|
||||
int drm_av_sync_delay(struct drm_connector *connector,
|
||||
|
@ -357,6 +356,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|||
bool is_hdmi2_sink);
|
||||
int
|
||||
drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
|
||||
struct drm_connector *connector,
|
||||
const struct drm_display_mode *mode);
|
||||
void
|
||||
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
|
||||
|
|
|
@ -88,7 +88,6 @@ struct drm_encoder_funcs {
|
|||
* @head: list management
|
||||
* @base: base KMS object
|
||||
* @name: human readable name, can be overwritten by the driver
|
||||
* @crtc: currently bound CRTC
|
||||
* @bridge: bridge associated to the encoder
|
||||
* @funcs: control functions
|
||||
* @helper_private: mid-layer private data
|
||||
|
@ -166,6 +165,11 @@ struct drm_encoder {
|
|||
*/
|
||||
uint32_t possible_clones;
|
||||
|
||||
/**
|
||||
* @crtc: Currently bound CRTC, only really meaningful for non-atomic
|
||||
* drivers. Atomic drivers should instead check
|
||||
* &drm_connector_state.crtc.
|
||||
*/
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_bridge *bridge;
|
||||
const struct drm_encoder_funcs *funcs;
|
||||
|
|
|
@ -36,11 +36,5 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb,
|
|||
struct drm_plane_state *state,
|
||||
unsigned int plane);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct seq_file;
|
||||
|
||||
int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -310,6 +310,9 @@ drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn);
|
|||
int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);
|
||||
int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
||||
struct drm_connector *connector);
|
||||
|
||||
void drm_fb_helper_lastclose(struct drm_device *dev);
|
||||
void drm_fb_helper_output_poll_changed(struct drm_device *dev);
|
||||
#else
|
||||
static inline void drm_fb_helper_prepare(struct drm_device *dev,
|
||||
struct drm_fb_helper *helper,
|
||||
|
@ -507,6 +510,14 @@ drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void drm_fb_helper_lastclose(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
|
|
|
@ -264,7 +264,7 @@ static inline void drm_framebuffer_unreference(struct drm_framebuffer *fb)
|
|||
*
|
||||
* This functions returns the framebuffer's reference count.
|
||||
*/
|
||||
static inline uint32_t drm_framebuffer_read_refcount(struct drm_framebuffer *fb)
|
||||
static inline uint32_t drm_framebuffer_read_refcount(const struct drm_framebuffer *fb)
|
||||
{
|
||||
return kref_read(&fb->base.refcount);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,9 @@
|
|||
* struct drm_gem_cma_object - GEM object backed by CMA memory allocations
|
||||
* @base: base GEM object
|
||||
* @paddr: physical address of the backing memory
|
||||
* @sgt: scatter/gather table for imported PRIME buffers
|
||||
* @sgt: scatter/gather table for imported PRIME buffers. The table can have
|
||||
* more than one entry but they are guaranteed to have contiguous
|
||||
* DMA addresses.
|
||||
* @vaddr: kernel virtual address of the backing memory
|
||||
*/
|
||||
struct drm_gem_cma_object {
|
||||
|
@ -21,11 +23,8 @@ struct drm_gem_cma_object {
|
|||
void *vaddr;
|
||||
};
|
||||
|
||||
static inline struct drm_gem_cma_object *
|
||||
to_drm_gem_cma_obj(struct drm_gem_object *gem_obj)
|
||||
{
|
||||
return container_of(gem_obj, struct drm_gem_cma_object, base);
|
||||
}
|
||||
#define to_drm_gem_cma_obj(gem_obj) \
|
||||
container_of(gem_obj, struct drm_gem_cma_object, base)
|
||||
|
||||
#ifndef CONFIG_MMU
|
||||
#define DRM_GEM_CMA_UNMAPPED_AREA_FOPS \
|
||||
|
@ -91,9 +90,8 @@ unsigned long drm_gem_cma_get_unmapped_area(struct file *filp,
|
|||
unsigned long flags);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m);
|
||||
#endif
|
||||
void drm_gem_cma_print_info(struct drm_printer *p, unsigned int indent,
|
||||
const struct drm_gem_object *obj);
|
||||
|
||||
struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj);
|
||||
struct drm_gem_object *
|
||||
|
|
|
@ -386,7 +386,7 @@ int drm_mm_insert_node_in_range(struct drm_mm *mm,
|
|||
* @color: opaque tag value to use for this node
|
||||
* @mode: fine-tune the allocation search and placement
|
||||
*
|
||||
* This is a simplified version of drm_mm_insert_node_in_range_generic() with no
|
||||
* This is a simplified version of drm_mm_insert_node_in_range() with no
|
||||
* range restrictions applied.
|
||||
*
|
||||
* The preallocated node must be cleared to 0.
|
||||
|
|
|
@ -752,7 +752,7 @@ struct drm_mode_config {
|
|||
bool allow_fb_modifiers;
|
||||
|
||||
/**
|
||||
* @modifiers: Plane property to list support modifier/format
|
||||
* @modifiers_property: Plane property to list support modifier/format
|
||||
* combination.
|
||||
*/
|
||||
struct drm_property *modifiers_property;
|
||||
|
|
|
@ -801,9 +801,6 @@ struct drm_connector_helper_funcs {
|
|||
* resolution can call drm_add_modes_noedid(), and mark the preferred
|
||||
* one using drm_set_preferred_mode().
|
||||
*
|
||||
* Finally drivers that support audio probably want to update the ELD
|
||||
* data, too, using drm_edid_to_eld().
|
||||
*
|
||||
* This function is only called after the @detect hook has indicated
|
||||
* that a sink is connected and when the EDID isn't overridden through
|
||||
* sysfs or the kernel commandline.
|
||||
|
|
|
@ -474,8 +474,8 @@ enum drm_plane_type {
|
|||
* @format_types: array of formats supported by this plane
|
||||
* @format_count: number of formats supported
|
||||
* @format_default: driver hasn't supplied supported formats for the plane
|
||||
* @crtc: currently bound CRTC
|
||||
* @fb: currently bound fb
|
||||
* @modifiers: array of modifiers supported by this plane
|
||||
* @modifier_count: number of modifiers supported
|
||||
* @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used by
|
||||
* drm_mode_set_config_internal() to implement correct refcounting.
|
||||
* @funcs: helper functions
|
||||
|
@ -512,7 +512,17 @@ struct drm_plane {
|
|||
uint64_t *modifiers;
|
||||
unsigned int modifier_count;
|
||||
|
||||
/**
|
||||
* @crtc: Currently bound CRTC, only really meaningful for non-atomic
|
||||
* drivers. Atomic drivers should instead check &drm_plane_state.crtc.
|
||||
*/
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
/**
|
||||
* @fb: Currently bound framebuffer, only really meaningful for
|
||||
* non-atomic drivers. Atomic drivers should instead check
|
||||
* &drm_plane_state.fb.
|
||||
*/
|
||||
struct drm_framebuffer *fb;
|
||||
|
||||
struct drm_framebuffer *old_fb;
|
||||
|
|
|
@ -38,11 +38,6 @@
|
|||
*/
|
||||
#define DRM_PLANE_HELPER_NO_SCALING (1<<16)
|
||||
|
||||
int drm_plane_helper_check_state(struct drm_plane_state *state,
|
||||
const struct drm_rect *clip,
|
||||
int min_scale, int max_scale,
|
||||
bool can_position,
|
||||
bool can_update_disabled);
|
||||
int drm_plane_helper_check_update(struct drm_plane *plane,
|
||||
struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
|
|
|
@ -80,6 +80,29 @@ void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf);
|
|||
__printf(2, 3)
|
||||
void drm_printf(struct drm_printer *p, const char *f, ...);
|
||||
|
||||
/**
|
||||
* drm_vprintf - print to a &drm_printer stream
|
||||
* @p: the &drm_printer
|
||||
* @fmt: format string
|
||||
* @va: the va_list
|
||||
*/
|
||||
__printf(2, 0)
|
||||
static inline void
|
||||
drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va)
|
||||
{
|
||||
struct va_format vaf = { .fmt = fmt, .va = va };
|
||||
|
||||
p->printfn(p, &vaf);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_printf_indent - Print to a &drm_printer stream with indentation
|
||||
* @printer: DRM printer
|
||||
* @indent: Tab indentation level (max 5)
|
||||
* @fmt: Format string
|
||||
*/
|
||||
#define drm_printf_indent(printer, indent, fmt, ...) \
|
||||
drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file
|
||||
|
@ -128,4 +151,200 @@ static inline struct drm_printer drm_debug_printer(const char *prefix)
|
|||
};
|
||||
return p;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following categories are defined:
|
||||
*
|
||||
* CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...
|
||||
* This is the category used by the DRM_DEBUG() macro.
|
||||
*
|
||||
* DRIVER: Used in the vendor specific part of the driver: i915, radeon, ...
|
||||
* This is the category used by the DRM_DEBUG_DRIVER() macro.
|
||||
*
|
||||
* KMS: used in the modesetting code.
|
||||
* This is the category used by the DRM_DEBUG_KMS() macro.
|
||||
*
|
||||
* PRIME: used in the prime code.
|
||||
* This is the category used by the DRM_DEBUG_PRIME() macro.
|
||||
*
|
||||
* ATOMIC: used in the atomic code.
|
||||
* This is the category used by the DRM_DEBUG_ATOMIC() macro.
|
||||
*
|
||||
* VBL: used for verbose debug message in the vblank code
|
||||
* This is the category used by the DRM_DEBUG_VBL() macro.
|
||||
*
|
||||
* Enabling verbose debug messages is done through the drm.debug parameter,
|
||||
* each category being enabled by a bit.
|
||||
*
|
||||
* drm.debug=0x1 will enable CORE messages
|
||||
* drm.debug=0x2 will enable DRIVER messages
|
||||
* drm.debug=0x3 will enable CORE and DRIVER messages
|
||||
* ...
|
||||
* drm.debug=0x3f will enable all messages
|
||||
*
|
||||
* An interesting feature is that it's possible to enable verbose logging at
|
||||
* run-time by echoing the debug value in its sysfs node:
|
||||
* # echo 0xf > /sys/module/drm/parameters/debug
|
||||
*/
|
||||
#define DRM_UT_NONE 0x00
|
||||
#define DRM_UT_CORE 0x01
|
||||
#define DRM_UT_DRIVER 0x02
|
||||
#define DRM_UT_KMS 0x04
|
||||
#define DRM_UT_PRIME 0x08
|
||||
#define DRM_UT_ATOMIC 0x10
|
||||
#define DRM_UT_VBL 0x20
|
||||
#define DRM_UT_STATE 0x40
|
||||
#define DRM_UT_LEASE 0x80
|
||||
|
||||
__printf(6, 7)
|
||||
void drm_dev_printk(const struct device *dev, const char *level,
|
||||
unsigned int category, const char *function_name,
|
||||
const char *prefix, const char *format, ...);
|
||||
__printf(3, 4)
|
||||
void drm_printk(const char *level, unsigned int category,
|
||||
const char *format, ...);
|
||||
|
||||
/* Macros to make printk easier */
|
||||
|
||||
#define _DRM_PRINTK(once, level, fmt, ...) \
|
||||
do { \
|
||||
printk##once(KERN_##level "[" DRM_NAME "] " fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_INFO(fmt, ...) \
|
||||
_DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__)
|
||||
#define DRM_NOTE(fmt, ...) \
|
||||
_DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__)
|
||||
#define DRM_WARN(fmt, ...) \
|
||||
_DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_INFO_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__)
|
||||
#define DRM_NOTE_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__)
|
||||
#define DRM_WARN_ONCE(fmt, ...) \
|
||||
_DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Error output.
|
||||
*
|
||||
* @dev: device pointer
|
||||
* @fmt: printf() like format string.
|
||||
*/
|
||||
#define DRM_DEV_ERROR(dev, fmt, ...) \
|
||||
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
|
||||
fmt, ##__VA_ARGS__)
|
||||
#define DRM_ERROR(fmt, ...) \
|
||||
drm_printk(KERN_ERR, DRM_UT_NONE, fmt, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Rate limited error output. Like DRM_ERROR() but won't flood the log.
|
||||
*
|
||||
* @dev: device pointer
|
||||
* @fmt: printf() like format string.
|
||||
*/
|
||||
#define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \
|
||||
({ \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
DEFAULT_RATELIMIT_INTERVAL, \
|
||||
DEFAULT_RATELIMIT_BURST); \
|
||||
\
|
||||
if (__ratelimit(&_rs)) \
|
||||
DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \
|
||||
})
|
||||
#define DRM_ERROR_RATELIMITED(fmt, ...) \
|
||||
DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_INFO(dev, fmt, ...) \
|
||||
drm_dev_printk(dev, KERN_INFO, DRM_UT_NONE, __func__, "", fmt, \
|
||||
##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_INFO_ONCE(dev, fmt, ...) \
|
||||
({ \
|
||||
static bool __print_once __read_mostly; \
|
||||
if (!__print_once) { \
|
||||
__print_once = true; \
|
||||
DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
})
|
||||
|
||||
/**
|
||||
* Debug output.
|
||||
*
|
||||
* @dev: device pointer
|
||||
* @fmt: printf() like format string.
|
||||
*/
|
||||
#define DRM_DEV_DEBUG(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_CORE, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_DRIVER(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_DRIVER, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_DRIVER(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_KMS(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_KMS, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG_KMS(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_KMS, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_PRIME(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_PRIME, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_PRIME(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_PRIME, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_ATOMIC(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_ATOMIC, __func__, "", \
|
||||
fmt, ##args)
|
||||
#define DRM_DEBUG_ATOMIC(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEV_DEBUG_VBL(dev, fmt, args...) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_VBL, __func__, "", fmt, \
|
||||
##args)
|
||||
#define DRM_DEBUG_VBL(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_VBL, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define DRM_DEBUG_LEASE(fmt, ...) \
|
||||
drm_printk(KERN_DEBUG, DRM_UT_LEASE, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, level, fmt, args...) \
|
||||
({ \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
DEFAULT_RATELIMIT_INTERVAL, \
|
||||
DEFAULT_RATELIMIT_BURST); \
|
||||
if (__ratelimit(&_rs)) \
|
||||
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_ ## level, \
|
||||
__func__, "", fmt, ##args); \
|
||||
})
|
||||
|
||||
/**
|
||||
* Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
|
||||
*
|
||||
* @dev: device pointer
|
||||
* @fmt: printf() like format string.
|
||||
*/
|
||||
#define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...) \
|
||||
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
|
||||
#define DRM_DEBUG_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRIVER, fmt, ##args)
|
||||
#define DRM_DEBUG_DRIVER_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, KMS, fmt, ##args)
|
||||
#define DRM_DEBUG_KMS_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##args)
|
||||
#define DRM_DEV_DEBUG_PRIME_RATELIMITED(dev, fmt, args...) \
|
||||
_DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, PRIME, fmt, ##args)
|
||||
#define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...) \
|
||||
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
|
||||
|
||||
#endif /* DRM_PRINT_H_ */
|
||||
|
|
|
@ -49,7 +49,7 @@ struct drm_syncobj {
|
|||
* This field should not be used directly. Use drm_syncobj_fence_get
|
||||
* and drm_syncobj_replace_fence instead.
|
||||
*/
|
||||
struct dma_fence *fence;
|
||||
struct dma_fence __rcu *fence;
|
||||
/**
|
||||
* @cb_list:
|
||||
* List of callbacks to call when the fence gets replaced
|
||||
|
|
|
@ -152,7 +152,7 @@ static inline void drm_vma_node_reset(struct drm_vma_offset_node *node)
|
|||
* Start address of @node for page-based addressing. 0 if the node does not
|
||||
* have an offset allocated.
|
||||
*/
|
||||
static inline unsigned long drm_vma_node_start(struct drm_vma_offset_node *node)
|
||||
static inline unsigned long drm_vma_node_start(const struct drm_vma_offset_node *node)
|
||||
{
|
||||
return node->vm_node.start;
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
|
|||
*/
|
||||
#define TINYDRM_GEM_DRIVER_OPS \
|
||||
.gem_free_object = tinydrm_gem_cma_free_object, \
|
||||
.gem_print_info = drm_gem_cma_print_info, \
|
||||
.gem_vm_ops = &drm_gem_cma_vm_ops, \
|
||||
.prime_handle_to_fd = drm_gem_prime_handle_to_fd, \
|
||||
.prime_fd_to_handle = drm_gem_prime_fd_to_handle, \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue