mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge tag 'drm-next-2024-03-13' of https://gitlab.freedesktop.org/drm/kernel
Pull drm updates from Dave Airlie:
"Highlights are usual, more AMD IP blocks for future hw, i915/xe
changes, Displayport tunnelling support for i915, msm YUV over DP
changes, new tests for ttm, but its mostly a lot of stuff all over the
place from lots of people.
core:
- EDID cleanups
- scheduler error handling fixes
- managed: add drmm_release_action() with tests
- add ratelimited drm debug print
- DPCD PSR early transport macro
- DP tunneling and bandwidth allocation helpers
- remove built-in edids
- dp: Avoid AUX transfers on powered-down displays
- dp: Add VSC SDP helpers
cross drivers:
- use new drm print helpers
- switch to ->read_edid callback
- gem: add stats for shared buffers plus updates to amdgpu, i915, xe
syncobj:
- fixes to waiting and sleeping
ttm:
- add tests
- fix errno codes
- simply busy-placement handling
- fix page decryption
media:
- tc358743: fix v4l device registration
video:
- move all kernel parameters for video behind CONFIG_VIDEO
sound:
- remove <drm/drm_edid.h> include from header
ci:
- add tests for msm
- fix apq8016 runner
efifb:
- use copy of global screen_info state
vesafb:
- use copy of global screen_info state
simplefb:
- fix logging
bridge:
- ite-6505: fix DP link-training bug
- samsung-dsim: fix error checking in probe
- samsung-dsim: add bsh-smm-s2/pro boards
- tc358767: fix regmap usage
- imx: add i.MX8MP HDMI PVI plus DT bindings
- imx: add i.MX8MP HDMI TX plus DT bindings
- sii902x: fix probing and unregistration
- tc358767: limit pixel PLL input range
- switch to new drm_bridge_read_edid() interface
panel:
- ltk050h3146w: error-handling fixes
- panel-edp: support delay between power-on and enable; use put_sync
in unprepare; support Mediatek MT8173 Chromebooks, BOE NV116WHM-N49
V8.0, BOE NV122WUM-N41, CSO MNC207QS1-1 plus DT bindings
- panel-lvds: support EDT ETML0700Z9NDHA plus DT bindings
- panel-novatek: FRIDA FRD400B25025-A-CTK plus DT bindings
- add BOE TH101MB31IG002-28A plus DT bindings
- add EDT ETML1010G3DRA plus DT bindings
- add Novatek NT36672E LCD DSI plus DT bindings
- nt36523: support 120Hz timings, fix includes
- simple: fix display timings on RK32FN48H
- visionox-vtdr6130: fix initialization
- add Powkiddy RGB10MAX3 plus DT bindings
- st7703: support panel rotation plus DT bindings
- add Himax HX83112A plus DT bindings
- ltk500hd1829: add support for ltk101b4029w and admatec 9904370
- simple: add BOE BP082WX1-100 8.2" panel plus DT bindungs
panel-orientation-quirks:
- GPD Win Mini
amdgpu:
- Validate DMABuf imports in compute VMs
- Add RAS ACA framework
- PSP 13 fixes
- Misc code cleanups
- Replay fixes
- Atom interpretor PS, WS bounds checking
- DML2 fixes
- Audio fixes
- DCN 3.5 Z state fixes
- Remove deprecated ida_simple usage
- UBSAN fixes
- RAS fixes
- Enable seq64 infrastructure
- DC color block enablement
- Documentation updates
- DC documentation updates
- DMCUB updates
- ATHUB 4.1 support
- LSDMA 7.0 support
- JPEG DPG support
- IH 7.0 support
- HDP 7.0 support
- VCN 5.0 support
- SMU 13.0.6 updates
- NBIO 7.11 updates
- SDMA 6.1 updates
- MMHUB 3.3 updates
- DCN 3.5.1 support
- NBIF 6.3.1 support
- VPE 6.1.1 support
amdkfd:
- Validate DMABuf imports in compute VMs
- SVM fixes
- Trap handler updates and enhancements
- Fix cache size reporting
- Relocate the trap handler
radeon:
- Atom interpretor PS, WS bounds checking
- Misc code cleanups
xe:
- new query for GuC submission version
- Remove unused persistent exec_queues
- Add vram frequency sysfs attributes
- Add the flag XE_VM_BIND_FLAG_DUMPABLE
- Drop pre-production workarounds
- Drop kunit tests for unsupported platforms
- Start pumbling SR-IOV support with memory based interrupts for VF
- Allow to map BO in GGTT with PAT index corresponding to XE_CACHE_UC
to work with memory based interrupts
- Add GuC Doorbells Manager as prep work SR-IOV
- Implement additional workarounds for xe2 and MTL
- Program a few registers according to perfomance guide spec for Xe2
- Fix remaining 32b build issues and enable it back
- Fix build with CONFIG_DEBUG_FS=n
- Fix warnings from GuC ABI headers
- Introduce Relay Communication for SR-IOV for VF <-> GuC <-> PF
- Release mmap mappings on rpm suspend
- Disable mid-thread preemption when not properly supported by
hardware
- Fix xe_exec by reserving extra fence slot for CPU bind
- Fix xe_exec with full long running exec queue
- Canonicalize addresses where needed for Xe2 and add to devcoredum
- Toggle USM support for Xe2
- Only allow 1 ufence per exec / bind IOCTL
- Add GuC firmware loading for Lunar Lake
- Add XE_VMA_PTE_64K VMA flag
i915:
- Add more ADL-N PCI IDs
- Enable fastboot also on older platforms
- Early transport for panel replay and PSR
- New ARL PCI IDs
- DP TPS4 PHY test pattern support
- Unify and improve VSC SDP for PSR and non-PSR cases
- Refactor memory regions and improve debug logging
- Rework global state serialization
- Remove unused CDCLK divider fields
- Unify HDCP connector logging format
- Use display instead of graphics version in display code
- Move VBT and opregion debugfs next to the implementation
- Abstract opregion interface, use opaque type
- MTL fixes
- HPD handling fixes
- Add GuC submission interface version query
- Atomically invalidate userptr on mmu-notifier
- Update handling of MMIO triggered reports
- Don't make assumptions about intel_wakeref_t type
- Extend driver code of Xe_LPG to Xe_LPG+
- Add flex arrays to struct i915_syncmap
- Allow for very slow HuC loading
- DP tunneling and bandwidth allocation support
msm:
- Correct bindings for MSM8976 and SM8650 platforms
- Start migration of MDP5 platforms to DPU driver
- X1E80100 MDSS support
- DPU:
- Improve DSC allocation, fixing several important corner cases
- Add support for SDM630/SDM660 platforms
- Simplify dpu_encoder_phys_ops
- Apply fixes targeting DSC support with a single DSC encoder
- Apply fixes for HCTL_EN timing configuration
- X1E80100 support
- Add support for YUV420 over DP
- GPU:
- fix sc7180 UBWC config
- fix a7xx LLC config
- new gpu support: a305B, a750, a702
- machine support: SM7150 (different power levels than other a618)
- a7xx devcoredump support
habanalabs:
- configure IRQ affinity according to NUMA node
- move HBM MMU page tables inside the HBM
- improve device reset
- check extended PCIe errors
ivpu:
- updates to firmware API
- refactor BO allocation
imx:
- use devm_ functions during init
hisilicon:
- fix EDID includes
mgag200:
- improve ioremap usage
- convert to struct drm_edid
- Work around PCI write bursts
nouveau:
- disp: use kmemdup()
- fix EDID includes
- documentation fixes
qaic:
- fixes to BO handling
- make use of DRM managed release
- fix order of remove operations
rockchip:
- analogix_dp: get encoder port from DT
- inno_hdmi: support HDMI for RK3128
- lvds: error-handling fixes
ssd130x:
- support SSD133x plus DT bindings
tegra:
- fix error handling
tilcdc:
- make use of DRM managed release
v3d:
- show memory stats in debugfs
- Support display MMU page size
vc4:
- fix error handling in plane prepare_fb
- fix framebuffer test in plane helpers
virtio:
- add venus capset defines
vkms:
- fix OOB access when programming the LUT
- Kconfig improvements
vmwgfx:
- unmap surface before changing plane state
- fix memory leak in error handling
- documentation fixes
- list command SVGA_3D_CMD_DEFINE_GB_SURFACE_V4 as invalid
- fix null-pointer deref in execbuf
- refactor display-mode probing
- fix fencing for creating cursor MOBs
- fix cursor-memory lifetime
xlnx:
- fix live video input for ZynqMP DPSUB
lima:
- fix memory leak
loongson:
- fail if no VRAM present
meson:
- switch to new drm_bridge_read_edid() interface
renesas:
- add RZ/G2L DU support plus DT bindings
mxsfb:
- Use managed mode config
sun4i:
- HDMI: updates to atomic mode setting
mediatek:
- Add display driver for MT8188 VDOSYS1
- DSI driver cleanups
- Filter modes according to hardware capability
- Fix a null pointer crash in mtk_drm_crtc_finish_page_flip
etnaviv:
- enhancements for NPU and MRT support"
* tag 'drm-next-2024-03-13' of https://gitlab.freedesktop.org/drm/kernel: (1420 commits)
drm/amd/display: Removed redundant @ symbol to fix kernel-doc warnings in -next repo
drm/amd/pm: wait for completion of the EnableGfxImu message
drm/amdgpu/soc21: add mode2 asic reset for SMU IP v14.0.1
drm/amdgpu: add smu 14.0.1 support
drm/amdgpu: add VPE 6.1.1 discovery support
drm/amdgpu/vpe: add VPE 6.1.1 support
drm/amdgpu/vpe: don't emit cond exec command under collaborate mode
drm/amdgpu/vpe: add collaborate mode support for VPE
drm/amdgpu/vpe: add PRED_EXE and COLLAB_SYNC OPCODE
drm/amdgpu/vpe: add multi instance VPE support
drm/amdgpu/discovery: add nbif v6_3_1 ip block
drm/amdgpu: Add nbif v6_3_1 ip block support
drm/amdgpu: Add pcie v6_1_0 ip headers (v5)
drm/amdgpu: Add nbif v6_3_1 ip headers (v5)
arch/powerpc: Remove <linux/fb.h> from backlight code
macintosh/via-pmu-backlight: Include <linux/backlight.h>
fbdev/chipsfb: Include <linux/backlight.h>
drm/etnaviv: Restore some id values
drm/amdkfd: make kfd_class constant
drm/amdgpu: add ring timeout information in devcoredump
...
This commit is contained in:
@@ -718,6 +718,7 @@
|
||||
# define DP_PSR_SU_REGION_SCANLINE_CAPTURE BIT(4) /* eDP 1.4a */
|
||||
# define DP_PSR_IRQ_HPD_WITH_CRC_ERRORS BIT(5) /* eDP 1.4a */
|
||||
# define DP_PSR_ENABLE_PSR2 BIT(6) /* eDP 1.4a */
|
||||
# define DP_PSR_ENABLE_SU_REGION_ET BIT(7) /* eDP 1.5 */
|
||||
|
||||
#define DP_ADAPTER_CTRL 0x1a0
|
||||
# define DP_ADAPTER_CTRL_FORCE_LOAD_SENSE (1 << 0)
|
||||
@@ -1080,6 +1081,7 @@
|
||||
# define STREAM_STATUS_CHANGED (1 << 2)
|
||||
# define HDMI_LINK_STATUS_CHANGED (1 << 3)
|
||||
# define CONNECTED_OFF_ENTRY_REQUESTED (1 << 4)
|
||||
# define DP_TUNNELING_IRQ (1 << 5)
|
||||
|
||||
#define DP_PSR_ERROR_STATUS 0x2006 /* XXX 1.2? */
|
||||
# define DP_PSR_LINK_CRC_ERROR (1 << 0)
|
||||
@@ -1381,6 +1383,66 @@
|
||||
#define DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET 0x69494
|
||||
#define DP_HDCP_2_2_REG_DBG_OFFSET 0x69518
|
||||
|
||||
/* DP-tunneling */
|
||||
#define DP_TUNNELING_OUI 0xe0000
|
||||
#define DP_TUNNELING_OUI_BYTES 3
|
||||
|
||||
#define DP_TUNNELING_DEV_ID 0xe0003
|
||||
#define DP_TUNNELING_DEV_ID_BYTES 6
|
||||
|
||||
#define DP_TUNNELING_HW_REV 0xe0009
|
||||
#define DP_TUNNELING_HW_REV_MAJOR_SHIFT 4
|
||||
#define DP_TUNNELING_HW_REV_MAJOR_MASK (0xf << DP_TUNNELING_HW_REV_MAJOR_SHIFT)
|
||||
#define DP_TUNNELING_HW_REV_MINOR_SHIFT 0
|
||||
#define DP_TUNNELING_HW_REV_MINOR_MASK (0xf << DP_TUNNELING_HW_REV_MINOR_SHIFT)
|
||||
|
||||
#define DP_TUNNELING_SW_REV_MAJOR 0xe000a
|
||||
#define DP_TUNNELING_SW_REV_MINOR 0xe000b
|
||||
|
||||
#define DP_TUNNELING_CAPABILITIES 0xe000d
|
||||
#define DP_IN_BW_ALLOCATION_MODE_SUPPORT (1 << 7)
|
||||
#define DP_PANEL_REPLAY_OPTIMIZATION_SUPPORT (1 << 6)
|
||||
#define DP_TUNNELING_SUPPORT (1 << 0)
|
||||
|
||||
#define DP_IN_ADAPTER_INFO 0xe000e
|
||||
#define DP_IN_ADAPTER_NUMBER_BITS 7
|
||||
#define DP_IN_ADAPTER_NUMBER_MASK ((1 << DP_IN_ADAPTER_NUMBER_BITS) - 1)
|
||||
|
||||
#define DP_USB4_DRIVER_ID 0xe000f
|
||||
#define DP_USB4_DRIVER_ID_BITS 4
|
||||
#define DP_USB4_DRIVER_ID_MASK ((1 << DP_USB4_DRIVER_ID_BITS) - 1)
|
||||
|
||||
#define DP_USB4_DRIVER_BW_CAPABILITY 0xe0020
|
||||
#define DP_USB4_DRIVER_BW_ALLOCATION_MODE_SUPPORT (1 << 7)
|
||||
|
||||
#define DP_IN_ADAPTER_TUNNEL_INFORMATION 0xe0021
|
||||
#define DP_GROUP_ID_BITS 3
|
||||
#define DP_GROUP_ID_MASK ((1 << DP_GROUP_ID_BITS) - 1)
|
||||
|
||||
#define DP_BW_GRANULARITY 0xe0022
|
||||
#define DP_BW_GRANULARITY_MASK 0x3
|
||||
|
||||
#define DP_ESTIMATED_BW 0xe0023
|
||||
#define DP_ALLOCATED_BW 0xe0024
|
||||
|
||||
#define DP_TUNNELING_STATUS 0xe0025
|
||||
#define DP_BW_ALLOCATION_CAPABILITY_CHANGED (1 << 3)
|
||||
#define DP_ESTIMATED_BW_CHANGED (1 << 2)
|
||||
#define DP_BW_REQUEST_SUCCEEDED (1 << 1)
|
||||
#define DP_BW_REQUEST_FAILED (1 << 0)
|
||||
|
||||
#define DP_TUNNELING_MAX_LINK_RATE 0xe0028
|
||||
|
||||
#define DP_TUNNELING_MAX_LANE_COUNT 0xe0029
|
||||
#define DP_TUNNELING_MAX_LANE_COUNT_MASK 0x1f
|
||||
|
||||
#define DP_DPTX_BW_ALLOCATION_MODE_CONTROL 0xe0030
|
||||
#define DP_DISPLAY_DRIVER_BW_ALLOCATION_MODE_ENABLE (1 << 7)
|
||||
#define DP_UNMASK_BW_ALLOCATION_IRQ (1 << 6)
|
||||
|
||||
#define DP_REQUEST_BW 0xe0031
|
||||
#define MAX_DP_REQUEST_BW 255
|
||||
|
||||
/* LTTPR: Link Training (LT)-tunable PHY Repeaters */
|
||||
#define DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV 0xf0000 /* 1.3 */
|
||||
#define DP_MAX_LINK_RATE_PHY_REPEATER 0xf0001 /* 1.4a */
|
||||
|
||||
@@ -98,8 +98,9 @@ struct drm_dp_vsc_sdp {
|
||||
enum dp_content_type content_type;
|
||||
};
|
||||
|
||||
void drm_dp_vsc_sdp_log(const char *level, struct device *dev,
|
||||
const struct drm_dp_vsc_sdp *vsc);
|
||||
void drm_dp_vsc_sdp_log(struct drm_printer *p, const struct drm_dp_vsc_sdp *vsc);
|
||||
|
||||
bool drm_dp_vsc_sdp_supported(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE]);
|
||||
|
||||
int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE]);
|
||||
|
||||
@@ -463,9 +464,15 @@ struct drm_dp_aux {
|
||||
* @is_remote: Is this AUX CH actually using sideband messaging.
|
||||
*/
|
||||
bool is_remote;
|
||||
|
||||
/**
|
||||
* @powered_down: If true then the remote endpoint is powered down.
|
||||
*/
|
||||
bool powered_down;
|
||||
};
|
||||
|
||||
int drm_dp_dpcd_probe(struct drm_dp_aux *aux, unsigned int offset);
|
||||
void drm_dp_dpcd_set_powered(struct drm_dp_aux *aux, bool powered);
|
||||
ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,
|
||||
void *buffer, size_t size);
|
||||
ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset,
|
||||
@@ -812,5 +819,8 @@ int drm_dp_bw_overhead(int lane_count, int hactive,
|
||||
int dsc_slice_count,
|
||||
int bpp_x16, unsigned long flags);
|
||||
int drm_dp_bw_channel_coding_efficiency(bool is_uhbr);
|
||||
int drm_dp_max_dprx_data_rate(int max_link_rate, int max_lanes);
|
||||
|
||||
ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, struct dp_sdp *sdp);
|
||||
|
||||
#endif /* _DRM_DP_HELPER_H_ */
|
||||
|
||||
248
include/drm/display/drm_dp_tunnel.h
Normal file
248
include/drm/display/drm_dp_tunnel.h
Normal file
@@ -0,0 +1,248 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __DRM_DP_TUNNEL_H__
|
||||
#define __DRM_DP_TUNNEL_H__
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_dp_aux;
|
||||
|
||||
struct drm_device;
|
||||
|
||||
struct drm_atomic_state;
|
||||
struct drm_dp_tunnel_mgr;
|
||||
struct drm_dp_tunnel_state;
|
||||
|
||||
struct ref_tracker;
|
||||
|
||||
struct drm_dp_tunnel_ref {
|
||||
struct drm_dp_tunnel *tunnel;
|
||||
struct ref_tracker *tracker;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DRM_DISPLAY_DP_TUNNEL
|
||||
|
||||
struct drm_dp_tunnel *
|
||||
drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker);
|
||||
|
||||
void
|
||||
drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker);
|
||||
|
||||
static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel,
|
||||
struct drm_dp_tunnel_ref *tunnel_ref)
|
||||
{
|
||||
tunnel_ref->tunnel = drm_dp_tunnel_get(tunnel, &tunnel_ref->tracker);
|
||||
}
|
||||
|
||||
static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref)
|
||||
{
|
||||
drm_dp_tunnel_put(tunnel_ref->tunnel, &tunnel_ref->tracker);
|
||||
tunnel_ref->tunnel = NULL;
|
||||
}
|
||||
|
||||
struct drm_dp_tunnel *
|
||||
drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr,
|
||||
struct drm_dp_aux *aux);
|
||||
int drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel);
|
||||
|
||||
int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel);
|
||||
int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel);
|
||||
bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel);
|
||||
int drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw);
|
||||
int drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel);
|
||||
int drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel);
|
||||
|
||||
void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel);
|
||||
|
||||
int drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr,
|
||||
struct drm_dp_aux *aux);
|
||||
|
||||
int drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel);
|
||||
int drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel);
|
||||
int drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel);
|
||||
|
||||
const char *drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel);
|
||||
|
||||
struct drm_dp_tunnel_state *
|
||||
drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel);
|
||||
|
||||
struct drm_dp_tunnel_state *
|
||||
drm_dp_tunnel_atomic_get_old_state(struct drm_atomic_state *state,
|
||||
const struct drm_dp_tunnel *tunnel);
|
||||
|
||||
struct drm_dp_tunnel_state *
|
||||
drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state,
|
||||
const struct drm_dp_tunnel *tunnel);
|
||||
|
||||
int drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel,
|
||||
u8 stream_id, int bw);
|
||||
int drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state,
|
||||
const struct drm_dp_tunnel *tunnel,
|
||||
u32 *stream_mask);
|
||||
|
||||
int drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state,
|
||||
u32 *failed_stream_mask);
|
||||
|
||||
int drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state);
|
||||
|
||||
struct drm_dp_tunnel_mgr *
|
||||
drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count);
|
||||
void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct drm_dp_tunnel *
|
||||
drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker) {}
|
||||
|
||||
static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel,
|
||||
struct drm_dp_tunnel_ref *tunnel_ref) {}
|
||||
|
||||
static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref) {}
|
||||
|
||||
static inline struct drm_dp_tunnel *
|
||||
drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr,
|
||||
struct drm_dp_aux *aux)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel) {}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr,
|
||||
struct drm_dp_aux *aux)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct drm_dp_tunnel_state *
|
||||
drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline struct drm_dp_tunnel_state *
|
||||
drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state,
|
||||
const struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel,
|
||||
u8 stream_id, int bw)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state,
|
||||
const struct drm_dp_tunnel *tunnel,
|
||||
u32 *stream_mask)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state,
|
||||
u32 *failed_stream_mask)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct drm_dp_tunnel_mgr *
|
||||
drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline
|
||||
void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr) {}
|
||||
|
||||
#endif /* CONFIG_DRM_DISPLAY_DP_TUNNEL */
|
||||
|
||||
#endif /* __DRM_DP_TUNNEL_H__ */
|
||||
@@ -346,25 +346,29 @@ struct __drm_private_objs_state {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_atomic_state - the global state object for atomic updates
|
||||
* @ref: count of all references to this state (will not be freed until zero)
|
||||
* @dev: parent DRM device
|
||||
* @async_update: hint for asynchronous plane update
|
||||
* @planes: pointer to array of structures with per-plane data
|
||||
* @crtcs: pointer to array of CRTC pointers
|
||||
* @num_connector: size of the @connectors and @connector_states arrays
|
||||
* @connectors: pointer to array of structures with per-connector data
|
||||
* @num_private_objs: size of the @private_objs array
|
||||
* @private_objs: pointer to array of private object pointers
|
||||
* @acquire_ctx: acquire context for this atomic modeset state update
|
||||
* struct drm_atomic_state - Atomic commit structure
|
||||
*
|
||||
* This structure is the kernel counterpart of @drm_mode_atomic and represents
|
||||
* an atomic commit that transitions from an old to a new display state. It
|
||||
* contains all the objects affected by the atomic commit and both the new
|
||||
* state structures and pointers to the old state structures for
|
||||
* these.
|
||||
*
|
||||
* States are added to an atomic update by calling drm_atomic_get_crtc_state(),
|
||||
* drm_atomic_get_plane_state(), drm_atomic_get_connector_state(), or for
|
||||
* private state structures, drm_atomic_get_private_obj_state().
|
||||
*/
|
||||
struct drm_atomic_state {
|
||||
/**
|
||||
* @ref:
|
||||
*
|
||||
* Count of all references to this update (will not be freed until zero).
|
||||
*/
|
||||
struct kref ref;
|
||||
|
||||
/**
|
||||
* @dev: Parent DRM Device.
|
||||
*/
|
||||
struct drm_device *dev;
|
||||
|
||||
/**
|
||||
@@ -388,7 +392,12 @@ struct drm_atomic_state {
|
||||
* flag are not allowed.
|
||||
*/
|
||||
bool legacy_cursor_update : 1;
|
||||
|
||||
/**
|
||||
* @async_update: hint for asynchronous plane update
|
||||
*/
|
||||
bool async_update : 1;
|
||||
|
||||
/**
|
||||
* @duplicated:
|
||||
*
|
||||
@@ -398,13 +407,52 @@ struct drm_atomic_state {
|
||||
* states.
|
||||
*/
|
||||
bool duplicated : 1;
|
||||
|
||||
/**
|
||||
* @planes:
|
||||
*
|
||||
* Pointer to array of @drm_plane and @drm_plane_state part of this
|
||||
* update.
|
||||
*/
|
||||
struct __drm_planes_state *planes;
|
||||
|
||||
/**
|
||||
* @crtcs:
|
||||
*
|
||||
* Pointer to array of @drm_crtc and @drm_crtc_state part of this
|
||||
* update.
|
||||
*/
|
||||
struct __drm_crtcs_state *crtcs;
|
||||
|
||||
/**
|
||||
* @num_connector: size of the @connectors array
|
||||
*/
|
||||
int num_connector;
|
||||
|
||||
/**
|
||||
* @connectors:
|
||||
*
|
||||
* Pointer to array of @drm_connector and @drm_connector_state part of
|
||||
* this update.
|
||||
*/
|
||||
struct __drm_connnectors_state *connectors;
|
||||
|
||||
/**
|
||||
* @num_private_objs: size of the @private_objs array
|
||||
*/
|
||||
int num_private_objs;
|
||||
|
||||
/**
|
||||
* @private_objs:
|
||||
*
|
||||
* Pointer to array of @drm_private_obj and @drm_private_obj_state part
|
||||
* of this update.
|
||||
*/
|
||||
struct __drm_private_objs_state *private_objs;
|
||||
|
||||
/**
|
||||
* @acquire_ctx: acquire context for this atomic modeset state update
|
||||
*/
|
||||
struct drm_modeset_acquire_ctx *acquire_ctx;
|
||||
|
||||
/**
|
||||
|
||||
@@ -107,7 +107,7 @@ struct drm_bridge_funcs {
|
||||
* Since this function is both called from the check phase of an atomic
|
||||
* commit, and the mode validation in the probe paths it is not allowed
|
||||
* to look at anything else but the passed-in mode, and validate it
|
||||
* against configuration-invariant hardward constraints. Any further
|
||||
* against configuration-invariant hardware constraints. Any further
|
||||
* limits which depend upon the configuration can only be checked in
|
||||
* @mode_fixup.
|
||||
*
|
||||
@@ -558,11 +558,11 @@ struct drm_bridge_funcs {
|
||||
struct drm_connector *connector);
|
||||
|
||||
/**
|
||||
* @get_edid:
|
||||
* @edid_read:
|
||||
*
|
||||
* Read and parse the EDID data of the connected display.
|
||||
* Read the EDID data of the connected display.
|
||||
*
|
||||
* The @get_edid callback is the preferred way of reporting mode
|
||||
* The @edid_read callback is the preferred way of reporting mode
|
||||
* information for a display connected to the bridge output. Bridges
|
||||
* that support reading EDID shall implement this callback and leave
|
||||
* the @get_modes callback unimplemented.
|
||||
@@ -575,17 +575,18 @@ struct drm_bridge_funcs {
|
||||
* DRM_BRIDGE_OP_EDID flag in their &drm_bridge->ops.
|
||||
*
|
||||
* The connector parameter shall be used for the sole purpose of EDID
|
||||
* retrieval and parsing, and shall not be stored internally by bridge
|
||||
* drivers for future usage.
|
||||
* retrieval, and shall not be stored internally by bridge drivers for
|
||||
* future usage.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* An edid structure newly allocated with kmalloc() (or similar) on
|
||||
* success, or NULL otherwise. The caller is responsible for freeing
|
||||
* the returned edid structure with kfree().
|
||||
* An edid structure newly allocated with drm_edid_alloc() or returned
|
||||
* from drm_edid_read() family of functions on success, or NULL
|
||||
* otherwise. The caller is responsible for freeing the returned edid
|
||||
* structure with drm_edid_free().
|
||||
*/
|
||||
struct edid *(*get_edid)(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
const struct drm_edid *(*edid_read)(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
|
||||
/**
|
||||
* @hpd_notify:
|
||||
@@ -888,8 +889,8 @@ drm_atomic_helper_bridge_propagate_bus_fmt(struct drm_bridge *bridge,
|
||||
enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge);
|
||||
int drm_bridge_get_modes(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
struct edid *drm_bridge_get_edid(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
void drm_bridge_hpd_enable(struct drm_bridge *bridge,
|
||||
void (*cb)(void *data,
|
||||
enum drm_connector_status status),
|
||||
|
||||
@@ -24,11 +24,14 @@
|
||||
#define __DRM_EDID_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/hdmi.h>
|
||||
#include <drm/drm_mode.h>
|
||||
|
||||
enum hdmi_quantization_range;
|
||||
struct drm_connector;
|
||||
struct drm_device;
|
||||
struct drm_display_mode;
|
||||
struct drm_edid;
|
||||
struct hdmi_avi_infoframe;
|
||||
struct hdmi_vendor_infoframe;
|
||||
struct i2c_adapter;
|
||||
|
||||
#define EDID_LENGTH 128
|
||||
@@ -46,7 +49,7 @@ struct est_timings {
|
||||
u8 t1;
|
||||
u8 t2;
|
||||
u8 mfg_rsvd;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */
|
||||
#define EDID_TIMING_ASPECT_SHIFT 6
|
||||
@@ -59,7 +62,7 @@ struct est_timings {
|
||||
struct std_timing {
|
||||
u8 hsize; /* need to multiply by 8 then add 248 */
|
||||
u8 vfreq_aspect;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
#define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1)
|
||||
#define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2)
|
||||
@@ -85,12 +88,12 @@ struct detailed_pixel_timing {
|
||||
u8 hborder;
|
||||
u8 vborder;
|
||||
u8 misc;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/* If it's not pixel timing, it'll be one of the below */
|
||||
struct detailed_data_string {
|
||||
u8 str[13];
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
#define DRM_EDID_RANGE_OFFSET_MIN_VFREQ (1 << 0) /* 1.4 */
|
||||
#define DRM_EDID_RANGE_OFFSET_MAX_VFREQ (1 << 1) /* 1.4 */
|
||||
@@ -120,7 +123,7 @@ struct detailed_data_monitor_range {
|
||||
__le16 m;
|
||||
u8 k;
|
||||
u8 j; /* need to divide by 2 */
|
||||
} __attribute__((packed)) gtf2;
|
||||
} __packed gtf2;
|
||||
struct {
|
||||
u8 version;
|
||||
u8 data1; /* high 6 bits: extra clock resolution */
|
||||
@@ -129,27 +132,27 @@ struct detailed_data_monitor_range {
|
||||
u8 flags; /* preferred aspect and blanking support */
|
||||
u8 supported_scalings;
|
||||
u8 preferred_refresh;
|
||||
} __attribute__((packed)) cvt;
|
||||
} __attribute__((packed)) formula;
|
||||
} __attribute__((packed));
|
||||
} __packed cvt;
|
||||
} __packed formula;
|
||||
} __packed;
|
||||
|
||||
struct detailed_data_wpindex {
|
||||
u8 white_yx_lo; /* Lower 2 bits each */
|
||||
u8 white_x_hi;
|
||||
u8 white_y_hi;
|
||||
u8 gamma; /* need to divide by 100 then add 1 */
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct detailed_data_color_point {
|
||||
u8 windex1;
|
||||
u8 wpindex1[3];
|
||||
u8 windex2;
|
||||
u8 wpindex2[3];
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct cvt_timing {
|
||||
u8 code[3];
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct detailed_non_pixel {
|
||||
u8 pad1;
|
||||
@@ -163,8 +166,8 @@ struct detailed_non_pixel {
|
||||
struct detailed_data_wpindex color;
|
||||
struct std_timing timings[6];
|
||||
struct cvt_timing cvt[4];
|
||||
} __attribute__((packed)) data;
|
||||
} __attribute__((packed));
|
||||
} __packed data;
|
||||
} __packed;
|
||||
|
||||
#define EDID_DETAIL_EST_TIMINGS 0xf7
|
||||
#define EDID_DETAIL_CVT_3BYTE 0xf8
|
||||
@@ -181,8 +184,8 @@ struct detailed_timing {
|
||||
union {
|
||||
struct detailed_pixel_timing pixel_data;
|
||||
struct detailed_non_pixel other_data;
|
||||
} __attribute__((packed)) data;
|
||||
} __attribute__((packed));
|
||||
} __packed data;
|
||||
} __packed;
|
||||
|
||||
#define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0)
|
||||
#define DRM_EDID_INPUT_SYNC_ON_GREEN (1 << 1)
|
||||
@@ -307,7 +310,7 @@ struct edid {
|
||||
u8 extensions;
|
||||
/* Checksum */
|
||||
u8 checksum;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
#define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
|
||||
|
||||
@@ -319,11 +322,6 @@ struct cea_sad {
|
||||
u8 byte2; /* meaning depends on format */
|
||||
};
|
||||
|
||||
struct drm_encoder;
|
||||
struct drm_connector;
|
||||
struct drm_connector_state;
|
||||
struct drm_display_mode;
|
||||
|
||||
int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads);
|
||||
int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb);
|
||||
int drm_av_sync_delay(struct drm_connector *connector,
|
||||
@@ -426,8 +424,6 @@ enum hdmi_quantization_range
|
||||
drm_default_rgb_quant_range(const struct drm_display_mode *mode);
|
||||
int drm_add_modes_noedid(struct drm_connector *connector,
|
||||
int hdisplay, int vdisplay);
|
||||
void drm_set_preferred_mode(struct drm_connector *connector,
|
||||
int hpref, int vpref);
|
||||
|
||||
int drm_edid_header_is_valid(const void *edid);
|
||||
bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
|
||||
|
||||
@@ -18,7 +18,7 @@ struct drm_exec {
|
||||
/**
|
||||
* @flags: Flags to control locking behavior
|
||||
*/
|
||||
uint32_t flags;
|
||||
u32 flags;
|
||||
|
||||
/**
|
||||
* @ticket: WW ticket used for acquiring locks
|
||||
@@ -135,7 +135,7 @@ static inline bool drm_exec_is_contended(struct drm_exec *exec)
|
||||
return !!exec->contended;
|
||||
}
|
||||
|
||||
void drm_exec_init(struct drm_exec *exec, uint32_t flags, unsigned nr);
|
||||
void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr);
|
||||
void drm_exec_fini(struct drm_exec *exec);
|
||||
bool drm_exec_cleanup(struct drm_exec *exec);
|
||||
int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj);
|
||||
|
||||
@@ -95,7 +95,7 @@ static inline int drm_fixp2int_round(s64 a)
|
||||
|
||||
static inline int drm_fixp2int_ceil(s64 a)
|
||||
{
|
||||
if (a > 0)
|
||||
if (a >= 0)
|
||||
return drm_fixp2int(a + DRM_FIXED_ALMOST_ONE);
|
||||
else
|
||||
return drm_fixp2int(a - DRM_FIXED_ALMOST_ONE);
|
||||
|
||||
@@ -553,6 +553,19 @@ unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru,
|
||||
|
||||
int drm_gem_evict(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* drm_gem_object_is_shared_for_memory_stats - helper for shared memory stats
|
||||
*
|
||||
* This helper should only be used for fdinfo shared memory stats to determine
|
||||
* if a GEM object is shared.
|
||||
*
|
||||
* @obj: obj in question
|
||||
*/
|
||||
static inline bool drm_gem_object_is_shared_for_memory_stats(struct drm_gem_object *obj)
|
||||
{
|
||||
return (obj->handle_count > 1) || obj->dma_buf;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
/**
|
||||
* drm_gem_gpuva_set_lock() - Set the lock protecting accesses to the gpuva list.
|
||||
|
||||
@@ -518,7 +518,7 @@ struct drm_gpuvm_exec {
|
||||
/**
|
||||
* @flags: the flags for the struct drm_exec
|
||||
*/
|
||||
uint32_t flags;
|
||||
u32 flags;
|
||||
|
||||
/**
|
||||
* @vm: the &drm_gpuvm to lock its DMA reservations
|
||||
|
||||
@@ -3,11 +3,17 @@
|
||||
#ifndef DRM_KUNIT_HELPERS_H_
|
||||
#define DRM_KUNIT_HELPERS_H_
|
||||
|
||||
#include <drm/drm_drv.h>
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
struct drm_crtc_funcs;
|
||||
struct drm_crtc_helper_funcs;
|
||||
struct drm_device;
|
||||
struct drm_plane_funcs;
|
||||
struct drm_plane_helper_funcs;
|
||||
struct kunit;
|
||||
|
||||
struct device *drm_kunit_helper_alloc_device(struct kunit *test);
|
||||
@@ -97,4 +103,21 @@ drm_kunit_helper_atomic_state_alloc(struct kunit *test,
|
||||
struct drm_device *drm,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
|
||||
struct drm_plane *
|
||||
drm_kunit_helper_create_primary_plane(struct kunit *test,
|
||||
struct drm_device *drm,
|
||||
const struct drm_plane_funcs *funcs,
|
||||
const struct drm_plane_helper_funcs *helper_funcs,
|
||||
const uint32_t *formats,
|
||||
unsigned int num_formats,
|
||||
const uint64_t *modifiers);
|
||||
|
||||
struct drm_crtc *
|
||||
drm_kunit_helper_create_crtc(struct kunit *test,
|
||||
struct drm_device *drm,
|
||||
struct drm_plane *primary,
|
||||
struct drm_plane *cursor,
|
||||
const struct drm_crtc_funcs *funcs,
|
||||
const struct drm_crtc_helper_funcs *helper_funcs);
|
||||
|
||||
#endif // DRM_KUNIT_HELPERS_H_
|
||||
|
||||
@@ -45,6 +45,10 @@ int __must_check __drmm_add_action_or_reset(struct drm_device *dev,
|
||||
drmres_release_t action,
|
||||
void *data, const char *name);
|
||||
|
||||
void drmm_release_action(struct drm_device *dev,
|
||||
drmres_release_t action,
|
||||
void *data);
|
||||
|
||||
void *drmm_kmalloc(struct drm_device *dev, size_t size, gfp_t gfp) __malloc;
|
||||
|
||||
/**
|
||||
|
||||
@@ -467,6 +467,8 @@ bool drm_mode_is_420_also(const struct drm_display_info *display,
|
||||
const struct drm_display_mode *mode);
|
||||
bool drm_mode_is_420(const struct drm_display_info *display,
|
||||
const struct drm_display_mode *mode);
|
||||
void drm_set_preferred_mode(struct drm_connector *connector,
|
||||
int hpref, int vpref);
|
||||
|
||||
struct drm_display_mode *drm_analog_tv_mode(struct drm_device *dev,
|
||||
enum drm_connector_tv_mode mode,
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
|
||||
#include <drm/drm.h>
|
||||
|
||||
struct drm_device;
|
||||
|
||||
/* Do *not* use outside of drm_print.[ch]! */
|
||||
extern unsigned long __drm_debug;
|
||||
|
||||
@@ -67,6 +69,101 @@ extern unsigned long __drm_debug;
|
||||
* }
|
||||
*/
|
||||
|
||||
/**
|
||||
* enum drm_debug_category - The DRM debug categories
|
||||
*
|
||||
* Each of the DRM debug logging macros use a specific category, and the logging
|
||||
* is filtered by the drm.debug module parameter. This enum specifies the values
|
||||
* for the interface.
|
||||
*
|
||||
* Each DRM_DEBUG_<CATEGORY> macro logs to DRM_UT_<CATEGORY> category, except
|
||||
* DRM_DEBUG() logs to DRM_UT_CORE.
|
||||
*
|
||||
* 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=0x1ff 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
|
||||
*
|
||||
*/
|
||||
enum drm_debug_category {
|
||||
/* These names must match those in DYNAMIC_DEBUG_CLASSBITS */
|
||||
/**
|
||||
* @DRM_UT_CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c,
|
||||
* drm_memory.c, ...
|
||||
*/
|
||||
DRM_UT_CORE,
|
||||
/**
|
||||
* @DRM_UT_DRIVER: Used in the vendor specific part of the driver: i915,
|
||||
* radeon, ... macro.
|
||||
*/
|
||||
DRM_UT_DRIVER,
|
||||
/**
|
||||
* @DRM_UT_KMS: Used in the modesetting code.
|
||||
*/
|
||||
DRM_UT_KMS,
|
||||
/**
|
||||
* @DRM_UT_PRIME: Used in the prime code.
|
||||
*/
|
||||
DRM_UT_PRIME,
|
||||
/**
|
||||
* @DRM_UT_ATOMIC: Used in the atomic code.
|
||||
*/
|
||||
DRM_UT_ATOMIC,
|
||||
/**
|
||||
* @DRM_UT_VBL: Used for verbose debug message in the vblank code.
|
||||
*/
|
||||
DRM_UT_VBL,
|
||||
/**
|
||||
* @DRM_UT_STATE: Used for verbose atomic state debugging.
|
||||
*/
|
||||
DRM_UT_STATE,
|
||||
/**
|
||||
* @DRM_UT_LEASE: Used in the lease code.
|
||||
*/
|
||||
DRM_UT_LEASE,
|
||||
/**
|
||||
* @DRM_UT_DP: Used in the DP code.
|
||||
*/
|
||||
DRM_UT_DP,
|
||||
/**
|
||||
* @DRM_UT_DRMRES: Used in the drm managed resources code.
|
||||
*/
|
||||
DRM_UT_DRMRES
|
||||
};
|
||||
|
||||
static inline bool drm_debug_enabled_raw(enum drm_debug_category category)
|
||||
{
|
||||
return unlikely(__drm_debug & BIT(category));
|
||||
}
|
||||
|
||||
#define drm_debug_enabled_instrumented(category) \
|
||||
({ \
|
||||
pr_debug("todo: is this frequent enough to optimize ?\n"); \
|
||||
drm_debug_enabled_raw(category); \
|
||||
})
|
||||
|
||||
#if defined(CONFIG_DRM_USE_DYNAMIC_DEBUG)
|
||||
/*
|
||||
* the drm.debug API uses dyndbg, so each drm_*dbg macro/callsite gets
|
||||
* a descriptor, and only enabled callsites are reachable. They use
|
||||
* the private macro to avoid re-testing the enable-bit.
|
||||
*/
|
||||
#define __drm_debug_enabled(category) true
|
||||
#define drm_debug_enabled(category) drm_debug_enabled_instrumented(category)
|
||||
#else
|
||||
#define __drm_debug_enabled(category) drm_debug_enabled_raw(category)
|
||||
#define drm_debug_enabled(category) drm_debug_enabled_raw(category)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct drm_printer - drm output "stream"
|
||||
*
|
||||
@@ -79,6 +176,7 @@ struct drm_printer {
|
||||
void (*puts)(struct drm_printer *p, const char *str);
|
||||
void *arg;
|
||||
const char *prefix;
|
||||
enum drm_debug_category category;
|
||||
};
|
||||
|
||||
void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf);
|
||||
@@ -86,7 +184,7 @@ void __drm_puts_coredump(struct drm_printer *p, const char *str);
|
||||
void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf);
|
||||
void __drm_puts_seq_file(struct drm_printer *p, const char *str);
|
||||
void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf);
|
||||
void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf);
|
||||
void __drm_printfn_dbg(struct drm_printer *p, struct va_format *vaf);
|
||||
void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf);
|
||||
|
||||
__printf(2, 3)
|
||||
@@ -219,132 +317,46 @@ static inline struct drm_printer drm_info_printer(struct device *dev)
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_debug_printer - construct a &drm_printer that outputs to pr_debug()
|
||||
* @prefix: debug output prefix
|
||||
* drm_dbg_printer - construct a &drm_printer for drm device specific output
|
||||
* @drm: the &struct drm_device pointer, or NULL
|
||||
* @category: the debug category to use
|
||||
* @prefix: debug output prefix, or NULL for no prefix
|
||||
*
|
||||
* RETURNS:
|
||||
* The &drm_printer object
|
||||
*/
|
||||
static inline struct drm_printer drm_debug_printer(const char *prefix)
|
||||
static inline struct drm_printer drm_dbg_printer(struct drm_device *drm,
|
||||
enum drm_debug_category category,
|
||||
const char *prefix)
|
||||
{
|
||||
struct drm_printer p = {
|
||||
.printfn = __drm_printfn_debug,
|
||||
.prefix = prefix
|
||||
.printfn = __drm_printfn_dbg,
|
||||
.arg = drm,
|
||||
.prefix = prefix,
|
||||
.category = category,
|
||||
};
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_err_printer - construct a &drm_printer that outputs to pr_err()
|
||||
* @prefix: debug output prefix
|
||||
* drm_err_printer - construct a &drm_printer that outputs to drm_err()
|
||||
* @drm: the &struct drm_device pointer
|
||||
* @prefix: debug output prefix, or NULL for no prefix
|
||||
*
|
||||
* RETURNS:
|
||||
* The &drm_printer object
|
||||
*/
|
||||
static inline struct drm_printer drm_err_printer(const char *prefix)
|
||||
static inline struct drm_printer drm_err_printer(struct drm_device *drm,
|
||||
const char *prefix)
|
||||
{
|
||||
struct drm_printer p = {
|
||||
.printfn = __drm_printfn_err,
|
||||
.arg = drm,
|
||||
.prefix = prefix
|
||||
};
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* enum drm_debug_category - The DRM debug categories
|
||||
*
|
||||
* Each of the DRM debug logging macros use a specific category, and the logging
|
||||
* is filtered by the drm.debug module parameter. This enum specifies the values
|
||||
* for the interface.
|
||||
*
|
||||
* Each DRM_DEBUG_<CATEGORY> macro logs to DRM_UT_<CATEGORY> category, except
|
||||
* DRM_DEBUG() logs to DRM_UT_CORE.
|
||||
*
|
||||
* 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=0x1ff 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
|
||||
*
|
||||
*/
|
||||
enum drm_debug_category {
|
||||
/* These names must match those in DYNAMIC_DEBUG_CLASSBITS */
|
||||
/**
|
||||
* @DRM_UT_CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c,
|
||||
* drm_memory.c, ...
|
||||
*/
|
||||
DRM_UT_CORE,
|
||||
/**
|
||||
* @DRM_UT_DRIVER: Used in the vendor specific part of the driver: i915,
|
||||
* radeon, ... macro.
|
||||
*/
|
||||
DRM_UT_DRIVER,
|
||||
/**
|
||||
* @DRM_UT_KMS: Used in the modesetting code.
|
||||
*/
|
||||
DRM_UT_KMS,
|
||||
/**
|
||||
* @DRM_UT_PRIME: Used in the prime code.
|
||||
*/
|
||||
DRM_UT_PRIME,
|
||||
/**
|
||||
* @DRM_UT_ATOMIC: Used in the atomic code.
|
||||
*/
|
||||
DRM_UT_ATOMIC,
|
||||
/**
|
||||
* @DRM_UT_VBL: Used for verbose debug message in the vblank code.
|
||||
*/
|
||||
DRM_UT_VBL,
|
||||
/**
|
||||
* @DRM_UT_STATE: Used for verbose atomic state debugging.
|
||||
*/
|
||||
DRM_UT_STATE,
|
||||
/**
|
||||
* @DRM_UT_LEASE: Used in the lease code.
|
||||
*/
|
||||
DRM_UT_LEASE,
|
||||
/**
|
||||
* @DRM_UT_DP: Used in the DP code.
|
||||
*/
|
||||
DRM_UT_DP,
|
||||
/**
|
||||
* @DRM_UT_DRMRES: Used in the drm managed resources code.
|
||||
*/
|
||||
DRM_UT_DRMRES
|
||||
};
|
||||
|
||||
static inline bool drm_debug_enabled_raw(enum drm_debug_category category)
|
||||
{
|
||||
return unlikely(__drm_debug & BIT(category));
|
||||
}
|
||||
|
||||
#define drm_debug_enabled_instrumented(category) \
|
||||
({ \
|
||||
pr_debug("todo: is this frequent enough to optimize ?\n"); \
|
||||
drm_debug_enabled_raw(category); \
|
||||
})
|
||||
|
||||
#if defined(CONFIG_DRM_USE_DYNAMIC_DEBUG)
|
||||
/*
|
||||
* the drm.debug API uses dyndbg, so each drm_*dbg macro/callsite gets
|
||||
* a descriptor, and only enabled callsites are reachable. They use
|
||||
* the private macro to avoid re-testing the enable-bit.
|
||||
*/
|
||||
#define __drm_debug_enabled(category) true
|
||||
#define drm_debug_enabled(category) drm_debug_enabled_instrumented(category)
|
||||
#else
|
||||
#define __drm_debug_enabled(category) drm_debug_enabled_raw(category)
|
||||
#define drm_debug_enabled(category) drm_debug_enabled_raw(category)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* struct device based logging
|
||||
*
|
||||
@@ -602,6 +614,9 @@ void __drm_err(const char *format, ...);
|
||||
drm_dev_printk(drm_ ? drm_->dev : NULL, KERN_DEBUG, fmt, ## __VA_ARGS__); \
|
||||
})
|
||||
|
||||
#define drm_dbg_ratelimited(drm, fmt, ...) \
|
||||
__DRM_DEFINE_DBG_RATELIMITED(DRIVER, drm, fmt, ## __VA_ARGS__)
|
||||
|
||||
#define drm_dbg_kms_ratelimited(drm, fmt, ...) \
|
||||
__DRM_DEFINE_DBG_RATELIMITED(KMS, drm, fmt, ## __VA_ARGS__)
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ enum drm_mode_status drm_crtc_helper_mode_valid_fixed(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
const struct drm_display_mode *fixed_mode);
|
||||
|
||||
int drm_connector_helper_get_modes_from_ddc(struct drm_connector *connector);
|
||||
int drm_connector_helper_get_modes_fixed(struct drm_connector *connector,
|
||||
const struct drm_display_mode *fixed_mode);
|
||||
int drm_connector_helper_get_modes(struct drm_connector *connector);
|
||||
|
||||
@@ -129,7 +129,7 @@ static inline void drm_rect_adjust_size(struct drm_rect *r, int dw, int dh)
|
||||
|
||||
/**
|
||||
* drm_rect_translate - translate the rectangle
|
||||
* @r: rectangle to be tranlated
|
||||
* @r: rectangle to be translated
|
||||
* @dx: horizontal translation
|
||||
* @dy: vertical translation
|
||||
*
|
||||
@@ -146,7 +146,7 @@ static inline void drm_rect_translate(struct drm_rect *r, int dx, int dy)
|
||||
|
||||
/**
|
||||
* drm_rect_translate_to - translate the rectangle to an absolute position
|
||||
* @r: rectangle to be tranlated
|
||||
* @r: rectangle to be translated
|
||||
* @x: horizontal position
|
||||
* @y: vertical position
|
||||
*
|
||||
|
||||
@@ -672,7 +672,9 @@
|
||||
#define INTEL_ADLN_IDS(info) \
|
||||
INTEL_VGA_DEVICE(0x46D0, info), \
|
||||
INTEL_VGA_DEVICE(0x46D1, info), \
|
||||
INTEL_VGA_DEVICE(0x46D2, info)
|
||||
INTEL_VGA_DEVICE(0x46D2, info), \
|
||||
INTEL_VGA_DEVICE(0x46D3, info), \
|
||||
INTEL_VGA_DEVICE(0x46D4, info)
|
||||
|
||||
/* RPL-S */
|
||||
#define INTEL_RPLS_IDS(info) \
|
||||
@@ -751,10 +753,13 @@
|
||||
/* MTL */
|
||||
#define INTEL_MTL_IDS(info) \
|
||||
INTEL_VGA_DEVICE(0x7D40, info), \
|
||||
INTEL_VGA_DEVICE(0x7D41, info), \
|
||||
INTEL_VGA_DEVICE(0x7D45, info), \
|
||||
INTEL_VGA_DEVICE(0x7D51, info), \
|
||||
INTEL_VGA_DEVICE(0x7D55, info), \
|
||||
INTEL_VGA_DEVICE(0x7D60, info), \
|
||||
INTEL_VGA_DEVICE(0x7D67, info), \
|
||||
INTEL_VGA_DEVICE(0x7DD1, info), \
|
||||
INTEL_VGA_DEVICE(0x7DD5, info)
|
||||
|
||||
#endif /* _I915_PCIIDS_H */
|
||||
|
||||
@@ -64,6 +64,12 @@
|
||||
/* For multihop handling */
|
||||
#define TTM_PL_FLAG_TEMPORARY (1 << 2)
|
||||
|
||||
/* Placement is never used during eviction */
|
||||
#define TTM_PL_FLAG_DESIRED (1 << 3)
|
||||
|
||||
/* Placement is only used during eviction */
|
||||
#define TTM_PL_FLAG_FALLBACK (1 << 4)
|
||||
|
||||
/**
|
||||
* struct ttm_place
|
||||
*
|
||||
@@ -86,16 +92,12 @@ struct ttm_place {
|
||||
*
|
||||
* @num_placement: number of preferred placements
|
||||
* @placement: preferred placements
|
||||
* @num_busy_placement: number of preferred placements when need to evict buffer
|
||||
* @busy_placement: preferred placements when need to evict buffer
|
||||
*
|
||||
* Structure indicating the placement you request for an object.
|
||||
*/
|
||||
struct ttm_placement {
|
||||
unsigned num_placement;
|
||||
const struct ttm_place *placement;
|
||||
unsigned num_busy_placement;
|
||||
const struct ttm_place *busy_placement;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -365,12 +365,8 @@ bool ttm_resource_intersects(struct ttm_device *bdev,
|
||||
struct ttm_resource *res,
|
||||
const struct ttm_place *place,
|
||||
size_t size);
|
||||
bool ttm_resource_compatible(struct ttm_device *bdev,
|
||||
struct ttm_resource *res,
|
||||
const struct ttm_place *place,
|
||||
size_t size);
|
||||
bool ttm_resource_compat(struct ttm_resource *res,
|
||||
struct ttm_placement *placement);
|
||||
bool ttm_resource_compatible(struct ttm_resource *res,
|
||||
struct ttm_placement *placement);
|
||||
void ttm_resource_set_bo(struct ttm_resource *res,
|
||||
struct ttm_buffer_object *bo);
|
||||
|
||||
|
||||
@@ -79,6 +79,12 @@ struct ttm_tt {
|
||||
* page_flags = TTM_TT_FLAG_EXTERNAL |
|
||||
* TTM_TT_FLAG_EXTERNAL_MAPPABLE;
|
||||
*
|
||||
* TTM_TT_FLAG_DECRYPTED: The mapped ttm pages should be marked as
|
||||
* not encrypted. The framework will try to match what the dma layer
|
||||
* is doing, but note that it is a little fragile because ttm page
|
||||
* fault handling abuses the DMA api a bit and dma_map_attrs can't be
|
||||
* used to assure pgprot always matches.
|
||||
*
|
||||
* TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is
|
||||
* set by TTM after ttm_tt_populate() has successfully returned, and is
|
||||
* then unset when TTM calls ttm_tt_unpopulate().
|
||||
@@ -87,8 +93,9 @@ struct ttm_tt {
|
||||
#define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
|
||||
#define TTM_TT_FLAG_EXTERNAL BIT(2)
|
||||
#define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
|
||||
#define TTM_TT_FLAG_DECRYPTED BIT(4)
|
||||
|
||||
#define TTM_TT_FLAG_PRIV_POPULATED BIT(4)
|
||||
#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
|
||||
uint32_t page_flags;
|
||||
/** @num_pages: Number of pages in the page array. */
|
||||
uint32_t num_pages;
|
||||
|
||||
Reference in New Issue
Block a user