Merge tag 'perf-core-for-mingo-5.4-20190822' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / arm / display / komeda / komeda_format_caps.h
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  */
58 struct 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  */
76 struct 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
83 extern u64 komeda_supported_modifiers[];
84
85 static inline const char *komeda_get_format_name(u32 fourcc, u64 modifier)
86 {
87         struct drm_format_name_buf buf;
88         static char name[64];
89
90         snprintf(name, sizeof(name), "%s with modifier: 0x%llx.",
91                  drm_get_format_name(fourcc, &buf), modifier);
92
93         return name;
94 }
95
96 const struct komeda_format_caps *
97 komeda_get_format_caps(struct komeda_format_caps_table *table,
98                        u32 fourcc, u64 modifier);
99
100 u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table,
101                                   u32 layer_type, u32 *n_fmts);
102
103 void komeda_put_fourcc_list(u32 *fourcc_list);
104
105 bool komeda_format_mod_supported(struct komeda_format_caps_table *table,
106                                  u32 layer_type, u32 fourcc, u64 modifier,
107                                  u32 rot);
108
109 #endif