cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_fourcc.h (9933B)


      1/*
      2 * Copyright (c) 2016 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
      3 *
      4 * Permission to use, copy, modify, distribute, and sell this software and its
      5 * documentation for any purpose is hereby granted without fee, provided that
      6 * the above copyright notice appear in all copies and that both that copyright
      7 * notice and this permission notice appear in supporting documentation, and
      8 * that the name of the copyright holders not be used in advertising or
      9 * publicity pertaining to distribution of the software without specific,
     10 * written prior permission.  The copyright holders make no representations
     11 * about the suitability of this software for any purpose.  It is provided "as
     12 * is" without express or implied warranty.
     13 *
     14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     20 * OF THIS SOFTWARE.
     21 */
     22#ifndef __DRM_FOURCC_H__
     23#define __DRM_FOURCC_H__
     24
     25#include <linux/types.h>
     26#include <uapi/drm/drm_fourcc.h>
     27
     28/**
     29 * DRM_FORMAT_MAX_PLANES - maximum number of planes a DRM format can have
     30 */
     31#define DRM_FORMAT_MAX_PLANES	4u
     32
     33/*
     34 * DRM formats are little endian.  Define host endian variants for the
     35 * most common formats here, to reduce the #ifdefs needed in drivers.
     36 *
     37 * Note that the DRM_FORMAT_BIG_ENDIAN flag should only be used in
     38 * case the format can't be specified otherwise, so we don't end up
     39 * with two values describing the same format.
     40 */
     41#ifdef __BIG_ENDIAN
     42# define DRM_FORMAT_HOST_XRGB1555     (DRM_FORMAT_XRGB1555         |	\
     43				       DRM_FORMAT_BIG_ENDIAN)
     44# define DRM_FORMAT_HOST_RGB565       (DRM_FORMAT_RGB565           |	\
     45				       DRM_FORMAT_BIG_ENDIAN)
     46# define DRM_FORMAT_HOST_XRGB8888     DRM_FORMAT_BGRX8888
     47# define DRM_FORMAT_HOST_ARGB8888     DRM_FORMAT_BGRA8888
     48#else
     49# define DRM_FORMAT_HOST_XRGB1555     DRM_FORMAT_XRGB1555
     50# define DRM_FORMAT_HOST_RGB565       DRM_FORMAT_RGB565
     51# define DRM_FORMAT_HOST_XRGB8888     DRM_FORMAT_XRGB8888
     52# define DRM_FORMAT_HOST_ARGB8888     DRM_FORMAT_ARGB8888
     53#endif
     54
     55struct drm_device;
     56struct drm_mode_fb_cmd2;
     57
     58/**
     59 * struct drm_format_info - information about a DRM format
     60 */
     61struct drm_format_info {
     62	/** @format: 4CC format identifier (DRM_FORMAT_*) */
     63	u32 format;
     64
     65	/**
     66	 * @depth:
     67	 *
     68	 * Color depth (number of bits per pixel excluding padding bits),
     69	 * valid for a subset of RGB formats only. This is a legacy field, do
     70	 * not use in new code and set to 0 for new formats.
     71	 */
     72	u8 depth;
     73
     74	/** @num_planes: Number of color planes (1 to 3) */
     75	u8 num_planes;
     76
     77	union {
     78		/**
     79		 * @cpp:
     80		 *
     81		 * Number of bytes per pixel (per plane), this is aliased with
     82		 * @char_per_block. It is deprecated in favour of using the
     83		 * triplet @char_per_block, @block_w, @block_h for better
     84		 * describing the pixel format.
     85		 */
     86		u8 cpp[DRM_FORMAT_MAX_PLANES];
     87
     88		/**
     89		 * @char_per_block:
     90		 *
     91		 * Number of bytes per block (per plane), where blocks are
     92		 * defined as a rectangle of pixels which are stored next to
     93		 * each other in a byte aligned memory region. Together with
     94		 * @block_w and @block_h this is used to properly describe tiles
     95		 * in tiled formats or to describe groups of pixels in packed
     96		 * formats for which the memory needed for a single pixel is not
     97		 * byte aligned.
     98		 *
     99		 * @cpp has been kept for historical reasons because there are
    100		 * a lot of places in drivers where it's used. In drm core for
    101		 * generic code paths the preferred way is to use
    102		 * @char_per_block, drm_format_info_block_width() and
    103		 * drm_format_info_block_height() which allows handling both
    104		 * block and non-block formats in the same way.
    105		 *
    106		 * For formats that are intended to be used only with non-linear
    107		 * modifiers both @cpp and @char_per_block must be 0 in the
    108		 * generic format table. Drivers could supply accurate
    109		 * information from their drm_mode_config.get_format_info hook
    110		 * if they want the core to be validating the pitch.
    111		 */
    112		u8 char_per_block[DRM_FORMAT_MAX_PLANES];
    113	};
    114
    115	/**
    116	 * @block_w:
    117	 *
    118	 * Block width in pixels, this is intended to be accessed through
    119	 * drm_format_info_block_width()
    120	 */
    121	u8 block_w[DRM_FORMAT_MAX_PLANES];
    122
    123	/**
    124	 * @block_h:
    125	 *
    126	 * Block height in pixels, this is intended to be accessed through
    127	 * drm_format_info_block_height()
    128	 */
    129	u8 block_h[DRM_FORMAT_MAX_PLANES];
    130
    131	/** @hsub: Horizontal chroma subsampling factor */
    132	u8 hsub;
    133	/** @vsub: Vertical chroma subsampling factor */
    134	u8 vsub;
    135
    136	/** @has_alpha: Does the format embeds an alpha component? */
    137	bool has_alpha;
    138
    139	/** @is_yuv: Is it a YUV format? */
    140	bool is_yuv;
    141};
    142
    143/**
    144 * drm_format_info_is_yuv_packed - check that the format info matches a YUV
    145 * format with data laid in a single plane
    146 * @info: format info
    147 *
    148 * Returns:
    149 * A boolean indicating whether the format info matches a packed YUV format.
    150 */
    151static inline bool
    152drm_format_info_is_yuv_packed(const struct drm_format_info *info)
    153{
    154	return info->is_yuv && info->num_planes == 1;
    155}
    156
    157/**
    158 * drm_format_info_is_yuv_semiplanar - check that the format info matches a YUV
    159 * format with data laid in two planes (luminance and chrominance)
    160 * @info: format info
    161 *
    162 * Returns:
    163 * A boolean indicating whether the format info matches a semiplanar YUV format.
    164 */
    165static inline bool
    166drm_format_info_is_yuv_semiplanar(const struct drm_format_info *info)
    167{
    168	return info->is_yuv && info->num_planes == 2;
    169}
    170
    171/**
    172 * drm_format_info_is_yuv_planar - check that the format info matches a YUV
    173 * format with data laid in three planes (one for each YUV component)
    174 * @info: format info
    175 *
    176 * Returns:
    177 * A boolean indicating whether the format info matches a planar YUV format.
    178 */
    179static inline bool
    180drm_format_info_is_yuv_planar(const struct drm_format_info *info)
    181{
    182	return info->is_yuv && info->num_planes == 3;
    183}
    184
    185/**
    186 * drm_format_info_is_yuv_sampling_410 - check that the format info matches a
    187 * YUV format with 4:1:0 sub-sampling
    188 * @info: format info
    189 *
    190 * Returns:
    191 * A boolean indicating whether the format info matches a YUV format with 4:1:0
    192 * sub-sampling.
    193 */
    194static inline bool
    195drm_format_info_is_yuv_sampling_410(const struct drm_format_info *info)
    196{
    197	return info->is_yuv && info->hsub == 4 && info->vsub == 4;
    198}
    199
    200/**
    201 * drm_format_info_is_yuv_sampling_411 - check that the format info matches a
    202 * YUV format with 4:1:1 sub-sampling
    203 * @info: format info
    204 *
    205 * Returns:
    206 * A boolean indicating whether the format info matches a YUV format with 4:1:1
    207 * sub-sampling.
    208 */
    209static inline bool
    210drm_format_info_is_yuv_sampling_411(const struct drm_format_info *info)
    211{
    212	return info->is_yuv && info->hsub == 4 && info->vsub == 1;
    213}
    214
    215/**
    216 * drm_format_info_is_yuv_sampling_420 - check that the format info matches a
    217 * YUV format with 4:2:0 sub-sampling
    218 * @info: format info
    219 *
    220 * Returns:
    221 * A boolean indicating whether the format info matches a YUV format with 4:2:0
    222 * sub-sampling.
    223 */
    224static inline bool
    225drm_format_info_is_yuv_sampling_420(const struct drm_format_info *info)
    226{
    227	return info->is_yuv && info->hsub == 2 && info->vsub == 2;
    228}
    229
    230/**
    231 * drm_format_info_is_yuv_sampling_422 - check that the format info matches a
    232 * YUV format with 4:2:2 sub-sampling
    233 * @info: format info
    234 *
    235 * Returns:
    236 * A boolean indicating whether the format info matches a YUV format with 4:2:2
    237 * sub-sampling.
    238 */
    239static inline bool
    240drm_format_info_is_yuv_sampling_422(const struct drm_format_info *info)
    241{
    242	return info->is_yuv && info->hsub == 2 && info->vsub == 1;
    243}
    244
    245/**
    246 * drm_format_info_is_yuv_sampling_444 - check that the format info matches a
    247 * YUV format with 4:4:4 sub-sampling
    248 * @info: format info
    249 *
    250 * Returns:
    251 * A boolean indicating whether the format info matches a YUV format with 4:4:4
    252 * sub-sampling.
    253 */
    254static inline bool
    255drm_format_info_is_yuv_sampling_444(const struct drm_format_info *info)
    256{
    257	return info->is_yuv && info->hsub == 1 && info->vsub == 1;
    258}
    259
    260/**
    261 * drm_format_info_plane_width - width of the plane given the first plane
    262 * @info: pixel format info
    263 * @width: width of the first plane
    264 * @plane: plane index
    265 *
    266 * Returns:
    267 * The width of @plane, given that the width of the first plane is @width.
    268 */
    269static inline
    270int drm_format_info_plane_width(const struct drm_format_info *info, int width,
    271				int plane)
    272{
    273	if (!info || plane >= info->num_planes)
    274		return 0;
    275
    276	if (plane == 0)
    277		return width;
    278
    279	return width / info->hsub;
    280}
    281
    282/**
    283 * drm_format_info_plane_height - height of the plane given the first plane
    284 * @info: pixel format info
    285 * @height: height of the first plane
    286 * @plane: plane index
    287 *
    288 * Returns:
    289 * The height of @plane, given that the height of the first plane is @height.
    290 */
    291static inline
    292int drm_format_info_plane_height(const struct drm_format_info *info, int height,
    293				 int plane)
    294{
    295	if (!info || plane >= info->num_planes)
    296		return 0;
    297
    298	if (plane == 0)
    299		return height;
    300
    301	return height / info->vsub;
    302}
    303
    304const struct drm_format_info *__drm_format_info(u32 format);
    305const struct drm_format_info *drm_format_info(u32 format);
    306const struct drm_format_info *
    307drm_get_format_info(struct drm_device *dev,
    308		    const struct drm_mode_fb_cmd2 *mode_cmd);
    309uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
    310uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
    311				     uint32_t bpp, uint32_t depth);
    312unsigned int drm_format_info_block_width(const struct drm_format_info *info,
    313					 int plane);
    314unsigned int drm_format_info_block_height(const struct drm_format_info *info,
    315					  int plane);
    316uint64_t drm_format_info_min_pitch(const struct drm_format_info *info,
    317				   int plane, unsigned int buffer_width);
    318
    319#endif /* __DRM_FOURCC_H__ */