diff mbox series

[2/4] soc: ti: ti_sci_pm_domains: Add support for exclusive access

Message ID 20190218051517.9218-3-lokeshvutla@ti.com
State Changes Requested, archived
Headers show
Series soc: ti: k3-am654: Allow for exclsive request of devices | expand

Checks

Context Check Description
robh/checkpatch warning "total: 0 errors, 1 warnings, 71 lines checked"

Commit Message

Lokesh Vutla Feb. 18, 2019, 5:15 a.m. UTC
TISCI protocol supports for enabling the device with exclusive
permissions. Certain remoteproc devices or some shared devices
across VM doesn't wants to request devices with this flag set.
So add support for getting this information from DT. With this
power-domain-cells are increased to 2.

For keeping the DT backward compatibility intact, defaulting the
device permissions to set the exclusive flag set. In this case the
power-domain-cells is 1.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 .../bindings/soc/ti/sci-pm-domain.txt         |  7 ++++--
 drivers/soc/ti/ti_sci_pm_domains.c            | 22 +++++++++++++++++--
 2 files changed, 25 insertions(+), 4 deletions(-)

Comments

Tero Kristo Feb. 18, 2019, 8:10 a.m. UTC | #1
On 18/02/2019 07:15, Lokesh Vutla wrote:
> TISCI protocol supports for enabling the device with exclusive
> permissions. Certain remoteproc devices or some shared devices
> across VM doesn't wants to request devices with this flag set.
> So add support for getting this information from DT. With this
> power-domain-cells are increased to 2.
> 
> For keeping the DT backward compatibility intact, defaulting the
> device permissions to set the exclusive flag set. In this case the
> power-domain-cells is 1.
> 
> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
> ---
>   .../bindings/soc/ti/sci-pm-domain.txt         |  7 ++++--
>   drivers/soc/ti/ti_sci_pm_domains.c            | 22 +++++++++++++++++--

Please split the dt-binding change into a separate patch.

-Tero

>   2 files changed, 25 insertions(+), 4 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
> index f7b00a7c0f68..5fdda7475023 100644
> --- a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
> +++ b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
> @@ -19,8 +19,11 @@ child of the pmmc node.
>   Required Properties:
>   --------------------
>   - compatible: should be "ti,sci-pm-domain"
> -- #power-domain-cells: Must be 1 so that an id can be provided in each
> -		       device node.
> +- #power-domain-cells: Can be one of the following:
> +			1: Containing the device id of each node
> +			2: First entry should be device id
> +			   Second entry should be 1 or 0. Use 1 for enabling
> +			   the device with exclusive permissions set else 0.
>   
>   Example (K2G):
>   -------------
> diff --git a/drivers/soc/ti/ti_sci_pm_domains.c b/drivers/soc/ti/ti_sci_pm_domains.c
> index de31b9389e2e..4dae42651212 100644
> --- a/drivers/soc/ti/ti_sci_pm_domains.c
> +++ b/drivers/soc/ti/ti_sci_pm_domains.c
> @@ -24,6 +24,8 @@
>   #include <linux/slab.h>
>   #include <linux/soc/ti/ti_sci_protocol.h>
>   
> +#define PD_REQUEST_EXCLUSIVE BIT(0)
> +
>   /**
>    * struct ti_sci_genpd_dev_data: holds data needed for every device attached
>    *				 to this genpd
> @@ -32,6 +34,7 @@
>    */
>   struct ti_sci_genpd_dev_data {
>   	int idx;
> +	u8 exclusive;
>   };
>   
>   /**
> @@ -63,6 +66,14 @@ static int ti_sci_dev_id(struct device *dev)
>   	return sci_dev_data->idx;
>   }
>   
> +static u8 is_ti_sci_dev_exclusive(struct device *dev)
> +{
> +	struct generic_pm_domain_data *genpd_data = dev_gpd_data(dev);
> +	struct ti_sci_genpd_dev_data *sci_dev_data = genpd_data->data;
> +
> +	return sci_dev_data->exclusive & PD_REQUEST_EXCLUSIVE;
> +}
> +
>   /**
>    * ti_sci_dev_to_sci_handle(): get pointer to ti_sci_handle
>    * @dev: pointer to device associated with this genpd
> @@ -87,7 +98,10 @@ static int ti_sci_dev_start(struct device *dev)
>   	const struct ti_sci_handle *ti_sci = ti_sci_dev_to_sci_handle(dev);
>   	int idx = ti_sci_dev_id(dev);
>   
> -	return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
> +	if (is_ti_sci_dev_exclusive(dev))
> +		return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci, idx);
> +	else
> +		return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
>   }
>   
>   /**
> @@ -118,7 +132,7 @@ static int ti_sci_pd_attach_dev(struct generic_pm_domain *domain,
>   	if (ret < 0)
>   		return ret;
>   
> -	if (pd_args.args_count != 1)
> +	if (pd_args.args_count != 1 && pd_args.args_count != 2)
>   		return -EINVAL;
>   
>   	idx = pd_args.args[0];
> @@ -136,6 +150,10 @@ static int ti_sci_pd_attach_dev(struct generic_pm_domain *domain,
>   		return -ENOMEM;
>   
>   	sci_dev_data->idx = idx;
> +	/* Enable the exclusive permissions by default */
> +	sci_dev_data->exclusive = PD_REQUEST_EXCLUSIVE;
> +	if (pd_args.args_count == 2)
> +		sci_dev_data->exclusive = pd_args.args[1];
>   
>   	genpd_data = dev_gpd_data(dev);
>   	genpd_data->data = sci_dev_data;
> 

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
Lokesh Vutla Feb. 18, 2019, 1:46 p.m. UTC | #2
On 18/02/19 1:40 PM, Tero Kristo wrote:
> On 18/02/2019 07:15, Lokesh Vutla wrote:
>> TISCI protocol supports for enabling the device with exclusive
>> permissions. Certain remoteproc devices or some shared devices
>> across VM doesn't wants to request devices with this flag set.
>> So add support for getting this information from DT. With this
>> power-domain-cells are increased to 2.
>>
>> For keeping the DT backward compatibility intact, defaulting the
>> device permissions to set the exclusive flag set. In this case the
>> power-domain-cells is 1.
>>
>> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
>> ---
>>   .../bindings/soc/ti/sci-pm-domain.txt         |  7 ++++--
>>   drivers/soc/ti/ti_sci_pm_domains.c            | 22 +++++++++++++++++--
> 
> Please split the dt-binding change into a separate patch.

Sure, will fix in v2. Will wait for some more time before posting v2.

Thanks and regards,
Lokesh

> 
> -Tero
> 
>>   2 files changed, 25 insertions(+), 4 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
>> b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
>> index f7b00a7c0f68..5fdda7475023 100644
>> --- a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
>> +++ b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
>> @@ -19,8 +19,11 @@ child of the pmmc node.
>>   Required Properties:
>>   --------------------
>>   - compatible: should be "ti,sci-pm-domain"
>> -- #power-domain-cells: Must be 1 so that an id can be provided in each
>> -               device node.
>> +- #power-domain-cells: Can be one of the following:
>> +            1: Containing the device id of each node
>> +            2: First entry should be device id
>> +               Second entry should be 1 or 0. Use 1 for enabling
>> +               the device with exclusive permissions set else 0.
>>     Example (K2G):
>>   -------------
>> diff --git a/drivers/soc/ti/ti_sci_pm_domains.c
>> b/drivers/soc/ti/ti_sci_pm_domains.c
>> index de31b9389e2e..4dae42651212 100644
>> --- a/drivers/soc/ti/ti_sci_pm_domains.c
>> +++ b/drivers/soc/ti/ti_sci_pm_domains.c
>> @@ -24,6 +24,8 @@
>>   #include <linux/slab.h>
>>   #include <linux/soc/ti/ti_sci_protocol.h>
>>   +#define PD_REQUEST_EXCLUSIVE BIT(0)
>> +
>>   /**
>>    * struct ti_sci_genpd_dev_data: holds data needed for every device attached
>>    *                 to this genpd
>> @@ -32,6 +34,7 @@
>>    */
>>   struct ti_sci_genpd_dev_data {
>>       int idx;
>> +    u8 exclusive;
>>   };
>>     /**
>> @@ -63,6 +66,14 @@ static int ti_sci_dev_id(struct device *dev)
>>       return sci_dev_data->idx;
>>   }
>>   +static u8 is_ti_sci_dev_exclusive(struct device *dev)
>> +{
>> +    struct generic_pm_domain_data *genpd_data = dev_gpd_data(dev);
>> +    struct ti_sci_genpd_dev_data *sci_dev_data = genpd_data->data;
>> +
>> +    return sci_dev_data->exclusive & PD_REQUEST_EXCLUSIVE;
>> +}
>> +
>>   /**
>>    * ti_sci_dev_to_sci_handle(): get pointer to ti_sci_handle
>>    * @dev: pointer to device associated with this genpd
>> @@ -87,7 +98,10 @@ static int ti_sci_dev_start(struct device *dev)
>>       const struct ti_sci_handle *ti_sci = ti_sci_dev_to_sci_handle(dev);
>>       int idx = ti_sci_dev_id(dev);
>>   -    return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
>> +    if (is_ti_sci_dev_exclusive(dev))
>> +        return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci, idx);
>> +    else
>> +        return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
>>   }
>>     /**
>> @@ -118,7 +132,7 @@ static int ti_sci_pd_attach_dev(struct generic_pm_domain
>> *domain,
>>       if (ret < 0)
>>           return ret;
>>   -    if (pd_args.args_count != 1)
>> +    if (pd_args.args_count != 1 && pd_args.args_count != 2)
>>           return -EINVAL;
>>         idx = pd_args.args[0];
>> @@ -136,6 +150,10 @@ static int ti_sci_pd_attach_dev(struct generic_pm_domain
>> *domain,
>>           return -ENOMEM;
>>         sci_dev_data->idx = idx;
>> +    /* Enable the exclusive permissions by default */
>> +    sci_dev_data->exclusive = PD_REQUEST_EXCLUSIVE;
>> +    if (pd_args.args_count == 2)
>> +        sci_dev_data->exclusive = pd_args.args[1];
>>         genpd_data = dev_gpd_data(dev);
>>       genpd_data->data = sci_dev_data;
>>
> 
> -- 
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
index f7b00a7c0f68..5fdda7475023 100644
--- a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+++ b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
@@ -19,8 +19,11 @@  child of the pmmc node.
 Required Properties:
 --------------------
 - compatible: should be "ti,sci-pm-domain"
-- #power-domain-cells: Must be 1 so that an id can be provided in each
-		       device node.
+- #power-domain-cells: Can be one of the following:
+			1: Containing the device id of each node
+			2: First entry should be device id
+			   Second entry should be 1 or 0. Use 1 for enabling
+			   the device with exclusive permissions set else 0.
 
 Example (K2G):
 -------------
diff --git a/drivers/soc/ti/ti_sci_pm_domains.c b/drivers/soc/ti/ti_sci_pm_domains.c
index de31b9389e2e..4dae42651212 100644
--- a/drivers/soc/ti/ti_sci_pm_domains.c
+++ b/drivers/soc/ti/ti_sci_pm_domains.c
@@ -24,6 +24,8 @@ 
 #include <linux/slab.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
 
+#define PD_REQUEST_EXCLUSIVE BIT(0)
+
 /**
  * struct ti_sci_genpd_dev_data: holds data needed for every device attached
  *				 to this genpd
@@ -32,6 +34,7 @@ 
  */
 struct ti_sci_genpd_dev_data {
 	int idx;
+	u8 exclusive;
 };
 
 /**
@@ -63,6 +66,14 @@  static int ti_sci_dev_id(struct device *dev)
 	return sci_dev_data->idx;
 }
 
+static u8 is_ti_sci_dev_exclusive(struct device *dev)
+{
+	struct generic_pm_domain_data *genpd_data = dev_gpd_data(dev);
+	struct ti_sci_genpd_dev_data *sci_dev_data = genpd_data->data;
+
+	return sci_dev_data->exclusive & PD_REQUEST_EXCLUSIVE;
+}
+
 /**
  * ti_sci_dev_to_sci_handle(): get pointer to ti_sci_handle
  * @dev: pointer to device associated with this genpd
@@ -87,7 +98,10 @@  static int ti_sci_dev_start(struct device *dev)
 	const struct ti_sci_handle *ti_sci = ti_sci_dev_to_sci_handle(dev);
 	int idx = ti_sci_dev_id(dev);
 
-	return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
+	if (is_ti_sci_dev_exclusive(dev))
+		return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci, idx);
+	else
+		return ti_sci->ops.dev_ops.get_device(ti_sci, idx);
 }
 
 /**
@@ -118,7 +132,7 @@  static int ti_sci_pd_attach_dev(struct generic_pm_domain *domain,
 	if (ret < 0)
 		return ret;
 
-	if (pd_args.args_count != 1)
+	if (pd_args.args_count != 1 && pd_args.args_count != 2)
 		return -EINVAL;
 
 	idx = pd_args.args[0];
@@ -136,6 +150,10 @@  static int ti_sci_pd_attach_dev(struct generic_pm_domain *domain,
 		return -ENOMEM;
 
 	sci_dev_data->idx = idx;
+	/* Enable the exclusive permissions by default */
+	sci_dev_data->exclusive = PD_REQUEST_EXCLUSIVE;
+	if (pd_args.args_count == 2)
+		sci_dev_data->exclusive = pd_args.args[1];
 
 	genpd_data = dev_gpd_data(dev);
 	genpd_data->data = sci_dev_data;