diff mbox series

[2/7] firmware: ti_sci: Implement GET_RANGE with static data

Message ID 20210510172442.11146-3-vigneshr@ti.com
State Changes Requested
Delegated to: Lokesh Vutla
Headers show
Series J72xx: R5 SPL DMA support post HSM Rearch | expand

Commit Message

Raghavendra, Vignesh May 10, 2021, 5:24 p.m. UTC
In case of R5 SPL, GET_RANGE API service is not available (as DM
services are not yet up), therefore service such calls locally using
per SoC static data.

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
---
 drivers/firmware/ti_sci.c             | 36 +++++++++++
 drivers/firmware/ti_sci_static_data.h | 92 +++++++++++++++++++++++++++
 2 files changed, 128 insertions(+)
 create mode 100644 drivers/firmware/ti_sci_static_data.h

Comments

Lokesh Vutla May 11, 2021, 4:42 a.m. UTC | #1
On 10/05/21 10:54 pm, Vignesh Raghavendra wrote:
> In case of R5 SPL, GET_RANGE API service is not available (as DM
> services are not yet up), therefore service such calls locally using
> per SoC static data.
> 
> Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
> ---
>  drivers/firmware/ti_sci.c             | 36 +++++++++++
>  drivers/firmware/ti_sci_static_data.h | 92 +++++++++++++++++++++++++++
>  2 files changed, 128 insertions(+)
>  create mode 100644 drivers/firmware/ti_sci_static_data.h
> 
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index 2aec2e34d3..c27fbc682a 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -23,6 +23,7 @@
>  #include <linux/soc/ti/ti_sci_protocol.h>
>  
>  #include "ti_sci.h"
> +#include "ti_sci_static_data.h"
>  
>  /* List of all TI SCI devices active in system */
>  static LIST_HEAD(ti_sci_list);
> @@ -1667,6 +1668,33 @@ fail:
>  	return ret;
>  }
>  
> +static int __maybe_unused
> +ti_sci_get_resource_range_static(u32 dev_id, u8 subtype, u16 *range_start,
> +				 u16 *range_num)
> +{
> +	struct ti_sci_resource_static_data *data;
> +	int i = 0;
> +
> +	while (1) {
> +		data = &rm_static_data[i];
> +
> +		if (!data->dev_id)
> +			return -EINVAL;
> +
> +		if (data->dev_id != dev_id || data->subtype != subtype) {
> +			i++;
> +			continue;
> +		}
> +
> +		*range_start = data->range_start;
> +		*range_num = data->range_num;
> +
> +		return 0;
> +	}
> +
> +	return -EINVAL;
> +}
> +
>  /**
>   * ti_sci_cmd_get_resource_range - Get a range of resources assigned to host
>   *				   that is same as ti sci interface host.
> @@ -1683,6 +1711,11 @@ static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
>  					 u32 dev_id, u8 subtype,
>  					 u16 *range_start, u16 *range_num)
>  {
> +	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
> +		return ti_sci_get_resource_range_static(dev_id, subtype,
> +							range_start,
> +							range_num);
> +
>  	return ti_sci_get_resource_range(handle, dev_id, subtype,
>  					 TI_SCI_IRQ_SECONDARY_HOST_INVALID,
>  					 range_start, range_num);
> @@ -1706,6 +1739,9 @@ int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
>  					     u32 dev_id, u8 subtype, u8 s_host,
>  					     u16 *range_start, u16 *range_num)
>  {
> +	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
> +		return -EINVAL;
> +
>  	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
>  					 range_start, range_num);
>  }
> diff --git a/drivers/firmware/ti_sci_static_data.h b/drivers/firmware/ti_sci_static_data.h
> new file mode 100644
> index 0000000000..2816cb2827
> --- /dev/null
> +++ b/drivers/firmware/ti_sci_static_data.h
> @@ -0,0 +1,92 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Copyright (C)  2021 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + */
> +
> +#ifndef __TI_SCI_STATIC_DATA_H
> +#define __TI_SCI_STATIC_DATA_H
> +
> +struct ti_sci_resource_static_data {
> +	u32 dev_id;
> +	u16 range_start;
> +	u16 range_num;
> +	u8 subtype;
> +};
> +
> +#if IS_ENABLED(CONFIG_K3_DM_FW)
> +
> +#ifdef CONFIG_TARGET_J721E_R5_EVM

want to be consistent across #if IS_ENABLED() or #ifdef?

> +static struct ti_sci_resource_static_data rm_static_data[] = {
> +	/* Free rings */
> +	{
> +		.dev_id = 235,
> +		.subtype = 1,
> +		.range_start = 124,
> +		.range_num = 32,
> +	},
> +	/* TX channels */
> +	{
> +		.dev_id = 236,
> +		.subtype = 13,
> +		.range_start = 6,
> +		.range_num = 2,
> +	},
> +	/* RX channels */
> +	{
> +		.dev_id = 236,
> +		.subtype = 10,
> +		.range_start = 6,
> +		.range_num = 2,
> +	},
> +	/* RX Free flows */
> +	{
> +		.dev_id = 236,
> +		.subtype = 0,
> +		.range_start = 60,
> +		.range_num = 8,
> +	},

For my understanding, does this need to be in sync with RM board config or this
can be independent?

Thanks and regards,
Lokesh
Raghavendra, Vignesh May 11, 2021, 5:54 a.m. UTC | #2
On 5/11/21 10:12 AM, Lokesh Vutla wrote:
> 
> 
> On 10/05/21 10:54 pm, Vignesh Raghavendra wrote:
>> In case of R5 SPL, GET_RANGE API service is not available (as DM
>> services are not yet up), therefore service such calls locally using
>> per SoC static data.
>>
>> Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
>> ---
>>  drivers/firmware/ti_sci.c             | 36 +++++++++++
>>  drivers/firmware/ti_sci_static_data.h | 92 +++++++++++++++++++++++++++
>>  2 files changed, 128 insertions(+)
>>  create mode 100644 drivers/firmware/ti_sci_static_data.h
>>
>> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
>> index 2aec2e34d3..c27fbc682a 100644
>> --- a/drivers/firmware/ti_sci.c
>> +++ b/drivers/firmware/ti_sci.c
>> @@ -23,6 +23,7 @@
>>  #include <linux/soc/ti/ti_sci_protocol.h>
>>  
>>  #include "ti_sci.h"
>> +#include "ti_sci_static_data.h"
>>  
>>  /* List of all TI SCI devices active in system */
>>  static LIST_HEAD(ti_sci_list);
>> @@ -1667,6 +1668,33 @@ fail:
>>  	return ret;
>>  }
>>  
>> +static int __maybe_unused
>> +ti_sci_get_resource_range_static(u32 dev_id, u8 subtype, u16 *range_start,
>> +				 u16 *range_num)
>> +{
>> +	struct ti_sci_resource_static_data *data;
>> +	int i = 0;
>> +
>> +	while (1) {
>> +		data = &rm_static_data[i];
>> +
>> +		if (!data->dev_id)
>> +			return -EINVAL;
>> +
>> +		if (data->dev_id != dev_id || data->subtype != subtype) {
>> +			i++;
>> +			continue;
>> +		}
>> +
>> +		*range_start = data->range_start;
>> +		*range_num = data->range_num;
>> +
>> +		return 0;
>> +	}
>> +
>> +	return -EINVAL;
>> +}
>> +
>>  /**
>>   * ti_sci_cmd_get_resource_range - Get a range of resources assigned to host
>>   *				   that is same as ti sci interface host.
>> @@ -1683,6 +1711,11 @@ static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
>>  					 u32 dev_id, u8 subtype,
>>  					 u16 *range_start, u16 *range_num)
>>  {
>> +	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
>> +		return ti_sci_get_resource_range_static(dev_id, subtype,
>> +							range_start,
>> +							range_num);
>> +
>>  	return ti_sci_get_resource_range(handle, dev_id, subtype,
>>  					 TI_SCI_IRQ_SECONDARY_HOST_INVALID,
>>  					 range_start, range_num);
>> @@ -1706,6 +1739,9 @@ int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
>>  					     u32 dev_id, u8 subtype, u8 s_host,
>>  					     u16 *range_start, u16 *range_num)
>>  {
>> +	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
>> +		return -EINVAL;
>> +
>>  	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
>>  					 range_start, range_num);
>>  }
>> diff --git a/drivers/firmware/ti_sci_static_data.h b/drivers/firmware/ti_sci_static_data.h
>> new file mode 100644
>> index 0000000000..2816cb2827
>> --- /dev/null
>> +++ b/drivers/firmware/ti_sci_static_data.h
>> @@ -0,0 +1,92 @@
>> +/* SPDX-License-Identifier: BSD-3-Clause */
>> +/*
>> + * Copyright (C)  2021 Texas Instruments Incorporated - http://www.ti.com/
>> + *
>> + */
>> +
>> +#ifndef __TI_SCI_STATIC_DATA_H
>> +#define __TI_SCI_STATIC_DATA_H
>> +
>> +struct ti_sci_resource_static_data {
>> +	u32 dev_id;
>> +	u16 range_start;
>> +	u16 range_num;
>> +	u8 subtype;
>> +};
>> +
>> +#if IS_ENABLED(CONFIG_K3_DM_FW)
>> +
>> +#ifdef CONFIG_TARGET_J721E_R5_EVM
> 
> want to be consistent across #if IS_ENABLED() or #ifdef?

Right, will fix

> 
>> +static struct ti_sci_resource_static_data rm_static_data[] = {
>> +	/* Free rings */
>> +	{
>> +		.dev_id = 235,
>> +		.subtype = 1,
>> +		.range_start = 124,
>> +		.range_num = 32,
>> +	},
>> +	/* TX channels */
>> +	{
>> +		.dev_id = 236,
>> +		.subtype = 13,
>> +		.range_start = 6,
>> +		.range_num = 2,
>> +	},
>> +	/* RX channels */
>> +	{
>> +		.dev_id = 236,
>> +		.subtype = 10,
>> +		.range_start = 6,
>> +		.range_num = 2,
>> +	},
>> +	/* RX Free flows */
>> +	{
>> +		.dev_id = 236,
>> +		.subtype = 0,
>> +		.range_start = 60,
>> +		.range_num = 8,
>> +	},
> 
> For my understanding, does this need to be in sync with RM board config or this
> can be independent?

No, this needs to be in sync with RM board cfg data.

Regards
Vignesh
diff mbox series

Patch

diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
index 2aec2e34d3..c27fbc682a 100644
--- a/drivers/firmware/ti_sci.c
+++ b/drivers/firmware/ti_sci.c
@@ -23,6 +23,7 @@ 
 #include <linux/soc/ti/ti_sci_protocol.h>
 
 #include "ti_sci.h"
+#include "ti_sci_static_data.h"
 
 /* List of all TI SCI devices active in system */
 static LIST_HEAD(ti_sci_list);
@@ -1667,6 +1668,33 @@  fail:
 	return ret;
 }
 
+static int __maybe_unused
+ti_sci_get_resource_range_static(u32 dev_id, u8 subtype, u16 *range_start,
+				 u16 *range_num)
+{
+	struct ti_sci_resource_static_data *data;
+	int i = 0;
+
+	while (1) {
+		data = &rm_static_data[i];
+
+		if (!data->dev_id)
+			return -EINVAL;
+
+		if (data->dev_id != dev_id || data->subtype != subtype) {
+			i++;
+			continue;
+		}
+
+		*range_start = data->range_start;
+		*range_num = data->range_num;
+
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
 /**
  * ti_sci_cmd_get_resource_range - Get a range of resources assigned to host
  *				   that is same as ti sci interface host.
@@ -1683,6 +1711,11 @@  static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
 					 u32 dev_id, u8 subtype,
 					 u16 *range_start, u16 *range_num)
 {
+	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
+		return ti_sci_get_resource_range_static(dev_id, subtype,
+							range_start,
+							range_num);
+
 	return ti_sci_get_resource_range(handle, dev_id, subtype,
 					 TI_SCI_IRQ_SECONDARY_HOST_INVALID,
 					 range_start, range_num);
@@ -1706,6 +1739,9 @@  int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
 					     u32 dev_id, u8 subtype, u8 s_host,
 					     u16 *range_start, u16 *range_num)
 {
+	if (CONFIG_IS_ENABLED(TI_K3_RAW_RM))
+		return -EINVAL;
+
 	return ti_sci_get_resource_range(handle, dev_id, subtype, s_host,
 					 range_start, range_num);
 }
diff --git a/drivers/firmware/ti_sci_static_data.h b/drivers/firmware/ti_sci_static_data.h
new file mode 100644
index 0000000000..2816cb2827
--- /dev/null
+++ b/drivers/firmware/ti_sci_static_data.h
@@ -0,0 +1,92 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (C)  2021 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ */
+
+#ifndef __TI_SCI_STATIC_DATA_H
+#define __TI_SCI_STATIC_DATA_H
+
+struct ti_sci_resource_static_data {
+	u32 dev_id;
+	u16 range_start;
+	u16 range_num;
+	u8 subtype;
+};
+
+#if IS_ENABLED(CONFIG_K3_DM_FW)
+
+#ifdef CONFIG_TARGET_J721E_R5_EVM
+static struct ti_sci_resource_static_data rm_static_data[] = {
+	/* Free rings */
+	{
+		.dev_id = 235,
+		.subtype = 1,
+		.range_start = 124,
+		.range_num = 32,
+	},
+	/* TX channels */
+	{
+		.dev_id = 236,
+		.subtype = 13,
+		.range_start = 6,
+		.range_num = 2,
+	},
+	/* RX channels */
+	{
+		.dev_id = 236,
+		.subtype = 10,
+		.range_start = 6,
+		.range_num = 2,
+	},
+	/* RX Free flows */
+	{
+		.dev_id = 236,
+		.subtype = 0,
+		.range_start = 60,
+		.range_num = 8,
+	},
+	{ },
+};
+#endif /* CONFIG_TARGET_J721E_R5_EVM */
+
+#ifdef CONFIG_TARGET_J7200_R5_EVM
+static struct ti_sci_resource_static_data rm_static_data[] = {
+	/* Free rings */
+	{
+		.dev_id = 235,
+		.subtype = 1,
+		.range_start = 144,
+		.range_num = 32,
+	},
+	/* TX channels */
+	{
+		.dev_id = 236,
+		.subtype = 13,
+		.range_start = 7,
+		.range_num = 2,
+	},
+	/* RX channels */
+	{
+		.dev_id = 236,
+		.subtype = 10,
+		.range_start = 7,
+		.range_num = 2,
+	},
+	/* RX Free flows */
+	{
+		.dev_id = 236,
+		.subtype = 0,
+		.range_start = 60,
+		.range_num = 8,
+	},
+	{ },
+};
+#endif /* CONFIG_TARGET_J7200_R5_EVM */
+
+#else
+static struct ti_sci_resource_static_data rm_static_data[] = {
+	{ },
+};
+#endif /* CONFIG_K3_DM_FW */
+#endif /* __TI_SCI_STATIC_DATA_H */