linux/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h
<<
>>
Prefs
   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
 102