Lines Matching full:pmc

111  * @mmio_base: The VA at which the PMC block is mapped
138 * struct mlxbf_pmc_context - Structure to hold PMC context info
1000 static struct mlxbf_pmc_context *pmc; variable
1011 arm_smccc_smc(command, pmc->sreg_tbl_perf, (uintptr_t)addr, 0, 0, 0, 0, in mlxbf_pmc_secure_read()
1034 if (pmc->svc_sreg_support) in mlxbf_pmc_read()
1065 arm_smccc_smc(command, pmc->sreg_tbl_perf, value, (uintptr_t)addr, 0, 0, in mlxbf_pmc_secure_write()
1085 if (pmc->svc_sreg_support) in mlxbf_pmc_write()
1100 (offset + MLXBF_PMC_REG_SIZE <= pmc->block[blk_num].blk_size)) in mlxbf_pmc_valid_range()
1101 return true; /* inside the mapped PMC space */ in mlxbf_pmc_valid_range()
1122 switch (pmc->event_set) { in mlxbf_pmc_event_list()
1137 switch (pmc->event_set) { in mlxbf_pmc_event_list()
1255 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_config_l3_counters()
1274 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_l3_counter()
1279 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_l3_counter()
1331 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_crspace_counter()
1353 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_clear_crspace_counter()
1354 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) + in mlxbf_pmc_clear_crspace_counter()
1365 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_program_counter()
1371 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_program_counter()
1390 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1404 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1415 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1430 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_counter()
1438 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_counter()
1460 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_crspace_counter()
1461 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) + in mlxbf_pmc_read_crspace_counter()
1478 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_read_counter()
1484 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_read_counter()
1489 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE; in mlxbf_pmc_read_counter()
1497 status = mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset, in mlxbf_pmc_read_counter()
1504 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset, in mlxbf_pmc_read_counter()
1518 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_event()
1523 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_event()
1567 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_crspace_event()
1589 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_read_event()
1595 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_read_event()
1600 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE; in mlxbf_pmc_read_event()
1608 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset, in mlxbf_pmc_read_event()
1613 if (mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset, in mlxbf_pmc_read_event()
1627 if ((strstr(pmc->block_name[blk_num], "ecc")) || in mlxbf_pmc_read_reg()
1628 (strstr(pmc->block_name[blk_num], "clock_measure"))) { in mlxbf_pmc_read_reg()
1629 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_read_reg()
1638 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_read_reg()
1647 if (strstr(pmc->block_name[blk_num], "clock_measure")) in mlxbf_pmc_write_reg()
1650 if (strstr(pmc->block_name[blk_num], "ecc")) { in mlxbf_pmc_write_reg()
1651 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_write_reg()
1656 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_write_reg()
1676 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_counter_show()
1679 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) || in mlxbf_pmc_counter_show()
1680 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)) { in mlxbf_pmc_counter_show()
1683 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) { in mlxbf_pmc_counter_show()
1684 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_counter_show()
1717 if (!(strstr(pmc->block_name[blk_num], "ecc")) && data) in mlxbf_pmc_counter_store()
1721 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_counter_store()
1724 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) { in mlxbf_pmc_counter_store()
1732 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) { in mlxbf_pmc_counter_store()
1733 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_counter_store()
1740 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_counter_store()
1765 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_event_show()
1772 evt_name = mlxbf_pmc_get_event_name(pmc->block_name[blk_num], evt_num); in mlxbf_pmc_event_show()
1801 evt_num = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_event_store()
1811 if (!mlxbf_pmc_get_event_name(pmc->block_name[blk_num], evt_num)) in mlxbf_pmc_event_store()
1815 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_event_store()
1840 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &size); in mlxbf_pmc_event_list_show()
1867 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_enable_show()
1868 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_show()
1869 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_show()
1875 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_show()
1904 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_enable_store()
1905 err = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_store()
1906 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_store()
1916 mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_store()
1917 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_store()
1945 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_count_clock_show()
1946 MLXBF_PMC_CRSPACE_PERFMON_COUNT_CLOCK(pmc->block[blk_num].counters), in mlxbf_pmc_count_clock_show()
1970 mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_count_clock_store()
1971 MLXBF_PMC_CRSPACE_PERFMON_COUNT_CLOCK(pmc->block[blk_num].counters), in mlxbf_pmc_count_clock_store()
1983 if (!mlxbf_pmc_event_supported(pmc->block_name[blk_num])) in mlxbf_pmc_init_perftype_counter()
1987 attr = &pmc->block[blk_num].attr_event_list; in mlxbf_pmc_init_perftype_counter()
1995 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1999 if (strstr(pmc->block_name[blk_num], "l3cache") || in mlxbf_pmc_init_perftype_counter()
2000 ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE))) { in mlxbf_pmc_init_perftype_counter()
2001 attr = &pmc->block[blk_num].attr_enable; in mlxbf_pmc_init_perftype_counter()
2011 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
2015 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_init_perftype_counter()
2017 attr = &pmc->block[blk_num].attr_count_clock; in mlxbf_pmc_init_perftype_counter()
2027 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
2031 pmc->block[blk_num].attr_counter = devm_kcalloc( in mlxbf_pmc_init_perftype_counter()
2032 dev, pmc->block[blk_num].counters, in mlxbf_pmc_init_perftype_counter()
2034 if (!pmc->block[blk_num].attr_counter) in mlxbf_pmc_init_perftype_counter()
2037 pmc->block[blk_num].attr_event = devm_kcalloc( in mlxbf_pmc_init_perftype_counter()
2038 dev, pmc->block[blk_num].counters, in mlxbf_pmc_init_perftype_counter()
2040 if (!pmc->block[blk_num].attr_event) in mlxbf_pmc_init_perftype_counter()
2044 for (j = 0; j < pmc->block[blk_num].counters; ++j) { in mlxbf_pmc_init_perftype_counter()
2045 attr = &pmc->block[blk_num].attr_counter[j]; in mlxbf_pmc_init_perftype_counter()
2055 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
2058 attr = &pmc->block[blk_num].attr_event[j]; in mlxbf_pmc_init_perftype_counter()
2068 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
2083 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &count); in mlxbf_pmc_init_perftype_reg()
2087 pmc->block[blk_num].attr_event = devm_kcalloc( in mlxbf_pmc_init_perftype_reg()
2089 if (!pmc->block[blk_num].attr_event) in mlxbf_pmc_init_perftype_reg()
2094 attr = &pmc->block[blk_num].attr_event[count]; in mlxbf_pmc_init_perftype_reg()
2104 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_reg()
2118 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) || in mlxbf_pmc_create_groups()
2119 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)) in mlxbf_pmc_create_groups()
2121 else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) in mlxbf_pmc_create_groups()
2130 pmc->block[blk_num].block_attr_grp.attrs = pmc->block[blk_num].block_attr; in mlxbf_pmc_create_groups()
2131 pmc->block[blk_num].block_attr_grp.name = devm_kasprintf( in mlxbf_pmc_create_groups()
2132 dev, GFP_KERNEL, pmc->block_name[blk_num]); in mlxbf_pmc_create_groups()
2133 if (!pmc->block[blk_num].block_attr_grp.name) in mlxbf_pmc_create_groups()
2135 pmc->groups[pmc->group_num] = &pmc->block[blk_num].block_attr_grp; in mlxbf_pmc_create_groups()
2136 pmc->group_num++; in mlxbf_pmc_create_groups()
2159 for (i = 0; i < pmc->total_blocks; ++i) { in mlxbf_pmc_map_counters()
2161 if (strstr(pmc->block_name[i], "tilenet")) { in mlxbf_pmc_map_counters()
2162 if (sscanf(pmc->block_name[i], "tilenet%u", &tile_num) != 1) in mlxbf_pmc_map_counters()
2165 if (tile_num >= pmc->tile_count) in mlxbf_pmc_map_counters()
2167 } else if (strstr(pmc->block_name[i], "tile")) { in mlxbf_pmc_map_counters()
2168 if (sscanf(pmc->block_name[i], "tile%u", &tile_num) != 1) in mlxbf_pmc_map_counters()
2171 if (tile_num >= pmc->tile_count) in mlxbf_pmc_map_counters()
2176 if (strstr(pmc->block_name[i], "mss") && in mlxbf_pmc_map_counters()
2177 pmc->event_set == MLXBF_PMC_EVENT_SET_BF3) { in mlxbf_pmc_map_counters()
2180 if (sscanf(pmc->block_name[i], "mss%u", &mss_num) != 1) in mlxbf_pmc_map_counters()
2183 if (!((pmc->mss_enable >> mss_num) & 0x1)) in mlxbf_pmc_map_counters()
2188 if (strstr(pmc->block_name[i], "emi") && in mlxbf_pmc_map_counters()
2189 pmc->event_set == MLXBF_PMC_EVENT_SET_BF3) { in mlxbf_pmc_map_counters()
2192 if (sscanf(pmc->block_name[i], "emi%u", &emi_num) != 1) in mlxbf_pmc_map_counters()
2195 if (!((pmc->mss_enable >> (emi_num / 2)) & 0x1)) in mlxbf_pmc_map_counters()
2200 if (strstr(pmc->block_name[i], "llt_miss")) { in mlxbf_pmc_map_counters()
2203 if (sscanf(pmc->block_name[i], "llt_miss%u", &llt_num) != 1) in mlxbf_pmc_map_counters()
2206 if (!((pmc->llt_enable >> llt_num) & 0x1)) in mlxbf_pmc_map_counters()
2208 } else if (strstr(pmc->block_name[i], "llt")) { in mlxbf_pmc_map_counters()
2211 if (sscanf(pmc->block_name[i], "llt%u", &llt_num) != 1) in mlxbf_pmc_map_counters()
2214 if (!((pmc->llt_enable >> llt_num) & 0x1)) in mlxbf_pmc_map_counters()
2219 if (strstr(pmc->block_name[i], "apt")) { in mlxbf_pmc_map_counters()
2222 if (sscanf(pmc->block_name[i], "apt%u", &apt_num) != 1) in mlxbf_pmc_map_counters()
2225 if (!((pmc->apt_enable >> apt_num) & 0x1)) in mlxbf_pmc_map_counters()
2229 ret = device_property_read_u64_array(dev, pmc->block_name[i], in mlxbf_pmc_map_counters()
2238 if (pmc->svc_sreg_support) in mlxbf_pmc_map_counters()
2239 pmc->block[i].mmio_base = (void __iomem *)info[0]; in mlxbf_pmc_map_counters()
2241 pmc->block[i].mmio_base = in mlxbf_pmc_map_counters()
2244 pmc->block[i].blk_size = info[1]; in mlxbf_pmc_map_counters()
2245 pmc->block[i].counters = info[2]; in mlxbf_pmc_map_counters()
2246 pmc->block[i].type = info[3]; in mlxbf_pmc_map_counters()
2248 if (!pmc->block[i].mmio_base) in mlxbf_pmc_map_counters()
2253 dev_warn(dev, "ignoring unsupported block: '%s'\n", pmc->block_name[i]); in mlxbf_pmc_map_counters()
2278 pmc = devm_kzalloc(dev, sizeof(struct mlxbf_pmc_context), GFP_KERNEL); in mlxbf_pmc_probe()
2279 if (!pmc) in mlxbf_pmc_probe()
2287 &pmc->sreg_tbl_perf); in mlxbf_pmc_probe()
2289 pmc->svc_sreg_support = false; in mlxbf_pmc_probe()
2294 * them in the pmc struct. in mlxbf_pmc_probe()
2300 pmc->svc_sreg_support = true; in mlxbf_pmc_probe()
2306 pmc->event_set = MLXBF_PMC_EVENT_SET_BF1; in mlxbf_pmc_probe()
2308 pmc->event_set = MLXBF_PMC_EVENT_SET_BF2; in mlxbf_pmc_probe()
2310 pmc->event_set = MLXBF_PMC_EVENT_SET_BF3; in mlxbf_pmc_probe()
2314 ret = device_property_read_u32(dev, "block_num", &pmc->total_blocks); in mlxbf_pmc_probe()
2319 pmc->block_name, in mlxbf_pmc_probe()
2320 pmc->total_blocks); in mlxbf_pmc_probe()
2321 if (ret != pmc->total_blocks) in mlxbf_pmc_probe()
2324 if (device_property_read_u32(dev, "tile_num", &pmc->tile_count)) { in mlxbf_pmc_probe()
2325 if (device_property_read_u8(dev, "apt_enable", &pmc->apt_enable)) { in mlxbf_pmc_probe()
2327 pmc->apt_enable = 0; in mlxbf_pmc_probe()
2329 if (device_property_read_u8(dev, "llt_enable", &pmc->llt_enable)) { in mlxbf_pmc_probe()
2331 pmc->llt_enable = 0; in mlxbf_pmc_probe()
2333 if (device_property_read_u8(dev, "mss_enable", &pmc->mss_enable)) { in mlxbf_pmc_probe()
2335 pmc->mss_enable = 0; in mlxbf_pmc_probe()
2339 pmc->pdev = pdev; in mlxbf_pmc_probe()
2340 pmc->group_num = 0; in mlxbf_pmc_probe()
2346 pmc->hwmon_dev = devm_hwmon_device_register_with_groups( in mlxbf_pmc_probe()
2347 dev, "bfperf", pmc, pmc->groups); in mlxbf_pmc_probe()
2348 if (IS_ERR(pmc->hwmon_dev)) in mlxbf_pmc_probe()
2349 return PTR_ERR(pmc->hwmon_dev); in mlxbf_pmc_probe()
2350 platform_set_drvdata(pdev, pmc); in mlxbf_pmc_probe()
2362 .driver = { .name = "mlxbf-pmc",
2370 MODULE_DESCRIPTION("Mellanox PMC driver");