浏览代码

video: driver: enable scale clocks and busses

Enable scale clocks and busses when queuing input buffers.

Change-Id: I8dca67c5c2463f5bfc1ccaed7375fb69d80a0196
Signed-off-by: Maheshwar Ajja <[email protected]>
Maheshwar Ajja 4 年之前
父节点
当前提交
29bbe0780e
共有 4 个文件被更改,包括 27 次插入7 次删除
  1. 2 1
      driver/vidc/src/msm_vidc_debug.c
  2. 5 0
      driver/vidc/src/msm_vidc_driver.c
  3. 10 0
      driver/vidc/src/msm_vidc_power.c
  4. 10 6
      driver/vidc/src/venus_hfi.c

+ 2 - 1
driver/vidc/src/msm_vidc_debug.c

@@ -33,4 +33,5 @@ const char *level_str(u32 level)
 		return "bus ";
 	else
 		return "????";
-}
+}
+

+ 5 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -1472,6 +1472,11 @@ int msm_vidc_queue_buffer(struct msm_vidc_inst *inst, struct vb2_buffer *vb2)
 		inst->capabilities->cap[CODEC_CONFIG].value = 0;
 	}
 
+	if (buf->type == MSM_VIDC_BUF_INPUT) {
+		inst->power.buffer_counter++;
+		msm_vidc_scale_power(inst, true);
+	}
+
 	print_vidc_buffer(VIDC_HIGH, "qbuf", inst, buf);
 	meta = get_meta_buffer(inst, buf);
 	if (!meta) {

+ 10 - 0
driver/vidc/src/msm_vidc_power.c

@@ -506,11 +506,15 @@ int msm_vidc_scale_clocks(struct msm_vidc_inst *inst)
 
 int msm_vidc_scale_power(struct msm_vidc_inst *inst, bool scale_buses)
 {
+	struct msm_vidc_core *core;
+
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params %pK\n", __func__, inst);
 		return -EINVAL;
 	}
 
+	core = inst->core;
+
 	if (!inst->active) {
 		/* scale buses for inactive -> active session */
 		scale_buses = true;
@@ -525,6 +529,12 @@ int msm_vidc_scale_power(struct msm_vidc_inst *inst, bool scale_buses)
 			s_vpr_e(inst->sid, "failed to scale bus\n");
 	}
 
+	s_vpr_h(inst->sid,
+		"power: inst: clk %lld ddr %d llcc %d dcvs flags %#x, core: clk %lld ddr %lld llcc %lld\n",
+		inst->power.curr_freq, inst->power.ddr_bw,
+		inst->power.sys_cache_bw, inst->power.dcvs_flags,
+		core->power.clk_freq, core->power.bw_ddr,
+		core->power.bw_llcc);
 	return 0;
 }
 

+ 10 - 6
driver/vidc/src/venus_hfi.c

@@ -507,7 +507,7 @@ static int __vote_buses(struct msm_vidc_core *core,
 				bus->range[0], bus->range[1]);
 
 			if (TRIVIAL_BW_CHANGE(bw_kbps, bw_prev) && bw_prev) {
-				d_vpr_l("Skip voting bus %s to %llu bps",
+				d_vpr_l("Skip voting bus %s to %llu bps\n",
 					bus->name, bw_kbps * 1000);
 				continue;
 			}
@@ -656,7 +656,7 @@ static int __write_queue(struct msm_vidc_iface_q_info *qinfo, u8 *packet,
 	if (write_ptr < (u32 *)qinfo->q_array.align_virtual_addr ||
 	    write_ptr > (u32 *)(qinfo->q_array.align_virtual_addr +
 	    qinfo->q_array.mem_size)) {
-		d_vpr_e("Invalid write index");
+		d_vpr_e("Invalid write index\n");
 		return -ENODATA;
 	}
 
@@ -1457,8 +1457,10 @@ static int __init_bus(struct msm_vidc_core *core)
 	struct bus_info *bus = NULL;
 	int rc = 0;
 
-	if (!core)
+	if (!core) {
+		d_vpr_e("%s: invalid param\n", __func__);
 		return -EINVAL;
+	}
 
 	venus_hfi_for_each_bus(core, bus) {
 		if (!strcmp(bus->name, "venus-llcc")) {
@@ -1962,8 +1964,10 @@ static int __venus_power_on(struct msm_vidc_core *core)
 {
 	int rc = 0;
 
-	if (core->power_enabled)
+	if (core->power_enabled) {
+		d_vpr_e("%s: Skip power on, core already enabled.\n", __func__);
 		return 0;
+	}
 
 	core->power_enabled = true;
 	/* Vote for all hardware resources */
@@ -3117,7 +3121,7 @@ int venus_hfi_scale_clocks(struct msm_vidc_inst* inst, u64 freq)
 	int rc = 0;
 	struct msm_vidc_core* core;
 
-	if (!inst || inst->core) {
+	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 	}
@@ -3141,7 +3145,7 @@ int venus_hfi_scale_buses(struct msm_vidc_inst *inst, u64 bw_ddr, u64 bw_llcc)
 	int rc = 0;
 	struct msm_vidc_core* core;
 
-	if (!inst || inst->core) {
+	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 	}