[COMMON] media: mfc: create the bitrate table
authorAyoung Sim <a.sim@samsung.com>
Fri, 22 Mar 2019 05:16:57 +0000 (14:16 +0900)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:45:45 +0000 (23:45 +0900)
Change-Id: Iec0573a334e0c25ad2e814d01306e9e271233583
Signed-off-by: Ayoung Sim <a.sim@samsung.com>
drivers/media/platform/exynos/mfc/mfc.c
drivers/media/platform/exynos/mfc/mfc_data_struct.h
drivers/media/platform/exynos/mfc/mfc_qos.c

index 66a77c402c0699b21c132d61215daf10d05b3de6..78d7ce33b16cd17ac06b3d6a2d1c5a0a10718d88 100644 (file)
@@ -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);
index a069cfed8dcb2f48a0291698fe6cbecfa27309c8..d662b2bda09941b7748e4fd291ae0838badddf9c 100644 (file)
 #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
 /* 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;
index a208fd338e69cac43db046476634ec2ec227b6c2..d3e8c37347477557b90e04c10febafc53227d14a 100644 (file)
@@ -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;
        }
 }