Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc39105e authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: cvp: Dynamic clock voting"

parents 8adafefa f61549c9
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -107,6 +107,17 @@ static int read_platform_resources(struct msm_cvp_core *core,
	return rc;
}

static void init_cycle_info(struct cvp_cycle_info *info)
{
	memset(info->sum_fps, 0, HFI_MAX_HW_THREADS*sizeof(u32));
	memset(info->hi_ctrl_lim, 0, HFI_MAX_HW_THREADS*sizeof(u32));
	memset(info->lo_ctrl_lim, 0, HFI_MAX_HW_THREADS*sizeof(u32));
	memset(info->cycle, 0,
		HFI_MAX_HW_THREADS*sizeof(struct cvp_cycle_stat));
	info->conf_freq = 0;
	mutex_init(&info->lock);
}

static int msm_cvp_initialize_core(struct platform_device *pdev,
				struct msm_cvp_core *core)
{
@@ -132,6 +143,7 @@ static int msm_cvp_initialize_core(struct platform_device *pdev,

	INIT_DELAYED_WORK(&core->fw_unload_work, msm_cvp_fw_unload_handler);
	INIT_WORK(&core->ssr_work, msm_cvp_ssr_handler);
	init_cycle_info(&core->dyn_clk);

	return rc;
}
@@ -490,6 +502,7 @@ static int msm_cvp_remove(struct platform_device *pdev)
	sysfs_remove_group(&pdev->dev.kobj, &msm_cvp_core_attr_group);
	dev_set_drvdata(&pdev->dev, NULL);
	mutex_destroy(&core->lock);
	mutex_destroy(&core->dyn_clk.lock);
	kfree(core);
	return rc;
}
+27 −2
Original line number Diff line number Diff line
@@ -364,9 +364,34 @@ int get_hfi_version(void)
	return hfi->version;
}

unsigned int get_msg_size(void)
unsigned int get_msg_size(struct cvp_hfi_msg_session_hdr *hdr)
{
	struct msm_cvp_core *core;
	struct iris_hfi_device *device;
	u32 minor_ver;

	core = list_first_entry(&cvp_driver->cores, struct msm_cvp_core, list);
	if (core)
		device = core->device->hfi_device_data;
	else
		return 0;

	if (!device) {
		dprintk(CVP_ERR, "%s: NULL device\n", __func__);
		return 0;
	}

	minor_ver = (device->version & HFI_VERSION_MINOR_MASK) >>
				HFI_VERSION_MINOR_SHIFT;

	if (minor_ver < 2)
		return sizeof(struct cvp_hfi_msg_session_hdr);

	if (hdr->packet_type == HFI_MSG_SESSION_CVP_FD)
		return sizeof(struct cvp_hfi_msg_session_hdr_ext);
	else
		return sizeof(struct cvp_hfi_msg_session_hdr);

}

unsigned int get_msg_session_id(void *msg)
+1 −1
Original line number Diff line number Diff line
@@ -369,7 +369,7 @@ void cvp_hfi_deinitialize(enum msm_cvp_hfi_type hfi_type,
int get_pkt_index(struct cvp_hal_session_cmd_pkt *hdr);
int get_signal_from_pkt_type(unsigned int type);
int get_hfi_version(void);
unsigned int get_msg_size(void);
unsigned int get_msg_size(struct cvp_hfi_msg_session_hdr *hdr);
unsigned int get_msg_session_id(void *msg);
unsigned int get_msg_errorcode(void *msg);
int get_msg_opconfigs(void *msg, unsigned int *session_id,
+23 −0
Original line number Diff line number Diff line
@@ -336,6 +336,29 @@ struct cvp_hfi_msg_session_hdr {
	u32 stream_idx;
} __packed;

#define HFI_MAX_HW_ACTIVATIONS_PER_FRAME (6)
#define HFI_MAX_HW_THREADS (4)

enum hfi_hw_thread {
	HFI_HW_FDU,
	HFI_HW_MPU,
	HFI_HW_OD,
	HFI_HW_ICA
};

struct cvp_hfi_msg_session_hdr_ext {
	u32 size;
	u32 packet_type;
	u32 session_id;
	u32 error_type;
	struct cvp_hfi_client client_data;
	u32 stream_idx;
	u32 busy_cycles;
	u32 total_cycles;
	u32 hw_cycles[HFI_MAX_HW_THREADS][HFI_MAX_HW_ACTIVATIONS_PER_FRAME];
	u32 fw_cycles[HFI_MAX_HW_ACTIVATIONS_PER_FRAME];
} __packed;

struct cvp_hfi_buffer_mapping_type {
	u32 index;
	u32 device_addr;
+6 −4
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ static int hfi_process_session_set_buf_done(u32 device_id,
	struct cvp_hfi_msg_session_hdr *pkt =
			(struct cvp_hfi_msg_session_hdr *)hdr;
	struct msm_cvp_cb_cmd_done cmd_done = {0};
	unsigned int pkt_size = get_msg_size();
	unsigned int pkt_size = get_msg_size(pkt);

	if (!pkt || pkt->size < pkt_size) {
		dprintk(CVP_ERR, "bad packet/packet size %d\n",
@@ -367,7 +367,7 @@ static int hfi_process_session_rel_buf_done(u32 device_id,
	struct cvp_hfi_msg_session_hdr *pkt =
			(struct cvp_hfi_msg_session_hdr *)hdr;
	struct msm_cvp_cb_cmd_done cmd_done = {0};
	unsigned int pkt_size = get_msg_size();
	unsigned int pkt_size = get_msg_size(pkt);

	if (!pkt || pkt->size < pkt_size) {
		dprintk(CVP_ERR, "bad packet/packet size %d\n",
@@ -393,6 +393,8 @@ static int hfi_process_session_cvp_operation_config(u32 device_id,
{
	struct cvp_hfi_msg_session_op_cfg_packet *pkt =
		(struct cvp_hfi_msg_session_op_cfg_packet *)hdr;
	struct cvp_hfi_msg_session_hdr *lhdr =
		(struct cvp_hfi_msg_session_hdr *)hdr;
	struct msm_cvp_cb_cmd_done cmd_done = {0};
	int signal;
	unsigned int conf_id, session_id, error_type;
@@ -400,7 +402,7 @@ static int hfi_process_session_cvp_operation_config(u32 device_id,
	if (!pkt) {
		dprintk(CVP_ERR, "%s: invalid param\n", __func__);
		return -EINVAL;
	} else if (pkt->size < get_msg_size()) {
	} else if (pkt->size < get_msg_size(lhdr)) {
		dprintk(CVP_ERR,
				"%s: bad_pkt_size\n", __func__);
		return -E2BIG;
@@ -514,7 +516,7 @@ static int hfi_process_session_cvp_msg(u32 device_id,
		return -ENOMEM;
	}

	memcpy(&sess_msg->pkt, pkt, get_msg_size());
	memcpy(&sess_msg->pkt, pkt, get_msg_size(pkt));

	dprintk(CVP_HFI,
		"%s: Received msg %x cmd_done.status=%d sessionid=%x\n",
Loading