drm/msm: Add SDM845 DPU support
SDM845 SoC includes the Mobile Display Sub System (MDSS) which is a top level wrapper consisting of Display Processing Unit (DPU) and display peripheral modules such as Display Serial Interface (DSI) and DisplayPort (DP). MDSS functions essentially as a back-end composition engine. It blends video and graphic images stored in the frame buffers and scans out the composed image to a display sink (over DSI/DP). The following diagram represents hardware blocks for a simple pipeline (two planes are present on a given crtc which is connected to a DSI connector): MDSS +---------------------------------+ | +-----------------------------+ | | | DPU | | | | +--------+ +--------+ | | | | | SSPP | | SSPP | | | | | +----+---+ +----+---+ | | | | | | | | | | +----v-----------v---+ | | | | | Layer Mixer (LM) | | | | | +--------------------+ | | | | +--------------------+ | | | | | PingPong (PP) | | | | | +--------------------+ | | | | +--------------------+ | | | | | INTERFACE (VIDEO) | | | | | +---+----------------+ | | | +------|----------------------+ | | | | | +------|---------------------+ | | | | DISPLAY PERIPHERALS | | | | +---v-+ +-----+ | | | | | DSI | | DP | | | | | +-----+ +-----+ | | | +----------------------------+ | +---------------------------------+ The number of DPU sub-blocks (i.e. SSPPs, LMs, PP blocks and INTFs) depends on SoC capabilities. Overview of DPU sub-blocks: --------------------------- * Source Surface Processor (SSPP): Refers to any of hardware pipes like ViG, DMA etc. Only ViG pipes are capable of performing format conversion, scaling and quality improvement for source surfaces. * Layer Mixer (LM): Blend source surfaces together (in requested zorder) * PingPong (PP): This block controls frame done interrupt output, EOL and EOF generation, overflow/underflow control. * Display interface (INTF): Timing generator and interface connecting the display peripherals. DRM components mapping to DPU architecture: ------------------------------------------ PLANEs maps to SSPPs CRTC maps to LMs Encoder maps to PPs, INTFs Data flow setup: --------------- MDSS hardware can support various data flows (e.g.): - Dual pipe: Output from two LMs combined to single display. - Split display: Output from two LMs connected to two separate interfaces. The hardware capabilities determine the number of concurrent data paths possible. Any control path (i.e. pipeline w/i DPU) can be routed to any of the hardware data paths. A given control path can be triggered, flushed and controlled independently. Changes in v3: - Move msm_media_info.h from uapi to dpu/ subdir - Remove preclose callback dpu (it's handled in core) - Fix kbuild warnings with parent_ops - Remove unused functions from dpu_core_irq - Rename mdss_phys to mdss - Rename mdp_phys address space to mdp - Drop _phys from vbif and regdma binding names Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org> Signed-off-by: Archit Taneja <architt@codeaurora.org> Signed-off-by: Chandan Uddaraju <chandanu@codeaurora.org> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rajesh Yadav <ryadav@codeaurora.org> Signed-off-by: Sravanthi Kollukuduru <skolluku@codeaurora.org> Signed-off-by: Sean Paul <seanpaul@chromium.org> [robclark minor rebase] Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:

committed by
Sean Paul

parent
036bfeb33b
commit
25fdd5933e
@@ -1,4 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (C) 2013 Red Hat
|
||||
* Author: Rob Clark <robdclark@gmail.com>
|
||||
*
|
||||
@@ -33,6 +34,7 @@
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <linux/kthread.h>
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_atomic.h>
|
||||
@@ -55,7 +57,7 @@ struct msm_gem_address_space;
|
||||
struct msm_gem_vma;
|
||||
|
||||
#define MAX_CRTCS 8
|
||||
#define MAX_PLANES 16
|
||||
#define MAX_PLANES 20
|
||||
#define MAX_ENCODERS 8
|
||||
#define MAX_BRIDGES 8
|
||||
#define MAX_CONNECTORS 8
|
||||
@@ -74,12 +76,77 @@ enum msm_mdp_plane_property {
|
||||
};
|
||||
|
||||
struct msm_vblank_ctrl {
|
||||
struct work_struct work;
|
||||
struct kthread_work work;
|
||||
struct list_head event_list;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
#define MSM_GPU_MAX_RINGS 4
|
||||
#define MAX_H_TILES_PER_DISPLAY 2
|
||||
|
||||
/**
|
||||
* enum msm_display_caps - features/capabilities supported by displays
|
||||
* @MSM_DISPLAY_CAP_VID_MODE: Video or "active" mode supported
|
||||
* @MSM_DISPLAY_CAP_CMD_MODE: Command mode supported
|
||||
* @MSM_DISPLAY_CAP_HOT_PLUG: Hot plug detection supported
|
||||
* @MSM_DISPLAY_CAP_EDID: EDID supported
|
||||
*/
|
||||
enum msm_display_caps {
|
||||
MSM_DISPLAY_CAP_VID_MODE = BIT(0),
|
||||
MSM_DISPLAY_CAP_CMD_MODE = BIT(1),
|
||||
MSM_DISPLAY_CAP_HOT_PLUG = BIT(2),
|
||||
MSM_DISPLAY_CAP_EDID = BIT(3),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum msm_event_wait - type of HW events to wait for
|
||||
* @MSM_ENC_COMMIT_DONE - wait for the driver to flush the registers to HW
|
||||
* @MSM_ENC_TX_COMPLETE - wait for the HW to transfer the frame to panel
|
||||
* @MSM_ENC_VBLANK - wait for the HW VBLANK event (for driver-internal waiters)
|
||||
*/
|
||||
enum msm_event_wait {
|
||||
MSM_ENC_COMMIT_DONE = 0,
|
||||
MSM_ENC_TX_COMPLETE,
|
||||
MSM_ENC_VBLANK,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct msm_display_topology - defines a display topology pipeline
|
||||
* @num_lm: number of layer mixers used
|
||||
* @num_enc: number of compression encoder blocks used
|
||||
* @num_intf: number of interfaces the panel is mounted on
|
||||
*/
|
||||
struct msm_display_topology {
|
||||
u32 num_lm;
|
||||
u32 num_enc;
|
||||
u32 num_intf;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct msm_display_info - defines display properties
|
||||
* @intf_type: DRM_MODE_CONNECTOR_ display type
|
||||
* @capabilities: Bitmask of display flags
|
||||
* @num_of_h_tiles: Number of horizontal tiles in case of split interface
|
||||
* @h_tile_instance: Controller instance used per tile. Number of elements is
|
||||
* based on num_of_h_tiles
|
||||
* @is_te_using_watchdog_timer: Boolean to indicate watchdog TE is
|
||||
* used instead of panel TE in cmd mode panels
|
||||
*/
|
||||
struct msm_display_info {
|
||||
int intf_type;
|
||||
uint32_t capabilities;
|
||||
uint32_t num_of_h_tiles;
|
||||
uint32_t h_tile_instance[MAX_H_TILES_PER_DISPLAY];
|
||||
bool is_te_using_watchdog_timer;
|
||||
};
|
||||
|
||||
/* Commit/Event thread specific structure */
|
||||
struct msm_drm_thread {
|
||||
struct drm_device *dev;
|
||||
struct task_struct *thread;
|
||||
unsigned int crtc_id;
|
||||
struct kthread_worker worker;
|
||||
};
|
||||
|
||||
struct msm_drm_private {
|
||||
|
||||
@@ -90,7 +157,7 @@ struct msm_drm_private {
|
||||
/* subordinate devices, if present: */
|
||||
struct platform_device *gpu_pdev;
|
||||
|
||||
/* top level MDSS wrapper device (for MDP5 only) */
|
||||
/* top level MDSS wrapper device (for MDP5/DPU only) */
|
||||
struct msm_mdss *mdss;
|
||||
|
||||
/* possibly this should be in the kms component, but it is
|
||||
@@ -128,6 +195,9 @@ struct msm_drm_private {
|
||||
unsigned int num_crtcs;
|
||||
struct drm_crtc *crtcs[MAX_CRTCS];
|
||||
|
||||
struct msm_drm_thread disp_thread[MAX_CRTCS];
|
||||
struct msm_drm_thread event_thread[MAX_CRTCS];
|
||||
|
||||
unsigned int num_encoders;
|
||||
struct drm_encoder *encoders[MAX_ENCODERS];
|
||||
|
||||
@@ -180,6 +250,9 @@ struct msm_gem_address_space *
|
||||
msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
|
||||
const char *name);
|
||||
|
||||
int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu);
|
||||
void msm_unregister_mmu(struct drm_device *dev, struct msm_mmu *mmu);
|
||||
|
||||
void msm_gem_submit_free(struct msm_gem_submit *submit);
|
||||
int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
struct drm_file *file);
|
||||
@@ -291,6 +364,8 @@ static inline int msm_dsi_modeset_init(struct msm_dsi *msm_dsi,
|
||||
|
||||
void __init msm_mdp_register(void);
|
||||
void __exit msm_mdp_unregister(void);
|
||||
void __init msm_dpu_register(void);
|
||||
void __exit msm_dpu_unregister(void);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m);
|
||||
|
Reference in New Issue
Block a user