coresight: config: Add preloaded configurations
authorMike Leach <mike.leach@linaro.org>
Wed, 18 Aug 2021 19:40:19 +0000 (13:40 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Aug 2021 20:33:28 +0000 (22:33 +0200)
Preload set of configurations.

This patch creates a small set of preloaded configurations and features
that are available immediately after coresight has been initialised.

The current set provides a strobing feature for ETMv4, that creates a
periodic sampling of trace by switching trace generation on and off
using counters in the ETM.

A configuration called "autofdo" is also provided that uses the 'strobing'
feature and provides a couple of preset values, selectable on the perf
command line.

Link: https://lore.kernel.org/r/20210723165444.1048-9-mike.leach@linaro.org
Signed-off-by: Mike Leach <mike.leach@linaro.org>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/20210818194022.379573-9-mathieu.poirier@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/Makefile
drivers/hwtracing/coresight/coresight-cfg-afdo.c [new file with mode: 0644]
drivers/hwtracing/coresight/coresight-cfg-preload.c [new file with mode: 0644]
drivers/hwtracing/coresight/coresight-cfg-preload.h [new file with mode: 0644]
drivers/hwtracing/coresight/coresight-etm4x-cfg.h
drivers/hwtracing/coresight/coresight-syscfg.c
drivers/hwtracing/coresight/coresight-syscfg.h

index 9420d33..ad44f0f 100644 (file)
@@ -4,7 +4,8 @@
 #
 obj-$(CONFIG_CORESIGHT) += coresight.o
 coresight-y := coresight-core.o  coresight-etm-perf.o coresight-platform.o \
-               coresight-sysfs.o coresight-syscfg.o coresight-config.o
+               coresight-sysfs.o coresight-syscfg.o coresight-config.o \
+               coresight-cfg-preload.o coresight-cfg-afdo.o
 obj-$(CONFIG_CORESIGHT_LINK_AND_SINK_TMC) += coresight-tmc.o
 coresight-tmc-y := coresight-tmc-core.o coresight-tmc-etf.o \
                      coresight-tmc-etr.o
diff --git a/drivers/hwtracing/coresight/coresight-cfg-afdo.c b/drivers/hwtracing/coresight/coresight-cfg-afdo.c
new file mode 100644 (file)
index 0000000..84b3118
--- /dev/null
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright(C) 2020 Linaro Limited. All rights reserved.
+ * Author: Mike Leach <mike.leach@linaro.org>
+ */
+
+#include "coresight-config.h"
+
+/* ETMv4 includes and features */
+#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
+#include "coresight-etm4x-cfg.h"
+
+/* preload configurations and features */
+
+/* preload in features for ETMv4 */
+
+/* strobe feature */
+static struct cscfg_parameter_desc strobe_params[] = {
+       {
+               .name = "window",
+               .value = 5000,
+       },
+       {
+               .name = "period",
+               .value = 10000,
+       },
+};
+
+static struct cscfg_regval_desc strobe_regs[] = {
+       /* resource selectors */
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCRSCTLRn(2),
+               .hw_info = ETM4_CFG_RES_SEL,
+               .val32 = 0x20001,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCRSCTLRn(3),
+               .hw_info = ETM4_CFG_RES_SEQ,
+               .val32 = 0x20002,
+       },
+       /* strobe window counter 0 - reload from param 0 */
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
+               .offset = TRCCNTVRn(0),
+               .hw_info = ETM4_CFG_RES_CTR,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
+               .offset = TRCCNTRLDVRn(0),
+               .hw_info = ETM4_CFG_RES_CTR,
+               .val32 = 0,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCCNTCTLRn(0),
+               .hw_info = ETM4_CFG_RES_CTR,
+               .val32 = 0x10001,
+       },
+       /* strobe period counter 1 - reload from param 1 */
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_SAVE,
+               .offset = TRCCNTVRn(1),
+               .hw_info = ETM4_CFG_RES_CTR,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE | CS_CFG_REG_TYPE_VAL_PARAM,
+               .offset = TRCCNTRLDVRn(1),
+               .hw_info = ETM4_CFG_RES_CTR,
+               .val32 = 1,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCCNTCTLRn(1),
+               .hw_info = ETM4_CFG_RES_CTR,
+               .val32 = 0x8102,
+       },
+       /* sequencer */
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCSEQEVRn(0),
+               .hw_info = ETM4_CFG_RES_SEQ,
+               .val32 = 0x0081,
+       },
+       {
+               .type = CS_CFG_REG_TYPE_RESOURCE,
+               .offset = TRCSEQEVRn(1),
+               .hw_info = ETM4_CFG_RES_SEQ,
+               .val32 = 0x0000,
+       },
+       /* view-inst */
+       {
+               .type = CS_CFG_REG_TYPE_STD | CS_CFG_REG_TYPE_VAL_MASK,
+               .offset = TRCVICTLR,
+               .val32 = 0x0003,
+               .mask32 = 0x0003,
+       },
+       /* end of regs */
+};
+
+struct cscfg_feature_desc strobe_etm4x = {
+       .name = "strobing",
+       .description = "Generate periodic trace capture windows.\n"
+                      "parameter \'window\': a number of CPU cycles (W)\n"
+                      "parameter \'period\': trace enabled for W cycles every period x W cycles\n",
+       .match_flags = CS_CFG_MATCH_CLASS_SRC_ETM4,
+       .nr_params = ARRAY_SIZE(strobe_params),
+       .params_desc = strobe_params,
+       .nr_regs = ARRAY_SIZE(strobe_regs),
+       .regs_desc = strobe_regs,
+};
+
+/* create an autofdo configuration */
+
+/* we will provide 9 sets of preset parameter values */
+#define AFDO_NR_PRESETS        9
+/* the total number of parameters in used features */
+#define AFDO_NR_PARAMS ARRAY_SIZE(strobe_params)
+
+static const char *afdo_ref_names[] = {
+       "strobing",
+};
+
+/*
+ * set of presets leaves strobing window constant while varying period to allow
+ * experimentation with mark / space ratios for various workloads
+ */
+static u64 afdo_presets[AFDO_NR_PRESETS][AFDO_NR_PARAMS] = {
+       { 5000, 2 },
+       { 5000, 4 },
+       { 5000, 8 },
+       { 5000, 16 },
+       { 5000, 64 },
+       { 5000, 128 },
+       { 5000, 512 },
+       { 5000, 1024 },
+       { 5000, 4096 },
+};
+
+struct cscfg_config_desc afdo_etm4x = {
+       .name = "autofdo",
+       .description = "Setup ETMs with strobing for autofdo\n"
+       "Supplied presets allow experimentation with mark-space ratio for various loads\n",
+       .nr_feat_refs = ARRAY_SIZE(afdo_ref_names),
+       .feat_ref_names = afdo_ref_names,
+       .nr_presets = AFDO_NR_PRESETS,
+       .nr_total_params = AFDO_NR_PARAMS,
+       .presets = &afdo_presets[0][0],
+};
+
+/* end of ETM4x configurations */
+#endif /* IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X) */
diff --git a/drivers/hwtracing/coresight/coresight-cfg-preload.c b/drivers/hwtracing/coresight/coresight-cfg-preload.c
new file mode 100644 (file)
index 0000000..751af37
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright(C) 2020 Linaro Limited. All rights reserved.
+ * Author: Mike Leach <mike.leach@linaro.org>
+ */
+
+#include "coresight-cfg-preload.h"
+#include "coresight-config.h"
+#include "coresight-syscfg.h"
+
+/* Basic features and configurations pre-loaded on initialisation */
+
+static struct cscfg_feature_desc *preload_feats[] = {
+#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
+       &strobe_etm4x,
+#endif
+       NULL
+};
+
+static struct cscfg_config_desc *preload_cfgs[] = {
+#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
+       &afdo_etm4x,
+#endif
+       NULL
+};
+
+/* preload called on initialisation */
+int cscfg_preload(void)
+{
+       return cscfg_load_config_sets(preload_cfgs, preload_feats);
+}
diff --git a/drivers/hwtracing/coresight/coresight-cfg-preload.h b/drivers/hwtracing/coresight/coresight-cfg-preload.h
new file mode 100644 (file)
index 0000000..21299e1
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright(C) 2020 Linaro Limited. All rights reserved.
+ * Author: Mike Leach <mike.leach@linaro.org>
+ */
+
+/* declare preloaded configurations and features */
+
+/* from coresight-cfg-afdo.c - etm 4x features */
+#if IS_ENABLED(CONFIG_CORESIGHT_SOURCE_ETM4X)
+extern struct cscfg_feature_desc strobe_etm4x;
+extern struct cscfg_config_desc afdo_etm4x;
+#endif
index a204ad9..32dab34 100644 (file)
@@ -9,6 +9,21 @@
 #include "coresight-config.h"
 #include "coresight-etm4x.h"
 
+/* ETMv4 specific config defines */
+
+/* resource IDs */
+
+#define ETM4_CFG_RES_CTR       0x001
+#define ETM4_CFG_RES_CMP       0x002
+#define ETM4_CFG_RES_CMP_PAIR0 0x003
+#define ETM4_CFG_RES_CMP_PAIR1 0x004
+#define ETM4_CFG_RES_SEL       0x005
+#define ETM4_CFG_RES_SEL_PAIR0 0x006
+#define ETM4_CFG_RES_SEL_PAIR1 0x007
+#define ETM4_CFG_RES_SEQ       0x008
+#define ETM4_CFG_RES_TS                0x009
+#define ETM4_CFG_RES_MASK      0x00F
+
 /* ETMv4 specific config functions */
 int etm4_cscfg_register(struct coresight_device *csdev);
 
index 795dba5..c0f764d 100644 (file)
@@ -752,8 +752,17 @@ int __init cscfg_init(void)
        INIT_LIST_HEAD(&cscfg_mgr->config_desc_list);
        atomic_set(&cscfg_mgr->sys_active_cnt, 0);
 
+       /* preload built-in configurations */
+       err = cscfg_preload();
+       if (err)
+               goto exit_err;
+
        dev_info(cscfg_device(), "CoreSight Configuration manager initialised");
        return 0;
+
+exit_err:
+       cscfg_clear_device();
+       return err;
 }
 
 void cscfg_exit(void)
index a527758..7bb8c8e 100644 (file)
@@ -56,6 +56,7 @@ struct cscfg_registered_csdev {
 /* internal core operations for cscfg */
 int __init cscfg_init(void);
 void cscfg_exit(void);
+int cscfg_preload(void);
 
 /* syscfg manager external API */
 int cscfg_load_config_sets(struct cscfg_config_desc **cfg_descs,