-Removed unwanted functions -Removed unwanted part of code from function definitions -Added proper format specifier according to the data type. Change-Id: I700202f1cf588506b329d202ce3e2729c027dcae Signed-off-by: Gaviraju Doddabettahalli Bettegowda <quic_gdoddabe@quicinc.com> Signed-off-by: Govindaraj Rajagopal <quic_grajagop@quicinc.com>
233 lines
5.6 KiB
C
233 lines
5.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2020-2021,, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _MSM_VIDC_DT_H_
|
|
#define _MSM_VIDC_DT_H_
|
|
|
|
#include <linux/platform_device.h>
|
|
#include <linux/soc/qcom/llcc-qcom.h>
|
|
#include <linux/soc/qcom/msm_mmrm.h>
|
|
|
|
#include "msm_vidc_internal.h"
|
|
|
|
/*
|
|
* These are helper macros to iterate over various lists within
|
|
* msm_vidc_core->dt. The intention is to cut down on a lot of boiler-plate
|
|
* code
|
|
*/
|
|
|
|
/* Read as "for each 'thing' in a set of 'thingies'" */
|
|
#define venus_hfi_for_each_thing(__device, __thing, __thingy) \
|
|
venus_hfi_for_each_thing_continue(__device, __thing, __thingy, 0)
|
|
|
|
#define venus_hfi_for_each_thing_reverse(__device, __thing, __thingy) \
|
|
venus_hfi_for_each_thing_reverse_continue(__device, __thing, __thingy, \
|
|
(__device)->dt->__thingy##_set.count - 1)
|
|
|
|
/* TODO: the __from parameter technically not required since we can figure it
|
|
* out with some pointer magic (i.e. __thing - __thing##_tbl[0]). If this macro
|
|
* sees extensive use, probably worth cleaning it up but for now omitting it
|
|
* since it introduces unnecessary complexity.
|
|
*/
|
|
#define venus_hfi_for_each_thing_continue(__device, __thing, __thingy, __from) \
|
|
for (__thing = &(__device)->dt->\
|
|
__thingy##_set.__thingy##_tbl[__from]; \
|
|
__thing < &(__device)->dt->__thingy##_set.__thingy##_tbl[0] + \
|
|
((__device)->dt->__thingy##_set.count - __from); \
|
|
++__thing)
|
|
|
|
#define venus_hfi_for_each_thing_reverse_continue(__device, __thing, __thingy, \
|
|
__from) \
|
|
for (__thing = &(__device)->dt->\
|
|
__thingy##_set.__thingy##_tbl[__from]; \
|
|
__thing >= &(__device)->dt->__thingy##_set.__thingy##_tbl[0]; \
|
|
--__thing)
|
|
|
|
/* Regular set helpers */
|
|
#define venus_hfi_for_each_regulator(__device, __rinfo) \
|
|
venus_hfi_for_each_thing(__device, __rinfo, regulator)
|
|
|
|
#define venus_hfi_for_each_regulator_reverse(__device, __rinfo) \
|
|
venus_hfi_for_each_thing_reverse(__device, __rinfo, regulator)
|
|
|
|
#define venus_hfi_for_each_regulator_reverse_continue(__device, __rinfo, \
|
|
__from) \
|
|
venus_hfi_for_each_thing_reverse_continue(__device, __rinfo, \
|
|
regulator, __from)
|
|
|
|
/* Clock set helpers */
|
|
#define venus_hfi_for_each_clock(__device, __cinfo) \
|
|
venus_hfi_for_each_thing(__device, __cinfo, clock)
|
|
|
|
#define venus_hfi_for_each_clock_reverse(__device, __cinfo) \
|
|
venus_hfi_for_each_thing_reverse(__device, __cinfo, clock)
|
|
|
|
/* Bus set helpers */
|
|
#define venus_hfi_for_each_bus(__device, __binfo) \
|
|
venus_hfi_for_each_thing(__device, __binfo, bus)
|
|
#define venus_hfi_for_each_bus_reverse(__device, __binfo) \
|
|
venus_hfi_for_each_thing_reverse(__device, __binfo, bus)
|
|
|
|
/* Subcache set helpers */
|
|
#define venus_hfi_for_each_subcache(__device, __sinfo) \
|
|
venus_hfi_for_each_thing(__device, __sinfo, subcache)
|
|
#define venus_hfi_for_each_subcache_reverse(__device, __sinfo) \
|
|
venus_hfi_for_each_thing_reverse(__device, __sinfo, subcache)
|
|
|
|
struct reg_value_pair {
|
|
u32 reg;
|
|
u32 value;
|
|
u32 mask;
|
|
};
|
|
|
|
struct reg_set {
|
|
struct reg_value_pair *reg_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct addr_range {
|
|
u32 start;
|
|
u32 size;
|
|
};
|
|
|
|
struct addr_set {
|
|
struct addr_range *addr_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct context_bank_info {
|
|
struct list_head list;
|
|
const char *name;
|
|
bool is_secure;
|
|
struct addr_range addr_range;
|
|
struct device *dev;
|
|
struct iommu_domain *domain;
|
|
};
|
|
|
|
struct buffer_usage_table {
|
|
u32 buffer_type;
|
|
u32 tz_usage;
|
|
};
|
|
|
|
struct buffer_usage_set {
|
|
struct buffer_usage_table *buffer_usage_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct regulator_info {
|
|
struct regulator *regulator;
|
|
bool has_hw_power_collapse;
|
|
char *name;
|
|
};
|
|
|
|
struct regulator_set {
|
|
struct regulator_info *regulator_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct clock_info {
|
|
const char *name;
|
|
u32 clk_id;
|
|
struct clk *clk;
|
|
u32 count;
|
|
bool has_scaling;
|
|
bool has_mem_retention;
|
|
u64 prev;
|
|
struct mmrm_client *mmrm_client;
|
|
};
|
|
|
|
struct clock_set {
|
|
struct clock_info *clock_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct bus_info {
|
|
const char *name;
|
|
u32 range[2];
|
|
struct device *dev;
|
|
struct icc_path *path;
|
|
};
|
|
|
|
struct bus_set {
|
|
struct bus_info *bus_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct reset_info {
|
|
struct reset_control *rst;
|
|
const char *name;
|
|
};
|
|
|
|
struct reset_set {
|
|
struct reset_info *reset_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct allowed_clock_rates_table {
|
|
u32 clock_rate;
|
|
};
|
|
|
|
struct clock_profile_entry {
|
|
u32 codec_mask;
|
|
u32 vpp_cycles;
|
|
u32 vsp_cycles;
|
|
u32 low_power_cycles;
|
|
};
|
|
|
|
struct clock_freq_table {
|
|
struct clock_profile_entry *clk_prof_entries;
|
|
u32 count;
|
|
};
|
|
|
|
struct subcache_info {
|
|
const char *name;
|
|
bool isactive;
|
|
bool isset;
|
|
struct llcc_slice_desc *subcache;
|
|
};
|
|
|
|
struct subcache_set {
|
|
struct subcache_info *subcache_tbl;
|
|
u32 count;
|
|
};
|
|
|
|
struct msm_vidc_dt {
|
|
void *core;
|
|
phys_addr_t register_base;
|
|
u32 register_size;
|
|
u32 irq;
|
|
struct allowed_clock_rates_table *allowed_clks_tbl;
|
|
u32 allowed_clks_tbl_size;
|
|
struct clock_freq_table clock_freq_tbl;
|
|
bool sys_cache_present;
|
|
bool sys_cache_res_set;
|
|
struct subcache_set subcache_set;
|
|
struct reg_set reg_set;
|
|
struct addr_set qdss_addr_set;
|
|
struct buffer_usage_set buffer_usage_set;
|
|
struct regulator_set regulator_set;
|
|
struct clock_set clock_set;
|
|
struct bus_set bus_set;
|
|
struct reset_set reset_set;
|
|
struct list_head context_banks;
|
|
struct mutex cb_lock;
|
|
const char *fw_name;
|
|
int fw_cookie;
|
|
};
|
|
|
|
int msm_vidc_init_dt(struct platform_device *pdev);
|
|
int msm_vidc_read_context_bank_resources_from_dt(struct platform_device *pdev);
|
|
void msm_vidc_deinit_dt(struct platform_device *pdev);
|
|
|
|
/* A comparator to compare loads (needed later on) */
|
|
static inline int cmp(const void *a, const void *b)
|
|
{
|
|
/* want to sort in reverse so flip the comparison */
|
|
return ((struct allowed_clock_rates_table *)b)->clock_rate -
|
|
((struct allowed_clock_rates_table *)a)->clock_rate;
|
|
}
|
|
|
|
#endif // _MSM_VIDC_DT_H_
|