firmware: ti_sci: Implement GET_RANGE with static data
authorVignesh Raghavendra <vigneshr@ti.com>
Mon, 7 Jun 2021 14:17:48 +0000 (19:47 +0530)
committerLokesh Vutla <lokeshvutla@ti.com>
Fri, 11 Jun 2021 13:48:52 +0000 (19:18 +0530)
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>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Link: https://lore.kernel.org/r/20210607141753.28796-3-vigneshr@ti.com
drivers/firmware/ti_sci.c
drivers/firmware/ti_sci_static_data.h [new file with mode: 0644]

index 4671a5e..0318da2 100644 (file)
@@ -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);
@@ -1668,6 +1669,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.
@@ -1684,6 +1712,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);
@@ -1707,6 +1740,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 (file)
index 0000000..3c506e6
--- /dev/null
@@ -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)
+
+#if IS_ENABLED(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 */
+
+#if IS_ENABLED(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 */