Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
  4 * Author: James.Qian.Wang <james.qian.wang@arm.com>
  5 *
  6 */
  7
  8#ifndef _KOMEDA_FORMAT_CAPS_H_
  9#define _KOMEDA_FORMAT_CAPS_H_
 10
 11#include <linux/types.h>
 12#include <uapi/drm/drm_fourcc.h>
 13#include <drm/drm_fourcc.h>
 14
 15#define AFBC(x)		DRM_FORMAT_MOD_ARM_AFBC(x)
 16
 17/* afbc layerout */
 18#define AFBC_16x16(x)	AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | (x))
 19#define AFBC_32x8(x)	AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 | (x))
 20
 21/* afbc features */
 22#define _YTR		AFBC_FORMAT_MOD_YTR
 23#define _SPLIT		AFBC_FORMAT_MOD_SPLIT
 24#define _SPARSE		AFBC_FORMAT_MOD_SPARSE
 25#define _CBR		AFBC_FORMAT_MOD_CBR
 26#define _TILED		AFBC_FORMAT_MOD_TILED
 27#define _SC		AFBC_FORMAT_MOD_SC
 28
 29/* layer_type */
 30#define KOMEDA_FMT_RICH_LAYER		BIT(0)
 31#define KOMEDA_FMT_SIMPLE_LAYER		BIT(1)
 32#define KOMEDA_FMT_WB_LAYER		BIT(2)
 33
 34#define AFBC_TH_LAYOUT_ALIGNMENT	8
 35#define AFBC_HEADER_SIZE		16
 36#define AFBC_SUPERBLK_ALIGNMENT		128
 37#define AFBC_SUPERBLK_PIXELS		256
 38#define AFBC_BODY_START_ALIGNMENT	1024
 39#define AFBC_TH_BODY_START_ALIGNMENT	4096
 40
 41/**
 42 * struct komeda_format_caps
 43 *
 44 * komeda_format_caps is for describing ARM display specific features and
 45 * limitations for a specific format, and format_caps will be linked into
 46 * &komeda_framebuffer like a extension of &drm_format_info.
 47 *
 48 * NOTE: one fourcc may has two different format_caps items for fourcc and
 49 * fourcc+modifier
 50 *
 51 * @hw_id: hw format id, hw specific value.
 52 * @fourcc: drm fourcc format.
 53 * @supported_layer_types: indicate which layer supports this format
 54 * @supported_rots: allowed rotations for this format
 55 * @supported_afbc_layouts: supported afbc layerout
 56 * @supported_afbc_features: supported afbc features
 57 */
 58struct komeda_format_caps {
 59	u32 hw_id;
 60	u32 fourcc;
 61	u32 supported_layer_types;
 62	u32 supported_rots;
 63	u32 supported_afbc_layouts;
 64	u64 supported_afbc_features;
 65};
 66
 67/**
 68 * struct komeda_format_caps_table - format_caps mananger
 69 *
 70 * @n_formats: the size of format_caps list.
 71 * @format_caps: format_caps list.
 72 * @format_mod_supported: Optional. Some HW may have special requirements or
 73 * limitations which can not be described by format_caps, this func supply HW
 74 * the ability to do the further HW specific check.
 75 */
 76struct komeda_format_caps_table {
 77	u32 n_formats;
 78	const struct komeda_format_caps *format_caps;
 79	bool (*format_mod_supported)(const struct komeda_format_caps *caps,
 80				     u32 layer_type, u64 modifier, u32 rot);
 81};
 82
 83extern u64 komeda_supported_modifiers[];
 84
 85const struct komeda_format_caps *
 86komeda_get_format_caps(struct komeda_format_caps_table *table,
 87		       u32 fourcc, u64 modifier);
 88
 89u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info,
 90			       u64 modifier);
 91
 92u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table,
 93				  u32 layer_type, u32 *n_fmts);
 94
 95void komeda_put_fourcc_list(u32 *fourcc_list);
 96
 97bool komeda_format_mod_supported(struct komeda_format_caps_table *table,
 98				 u32 layer_type, u32 fourcc, u64 modifier,
 99				 u32 rot);
100
101#endif