vpu_dec_cpu_phy_to_mu(dev, dev->m0_rpc_phy),
dev->m0_rpc_virt,
dev->m0_rpc_size);
+ dev->print_buf = dev->m0_rpc_virt + M0_PRINT_OFFSET;
rpc_set_system_cfg_value(dev->shared_mem.pSharedInterface,
VPU_REG_BASE);
return num;
}
+static ssize_t show_fw_log(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ int num = 0;
+ int length;
+ u32 rptr;
+ u32 wptr;
+
+ if (!vdev->print_buf)
+ return 0;
+
+ rptr = vdev->print_buf->read;
+ wptr = vdev->print_buf->write;
+
+ if (rptr == wptr)
+ return 0;
+ else if (rptr < wptr)
+ length = wptr - rptr;
+ else
+ length = vdev->print_buf->bytes + wptr - rptr;
+
+ if (length > PAGE_SIZE)
+ length = PAGE_SIZE;
+
+ if (length + rptr > vdev->print_buf->bytes) {
+ num = vdev->print_buf->bytes - rptr;
+ memcpy(buf, vdev->print_buf->buffer + rptr, num);
+ length -= num;
+ rptr = 0;
+ }
+ memcpy(buf + num, vdev->print_buf->buffer + rptr, length);
+ num += length;
+ rptr += length;
+ rptr %= vdev->print_buf->bytes;
+
+ vdev->print_buf->read = rptr;
+
+ return num;
+}
+DEVICE_ATTR(fwlog, 0644, show_fw_log, NULL);
+
static int create_instance_command_file(struct vpu_ctx *ctx)
{
scnprintf(ctx->command_name, sizeof(ctx->command_name) - 1,
}
pm_runtime_put_sync(&pdev->dev);
+ device_create_file(dev->generic_dev, &dev_attr_fwlog);
return 0;
{
struct vpu_dev *dev = platform_get_drvdata(pdev);
+
+ device_remove_file(dev->generic_dev, &dev_attr_fwlog);
destroy_workqueue(dev->workqueue);
if (dev->m0_p_fw_space_vir)
iounmap(dev->m0_p_fw_space_vir);
struct vb2_data_req vb2_reqs[VPU_MAX_BUFFER];
enum QUEUE_TYPE type;
};
+
+struct print_buf_desc {
+ u32 start_h_phy;
+ u32 start_h_vir;
+ u32 start_m;
+ u32 bytes;
+ u32 read;
+ u32 write;
+ char buffer[0];
+};
+
struct vpu_ctx;
struct vpu_dev {
struct device *generic_dev;
struct shared_addr shared_mem;
struct vpu_ctx *ctx[VPU_MAX_NUM_STREAMS];
struct dentry *debugfs_root;
+
+ struct print_buf_desc *print_buf;
};
struct vpu_statistic {