diff options
Diffstat (limited to 'debug.c')
-rw-r--r-- | debug.c | 156 |
1 files changed, 56 insertions, 100 deletions
@@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0 - /* * This file is part of the QM35 UCI stack for linux. * @@ -268,78 +267,6 @@ static ssize_t debug_coredump_write(struct file *filp, const char __user *buff, return count; } -static int debug_debug_certificate_open(struct inode *inodep, struct file *filep) -{ - struct debug *debug = priv_from_file(filep); - - if (debug->certificate != NULL) - return -EBUSY; - - debug->certificate = kmalloc(sizeof(*debug->certificate) + DEBUG_CERTIFICATE_SIZE, - GFP_KERNEL); - if (debug->certificate == NULL) - return -ENOMEM; - - return 0; -} - -static int debug_debug_certificate_close(struct inode *inodep, struct file *filep) -{ - struct debug *debug = priv_from_file(filep); - struct qm35_ctx *qm35_hdl; - int ret; - const char *operation = filep->f_pos ? "flashing" : "erasing"; - - qm35_hdl = container_of(debug, struct qm35_ctx, debug); - - qm35_hsspi_stop(qm35_hdl); - - dev_dbg(&qm35_hdl->spi->dev, "%s debug certificate (%lld bytes)\n", operation, - filep->f_pos); - - if (filep->f_pos) { - - debug->certificate->size = filep->f_pos; - - } else { - - /* WA: qmrom_erase_dbg_cert is not working, waiting to find the root - * cause, workaround is to write a zeroed certificate - * ret = qmrom_erase_dbg_cert(qm35_hdl->spi, qmrom_spi_reset_device, qm35_hdl); - */ - debug->certificate->size = DEBUG_CERTIFICATE_SIZE; - memset(debug->certificate->data, 0, DEBUG_CERTIFICATE_SIZE); - } - - ret = qmrom_flash_dbg_cert(qm35_hdl->spi, debug->certificate, - qmrom_spi_reset_device, qm35_hdl); - - if (ret) - dev_err(&qm35_hdl->spi->dev, "%s debug certificate fails: %d\n", operation, ret); - else - dev_info(&qm35_hdl->spi->dev, "%s debug certificate success\n", operation); - - msleep(QM_BEFORE_RESET_MS); - qm35_reset(qm35_hdl, QM_RESET_LOW_MS); - msleep(QM_BOOT_MS); - - qm35_hsspi_start(qm35_hdl); - - kfree(debug->certificate); - debug->certificate = NULL; - - return 0; -} - -static ssize_t debug_debug_certificate_write(struct file *filp, - const char __user *buff, size_t count, loff_t *off) -{ - struct debug *debug = priv_from_file(filp); - - return simple_write_to_buffer(debug->certificate->data, - DEBUG_CERTIFICATE_SIZE, off, buff, count); -} - static const struct file_operations debug_enable_fops = { .owner = THIS_MODULE, .write = debug_enable_write, @@ -372,13 +299,6 @@ static const struct file_operations debug_coredump_fops = { .write = debug_coredump_write, }; -static const struct file_operations debug_debug_certificate_fops = { - .owner = THIS_MODULE, - .open = debug_debug_certificate_open, - .write = debug_debug_certificate_write, - .release = debug_debug_certificate_close, -}; - int debug_create_module_entry(struct debug *debug, struct log_module *log_module) { @@ -417,6 +337,21 @@ void debug_new_trace_available(struct debug *debug) static int debug_devid_show(struct seq_file *s, void *unused) { struct debug *debug = (struct debug *)s->private; + uint16_t dev_id; + int rc; + + if (debug->trace_ops && debug->trace_ops->get_dev_id) { + rc = debug->trace_ops->get_dev_id(debug, &dev_id); + if (rc < 0) + return -EIO; + seq_printf(s, "deca%04x\n", dev_id); + } + return 0; +} + +static int debug_socid_show(struct seq_file *s, void *unused) +{ + struct debug *debug = (struct debug *)s->private; uint8_t soc_id[ROM_SOC_ID_LEN]; int rc; @@ -430,21 +365,57 @@ static int debug_devid_show(struct seq_file *s, void *unused) } DEFINE_SHOW_ATTRIBUTE(debug_devid); +DEFINE_SHOW_ATTRIBUTE(debug_socid); -int debug_init(struct debug *debug, struct dentry *root) +void debug_soc_info_available(struct debug *debug) { struct dentry *file; - init_waitqueue_head(&debug->wq); - mutex_init(&debug->pv_filp_lock); - debug->pv_filp = NULL; + debug->chip_dir = debugfs_create_dir("chip", debug->root_dir); + if (!debug->chip_dir) { + pr_err("qm35: failed to create /sys/kernel/debug/uwb0/chip\n"); + goto unregister; + } + + file = debugfs_create_file("dev_id", 0444, debug->chip_dir, debug, + &debug_devid_fops); + if (!file) { + pr_err("qm35: failed to create /sys/kernel/debug/uwb0/fw/dev_id\n"); + goto unregister; + } + + file = debugfs_create_file("soc_id", 0444, debug->chip_dir, debug, + &debug_socid_fops); + if (!file) { + pr_err("qm35: failed to create /sys/kernel/debug/uwb0/fw/soc_id\n"); + goto unregister; + } + return; + +unregister: + debugfs_remove_recursive(debug->chip_dir); +} + +int debug_init_root(struct debug *debug, struct dentry *root) +{ debug->root_dir = debugfs_create_dir("uwb0", root); if (!debug->root_dir) { pr_err("qm35: failed to create /sys/kernel/debug/uwb0\n"); - goto unregister; + return -1; } + return 0; +} + +int debug_init(struct debug *debug) +{ + struct dentry *file; + + init_waitqueue_head(&debug->wq); + mutex_init(&debug->pv_filp_lock); + debug->pv_filp = NULL; + debug->fw_dir = debugfs_create_dir("fw", debug->root_dir); if (!debug->fw_dir) { pr_err("qm35: failed to create /sys/kernel/debug/uwb0/fw\n"); @@ -472,21 +443,6 @@ int debug_init(struct debug *debug, struct dentry *root) goto unregister; } - file = debugfs_create_file("devid", 0444, debug->fw_dir, debug, - &debug_devid_fops); - if (!file) { - pr_err("qm35: failed to create /sys/kernel/debug/uwb0/fw/devid\n"); - goto unregister; - } - - debug->certificate = NULL; - file = debugfs_create_file("debug_certificate", 0200, debug->fw_dir, debug, - &debug_debug_certificate_fops); - if (!file) { - pr_err("qm35: failed to create /sys/kernel/debug/uwb0/fw/debug_certificate\n"); - goto unregister; - } - file = debugfs_create_file("test_sleep_hsspi_ms", 0200, debug->fw_dir, debug, &debug_test_hsspi_sleep_fops); if (!file) { |