drivers/hwtracing/coresight/coresight-config.c

Source file repositories/reference/linux-study-clean/drivers/hwtracing/coresight/coresight-config.c

File Facts

System
Linux kernel
Corpus path
drivers/hwtracing/coresight/coresight-config.c
Extension
.c
Size
8349 bytes
Lines
273
Domain
Driver Families
Bucket
drivers/hwtracing
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (param_csdev->val64) {
				dev_dbg(&config_csdev->csdev->dev,
					"set param %s (%lld)", name, val);
				param_csdev->reg_csdev->reg_desc.val64 = val;
			} else {
				param_csdev->reg_csdev->reg_desc.val32 = (u32)val;
				dev_dbg(&config_csdev->csdev->dev,
					"set param %s (%d)", name, (u32)val);
			}
		}

		/* exit early if all params filled */
		if (val_idx >= nr_cfg_params)
			break;
	}
	return 0;
}

/*
 * if we are not using a preset, then need to update the feature params
 * with current values. This sets the register associated with the parameter
 * with the current value of that parameter.
 */
static int cscfg_update_curr_params(struct cscfg_config_csdev *config_csdev)
{
	int i, j;
	struct cscfg_feature_csdev *feat_csdev;
	struct cscfg_parameter_csdev *param_csdev;
	const char *name;
	u64 val;

	for (i = 0; i < config_csdev->nr_feat; i++) {
		feat_csdev = config_csdev->feats_csdev[i];
		if (!feat_csdev->nr_params)
			continue;
		for (j = 0; j < feat_csdev->nr_params; j++) {
			param_csdev = &feat_csdev->params_csdev[j];
			name = feat_csdev->feat_desc->params_desc[j].name;
			val = param_csdev->current_value;
			if (param_csdev->val64) {
				dev_dbg(&config_csdev->csdev->dev,
					"set param %s (%lld)", name, val);
				param_csdev->reg_csdev->reg_desc.val64 = val;
			} else {
				param_csdev->reg_csdev->reg_desc.val32 = (u32)val;
				dev_dbg(&config_csdev->csdev->dev,
					"set param %s (%d)", name, (u32)val);
			}
		}
	}
	return 0;
}

/*
 * Configuration values will be programmed into the driver locations if enabling, or read
 * from relevant locations on disable.
 */
static int cscfg_prog_config(struct cscfg_config_csdev *config_csdev, bool enable)
{
	int i, err = 0;
	struct cscfg_feature_csdev *feat_csdev;
	struct coresight_device *csdev;

	for (i = 0; i < config_csdev->nr_feat; i++) {
		feat_csdev = config_csdev->feats_csdev[i];
		csdev = feat_csdev->csdev;
		dev_dbg(&csdev->dev, "cfg %s;  %s feature:%s", config_csdev->config_desc->name,
			enable ? "enable" : "disable", feat_csdev->feat_desc->name);

		if (enable)
			err = cscfg_set_on_enable(feat_csdev);
		else
			cscfg_save_on_disable(feat_csdev);

		if (err)
			break;
	}
	return err;
}

/*
 * Enable configuration for the device. Will result in the internal driver data
 * being updated ready for programming into the device.
 *
 * @config_csdev:	config_csdev to set.
 * @preset:		preset values to use - 0 for default.
 */
int cscfg_csdev_enable_config(struct cscfg_config_csdev *config_csdev, int preset)
{
	int err = 0;

Annotation

Implementation Notes