static int etm_online_cpu(unsigned int cpu) { if (!etmdrvdata[cpu]) return 0; if (etmdrvdata[cpu]->boot_enable && !etmdrvdata[cpu]->sticky_enable) coresight_enable(etmdrvdata[cpu]->csdev); return 0; }
static int stm_generic_link(struct stm_data *stm_data, unsigned int master, unsigned int channel) { struct stm_drvdata *drvdata = container_of(stm_data, struct stm_drvdata, stm); if (!drvdata || !drvdata->csdev) return -EINVAL; return coresight_enable(drvdata->csdev); }
static int etm_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; if (!etmdrvdata[cpu]) goto out; switch (action & (~CPU_TASKS_FROZEN)) { case CPU_STARTING: spin_lock(&etmdrvdata[cpu]->spinlock); if (!etmdrvdata[cpu]->os_unlock) { etm_os_unlock(etmdrvdata[cpu]); etmdrvdata[cpu]->os_unlock = true; } if (etmdrvdata[cpu]->enable) etm_enable_hw(etmdrvdata[cpu]); spin_unlock(&etmdrvdata[cpu]->spinlock); break; case CPU_ONLINE: if (etmdrvdata[cpu]->boot_enable && !etmdrvdata[cpu]->sticky_enable) coresight_enable(etmdrvdata[cpu]->csdev); break; case CPU_DYING: spin_lock(&etmdrvdata[cpu]->spinlock); if (etmdrvdata[cpu]->enable) etm_disable_hw(etmdrvdata[cpu]); spin_unlock(&etmdrvdata[cpu]->spinlock); break; } out: return NOTIFY_OK; }
static int etm_probe(struct amba_device *adev, const struct amba_id *id) { int ret; void __iomem *base; struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; struct etm_drvdata *drvdata; struct resource *res = &adev->res; struct coresight_desc *desc; struct device_node *np = adev->dev.of_node; desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) return -ENOMEM; drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; if (np) { pdata = of_get_coresight_platform_data(dev, np); if (IS_ERR(pdata)) return PTR_ERR(pdata); adev->dev.platform_data = pdata; drvdata->use_cp14 = of_property_read_bool(np, "arm,cp14"); } drvdata->dev = &adev->dev; dev_set_drvdata(dev, drvdata); /* Validity for the resource is already checked by the AMBA core */ base = devm_ioremap_resource(dev, res); if (IS_ERR(base)) return PTR_ERR(base); drvdata->base = base; spin_lock_init(&drvdata->spinlock); drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ if (!IS_ERR(drvdata->atclk)) { ret = clk_prepare_enable(drvdata->atclk); if (ret) return ret; } drvdata->cpu = pdata ? pdata->cpu : 0; get_online_cpus(); etmdrvdata[drvdata->cpu] = drvdata; if (!smp_call_function_single(drvdata->cpu, etm_os_unlock, drvdata, 1)) drvdata->os_unlock = true; if (smp_call_function_single(drvdata->cpu, etm_init_arch_data, drvdata, 1)) dev_err(dev, "ETM arch init failed\n"); if (!etm_count++) register_hotcpu_notifier(&etm_cpu_notifier); put_online_cpus(); if (etm_arch_supported(drvdata->arch) == false) { ret = -EINVAL; goto err_arch_supported; } etm_init_default_data(drvdata); desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; desc->ops = &etm_cs_ops; desc->pdata = pdata; desc->dev = dev; desc->groups = coresight_etm_groups; drvdata->csdev = coresight_register(desc); if (IS_ERR(drvdata->csdev)) { ret = PTR_ERR(drvdata->csdev); goto err_arch_supported; } pm_runtime_put(&adev->dev); dev_info(dev, "%s initialized\n", (char *)id->data); if (boot_enable) { coresight_enable(drvdata->csdev); drvdata->boot_enable = true; } return 0; err_arch_supported: if (--etm_count == 0) unregister_hotcpu_notifier(&etm_cpu_notifier); return ret; }
static int __devinit stm_probe(struct platform_device *pdev) { int ret; struct device *dev = &pdev->dev; struct coresight_platform_data *pdata; struct stm_drvdata *drvdata; struct resource *res; size_t res_size, bitmap_size; struct coresight_desc *desc; if (coresight_fuse_access_disabled()) return -EPERM; if (pdev->dev.of_node) { pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node); if (IS_ERR(pdata)) return PTR_ERR(pdata); pdev->dev.platform_data = pdata; } drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; /* */ stmdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "stm-base"); if (!res) return -ENODEV; drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); if (!drvdata->base) return -ENOMEM; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "stm-data-base"); if (!res) return -ENODEV; if (boot_nr_channel) { res_size = min((resource_size_t)(boot_nr_channel * BYTES_PER_CHANNEL), resource_size(res)); bitmap_size = boot_nr_channel * sizeof(long); } else { res_size = min((resource_size_t)(NR_STM_CHANNEL * BYTES_PER_CHANNEL), resource_size(res)); bitmap_size = NR_STM_CHANNEL * sizeof(long); } drvdata->chs.base = devm_ioremap(dev, res->start, res_size); if (!drvdata->chs.base) return -ENOMEM; drvdata->chs.bitmap = devm_kzalloc(dev, bitmap_size, GFP_KERNEL); if (!drvdata->chs.bitmap) return -ENOMEM; spin_lock_init(&drvdata->spinlock); drvdata->clk = devm_clk_get(dev, "core_clk"); if (IS_ERR(drvdata->clk)) return PTR_ERR(drvdata->clk); ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE); if (ret) return ret; bitmap_fill(drvdata->entities, OST_ENTITY_MAX); if (pdev->dev.of_node) drvdata->write_64bit = of_property_read_bool(pdev->dev.of_node, "qcom,write-64bit"); desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) return -ENOMEM; desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE; desc->ops = &stm_cs_ops; desc->pdata = pdev->dev.platform_data; desc->dev = &pdev->dev; desc->groups = stm_attr_grps; desc->owner = THIS_MODULE; drvdata->csdev = coresight_register(desc); if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); drvdata->miscdev.name = ((struct coresight_platform_data *) (pdev->dev.platform_data))->name; drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; drvdata->miscdev.fops = &stm_fops; ret = misc_register(&drvdata->miscdev); if (ret) goto err; dev_info(drvdata->dev, "STM initialized\n"); if (boot_enable) coresight_enable(drvdata->csdev); return 0; err: coresight_unregister(drvdata->csdev); return ret; }
static int etm4_probe(struct amba_device *adev, const struct amba_id *id) { int ret; void __iomem *base; struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; struct etmv4_drvdata *drvdata; struct resource *res = &adev->res; struct coresight_desc desc = { 0 }; struct device_node *np = adev->dev.of_node; drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; if (np) { pdata = of_get_coresight_platform_data(dev, np); if (IS_ERR(pdata)) return PTR_ERR(pdata); adev->dev.platform_data = pdata; } drvdata->dev = &adev->dev; dev_set_drvdata(dev, drvdata); /* Validity for the resource is already checked by the AMBA core */ base = devm_ioremap_resource(dev, res); if (IS_ERR(base)) return PTR_ERR(base); drvdata->base = base; spin_lock_init(&drvdata->spinlock); drvdata->cpu = pdata ? pdata->cpu : 0; get_online_cpus(); etmdrvdata[drvdata->cpu] = drvdata; if (smp_call_function_single(drvdata->cpu, etm4_init_arch_data, drvdata, 1)) dev_err(dev, "ETM arch init failed\n"); if (!etm4_count++) { cpuhp_setup_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING, "arm/coresight4:starting", etm4_starting_cpu, etm4_dying_cpu); ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "arm/coresight4:online", etm4_online_cpu, NULL); if (ret < 0) goto err_arch_supported; hp_online = ret; } put_online_cpus(); if (etm4_arch_supported(drvdata->arch) == false) { ret = -EINVAL; goto err_arch_supported; } etm4_init_trace_id(drvdata); etm4_set_default(&drvdata->config); desc.type = CORESIGHT_DEV_TYPE_SOURCE; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; desc.ops = &etm4_cs_ops; desc.pdata = pdata; desc.dev = dev; desc.groups = coresight_etmv4_groups; drvdata->csdev = coresight_register(&desc); if (IS_ERR(drvdata->csdev)) { ret = PTR_ERR(drvdata->csdev); goto err_arch_supported; } ret = etm_perf_symlink(drvdata->csdev, true); if (ret) { coresight_unregister(drvdata->csdev); goto err_arch_supported; } pm_runtime_put(&adev->dev); dev_info(dev, "%s initialized\n", (char *)id->data); if (boot_enable) { coresight_enable(drvdata->csdev); drvdata->boot_enable = true; } return 0; err_arch_supported: if (--etm4_count == 0) { cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING); if (hp_online) cpuhp_remove_state_nocalls(hp_online); } return ret; }
static int etm_probe(struct amba_device *adev, const struct amba_id *id) { int ret; void __iomem *base; struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; struct etm_drvdata *drvdata; struct resource *res = &adev->res; struct coresight_desc desc = { 0 }; drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; drvdata->use_cp14 = fwnode_property_read_bool(dev->fwnode, "arm,cp14"); dev_set_drvdata(dev, drvdata); /* Validity for the resource is already checked by the AMBA core */ base = devm_ioremap_resource(dev, res); if (IS_ERR(base)) return PTR_ERR(base); drvdata->base = base; spin_lock_init(&drvdata->spinlock); drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ if (!IS_ERR(drvdata->atclk)) { ret = clk_prepare_enable(drvdata->atclk); if (ret) return ret; } drvdata->cpu = coresight_get_cpu(dev); desc.name = devm_kasprintf(dev, GFP_KERNEL, "etm%d", drvdata->cpu); if (!desc.name) return -ENOMEM; cpus_read_lock(); etmdrvdata[drvdata->cpu] = drvdata; if (smp_call_function_single(drvdata->cpu, etm_init_arch_data, drvdata, 1)) dev_err(dev, "ETM arch init failed\n"); if (!etm_count++) { cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_ARM_CORESIGHT_STARTING, "arm/coresight:starting", etm_starting_cpu, etm_dying_cpu); ret = cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_ONLINE_DYN, "arm/coresight:online", etm_online_cpu, NULL); if (ret < 0) goto err_arch_supported; hp_online = ret; } cpus_read_unlock(); if (etm_arch_supported(drvdata->arch) == false) { ret = -EINVAL; goto err_arch_supported; } etm_init_trace_id(drvdata); etm_set_default(&drvdata->config); pdata = coresight_get_platform_data(dev); if (IS_ERR(pdata)) { ret = PTR_ERR(pdata); goto err_arch_supported; } adev->dev.platform_data = pdata; desc.type = CORESIGHT_DEV_TYPE_SOURCE; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; desc.ops = &etm_cs_ops; desc.pdata = pdata; desc.dev = dev; desc.groups = coresight_etm_groups; drvdata->csdev = coresight_register(&desc); if (IS_ERR(drvdata->csdev)) { ret = PTR_ERR(drvdata->csdev); goto err_arch_supported; } ret = etm_perf_symlink(drvdata->csdev, true); if (ret) { coresight_unregister(drvdata->csdev); goto err_arch_supported; } pm_runtime_put(&adev->dev); dev_info(&drvdata->csdev->dev, "%s initialized\n", (char *)coresight_get_uci_data(id)); if (boot_enable) { coresight_enable(drvdata->csdev); drvdata->boot_enable = true; } return 0; err_arch_supported: if (--etm_count == 0) { cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING); if (hp_online) cpuhp_remove_state_nocalls(hp_online); } return ret; }
static int stm_virt_probe(struct platform_device *pdev) { int ret = 0; struct device *dev = &pdev->dev; struct coresight_platform_data *pdata = NULL; struct stm_drvdata *drvdata = NULL; struct coresight_desc *desc = NULL; if (pdev->dev.of_node) { pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node); if (IS_ERR(pdata)) { dev_err(&pdev->dev, "of_get_coresight_platform_data error!\n"); return PTR_ERR(pdata); } pdev->dev.platform_data = pdata; } if (!pdata) { dev_err(&pdev->dev, "coresight pdata is NULL\n"); return -ENODEV; } drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) { dev_err(&pdev->dev, "coresight kzalloc error!\n"); return -ENOMEM; } /* Store the driver data pointer for use in exported functions */ virt_stmdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); spin_lock_init(&drvdata->spinlock); drvdata->entity = OST_ENTITY_ALL; drvdata->status = false; desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) { dev_err(drvdata->dev, "coresight desc kzalloc error!\n"); return -ENOMEM; } desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE; desc->ops = &stm_virt_cs_ops; desc->pdata = pdev->dev.platform_data; desc->dev = &pdev->dev; desc->groups = stm_virt_attr_grps; desc->owner = THIS_MODULE; drvdata->csdev = coresight_register(desc); if (IS_ERR(drvdata->csdev)) { dev_err(drvdata->dev, "coresight_register error!\n"); return PTR_ERR(drvdata->csdev); } drvdata->miscdev.name = ((struct coresight_platform_data *) (pdev->dev.platform_data))->name; drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; drvdata->miscdev.fops = &stm_virt_fops; ret = misc_register(&drvdata->miscdev); if (ret) { dev_err(drvdata->dev, "coresight misc_register error!\n"); goto err; } dev_info(drvdata->dev, "STM virt initialized\n"); #if 0 /* * Enable and disable STM to undo the temporary default STM enable * done by RPM. */ coresight_enable(drvdata->csdev); coresight_disable(drvdata->csdev); #endif boot_enable = 0; if (boot_enable) coresight_enable(drvdata->csdev); return 0; err: coresight_unregister(drvdata->csdev); return ret; }
void top_tmc_enable(void) { coresight_enable(virt_stmdrvdata->csdev); }
static int stm_probe(struct platform_device *pdev) { int ret = 0; struct device *dev = &pdev->dev; struct coresight_platform_data *pdata = NULL; struct stm_drvdata *drvdata = NULL; struct resource *res = NULL; size_t res_size, bitmap_size; struct coresight_desc *desc = NULL; if (pdev->dev.of_node) { pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node); if (IS_ERR(pdata)) { dev_err(drvdata->dev, "of_get_coresight_platform_data error!\n"); return PTR_ERR(pdata); } pdev->dev.platform_data = pdata; } drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) { dev_err(drvdata->dev, "coresight kzalloc error!\n"); return -ENOMEM; } /* Store the driver data pointer for use in exported functions */ stmdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(drvdata->dev, "coresight get resource error!\n"); return -ENODEV; } drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); if (!drvdata->base) { dev_err(drvdata->dev, "coresight ioremap error!\n"); return -ENOMEM; } res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res) { dev_err(drvdata->dev, "coresight get resource error!\n"); return -ENODEV; } if (boot_nr_channel) { res_size = min((resource_size_t)(boot_nr_channel * BYTES_PER_CHANNEL), resource_size(res)); bitmap_size = boot_nr_channel * sizeof(long); } else { res_size = min((resource_size_t)(NR_STM_CHANNEL * BYTES_PER_CHANNEL), resource_size(res)); bitmap_size = NR_STM_CHANNEL * sizeof(long); } drvdata->chs.base = devm_ioremap(dev, res->start, res_size); if (!drvdata->chs.base) { dev_err(drvdata->dev, "coresight chds ioremap error!\n"); return -ENOMEM; } drvdata->chs.bitmap = devm_kzalloc(dev, bitmap_size, GFP_KERNEL); if (!drvdata->chs.bitmap) { dev_err(drvdata->dev, "coresight chs bitmap kzalloc error!\n"); return -ENOMEM; } spin_lock_init(&drvdata->spinlock); drvdata->clk_at= devm_clk_get(dev, pdata->clock_at); if (IS_ERR(drvdata->clk_at)) { dev_err(drvdata->dev, "coresight get clock error!\n"); ret = PTR_ERR(drvdata->clk_at); goto err; } ret = clk_set_rate(drvdata->clk_at, 240000000); if (ret) { dev_err(drvdata->dev, "coresight set clock rate error!\n"); goto err; } drvdata->clk_dbg= devm_clk_get(dev, pdata->clock_dbg); if (IS_ERR(drvdata->clk_dbg)) { dev_err(drvdata->dev, "coresight get clock error!\n"); ret = PTR_ERR(drvdata->clk_dbg); goto err; } ret = clk_set_rate(drvdata->clk_dbg, 120000000); if (ret) { dev_err(drvdata->dev, "coresight set clock rate error!\n"); goto err; } drvdata->entity = OST_ENTITY_ALL; drvdata->status = false; desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) { dev_err(drvdata->dev, "coresight desc kzalloc error!\n"); return -ENOMEM; } desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE; desc->ops = &stm_cs_ops; desc->pdata = pdev->dev.platform_data; desc->dev = &pdev->dev; desc->groups = stm_attr_grps; desc->owner = THIS_MODULE; drvdata->csdev = coresight_register(desc); if (IS_ERR(drvdata->csdev)) { dev_err(drvdata->dev, "coresight_register error!\n"); return PTR_ERR(drvdata->csdev); } drvdata->miscdev.name = ((struct coresight_platform_data *) (pdev->dev.platform_data))->name; drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; drvdata->miscdev.fops = &stm_fops; ret = misc_register(&drvdata->miscdev); if (ret) { dev_err(drvdata->dev, "coresight misc_register error!\n"); goto err; } dev_info(drvdata->dev, "STM initialized\n"); /* * Enable and disable STM to undo the temporary default STM enable * done by RPM. */ coresight_enable(drvdata->csdev); coresight_disable(drvdata->csdev); if (boot_enable) coresight_enable(drvdata->csdev); return 0; err: coresight_unregister(drvdata->csdev); return ret; }