Merge tag 'drm-next-2019-03-06' of git://anongit.freedesktop.org/drm/drm
Pull drm updates from Dave Airlie: "This is the main drm pull request for the 5.1 merge window. The big changes I'd highlight are: - nouveau has HMM support now, there is finally an in-tree user so we can quieten down the rip it out people. - i915 now enables fastboot by default on Skylake+ - Displayport Multistream support has been refactored and should hopefully be more reliable. Core: - header cleanups aiming towards removing drmP.h - dma-buf fence seqnos to 64-bits - common helper for DP mst hotplug for radeon,i915,amdgpu + new refcounting scheme - MST i2c improvements - drm_syncobj_cb removal - ARM FB compression fourcc - P010 + P016 fourcc - allwinner tiled format modifier - i2c over aux I2C_M_STOP support - DRM_AUTH handling fixes TTM: - ref/unref renaming New driver: - ARM komeda display driver scheduler: - refactor mirror list handling - rework hw fence processing - 0 run queue entity fix bridge: - TI DS90C185 LVDS bridge - thc631lvdm83d bridge improvements - cadence + allwinner DSI ported to generic phy panels: - Sitronix ST7701 panel - Kingdisplay KD097D04 - LeMaker BL035-RGB-002 - PDA 91-00156-A0 - Innolux EE101IA-01D i915: - Enable fastboot by default on SKL+/VLV/CHV - Export RPCS configuration for ICL media driver - Coffelake PCI ID - CNL clocks setup fixes - ACPI/PMIC support for MIPI/DSI - Per-engine WA init for all engines - Shrinker locking fixes - Kerneldoc updates - Lots of ring improvements and reset fixes - Coffeelake GVT Support - VFIO GVT EDID Region support - runtime PM wakeref tracking - ILK->IVB primary plane enable delays - userptr mutex locking fixes - DSI fixes - LVDS/TV cleanups - HW readout fixes - LUT robustness fixes - ICL display and watermark fixes - gem mmap race fix amdgpu: - add scheduled dependencies interface - DCC on scanout surfaces - vega10/20 BACO support - Multiple IH rings on soc15 - XGMI locking fixes - DC i2c/aux cleanups - runtime SMU debug interface - Kexec improvmeents - SR-IOV fixes - DC freesync + ABM fixes - GDS fixes - GPUVM fixes - vega20 PCIE DPM switching fixes - Context priority handling fixes radeon: - fix missing break in evergreen parser nouveau: - SVM support via HMM msm: - QCOM Compressed modifier support exynos: - s5pv210 rotator support imx: - zpos property support - pending update fixes v3d: - cache flush improvments vc4: - reflection support - HDMI overscan support tegra: - CEC refactoring - HDMI audio fixes - Tegra186 prep work - SOR crossbar device tree fixes sun4i: - implicit fencing support - YUV and scalar support improvements - A23 support - tiling fixes atmel-hlcdc: - clipping and rotation property fixes qxl: - BO and PRIME improvements - generic fbdev emulation dw-hdmi: - HDMI 2.0 2160p - YUV420 ouput rockchip: - implicit fencing support - reflection proerties virtio-gpu: - use generic fbdev emulation tilcdc: - cpufreq vs crtc init fix rcar-du: - R8A774C0 support - D3/E3 RGB output routing fixes and DPAD0 support - RA87744 LVDS support bochs: - atomic and generic fbdev emulation - ID mismatch error on bochs load meson: - remove firmware fbs" * tag 'drm-next-2019-03-06' of git://anongit.freedesktop.org/drm/drm: (1130 commits) drm/amd/display: Use vrr friendly pageflip throttling in DC. drm/imx: only send commit done event when all state has been applied drm/imx: allow building under COMPILE_TEST drm/imx: imx-tve: depend on COMMON_CLK drm/imx: ipuv3-plane: add zpos property drm/imx: ipuv3-plane: add function to query atomic update status gpu: ipu-v3: prg: add function to get channel configure status gpu: ipu-v3: pre: add double buffer status readback drm/amdgpu: Bump amdgpu version for context priority override. drm/amdgpu/powerplay: fix typo in BACO header guards drm/amdgpu/powerplay: fix return codes in BACO code drm/amdgpu: add missing license on baco files drm/bochs: Fix the ID mismatch error drm/nouveau/dmem: use dma addresses during migration copies drm/nouveau/dmem: use physical vram addresses during migration copies drm/nouveau/dmem: extend copy function to allow direct use of physical addresses drm/nouveau/svm: new ioctl to migrate process memory to GPU memory drm/nouveau/dmem: device memory helpers for SVM drm/nouveau/svm: initial support for shared virtual memory drm/nouveau: prepare for enabling svm with existing userspace interfaces ...
This commit is contained in:
@@ -10,9 +10,11 @@
|
||||
#ifndef __DW_HDMI__
|
||||
#define __DW_HDMI__
|
||||
|
||||
#include <drm/drmP.h>
|
||||
|
||||
struct drm_connector;
|
||||
struct drm_display_mode;
|
||||
struct drm_encoder;
|
||||
struct dw_hdmi;
|
||||
struct platform_device;
|
||||
|
||||
/**
|
||||
* DOC: Supported input formats and encodings
|
||||
@@ -157,6 +159,7 @@ void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
|
||||
void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
|
||||
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
|
||||
void dw_hdmi_audio_disable(struct dw_hdmi *hdmi);
|
||||
void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi);
|
||||
|
||||
/* PHY configuration */
|
||||
void dw_hdmi_phy_i2c_set_addr(struct dw_hdmi *hdmi, u8 address);
|
||||
|
@@ -14,7 +14,8 @@ struct dw_mipi_dsi;
|
||||
|
||||
struct dw_mipi_dsi_phy_ops {
|
||||
int (*init)(void *priv_data);
|
||||
int (*get_lane_mbps)(void *priv_data, struct drm_display_mode *mode,
|
||||
int (*get_lane_mbps)(void *priv_data,
|
||||
const struct drm_display_mode *mode,
|
||||
unsigned long mode_flags, u32 lanes, u32 format,
|
||||
unsigned int *lane_mbps);
|
||||
};
|
||||
|
@@ -93,25 +93,11 @@ struct dma_buf_attachment;
|
||||
struct pci_dev;
|
||||
struct pci_controller;
|
||||
|
||||
#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
|
||||
|
||||
#define DRM_SWITCH_POWER_ON 0
|
||||
#define DRM_SWITCH_POWER_OFF 1
|
||||
#define DRM_SWITCH_POWER_CHANGING 2
|
||||
#define DRM_SWITCH_POWER_DYNAMIC_OFF 3
|
||||
|
||||
/* returns true if currently okay to sleep */
|
||||
static inline bool drm_can_sleep(void)
|
||||
{
|
||||
if (in_atomic() || in_dbg_master() || irqs_disabled())
|
||||
return false;
|
||||
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
|
||||
/*
|
||||
* NOTE: drmP.h is obsolete - do NOT add anything to this file
|
||||
*
|
||||
* Do not include drmP.h in new files.
|
||||
* Work is ongoing to remove drmP.h includes from existing files
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
@@ -139,9 +139,9 @@ struct drm_crtc_commit {
|
||||
/**
|
||||
* @abort_completion:
|
||||
*
|
||||
* A flag that's set after drm_atomic_helper_setup_commit takes a second
|
||||
* reference for the completion of $drm_crtc_state.event. It's used by
|
||||
* the free code to remove the second reference if commit fails.
|
||||
* A flag that's set after drm_atomic_helper_setup_commit() takes a
|
||||
* second reference for the completion of $drm_crtc_state.event. It's
|
||||
* used by the free code to remove the second reference if commit fails.
|
||||
*/
|
||||
bool abort_completion;
|
||||
};
|
||||
@@ -192,7 +192,7 @@ struct drm_private_state;
|
||||
* private objects. The structure itself is used as a vtable to identify the
|
||||
* associated private object type. Each private object type that needs to be
|
||||
* added to the atomic states is expected to have an implementation of these
|
||||
* hooks and pass a pointer to it's drm_private_state_funcs struct to
|
||||
* hooks and pass a pointer to its drm_private_state_funcs struct to
|
||||
* drm_atomic_get_private_obj_state().
|
||||
*/
|
||||
struct drm_private_state_funcs {
|
||||
@@ -228,8 +228,30 @@ struct drm_private_state_funcs {
|
||||
* Currently only tracks the state update functions and the opaque driver
|
||||
* private state itself, but in the future might also track which
|
||||
* &drm_modeset_lock is required to duplicate and update this object's state.
|
||||
*
|
||||
* All private objects must be initialized before the DRM device they are
|
||||
* attached to is registered to the DRM subsystem (call to drm_dev_register())
|
||||
* and should stay around until this DRM device is unregistered (call to
|
||||
* drm_dev_unregister()). In other words, private objects lifetime is tied
|
||||
* to the DRM device lifetime. This implies that:
|
||||
*
|
||||
* 1/ all calls to drm_atomic_private_obj_init() must be done before calling
|
||||
* drm_dev_register()
|
||||
* 2/ all calls to drm_atomic_private_obj_fini() must be done after calling
|
||||
* drm_dev_unregister()
|
||||
*/
|
||||
struct drm_private_obj {
|
||||
/**
|
||||
* @head: List entry used to attach a private object to a &drm_device
|
||||
* (queued to &drm_mode_config.privobj_list).
|
||||
*/
|
||||
struct list_head head;
|
||||
|
||||
/**
|
||||
* @lock: Modeset lock to protect the state object.
|
||||
*/
|
||||
struct drm_modeset_lock lock;
|
||||
|
||||
/**
|
||||
* @state: Current atomic state for this driver private object.
|
||||
*/
|
||||
@@ -244,6 +266,18 @@ struct drm_private_obj {
|
||||
const struct drm_private_state_funcs *funcs;
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_for_each_privobj() - private object iterator
|
||||
*
|
||||
* @privobj: pointer to the current private object. Updated after each
|
||||
* iteration
|
||||
* @dev: the DRM device we want get private objects from
|
||||
*
|
||||
* Allows one to iterate over all private objects attached to @dev
|
||||
*/
|
||||
#define drm_for_each_privobj(privobj, dev) \
|
||||
list_for_each_entry(privobj, &(dev)->mode_config.privobj_list, head)
|
||||
|
||||
/**
|
||||
* struct drm_private_state - base struct for driver private object state
|
||||
* @state: backpointer to global drm_atomic_state
|
||||
@@ -295,6 +329,15 @@ struct drm_atomic_state {
|
||||
bool allow_modeset : 1;
|
||||
bool legacy_cursor_update : 1;
|
||||
bool async_update : 1;
|
||||
/**
|
||||
* @duplicated:
|
||||
*
|
||||
* Indicates whether or not this atomic state was duplicated using
|
||||
* drm_atomic_helper_duplicate_state(). Drivers and atomic helpers
|
||||
* should use this to fixup normal inconsistencies in duplicated
|
||||
* states.
|
||||
*/
|
||||
bool duplicated : 1;
|
||||
struct __drm_planes_state *planes;
|
||||
struct __drm_crtcs_state *crtcs;
|
||||
int num_connector;
|
||||
@@ -400,7 +443,8 @@ struct drm_connector_state * __must_check
|
||||
drm_atomic_get_connector_state(struct drm_atomic_state *state,
|
||||
struct drm_connector *connector);
|
||||
|
||||
void drm_atomic_private_obj_init(struct drm_private_obj *obj,
|
||||
void drm_atomic_private_obj_init(struct drm_device *dev,
|
||||
struct drm_private_obj *obj,
|
||||
struct drm_private_state *state,
|
||||
const struct drm_private_state_funcs *funcs);
|
||||
void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
|
||||
|
@@ -196,8 +196,8 @@ struct drm_bridge_funcs {
|
||||
* the DRM framework will have to be extended with DRM bridge states.
|
||||
*/
|
||||
void (*mode_set)(struct drm_bridge *bridge,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
const struct drm_display_mode *mode,
|
||||
const struct drm_display_mode *adjusted_mode);
|
||||
/**
|
||||
* @pre_enable:
|
||||
*
|
||||
@@ -310,8 +310,8 @@ enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
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);
|
||||
const struct drm_display_mode *mode,
|
||||
const struct drm_display_mode *adjusted_mode);
|
||||
void drm_bridge_pre_enable(struct drm_bridge *bridge);
|
||||
void drm_bridge_enable(struct drm_bridge *bridge);
|
||||
|
||||
|
@@ -47,6 +47,24 @@ static inline bool drm_arch_can_wc_memory(void)
|
||||
return false;
|
||||
#elif defined(CONFIG_MIPS) && defined(CONFIG_CPU_LOONGSON3)
|
||||
return false;
|
||||
#elif defined(CONFIG_ARM) || defined(CONFIG_ARM64)
|
||||
/*
|
||||
* The DRM driver stack is designed to work with cache coherent devices
|
||||
* only, but permits an optimization to be enabled in some cases, where
|
||||
* for some buffers, both the CPU and the GPU use uncached mappings,
|
||||
* removing the need for DMA snooping and allocation in the CPU caches.
|
||||
*
|
||||
* The use of uncached GPU mappings relies on the correct implementation
|
||||
* of the PCIe NoSnoop TLP attribute by the platform, otherwise the GPU
|
||||
* will use cached mappings nonetheless. On x86 platforms, this does not
|
||||
* seem to matter, as uncached CPU mappings will snoop the caches in any
|
||||
* case. However, on ARM and arm64, enabling this optimization on a
|
||||
* platform where NoSnoop is ignored results in loss of coherency, which
|
||||
* breaks correct operation of the device. Since we have no way of
|
||||
* detecting whether NoSnoop works or not, just disable this
|
||||
* optimization entirely for ARM and arm64.
|
||||
*/
|
||||
return false;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
|
@@ -26,7 +26,7 @@ struct drm_client_funcs {
|
||||
* @unregister:
|
||||
*
|
||||
* Called when &drm_device is unregistered. The client should respond by
|
||||
* releasing it's resources using drm_client_release().
|
||||
* releasing its resources using drm_client_release().
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
|
@@ -69,4 +69,32 @@ int drm_plane_create_color_properties(struct drm_plane *plane,
|
||||
u32 supported_ranges,
|
||||
enum drm_color_encoding default_encoding,
|
||||
enum drm_color_range default_range);
|
||||
|
||||
/**
|
||||
* enum drm_color_lut_tests - hw-specific LUT tests to perform
|
||||
*
|
||||
* The drm_color_lut_check() function takes a bitmask of the values here to
|
||||
* determine which tests to apply to a userspace-provided LUT.
|
||||
*/
|
||||
enum drm_color_lut_tests {
|
||||
/**
|
||||
* @DRM_COLOR_LUT_EQUAL_CHANNELS:
|
||||
*
|
||||
* Checks whether the entries of a LUT all have equal values for the
|
||||
* red, green, and blue channels. Intended for hardware that only
|
||||
* accepts a single value per LUT entry and assumes that value applies
|
||||
* to all three color components.
|
||||
*/
|
||||
DRM_COLOR_LUT_EQUAL_CHANNELS = BIT(0),
|
||||
|
||||
/**
|
||||
* @DRM_COLOR_LUT_NON_DECREASING:
|
||||
*
|
||||
* Checks whether the entries of a LUT are always flat or increasing
|
||||
* (never decreasing).
|
||||
*/
|
||||
DRM_COLOR_LUT_NON_DECREASING = BIT(1),
|
||||
};
|
||||
|
||||
int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests);
|
||||
#endif
|
||||
|
@@ -365,6 +365,12 @@ struct drm_display_info {
|
||||
*/
|
||||
bool has_hdmi_infoframe;
|
||||
|
||||
/**
|
||||
* @rgb_quant_range_selectable: Does the sink support selecting
|
||||
* the RGB quantization range?
|
||||
*/
|
||||
bool rgb_quant_range_selectable;
|
||||
|
||||
/**
|
||||
* @edid_hdmi_dc_modes: Mask of supported hdmi deep color modes. Even
|
||||
* more stuff redundant with @bus_formats.
|
||||
@@ -394,7 +400,7 @@ int drm_display_info_set_bus_formats(struct drm_display_info *info,
|
||||
/**
|
||||
* struct drm_tv_connector_state - TV connector related states
|
||||
* @subconnector: selected subconnector
|
||||
* @margins: margins
|
||||
* @margins: margins (all margins are expressed in pixels)
|
||||
* @margins.left: left margin
|
||||
* @margins.right: right margin
|
||||
* @margins.top: top margin
|
||||
@@ -906,7 +912,7 @@ struct drm_connector {
|
||||
/**
|
||||
* @ycbcr_420_allowed : This bool indicates if this connector is
|
||||
* capable of handling YCBCR 420 output. While parsing the EDID
|
||||
* blocks, its very helpful to know, if the source is capable of
|
||||
* blocks it's very helpful to know if the source is capable of
|
||||
* handling YCBCR 420 outputs.
|
||||
*/
|
||||
bool ycbcr_420_allowed;
|
||||
@@ -1249,9 +1255,11 @@ const char *drm_get_tv_select_name(int val);
|
||||
const char *drm_get_content_protection_name(int val);
|
||||
|
||||
int drm_mode_create_dvi_i_properties(struct drm_device *dev);
|
||||
int drm_mode_create_tv_margin_properties(struct drm_device *dev);
|
||||
int drm_mode_create_tv_properties(struct drm_device *dev,
|
||||
unsigned int num_modes,
|
||||
const char * const modes[]);
|
||||
void drm_connector_attach_tv_margin_properties(struct drm_connector *conn);
|
||||
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,
|
||||
|
@@ -1149,9 +1149,6 @@ static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc)
|
||||
return 1 << drm_crtc_index(crtc);
|
||||
}
|
||||
|
||||
int drm_crtc_force_disable(struct drm_crtc *crtc);
|
||||
int drm_crtc_force_disable_all(struct drm_device *dev);
|
||||
|
||||
int drm_mode_set_config_internal(struct drm_mode_set *set);
|
||||
struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx);
|
||||
|
||||
|
@@ -56,21 +56,6 @@ bool drm_helper_encoder_in_use(struct drm_encoder *encoder);
|
||||
int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
|
||||
|
||||
void drm_helper_resume_force_mode(struct drm_device *dev);
|
||||
|
||||
/* drm_probe_helper.c */
|
||||
int drm_helper_probe_single_connector_modes(struct drm_connector
|
||||
*connector, uint32_t maxX,
|
||||
uint32_t maxY);
|
||||
int drm_helper_probe_detect(struct drm_connector *connector,
|
||||
struct drm_modeset_acquire_ctx *ctx,
|
||||
bool force);
|
||||
void drm_kms_helper_poll_init(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_fini(struct drm_device *dev);
|
||||
bool drm_helper_hpd_irq_event(struct drm_device *dev);
|
||||
void drm_kms_helper_hotplug_event(struct drm_device *dev);
|
||||
|
||||
void drm_kms_helper_poll_disable(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_enable(struct drm_device *dev);
|
||||
bool drm_kms_helper_is_poll_worker(void);
|
||||
int drm_helper_force_disable_all(struct drm_device *dev);
|
||||
|
||||
#endif
|
||||
|
@@ -78,6 +78,9 @@ drm_atomic_helper_damage_iter_init(struct drm_atomic_helper_damage_iter *iter,
|
||||
bool
|
||||
drm_atomic_helper_damage_iter_next(struct drm_atomic_helper_damage_iter *iter,
|
||||
struct drm_rect *rect);
|
||||
bool drm_atomic_helper_damage_merged(const struct drm_plane_state *old_state,
|
||||
struct drm_plane_state *state,
|
||||
struct drm_rect *rect);
|
||||
|
||||
/**
|
||||
* drm_helper_get_plane_damage_clips - Returns damage clips in &drm_rect.
|
||||
|
@@ -24,25 +24,79 @@ struct inode;
|
||||
struct pci_dev;
|
||||
struct pci_controller;
|
||||
|
||||
|
||||
/**
|
||||
* DRM device structure. This structure represent a complete card that
|
||||
* enum drm_switch_power - power state of drm device
|
||||
*/
|
||||
|
||||
enum switch_power_state {
|
||||
/** @DRM_SWITCH_POWER_ON: Power state is ON */
|
||||
DRM_SWITCH_POWER_ON = 0,
|
||||
|
||||
/** @DRM_SWITCH_POWER_OFF: Power state is OFF */
|
||||
DRM_SWITCH_POWER_OFF = 1,
|
||||
|
||||
/** @DRM_SWITCH_POWER_CHANGING: Power state is changing */
|
||||
DRM_SWITCH_POWER_CHANGING = 2,
|
||||
|
||||
/** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */
|
||||
DRM_SWITCH_POWER_DYNAMIC_OFF = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_device - DRM device structure
|
||||
*
|
||||
* This structure represent a complete card that
|
||||
* may contain multiple heads.
|
||||
*/
|
||||
struct drm_device {
|
||||
struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
|
||||
int if_version; /**< Highest interface version set */
|
||||
/**
|
||||
* @legacy_dev_list:
|
||||
*
|
||||
* List of devices per driver for stealth attach cleanup
|
||||
*/
|
||||
struct list_head legacy_dev_list;
|
||||
|
||||
/** \name Lifetime Management */
|
||||
/*@{ */
|
||||
struct kref ref; /**< Object ref-count */
|
||||
struct device *dev; /**< Device structure of bus-device */
|
||||
struct drm_driver *driver; /**< DRM driver managing the device */
|
||||
void *dev_private; /**< DRM driver private data */
|
||||
struct drm_minor *primary; /**< Primary node */
|
||||
struct drm_minor *render; /**< Render node */
|
||||
/** @if_version: Highest interface version set */
|
||||
int if_version;
|
||||
|
||||
/** @ref: Object ref-count */
|
||||
struct kref ref;
|
||||
|
||||
/** @dev: Device structure of bus-device */
|
||||
struct device *dev;
|
||||
|
||||
/** @driver: DRM driver managing the device */
|
||||
struct drm_driver *driver;
|
||||
|
||||
/**
|
||||
* @dev_private:
|
||||
*
|
||||
* DRM driver private data. Instead of using this pointer it is
|
||||
* recommended that drivers use drm_dev_init() and embed struct
|
||||
* &drm_device in their larger per-device structure.
|
||||
*/
|
||||
void *dev_private;
|
||||
|
||||
/** @primary: Primary node */
|
||||
struct drm_minor *primary;
|
||||
|
||||
/** @render: Render node */
|
||||
struct drm_minor *render;
|
||||
|
||||
/**
|
||||
* @registered:
|
||||
*
|
||||
* Internally used by drm_dev_register() and drm_connector_register().
|
||||
*/
|
||||
bool registered;
|
||||
|
||||
/* currently active master for this device. Protected by master_mutex */
|
||||
/**
|
||||
* @master:
|
||||
*
|
||||
* Currently active master for this device.
|
||||
* Protected by &master_mutex
|
||||
*/
|
||||
struct drm_master *master;
|
||||
|
||||
/**
|
||||
@@ -63,76 +117,65 @@ struct drm_device {
|
||||
*/
|
||||
bool unplugged;
|
||||
|
||||
struct inode *anon_inode; /**< inode for private address-space */
|
||||
char *unique; /**< unique name of the device */
|
||||
/*@} */
|
||||
/** @anon_inode: inode for private address-space */
|
||||
struct inode *anon_inode;
|
||||
|
||||
/** \name Locks */
|
||||
/*@{ */
|
||||
struct mutex struct_mutex; /**< For others */
|
||||
struct mutex master_mutex; /**< For drm_minor::master and drm_file::is_master */
|
||||
/*@} */
|
||||
/** @unique: Unique name of the device */
|
||||
char *unique;
|
||||
|
||||
/** \name Usage Counters */
|
||||
/*@{ */
|
||||
int open_count; /**< Outstanding files open, protected by drm_global_mutex. */
|
||||
spinlock_t buf_lock; /**< For drm_device::buf_use and a few other things. */
|
||||
int buf_use; /**< Buffers in use -- cannot alloc */
|
||||
atomic_t buf_alloc; /**< Buffer allocation in progress */
|
||||
/*@} */
|
||||
/**
|
||||
* @struct_mutex:
|
||||
*
|
||||
* Lock for others (not &drm_minor.master and &drm_file.is_master)
|
||||
*/
|
||||
struct mutex struct_mutex;
|
||||
|
||||
/**
|
||||
* @master_mutex:
|
||||
*
|
||||
* Lock for &drm_minor.master and &drm_file.is_master
|
||||
*/
|
||||
struct mutex master_mutex;
|
||||
|
||||
/**
|
||||
* @open_count:
|
||||
*
|
||||
* Usage counter for outstanding files open,
|
||||
* protected by drm_global_mutex
|
||||
*/
|
||||
int open_count;
|
||||
|
||||
/** @filelist_mutex: Protects @filelist. */
|
||||
struct mutex filelist_mutex;
|
||||
/**
|
||||
* @filelist:
|
||||
*
|
||||
* List of userspace clients, linked through &drm_file.lhead.
|
||||
*/
|
||||
struct list_head filelist;
|
||||
|
||||
/**
|
||||
* @filelist_internal:
|
||||
*
|
||||
* List of open DRM files for in-kernel clients. Protected by @filelist_mutex.
|
||||
* List of open DRM files for in-kernel clients.
|
||||
* Protected by &filelist_mutex.
|
||||
*/
|
||||
struct list_head filelist_internal;
|
||||
|
||||
/**
|
||||
* @clientlist_mutex:
|
||||
*
|
||||
* Protects @clientlist access.
|
||||
* Protects &clientlist access.
|
||||
*/
|
||||
struct mutex clientlist_mutex;
|
||||
|
||||
/**
|
||||
* @clientlist:
|
||||
*
|
||||
* List of in-kernel clients. Protected by @clientlist_mutex.
|
||||
* List of in-kernel clients. Protected by &clientlist_mutex.
|
||||
*/
|
||||
struct list_head clientlist;
|
||||
|
||||
/** \name Memory management */
|
||||
/*@{ */
|
||||
struct list_head maplist; /**< Linked list of regions */
|
||||
struct drm_open_hash map_hash; /**< User token hash table for maps */
|
||||
|
||||
/** \name Context handle management */
|
||||
/*@{ */
|
||||
struct list_head ctxlist; /**< Linked list of context handles */
|
||||
struct mutex ctxlist_mutex; /**< For ctxlist */
|
||||
|
||||
struct idr ctx_idr;
|
||||
|
||||
struct list_head vmalist; /**< List of vmas (for debugging) */
|
||||
|
||||
/*@} */
|
||||
|
||||
/** \name DMA support */
|
||||
/*@{ */
|
||||
struct drm_device_dma *dma; /**< Optional pointer for DMA support */
|
||||
/*@} */
|
||||
|
||||
/** \name Context support */
|
||||
/*@{ */
|
||||
|
||||
__volatile__ long context_flag; /**< Context swapping flag */
|
||||
int last_context; /**< Last current context */
|
||||
/*@} */
|
||||
|
||||
/**
|
||||
* @irq_enabled:
|
||||
*
|
||||
@@ -141,6 +184,10 @@ struct drm_device {
|
||||
* to true manually.
|
||||
*/
|
||||
bool irq_enabled;
|
||||
|
||||
/**
|
||||
* @irq: Used by the drm_irq_install() and drm_irq_unistall() helpers.
|
||||
*/
|
||||
int irq;
|
||||
|
||||
/**
|
||||
@@ -168,7 +215,16 @@ struct drm_device {
|
||||
*/
|
||||
struct drm_vblank_crtc *vblank;
|
||||
|
||||
spinlock_t vblank_time_lock; /**< Protects vblank count and time updates during vblank enable/disable */
|
||||
/**
|
||||
* @vblank_time_lock:
|
||||
*
|
||||
* Protects vblank count and time updates during vblank enable/disable
|
||||
*/
|
||||
spinlock_t vblank_time_lock;
|
||||
/**
|
||||
* @vbl_lock: Top-level vblank references lock, wraps the low-level
|
||||
* @vblank_time_lock.
|
||||
*/
|
||||
spinlock_t vbl_lock;
|
||||
|
||||
/**
|
||||
@@ -184,27 +240,108 @@ struct drm_device {
|
||||
* races and imprecision over longer time periods, hence exposing a
|
||||
* hardware vblank counter is always recommended.
|
||||
*
|
||||
* If non-zeor, &drm_crtc_funcs.get_vblank_counter must be set.
|
||||
* This is the statically configured device wide maximum. The driver
|
||||
* can instead choose to use a runtime configurable per-crtc value
|
||||
* &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count
|
||||
* must be left at zero. See drm_crtc_set_max_vblank_count() on how
|
||||
* to use the per-crtc value.
|
||||
*
|
||||
* If non-zero, &drm_crtc_funcs.get_vblank_counter must be set.
|
||||
*/
|
||||
u32 max_vblank_count; /**< size of vblank counter register */
|
||||
u32 max_vblank_count;
|
||||
|
||||
/** @vblank_event_list: List of vblank events */
|
||||
struct list_head vblank_event_list;
|
||||
|
||||
/**
|
||||
* List of events
|
||||
* @event_lock:
|
||||
*
|
||||
* Protects @vblank_event_list and event delivery in
|
||||
* general. See drm_send_event() and drm_send_event_locked().
|
||||
*/
|
||||
struct list_head vblank_event_list;
|
||||
spinlock_t event_lock;
|
||||
|
||||
/*@} */
|
||||
/** @agp: AGP data */
|
||||
struct drm_agp_head *agp;
|
||||
|
||||
struct drm_agp_head *agp; /**< AGP data */
|
||||
/** @pdev: PCI device structure */
|
||||
struct pci_dev *pdev;
|
||||
|
||||
struct pci_dev *pdev; /**< PCI device structure */
|
||||
#ifdef __alpha__
|
||||
/** @hose: PCI hose, only used on ALPHA platforms. */
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
/** @num_crtcs: Number of CRTCs on this device */
|
||||
unsigned int num_crtcs;
|
||||
|
||||
struct drm_sg_mem *sg; /**< Scatter gather memory */
|
||||
unsigned int num_crtcs; /**< Number of CRTCs on this device */
|
||||
/** @mode_config: Current mode config */
|
||||
struct drm_mode_config mode_config;
|
||||
|
||||
/** @object_name_lock: GEM information */
|
||||
struct mutex object_name_lock;
|
||||
|
||||
/** @object_name_idr: GEM information */
|
||||
struct idr object_name_idr;
|
||||
|
||||
/** @vma_offset_manager: GEM information */
|
||||
struct drm_vma_offset_manager *vma_offset_manager;
|
||||
|
||||
/**
|
||||
* @switch_power_state:
|
||||
*
|
||||
* Power state of the client.
|
||||
* Used by drivers supporting the switcheroo driver.
|
||||
* The state is maintained in the
|
||||
* &vga_switcheroo_client_ops.set_gpu_state callback
|
||||
*/
|
||||
enum switch_power_state 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;
|
||||
|
||||
/* Everything below here is for legacy driver, never use! */
|
||||
/* private: */
|
||||
|
||||
/* Context handle management - linked list of context handles */
|
||||
struct list_head ctxlist;
|
||||
|
||||
/* Context handle management - mutex for &ctxlist */
|
||||
struct mutex ctxlist_mutex;
|
||||
|
||||
/* Context handle management */
|
||||
struct idr ctx_idr;
|
||||
|
||||
/* Memory management - linked list of regions */
|
||||
struct list_head maplist;
|
||||
|
||||
/* Memory management - user token hash table for maps */
|
||||
struct drm_open_hash map_hash;
|
||||
|
||||
/* Context handle management - list of vmas (for debugging) */
|
||||
struct list_head vmalist;
|
||||
|
||||
/* Optional pointer for DMA support */
|
||||
struct drm_device_dma *dma;
|
||||
|
||||
/* Context swapping flag */
|
||||
__volatile__ long context_flag;
|
||||
|
||||
/* Last current context */
|
||||
int last_context;
|
||||
|
||||
/* Lock for &buf_use and a few other things. */
|
||||
spinlock_t buf_lock;
|
||||
|
||||
/* Usage counter for buffers in use -- cannot alloc */
|
||||
int buf_use;
|
||||
|
||||
/* Buffer allocation in progress */
|
||||
atomic_t buf_alloc;
|
||||
|
||||
struct {
|
||||
int context;
|
||||
@@ -214,23 +351,8 @@ struct drm_device {
|
||||
struct drm_local_map *agp_buffer_map;
|
||||
unsigned int agp_buffer_token;
|
||||
|
||||
struct drm_mode_config mode_config; /**< Current mode config */
|
||||
|
||||
/** \name GEM information */
|
||||
/*@{ */
|
||||
struct mutex object_name_lock;
|
||||
struct idr object_name_idr;
|
||||
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;
|
||||
/* Scatter gather memory */
|
||||
struct drm_sg_mem *sg;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -314,6 +314,10 @@
|
||||
# define DP_PSR_SETUP_TIME_SHIFT 1
|
||||
# define DP_PSR2_SU_Y_COORDINATE_REQUIRED (1 << 4) /* eDP 1.4a */
|
||||
# define DP_PSR2_SU_GRANULARITY_REQUIRED (1 << 5) /* eDP 1.4b */
|
||||
|
||||
#define DP_PSR2_SU_X_GRANULARITY 0x072 /* eDP 1.4b */
|
||||
#define DP_PSR2_SU_Y_GRANULARITY 0x074 /* eDP 1.4b */
|
||||
|
||||
/*
|
||||
* 0x80-0x8f describe downstream port capabilities, but there are two layouts
|
||||
* based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not,
|
||||
@@ -556,6 +560,8 @@
|
||||
# define DP_TEST_LINK_EDID_READ (1 << 2)
|
||||
# define DP_TEST_LINK_PHY_TEST_PATTERN (1 << 3) /* DPCD >= 1.1 */
|
||||
# define DP_TEST_LINK_FAUX_PATTERN (1 << 4) /* DPCD >= 1.2 */
|
||||
# define DP_TEST_LINK_AUDIO_PATTERN (1 << 5) /* DPCD >= 1.2 */
|
||||
# define DP_TEST_LINK_AUDIO_DISABLED_VIDEO (1 << 6) /* DPCD >= 1.2 */
|
||||
|
||||
#define DP_TEST_LINK_RATE 0x219
|
||||
# define DP_LINK_RATE_162 (0x6)
|
||||
@@ -604,6 +610,7 @@
|
||||
# define DP_COLOR_FORMAT_RGB (0 << 1)
|
||||
# define DP_COLOR_FORMAT_YCbCr422 (1 << 1)
|
||||
# define DP_COLOR_FORMAT_YCbCr444 (2 << 1)
|
||||
# define DP_TEST_DYNAMIC_RANGE_VESA (0 << 3)
|
||||
# define DP_TEST_DYNAMIC_RANGE_CEA (1 << 3)
|
||||
# define DP_TEST_YCBCR_COEFFICIENTS (1 << 4)
|
||||
# define DP_YCBCR_COEFFICIENTS_ITU601 (0 << 4)
|
||||
@@ -653,6 +660,16 @@
|
||||
|
||||
#define DP_TEST_SINK 0x270
|
||||
# define DP_TEST_SINK_START (1 << 0)
|
||||
#define DP_TEST_AUDIO_MODE 0x271
|
||||
#define DP_TEST_AUDIO_PATTERN_TYPE 0x272
|
||||
#define DP_TEST_AUDIO_PERIOD_CH1 0x273
|
||||
#define DP_TEST_AUDIO_PERIOD_CH2 0x274
|
||||
#define DP_TEST_AUDIO_PERIOD_CH3 0x275
|
||||
#define DP_TEST_AUDIO_PERIOD_CH4 0x276
|
||||
#define DP_TEST_AUDIO_PERIOD_CH5 0x277
|
||||
#define DP_TEST_AUDIO_PERIOD_CH6 0x278
|
||||
#define DP_TEST_AUDIO_PERIOD_CH7 0x279
|
||||
#define DP_TEST_AUDIO_PERIOD_CH8 0x27A
|
||||
|
||||
#define DP_FEC_STATUS 0x280 /* 1.4 */
|
||||
# define DP_FEC_DECODE_EN_DETECTED (1 << 0)
|
||||
@@ -972,6 +989,7 @@
|
||||
#define DP_PEER_DEVICE_DP_LEGACY_CONV 0x4
|
||||
|
||||
/* DP 1.2 MST sideband request names DP 1.2a Table 2-80 */
|
||||
#define DP_GET_MSG_TRANSACTION_VERSION 0x00 /* DP 1.3 */
|
||||
#define DP_LINK_ADDRESS 0x01
|
||||
#define DP_CONNECTION_STATUS_NOTIFY 0x02
|
||||
#define DP_ENUM_PATH_RESOURCES 0x10
|
||||
@@ -988,6 +1006,10 @@
|
||||
#define DP_SINK_EVENT_NOTIFY 0x30
|
||||
#define DP_QUERY_STREAM_ENC_STATUS 0x38
|
||||
|
||||
/* DP 1.2 MST sideband reply types */
|
||||
#define DP_SIDEBAND_REPLY_ACK 0x00
|
||||
#define DP_SIDEBAND_REPLY_NAK 0x01
|
||||
|
||||
/* DP 1.2 MST sideband nak reasons - table 2.84 */
|
||||
#define DP_NAK_WRITE_FAILURE 0x01
|
||||
#define DP_NAK_INVALID_READ 0x02
|
||||
@@ -1043,11 +1065,18 @@ int drm_dp_bw_code_to_link_rate(u8 link_bw);
|
||||
#define DP_SDP_VSC_EXT_CEA 0x21 /* DP 1.4 */
|
||||
/* 0x80+ CEA-861 infoframe types */
|
||||
|
||||
/**
|
||||
* struct dp_sdp_header - DP secondary data packet header
|
||||
* @HB0: Secondary Data Packet ID
|
||||
* @HB1: Secondary Data Packet Type
|
||||
* @HB2: Secondary Data Packet Specific header, Byte 0
|
||||
* @HB3: Secondary Data packet Specific header, Byte 1
|
||||
*/
|
||||
struct dp_sdp_header {
|
||||
u8 HB0; /* Secondary Data Packet ID */
|
||||
u8 HB1; /* Secondary Data Packet Type */
|
||||
u8 HB2; /* Secondary Data Packet Specific header, Byte 0 */
|
||||
u8 HB3; /* Secondary Data packet Specific header, Byte 1 */
|
||||
u8 HB0;
|
||||
u8 HB1;
|
||||
u8 HB2;
|
||||
u8 HB3;
|
||||
} __packed;
|
||||
|
||||
#define EDP_SDP_HEADER_REVISION_MASK 0x1F
|
||||
|
@@ -44,7 +44,6 @@ struct drm_dp_vcpi {
|
||||
|
||||
/**
|
||||
* struct drm_dp_mst_port - MST port
|
||||
* @kref: reference count for this port.
|
||||
* @port_num: port number
|
||||
* @input: if this port is an input port.
|
||||
* @mcs: message capability status - DP 1.2 spec.
|
||||
@@ -67,7 +66,18 @@ struct drm_dp_vcpi {
|
||||
* in the MST topology.
|
||||
*/
|
||||
struct drm_dp_mst_port {
|
||||
struct kref kref;
|
||||
/**
|
||||
* @topology_kref: refcount for this port's lifetime in the topology,
|
||||
* only the DP MST helpers should need to touch this
|
||||
*/
|
||||
struct kref topology_kref;
|
||||
|
||||
/**
|
||||
* @malloc_kref: refcount for the memory allocation containing this
|
||||
* structure. See drm_dp_mst_get_port_malloc() and
|
||||
* drm_dp_mst_put_port_malloc().
|
||||
*/
|
||||
struct kref malloc_kref;
|
||||
|
||||
u8 port_num;
|
||||
bool input;
|
||||
@@ -102,7 +112,6 @@ struct drm_dp_mst_port {
|
||||
|
||||
/**
|
||||
* struct drm_dp_mst_branch - MST branch device.
|
||||
* @kref: reference count for this port.
|
||||
* @rad: Relative Address to talk to this branch device.
|
||||
* @lct: Link count total to talk to this branch device.
|
||||
* @num_ports: number of ports on the branch.
|
||||
@@ -121,7 +130,19 @@ struct drm_dp_mst_port {
|
||||
* to downstream port of parent branches.
|
||||
*/
|
||||
struct drm_dp_mst_branch {
|
||||
struct kref kref;
|
||||
/**
|
||||
* @topology_kref: refcount for this branch device's lifetime in the
|
||||
* topology, only the DP MST helpers should need to touch this
|
||||
*/
|
||||
struct kref topology_kref;
|
||||
|
||||
/**
|
||||
* @malloc_kref: refcount for the memory allocation containing this
|
||||
* structure. See drm_dp_mst_get_mstb_malloc() and
|
||||
* drm_dp_mst_put_mstb_malloc().
|
||||
*/
|
||||
struct kref malloc_kref;
|
||||
|
||||
u8 rad[8];
|
||||
u8 lct;
|
||||
int num_ports;
|
||||
@@ -387,8 +408,6 @@ struct drm_dp_mst_topology_cbs {
|
||||
void (*register_connector)(struct drm_connector *connector);
|
||||
void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_connector *connector);
|
||||
void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);
|
||||
|
||||
};
|
||||
|
||||
#define DP_MAX_PAYLOAD (sizeof(unsigned long) * 8)
|
||||
@@ -406,9 +425,15 @@ struct drm_dp_payload {
|
||||
|
||||
#define to_dp_mst_topology_state(x) container_of(x, struct drm_dp_mst_topology_state, base)
|
||||
|
||||
struct drm_dp_vcpi_allocation {
|
||||
struct drm_dp_mst_port *port;
|
||||
int vcpi;
|
||||
struct list_head next;
|
||||
};
|
||||
|
||||
struct drm_dp_mst_topology_state {
|
||||
struct drm_private_state base;
|
||||
int avail_slots;
|
||||
struct list_head vcpis;
|
||||
struct drm_dp_mst_topology_mgr *mgr;
|
||||
};
|
||||
|
||||
@@ -620,13 +645,115 @@ int __must_check
|
||||
drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);
|
||||
struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr *mgr);
|
||||
int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_mst_port *port, int pbn);
|
||||
int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr *mgr,
|
||||
int slots);
|
||||
int __must_check
|
||||
drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_mst_port *port, int pbn);
|
||||
int __must_check
|
||||
drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_mst_port *port);
|
||||
int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_mst_port *port, bool power_up);
|
||||
int __must_check drm_dp_mst_atomic_check(struct drm_atomic_state *state);
|
||||
|
||||
void drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port);
|
||||
void drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port);
|
||||
|
||||
extern const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs;
|
||||
|
||||
/**
|
||||
* __drm_dp_mst_state_iter_get - private atomic state iterator function for
|
||||
* macro-internal use
|
||||
* @state: &struct drm_atomic_state pointer
|
||||
* @mgr: pointer to the &struct drm_dp_mst_topology_mgr iteration cursor
|
||||
* @old_state: optional pointer to the old &struct drm_dp_mst_topology_state
|
||||
* iteration cursor
|
||||
* @new_state: optional pointer to the new &struct drm_dp_mst_topology_state
|
||||
* iteration cursor
|
||||
* @i: int iteration cursor, for macro-internal use
|
||||
*
|
||||
* Used by for_each_oldnew_mst_mgr_in_state(),
|
||||
* for_each_old_mst_mgr_in_state(), and for_each_new_mst_mgr_in_state(). Don't
|
||||
* call this directly.
|
||||
*
|
||||
* Returns:
|
||||
* True if the current &struct drm_private_obj is a &struct
|
||||
* drm_dp_mst_topology_mgr, false otherwise.
|
||||
*/
|
||||
static inline bool
|
||||
__drm_dp_mst_state_iter_get(struct drm_atomic_state *state,
|
||||
struct drm_dp_mst_topology_mgr **mgr,
|
||||
struct drm_dp_mst_topology_state **old_state,
|
||||
struct drm_dp_mst_topology_state **new_state,
|
||||
int i)
|
||||
{
|
||||
struct __drm_private_objs_state *objs_state = &state->private_objs[i];
|
||||
|
||||
if (objs_state->ptr->funcs != &drm_dp_mst_topology_state_funcs)
|
||||
return false;
|
||||
|
||||
*mgr = to_dp_mst_topology_mgr(objs_state->ptr);
|
||||
if (old_state)
|
||||
*old_state = to_dp_mst_topology_state(objs_state->old_state);
|
||||
if (new_state)
|
||||
*new_state = to_dp_mst_topology_state(objs_state->new_state);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* for_each_oldnew_mst_mgr_in_state - iterate over all DP MST topology
|
||||
* managers in an atomic update
|
||||
* @__state: &struct drm_atomic_state pointer
|
||||
* @mgr: &struct drm_dp_mst_topology_mgr iteration cursor
|
||||
* @old_state: &struct drm_dp_mst_topology_state iteration cursor for the old
|
||||
* state
|
||||
* @new_state: &struct drm_dp_mst_topology_state iteration cursor for the new
|
||||
* state
|
||||
* @__i: int iteration cursor, for macro-internal use
|
||||
*
|
||||
* This iterates over all DRM DP MST topology managers in an atomic update,
|
||||
* tracking both old and new state. This is useful in places where the state
|
||||
* delta needs to be considered, for example in atomic check functions.
|
||||
*/
|
||||
#define for_each_oldnew_mst_mgr_in_state(__state, mgr, old_state, new_state, __i) \
|
||||
for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \
|
||||
for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), &(old_state), &(new_state), (__i)))
|
||||
|
||||
/**
|
||||
* for_each_old_mst_mgr_in_state - iterate over all DP MST topology managers
|
||||
* in an atomic update
|
||||
* @__state: &struct drm_atomic_state pointer
|
||||
* @mgr: &struct drm_dp_mst_topology_mgr iteration cursor
|
||||
* @old_state: &struct drm_dp_mst_topology_state iteration cursor for the old
|
||||
* state
|
||||
* @__i: int iteration cursor, for macro-internal use
|
||||
*
|
||||
* This iterates over all DRM DP MST topology managers in an atomic update,
|
||||
* tracking only the old state. This is useful in disable functions, where we
|
||||
* need the old state the hardware is still in.
|
||||
*/
|
||||
#define for_each_old_mst_mgr_in_state(__state, mgr, old_state, __i) \
|
||||
for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \
|
||||
for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), &(old_state), NULL, (__i)))
|
||||
|
||||
/**
|
||||
* for_each_new_mst_mgr_in_state - iterate over all DP MST topology managers
|
||||
* in an atomic update
|
||||
* @__state: &struct drm_atomic_state pointer
|
||||
* @mgr: &struct drm_dp_mst_topology_mgr iteration cursor
|
||||
* @new_state: &struct drm_dp_mst_topology_state iteration cursor for the new
|
||||
* state
|
||||
* @__i: int iteration cursor, for macro-internal use
|
||||
*
|
||||
* This iterates over all DRM DP MST topology managers in an atomic update,
|
||||
* tracking only the new state. This is useful in enable functions, where we
|
||||
* need the new state the hardware should be in when the atomic commit
|
||||
* operation has completed.
|
||||
*/
|
||||
#define for_each_new_mst_mgr_in_state(__state, mgr, new_state, __i) \
|
||||
for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \
|
||||
for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), NULL, &(new_state), (__i)))
|
||||
|
||||
#endif
|
||||
|
@@ -41,21 +41,113 @@ struct drm_display_mode;
|
||||
struct drm_mode_create_dumb;
|
||||
struct drm_printer;
|
||||
|
||||
/* driver capabilities and requirements mask */
|
||||
#define DRIVER_USE_AGP 0x1
|
||||
#define DRIVER_LEGACY 0x2
|
||||
#define DRIVER_PCI_DMA 0x8
|
||||
#define DRIVER_SG 0x10
|
||||
#define DRIVER_HAVE_DMA 0x20
|
||||
#define DRIVER_HAVE_IRQ 0x40
|
||||
#define DRIVER_IRQ_SHARED 0x80
|
||||
#define DRIVER_GEM 0x1000
|
||||
#define DRIVER_MODESET 0x2000
|
||||
#define DRIVER_PRIME 0x4000
|
||||
#define DRIVER_RENDER 0x8000
|
||||
#define DRIVER_ATOMIC 0x10000
|
||||
#define DRIVER_KMS_LEGACY_CONTEXT 0x20000
|
||||
#define DRIVER_SYNCOBJ 0x40000
|
||||
/**
|
||||
* enum drm_driver_feature - feature flags
|
||||
*
|
||||
* See &drm_driver.driver_features, drm_device.driver_features and
|
||||
* drm_core_check_feature().
|
||||
*/
|
||||
enum drm_driver_feature {
|
||||
/**
|
||||
* @DRIVER_GEM:
|
||||
*
|
||||
* Driver use the GEM memory manager. This should be set for all modern
|
||||
* drivers.
|
||||
*/
|
||||
DRIVER_GEM = BIT(0),
|
||||
/**
|
||||
* @DRIVER_MODESET:
|
||||
*
|
||||
* Driver supports mode setting interfaces (KMS).
|
||||
*/
|
||||
DRIVER_MODESET = BIT(1),
|
||||
/**
|
||||
* @DRIVER_PRIME:
|
||||
*
|
||||
* Driver implements DRM PRIME buffer sharing.
|
||||
*/
|
||||
DRIVER_PRIME = BIT(2),
|
||||
/**
|
||||
* @DRIVER_RENDER:
|
||||
*
|
||||
* Driver supports dedicated render nodes. See also the :ref:`section on
|
||||
* render nodes <drm_render_node>` for details.
|
||||
*/
|
||||
DRIVER_RENDER = BIT(3),
|
||||
/**
|
||||
* @DRIVER_ATOMIC:
|
||||
*
|
||||
* Driver supports the full atomic modesetting userspace API. Drivers
|
||||
* which only use atomic internally, but do not the support the full
|
||||
* userspace API (e.g. not all properties converted to atomic, or
|
||||
* multi-plane updates are not guaranteed to be tear-free) should not
|
||||
* set this flag.
|
||||
*/
|
||||
DRIVER_ATOMIC = BIT(4),
|
||||
/**
|
||||
* @DRIVER_SYNCOBJ:
|
||||
*
|
||||
* Driver supports &drm_syncobj for explicit synchronization of command
|
||||
* submission.
|
||||
*/
|
||||
DRIVER_SYNCOBJ = BIT(5),
|
||||
|
||||
/* IMPORTANT: Below are all the legacy flags, add new ones above. */
|
||||
|
||||
/**
|
||||
* @DRIVER_USE_AGP:
|
||||
*
|
||||
* Set up DRM AGP support, see drm_agp_init(), the DRM core will manage
|
||||
* AGP resources. New drivers don't need this.
|
||||
*/
|
||||
DRIVER_USE_AGP = BIT(25),
|
||||
/**
|
||||
* @DRIVER_LEGACY:
|
||||
*
|
||||
* Denote a legacy driver using shadow attach. Do not use.
|
||||
*/
|
||||
DRIVER_LEGACY = BIT(26),
|
||||
/**
|
||||
* @DRIVER_PCI_DMA:
|
||||
*
|
||||
* Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace
|
||||
* will be enabled. Only for legacy drivers. Do not use.
|
||||
*/
|
||||
DRIVER_PCI_DMA = BIT(27),
|
||||
/**
|
||||
* @DRIVER_SG:
|
||||
*
|
||||
* Driver can perform scatter/gather DMA, allocation and mapping of
|
||||
* scatter/gather buffers will be enabled. Only for legacy drivers. Do
|
||||
* not use.
|
||||
*/
|
||||
DRIVER_SG = BIT(28),
|
||||
|
||||
/**
|
||||
* @DRIVER_HAVE_DMA:
|
||||
*
|
||||
* Driver supports DMA, the userspace DMA API will be supported. Only
|
||||
* for legacy drivers. Do not use.
|
||||
*/
|
||||
DRIVER_HAVE_DMA = BIT(29),
|
||||
/**
|
||||
* @DRIVER_HAVE_IRQ:
|
||||
*
|
||||
* Legacy irq support. Only for legacy drivers. Do not use.
|
||||
*
|
||||
* New drivers can either use the drm_irq_install() and
|
||||
* drm_irq_uninstall() helper functions, or roll their own irq support
|
||||
* code by calling request_irq() directly.
|
||||
*/
|
||||
DRIVER_HAVE_IRQ = BIT(30),
|
||||
/**
|
||||
* @DRIVER_KMS_LEGACY_CONTEXT:
|
||||
*
|
||||
* Used only by nouveau for backwards compatibility with existing
|
||||
* userspace. Do not use.
|
||||
*/
|
||||
DRIVER_KMS_LEGACY_CONTEXT = BIT(31),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_driver - DRM driver structure
|
||||
@@ -579,7 +671,12 @@ struct drm_driver {
|
||||
/** @date: driver date */
|
||||
char *date;
|
||||
|
||||
/** @driver_features: driver features */
|
||||
/**
|
||||
* @driver_features:
|
||||
* Driver features, see &enum drm_driver_feature. Drivers can disable
|
||||
* some features on a per-instance basis using
|
||||
* &drm_device.driver_features.
|
||||
*/
|
||||
u32 driver_features;
|
||||
|
||||
/**
|
||||
@@ -643,6 +740,10 @@ void drm_dev_unplug(struct drm_device *dev);
|
||||
* Unplugging itself is singalled through drm_dev_unplug(). If a device is
|
||||
* unplugged, these two functions guarantee that any store before calling
|
||||
* drm_dev_unplug() is visible to callers of this function after it completes
|
||||
*
|
||||
* WARNING: This function fundamentally races against drm_dev_unplug(). It is
|
||||
* recommended that drivers instead use the underlying drm_dev_enter() and
|
||||
* drm_dev_exit() function pairs.
|
||||
*/
|
||||
static inline bool drm_dev_is_unplugged(struct drm_device *dev)
|
||||
{
|
||||
@@ -662,11 +763,11 @@ static inline bool drm_dev_is_unplugged(struct drm_device *dev)
|
||||
* @feature: feature flag
|
||||
*
|
||||
* This checks @dev for driver features, see &drm_driver.driver_features,
|
||||
* &drm_device.driver_features, and the various DRIVER_\* flags.
|
||||
* &drm_device.driver_features, and the various &enum drm_driver_feature flags.
|
||||
*
|
||||
* Returns true if the @feature is supported, false otherwise.
|
||||
*/
|
||||
static inline bool drm_core_check_feature(struct drm_device *dev, u32 feature)
|
||||
static inline bool drm_core_check_feature(const struct drm_device *dev, u32 feature)
|
||||
{
|
||||
return dev->driver->driver_features & dev->driver_features & feature;
|
||||
}
|
||||
|
@@ -44,111 +44,231 @@
|
||||
#define DSC_1_2_MAX_LINEBUF_DEPTH_VAL 0
|
||||
#define DSC_1_1_MAX_LINEBUF_DEPTH_BITS 13
|
||||
|
||||
/* Configuration for a single Rate Control model range */
|
||||
/**
|
||||
* struct drm_dsc_rc_range_parameters - DSC Rate Control range parameters
|
||||
*
|
||||
* This defines different rate control parameters used by the DSC engine
|
||||
* to compress the frame.
|
||||
*/
|
||||
struct drm_dsc_rc_range_parameters {
|
||||
/* Min Quantization Parameters allowed for this range */
|
||||
/**
|
||||
* @range_min_qp: Min Quantization Parameters allowed for this range
|
||||
*/
|
||||
u8 range_min_qp;
|
||||
/* Max Quantization Parameters allowed for this range */
|
||||
/**
|
||||
* @range_max_qp: Max Quantization Parameters allowed for this range
|
||||
*/
|
||||
u8 range_max_qp;
|
||||
/* Bits/group offset to apply to target for this group */
|
||||
/**
|
||||
* @range_bpg_offset:
|
||||
* Bits/group offset to apply to target for this group
|
||||
*/
|
||||
u8 range_bpg_offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_dsc_config - Parameters required to configure DSC
|
||||
*
|
||||
* Driver populates this structure with all the parameters required
|
||||
* to configure the display stream compression on the source.
|
||||
*/
|
||||
struct drm_dsc_config {
|
||||
/* Bits / component for previous reconstructed line buffer */
|
||||
/**
|
||||
* @line_buf_depth:
|
||||
* Bits per component for previous reconstructed line buffer
|
||||
*/
|
||||
u8 line_buf_depth;
|
||||
/* Bits per component to code (must be 8, 10, or 12) */
|
||||
/**
|
||||
* @bits_per_component: Bits per component to code (8/10/12)
|
||||
*/
|
||||
u8 bits_per_component;
|
||||
/*
|
||||
* Flag indicating to do RGB - YCoCg conversion
|
||||
* and back (should be 1 for RGB input)
|
||||
/**
|
||||
* @convert_rgb:
|
||||
* Flag to indicate if RGB - YCoCg conversion is needed
|
||||
* True if RGB input, False if YCoCg input
|
||||
*/
|
||||
bool convert_rgb;
|
||||
/**
|
||||
* @slice_count: Number fo slices per line used by the DSC encoder
|
||||
*/
|
||||
u8 slice_count;
|
||||
/* Slice Width */
|
||||
/**
|
||||
* @slice_width: Width of each slice in pixels
|
||||
*/
|
||||
u16 slice_width;
|
||||
/* Slice Height */
|
||||
/**
|
||||
* @slice_height: Slice height in pixels
|
||||
*/
|
||||
u16 slice_height;
|
||||
/*
|
||||
* 4:2:2 enable mode (from PPS, 4:2:2 conversion happens
|
||||
* outside of DSC encode/decode algorithm)
|
||||
/**
|
||||
* @enable422: True for 4_2_2 sampling, false for 4_4_4 sampling
|
||||
*/
|
||||
bool enable422;
|
||||
/* Picture Width */
|
||||
/**
|
||||
* @pic_width: Width of the input display frame in pixels
|
||||
*/
|
||||
u16 pic_width;
|
||||
/* Picture Height */
|
||||
/**
|
||||
* @pic_height: Vertical height of the input display frame
|
||||
*/
|
||||
u16 pic_height;
|
||||
/* Offset to bits/group used by RC to determine QP adjustment */
|
||||
/**
|
||||
* @rc_tgt_offset_high:
|
||||
* Offset to bits/group used by RC to determine QP adjustment
|
||||
*/
|
||||
u8 rc_tgt_offset_high;
|
||||
/* Offset to bits/group used by RC to determine QP adjustment */
|
||||
/**
|
||||
* @rc_tgt_offset_low:
|
||||
* Offset to bits/group used by RC to determine QP adjustment
|
||||
*/
|
||||
u8 rc_tgt_offset_low;
|
||||
/* Bits/pixel target << 4 (ie., 4 fractional bits) */
|
||||
/**
|
||||
* @bits_per_pixel:
|
||||
* Target bits per pixel with 4 fractional bits, bits_per_pixel << 4
|
||||
*/
|
||||
u16 bits_per_pixel;
|
||||
/*
|
||||
* Factor to determine if an edge is present based
|
||||
* on the bits produced
|
||||
/**
|
||||
* @rc_edge_factor:
|
||||
* Factor to determine if an edge is present based on the bits produced
|
||||
*/
|
||||
u8 rc_edge_factor;
|
||||
/* Slow down incrementing once the range reaches this value */
|
||||
/**
|
||||
* @rc_quant_incr_limit1:
|
||||
* Slow down incrementing once the range reaches this value
|
||||
*/
|
||||
u8 rc_quant_incr_limit1;
|
||||
/* Slow down incrementing once the range reaches this value */
|
||||
/**
|
||||
* @rc_quant_incr_limit0:
|
||||
* Slow down incrementing once the range reaches this value
|
||||
*/
|
||||
u8 rc_quant_incr_limit0;
|
||||
/* Number of pixels to delay the initial transmission */
|
||||
/**
|
||||
* @initial_xmit_delay:
|
||||
* Number of pixels to delay the initial transmission
|
||||
*/
|
||||
u16 initial_xmit_delay;
|
||||
/* Number of pixels to delay the VLD on the decoder,not including SSM */
|
||||
/**
|
||||
* @initial_dec_delay:
|
||||
* Initial decoder delay, number of pixel times that the decoder
|
||||
* accumulates data in its rate buffer before starting to decode
|
||||
* and output pixels.
|
||||
*/
|
||||
u16 initial_dec_delay;
|
||||
/* Block prediction enable */
|
||||
/**
|
||||
* @block_pred_enable:
|
||||
* True if block prediction is used to code any groups within the
|
||||
* picture. False if BP not used
|
||||
*/
|
||||
bool block_pred_enable;
|
||||
/* Bits/group offset to use for first line of the slice */
|
||||
/**
|
||||
* @first_line_bpg_offset:
|
||||
* Number of additional bits allocated for each group on the first
|
||||
* line of slice.
|
||||
*/
|
||||
u8 first_line_bpg_offset;
|
||||
/* Value to use for RC model offset at slice start */
|
||||
/**
|
||||
* @initial_offset: Value to use for RC model offset at slice start
|
||||
*/
|
||||
u16 initial_offset;
|
||||
/* Thresholds defining each of the buffer ranges */
|
||||
/**
|
||||
* @rc_buf_thresh: Thresholds defining each of the buffer ranges
|
||||
*/
|
||||
u16 rc_buf_thresh[DSC_NUM_BUF_RANGES - 1];
|
||||
/* Parameters for each of the RC ranges */
|
||||
/**
|
||||
* @rc_range_params:
|
||||
* Parameters for each of the RC ranges defined in
|
||||
* &struct drm_dsc_rc_range_parameters
|
||||
*/
|
||||
struct drm_dsc_rc_range_parameters rc_range_params[DSC_NUM_BUF_RANGES];
|
||||
/* Total size of RC model */
|
||||
/**
|
||||
* @rc_model_size: Total size of RC model
|
||||
*/
|
||||
u16 rc_model_size;
|
||||
/* Minimum QP where flatness information is sent */
|
||||
/**
|
||||
* @flatness_min_qp: Minimum QP where flatness information is sent
|
||||
*/
|
||||
u8 flatness_min_qp;
|
||||
/* Maximum QP where flatness information is sent */
|
||||
/**
|
||||
* @flatness_max_qp: Maximum QP where flatness information is sent
|
||||
*/
|
||||
u8 flatness_max_qp;
|
||||
/* Initial value for scale factor */
|
||||
/**
|
||||
* @initial_scale_value: Initial value for the scale factor
|
||||
*/
|
||||
u8 initial_scale_value;
|
||||
/* Decrement scale factor every scale_decrement_interval groups */
|
||||
/**
|
||||
* @scale_decrement_interval:
|
||||
* Specifies number of group times between decrementing the scale factor
|
||||
* at beginning of a slice.
|
||||
*/
|
||||
u16 scale_decrement_interval;
|
||||
/* Increment scale factor every scale_increment_interval groups */
|
||||
/**
|
||||
* @scale_increment_interval:
|
||||
* Number of group times between incrementing the scale factor value
|
||||
* used at the beginning of a slice.
|
||||
*/
|
||||
u16 scale_increment_interval;
|
||||
/* Non-first line BPG offset to use */
|
||||
/**
|
||||
* @nfl_bpg_offset: Non first line BPG offset to be used
|
||||
*/
|
||||
u16 nfl_bpg_offset;
|
||||
/* BPG offset used to enforce slice bit */
|
||||
/**
|
||||
* @slice_bpg_offset: BPG offset used to enforce slice bit
|
||||
*/
|
||||
u16 slice_bpg_offset;
|
||||
/* Final RC linear transformation offset value */
|
||||
/**
|
||||
* @final_offset: Final RC linear transformation offset value
|
||||
*/
|
||||
u16 final_offset;
|
||||
/* Enable on-off VBR (ie., disable stuffing bits) */
|
||||
/**
|
||||
* @vbr_enable: True if VBR mode is enabled, false if disabled
|
||||
*/
|
||||
bool vbr_enable;
|
||||
/* Mux word size (in bits) for SSM mode */
|
||||
/**
|
||||
* @mux_word_size: Mux word size (in bits) for SSM mode
|
||||
*/
|
||||
u8 mux_word_size;
|
||||
/*
|
||||
* The (max) size in bytes of the "chunks" that are
|
||||
* used in slice multiplexing
|
||||
/**
|
||||
* @slice_chunk_size:
|
||||
* The (max) size in bytes of the "chunks" that are used in slice
|
||||
* multiplexing.
|
||||
*/
|
||||
u16 slice_chunk_size;
|
||||
/* Rate Control buffer siz in bits */
|
||||
/**
|
||||
* @rc_bits: Rate control buffer size in bits
|
||||
*/
|
||||
u16 rc_bits;
|
||||
/* DSC Minor Version */
|
||||
/**
|
||||
* @dsc_version_minor: DSC minor version
|
||||
*/
|
||||
u8 dsc_version_minor;
|
||||
/* DSC Major version */
|
||||
/**
|
||||
* @dsc_version_major: DSC major version
|
||||
*/
|
||||
u8 dsc_version_major;
|
||||
/* Native 4:2:2 support */
|
||||
/**
|
||||
* @native_422: True if Native 4:2:2 supported, else false
|
||||
*/
|
||||
bool native_422;
|
||||
/* Native 4:2:0 support */
|
||||
/**
|
||||
* @native_420: True if Native 4:2:0 supported else false.
|
||||
*/
|
||||
bool native_420;
|
||||
/* Additional bits/grp for seconnd line of slice for native 4:2:0 */
|
||||
/**
|
||||
* @second_line_bpg_offset:
|
||||
* Additional bits/grp for seconnd line of slice for native 4:2:0
|
||||
*/
|
||||
u8 second_line_bpg_offset;
|
||||
/* Num of bits deallocated for each grp that is not in second line of slice */
|
||||
/**
|
||||
* @nsl_bpg_offset:
|
||||
* Num of bits deallocated for each grp that is not in second line of
|
||||
* slice
|
||||
*/
|
||||
u16 nsl_bpg_offset;
|
||||
/* Offset adj fr second line in Native 4:2:0 mode */
|
||||
/**
|
||||
* @second_line_offset_adj:
|
||||
* Offset adjustment for second line in Native 4:2:0 mode
|
||||
*/
|
||||
u16 second_line_offset_adj;
|
||||
};
|
||||
|
||||
@@ -468,10 +588,13 @@ struct drm_dsc_picture_parameter_set {
|
||||
* This structure represents the DSC PPS infoframe required to send the Picture
|
||||
* Parameter Set metadata required before enabling VESA Display Stream
|
||||
* Compression. This is based on the DP Secondary Data Packet structure and
|
||||
* comprises of SDP Header as defined in drm_dp_helper.h and PPS payload.
|
||||
* comprises of SDP Header as defined &struct struct dp_sdp_header in drm_dp_helper.h
|
||||
* and PPS payload defined in &struct drm_dsc_picture_parameter_set.
|
||||
*
|
||||
* @pps_header: Header for PPS as per DP SDP header format
|
||||
* @pps_header: Header for PPS as per DP SDP header format of type
|
||||
* &struct dp_sdp_header
|
||||
* @pps_payload: PPS payload fields as per DSC specification Table 4-1
|
||||
* as represented in &struct drm_dsc_picture_parameter_set
|
||||
*/
|
||||
struct drm_dsc_pps_infoframe {
|
||||
struct dp_sdp_header pps_header;
|
||||
|
@@ -352,18 +352,17 @@ drm_load_edid_firmware(struct drm_connector *connector)
|
||||
|
||||
int
|
||||
drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
||||
const struct drm_display_mode *mode,
|
||||
bool is_hdmi2_sink);
|
||||
struct drm_connector *connector,
|
||||
const struct drm_display_mode *mode);
|
||||
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,
|
||||
struct drm_connector *connector,
|
||||
const struct drm_display_mode *mode,
|
||||
enum hdmi_quantization_range rgb_quant_range,
|
||||
bool rgb_quant_range_selectable,
|
||||
bool is_hdmi2_sink);
|
||||
enum hdmi_quantization_range rgb_quant_range);
|
||||
|
||||
/**
|
||||
* drm_eld_mnl - Get ELD monitor name length in bytes.
|
||||
@@ -471,7 +470,6 @@ u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
|
||||
enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
|
||||
bool drm_detect_hdmi_monitor(struct edid *edid);
|
||||
bool drm_detect_monitor_audio(struct edid *edid);
|
||||
bool drm_rgb_quant_range_selectable(struct edid *edid);
|
||||
enum hdmi_quantization_range
|
||||
drm_default_rgb_quant_range(const struct drm_display_mode *mode);
|
||||
int drm_add_modes_noedid(struct drm_connector *connector,
|
||||
|
@@ -27,7 +27,6 @@
|
||||
#ifndef __DRM_ENCODER_SLAVE_H__
|
||||
#define __DRM_ENCODER_SLAVE_H__
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_encoder.h>
|
||||
|
||||
|
@@ -2,31 +2,9 @@
|
||||
#ifndef __DRM_FB_CMA_HELPER_H__
|
||||
#define __DRM_FB_CMA_HELPER_H__
|
||||
|
||||
struct drm_fbdev_cma;
|
||||
struct drm_gem_cma_object;
|
||||
|
||||
struct drm_fb_helper_surface_size;
|
||||
struct drm_framebuffer_funcs;
|
||||
struct drm_fb_helper_funcs;
|
||||
struct drm_framebuffer;
|
||||
struct drm_fb_helper;
|
||||
struct drm_device;
|
||||
struct drm_file;
|
||||
struct drm_mode_fb_cmd2;
|
||||
struct drm_plane;
|
||||
struct drm_plane_state;
|
||||
|
||||
int drm_fb_cma_fbdev_init(struct drm_device *dev, unsigned int preferred_bpp,
|
||||
unsigned int max_conn_count);
|
||||
void drm_fb_cma_fbdev_fini(struct drm_device *dev);
|
||||
|
||||
struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
|
||||
unsigned int preferred_bpp, unsigned int max_conn_count);
|
||||
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);
|
||||
|
||||
struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
|
||||
unsigned int plane);
|
||||
|
||||
|
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/idr.h>
|
||||
|
||||
#include <uapi/drm/drm.h>
|
||||
|
||||
|
@@ -143,6 +143,123 @@ struct drm_format_name_buf {
|
||||
char str[32];
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_packed - check that the format info matches a YUV
|
||||
* format with data laid in a single plane
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a packed YUV format.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_packed(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->num_planes == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_semiplanar - check that the format info matches a YUV
|
||||
* format with data laid in two planes (luminance and chrominance)
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a semiplanar YUV format.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_semiplanar(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->num_planes == 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_planar - check that the format info matches a YUV
|
||||
* format with data laid in three planes (one for each YUV component)
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a planar YUV format.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_planar(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->num_planes == 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_sampling_410 - check that the format info matches a
|
||||
* YUV format with 4:1:0 sub-sampling
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a YUV format with 4:1:0
|
||||
* sub-sampling.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_sampling_410(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->hsub == 4 && info->vsub == 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_sampling_411 - check that the format info matches a
|
||||
* YUV format with 4:1:1 sub-sampling
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a YUV format with 4:1:1
|
||||
* sub-sampling.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_sampling_411(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->hsub == 4 && info->vsub == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_sampling_420 - check that the format info matches a
|
||||
* YUV format with 4:2:0 sub-sampling
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a YUV format with 4:2:0
|
||||
* sub-sampling.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_sampling_420(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->hsub == 2 && info->vsub == 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_sampling_422 - check that the format info matches a
|
||||
* YUV format with 4:2:2 sub-sampling
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a YUV format with 4:2:2
|
||||
* sub-sampling.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_sampling_422(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->hsub == 2 && info->vsub == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_is_yuv_sampling_444 - check that the format info matches a
|
||||
* YUV format with 4:4:4 sub-sampling
|
||||
* @info: format info
|
||||
*
|
||||
* Returns:
|
||||
* A boolean indicating whether the format info matches a YUV format with 4:4:4
|
||||
* sub-sampling.
|
||||
*/
|
||||
static inline bool
|
||||
drm_format_info_is_yuv_sampling_444(const struct drm_format_info *info)
|
||||
{
|
||||
return info->is_yuv && info->hsub == 1 && info->vsub == 1;
|
||||
}
|
||||
|
||||
const struct drm_format_info *__drm_format_info(u32 format);
|
||||
const struct drm_format_info *drm_format_info(u32 format);
|
||||
const struct drm_format_info *
|
||||
|
@@ -23,13 +23,17 @@
|
||||
#ifndef __DRM_FRAMEBUFFER_H__
|
||||
#define __DRM_FRAMEBUFFER_H__
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <drm/drm_mode_object.h>
|
||||
|
||||
struct drm_framebuffer;
|
||||
struct drm_file;
|
||||
struct drm_clip_rect;
|
||||
struct drm_device;
|
||||
struct drm_file;
|
||||
struct drm_framebuffer;
|
||||
struct drm_gem_object;
|
||||
|
||||
/**
|
||||
* struct drm_framebuffer_funcs - framebuffer hooks
|
||||
|
@@ -2,9 +2,12 @@
|
||||
#ifndef __DRM_GEM_CMA_HELPER_H__
|
||||
#define __DRM_GEM_CMA_HELPER_H__
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_ioctl.h>
|
||||
#include <drm/drm_gem.h>
|
||||
|
||||
struct drm_mode_create_dumb;
|
||||
|
||||
/**
|
||||
* struct drm_gem_cma_object - GEM object backed by CMA memory allocations
|
||||
* @base: base GEM object
|
||||
|
@@ -25,6 +25,9 @@ drm_gem_fb_create_with_funcs(struct drm_device *dev, struct drm_file *file,
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
int drm_gem_fb_prepare_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
|
@@ -9,6 +9,8 @@
|
||||
#ifndef _DRM_HDCP_H_INCLUDED_
|
||||
#define _DRM_HDCP_H_INCLUDED_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Period of hdcp checks (to ensure we're still authenticated) */
|
||||
#define DRM_HDCP_CHECK_PERIOD_MS (128 * 16)
|
||||
|
||||
|
@@ -2,6 +2,9 @@
|
||||
#define __DRM_DRM_LEGACY_H__
|
||||
|
||||
#include <drm/drm_auth.h>
|
||||
#include <drm/drm_hashtab.h>
|
||||
|
||||
struct drm_device;
|
||||
|
||||
/*
|
||||
* Legacy driver interfaces for the Direct Rendering Manager
|
||||
@@ -156,6 +159,7 @@ struct drm_map_list {
|
||||
int drm_legacy_addmap(struct drm_device *d, resource_size_t offset,
|
||||
unsigned int size, enum drm_map_type type,
|
||||
enum drm_map_flags flags, struct drm_local_map **map_p);
|
||||
struct drm_local_map *drm_legacy_findmap(struct drm_device *dev, unsigned int token);
|
||||
void drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
|
||||
int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
|
||||
void drm_legacy_master_rmmaps(struct drm_device *dev,
|
||||
@@ -194,14 +198,4 @@ void drm_legacy_ioremap(struct drm_local_map *map, struct drm_device *dev);
|
||||
void drm_legacy_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
|
||||
void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
|
||||
|
||||
static inline struct drm_local_map *drm_legacy_findmap(struct drm_device *dev,
|
||||
unsigned int token)
|
||||
{
|
||||
struct drm_map_list *_entry;
|
||||
list_for_each_entry(_entry, &dev->maplist, head)
|
||||
if (_entry->user_token == token)
|
||||
return _entry->map;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* __DRM_DRM_LEGACY_H__ */
|
||||
|
@@ -361,7 +361,7 @@ struct drm_mode_config {
|
||||
*
|
||||
* This is the big scary modeset BKL which protects everything that
|
||||
* isn't protect otherwise. Scope is unclear and fuzzy, try to remove
|
||||
* anything from under it's protection and move it into more well-scoped
|
||||
* anything from under its protection and move it into more well-scoped
|
||||
* locks.
|
||||
*
|
||||
* The one important thing this protects is the use of @acquire_ctx.
|
||||
@@ -391,18 +391,18 @@ struct drm_mode_config {
|
||||
/**
|
||||
* @idr_mutex:
|
||||
*
|
||||
* Mutex for KMS ID allocation and management. Protects both @crtc_idr
|
||||
* Mutex for KMS ID allocation and management. Protects both @object_idr
|
||||
* and @tile_idr.
|
||||
*/
|
||||
struct mutex idr_mutex;
|
||||
|
||||
/**
|
||||
* @crtc_idr:
|
||||
* @object_idr:
|
||||
*
|
||||
* Main KMS ID tracking object. Use this idr for all IDs, fb, crtc,
|
||||
* connector, modes - just makes life easier to have only one.
|
||||
*/
|
||||
struct idr crtc_idr;
|
||||
struct idr object_idr;
|
||||
|
||||
/**
|
||||
* @tile_idr:
|
||||
@@ -512,6 +512,15 @@ struct drm_mode_config {
|
||||
*/
|
||||
struct list_head property_list;
|
||||
|
||||
/**
|
||||
* @privobj_list:
|
||||
*
|
||||
* List of private objects linked with &drm_private_obj.head. This is
|
||||
* invariant over the lifetime of a device and hence doesn't need any
|
||||
* locks.
|
||||
*/
|
||||
struct list_head privobj_list;
|
||||
|
||||
int min_width, min_height;
|
||||
int max_width, max_height;
|
||||
const struct drm_mode_config_funcs *funcs;
|
||||
@@ -688,22 +697,22 @@ struct drm_mode_config {
|
||||
struct drm_property *tv_mode_property;
|
||||
/**
|
||||
* @tv_left_margin_property: Optional TV property to set the left
|
||||
* margin.
|
||||
* margin (expressed in pixels).
|
||||
*/
|
||||
struct drm_property *tv_left_margin_property;
|
||||
/**
|
||||
* @tv_right_margin_property: Optional TV property to set the right
|
||||
* margin.
|
||||
* margin (expressed in pixels).
|
||||
*/
|
||||
struct drm_property *tv_right_margin_property;
|
||||
/**
|
||||
* @tv_top_margin_property: Optional TV property to set the right
|
||||
* margin.
|
||||
* margin (expressed in pixels).
|
||||
*/
|
||||
struct drm_property *tv_top_margin_property;
|
||||
/**
|
||||
* @tv_bottom_margin_property: Optional TV property to set the right
|
||||
* margin.
|
||||
* margin (expressed in pixels).
|
||||
*/
|
||||
struct drm_property *tv_bottom_margin_property;
|
||||
/**
|
||||
|
@@ -136,8 +136,7 @@ enum drm_mode_status {
|
||||
.hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
|
||||
.htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
|
||||
.vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
|
||||
.vscan = (vs), .flags = (f), \
|
||||
.base.type = DRM_MODE_OBJECT_MODE
|
||||
.vscan = (vs), .flags = (f)
|
||||
|
||||
#define CRTC_INTERLACE_HALVE_V (1 << 0) /* halve V values for interlacing */
|
||||
#define CRTC_STEREO_DOUBLE (1 << 1) /* adjust timings for stereo modes */
|
||||
@@ -213,20 +212,6 @@ struct drm_display_mode {
|
||||
*/
|
||||
struct list_head head;
|
||||
|
||||
/**
|
||||
* @base:
|
||||
*
|
||||
* A display mode is a normal modeset object, possibly including public
|
||||
* userspace id.
|
||||
*
|
||||
* FIXME:
|
||||
*
|
||||
* This can probably be removed since the entire concept of userspace
|
||||
* managing modes explicitly has never landed in upstream kernel mode
|
||||
* setting support.
|
||||
*/
|
||||
struct drm_mode_object base;
|
||||
|
||||
/**
|
||||
* @name:
|
||||
*
|
||||
@@ -429,14 +414,14 @@ struct drm_display_mode {
|
||||
/**
|
||||
* DRM_MODE_FMT - printf string for &struct drm_display_mode
|
||||
*/
|
||||
#define DRM_MODE_FMT "%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x"
|
||||
#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x"
|
||||
|
||||
/**
|
||||
* DRM_MODE_ARG - printf arguments for &struct drm_display_mode
|
||||
* @m: display mode
|
||||
*/
|
||||
#define DRM_MODE_ARG(m) \
|
||||
(m)->base.id, (m)->name, (m)->vrefresh, (m)->clock, \
|
||||
(m)->name, (m)->vrefresh, (m)->clock, \
|
||||
(m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
|
||||
(m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
|
||||
(m)->type, (m)->flags
|
||||
|
@@ -23,7 +23,11 @@
|
||||
#ifndef __DRM_KMS_HELPER_H__
|
||||
#define __DRM_KMS_HELPER_H__
|
||||
|
||||
#include <drm/drmP.h>
|
||||
struct drm_crtc;
|
||||
struct drm_crtc_funcs;
|
||||
struct drm_device;
|
||||
struct drm_framebuffer;
|
||||
struct drm_mode_fb_cmd2;
|
||||
|
||||
void drm_helper_move_panel_connectors_to_head(struct drm_device *);
|
||||
|
||||
|
@@ -1013,7 +1013,7 @@ struct drm_plane_helper_funcs {
|
||||
* @prepare_fb:
|
||||
*
|
||||
* This hook is to prepare a framebuffer for scanout by e.g. pinning
|
||||
* it's backing storage or relocating it into a contiguous block of
|
||||
* its backing storage or relocating it into a contiguous block of
|
||||
* VRAM. Other possible preparatory work includes flushing caches.
|
||||
*
|
||||
* This function must not block for outstanding rendering, since it is
|
||||
|
@@ -68,7 +68,7 @@ struct drm_modeset_acquire_ctx {
|
||||
/**
|
||||
* struct drm_modeset_lock - used for locking modeset resources.
|
||||
* @mutex: resource locking
|
||||
* @head: used to hold it's place on &drm_atomi_state.locked list when
|
||||
* @head: used to hold its place on &drm_atomi_state.locked list when
|
||||
* part of an atomic update
|
||||
*
|
||||
* Used for locking CRTCs and other modeset resources.
|
||||
|
27
include/drm/drm_probe_helper.h
Normal file
27
include/drm/drm_probe_helper.h
Normal file
@@ -0,0 +1,27 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR MIT
|
||||
|
||||
#ifndef __DRM_PROBE_HELPER_H__
|
||||
#define __DRM_PROBE_HELPER_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_connector;
|
||||
struct drm_device;
|
||||
struct drm_modeset_acquire_ctx;
|
||||
|
||||
int drm_helper_probe_single_connector_modes(struct drm_connector
|
||||
*connector, uint32_t maxX,
|
||||
uint32_t maxY);
|
||||
int drm_helper_probe_detect(struct drm_connector *connector,
|
||||
struct drm_modeset_acquire_ctx *ctx,
|
||||
bool force);
|
||||
void drm_kms_helper_poll_init(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_fini(struct drm_device *dev);
|
||||
bool drm_helper_hpd_irq_event(struct drm_device *dev);
|
||||
void drm_kms_helper_hotplug_event(struct drm_device *dev);
|
||||
|
||||
void drm_kms_helper_poll_disable(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_enable(struct drm_device *dev);
|
||||
bool drm_kms_helper_is_poll_worker(void);
|
||||
|
||||
#endif
|
@@ -182,12 +182,6 @@ int drm_rect_calc_hscale(const struct drm_rect *src,
|
||||
int drm_rect_calc_vscale(const struct drm_rect *src,
|
||||
const struct drm_rect *dst,
|
||||
int min_vscale, int max_vscale);
|
||||
int drm_rect_calc_hscale_relaxed(struct drm_rect *src,
|
||||
struct drm_rect *dst,
|
||||
int min_hscale, int max_hscale);
|
||||
int drm_rect_calc_vscale_relaxed(struct drm_rect *src,
|
||||
struct drm_rect *dst,
|
||||
int min_vscale, int max_vscale);
|
||||
void drm_rect_debug_print(const char *prefix,
|
||||
const struct drm_rect *r, bool fixed_point);
|
||||
void drm_rect_rotate(struct drm_rect *r,
|
||||
|
@@ -26,9 +26,9 @@
|
||||
#ifndef __DRM_SYNCOBJ_H__
|
||||
#define __DRM_SYNCOBJ_H__
|
||||
|
||||
#include "linux/dma-fence.h"
|
||||
#include <linux/dma-fence.h>
|
||||
|
||||
struct drm_syncobj_cb;
|
||||
struct drm_file;
|
||||
|
||||
/**
|
||||
* struct drm_syncobj - sync object.
|
||||
@@ -62,25 +62,6 @@ struct drm_syncobj {
|
||||
struct file *file;
|
||||
};
|
||||
|
||||
typedef void (*drm_syncobj_func_t)(struct drm_syncobj *syncobj,
|
||||
struct drm_syncobj_cb *cb);
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @func: drm_syncobj_func_t to call
|
||||
*
|
||||
* This struct will be initialized by drm_syncobj_add_callback, additional
|
||||
* data can be passed along by embedding drm_syncobj_cb in another struct.
|
||||
* The callback will get called the next time drm_syncobj_replace_fence is
|
||||
* called.
|
||||
*/
|
||||
struct drm_syncobj_cb {
|
||||
struct list_head node;
|
||||
drm_syncobj_func_t func;
|
||||
};
|
||||
|
||||
void drm_syncobj_free(struct kref *kref);
|
||||
|
||||
/**
|
||||
|
@@ -26,7 +26,58 @@
|
||||
#ifndef _DRM_UTIL_H_
|
||||
#define _DRM_UTIL_H_
|
||||
|
||||
/* helper for handling conditionals in various for_each macros */
|
||||
/**
|
||||
* DOC: drm utils
|
||||
*
|
||||
* Macros and inline functions that does not naturally belong in other places
|
||||
*/
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kgdb.h>
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
/*
|
||||
* Use EXPORT_SYMBOL_FOR_TESTS_ONLY() for functions that shall
|
||||
* only be visible for drmselftests.
|
||||
*/
|
||||
#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
|
||||
|
||||
/**
|
||||
* for_each_if - helper for handling conditionals in various for_each macros
|
||||
* @condition: The condition to check
|
||||
*
|
||||
* Typical use::
|
||||
*
|
||||
* #define for_each_foo_bar(x, y) \'
|
||||
* list_for_each_entry(x, y->list, head) \'
|
||||
* for_each_if(x->something == SOMETHING)
|
||||
*
|
||||
* The for_each_if() macro makes the use of for_each_foo_bar() less error
|
||||
* prone.
|
||||
*/
|
||||
#define for_each_if(condition) if (!(condition)) {} else
|
||||
|
||||
/**
|
||||
* drm_can_sleep - returns true if currently okay to sleep
|
||||
*
|
||||
* This function shall not be used in new code.
|
||||
* The check for running in atomic context may not work - see linux/preempt.h.
|
||||
*
|
||||
* FIXME: All users of drm_can_sleep should be removed (see todo.rst)
|
||||
*
|
||||
* Returns:
|
||||
* False if kgdb is active, we are in atomic context or irqs are disabled.
|
||||
*/
|
||||
static inline bool drm_can_sleep(void)
|
||||
{
|
||||
if (in_atomic() || in_dbg_master() || irqs_disabled())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -128,6 +128,26 @@ struct drm_vblank_crtc {
|
||||
* @last: Protected by &drm_device.vbl_lock, used for wraparound handling.
|
||||
*/
|
||||
u32 last;
|
||||
/**
|
||||
* @max_vblank_count:
|
||||
*
|
||||
* Maximum value of the vblank registers for this crtc. This value +1
|
||||
* will result in a wrap-around of the vblank register. It is used
|
||||
* by the vblank core to handle wrap-arounds.
|
||||
*
|
||||
* If set to zero the vblank core will try to guess the elapsed vblanks
|
||||
* between times when the vblank interrupt is disabled through
|
||||
* high-precision timestamps. That approach is suffering from small
|
||||
* races and imprecision over longer time periods, hence exposing a
|
||||
* hardware vblank counter is always recommended.
|
||||
*
|
||||
* This is the runtime configurable per-crtc maximum set through
|
||||
* drm_crtc_set_max_vblank_count(). If this is used the driver
|
||||
* must leave the device wide &drm_device.max_vblank_count at zero.
|
||||
*
|
||||
* If non-zero, &drm_crtc_funcs.get_vblank_counter must be set.
|
||||
*/
|
||||
u32 max_vblank_count;
|
||||
/**
|
||||
* @inmodeset: Tracks whether the vblank is disabled due to a modeset.
|
||||
* For legacy driver bit 2 additionally tracks whether an additional
|
||||
@@ -206,4 +226,6 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
||||
void drm_calc_timestamping_constants(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode);
|
||||
wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc);
|
||||
void drm_crtc_set_max_vblank_count(struct drm_crtc *crtc,
|
||||
u32 max_vblank_count);
|
||||
#endif
|
||||
|
@@ -137,10 +137,6 @@ struct drm_sched_fence {
|
||||
*/
|
||||
struct dma_fence finished;
|
||||
|
||||
/**
|
||||
* @cb: the callback for the parent fence below.
|
||||
*/
|
||||
struct dma_fence_cb cb;
|
||||
/**
|
||||
* @parent: the fence returned by &drm_sched_backend_ops.run_job
|
||||
* when scheduling the job on hardware. We signal the
|
||||
@@ -181,6 +177,7 @@ struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
|
||||
* be scheduled further.
|
||||
* @s_priority: the priority of the job.
|
||||
* @entity: the entity to which this job belongs.
|
||||
* @cb: the callback for the parent fence in s_fence.
|
||||
*
|
||||
* A job is created by the driver using drm_sched_job_init(), and
|
||||
* should call drm_sched_entity_push_job() once it wants the scheduler
|
||||
@@ -197,6 +194,7 @@ struct drm_sched_job {
|
||||
atomic_t karma;
|
||||
enum drm_sched_priority s_priority;
|
||||
struct drm_sched_entity *entity;
|
||||
struct dma_fence_cb cb;
|
||||
};
|
||||
|
||||
static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job,
|
||||
@@ -298,9 +296,10 @@ int drm_sched_job_init(struct drm_sched_job *job,
|
||||
void *owner);
|
||||
void drm_sched_job_cleanup(struct drm_sched_job *job);
|
||||
void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_hw_job_reset(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_job *job);
|
||||
void drm_sched_job_recovery(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_stop(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_start(struct drm_gpu_scheduler *sched, bool full_recovery);
|
||||
void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_increase_karma(struct drm_sched_job *bad);
|
||||
bool drm_sched_dependency_optimized(struct dma_fence* fence,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_fault(struct drm_gpu_scheduler *sched);
|
||||
|
@@ -394,6 +394,9 @@
|
||||
INTEL_VGA_DEVICE(0x3E9A, info) /* SRV GT2 */
|
||||
|
||||
/* CFL H */
|
||||
#define INTEL_CFL_H_GT1_IDS(info) \
|
||||
INTEL_VGA_DEVICE(0x3E9C, info)
|
||||
|
||||
#define INTEL_CFL_H_GT2_IDS(info) \
|
||||
INTEL_VGA_DEVICE(0x3E9B, info), /* Halo GT2 */ \
|
||||
INTEL_VGA_DEVICE(0x3E94, info) /* Halo GT2 */
|
||||
@@ -426,6 +429,7 @@
|
||||
#define INTEL_CFL_IDS(info) \
|
||||
INTEL_CFL_S_GT1_IDS(info), \
|
||||
INTEL_CFL_S_GT2_IDS(info), \
|
||||
INTEL_CFL_H_GT1_IDS(info), \
|
||||
INTEL_CFL_H_GT2_IDS(info), \
|
||||
INTEL_CFL_U_GT2_IDS(info), \
|
||||
INTEL_CFL_U_GT3_IDS(info), \
|
||||
@@ -457,9 +461,13 @@
|
||||
INTEL_VGA_DEVICE(0x8A51, info), \
|
||||
INTEL_VGA_DEVICE(0x8A5C, info), \
|
||||
INTEL_VGA_DEVICE(0x8A5D, info), \
|
||||
INTEL_VGA_DEVICE(0x8A59, info), \
|
||||
INTEL_VGA_DEVICE(0x8A58, info), \
|
||||
INTEL_VGA_DEVICE(0x8A52, info), \
|
||||
INTEL_VGA_DEVICE(0x8A5A, info), \
|
||||
INTEL_VGA_DEVICE(0x8A5B, info), \
|
||||
INTEL_VGA_DEVICE(0x8A57, info), \
|
||||
INTEL_VGA_DEVICE(0x8A56, info), \
|
||||
INTEL_VGA_DEVICE(0x8A71, info), \
|
||||
INTEL_VGA_DEVICE(0x8A70, info)
|
||||
|
||||
|
@@ -4,6 +4,9 @@
|
||||
#ifndef _DRM_INTEL_GTT_H
|
||||
#define _DRM_INTEL_GTT_H
|
||||
|
||||
#include <linux/agp_backend.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
void intel_gtt_get(u64 *gtt_total,
|
||||
phys_addr_t *mappable_base,
|
||||
resource_size_t *mappable_end);
|
||||
|
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <drm/tinydrm/tinydrm.h>
|
||||
|
||||
struct drm_rect;
|
||||
struct spi_device;
|
||||
struct gpio_desc;
|
||||
struct regulator;
|
||||
@@ -67,6 +68,8 @@ int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi,
|
||||
const struct drm_simple_display_pipe_funcs *pipe_funcs,
|
||||
struct drm_driver *driver,
|
||||
const struct drm_display_mode *mode, unsigned int rotation);
|
||||
void mipi_dbi_pipe_update(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *old_state);
|
||||
void mipi_dbi_enable_flush(struct mipi_dbi *mipi,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_plane_state *plan_state);
|
||||
@@ -80,7 +83,7 @@ u32 mipi_dbi_spi_cmd_max_speed(struct spi_device *spi, size_t len);
|
||||
int mipi_dbi_command_read(struct mipi_dbi *mipi, u8 cmd, u8 *val);
|
||||
int mipi_dbi_command_buf(struct mipi_dbi *mipi, u8 cmd, u8 *data, size_t len);
|
||||
int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip, bool swap);
|
||||
struct drm_rect *clip, bool swap);
|
||||
/**
|
||||
* mipi_dbi_command - MIPI DCS command with optional parameter(s)
|
||||
* @mipi: MIPI structure
|
||||
|
@@ -11,8 +11,8 @@
|
||||
#define __LINUX_TINYDRM_HELPERS_H
|
||||
|
||||
struct backlight_device;
|
||||
struct tinydrm_device;
|
||||
struct drm_clip_rect;
|
||||
struct drm_framebuffer;
|
||||
struct drm_rect;
|
||||
struct spi_transfer;
|
||||
struct spi_message;
|
||||
struct spi_device;
|
||||
@@ -33,23 +33,15 @@ static inline bool tinydrm_machine_little_endian(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool tinydrm_merge_clips(struct drm_clip_rect *dst,
|
||||
struct drm_clip_rect *src, unsigned int num_clips,
|
||||
unsigned int flags, u32 max_width, u32 max_height);
|
||||
int tinydrm_fb_dirty(struct drm_framebuffer *fb,
|
||||
struct drm_file *file_priv,
|
||||
unsigned int flags, unsigned int color,
|
||||
struct drm_clip_rect *clips,
|
||||
unsigned int num_clips);
|
||||
void tinydrm_memcpy(void *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip);
|
||||
struct drm_rect *clip);
|
||||
void tinydrm_swab16(u16 *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip);
|
||||
struct drm_rect *clip);
|
||||
void tinydrm_xrgb8888_to_rgb565(u16 *dst, void *vaddr,
|
||||
struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip, bool swap);
|
||||
struct drm_rect *clip, bool swap);
|
||||
void tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip);
|
||||
struct drm_rect *clip);
|
||||
|
||||
size_t tinydrm_spi_max_transfer_size(struct spi_device *spi, size_t max_len);
|
||||
bool tinydrm_spi_bpw_supported(struct spi_device *spi, u8 bpw);
|
||||
|
@@ -10,14 +10,9 @@
|
||||
#ifndef __LINUX_TINYDRM_H
|
||||
#define __LINUX_TINYDRM_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
||||
struct drm_clip_rect;
|
||||
struct drm_driver;
|
||||
struct drm_file;
|
||||
struct drm_framebuffer;
|
||||
struct drm_framebuffer_funcs;
|
||||
|
||||
/**
|
||||
* struct tinydrm_device - tinydrm device
|
||||
@@ -32,24 +27,6 @@ struct tinydrm_device {
|
||||
* @pipe: Display pipe structure
|
||||
*/
|
||||
struct drm_simple_display_pipe pipe;
|
||||
|
||||
/**
|
||||
* @dirty_lock: Serializes framebuffer flushing
|
||||
*/
|
||||
struct mutex dirty_lock;
|
||||
|
||||
/**
|
||||
* @fb_funcs: Framebuffer functions used when creating framebuffers
|
||||
*/
|
||||
const struct drm_framebuffer_funcs *fb_funcs;
|
||||
|
||||
/**
|
||||
* @fb_dirty: Framebuffer dirty callback
|
||||
*/
|
||||
int (*fb_dirty)(struct drm_framebuffer *framebuffer,
|
||||
struct drm_file *file_priv, unsigned flags,
|
||||
unsigned color, struct drm_clip_rect *clips,
|
||||
unsigned num_clips);
|
||||
};
|
||||
|
||||
static inline struct tinydrm_device *
|
||||
@@ -82,13 +59,10 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
|
||||
.clock = 1 /* pass validation */
|
||||
|
||||
int devm_tinydrm_init(struct device *parent, struct tinydrm_device *tdev,
|
||||
const struct drm_framebuffer_funcs *fb_funcs,
|
||||
struct drm_driver *driver);
|
||||
int devm_tinydrm_register(struct tinydrm_device *tdev);
|
||||
void tinydrm_shutdown(struct tinydrm_device *tdev);
|
||||
|
||||
void tinydrm_display_pipe_update(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *old_state);
|
||||
int
|
||||
tinydrm_display_pipe_init(struct tinydrm_device *tdev,
|
||||
const struct drm_simple_display_pipe_funcs *funcs,
|
||||
|
@@ -295,23 +295,6 @@ static inline void ttm_bo_get(struct ttm_buffer_object *bo)
|
||||
kref_get(&bo->kref);
|
||||
}
|
||||
|
||||
/**
|
||||
* ttm_bo_reference - reference a struct ttm_buffer_object
|
||||
*
|
||||
* @bo: The buffer object.
|
||||
*
|
||||
* Returns a refcounted pointer to a buffer object.
|
||||
*
|
||||
* This function is deprecated. Use @ttm_bo_get instead.
|
||||
*/
|
||||
|
||||
static inline struct ttm_buffer_object *
|
||||
ttm_bo_reference(struct ttm_buffer_object *bo)
|
||||
{
|
||||
ttm_bo_get(bo);
|
||||
return bo;
|
||||
}
|
||||
|
||||
/**
|
||||
* ttm_bo_get_unless_zero - reference a struct ttm_buffer_object unless
|
||||
* its refcount has already reached zero.
|
||||
@@ -386,17 +369,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
|
||||
*/
|
||||
void ttm_bo_put(struct ttm_buffer_object *bo);
|
||||
|
||||
/**
|
||||
* ttm_bo_unref
|
||||
*
|
||||
* @bo: The buffer object.
|
||||
*
|
||||
* Unreference and clear a pointer to a buffer object.
|
||||
*
|
||||
* This function is deprecated. Use @ttm_bo_put instead.
|
||||
*/
|
||||
void ttm_bo_unref(struct ttm_buffer_object **bo);
|
||||
|
||||
/**
|
||||
* ttm_bo_add_to_lru
|
||||
*
|
||||
|
@@ -381,6 +381,15 @@ struct ttm_bo_driver {
|
||||
*/
|
||||
int (*access_memory)(struct ttm_buffer_object *bo, unsigned long offset,
|
||||
void *buf, int len, int write);
|
||||
|
||||
/**
|
||||
* struct ttm_bo_driver member del_from_lru_notify
|
||||
*
|
||||
* @bo: the buffer object deleted from lru
|
||||
*
|
||||
* notify driver that a BO was deleted from LRU.
|
||||
*/
|
||||
void (*del_from_lru_notify)(struct ttm_buffer_object *bo);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -867,7 +876,7 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
|
||||
*
|
||||
* @bo: A pointer to a struct ttm_buffer_object.
|
||||
*
|
||||
* Pipelined gutting a BO of it's backing store.
|
||||
* Pipelined gutting a BO of its backing store.
|
||||
*/
|
||||
int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo);
|
||||
|
||||
|
Reference in New Issue
Block a user