Lines Matching full:pmc
110 * @mmio_base: The VA at which the PMC block is mapped
137 * struct mlxbf_pmc_context - Structure to hold PMC context info
896 static struct mlxbf_pmc_context *pmc; variable
907 arm_smccc_smc(command, pmc->sreg_tbl_perf, (uintptr_t)addr, 0, 0, 0, 0, in mlxbf_pmc_secure_read()
930 if (pmc->svc_sreg_support) in mlxbf_pmc_read()
961 arm_smccc_smc(command, pmc->sreg_tbl_perf, value, (uintptr_t)addr, 0, 0, in mlxbf_pmc_secure_write()
981 if (pmc->svc_sreg_support) in mlxbf_pmc_write()
996 (offset + MLXBF_PMC_REG_SIZE <= pmc->block[blk_num].blk_size)) in mlxbf_pmc_valid_range()
997 return true; /* inside the mapped PMC space */ in mlxbf_pmc_valid_range()
1018 switch (pmc->event_set) { in mlxbf_pmc_event_list()
1033 switch (pmc->event_set) { in mlxbf_pmc_event_list()
1136 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_config_l3_counters()
1155 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_l3_counter()
1160 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_l3_counter()
1212 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_crspace_counter()
1234 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_clear_crspace_counter()
1235 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) + in mlxbf_pmc_clear_crspace_counter()
1246 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_program_counter()
1252 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_program_counter()
1271 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1285 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1296 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_program_counter()
1311 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_counter()
1319 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_counter()
1341 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_crspace_counter()
1342 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) + in mlxbf_pmc_read_crspace_counter()
1359 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_read_counter()
1365 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_read_counter()
1370 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE; in mlxbf_pmc_read_counter()
1378 status = mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset, in mlxbf_pmc_read_counter()
1385 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset, in mlxbf_pmc_read_counter()
1399 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_event()
1404 pmcaddr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_l3_event()
1448 addr = pmc->block[blk_num].mmio_base + in mlxbf_pmc_read_crspace_event()
1470 if (cnt_num >= pmc->block[blk_num].counters) in mlxbf_pmc_read_event()
1476 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) in mlxbf_pmc_read_event()
1481 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE; in mlxbf_pmc_read_event()
1489 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset, in mlxbf_pmc_read_event()
1494 if (mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset, in mlxbf_pmc_read_event()
1508 if ((strstr(pmc->block_name[blk_num], "ecc")) || in mlxbf_pmc_read_reg()
1509 (strstr(pmc->block_name[blk_num], "clock_measure"))) { in mlxbf_pmc_read_reg()
1510 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_read_reg()
1519 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_read_reg()
1528 if (strstr(pmc->block_name[blk_num], "clock_measure")) in mlxbf_pmc_write_reg()
1531 if (strstr(pmc->block_name[blk_num], "ecc")) { in mlxbf_pmc_write_reg()
1532 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_write_reg()
1537 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset, in mlxbf_pmc_write_reg()
1557 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_counter_show()
1560 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) || in mlxbf_pmc_counter_show()
1561 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)) { in mlxbf_pmc_counter_show()
1564 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) { in mlxbf_pmc_counter_show()
1565 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_counter_show()
1598 if (!(strstr(pmc->block_name[blk_num], "ecc")) && data) in mlxbf_pmc_counter_store()
1602 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_counter_store()
1605 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) { in mlxbf_pmc_counter_store()
1613 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) { in mlxbf_pmc_counter_store()
1614 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_counter_store()
1621 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_counter_store()
1646 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_event_show()
1653 evt_name = mlxbf_pmc_get_event_name(pmc->block_name[blk_num], evt_num); in mlxbf_pmc_event_show()
1676 evt_num = mlxbf_pmc_get_event_num(pmc->block_name[blk_num], in mlxbf_pmc_event_store()
1686 if (strstr(pmc->block_name[blk_num], "l3cache")) in mlxbf_pmc_event_store()
1711 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &size); in mlxbf_pmc_event_list_show()
1738 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_enable_show()
1739 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_show()
1740 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_show()
1746 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_show()
1774 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_enable_store()
1775 err = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_store()
1776 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_store()
1786 mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_enable_store()
1787 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters), in mlxbf_pmc_enable_store()
1818 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + in mlxbf_pmc_count_clock_show()
1819 MLXBF_PMC_CRSPACE_PERFMON_COUNT_CLOCK(pmc->block[blk_num].counters), in mlxbf_pmc_count_clock_show()
1843 mlxbf_pmc_write(pmc->block[blk_num].mmio_base + in mlxbf_pmc_count_clock_store()
1844 MLXBF_PMC_CRSPACE_PERFMON_COUNT_CLOCK(pmc->block[blk_num].counters), in mlxbf_pmc_count_clock_store()
1856 if (!mlxbf_pmc_event_supported(pmc->block_name[blk_num])) in mlxbf_pmc_init_perftype_counter()
1860 attr = &pmc->block[blk_num].attr_event_list; in mlxbf_pmc_init_perftype_counter()
1868 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1872 if (strstr(pmc->block_name[blk_num], "l3cache") || in mlxbf_pmc_init_perftype_counter()
1873 ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE))) { in mlxbf_pmc_init_perftype_counter()
1874 attr = &pmc->block[blk_num].attr_enable; in mlxbf_pmc_init_perftype_counter()
1884 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1888 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { in mlxbf_pmc_init_perftype_counter()
1890 attr = &pmc->block[blk_num].attr_count_clock; in mlxbf_pmc_init_perftype_counter()
1899 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1903 pmc->block[blk_num].attr_counter = devm_kcalloc( in mlxbf_pmc_init_perftype_counter()
1904 dev, pmc->block[blk_num].counters, in mlxbf_pmc_init_perftype_counter()
1906 if (!pmc->block[blk_num].attr_counter) in mlxbf_pmc_init_perftype_counter()
1909 pmc->block[blk_num].attr_event = devm_kcalloc( in mlxbf_pmc_init_perftype_counter()
1910 dev, pmc->block[blk_num].counters, in mlxbf_pmc_init_perftype_counter()
1912 if (!pmc->block[blk_num].attr_event) in mlxbf_pmc_init_perftype_counter()
1916 for (j = 0; j < pmc->block[blk_num].counters; ++j) { in mlxbf_pmc_init_perftype_counter()
1917 attr = &pmc->block[blk_num].attr_counter[j]; in mlxbf_pmc_init_perftype_counter()
1927 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1930 attr = &pmc->block[blk_num].attr_event[j]; in mlxbf_pmc_init_perftype_counter()
1940 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_counter()
1955 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &count); in mlxbf_pmc_init_perftype_reg()
1959 pmc->block[blk_num].attr_event = devm_kcalloc( in mlxbf_pmc_init_perftype_reg()
1961 if (!pmc->block[blk_num].attr_event) in mlxbf_pmc_init_perftype_reg()
1966 attr = &pmc->block[blk_num].attr_event[count]; in mlxbf_pmc_init_perftype_reg()
1976 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr; in mlxbf_pmc_init_perftype_reg()
1990 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) || in mlxbf_pmc_create_groups()
1991 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)) in mlxbf_pmc_create_groups()
1993 else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) in mlxbf_pmc_create_groups()
2002 pmc->block[blk_num].block_attr_grp.attrs = pmc->block[blk_num].block_attr; in mlxbf_pmc_create_groups()
2003 pmc->block[blk_num].block_attr_grp.name = devm_kasprintf( in mlxbf_pmc_create_groups()
2004 dev, GFP_KERNEL, pmc->block_name[blk_num]); in mlxbf_pmc_create_groups()
2005 if (!pmc->block[blk_num].block_attr_grp.name) in mlxbf_pmc_create_groups()
2007 pmc->groups[pmc->group_num] = &pmc->block[blk_num].block_attr_grp; in mlxbf_pmc_create_groups()
2008 pmc->group_num++; in mlxbf_pmc_create_groups()
2031 for (i = 0; i < pmc->total_blocks; ++i) { in mlxbf_pmc_map_counters()
2033 if (strstr(pmc->block_name[i], "tilenet")) { in mlxbf_pmc_map_counters()
2034 if (sscanf(pmc->block_name[i], "tilenet%u", &tile_num) != 1) in mlxbf_pmc_map_counters()
2037 if (tile_num >= pmc->tile_count) in mlxbf_pmc_map_counters()
2039 } else if (strstr(pmc->block_name[i], "tile")) { in mlxbf_pmc_map_counters()
2040 if (sscanf(pmc->block_name[i], "tile%u", &tile_num) != 1) in mlxbf_pmc_map_counters()
2043 if (tile_num >= pmc->tile_count) in mlxbf_pmc_map_counters()
2048 if (strstr(pmc->block_name[i], "mss") && in mlxbf_pmc_map_counters()
2049 pmc->event_set == MLXBF_PMC_EVENT_SET_BF3) { in mlxbf_pmc_map_counters()
2052 if (sscanf(pmc->block_name[i], "mss%u", &mss_num) != 1) in mlxbf_pmc_map_counters()
2055 if (!((pmc->mss_enable >> mss_num) & 0x1)) in mlxbf_pmc_map_counters()
2060 if (strstr(pmc->block_name[i], "llt_miss")) { in mlxbf_pmc_map_counters()
2063 if (sscanf(pmc->block_name[i], "llt_miss%u", &llt_num) != 1) in mlxbf_pmc_map_counters()
2066 if (!((pmc->llt_enable >> llt_num) & 0x1)) in mlxbf_pmc_map_counters()
2068 } else if (strstr(pmc->block_name[i], "llt")) { in mlxbf_pmc_map_counters()
2071 if (sscanf(pmc->block_name[i], "llt%u", &llt_num) != 1) in mlxbf_pmc_map_counters()
2074 if (!((pmc->llt_enable >> llt_num) & 0x1)) in mlxbf_pmc_map_counters()
2078 ret = device_property_read_u64_array(dev, pmc->block_name[i], in mlxbf_pmc_map_counters()
2087 if (pmc->svc_sreg_support) in mlxbf_pmc_map_counters()
2088 pmc->block[i].mmio_base = (void __iomem *)info[0]; in mlxbf_pmc_map_counters()
2090 pmc->block[i].mmio_base = in mlxbf_pmc_map_counters()
2093 pmc->block[i].blk_size = info[1]; in mlxbf_pmc_map_counters()
2094 pmc->block[i].counters = info[2]; in mlxbf_pmc_map_counters()
2095 pmc->block[i].type = info[3]; in mlxbf_pmc_map_counters()
2097 if (!pmc->block[i].mmio_base) in mlxbf_pmc_map_counters()
2102 dev_warn(dev, "ignoring unsupported block: '%s'\n", pmc->block_name[i]); in mlxbf_pmc_map_counters()
2127 pmc = devm_kzalloc(dev, sizeof(struct mlxbf_pmc_context), GFP_KERNEL); in mlxbf_pmc_probe()
2128 if (!pmc) in mlxbf_pmc_probe()
2136 &pmc->sreg_tbl_perf); in mlxbf_pmc_probe()
2138 pmc->svc_sreg_support = false; in mlxbf_pmc_probe()
2143 * them in the pmc struct. in mlxbf_pmc_probe()
2149 pmc->svc_sreg_support = true; in mlxbf_pmc_probe()
2155 pmc->event_set = MLXBF_PMC_EVENT_SET_BF1; in mlxbf_pmc_probe()
2157 pmc->event_set = MLXBF_PMC_EVENT_SET_BF2; in mlxbf_pmc_probe()
2159 pmc->event_set = MLXBF_PMC_EVENT_SET_BF3; in mlxbf_pmc_probe()
2163 ret = device_property_read_u32(dev, "block_num", &pmc->total_blocks); in mlxbf_pmc_probe()
2168 pmc->block_name, in mlxbf_pmc_probe()
2169 pmc->total_blocks); in mlxbf_pmc_probe()
2170 if (ret != pmc->total_blocks) in mlxbf_pmc_probe()
2173 if (device_property_read_u32(dev, "tile_num", &pmc->tile_count)) { in mlxbf_pmc_probe()
2174 if (device_property_read_u8(dev, "llt_enable", &pmc->llt_enable)) { in mlxbf_pmc_probe()
2178 if (device_property_read_u8(dev, "mss_enable", &pmc->mss_enable)) { in mlxbf_pmc_probe()
2184 pmc->pdev = pdev; in mlxbf_pmc_probe()
2185 pmc->group_num = 0; in mlxbf_pmc_probe()
2191 pmc->hwmon_dev = devm_hwmon_device_register_with_groups( in mlxbf_pmc_probe()
2192 dev, "bfperf", pmc, pmc->groups); in mlxbf_pmc_probe()
2193 if (IS_ERR(pmc->hwmon_dev)) in mlxbf_pmc_probe()
2194 return PTR_ERR(pmc->hwmon_dev); in mlxbf_pmc_probe()
2195 platform_set_drvdata(pdev, pmc); in mlxbf_pmc_probe()
2207 .driver = { .name = "mlxbf-pmc",
2215 MODULE_DESCRIPTION("Mellanox PMC driver");