127 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2013 Red Hat4 * Author: Rob Clark <robdclark@gmail.com>5 */6 7#ifndef __MDP_KMS_H__8#define __MDP_KMS_H__9 10#include <linux/clk.h>11#include <linux/platform_device.h>12#include <linux/regulator/consumer.h>13 14#include "mdp_format.h"15#include "msm_drv.h"16#include "msm_kms.h"17#include "mdp_common.xml.h"18 19struct mdp_kms;20 21struct mdp_kms_funcs {22 struct msm_kms_funcs base;23 void (*set_irqmask)(struct mdp_kms *mdp_kms, uint32_t irqmask,24 uint32_t old_irqmask);25};26 27struct mdp_kms {28 struct msm_kms base;29 30 const struct mdp_kms_funcs *funcs;31 32 /* irq handling: */33 bool in_irq;34 struct list_head irq_list; /* list of mdp4_irq */35 uint32_t vblank_mask; /* irq bits set for userspace vblank */36 uint32_t cur_irq_mask; /* current irq mask */37};38#define to_mdp_kms(x) container_of(x, struct mdp_kms, base)39 40static inline int mdp_kms_init(struct mdp_kms *mdp_kms,41 const struct mdp_kms_funcs *funcs)42{43 mdp_kms->funcs = funcs;44 INIT_LIST_HEAD(&mdp_kms->irq_list);45 return msm_kms_init(&mdp_kms->base, &funcs->base);46}47 48static inline void mdp_kms_destroy(struct mdp_kms *mdp_kms)49{50 msm_kms_destroy(&mdp_kms->base);51}52 53/*54 * irq helpers:55 */56 57/* For transiently registering for different MDP irqs that various parts58 * of the KMS code need during setup/configuration. These are not59 * necessarily the same as what drm_vblank_get/put() are requesting, and60 * the hysteresis in drm_vblank_put() is not necessarily desirable for61 * internal housekeeping related irq usage.62 */63struct mdp_irq {64 struct list_head node;65 uint32_t irqmask;66 bool registered;67 void (*irq)(struct mdp_irq *irq, uint32_t irqstatus);68};69 70void mdp_dispatch_irqs(struct mdp_kms *mdp_kms, uint32_t status);71void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable);72void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask);73void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq);74void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq);75void mdp_irq_update(struct mdp_kms *mdp_kms);76 77/*78 * pixel format helpers:79 */80 81/* MDP capabilities */82#define MDP_CAP_SMP BIT(0) /* Shared Memory Pool */83#define MDP_CAP_DSC BIT(1) /* VESA Display Stream Compression */84#define MDP_CAP_CDM BIT(2) /* Chroma Down Module (HDMI 2.0 YUV) */85#define MDP_CAP_SRC_SPLIT BIT(3) /* Source Split of SSPPs */86 87/* MDP pipe capabilities */88#define MDP_PIPE_CAP_HFLIP BIT(0)89#define MDP_PIPE_CAP_VFLIP BIT(1)90#define MDP_PIPE_CAP_SCALE BIT(2)91#define MDP_PIPE_CAP_CSC BIT(3)92#define MDP_PIPE_CAP_DECIMATION BIT(4)93#define MDP_PIPE_CAP_SW_PIX_EXT BIT(5)94#define MDP_PIPE_CAP_CURSOR BIT(6)95 96/* MDP layer mixer caps */97#define MDP_LM_CAP_DISPLAY BIT(0)98#define MDP_LM_CAP_WB BIT(1)99#define MDP_LM_CAP_PAIR BIT(2)100 101static inline bool pipe_supports_yuv(uint32_t pipe_caps)102{103 return (pipe_caps & MDP_PIPE_CAP_SCALE) &&104 (pipe_caps & MDP_PIPE_CAP_CSC);105}106 107enum csc_type {108 CSC_RGB2RGB = 0,109 CSC_YUV2RGB,110 CSC_RGB2YUV,111 CSC_YUV2YUV,112 CSC_MAX113};114 115struct csc_cfg {116 enum csc_type type;117 uint32_t matrix[9];118 uint32_t pre_bias[3];119 uint32_t post_bias[3];120 uint32_t pre_clamp[6];121 uint32_t post_clamp[6];122};123 124struct csc_cfg *mdp_get_default_csc_cfg(enum csc_type);125 126#endif /* __MDP_KMS_H__ */127