200 lines
5.2 KiB
C
Executable File
200 lines
5.2 KiB
C
Executable File
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __SDE_ROTATOR_UTIL_H__
|
|
#define __SDE_ROTATOR_UTIL_H__
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/file.h>
|
|
#include <linux/kref.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/device.h>
|
|
#include <linux/dma-buf.h>
|
|
|
|
#include "sde_rotator_hwio.h"
|
|
#include "sde_rotator_base.h"
|
|
#include "sde_rotator_sync.h"
|
|
#include "sde_rotator_io_util.h"
|
|
#include "sde_rotator_formats.h"
|
|
|
|
#define SDE_ROT_MAX_IMG_WIDTH 0x3FFF
|
|
#define SDE_ROT_MAX_IMG_HEIGHT 0x3FFF
|
|
|
|
#define SDEROT_DBG(fmt, ...) pr_debug("<SDEROT_DBG> " fmt, ##__VA_ARGS__)
|
|
#define SDEROT_INFO(fmt, ...) pr_info("<SDEROT_INFO> " fmt, ##__VA_ARGS__)
|
|
#define SDEROT_INFO_ONCE(fmt, ...) \
|
|
pr_info_once("<SDEROT_INFO> " fmt, ##__VA_ARGS__)
|
|
#define SDEROT_WARN(fmt, ...) pr_warn("<SDEROT_WARN> " fmt, ##__VA_ARGS__)
|
|
#define SDEROT_ERR(fmt, ...) pr_err("<SDEROT_ERR> " fmt, ##__VA_ARGS__)
|
|
#define SDEDEV_DBG(dev, fmt, ...) \
|
|
dev_dbg(dev, "<SDEROT_DBG> " fmt, ##__VA_ARGS__)
|
|
#define SDEDEV_INFO(dev, fmt, ...) \
|
|
dev_info(dev, "<SDEROT_INFO> " fmt, ##__VA_ARGS__)
|
|
#define SDEDEV_WARN(dev, fmt, ...) \
|
|
dev_warn(dev, "<SDEROT_WARN> " fmt, ##__VA_ARGS__)
|
|
#define SDEDEV_ERR(dev, fmt, ...) \
|
|
dev_err(dev, "<SDEROT_ERR> " fmt, ##__VA_ARGS__)
|
|
|
|
#define PHY_ADDR_4G (1ULL<<32)
|
|
|
|
struct sde_rect {
|
|
u16 x;
|
|
u16 y;
|
|
u16 w;
|
|
u16 h;
|
|
};
|
|
|
|
/* sde flag values */
|
|
#define SDE_ROT_NOP 0
|
|
#define SDE_FLIP_LR 0x1
|
|
#define SDE_FLIP_UD 0x2
|
|
#define SDE_ROT_90 0x4
|
|
#define SDE_ROT_180 (SDE_FLIP_UD|SDE_FLIP_LR)
|
|
#define SDE_ROT_270 (SDE_ROT_90|SDE_FLIP_UD|SDE_FLIP_LR)
|
|
#define SDE_DEINTERLACE 0x80000000
|
|
#define SDE_SOURCE_ROTATED_90 0x00100000
|
|
#define SDE_SECURE_OVERLAY_SESSION 0x00008000
|
|
#define SDE_ROT_EXT_DMA_BUF 0x00010000
|
|
#define SDE_SECURE_CAMERA_SESSION 0x00020000
|
|
#define SDE_ROT_EXT_IOVA 0x00040000
|
|
|
|
struct sde_rot_data_type;
|
|
|
|
struct sde_fb_data {
|
|
uint32_t offset;
|
|
struct dma_buf *buffer;
|
|
int memory_id;
|
|
int id;
|
|
uint32_t flags;
|
|
uint32_t priv;
|
|
dma_addr_t addr;
|
|
u32 len;
|
|
};
|
|
|
|
struct sde_layer_plane {
|
|
/* DMA buffer file descriptor information. */
|
|
int fd;
|
|
struct dma_buf *buffer;
|
|
|
|
/* i/o virtual address & length */
|
|
dma_addr_t addr;
|
|
u32 len;
|
|
|
|
/* Pixel offset in the dma buffer. */
|
|
uint32_t offset;
|
|
|
|
/* Number of bytes in one scan line including padding bytes. */
|
|
uint32_t stride;
|
|
};
|
|
|
|
struct sde_layer_buffer {
|
|
/* layer width in pixels. */
|
|
uint32_t width;
|
|
|
|
/* layer height in pixels. */
|
|
uint32_t height;
|
|
|
|
/*
|
|
* layer format in DRM-style fourcc, refer drm_fourcc.h for
|
|
* standard formats
|
|
*/
|
|
uint32_t format;
|
|
|
|
/* plane to hold the fd, offset, etc for all color components */
|
|
struct sde_layer_plane planes[SDE_ROT_MAX_PLANES];
|
|
|
|
/* valid planes count in layer planes list */
|
|
uint32_t plane_count;
|
|
|
|
/* compression ratio factor, value depends on the pixel format */
|
|
struct sde_mult_factor comp_ratio;
|
|
|
|
/*
|
|
* SyncFence associated with this buffer. It is used in two ways.
|
|
*
|
|
* 1. Driver waits to consume the buffer till producer signals in case
|
|
* of primary and external display.
|
|
*
|
|
* 2. Writeback device uses buffer structure for output buffer where
|
|
* driver is producer. However, client sends the fence with buffer to
|
|
* indicate that consumer is still using the buffer and it is not ready
|
|
* for new content.
|
|
*/
|
|
struct sde_rot_sync_fence *fence;
|
|
|
|
/* indicate if this is a stream (inline) buffer */
|
|
bool sbuf;
|
|
|
|
/* specify the system cache id in stream buffer mode */
|
|
int scid;
|
|
|
|
/* indicate if system cache writeback is required */
|
|
bool writeback;
|
|
};
|
|
|
|
struct sde_mdp_plane_sizes {
|
|
u32 num_planes;
|
|
u32 plane_size[SDE_ROT_MAX_PLANES];
|
|
u32 total_size;
|
|
u32 ystride[SDE_ROT_MAX_PLANES];
|
|
u32 rau_cnt;
|
|
u32 rau_h[2];
|
|
};
|
|
|
|
struct sde_mdp_img_data {
|
|
dma_addr_t addr;
|
|
unsigned long len;
|
|
u32 offset;
|
|
u32 flags;
|
|
bool mapped;
|
|
bool skip_detach;
|
|
struct fd srcp_f;
|
|
struct dma_buf *srcp_dma_buf;
|
|
struct dma_buf_attachment *srcp_attachment;
|
|
struct sg_table *srcp_table;
|
|
};
|
|
|
|
struct sde_mdp_data {
|
|
u8 num_planes;
|
|
struct sde_mdp_img_data p[SDE_ROT_MAX_PLANES];
|
|
bool sbuf;
|
|
int scid;
|
|
bool writeback;
|
|
};
|
|
|
|
void sde_mdp_get_v_h_subsample_rate(u8 chroma_sample,
|
|
u8 *v_sample, u8 *h_sample);
|
|
|
|
static inline u32 sde_mdp_general_align(u32 data, u32 alignment)
|
|
{
|
|
return ((data + alignment - 1)/alignment) * alignment;
|
|
}
|
|
|
|
void sde_rot_data_calc_offset(struct sde_mdp_data *data, u16 x, u16 y,
|
|
struct sde_mdp_plane_sizes *ps, struct sde_mdp_format_params *fmt);
|
|
|
|
int sde_validate_offset_for_ubwc_format(
|
|
struct sde_mdp_format_params *fmt, u16 x, u16 y);
|
|
|
|
int sde_mdp_data_get_and_validate_size(struct sde_mdp_data *data,
|
|
struct sde_fb_data *planes, int num_planes, u32 flags,
|
|
struct device *dev, bool rotator, int dir,
|
|
struct sde_layer_buffer *buffer);
|
|
|
|
int sde_mdp_get_plane_sizes(struct sde_mdp_format_params *fmt, u32 w, u32 h,
|
|
struct sde_mdp_plane_sizes *ps, u32 bwc_mode,
|
|
bool rotation);
|
|
|
|
int sde_mdp_data_map(struct sde_mdp_data *data, bool rotator, int dir);
|
|
|
|
int sde_mdp_data_check(struct sde_mdp_data *data,
|
|
struct sde_mdp_plane_sizes *ps,
|
|
struct sde_mdp_format_params *fmt);
|
|
|
|
void sde_mdp_data_free(struct sde_mdp_data *data, bool rotator, int dir);
|
|
|
|
struct dma_buf *sde_rot_get_dmabuf(struct sde_mdp_img_data *data);
|
|
#endif /* __SDE_ROTATOR_UTIL_H__ */
|