Lines Matching refs:pmc

862 static struct mlxbf_pmc_context *pmc;
873 arm_smccc_smc(command, pmc->sreg_tbl_perf, (uintptr_t)addr, 0, 0, 0, 0,
896 if (pmc->svc_sreg_support)
927 arm_smccc_smc(command, pmc->sreg_tbl_perf, value, (uintptr_t)addr, 0, 0,
947 if (pmc->svc_sreg_support)
962 (offset + MLXBF_PMC_REG_SIZE <= pmc->block[blk_num].blk_size))
984 switch (pmc->event_set) {
999 switch (pmc->event_set) {
1099 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base +
1118 pmcaddr = pmc->block[blk_num].mmio_base +
1123 pmcaddr = pmc->block[blk_num].mmio_base +
1175 addr = pmc->block[blk_num].mmio_base +
1197 addr = pmc->block[blk_num].mmio_base +
1198 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) +
1209 if (cnt_num >= pmc->block[blk_num].counters)
1215 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)
1234 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base +
1248 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base +
1259 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base +
1274 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1282 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1304 status = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1305 MLXBF_PMC_CRSPACE_PERFMON_VAL0(pmc->block[blk_num].counters) +
1322 if (cnt_num >= pmc->block[blk_num].counters)
1328 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)
1333 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE;
1341 status = mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset,
1348 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset,
1362 pmcaddr = pmc->block[blk_num].mmio_base +
1367 pmcaddr = pmc->block[blk_num].mmio_base +
1411 addr = pmc->block[blk_num].mmio_base +
1433 if (cnt_num >= pmc->block[blk_num].counters)
1439 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)
1444 pmc->block[blk_num].counters * MLXBF_PMC_REG_SIZE;
1452 if (mlxbf_pmc_write(pmc->block[blk_num].mmio_base + perfcfg_offset,
1457 if (mlxbf_pmc_read(pmc->block[blk_num].mmio_base + perfval_offset,
1471 if (strstr(pmc->block_name[blk_num], "ecc")) {
1472 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base + offset,
1481 return mlxbf_pmc_read(pmc->block[blk_num].mmio_base + offset,
1490 if (strstr(pmc->block_name[blk_num], "ecc")) {
1491 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset,
1496 return mlxbf_pmc_write(pmc->block[blk_num].mmio_base + offset,
1516 if (strstr(pmc->block_name[blk_num], "l3cache"))
1519 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) ||
1520 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE)) {
1523 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) {
1524 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num],
1557 if (!(strstr(pmc->block_name[blk_num], "ecc")) && data)
1561 if (strstr(pmc->block_name[blk_num], "l3cache"))
1564 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) {
1572 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER) {
1573 offset = mlxbf_pmc_get_event_num(pmc->block_name[blk_num],
1580 } else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) {
1605 if (strstr(pmc->block_name[blk_num], "l3cache"))
1612 evt_name = mlxbf_pmc_get_event_name(pmc->block_name[blk_num], evt_num);
1635 evt_num = mlxbf_pmc_get_event_num(pmc->block_name[blk_num],
1645 if (strstr(pmc->block_name[blk_num], "l3cache"))
1670 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &size);
1697 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) {
1698 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1699 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters),
1705 if (mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1733 if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) {
1734 err = mlxbf_pmc_readl(pmc->block[blk_num].mmio_base +
1735 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters),
1745 mlxbf_pmc_write(pmc->block[blk_num].mmio_base +
1746 MLXBF_PMC_CRSPACE_PERFMON_CTL(pmc->block[blk_num].counters),
1772 if (!mlxbf_pmc_event_supported(pmc->block_name[blk_num]))
1776 attr = &pmc->block[blk_num].attr_event_list;
1783 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr;
1787 if (strstr(pmc->block_name[blk_num], "l3cache") ||
1788 ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE))) {
1789 attr = &pmc->block[blk_num].attr_enable;
1798 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr;
1802 pmc->block[blk_num].attr_counter = devm_kcalloc(
1803 dev, pmc->block[blk_num].counters,
1805 if (!pmc->block[blk_num].attr_counter)
1808 pmc->block[blk_num].attr_event = devm_kcalloc(
1809 dev, pmc->block[blk_num].counters,
1811 if (!pmc->block[blk_num].attr_event)
1815 for (j = 0; j < pmc->block[blk_num].counters; ++j) {
1816 attr = &pmc->block[blk_num].attr_counter[j];
1825 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr;
1828 attr = &pmc->block[blk_num].attr_event[j];
1837 pmc->block[blk_num].block_attr[++i] = &attr->dev_attr.attr;
1852 events = mlxbf_pmc_event_list(pmc->block_name[blk_num], &count);
1856 pmc->block[blk_num].attr_event = devm_kcalloc(
1858 if (!pmc->block[blk_num].attr_event)
1863 attr = &pmc->block[blk_num].attr_event[count];
1872 pmc->block[blk_num].block_attr[i] = &attr->dev_attr.attr;
1886 if ((pmc->block[blk_num].type == MLXBF_PMC_TYPE_COUNTER) ||
1887 (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE))
1889 else if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_REGISTER)
1898 pmc->block[blk_num].block_attr_grp.attrs = pmc->block[blk_num].block_attr;
1899 pmc->block[blk_num].block_attr_grp.name = devm_kasprintf(
1900 dev, GFP_KERNEL, pmc->block_name[blk_num]);
1901 if (!pmc->block[blk_num].block_attr_grp.name)
1903 pmc->groups[pmc->group_num] = &pmc->block[blk_num].block_attr_grp;
1904 pmc->group_num++;
1927 for (i = 0; i < pmc->total_blocks; ++i) {
1929 if (strstr(pmc->block_name[i], "tilenet")) {
1930 if (sscanf(pmc->block_name[i], "tilenet%u", &tile_num) != 1)
1933 if (tile_num >= pmc->tile_count)
1935 } else if (strstr(pmc->block_name[i], "tile")) {
1936 if (sscanf(pmc->block_name[i], "tile%u", &tile_num) != 1)
1939 if (tile_num >= pmc->tile_count)
1944 if (strstr(pmc->block_name[i], "mss") &&
1945 pmc->event_set == MLXBF_PMC_EVENT_SET_BF3) {
1948 if (sscanf(pmc->block_name[i], "mss%u", &mss_num) != 1)
1951 if (!((pmc->mss_enable >> mss_num) & 0x1))
1956 if (strstr(pmc->block_name[i], "llt_miss")) {
1959 if (sscanf(pmc->block_name[i], "llt_miss%u", &llt_num) != 1)
1962 if (!((pmc->llt_enable >> llt_num) & 0x1))
1964 } else if (strstr(pmc->block_name[i], "llt")) {
1967 if (sscanf(pmc->block_name[i], "llt%u", &llt_num) != 1)
1970 if (!((pmc->llt_enable >> llt_num) & 0x1))
1974 ret = device_property_read_u64_array(dev, pmc->block_name[i],
1983 if (pmc->svc_sreg_support)
1984 pmc->block[i].mmio_base = (void __iomem *)info[0];
1986 pmc->block[i].mmio_base =
1989 pmc->block[i].blk_size = info[1];
1990 pmc->block[i].counters = info[2];
1991 pmc->block[i].type = info[3];
1993 if (!pmc->block[i].mmio_base)
1998 dev_warn(dev, "ignoring unsupported block: '%s'\n", pmc->block_name[i]);
2023 pmc = devm_kzalloc(dev, sizeof(struct mlxbf_pmc_context), GFP_KERNEL);
2024 if (!pmc)
2032 &pmc->sreg_tbl_perf);
2034 pmc->svc_sreg_support = false;
2039 * them in the pmc struct.
2045 pmc->svc_sreg_support = true;
2051 pmc->event_set = MLXBF_PMC_EVENT_SET_BF1;
2053 pmc->event_set = MLXBF_PMC_EVENT_SET_BF2;
2055 pmc->event_set = MLXBF_PMC_EVENT_SET_BF3;
2059 ret = device_property_read_u32(dev, "block_num", &pmc->total_blocks);
2064 pmc->block_name,
2065 pmc->total_blocks);
2066 if (ret != pmc->total_blocks)
2069 if (device_property_read_u32(dev, "tile_num", &pmc->tile_count)) {
2070 if (device_property_read_u8(dev, "llt_enable", &pmc->llt_enable)) {
2074 if (device_property_read_u8(dev, "mss_enable", &pmc->mss_enable)) {
2080 pmc->pdev = pdev;
2081 pmc->group_num = 0;
2087 pmc->hwmon_dev = devm_hwmon_device_register_with_groups(
2088 dev, "bfperf", pmc, pmc->groups);
2089 if (IS_ERR(pmc->hwmon_dev))
2090 return PTR_ERR(pmc->hwmon_dev);
2091 platform_set_drvdata(pdev, pmc);
2103 .driver = { .name = "mlxbf-pmc",