msm: eva: Enable hangdump mode in EVA
Include new hfi packets and enable the pipeline to dump hangdump buffers in UMD. Change-Id: Id66538c69d3080c09c5a140dadcb0dfe87d9efc7 Signed-off-by: Karthik Nagarajan <karnagar@codeaurora.org>
This commit is contained in:
@@ -133,6 +133,8 @@ struct eva_kmd_hfi_packet {
|
|||||||
#define EVA_KMD_PROP_SESSION_PRIORITY 4
|
#define EVA_KMD_PROP_SESSION_PRIORITY 4
|
||||||
#define EVA_KMD_PROP_SESSION_SECURITY 5
|
#define EVA_KMD_PROP_SESSION_SECURITY 5
|
||||||
#define EVA_KMD_PROP_SESSION_DSPMASK 6
|
#define EVA_KMD_PROP_SESSION_DSPMASK 6
|
||||||
|
#define EVA_KMD_PROP_SESSION_DUMPOFFSET 7
|
||||||
|
#define EVA_KMD_PROP_SESSION_DUMPSIZE 8
|
||||||
|
|
||||||
#define EVA_KMD_PROP_PWR_FDU 0x10
|
#define EVA_KMD_PROP_PWR_FDU 0x10
|
||||||
#define EVA_KMD_PROP_PWR_ICA 0x11
|
#define EVA_KMD_PROP_PWR_ICA 0x11
|
||||||
|
@@ -70,6 +70,9 @@ static unsigned int cvp_poll(struct file *filp, struct poll_table_struct *p)
|
|||||||
spin_lock_irqsave(&inst->event_handler.lock, flags);
|
spin_lock_irqsave(&inst->event_handler.lock, flags);
|
||||||
if (inst->event_handler.event == CVP_SSR_EVENT)
|
if (inst->event_handler.event == CVP_SSR_EVENT)
|
||||||
rc |= POLLPRI;
|
rc |= POLLPRI;
|
||||||
|
if (inst->event_handler.event == CVP_DUMP_EVENT)
|
||||||
|
rc |= POLLIN;
|
||||||
|
inst->event_handler.event = CVP_NO_EVENT;
|
||||||
spin_unlock_irqrestore(&inst->event_handler.lock, flags);
|
spin_unlock_irqrestore(&inst->event_handler.lock, flags);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@@ -2653,6 +2653,7 @@ static void **get_session_id(struct msm_cvp_cb_info *info)
|
|||||||
case HAL_SESSION_UNREGISTER_BUFFER_DONE:
|
case HAL_SESSION_UNREGISTER_BUFFER_DONE:
|
||||||
case HAL_SESSION_PROPERTY_INFO:
|
case HAL_SESSION_PROPERTY_INFO:
|
||||||
case HAL_SESSION_EVENT_CHANGE:
|
case HAL_SESSION_EVENT_CHANGE:
|
||||||
|
case HAL_SESSION_DUMP_NOTIFY:
|
||||||
session_id = &info->response.cmd.session_id;
|
session_id = &info->response.cmd.session_id;
|
||||||
break;
|
break;
|
||||||
case HAL_SESSION_ERROR:
|
case HAL_SESSION_ERROR:
|
||||||
|
@@ -131,7 +131,14 @@
|
|||||||
(HFI_CMD_SESSION_CVP_START + 0x064)
|
(HFI_CMD_SESSION_CVP_START + 0x064)
|
||||||
#define HFI_CMD_SESSION_CVP_WARP_DS_PARAMS\
|
#define HFI_CMD_SESSION_CVP_WARP_DS_PARAMS\
|
||||||
(HFI_CMD_SESSION_CVP_START + 0x065)
|
(HFI_CMD_SESSION_CVP_START + 0x065)
|
||||||
|
#define HFI_CMD_SESSION_CVP_SET_SNAPSHOT_BUFFERS\
|
||||||
|
(HFI_CMD_SESSION_CVP_START + 0x070)
|
||||||
|
#define HFI_CMD_SESSION_CVP_RELEASE_SNAPSHOT_BUFFERS\
|
||||||
|
(HFI_CMD_SESSION_CVP_START + 0x071)
|
||||||
|
#define HFI_CMD_SESSION_CVP_SNAPSHOT_WRITE_DONE\
|
||||||
|
(HFI_CMD_SESSION_CVP_START + 0x072)
|
||||||
|
#define HFI_CMD_SESSION_CVP_SET_SNAPSHOT_MODE\
|
||||||
|
(HFI_CMD_SESSION_CVP_START + 0x073)
|
||||||
#define HFI_CMD_SESSION_CVP_ICA_FRAME\
|
#define HFI_CMD_SESSION_CVP_ICA_FRAME\
|
||||||
(HFI_CMD_SESSION_CVP_START + 0x100)
|
(HFI_CMD_SESSION_CVP_START + 0x100)
|
||||||
#define HFI_CMD_SESSION_CVP_ICA_CONFIG\
|
#define HFI_CMD_SESSION_CVP_ICA_CONFIG\
|
||||||
@@ -196,6 +203,12 @@
|
|||||||
(HFI_MSG_SESSION_CVP_START + 0x040)
|
(HFI_MSG_SESSION_CVP_START + 0x040)
|
||||||
#define HFI_MSG_SESSION_CVP_WARP_DS_PARAMS\
|
#define HFI_MSG_SESSION_CVP_WARP_DS_PARAMS\
|
||||||
(HFI_MSG_SESSION_CVP_START + 0x041)
|
(HFI_MSG_SESSION_CVP_START + 0x041)
|
||||||
|
#define HFI_MSG_SESSION_CVP_SET_SNAPSHOT_BUFFERS\
|
||||||
|
(HFI_MSG_SESSION_CVP_START + 0x042)
|
||||||
|
#define HFI_MSG_SESSION_CVP_RELEASE_SNAPSHOT_BUFFERS\
|
||||||
|
(HFI_MSG_SESSION_CVP_START + 0x043)
|
||||||
|
#define HFI_MSG_EVENT_NOTIFY_SNAPSHOT_READY\
|
||||||
|
(HFI_MSG_SESSION_CVP_START + 0x044)
|
||||||
|
|
||||||
#define HFI_MSG_SESSION_CVP_FLUSH\
|
#define HFI_MSG_SESSION_CVP_FLUSH\
|
||||||
(HFI_MSG_SESSION_CVP_START + 0x004A)
|
(HFI_MSG_SESSION_CVP_START + 0x004A)
|
||||||
@@ -299,9 +312,12 @@ static inline enum buf_map_type cvp_find_map_type(int pkt_type)
|
|||||||
if (pkt_type == HFI_CMD_SESSION_CVP_SET_PERSIST_BUFFERS ||
|
if (pkt_type == HFI_CMD_SESSION_CVP_SET_PERSIST_BUFFERS ||
|
||||||
pkt_type == HFI_CMD_SESSION_CVP_SET_MODEL_BUFFERS ||
|
pkt_type == HFI_CMD_SESSION_CVP_SET_MODEL_BUFFERS ||
|
||||||
pkt_type == HFI_CMD_SESSION_CVP_DMM_PARAMS ||
|
pkt_type == HFI_CMD_SESSION_CVP_DMM_PARAMS ||
|
||||||
|
pkt_type == HFI_CMD_SESSION_CVP_SET_SNAPSHOT_BUFFERS ||
|
||||||
pkt_type == HFI_CMD_SESSION_CVP_WARP_DS_PARAMS)
|
pkt_type == HFI_CMD_SESSION_CVP_WARP_DS_PARAMS)
|
||||||
return MAP_PERSIST;
|
return MAP_PERSIST;
|
||||||
else if (pkt_type == HFI_CMD_SESSION_CVP_RELEASE_PERSIST_BUFFERS)
|
else if (pkt_type == HFI_CMD_SESSION_CVP_RELEASE_PERSIST_BUFFERS ||
|
||||||
|
pkt_type ==
|
||||||
|
HFI_CMD_SESSION_CVP_RELEASE_SNAPSHOT_BUFFERS)
|
||||||
return UNMAP_PERSIST;
|
return UNMAP_PERSIST;
|
||||||
else
|
else
|
||||||
return MAP_FRAME;
|
return MAP_FRAME;
|
||||||
|
@@ -143,6 +143,7 @@ enum hal_command_response {
|
|||||||
HAL_SESSION_UNREGISTER_BUFFER_DONE,
|
HAL_SESSION_UNREGISTER_BUFFER_DONE,
|
||||||
HAL_SESSION_RELEASE_RESOURCE_DONE,
|
HAL_SESSION_RELEASE_RESOURCE_DONE,
|
||||||
HAL_SESSION_PROPERTY_INFO,
|
HAL_SESSION_PROPERTY_INFO,
|
||||||
|
HAL_SESSION_DUMP_NOTIFY,
|
||||||
HAL_SESSION_ERROR,
|
HAL_SESSION_ERROR,
|
||||||
HAL_RESPONSE_UNUSED = 0x10000000,
|
HAL_RESPONSE_UNUSED = 0x10000000,
|
||||||
};
|
};
|
||||||
|
@@ -329,6 +329,16 @@ struct cvp_hfi_msg_session_hdr {
|
|||||||
u32 stream_idx;
|
u32 stream_idx;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct cvp_hfi_dumpmsg_session_hdr {
|
||||||
|
u32 size;
|
||||||
|
u32 packet_type;
|
||||||
|
u32 session_id;
|
||||||
|
u32 error_type;
|
||||||
|
struct cvp_hfi_client client_data;
|
||||||
|
u32 dump_offset;
|
||||||
|
u32 dump_size;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
#define HFI_MAX_HW_ACTIVATIONS_PER_FRAME (6)
|
#define HFI_MAX_HW_ACTIVATIONS_PER_FRAME (6)
|
||||||
#define HFI_MAX_HW_THREADS (4)
|
#define HFI_MAX_HW_THREADS (4)
|
||||||
|
|
||||||
|
@@ -424,6 +424,48 @@ retry:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hfi_process_session_dump_notify(u32 device_id,
|
||||||
|
void *hdr, struct msm_cvp_cb_info *info)
|
||||||
|
{
|
||||||
|
struct msm_cvp_inst *inst = NULL;
|
||||||
|
struct msm_cvp_core *core;
|
||||||
|
struct cvp_session_prop *session_prop;
|
||||||
|
unsigned int session_id;
|
||||||
|
struct msm_cvp_cb_cmd_done cmd_done = {0};
|
||||||
|
struct cvp_hfi_dumpmsg_session_hdr *pkt =
|
||||||
|
(struct cvp_hfi_dumpmsg_session_hdr *)hdr;
|
||||||
|
|
||||||
|
if (!pkt) {
|
||||||
|
dprintk(CVP_ERR, "%s: invalid param\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
} else if (pkt->size > sizeof(struct cvp_hfi_dumpmsg_session_hdr)) {
|
||||||
|
dprintk(CVP_ERR, "%s: bad_pkt_size %d\n", __func__, pkt->size);
|
||||||
|
return -E2BIG;
|
||||||
|
}
|
||||||
|
session_id = get_msg_session_id(pkt);
|
||||||
|
core = list_first_entry(&cvp_driver->cores, struct msm_cvp_core, list);
|
||||||
|
inst = cvp_get_inst_from_id(core, session_id);
|
||||||
|
if (!inst) {
|
||||||
|
dprintk(CVP_ERR, "%s: invalid session\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
session_prop = &inst->prop;
|
||||||
|
session_prop->dump_offset = pkt->dump_offset;
|
||||||
|
session_prop->dump_size = pkt->dump_size;
|
||||||
|
|
||||||
|
dprintk(CVP_SESS, "RECEIVED: SESSION_DUMP[%x]\n", session_id);
|
||||||
|
|
||||||
|
cmd_done.device_id = device_id;
|
||||||
|
cmd_done.session_id = (void *)(uintptr_t)pkt->session_id;
|
||||||
|
cmd_done.status = hfi_map_err_status(pkt->error_type);
|
||||||
|
cmd_done.size = 0;
|
||||||
|
|
||||||
|
info->response_type = HAL_SESSION_DUMP_NOTIFY;
|
||||||
|
info->response.cmd = cmd_done;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int hfi_process_session_cvp_msg(u32 device_id,
|
static int hfi_process_session_cvp_msg(u32 device_id,
|
||||||
void *hdr, struct msm_cvp_cb_info *info)
|
void *hdr, struct msm_cvp_cb_info *info)
|
||||||
{
|
{
|
||||||
@@ -598,6 +640,9 @@ int cvp_hfi_process_msg_packet(u32 device_id, void *hdr,
|
|||||||
case HFI_MSG_SESSION_CVP_FLUSH:
|
case HFI_MSG_SESSION_CVP_FLUSH:
|
||||||
pkt_func = (pkt_func_def)hfi_process_session_flush_done;
|
pkt_func = (pkt_func_def)hfi_process_session_flush_done;
|
||||||
break;
|
break;
|
||||||
|
case HFI_MSG_EVENT_NOTIFY_SNAPSHOT_READY:
|
||||||
|
pkt_func = (pkt_func_def)hfi_process_session_dump_notify;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dprintk(CVP_HFI, "Use default msg handler: %#x\n",
|
dprintk(CVP_HFI, "Use default msg handler: %#x\n",
|
||||||
msg_hdr->packet);
|
msg_hdr->packet);
|
||||||
|
@@ -1302,6 +1302,7 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst,
|
|||||||
struct eva_kmd_sys_properties *props = &arg->data.sys_properties;
|
struct eva_kmd_sys_properties *props = &arg->data.sys_properties;
|
||||||
struct cvp_hfi_device *hdev;
|
struct cvp_hfi_device *hdev;
|
||||||
struct iris_hfi_device *hfi;
|
struct iris_hfi_device *hfi;
|
||||||
|
struct cvp_session_prop *session_prop;
|
||||||
int i, rc = 0;
|
int i, rc = 0;
|
||||||
|
|
||||||
if (!inst || !inst->core || !inst->core->device) {
|
if (!inst || !inst->core || !inst->core->device) {
|
||||||
@@ -1312,6 +1313,14 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst,
|
|||||||
hdev = inst->core->device;
|
hdev = inst->core->device;
|
||||||
hfi = hdev->hfi_device_data;
|
hfi = hdev->hfi_device_data;
|
||||||
|
|
||||||
|
if (props->prop_num > MAX_KMD_PROP_NUM_PER_PACKET) {
|
||||||
|
dprintk(CVP_ERR, "Too many properties %d to get\n",
|
||||||
|
props->prop_num);
|
||||||
|
return -E2BIG;
|
||||||
|
}
|
||||||
|
|
||||||
|
session_prop = &inst->prop;
|
||||||
|
|
||||||
for (i = 0; i < props->prop_num; i++) {
|
for (i = 0; i < props->prop_num; i++) {
|
||||||
switch (props->prop_data[i].prop_type) {
|
switch (props->prop_data[i].prop_type) {
|
||||||
case EVA_KMD_PROP_HFI_VERSION:
|
case EVA_KMD_PROP_HFI_VERSION:
|
||||||
@@ -1319,6 +1328,18 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst,
|
|||||||
props->prop_data[i].data = hfi->version;
|
props->prop_data[i].data = hfi->version;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case EVA_KMD_PROP_SESSION_DUMPOFFSET:
|
||||||
|
{
|
||||||
|
props->prop_data[i].data =
|
||||||
|
session_prop->dump_offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVA_KMD_PROP_SESSION_DUMPSIZE:
|
||||||
|
{
|
||||||
|
props->prop_data[i].data =
|
||||||
|
session_prop->dump_size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case EVA_KMD_PROP_PWR_FDU:
|
case EVA_KMD_PROP_PWR_FDU:
|
||||||
{
|
{
|
||||||
props->prop_data[i].data =
|
props->prop_data[i].data =
|
||||||
@@ -1449,6 +1470,12 @@ static int msm_cvp_set_sysprop(struct msm_cvp_inst *inst,
|
|||||||
case EVA_KMD_PROP_PWR_FPS_ICA:
|
case EVA_KMD_PROP_PWR_FPS_ICA:
|
||||||
session_prop->fps[HFI_HW_ICA] = prop_array[i].data;
|
session_prop->fps[HFI_HW_ICA] = prop_array[i].data;
|
||||||
break;
|
break;
|
||||||
|
case EVA_KMD_PROP_SESSION_DUMPOFFSET:
|
||||||
|
session_prop->dump_offset = prop_array[i].data;
|
||||||
|
break;
|
||||||
|
case EVA_KMD_PROP_SESSION_DUMPSIZE:
|
||||||
|
session_prop->dump_size = prop_array[i].data;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dprintk(CVP_ERR,
|
dprintk(CVP_ERR,
|
||||||
"unrecognized sys property to set %d\n",
|
"unrecognized sys property to set %d\n",
|
||||||
|
@@ -463,6 +463,34 @@ static void handle_event_change(enum hal_command_response cmd, void *data)
|
|||||||
dprintk(CVP_WARN, "%s is not supported on CVP!\n", __func__);
|
dprintk(CVP_WARN, "%s is not supported on CVP!\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_session_dump_notify(enum hal_command_response cmd,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct msm_cvp_cb_cmd_done *response = data;
|
||||||
|
struct msm_cvp_inst *inst;
|
||||||
|
unsigned long flags = 0;
|
||||||
|
|
||||||
|
if (!response) {
|
||||||
|
dprintk(CVP_ERR,
|
||||||
|
"Failed to get valid response during dump notify\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst = cvp_get_inst(get_cvp_core(response->device_id),
|
||||||
|
response->session_id);
|
||||||
|
if (!inst) {
|
||||||
|
dprintk(CVP_WARN, "%s:Got a response for an inactive session\n",
|
||||||
|
__func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spin_lock_irqsave(&inst->event_handler.lock, flags);
|
||||||
|
inst->event_handler.event = CVP_DUMP_EVENT;
|
||||||
|
spin_unlock_irqrestore(&inst->event_handler.lock, flags);
|
||||||
|
wake_up_all(&inst->event_handler.wq);
|
||||||
|
dprintk(CVP_ERR,"Event_handler woken up\n");
|
||||||
|
cvp_put_inst(inst);
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_release_res_done(enum hal_command_response cmd, void *data)
|
static void handle_release_res_done(enum hal_command_response cmd, void *data)
|
||||||
{
|
{
|
||||||
struct msm_cvp_cb_cmd_done *response = data;
|
struct msm_cvp_cb_cmd_done *response = data;
|
||||||
@@ -756,6 +784,9 @@ void cvp_handle_cmd_response(enum hal_command_response cmd, void *data)
|
|||||||
case HAL_SESSION_RELEASE_BUFFER_DONE:
|
case HAL_SESSION_RELEASE_BUFFER_DONE:
|
||||||
handle_session_release_buf_done(cmd, data);
|
handle_session_release_buf_done(cmd, data);
|
||||||
break;
|
break;
|
||||||
|
case HAL_SESSION_DUMP_NOTIFY:
|
||||||
|
handle_session_dump_notify(cmd, data);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dprintk(CVP_HFI, "response unhandled: %d\n", cmd);
|
dprintk(CVP_HFI, "response unhandled: %d\n", cmd);
|
||||||
break;
|
break;
|
||||||
|
@@ -250,6 +250,8 @@ struct cvp_session_prop {
|
|||||||
u32 ddr_cache;
|
u32 ddr_cache;
|
||||||
u32 ddr_op_cache;
|
u32 ddr_op_cache;
|
||||||
u32 fps[HFI_MAX_HW_THREADS];
|
u32 fps[HFI_MAX_HW_THREADS];
|
||||||
|
u32 dump_offset;
|
||||||
|
u32 dump_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum cvp_event_t {
|
enum cvp_event_t {
|
||||||
@@ -259,6 +261,7 @@ enum cvp_event_t {
|
|||||||
CVP_MAX_CLIENTS_EVENT,
|
CVP_MAX_CLIENTS_EVENT,
|
||||||
CVP_HW_UNSUPPORTED_EVENT,
|
CVP_HW_UNSUPPORTED_EVENT,
|
||||||
CVP_INVALID_EVENT,
|
CVP_INVALID_EVENT,
|
||||||
|
CVP_DUMP_EVENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cvp_session_event {
|
struct cvp_session_event {
|
||||||
|
@@ -340,6 +340,30 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[] = {
|
|||||||
.is_config_pkt = true,
|
.is_config_pkt = true,
|
||||||
.resp = HAL_NO_RESP,
|
.resp = HAL_NO_RESP,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.size = 0xFFFFFFFF,
|
||||||
|
.type = HFI_CMD_SESSION_CVP_SET_SNAPSHOT_BUFFERS,
|
||||||
|
.is_config_pkt = true,
|
||||||
|
.resp = HAL_NO_RESP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.size = 0xFFFFFFFF,
|
||||||
|
.type = HFI_CMD_SESSION_CVP_RELEASE_SNAPSHOT_BUFFERS,
|
||||||
|
.is_config_pkt = true,
|
||||||
|
.resp = HAL_NO_RESP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.size = 0xFFFFFFFF,
|
||||||
|
.type = HFI_CMD_SESSION_CVP_SET_SNAPSHOT_MODE,
|
||||||
|
.is_config_pkt = true,
|
||||||
|
.resp = HAL_NO_RESP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.size = 0xFFFFFFFF,
|
||||||
|
.type = HFI_CMD_SESSION_CVP_SNAPSHOT_WRITE_DONE,
|
||||||
|
.is_config_pkt = true,
|
||||||
|
.resp = HAL_NO_RESP,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.size = 0xFFFFFFFF,
|
.size = 0xFFFFFFFF,
|
||||||
.type = HFI_CMD_SESSION_CVP_FD_CONFIG,
|
.type = HFI_CMD_SESSION_CVP_FD_CONFIG,
|
||||||
|
Reference in New Issue
Block a user