|
@@ -697,75 +697,6 @@ err_after_dq_free_list:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
-static void cam_jpeg_mgr_print_io_bufs(struct cam_packet *packet,
|
|
|
|
- int32_t iommu_hdl, int32_t sec_mmu_hdl, uint32_t pf_buf_info,
|
|
|
|
- bool *mem_found)
|
|
|
|
-{
|
|
|
|
- dma_addr_t iova_addr;
|
|
|
|
- size_t src_buf_size;
|
|
|
|
- int i;
|
|
|
|
- int j;
|
|
|
|
- int rc = 0;
|
|
|
|
- int32_t mmu_hdl;
|
|
|
|
- struct cam_buf_io_cfg *io_cfg = NULL;
|
|
|
|
-
|
|
|
|
- if (mem_found)
|
|
|
|
- *mem_found = false;
|
|
|
|
-
|
|
|
|
- io_cfg = (struct cam_buf_io_cfg *)((uint32_t *)&packet->payload +
|
|
|
|
- packet->io_configs_offset / 4);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < packet->num_io_configs; i++) {
|
|
|
|
- for (j = 0; j < CAM_PACKET_MAX_PLANES; j++) {
|
|
|
|
- if (!io_cfg[i].mem_handle[j])
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- if (GET_FD_FROM_HANDLE(io_cfg[i].mem_handle[j]) ==
|
|
|
|
- GET_FD_FROM_HANDLE(pf_buf_info)) {
|
|
|
|
- CAM_INFO(CAM_JPEG,
|
|
|
|
- "Found PF at port: %d mem %x fd: %x",
|
|
|
|
- io_cfg[i].resource_type,
|
|
|
|
- io_cfg[i].mem_handle[j],
|
|
|
|
- pf_buf_info);
|
|
|
|
- if (mem_found)
|
|
|
|
- *mem_found = true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- CAM_INFO(CAM_JPEG, "port: %d f: %u format: %d dir %d",
|
|
|
|
- io_cfg[i].resource_type,
|
|
|
|
- io_cfg[i].fence,
|
|
|
|
- io_cfg[i].format,
|
|
|
|
- io_cfg[i].direction);
|
|
|
|
-
|
|
|
|
- mmu_hdl = cam_mem_is_secure_buf(
|
|
|
|
- io_cfg[i].mem_handle[j]) ? sec_mmu_hdl :
|
|
|
|
- iommu_hdl;
|
|
|
|
- rc = cam_mem_get_io_buf(io_cfg[i].mem_handle[j],
|
|
|
|
- mmu_hdl, &iova_addr, &src_buf_size, NULL);
|
|
|
|
- if (rc < 0) {
|
|
|
|
- CAM_ERR(CAM_UTIL, "get src buf address fail");
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ((iova_addr & 0xFFFFFFFF) != iova_addr) {
|
|
|
|
- CAM_ERR(CAM_JPEG, "Invalid mapped address");
|
|
|
|
- rc = -EINVAL;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- CAM_INFO(CAM_JPEG,
|
|
|
|
- "pln %u w %u h %u stride %u slice %u size %zx addr 0x%llx offset 0x%x memh %x",
|
|
|
|
- j, io_cfg[i].planes[j].width,
|
|
|
|
- io_cfg[i].planes[j].height,
|
|
|
|
- io_cfg[i].planes[j].plane_stride,
|
|
|
|
- io_cfg[i].planes[j].slice_height,
|
|
|
|
- src_buf_size, iova_addr,
|
|
|
|
- io_cfg[i].offsets[j],
|
|
|
|
- io_cfg[i].mem_handle[j]);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int cam_jpeg_mgr_prepare_hw_update(void *hw_mgr_priv,
|
|
static int cam_jpeg_mgr_prepare_hw_update(void *hw_mgr_priv,
|
|
void *prepare_hw_update_args)
|
|
void *prepare_hw_update_args)
|
|
{
|
|
{
|
|
@@ -1573,6 +1504,18 @@ static int cam_jpeg_init_devices(struct device_node *of_node,
|
|
g_jpeg_hw_mgr.cdm_reg_map[CAM_JPEG_DEV_DMA][0] =
|
|
g_jpeg_hw_mgr.cdm_reg_map[CAM_JPEG_DEV_DMA][0] =
|
|
&dma_soc_info->reg_map[0];
|
|
&dma_soc_info->reg_map[0];
|
|
|
|
|
|
|
|
+ rc = g_jpeg_hw_mgr.devices[CAM_JPEG_DEV_ENC][0]->hw_ops.process_cmd(
|
|
|
|
+ g_jpeg_hw_mgr.devices[CAM_JPEG_DEV_ENC][0]->hw_priv,
|
|
|
|
+ CAM_JPEG_CMD_GET_NUM_PID,
|
|
|
|
+ &g_jpeg_hw_mgr.num_pid[CAM_JPEG_DEV_ENC],
|
|
|
|
+ sizeof(uint32_t));
|
|
|
|
+
|
|
|
|
+ rc = g_jpeg_hw_mgr.devices[CAM_JPEG_DEV_DMA][0]->hw_ops.process_cmd(
|
|
|
|
+ g_jpeg_hw_mgr.devices[CAM_JPEG_DEV_DMA][0]->hw_priv,
|
|
|
|
+ CAM_JPEG_CMD_GET_NUM_PID,
|
|
|
|
+ &g_jpeg_hw_mgr.num_pid[CAM_JPEG_DEV_DMA],
|
|
|
|
+ sizeof(uint32_t));
|
|
|
|
+
|
|
*p_num_enc_dev = num_dev;
|
|
*p_num_enc_dev = num_dev;
|
|
*p_num_dma_dev = num_dma_dev;
|
|
*p_num_dma_dev = num_dma_dev;
|
|
|
|
|
|
@@ -1725,6 +1668,109 @@ hw_dump:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void cam_jpeg_mgr_dump_pf_data(
|
|
|
|
+ struct cam_jpeg_hw_mgr *hw_mgr,
|
|
|
|
+ struct cam_hw_cmd_args *hw_cmd_args)
|
|
|
|
+{
|
|
|
|
+ struct cam_jpeg_hw_ctx_data *ctx_data;
|
|
|
|
+ struct cam_packet *packet;
|
|
|
|
+ struct cam_jpeg_match_pid_args jpeg_pid_mid_args;
|
|
|
|
+ struct cam_buf_io_cfg *io_cfg = NULL;
|
|
|
|
+ uint32_t dev_type;
|
|
|
|
+ dma_addr_t iova_addr;
|
|
|
|
+ size_t src_buf_size;
|
|
|
|
+ int i, j;
|
|
|
|
+ int32_t mmu_hdl;
|
|
|
|
+ bool hw_pid_support = true;
|
|
|
|
+ int rc = 0;
|
|
|
|
+
|
|
|
|
+ ctx_data = (struct cam_jpeg_hw_ctx_data *)hw_cmd_args->ctxt_to_hw_map;
|
|
|
|
+ packet = hw_cmd_args->u.pf_args.pf_data.packet;
|
|
|
|
+
|
|
|
|
+ jpeg_pid_mid_args.fault_mid = hw_cmd_args->u.pf_args.mid;
|
|
|
|
+ jpeg_pid_mid_args.pid = hw_cmd_args->u.pf_args.pid;
|
|
|
|
+ dev_type = ctx_data->jpeg_dev_acquire_info.dev_type;
|
|
|
|
+
|
|
|
|
+ if (!hw_mgr->num_pid[dev_type]) {
|
|
|
|
+ hw_pid_support = false;
|
|
|
|
+ goto iodump;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = hw_mgr->devices[dev_type][0]->hw_ops.process_cmd(
|
|
|
|
+ hw_mgr->devices[dev_type][0]->hw_priv,
|
|
|
|
+ CAM_JPEG_CMD_MATCH_PID_MID,
|
|
|
|
+ &jpeg_pid_mid_args, sizeof(jpeg_pid_mid_args));
|
|
|
|
+ if (rc) {
|
|
|
|
+ CAM_ERR(CAM_JPEG, "CAM_JPEG_CMD_MATCH_PID_MID failed %d", rc);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!jpeg_pid_mid_args.pid_match_found) {
|
|
|
|
+ CAM_INFO(CAM_JPEG, "This context data is not matched with pf pid and mid");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+iodump:
|
|
|
|
+ io_cfg = (struct cam_buf_io_cfg *)((uint32_t *)&packet->payload +
|
|
|
|
+ packet->io_configs_offset / 4);
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < packet->num_io_configs; i++) {
|
|
|
|
+ if (hw_pid_support) {
|
|
|
|
+ if (io_cfg[i].resource_type !=
|
|
|
|
+ jpeg_pid_mid_args.match_res)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (i == packet->num_io_configs) {
|
|
|
|
+ CAM_ERR(CAM_JPEG,
|
|
|
|
+ "getting io port for mid resource id failed req id:%lld res id:0x%x",
|
|
|
|
+ packet->header.request_id,
|
|
|
|
+ jpeg_pid_mid_args.match_res);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (j = 0; j < CAM_PACKET_MAX_PLANES; j++) {
|
|
|
|
+ if (!io_cfg[i].mem_handle[j])
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ CAM_INFO(CAM_JPEG, "port: %d f: %u format: %d dir %d",
|
|
|
|
+ io_cfg[i].resource_type,
|
|
|
|
+ io_cfg[i].fence,
|
|
|
|
+ io_cfg[i].format,
|
|
|
|
+ io_cfg[i].direction);
|
|
|
|
+
|
|
|
|
+ mmu_hdl = cam_mem_is_secure_buf(
|
|
|
|
+ io_cfg[i].mem_handle[j]) ? hw_mgr->iommu_sec_hdl :
|
|
|
|
+ hw_mgr->iommu_hdl;
|
|
|
|
+ rc = cam_mem_get_io_buf(io_cfg[i].mem_handle[j],
|
|
|
|
+ mmu_hdl, &iova_addr, &src_buf_size, NULL);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_UTIL, "get src buf address fail");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if ((iova_addr & 0xFFFFFFFF) != iova_addr) {
|
|
|
|
+ CAM_ERR(CAM_JPEG, "Invalid mapped address");
|
|
|
|
+ rc = -EINVAL;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ CAM_INFO(CAM_JPEG,
|
|
|
|
+ "pln %u w %u h %u stride %u slice %u size %d addr 0x%x offset 0x%x memh %x",
|
|
|
|
+ j, io_cfg[i].planes[j].width,
|
|
|
|
+ io_cfg[i].planes[j].height,
|
|
|
|
+ io_cfg[i].planes[j].plane_stride,
|
|
|
|
+ io_cfg[i].planes[j].slice_height,
|
|
|
|
+ (int32_t)src_buf_size,
|
|
|
|
+ (unsigned int)iova_addr,
|
|
|
|
+ io_cfg[i].offsets[j],
|
|
|
|
+ io_cfg[i].mem_handle[j]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (hw_pid_support)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static int cam_jpeg_mgr_cmd(void *hw_mgr_priv, void *cmd_args)
|
|
static int cam_jpeg_mgr_cmd(void *hw_mgr_priv, void *cmd_args)
|
|
{
|
|
{
|
|
int rc = 0;
|
|
int rc = 0;
|
|
@@ -1738,15 +1784,11 @@ static int cam_jpeg_mgr_cmd(void *hw_mgr_priv, void *cmd_args)
|
|
|
|
|
|
switch (hw_cmd_args->cmd_type) {
|
|
switch (hw_cmd_args->cmd_type) {
|
|
case CAM_HW_MGR_CMD_DUMP_PF_INFO:
|
|
case CAM_HW_MGR_CMD_DUMP_PF_INFO:
|
|
- cam_jpeg_mgr_print_io_bufs(
|
|
|
|
- hw_cmd_args->u.pf_args.pf_data.packet,
|
|
|
|
- hw_mgr->iommu_hdl,
|
|
|
|
- hw_mgr->iommu_sec_hdl,
|
|
|
|
- hw_cmd_args->u.pf_args.buf_info,
|
|
|
|
- hw_cmd_args->u.pf_args.mem_found);
|
|
|
|
|
|
+ cam_jpeg_mgr_dump_pf_data(hw_mgr, hw_cmd_args);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
- CAM_ERR(CAM_JPEG, "Invalid cmd");
|
|
|
|
|
|
+ CAM_ERR(CAM_JPEG, "Invalid cmd :%d",
|
|
|
|
+ hw_cmd_args->cmd_type);
|
|
}
|
|
}
|
|
|
|
|
|
return rc;
|
|
return rc;
|