root/drivers/media/platform/qcom/venus/hfi_platform.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 */

#ifndef __HFI_PLATFORM_H__
#define __HFI_PLATFORM_H__

#include <linux/types.h>
#include <linux/videodev2.h>

#include "hfi.h"
#include "hfi_plat_bufs.h"
#include "hfi_helper.h"

#define MAX_PLANES              4
#define MAX_FMT_ENTRIES         32
#define MAX_CAP_ENTRIES         32
#define MAX_ALLOC_MODE_ENTRIES  16
#define MAX_CODEC_NUM           32
#define MAX_SESSIONS            16

struct raw_formats {
        u32 buftype;
        u32 fmt;
};

struct hfi_plat_caps {
        u32 codec;
        u32 domain;
        bool cap_bufs_mode_dynamic;
        unsigned int num_caps;
        struct hfi_capability caps[MAX_CAP_ENTRIES];
        unsigned int num_pl;
        struct hfi_profile_level pl[HFI_MAX_PROFILE_COUNT];
        unsigned int num_fmts;
        struct raw_formats fmts[MAX_FMT_ENTRIES];
        bool valid;     /* used only for Venus v1xx */
};

struct hfi_platform_codec_freq_data {
        u32 pixfmt;
        u32 session_type;
        unsigned long vpp_freq;
        unsigned long vsp_freq;
        unsigned long low_power_freq;
};

struct hfi_platform {
        unsigned long (*codec_vpp_freq)(struct venus_core *core,
                                        u32 session_type, u32 codec);
        unsigned long (*codec_vsp_freq)(struct venus_core *core,
                                        u32 session_type, u32 codec);
        unsigned long (*codec_lp_freq)(struct venus_core *core,
                                       u32 session_type, u32 codec);
        void (*codecs)(struct venus_core *core, u32 *enc_codecs,
                       u32 *dec_codecs, u32 *count);
        const struct hfi_plat_caps *(*capabilities)(struct venus_core *core,
                                                    unsigned int *entries);
        int (*bufreq)(struct hfi_plat_buffers_params *params, u32 session_type,
                      u32 buftype, struct hfi_buffer_requirements *bufreq);
};

extern const struct hfi_platform hfi_plat_v4;
extern const struct hfi_platform hfi_plat_v6;

const struct hfi_platform *hfi_platform_get(enum hfi_version version);
unsigned long hfi_platform_get_codec_vpp_freq(struct venus_core *core,
                                              enum hfi_version version,
                                              u32 codec, u32 session_type);
unsigned long hfi_platform_get_codec_vsp_freq(struct venus_core *core,
                                              enum hfi_version version,
                                              u32 codec, u32 session_type);
unsigned long hfi_platform_get_codec_lp_freq(struct venus_core *core,
                                             enum hfi_version version,
                                             u32 codec, u32 session_type);
int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
                            u32 *dec_codecs, u32 *count);
#endif