@@ -13,6 +13,16 @@ DOC_DIR = ./doc
LINUX_GENERIC_DIR = ../linux-generic
+MY_PLATFORM = DEVICE_K2K
+
+PLAT_CFLAGS = -D$(MY_PLATFORM)
+PLAT_CFLAGS += -D_GNU_SOURCE -DEM_32_BIT -DTI_EM_CENTRAL_SCHED
+PLAT_CFLAGS += -DTI_EM_TRACE_LEVEL=3 -DEM_CHECK_LEVEL=1
+PLAT_CFLAGS += -DTI_EM_LINUX -DTI_EM_GCC -DTI_EM_ARM_A15 -DTI_EM_C6638
+PLAT_CFLAGS += -D_LITTLE_ENDIAN -DTI_EM_USE_MSM -DTI_EM_XGE_LOOPBACK
+PLAT_CFLAGS += -DTI_ODP
+
+EXTRA_CFLAGS += $(PLAT_CFLAGS)
EXTRA_CFLAGS += -I$(ODP_ROOT)/include
EXTRA_CFLAGS += -I./include
EXTRA_CFLAGS += -I./include/api
@@ -70,8 +80,13 @@ $(OBJ_DIR)/%.o: %.c
#
# Lib rule
#
-$(STATIC_LIB): $(OBJS)
- $(AR) -cr $@ $(OBJS)
+$(OBJ_DIR)/libodp.o: $(OBJS)
+ $(ECHO) " LD $@"
+ $(LD) -r -o $@ $(OBJS) $(LDFLAGS) -lopenem_rh -lopenem_osal
+
+$(STATIC_LIB): $(OBJ_DIR)/libodp.o
+ $(ECHO) " AR $@"
+ $(AR) -cr $@ $(OBJ_DIR)/libodp.o
clean:
$(RMDIR) $(OBJ_DIR)
new file mode 100644
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Texas Instruments Incorporated nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef ODP_CONFIG_PLATFORM_H_
+#define ODP_CONFIG_PLATFORM_H_
+
+/* #include <openem/event_machine.h> */
+#if defined(TI_EM_C6678)
+#include <configs/odp_config_platform_c6678.h>
+#elif defined(TI_EM_C6614)
+#include <configs/odp_config_platform_c6614.h>
+#elif defined(TI_EM_C6638)
+#include <configs/odp_config_platform_c6638.h>
+#else
+#error "platform not defined or unsupported!"
+#endif
+
+#define TI_ODP_PUBLIC_DESC_SIZE (64u)
+#define TI_ODP_PUBLIC_DESC_NUM (4096u)
+#define TI_ODP_REGION_NUM (2) /* local regions are not used on Linux */
+
+#define MY_EM_DEVICE_ID (0)
+#define MY_EM_PROCESS_ID (0)
+
+/*
+ * Queue, pool and event definitions
+ */
+#define MY_EM_PROC_QUEUE_NUM (32)
+#define MY_EM_PROC_QUEUE_TYPE (EM_QUEUE_TYPE_PARALLEL)
+#define MY_EM_PROC_EVENT_TYPE (TI_EM_EVENT_TYPE_PRELOAD_OFF)
+
+#endif /* ODP_CONFIG_PLATFORM_H_ */
new file mode 100644
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Texas Instruments Incorporated nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/*
+ * This is the typical configuration for TCI6638 (KeyStone 2, Linux ARM A15)
+ *
+ * Descriptors and PDSP communications memory must reside in contiguous and coherent DDR
+ * (using CMA).
+ *
+ * On KeyStone2 QMSS regions do not need to be ordered.
+ */
+#ifndef ODP_CONFIG_PLATFORM_C6638_H_
+#define ODP_CONFIG_PLATFORM_C6638_H_
+
+/* Cores are here "EM cores" that are not necessarily tied to real "CPU cores" */
+#define MY_EM_CORE_NUM (4) /* number of cores used by OpenEM */
+#define MY_EM_INIT_CORE_IDX (0) /* core on which the init will be started */
+
+/* Index of the QMSS PDSP that will be used by OpenEM, Linux use QMSS PDSP0 for accumulator */
+#define MY_EM_SCHED_PDSP_IDX (2)
+
+/* Define if we are polling or waiting on event interrupts when dispatching events */
+#define MY_EM_DISPATCH_MODE (TI_EM_RH_POLL_MODE)
+
+/*
+ * Coherent contiguous memory used for PDSP <-> CPU communication
+ * We use one page per slot and CORE_NUM + 2 slots
+ */
+#ifdef TI_EM_USE_MSM
+#define MY_EM_PDSP_COMM_MEM_BASE (0x0c000000) /* MSM */
+#else
+#define MY_EM_PDSP_COMM_MEM_BASE (0x0) /* use DDR from CMA (contiguous & coherent)*/
+#endif
+#define MY_EM_PDSP_COMM_MEM_VBASE (0x0) /* dynamic mapping */
+#define MY_EM_PDSP_COMM_MEM_SIZE (0x00010000) /* allowing 16 slots */
+#define MY_EM_PDSP_COMM_MEM_OFFSET (0x0) /* no offset */
+
+/*
+ * Base physical address for event descriptors.
+ * In the future in will be managed by Linux or platform resource manager.
+ */
+#ifdef TI_EM_USE_MSM
+#define TI_ODP_PUBLIC_DESC_BASE (0x0c100000) /* MSM */
+#define TI_ODP_PUBLIC_DESC_VBASE (0x0) /* dynamic mapping */
+#define TI_ODP_PUBLIC_DESC_OFFSET (0x0) /* no offset, QMSS/PDSP mapping equal to CPU mapping */
+#else /* TI_EM_USE_MSM */
+#define TI_ODP_PUBLIC_DESC_BASE (0x0) /* use DDR from CMA (contiguous & coherent)*/
+#define TI_ODP_PUBLIC_DESC_VBASE (0x0) /* dynamic mapping */
+#define TI_ODP_PUBLIC_DESC_OFFSET (0x0) /* no offset, QMSS/PDSP mapping equal to CPU mapping */
+#endif /* TI_EM_USE_MSM */
+
+#define TI_ODP_PUBLIC_REGION_IDX (1) /* Linux uses 12 & 13 on ARM, set in DTS */
+#define TI_ODP_PRIVATE_REGION_IDX (2)
+#define TI_ODP_PUBLIC_START_DESC_IDX (0) /* start index for desc (Linux starts at 0x4000, set in DTS) */
+#define TI_ODP_PRIVATE_START_DESC_IDX (-1) /* Automatically computed */
+
+#define TI_ODP_PRIVATE_DESC_BASE (TI_EM_PDSPSH_DRAM) /* use PDSP data RAM */
+#define TI_ODP_PRIVATE_DESC_OFFSET (TI_EM_PDSP_DRAM_OFFSET) /* offset between CPU and QMSS/PDSP mapping */
+#define TI_ODP_PRIVATE_DESC_VBASE (0x0) /* dynamic mapping */
+
+/*
+ * For the time being, free queues that can be used from user application are
+ * harcoded here. In the future it will be provided by platform resource manager.
+ */
+#define TI_ODP_PUBLIC_QUEUE_BASE_IDX (QMSS_GENERAL_PURPOSE_USER_QUEUE_BASE)
+#define TI_ODP_FREE_QUEUE_BASE_IDX (TI_ODP_PUBLIC_QUEUE_BASE_IDX + ODP_CONFIG_QUEUES)
+#define MY_EM_PRIVATE_FREE_QUEUE_IDX (TI_ODP_FREE_QUEUE_BASE_IDX + ODP_CONFIG_BUFFER_POOLS)
+#define MY_EM_SCHED_QUEUE_IDX (MY_EM_PRIVATE_FREE_QUEUE_IDX + 2)
+
+#endif /* ODP_CONFIG_PLATFORM_C6638_H_ */
new file mode 100644
@@ -0,0 +1,151 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp_init.h>
+#include <odp_internal.h>
+#include <odp_debug.h>
+#include <configs/odp_config_platform.h>
+#include <ti_em_osal_core.h>
+#include <ti_em_osal_queue.h>
+#include <ti_em_rh.h>
+#include <odp_config.h>
+
+/*
+ * Make region_configs[] global, because hw_config is saved in
+ * ti_em_rh_init_global() and it references region_configs[].
+ */
+static ti_em_osal_hw_region_config_t region_configs[TI_ODP_REGION_NUM];
+
+static int ti_init_hw_config(void)
+{
+ ti_em_rh_hw_config_t hw_config;
+ ti_em_osal_hw_region_config_t *reg_config;
+ memset(&hw_config, 0, sizeof(ti_em_rh_hw_config_t));
+
+ /* Set ODP initialization parameters */
+ hw_config.private_free_queue_idx = MY_EM_PRIVATE_FREE_QUEUE_IDX;
+ hw_config.hw_queue_base_idx = MY_EM_SCHED_QUEUE_IDX;
+ hw_config.dma_idx = -1; /* not used */
+ hw_config.dma_queue_base_idx = 0; /* not used */
+ hw_config.device_id = MY_EM_DEVICE_ID;
+ hw_config.process_id = MY_EM_PROCESS_ID;
+ hw_config.chain_config_ptr = NULL;
+ hw_config.dispatch_mode = MY_EM_DISPATCH_MODE;
+
+ /* The location of the PDSP communication memory (physical address) */
+ hw_config.pdsp_comm_mem_config.paddr = MY_EM_PDSP_COMM_MEM_BASE;
+ hw_config.pdsp_comm_mem_config.vaddr = MY_EM_PDSP_COMM_MEM_VBASE;
+ hw_config.pdsp_comm_mem_config.size = MY_EM_PDSP_COMM_MEM_SIZE;
+ hw_config.pdsp_comm_mem_config.offset = MY_EM_PDSP_COMM_MEM_OFFSET;
+
+ TI_EM_OSAL_TRACE(2, "physical address of the PDSP communication memory is 0x%x\n",
+ hw_config.pdsp_comm_mem_config.paddr);
+
+ /* Define descriptor regions */
+ reg_config = ®ion_configs[TI_EM_RH_PUBLIC];
+ reg_config->region_idx = TI_ODP_PUBLIC_REGION_IDX;
+ reg_config->desc_size = TI_ODP_PUBLIC_DESC_SIZE;
+ reg_config->desc_num = TI_ODP_PUBLIC_DESC_NUM;
+ reg_config->desc_base = TI_ODP_PUBLIC_DESC_BASE;
+ reg_config->desc_vbase = TI_ODP_PUBLIC_DESC_VBASE;
+ reg_config->desc_offset = TI_ODP_PUBLIC_DESC_OFFSET;
+ reg_config->desc_flag = TI_EM_RH_UNMANAGED_DESCRIPTOR;
+ reg_config->start_idx = TI_ODP_PUBLIC_START_DESC_IDX;
+
+ reg_config = ®ion_configs[TI_EM_RH_PRIVATE];
+ reg_config->region_idx = TI_ODP_PRIVATE_REGION_IDX;
+ reg_config->desc_size = TI_EM_PRIVATE_EVENT_DSC_SIZE;
+ reg_config->desc_num = TI_EM_RH_PRIVATE_EVENT_NUM;
+ reg_config->desc_base = TI_ODP_PRIVATE_DESC_BASE;
+ reg_config->desc_vbase = TI_ODP_PRIVATE_DESC_VBASE;
+ reg_config->desc_offset = TI_ODP_PRIVATE_DESC_OFFSET;
+ reg_config->desc_flag = TI_EM_RH_UNMANAGED_DESCRIPTOR;
+ reg_config->start_idx = TI_ODP_PRIVATE_START_DESC_IDX;
+
+ hw_config.region_num = TI_ODP_REGION_NUM;
+ hw_config.region_configs = ®ion_configs[0];
+
+ /* Define PDSP configuration */
+ hw_config.pdsp_num = 0;
+ /* do not use router (no chaining) */
+ hw_config.pdsp_router.pdsp_id = -1;
+
+ TI_EM_OSAL_TRACE(1, "calling EM global initialization\n");
+
+ /* call OpenEM global initialization */
+ if (ti_em_rh_init_global(0,
+ NULL,
+ MY_EM_CORE_NUM,
+ &hw_config) != EM_OK) {
+ TI_EM_OSAL_ERROR("EM global initialization failed!\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int odp_init_global(void)
+{
+ odp_thread_init_global();
+
+ odp_system_info_init();
+
+ ti_em_osal_core_init_global();
+ ti_init_hw_config();
+
+ if (odp_shm_init_global()) {
+ ODP_ERR("ODP shm init failed.\n");
+ return -1;
+ }
+
+ if (odp_buffer_pool_init_global()) {
+ ODP_ERR("ODP buffer pool init failed.\n");
+ return -1;
+ }
+
+ if (odp_queue_init_global()) {
+ ODP_ERR("ODP queue init failed.\n");
+ return -1;
+ }
+
+ if (odp_schedule_init_global()) {
+ ODP_ERR("ODP schedule init failed.\n");
+ return -1;
+ }
+
+ if (odp_pktio_init_global()) {
+ ODP_ERR("ODP packet io init failed.\n");
+ return -1;
+ }
+
+ if (odp_timer_init_global()) {
+ ODP_ERR("ODP timer init failed.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int odp_init_local(int thr_id)
+{
+ odp_thread_init_local(thr_id);
+
+ ti_em_rh_init_local();
+
+ if (odp_pktio_init_local()) {
+ ODP_ERR("ODP packet io local init failed.\n");
+ return -1;
+ }
+
+ if (odp_schedule_init_local()) {
+ ODP_ERR("ODP schedule local init failed.\n");
+ return -1;
+ }
+
+ return 0;
+}
Initialize hardware and helper libraries environment on ODP init. Assume OpenEM helper libraries and their headers can be found in standard locations. Signed-off-by: Taras Kondratiuk <taras.kondratiuk@linaro.org> --- platform/linux-keystone2/Makefile | 19 ++- .../include/configs/odp_config_platform.h | 57 ++++++++ .../include/configs/odp_config_platform_c6638.h | 95 ++++++++++++ platform/linux-keystone2/source/odp_init.c | 151 ++++++++++++++++++++ 4 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 platform/linux-keystone2/include/configs/odp_config_platform.h create mode 100644 platform/linux-keystone2/include/configs/odp_config_platform_c6638.h create mode 100644 platform/linux-keystone2/source/odp_init.c