mirror of
https://github.com/torvalds/linux.git
synced 2026-04-28 03:22:27 -04:00
Only several SSPP blocks support such features as YUV output or scaling, thus different DRM planes have different features. Properly utilizing all planes requires the attention of the compositor, who should prefer simpler planes to YUV-supporting ones. Otherwise it is very easy to end up in a situation when all featureful planes are already allocated for simple windows, leaving no spare plane for YUV playback. To solve this problem make all planes virtual. Each plane is registered as if it supports all possible features, but then at the runtime during the atomic_check phase the driver selects backing SSPP block for each plane. As the planes are attached to the CRTC and not the encoder, the SSPP blocks are also allocated per CRTC ID (all other resources are currently allocated per encoder ID). This also matches the hardware requirement, where both rectangles of a single SSPP can only be used with the LM pair. Note, this does not provide support for using two different SSPP blocks for a single plane or using two rectangles of an SSPP to drive two planes. Each plane still gets its own SSPP and can utilize either a solo rectangle or both multirect rectangles depending on the resolution. Note #2: By default support for virtual planes is turned off and the driver still uses old code path with preallocated SSPP block for each plane. To enable virtual planes, pass 'msm.dpu_use_virtual_planes=1' kernel parameter. Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/629022/ Link: https://lore.kernel.org/r/20241215-dpu-virtual-wide-v8-1-65221f213ce1@linaro.org
85 lines
2.5 KiB
C
85 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
|
|
* Copyright (C) 2013 Red Hat
|
|
* Author: Rob Clark <robdclark@gmail.com>
|
|
*/
|
|
|
|
#ifndef _DPU_PLANE_H_
|
|
#define _DPU_PLANE_H_
|
|
|
|
#include <drm/drm_crtc.h>
|
|
|
|
#include "dpu_kms.h"
|
|
#include "dpu_hw_mdss.h"
|
|
#include "dpu_hw_sspp.h"
|
|
|
|
/**
|
|
* struct dpu_plane_state: Define dpu extension of drm plane state object
|
|
* @base: base drm plane state object
|
|
* @aspace: pointer to address space for input/output buffers
|
|
* @pipe: software pipe description
|
|
* @r_pipe: software pipe description of the second pipe
|
|
* @pipe_cfg: software pipe configuration
|
|
* @r_pipe_cfg: software pipe configuration for the second pipe
|
|
* @stage: assigned by crtc blender
|
|
* @needs_qos_remap: qos remap settings need to be updated
|
|
* @multirect_index: index of the rectangle of SSPP
|
|
* @multirect_mode: parallel or time multiplex multirect mode
|
|
* @pending: whether the current update is still pending
|
|
* @plane_fetch_bw: calculated BW per plane
|
|
* @plane_clk: calculated clk per plane
|
|
* @needs_dirtyfb: whether attached CRTC needs pixel data explicitly flushed
|
|
* @layout: framebuffer memory layout
|
|
*/
|
|
struct dpu_plane_state {
|
|
struct drm_plane_state base;
|
|
struct msm_gem_address_space *aspace;
|
|
struct dpu_sw_pipe pipe;
|
|
struct dpu_sw_pipe r_pipe;
|
|
struct dpu_sw_pipe_cfg pipe_cfg;
|
|
struct dpu_sw_pipe_cfg r_pipe_cfg;
|
|
enum dpu_stage stage;
|
|
bool needs_qos_remap;
|
|
bool pending;
|
|
|
|
u64 plane_fetch_bw;
|
|
u64 plane_clk;
|
|
|
|
bool needs_dirtyfb;
|
|
|
|
struct dpu_hw_fmt_layout layout;
|
|
};
|
|
|
|
#define to_dpu_plane_state(x) \
|
|
container_of(x, struct dpu_plane_state, base)
|
|
|
|
void dpu_plane_flush(struct drm_plane *plane);
|
|
|
|
void dpu_plane_set_error(struct drm_plane *plane, bool error);
|
|
|
|
struct drm_plane *dpu_plane_init(struct drm_device *dev,
|
|
uint32_t pipe, enum drm_plane_type type,
|
|
unsigned long possible_crtcs);
|
|
|
|
struct drm_plane *dpu_plane_init_virtual(struct drm_device *dev,
|
|
enum drm_plane_type type,
|
|
unsigned long possible_crtcs);
|
|
|
|
int dpu_plane_color_fill(struct drm_plane *plane,
|
|
uint32_t color, uint32_t alpha);
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable);
|
|
#else
|
|
static inline void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable) {}
|
|
#endif
|
|
|
|
int dpu_assign_plane_resources(struct dpu_global_state *global_state,
|
|
struct drm_atomic_state *state,
|
|
struct drm_crtc *crtc,
|
|
struct drm_plane_state **states,
|
|
unsigned int num_planes);
|
|
|
|
#endif /* _DPU_PLANE_H_ */
|