From f762e6dc1e958ac43d1ac5ee2a90140c098e71c6 Mon Sep 17 00:00:00 2001 From: Ayoung Sim Date: Fri, 22 Mar 2019 14:16:57 +0900 Subject: [PATCH] [COMMON] media: mfc: create the bitrate table Change-Id: Iec0573a334e0c25ad2e814d01306e9e271233583 Signed-off-by: Ayoung Sim --- drivers/media/platform/exynos/mfc/mfc.c | 21 ++++++++++++++++++- .../platform/exynos/mfc/mfc_data_struct.h | 20 +++++++++++++++--- drivers/media/platform/exynos/mfc/mfc_qos.c | 8 +++---- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/exynos/mfc/mfc.c b/drivers/media/platform/exynos/mfc/mfc.c index 66a77c402c06..78d7ce33b16c 100644 --- a/drivers/media/platform/exynos/mfc/mfc.c +++ b/drivers/media/platform/exynos/mfc/mfc.c @@ -957,6 +957,22 @@ int mfc_sysmmu_fault_handler(struct iommu_domain *iodmn, struct device *device, return 0; } +static void __mfc_create_bitrate_table(struct mfc_dev *dev) +{ + struct mfc_platdata *pdata = dev->pdata; + int i, interval; + + interval = pdata->max_Kbps[0] / pdata->num_mfc_freq; + dev->bps_ratio = pdata->max_Kbps[0] / dev->pdata->max_Kbps[1]; + for (i = 0; i < pdata->num_mfc_freq; i++) { + dev->bitrate_table[i].bps_interval = interval * (i + 1); + dev->bitrate_table[i].mfc_freq = pdata->mfc_freqs[i]; + mfc_info_dev("[QoS] bitrate table[%d] %dKHz: ~ %dKbps\n", + i, dev->bitrate_table[i].mfc_freq, + dev->bitrate_table[i].bps_interval); + } +} + static void __mfc_parse_dt(struct device_node *np, struct mfc_dev *mfc) { struct mfc_platdata *pdata = mfc->pdata; @@ -1077,8 +1093,11 @@ static void __mfc_parse_dt(struct device_node *np, struct mfc_dev *mfc) of_property_read_u32(np, "qos_weight_super64_bframe", &pdata->qos_weight.weight_super64_bframe); #endif /* Bitrate control for QoS */ + of_property_read_u32(np, "num_mfc_freq", &pdata->num_mfc_freq); + if (pdata->num_mfc_freq) + of_property_read_u32_array(np, "mfc_freqs", pdata->mfc_freqs, pdata->num_mfc_freq); of_property_read_u32_array(np, "max_Kbps", pdata->max_Kbps, MAX_NUM_MFC_BPS); - dev->bps_ratio = pdata->max_Kbps[0] / dev->pdata->max_Kbps[1]; + __mfc_create_bitrate_table(mfc); } static void *__mfc_get_drv_data(struct platform_device *pdev); diff --git a/drivers/media/platform/exynos/mfc/mfc_data_struct.h b/drivers/media/platform/exynos/mfc/mfc_data_struct.h index a069cfed8dcb..d662b2bda099 100644 --- a/drivers/media/platform/exynos/mfc/mfc_data_struct.h +++ b/drivers/media/platform/exynos/mfc/mfc_data_struct.h @@ -39,16 +39,17 @@ #define MFC_MAX_DPBS 32 #define MFC_MAX_BUFFERS 32 #define MFC_MAX_EXTRA_BUF 10 -#define MFC_TIME_INDEX 15 #define MFC_SFR_LOGGING_COUNT_SET0 10 #define MFC_SFR_LOGGING_COUNT_SET1 28 #define MFC_SFR_LOGGING_COUNT_SET2 32 #define MFC_LOGGING_DATA_SIZE 950 #define MFC_MAX_DEFAULT_PARAM 100 +/* OTF */ #define HWFC_MAX_BUF 10 #define OTF_MAX_BUF 30 +/* HDR */ #define HDR_MAX_WINDOWS 3 #define HDR_MAX_SCL 3 #define HDR_MAX_DISTRIBUTION 15 @@ -57,11 +58,15 @@ /* Maximum number of temporal layers */ #define VIDEO_MAX_TEMPORAL_LAYERS 7 +/* Batch mode */ #define MAX_NUM_IMAGES_IN_VB 8 #define MAX_NUM_BUFCON_BUFS 32 +/* QoS */ +#define MAX_TIME_INDEX 15 #define MAX_NUM_CLUSTER 3 #define MAX_NUM_MFC_BPS 2 +#define MAX_NUM_MFC_FREQ 10 /* * MFC region id for smc @@ -485,6 +490,8 @@ struct mfc_platdata { struct mfc_qos *qos_table; struct mfc_qos_boost *qos_boost_table; #endif + int num_mfc_freq; + unsigned int mfc_freqs[MAX_NUM_MFC_FREQ]; unsigned int max_Kbps[MAX_NUM_MFC_BPS]; /* NAL-Q size */ unsigned int nal_q_entry_size; @@ -766,6 +773,11 @@ struct mfc_mmcache { int is_on_status; }; +struct mfc_bitrate_table { + int mfc_freq; + int bps_interval; +}; + /** * struct mfc_dev - The struct containing driver internal parameters. */ @@ -854,6 +866,7 @@ struct mfc_dev { int qos_has_enc_ctx; struct mutex qos_mutex; #endif + struct mfc_bitrate_table bitrate_table[MAX_NUM_MFC_FREQ]; int bps_ratio; int id; @@ -1559,12 +1572,13 @@ struct mfc_ctx { struct list_head qos_list; #endif - struct mfc_timestamp ts_array[MFC_TIME_INDEX]; + struct mfc_timestamp ts_array[MAX_TIME_INDEX]; struct list_head ts_list; int ts_count; int ts_is_full; - struct mfc_bitrate bitrate_array[MFC_TIME_INDEX]; + /* bitrate control for QoS*/ + struct mfc_bitrate bitrate_array[MAX_TIME_INDEX]; struct list_head bitrate_list; int bitrate_index; int bitrate_is_full; diff --git a/drivers/media/platform/exynos/mfc/mfc_qos.c b/drivers/media/platform/exynos/mfc/mfc_qos.c index a208fd338e69..d3e8c3734747 100644 --- a/drivers/media/platform/exynos/mfc/mfc_qos.c +++ b/drivers/media/platform/exynos/mfc/mfc_qos.c @@ -763,9 +763,9 @@ static int __mfc_qos_add_timestamp(struct mfc_ctx *ctx, curr_ts->index = ctx->ts_count; ctx->ts_count++; - if (ctx->ts_count == MFC_TIME_INDEX) { + if (ctx->ts_count == MAX_TIME_INDEX) { ctx->ts_is_full = 1; - ctx->ts_count %= MFC_TIME_INDEX; + ctx->ts_count %= MAX_TIME_INDEX; } return 0; @@ -878,9 +878,9 @@ static void __mfc_qos_get_bps(struct mfc_ctx *ctx, u32 bytesused) mfc_debug(3, "[QoS] %d Kbps, average %lld Kbits per frame\n", ctx->Kbps, avg_Kbits); ctx->bitrate_index++; - if (ctx->bitrate_index == MFC_TIME_INDEX) { + if (ctx->bitrate_index == MAX_TIME_INDEX) { ctx->bitrate_is_full = 1; - ctx->bitrate_index %= MFC_TIME_INDEX; + ctx->bitrate_index %= MAX_TIME_INDEX; } } -- 2.20.1