All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Mike Leach <mike.leach@linaro.org>
Cc: linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org,
	suzuki.poulose@arm.com, leo.yan@linaro.org,
	alexander.shishkin@linux.intel.com, gregkh@linuxfoundation.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 05/10] coresight: syscfg: Add API to activate and enable configurations
Date: Tue, 20 Jul 2021 11:41:06 -0600	[thread overview]
Message-ID: <20210720174106.GA2301883@p14s> (raw)
In-Reply-To: <20210707133003.5414-6-mike.leach@linaro.org>

On Wed, Jul 07, 2021 at 02:29:58PM +0100, Mike Leach wrote:
> Configurations are first activated, then when any coresight device is
> enabled, the active configurations are checked and any matching
> one is enabled.
> 
> This patch provides the activation / enable API.
> 
> Signed-off-by: Mike Leach <mike.leach@linaro.org>
> Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  .../hwtracing/coresight/coresight-config.h    |   2 +
>  .../hwtracing/coresight/coresight-syscfg.c    | 197 ++++++++++++++++++
>  .../hwtracing/coresight/coresight-syscfg.h    |   8 +
>  include/linux/coresight.h                     |   4 +
>  4 files changed, 211 insertions(+)
> 
> diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h
> index 0667581822c1..25eb6c632692 100644
> --- a/drivers/hwtracing/coresight/coresight-config.h
> +++ b/drivers/hwtracing/coresight/coresight-config.h
> @@ -127,6 +127,7 @@ struct cscfg_feature_desc {
>   * @nr_total_params:	Sum of all parameters declared by used features
>   * @presets:		Array of preset values.
>   * @event_ea:		Extended attribute for perf event value
> + * @active_cnt:		ref count for activate on this configuration.
>   *
>   */
>  struct cscfg_config_desc {
> @@ -139,6 +140,7 @@ struct cscfg_config_desc {
>  	int nr_total_params;
>  	const u64 *presets; /* nr_presets * nr_total_params */
>  	struct dev_ext_attribute *event_ea;
> +	atomic_t active_cnt;
>  };
>  
>  /**
> diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c
> index b93f2b4a777e..4e9804875a9b 100644
> --- a/drivers/hwtracing/coresight/coresight-syscfg.c
> +++ b/drivers/hwtracing/coresight/coresight-syscfg.c
> @@ -282,6 +282,7 @@ static int cscfg_load_config(struct cscfg_config_desc *config_desc)
>  		return err;
>  
>  	list_add(&config_desc->item, &cscfg_mgr->config_desc_list);
> +	atomic_set(&config_desc->active_cnt, 0);
>  	return 0;
>  }
>  
> @@ -468,6 +469,201 @@ void cscfg_unregister_csdev(struct coresight_device *csdev)
>  }
>  EXPORT_SYMBOL_GPL(cscfg_unregister_csdev);
>  
> +/**
> + * cscfg_csdev_reset_feats - reset features for a CoreSight device.
> + *
> + * Resets all parameters and register values for any features loaded
> + * into @csdev to their default values.
> + *
> + * @csdev: The CoreSight device.
> + */
> +void cscfg_csdev_reset_feats(struct coresight_device *csdev)
> +{
> +	struct cscfg_feature_csdev *feat_csdev;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	if (list_empty(&csdev->feature_csdev_list))
> +		goto unlock_exit;
> +
> +	list_for_each_entry(feat_csdev, &csdev->feature_csdev_list, node)
> +		cscfg_reset_feat(feat_csdev);
> +
> +unlock_exit:
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats);
> +
> +/**
> + * cscfg_activate_config -  Mark a configuration descriptor as active.
> + *
> + * This will be seen when csdev devices are enabled in the system.
> + * Only activated configurations can be enabled on individual devices.
> + * Activation protects the configuration from alteration or removal while
> + * active.
> + *
> + * Selection by hash value - generated from the configuration name when it
> + * was loaded and added to the cs_etm/configurations file system for selection
> + * by perf.
> + *
> + * Increments the configuration descriptor active count and the global active
> + * count.
> + *
> + * @cfg_hash: Hash value of the selected configuration name.
> + */
> +int cscfg_activate_config(unsigned long cfg_hash)
> +{
> +	struct cscfg_config_desc *config_desc;
> +	int err = -EINVAL;
> +
> +	mutex_lock(&cscfg_mutex);
> +
> +	list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
> +		if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
> +			/*
> +			 * increment the global active count - control changes to
> +			 * active configurations
> +			 */
> +			atomic_inc(&cscfg_mgr->sys_active_cnt);
> +
> +			/*
> +			 * mark the descriptor as active so enable config on a
> +			 * device instance will use it
> +			 */
> +			atomic_inc(&config_desc->active_cnt);
> +
> +			err = 0;
> +			dev_dbg(cscfg_device(), "Activate config %s.\n", config_desc->name);
> +			break;
> +		}
> +	}
> +	mutex_unlock(&cscfg_mutex);
> +
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(cscfg_activate_config);
> +
> +/**
> + * cscfg_deactivate_config -  Mark a config descriptor as inactive.
> + *
> + * Decrement the configuration and global active counts.
> + *
> + * @cfg_hash: Hash value of the selected configuration name.
> + */
> +void cscfg_deactivate_config(unsigned long cfg_hash)
> +{
> +	struct cscfg_config_desc *config_desc;
> +
> +	mutex_lock(&cscfg_mutex);
> +
> +	list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
> +		if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
> +			atomic_dec(&config_desc->active_cnt);
> +			atomic_dec(&cscfg_mgr->sys_active_cnt);
> +			dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name);
> +			break;
> +		}
> +	}
> +	mutex_unlock(&cscfg_mutex);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_deactivate_config);
> +
> +/**
> + * cscfg_csdev_enable_active_config - Enable matching active configuration for device.
> + *
> + * Enables the configuration selected by @cfg_hash if the configuration is supported
> + * on the device and has been activated.
> + *
> + * If active and supported the CoreSight device @csdev will be programmed with the
> + * configuration, using @preset parameters.
> + *
> + * Should be called before driver hardware enable for the requested device, prior to
> + * programming and enabling the physical hardware.
> + *
> + * @csdev:	CoreSight device to program.
> + * @cfg_hash:	Selector for the configuration.
> + * @preset:	Preset parameter values to use, 0 for current / default values.
> + */
> +int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
> +				     unsigned long cfg_hash, int preset)
> +{
> +	struct cscfg_config_csdev *config_csdev_active = NULL, *config_csdev_item;
> +	const struct cscfg_config_desc *config_desc;
> +	unsigned long flags;
> +	int err = 0;
> +
> +	/* quickly check global count */
> +	if (!atomic_read(&cscfg_mgr->sys_active_cnt))
> +		return 0;
> +
> +	/* look for matching config - set in_enable flag if found */
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) {
> +		config_desc = config_csdev_item->config_desc;
> +		if ((atomic_read(&config_desc->active_cnt)) &&
> +		    ((unsigned long)config_desc->event_ea->var == cfg_hash)) {
> +			config_csdev_active = config_csdev_item;
> +			csdev->cscfg_in_enable = true;
> +			break;
> +		}
> +	}
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags)

In the previous revision the mutex wasn't dropped and
cscfg_csdev_enable_config() was called with the mutex held.  Any reason for not
doing that with the spinlock implemenation?  If anything it should be more
efficient because the spinlock is on a per csdev basis.  It would also keep
things simple and avoid adding a new ->cscfg_in_enable field to the
coresight_device structure.  That last point really concerns me - if holding the
spinlock is not possible than a new approach should be considered.  

Thanks,
Mathieu

> +
> +	/*
> +	 * If found, attempt to enable and then set as enabled if no error
> +	 * and in enable flag still set.
> +	 */
> +	if (config_csdev_active) {
> +		/*
> +		 * Call the generic routine that will program up the internal
> +		 * driver structures prior to programming up the hardware.
> +		 * This routine takes the driver spinlock saved in the configs.
> +		 */
> +		err = cscfg_csdev_enable_config(config_csdev_active, preset);
> +		if (!err) {
> +			/*
> +			 * Successful programming. re-check in_enable flag
> +			 * to avoid potential race with disable config.
> +			 */
> +			spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +			if (csdev->cscfg_in_enable)
> +				csdev->active_cscfg_ctxt = (void *)config_csdev_active;
> +			csdev->cscfg_in_enable = false;
> +			spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +		}
> +	}
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_enable_active_config);
> +
> +/**
> + * cscfg_csdev_disable_active_config - disable an active config on the device.
> + *
> + * Disables the active configuration on the CoreSight device @csdev.
> + * Disable will save the values of any registers marked in the configurations
> + * as save on disable.
> + *
> + * Should be called after driver hardware disable for the requested device,
> + * after disabling the physical hardware and reading back registers.
> + *
> + * @csdev: The CoreSight device.
> + */
> +void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
> +{
> +	struct cscfg_config_csdev *config_csdev;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	csdev->cscfg_in_enable = false;
> +	config_csdev = (struct cscfg_config_csdev *)csdev->active_cscfg_ctxt;
> +	csdev->active_cscfg_ctxt = NULL;
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +
> +	if (config_csdev)
> +		cscfg_csdev_disable_config(config_csdev);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_disable_active_config);
> +
>  /* Initialise system configuration management device. */
>  
>  struct device *cscfg_device(void)
> @@ -536,6 +732,7 @@ int __init cscfg_init(void)
>  	INIT_LIST_HEAD(&cscfg_mgr->csdev_desc_list);
>  	INIT_LIST_HEAD(&cscfg_mgr->feat_desc_list);
>  	INIT_LIST_HEAD(&cscfg_mgr->config_desc_list);
> +	atomic_set(&cscfg_mgr->sys_active_cnt, 0);
>  
>  	dev_info(cscfg_device(), "CoreSight Configuration manager initialised");
>  	return 0;
> diff --git a/drivers/hwtracing/coresight/coresight-syscfg.h b/drivers/hwtracing/coresight/coresight-syscfg.h
> index 5bcae3b374c6..a52775890670 100644
> --- a/drivers/hwtracing/coresight/coresight-syscfg.h
> +++ b/drivers/hwtracing/coresight/coresight-syscfg.h
> @@ -24,12 +24,14 @@
>   * @csdev_desc_list:	List of coresight devices registered with the configuration manager.
>   * @feat_desc_list:	List of feature descriptors to load into registered devices.
>   * @config_desc_list:	List of system configuration descriptors to load into registered devices.
> + * @sys_active_cnt:	Total number of active config descriptor references.
>   */
>  struct cscfg_manager {
>  	struct device dev;
>  	struct list_head csdev_desc_list;
>  	struct list_head feat_desc_list;
>  	struct list_head config_desc_list;
> +	atomic_t sys_active_cnt;
>  };
>  
>  /* get reference to dev in cscfg_manager */
> @@ -61,5 +63,11 @@ int cscfg_load_config_sets(struct cscfg_config_desc **cfg_descs,
>  int cscfg_register_csdev(struct coresight_device *csdev, u32 match_flags,
>  			 struct cscfg_csdev_feat_ops *ops);
>  void cscfg_unregister_csdev(struct coresight_device *csdev);
> +int cscfg_activate_config(unsigned long cfg_hash);
> +void cscfg_deactivate_config(unsigned long cfg_hash);
> +void cscfg_csdev_reset_feats(struct coresight_device *csdev);
> +int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
> +				     unsigned long cfg_hash, int preset);
> +void cscfg_csdev_disable_active_config(struct coresight_device *csdev);
>  
>  #endif /* CORESIGHT_SYSCFG_H */
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index 16544ae2b532..e66e1a5fd803 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -223,6 +223,8 @@ struct coresight_sysfs_link {
>   * @feature_csdev_list: List of complex feature programming added to the device.
>   * @config_csdev_list:  List of system configurations added to the device.
>   * @cscfg_csdev_lock:	Protect the lists of configurations and features.
> + * @active_cscfg_ctxt:  Context information for current active system configuration.
> + * @cscfg_in_enable:    Flag to indicate we are in the process of enabling.
>   */
>  struct coresight_device {
>  	struct coresight_platform_data *pdata;
> @@ -248,6 +250,8 @@ struct coresight_device {
>  	struct list_head feature_csdev_list;
>  	struct list_head config_csdev_list;
>  	spinlock_t cscfg_csdev_lock;
> +	void *active_cscfg_ctxt;
> +	bool cscfg_in_enable;
>  };
>  
>  /*
> -- 
> 2.17.1
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Mike Leach <mike.leach@linaro.org>
Cc: linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org,
	suzuki.poulose@arm.com, leo.yan@linaro.org,
	alexander.shishkin@linux.intel.com, gregkh@linuxfoundation.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 05/10] coresight: syscfg: Add API to activate and enable configurations
Date: Tue, 20 Jul 2021 11:41:06 -0600	[thread overview]
Message-ID: <20210720174106.GA2301883@p14s> (raw)
In-Reply-To: <20210707133003.5414-6-mike.leach@linaro.org>

On Wed, Jul 07, 2021 at 02:29:58PM +0100, Mike Leach wrote:
> Configurations are first activated, then when any coresight device is
> enabled, the active configurations are checked and any matching
> one is enabled.
> 
> This patch provides the activation / enable API.
> 
> Signed-off-by: Mike Leach <mike.leach@linaro.org>
> Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  .../hwtracing/coresight/coresight-config.h    |   2 +
>  .../hwtracing/coresight/coresight-syscfg.c    | 197 ++++++++++++++++++
>  .../hwtracing/coresight/coresight-syscfg.h    |   8 +
>  include/linux/coresight.h                     |   4 +
>  4 files changed, 211 insertions(+)
> 
> diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h
> index 0667581822c1..25eb6c632692 100644
> --- a/drivers/hwtracing/coresight/coresight-config.h
> +++ b/drivers/hwtracing/coresight/coresight-config.h
> @@ -127,6 +127,7 @@ struct cscfg_feature_desc {
>   * @nr_total_params:	Sum of all parameters declared by used features
>   * @presets:		Array of preset values.
>   * @event_ea:		Extended attribute for perf event value
> + * @active_cnt:		ref count for activate on this configuration.
>   *
>   */
>  struct cscfg_config_desc {
> @@ -139,6 +140,7 @@ struct cscfg_config_desc {
>  	int nr_total_params;
>  	const u64 *presets; /* nr_presets * nr_total_params */
>  	struct dev_ext_attribute *event_ea;
> +	atomic_t active_cnt;
>  };
>  
>  /**
> diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c
> index b93f2b4a777e..4e9804875a9b 100644
> --- a/drivers/hwtracing/coresight/coresight-syscfg.c
> +++ b/drivers/hwtracing/coresight/coresight-syscfg.c
> @@ -282,6 +282,7 @@ static int cscfg_load_config(struct cscfg_config_desc *config_desc)
>  		return err;
>  
>  	list_add(&config_desc->item, &cscfg_mgr->config_desc_list);
> +	atomic_set(&config_desc->active_cnt, 0);
>  	return 0;
>  }
>  
> @@ -468,6 +469,201 @@ void cscfg_unregister_csdev(struct coresight_device *csdev)
>  }
>  EXPORT_SYMBOL_GPL(cscfg_unregister_csdev);
>  
> +/**
> + * cscfg_csdev_reset_feats - reset features for a CoreSight device.
> + *
> + * Resets all parameters and register values for any features loaded
> + * into @csdev to their default values.
> + *
> + * @csdev: The CoreSight device.
> + */
> +void cscfg_csdev_reset_feats(struct coresight_device *csdev)
> +{
> +	struct cscfg_feature_csdev *feat_csdev;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	if (list_empty(&csdev->feature_csdev_list))
> +		goto unlock_exit;
> +
> +	list_for_each_entry(feat_csdev, &csdev->feature_csdev_list, node)
> +		cscfg_reset_feat(feat_csdev);
> +
> +unlock_exit:
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats);
> +
> +/**
> + * cscfg_activate_config -  Mark a configuration descriptor as active.
> + *
> + * This will be seen when csdev devices are enabled in the system.
> + * Only activated configurations can be enabled on individual devices.
> + * Activation protects the configuration from alteration or removal while
> + * active.
> + *
> + * Selection by hash value - generated from the configuration name when it
> + * was loaded and added to the cs_etm/configurations file system for selection
> + * by perf.
> + *
> + * Increments the configuration descriptor active count and the global active
> + * count.
> + *
> + * @cfg_hash: Hash value of the selected configuration name.
> + */
> +int cscfg_activate_config(unsigned long cfg_hash)
> +{
> +	struct cscfg_config_desc *config_desc;
> +	int err = -EINVAL;
> +
> +	mutex_lock(&cscfg_mutex);
> +
> +	list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
> +		if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
> +			/*
> +			 * increment the global active count - control changes to
> +			 * active configurations
> +			 */
> +			atomic_inc(&cscfg_mgr->sys_active_cnt);
> +
> +			/*
> +			 * mark the descriptor as active so enable config on a
> +			 * device instance will use it
> +			 */
> +			atomic_inc(&config_desc->active_cnt);
> +
> +			err = 0;
> +			dev_dbg(cscfg_device(), "Activate config %s.\n", config_desc->name);
> +			break;
> +		}
> +	}
> +	mutex_unlock(&cscfg_mutex);
> +
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(cscfg_activate_config);
> +
> +/**
> + * cscfg_deactivate_config -  Mark a config descriptor as inactive.
> + *
> + * Decrement the configuration and global active counts.
> + *
> + * @cfg_hash: Hash value of the selected configuration name.
> + */
> +void cscfg_deactivate_config(unsigned long cfg_hash)
> +{
> +	struct cscfg_config_desc *config_desc;
> +
> +	mutex_lock(&cscfg_mutex);
> +
> +	list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {
> +		if ((unsigned long)config_desc->event_ea->var == cfg_hash) {
> +			atomic_dec(&config_desc->active_cnt);
> +			atomic_dec(&cscfg_mgr->sys_active_cnt);
> +			dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name);
> +			break;
> +		}
> +	}
> +	mutex_unlock(&cscfg_mutex);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_deactivate_config);
> +
> +/**
> + * cscfg_csdev_enable_active_config - Enable matching active configuration for device.
> + *
> + * Enables the configuration selected by @cfg_hash if the configuration is supported
> + * on the device and has been activated.
> + *
> + * If active and supported the CoreSight device @csdev will be programmed with the
> + * configuration, using @preset parameters.
> + *
> + * Should be called before driver hardware enable for the requested device, prior to
> + * programming and enabling the physical hardware.
> + *
> + * @csdev:	CoreSight device to program.
> + * @cfg_hash:	Selector for the configuration.
> + * @preset:	Preset parameter values to use, 0 for current / default values.
> + */
> +int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
> +				     unsigned long cfg_hash, int preset)
> +{
> +	struct cscfg_config_csdev *config_csdev_active = NULL, *config_csdev_item;
> +	const struct cscfg_config_desc *config_desc;
> +	unsigned long flags;
> +	int err = 0;
> +
> +	/* quickly check global count */
> +	if (!atomic_read(&cscfg_mgr->sys_active_cnt))
> +		return 0;
> +
> +	/* look for matching config - set in_enable flag if found */
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) {
> +		config_desc = config_csdev_item->config_desc;
> +		if ((atomic_read(&config_desc->active_cnt)) &&
> +		    ((unsigned long)config_desc->event_ea->var == cfg_hash)) {
> +			config_csdev_active = config_csdev_item;
> +			csdev->cscfg_in_enable = true;
> +			break;
> +		}
> +	}
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags)

In the previous revision the mutex wasn't dropped and
cscfg_csdev_enable_config() was called with the mutex held.  Any reason for not
doing that with the spinlock implemenation?  If anything it should be more
efficient because the spinlock is on a per csdev basis.  It would also keep
things simple and avoid adding a new ->cscfg_in_enable field to the
coresight_device structure.  That last point really concerns me - if holding the
spinlock is not possible than a new approach should be considered.  

Thanks,
Mathieu

> +
> +	/*
> +	 * If found, attempt to enable and then set as enabled if no error
> +	 * and in enable flag still set.
> +	 */
> +	if (config_csdev_active) {
> +		/*
> +		 * Call the generic routine that will program up the internal
> +		 * driver structures prior to programming up the hardware.
> +		 * This routine takes the driver spinlock saved in the configs.
> +		 */
> +		err = cscfg_csdev_enable_config(config_csdev_active, preset);
> +		if (!err) {
> +			/*
> +			 * Successful programming. re-check in_enable flag
> +			 * to avoid potential race with disable config.
> +			 */
> +			spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +			if (csdev->cscfg_in_enable)
> +				csdev->active_cscfg_ctxt = (void *)config_csdev_active;
> +			csdev->cscfg_in_enable = false;
> +			spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +		}
> +	}
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_enable_active_config);
> +
> +/**
> + * cscfg_csdev_disable_active_config - disable an active config on the device.
> + *
> + * Disables the active configuration on the CoreSight device @csdev.
> + * Disable will save the values of any registers marked in the configurations
> + * as save on disable.
> + *
> + * Should be called after driver hardware disable for the requested device,
> + * after disabling the physical hardware and reading back registers.
> + *
> + * @csdev: The CoreSight device.
> + */
> +void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
> +{
> +	struct cscfg_config_csdev *config_csdev;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +	csdev->cscfg_in_enable = false;
> +	config_csdev = (struct cscfg_config_csdev *)csdev->active_cscfg_ctxt;
> +	csdev->active_cscfg_ctxt = NULL;
> +	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +
> +	if (config_csdev)
> +		cscfg_csdev_disable_config(config_csdev);
> +}
> +EXPORT_SYMBOL_GPL(cscfg_csdev_disable_active_config);
> +
>  /* Initialise system configuration management device. */
>  
>  struct device *cscfg_device(void)
> @@ -536,6 +732,7 @@ int __init cscfg_init(void)
>  	INIT_LIST_HEAD(&cscfg_mgr->csdev_desc_list);
>  	INIT_LIST_HEAD(&cscfg_mgr->feat_desc_list);
>  	INIT_LIST_HEAD(&cscfg_mgr->config_desc_list);
> +	atomic_set(&cscfg_mgr->sys_active_cnt, 0);
>  
>  	dev_info(cscfg_device(), "CoreSight Configuration manager initialised");
>  	return 0;
> diff --git a/drivers/hwtracing/coresight/coresight-syscfg.h b/drivers/hwtracing/coresight/coresight-syscfg.h
> index 5bcae3b374c6..a52775890670 100644
> --- a/drivers/hwtracing/coresight/coresight-syscfg.h
> +++ b/drivers/hwtracing/coresight/coresight-syscfg.h
> @@ -24,12 +24,14 @@
>   * @csdev_desc_list:	List of coresight devices registered with the configuration manager.
>   * @feat_desc_list:	List of feature descriptors to load into registered devices.
>   * @config_desc_list:	List of system configuration descriptors to load into registered devices.
> + * @sys_active_cnt:	Total number of active config descriptor references.
>   */
>  struct cscfg_manager {
>  	struct device dev;
>  	struct list_head csdev_desc_list;
>  	struct list_head feat_desc_list;
>  	struct list_head config_desc_list;
> +	atomic_t sys_active_cnt;
>  };
>  
>  /* get reference to dev in cscfg_manager */
> @@ -61,5 +63,11 @@ int cscfg_load_config_sets(struct cscfg_config_desc **cfg_descs,
>  int cscfg_register_csdev(struct coresight_device *csdev, u32 match_flags,
>  			 struct cscfg_csdev_feat_ops *ops);
>  void cscfg_unregister_csdev(struct coresight_device *csdev);
> +int cscfg_activate_config(unsigned long cfg_hash);
> +void cscfg_deactivate_config(unsigned long cfg_hash);
> +void cscfg_csdev_reset_feats(struct coresight_device *csdev);
> +int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
> +				     unsigned long cfg_hash, int preset);
> +void cscfg_csdev_disable_active_config(struct coresight_device *csdev);
>  
>  #endif /* CORESIGHT_SYSCFG_H */
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index 16544ae2b532..e66e1a5fd803 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -223,6 +223,8 @@ struct coresight_sysfs_link {
>   * @feature_csdev_list: List of complex feature programming added to the device.
>   * @config_csdev_list:  List of system configurations added to the device.
>   * @cscfg_csdev_lock:	Protect the lists of configurations and features.
> + * @active_cscfg_ctxt:  Context information for current active system configuration.
> + * @cscfg_in_enable:    Flag to indicate we are in the process of enabling.
>   */
>  struct coresight_device {
>  	struct coresight_platform_data *pdata;
> @@ -248,6 +250,8 @@ struct coresight_device {
>  	struct list_head feature_csdev_list;
>  	struct list_head config_csdev_list;
>  	spinlock_t cscfg_csdev_lock;
> +	void *active_cscfg_ctxt;
> +	bool cscfg_in_enable;
>  };
>  
>  /*
> -- 
> 2.17.1
> 

  reply	other threads:[~2021-07-20 17:43 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-07 13:29 [PATCH v8 00/10] CoreSight configuration management; ETM strobing Mike Leach
2021-07-07 13:29 ` Mike Leach
2021-07-07 13:29 ` [PATCH v8 01/10] coresight: syscfg: Initial coresight system configuration Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-07 13:29 ` [PATCH v8 02/10] coresight: syscfg: Add registration and feature loading for cs devices Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-07 13:29 ` [PATCH v8 03/10] coresight: config: Add configuration and feature generic functions Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-07 13:29 ` [PATCH v8 04/10] coresight: etm-perf: update to handle configuration selection Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-07 13:29 ` [PATCH v8 05/10] coresight: syscfg: Add API to activate and enable configurations Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-20 17:41   ` Mathieu Poirier [this message]
2021-07-20 17:41     ` Mathieu Poirier
2021-07-20 18:07     ` Mathieu Poirier
2021-07-20 18:07       ` Mathieu Poirier
2021-07-07 13:29 ` [PATCH v8 06/10] coresight: etm-perf: Update to activate selected configuration Mike Leach
2021-07-07 13:29   ` Mike Leach
2021-07-07 13:30 ` [PATCH v8 07/10] coresight: etm4x: Add complex configuration handlers to etmv4 Mike Leach
2021-07-07 13:30   ` Mike Leach
2021-07-07 13:30 ` [PATCH v8 08/10] coresight: config: Add preloaded configurations Mike Leach
2021-07-07 13:30   ` Mike Leach
2021-07-07 13:30 ` [PATCH v8 09/10] coresight: syscfg: Add initial configfs support Mike Leach
2021-07-07 13:30   ` Mike Leach
2021-07-07 13:30 ` [PATCH v8 10/10] Documentation: coresight: Add documentation for CoreSight config Mike Leach
2021-07-07 13:30   ` Mike Leach
2021-07-12 16:44 ` [PATCH v8 00/10] CoreSight configuration management; ETM strobing Mathieu Poirier
2021-07-12 16:44   ` Mathieu Poirier
2021-07-13  9:42   ` Branislav Rankov
2021-07-13  9:42     ` Branislav Rankov
2021-07-16 10:25     ` Mike Leach
2021-07-16 10:25       ` Mike Leach
2021-07-21 17:44       ` Mathieu Poirier
2021-07-21 17:44         ` Mathieu Poirier
2021-07-21 21:35         ` Mike Leach
2021-07-21 21:35           ` Mike Leach
2021-07-22 16:17           ` Mathieu Poirier
2021-07-22 16:17             ` Mathieu Poirier
2021-07-23 14:43             ` Mike Leach
2021-07-23 14:43               ` Mike Leach
2021-07-26 16:49               ` Mathieu Poirier
2021-07-26 16:49                 ` Mathieu Poirier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210720174106.GA2301883@p14s \
    --to=mathieu.poirier@linaro.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=coresight@lists.linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mike.leach@linaro.org \
    --cc=suzuki.poulose@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.