MLK-21655: VPU Decoder: driver supply an interface to get the firmware
authorming_qian <ming.qian@nxp.com>
Tue, 7 May 2019 05:09:19 +0000 (13:09 +0800)
committerming_qian <ming.qian@nxp.com>
Tue, 7 May 2019 09:36:15 +0000 (17:36 +0800)
log

get the firmware log:
cat /sys/devices/platform/2c000000.vpu_decoder/fwlog

Signed-off-by: ming_qian <ming.qian@nxp.com>
drivers/mxc/vpu_malone/vpu_b0.c
drivers/mxc/vpu_malone/vpu_b0.h

index a762c48..7eccc25 100644 (file)
@@ -3418,6 +3418,7 @@ static irqreturn_t fsl_vpu_mu_isr(int irq, void *This)
                                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);
 
@@ -4104,6 +4105,48 @@ exit:
        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,
@@ -4871,6 +4914,7 @@ static int vpu_probe(struct platform_device *pdev)
        }
 
        pm_runtime_put_sync(&pdev->dev);
+       device_create_file(dev->generic_dev, &dev_attr_fwlog);
 
        return 0;
 
@@ -4902,6 +4946,8 @@ static int vpu_remove(struct platform_device *pdev)
 {
        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);
index fc72333..f0be801 100644 (file)
@@ -208,6 +208,17 @@ struct queue_data {
        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;
@@ -246,6 +257,8 @@ struct vpu_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 {