static int show_channels(struct device *dev, void *data) { struct nvhost_channel *ch; struct nvhost_device *nvdev = to_nvhost_device(dev); struct output *o = data; struct nvhost_master *m; if (nvdev == NULL) return 0; m = nvhost_get_host(nvdev); ch = nvdev->channel; if (ch) { mutex_lock(&ch->reflock); if (ch->refcount) { mutex_lock(&ch->cdma.lock); nvhost_get_chip_ops()->debug.show_channel_fifo(m, ch, o, nvdev->index); nvhost_get_chip_ops()->debug.show_channel_cdma(m, ch, o, nvdev->index); mutex_unlock(&ch->cdma.lock); } mutex_unlock(&ch->reflock); } return 0; }
static void show_syncpts(struct nvhost_master *m, struct output *o) { int i; BUG_ON(!nvhost_get_chip_ops()->syncpt.name); nvhost_debug_output(o, "---- syncpts ----\n"); for (i = 0; i < nvhost_syncpt_nb_pts(&m->syncpt); i++) { u32 max = nvhost_syncpt_read_max(&m->syncpt, i); u32 min = nvhost_syncpt_update_min(&m->syncpt, i); if (!min && !max) continue; nvhost_debug_output(o, "id %d (%s) min %d max %d\n", i, nvhost_get_chip_ops()->syncpt.name(&m->syncpt, i), min, max); } for (i = 0; i < nvhost_syncpt_nb_pts(&m->syncpt); i++) { u32 base_val; base_val = nvhost_syncpt_read_wait_base(&m->syncpt, i); if (base_val) nvhost_debug_output(o, "waitbase id %d val %d\n", i, base_val); } nvhost_debug_output(o, "\n"); }
static int show_channels(struct platform_device *pdev, void *data) { struct nvhost_channel *ch; struct output *o = data; struct nvhost_master *m; struct nvhost_device_data *pdata; if (pdev == NULL) return 0; pdata = platform_get_drvdata(pdev); m = nvhost_get_host(pdev); ch = pdata->channel; if (ch) { int locked = mutex_trylock(&ch->reflock); if (ch->refcount) { mutex_lock(&ch->cdma.lock); nvhost_get_chip_ops()->debug.show_channel_fifo( m, ch, o, pdata->index); nvhost_get_chip_ops()->debug.show_channel_cdma( m, ch, o, pdata->index); mutex_unlock(&ch->cdma.lock); } if (locked) mutex_unlock(&ch->reflock); } return 0; }
void nvhost_debug_init(struct nvhost_master *master) { struct nvhost_device_data *pdata; struct dentry *de = debugfs_create_dir("tegra_host", NULL); if (!de) return; pdata = platform_get_drvdata(master->dev); /* Store the created entry */ pdata->debugfs = de; debugfs_create_file("status", S_IRUGO, de, master, &nvhost_debug_fops); debugfs_create_file("status_all", S_IRUGO, de, master, &nvhost_debug_all_fops); debugfs_create_u32("null_kickoff_pid", S_IRUGO|S_IWUSR, de, &nvhost_debug_null_kickoff_pid); debugfs_create_u32("trace_cmdbuf", S_IRUGO|S_IWUSR, de, &nvhost_debug_trace_cmdbuf); if (nvhost_get_chip_ops()->debug.debug_init) nvhost_get_chip_ops()->debug.debug_init(de); debugfs_create_u32("force_timeout_pid", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_pid); debugfs_create_u32("force_timeout_val", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_val); debugfs_create_u32("force_timeout_channel", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_channel); debugfs_create_u32("force_timeout_dump", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_dump); nvhost_debug_force_timeout_dump = 0; debugfs_create_file("3d_actmon_k", S_IRUGO, de, master, &actmon_k_fops); debugfs_create_file("3d_actmon_sample_period", S_IRUGO, de, master, &actmon_sample_period_fops); debugfs_create_file("3d_actmon_sample_period_norm", S_IRUGO, de, master, &actmon_sample_period_norm_fops); debugfs_create_file("3d_actmon_avg_norm", S_IRUGO, de, master, &actmon_avg_norm_fops); debugfs_create_file("3d_actmon_avg", S_IRUGO, de, master, &actmon_avg_fops); debugfs_create_file("3d_actmon_above_wmark", S_IRUGO, de, master, &actmon_above_wmark_fops); debugfs_create_file("3d_actmon_below_wmark", S_IRUGO, de, master, &actmon_below_wmark_fops); }
static void show_all_no_fifo(struct nvhost_master *m, struct output *o) { nvhost_module_busy(m->dev); nvhost_get_chip_ops()->debug.show_mlocks(m, o); show_syncpts(m, o); nvhost_debug_output(o, "---- channels ----\n"); nvhost_device_list_for_all(o, show_channels_no_fifo); nvhost_module_idle(m->dev); }
static void show_all_no_fifo(struct nvhost_master *m, struct output *o) { nvhost_module_busy(m->dev); nvhost_get_chip_ops()->debug.show_mlocks(m, o); show_syncpts(m, o); nvhost_debug_output(o, "---- channels ----\n"); bus_for_each_dev(&(nvhost_bus_get())->nvhost_bus_type, NULL, o, show_channels_no_fifo); nvhost_module_idle(m->dev); }
void nvhost_debug_init(struct nvhost_master *master) { struct dentry *de = debugfs_create_dir("tegra_host", NULL); debugfs_create_file("status", S_IRUGO, de, master, &nvhost_debug_fops); debugfs_create_file("status_all", S_IRUGO, de, master, &nvhost_debug_all_fops); debugfs_create_u32("null_kickoff_pid", S_IRUGO|S_IWUSR, de, &nvhost_debug_null_kickoff_pid); debugfs_create_u32("trace_cmdbuf", S_IRUGO|S_IWUSR, de, &nvhost_debug_trace_cmdbuf); if (nvhost_get_chip_ops()->debug.debug_init) nvhost_get_chip_ops()->debug.debug_init(de); debugfs_create_u32("force_timeout_pid", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_pid); debugfs_create_u32("force_timeout_val", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_val); debugfs_create_u32("force_timeout_channel", S_IRUGO|S_IWUSR, de, &nvhost_debug_force_timeout_channel); }