Init imx6ul platform codes
Add basic platform codes to init memory space
and UART.
Change-Id: Ie1e08912a6dd4eae78643acf417ef722d133c597
Signed-off-by: Wang Haoran <[email protected]>
diff --git a/platform/imx/debug.c b/platform/imx/debug.c
new file mode 100644
index 0000000..33927e7
--- /dev/null
+++ b/platform/imx/debug.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015 Google Inc. All rights reserved
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <kernel/thread.h>
+#include <platform/debug.h>
+#include <dev/uart.h>
+
+
+void platform_dputc(char c)
+{
+ uart_putc(0, c);
+}
+
+int platform_dgetc(char *c, bool wait)
+{
+ return uart_getc(0, wait);
+}
diff --git a/platform/imx/drivers/imx_uart.c b/platform/imx/drivers/imx_uart.c
new file mode 100644
index 0000000..d3e72fb
--- /dev/null
+++ b/platform/imx/drivers/imx_uart.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 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 HOLDER 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.
+ */
+
+#include <debug.h>
+#include <reg.h>
+#include <dev/uart.h>
+
+#define READ32(addr) (*REG32(addr))
+#define WRITE32(val, addr) (READ32(addr) = val)
+
+/* Register definitions */
+#define URXD 0x0 /* Receiver Register */
+#define UTXD 0x40 /* Transmitter Register */
+#define UCR1 0x80 /* Control Register 1 */
+#define UCR2 0x84 /* Control Register 2 */
+#define UCR3 0x88 /* Control Register 3 */
+#define UCR4 0x8c /* Control Register 4 */
+#define UFCR 0x90 /* FIFO Control Register */
+#define USR1 0x94 /* Status Register 1 */
+#define USR2 0x98 /* Status Register 2 */
+#define UESC 0x9c /* Escape Character Register */
+#define UTIM 0xa0 /* Escape Timer Register */
+#define UBIR 0xa4 /* BRM Incremental Register */
+#define UBMR 0xa8 /* BRM Modulator Register */
+#define UBRC 0xac /* Baud Rate Count Register */
+#define UTS 0xb4 /* UART Test Register (mx31) */
+
+/* UART Control Register Bit Fields.*/
+#define URXD_CHARRDY (1<<15)
+#define URXD_ERR (1<<14)
+#define URXD_OVRRUN (1<<13)
+#define URXD_FRMERR (1<<12)
+#define URXD_BRK (1<<11)
+#define URXD_PRERR (1<<10)
+#define URXD_RX_DATA (0xFF)
+#define UCR1_ADEN (1<<15) /* Auto dectect interrupt */
+#define UCR1_ADBR (1<<14) /* Auto detect baud rate */
+#define UCR1_TRDYEN (1<<13) /* Transmitter ready interrupt enable */
+#define UCR1_IDEN (1<<12) /* Idle condition interrupt */
+#define UCR1_RRDYEN (1<<9) /* Recv ready interrupt enable */
+#define UCR1_RDMAEN (1<<8) /* Recv ready DMA enable */
+#define UCR1_IREN (1<<7) /* Infrared interface enable */
+#define UCR1_TXMPTYEN (1<<6) /* Transimitter empty interrupt enable */
+#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */
+#define UCR1_SNDBRK (1<<4) /* Send break */
+#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */
+#define UCR1_UARTCLKEN (1<<2) /* UART clock enabled */
+#define UCR1_DOZE (1<<1) /* Doze */
+#define UCR1_UARTEN (1<<0) /* UART enabled */
+
+#define UTS_FRCPERR (1<<13) /* Force parity error */
+#define UTS_LOOP (1<<12) /* Loop tx and rx */
+#define UTS_TXEMPTY (1<<6) /* TxFIFO empty */
+#define UTS_RXEMPTY (1<<5) /* RxFIFO empty */
+#define UTS_TXFULL (1<<4) /* TxFIFO full */
+#define UTS_RXFULL (1<<3) /* RxFIFO full */
+#define UTS_SOFTRST (1<<0) /* Software reset */
+#define UART_BASE CONFIG_CONSOLE_TTY_BASE
+
+void uart_init(void)
+{
+ /*
+ * Do nothing, debug uart share with normal world,
+ * everything for uart intialization were done in bootloader.
+ */
+}
+
+void uart_flush_tx(int port)
+{
+ while (!(READ32(UART_BASE + UTS) & UTS_TXEMPTY))
+ ;
+}
+
+int uart_getc(int port, bool wait)
+{
+ if (wait)
+ while (READ32(UART_BASE + UTS) & UTS_RXEMPTY);
+ else if (!(READ32(UART_BASE + UTS) & UTS_RXEMPTY))
+ return -1;
+
+ return (READ32(UART_BASE + URXD) & URXD_RX_DATA);
+}
+
+int uart_putc(int port, char c )
+{
+ if (c == '\n')
+ uart_putc(0, '\r');
+
+ WRITE32(c, UART_BASE + UTXD);
+
+ /* wait until sent */
+ while (!(READ32(UART_BASE + UTS) & UTS_TXEMPTY))
+ ;
+}
diff --git a/platform/imx/include/platform/gic.h b/platform/imx/include/platform/gic.h
new file mode 100644
index 0000000..60e68df
--- /dev/null
+++ b/platform/imx/include/platform/gic.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015 Google Inc. All rights reserved
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef __PLATFORM_GIC_H
+#define __PLATFORM_GIC_H
+#include <imx-regs.h>
+
+#define MAX_INT 160
+#define GICBASE(b) (GIC_BASE_VIRT)
+
+#define GICC_SIZE (0x1000)
+#define GICD_SIZE (0x100)
+
+#define GICC_OFFSET (0x1000)
+#define GICD_OFFSET (0x0000)
+
+#define GICC_BASE_VIRT (GIC_BASE_VIRT + GICC_OFFSET)
+#define GICD_BASE_VIRT (GIC_BASE_VIRT + GICD_OFFSET)
+
+#define GIC_REG_SIZE 0x2000
+
+#endif
diff --git a/platform/imx/platform.c b/platform/imx/platform.c
new file mode 100644
index 0000000..50615f7
--- /dev/null
+++ b/platform/imx/platform.c
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2015 Google Inc. All rights reserved
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <imx-regs.h>
+#include <debug.h>
+#include <dev/interrupt/arm_gic.h>
+#include <dev/timer/arm_generic.h>
+#include <kernel/vm.h>
+#include <lk/init.h>
+#include <platform/gic.h>
+#include <string.h>
+
+
+#define ARM_GENERIC_TIMER_INT_CNTV 27
+#define ARM_GENERIC_TIMER_INT_CNTPS 29
+#define ARM_GENERIC_TIMER_INT_CNTP 30
+
+#define ARM_GENERIC_TIMER_INT_SELECTED(timer) ARM_GENERIC_TIMER_INT_ ## timer
+#define XARM_GENERIC_TIMER_INT_SELECTED(timer) ARM_GENERIC_TIMER_INT_SELECTED(timer)
+#define ARM_GENERIC_TIMER_INT XARM_GENERIC_TIMER_INT_SELECTED(TIMER_ARM_GENERIC_SELECTED)
+
+/* initial memory mappings. parsed by start.S */
+struct mmu_initial_mapping mmu_initial_mappings[] = {
+ /* Mark next entry as dynamic as it might be updated
+ by platform_reset code to specify actual size and
+ location of RAM to use */
+ {
+ .phys = MEMBASE + KERNEL_LOAD_OFFSET,
+ .virt = KERNEL_BASE + KERNEL_LOAD_OFFSET,
+ .size = MEMSIZE,
+ .flags = MMU_INITIAL_MAPPING_FLAG_DYNAMIC,
+ .name = "ram" },
+ {
+ .phys = CONFIG_CONSOLE_TTY_BASE,
+ .virt = CONFIG_CONSOLE_TTY_BASE,
+ .size = 0x4000,
+ .flags = MMU_INITIAL_MAPPING_FLAG_DEVICE,
+ .name = "uart"
+ },
+ /* null entry to terminate the list */
+ { 0 }
+};
+
+static pmm_arena_t ram_arena = {
+ .name = "ram",
+ .base = MEMBASE + KERNEL_LOAD_OFFSET,
+ .size = MEMSIZE,
+ .flags = PMM_ARENA_FLAG_KMAP
+};
+
+
+void platform_init_mmu_mappings(void)
+{
+ /* go through mmu_initial_mapping to find dynamic entry
+ * matching ram_arena (by name) and adjust it.
+ */
+ struct mmu_initial_mapping *m = mmu_initial_mappings;
+ for (uint i = 0; i < countof(mmu_initial_mappings); i++, m++) {
+ if (!(m->flags & MMU_INITIAL_MAPPING_FLAG_DYNAMIC))
+ continue;
+
+ if (strcmp(m->name, ram_arena.name) == 0) {
+ /* update ram_arena */
+ ram_arena.base = m->phys;
+ ram_arena.size = m->size;
+ ram_arena.flags = PMM_ARENA_FLAG_KMAP;
+
+ break;
+ }
+ }
+ pmm_add_arena(&ram_arena);
+}
+
+static void generic_arm64_map_regs(const char *name, vaddr_t vaddr,
+ paddr_t paddr, size_t size)
+{
+ status_t ret;
+ void *vaddrp = (void *)vaddr;
+
+ ret = vmm_alloc_physical(vmm_get_kernel_aspace(), name,
+ size, &vaddrp, 0, paddr,
+ VMM_FLAG_VALLOC_SPECIFIC,
+ ARCH_MMU_FLAG_UNCACHED_DEVICE);
+ if (ret) {
+ dprintf(CRITICAL, "%s: failed %d name=%s\n", __func__, ret, name);
+ }
+}
+
+static void platform_after_vm_init(uint level)
+{
+ generic_arm64_map_regs("gic", GIC_BASE_VIRT, GIC_BASE_PHY, GIC_REG_SIZE);
+
+
+ /* Initialize the interrupt controller. */
+ arm_gic_init();
+
+ /* Initialize the timer block. */
+ arm_generic_timer_init(ARM_GENERIC_TIMER_INT, 0);
+
+ /* Map for all SoC IPs. */
+ generic_arm64_map_regs("soc", SOC_REGS_VIRT, SOC_REGS_PHY, SOC_REGS_SIZE);
+
+}
+
+LK_INIT_HOOK(platform_after_vm, platform_after_vm_init, LK_INIT_LEVEL_VM + 1);
diff --git a/platform/imx/rules.mk b/platform/imx/rules.mk
new file mode 100644
index 0000000..25b7b34
--- /dev/null
+++ b/platform/imx/rules.mk
@@ -0,0 +1,57 @@
+#
+# Copyright (c) 2015, Google, Inc. All rights reserved
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+MODULE := $(LOCAL_DIR)
+
+ARCH := arm
+ARM_CPU := cortex-a7
+WITH_LIB_SM := 1
+WITH_LIB_SM_MONITOR := 1
+WITH_LIB_VERSION := 1
+
+MEMBASE ?= $(KERNEL_BASE)
+
+GLOBAL_INCLUDES += \
+ $(LOCAL_DIR)/include \
+ $(LOCAL_DIR)/soc/$(PLATFORM_SOC)/include
+
+MODULE_SRCS += \
+ $(LOCAL_DIR)/debug.c \
+ $(LOCAL_DIR)/platform.c \
+ $(LOCAL_DIR)/drivers/imx_uart.c \
+
+MODULE_DEPS += \
+ dev/interrupt/arm_gic \
+ dev/timer/arm_generic
+
+GLOBAL_DEFINES += \
+ MEMBASE=$(MEMBASE) \
+ MEMSIZE=$(MEMSIZE) \
+ MMU_WITH_TRAMPOLINE=1
+
+LINKER_SCRIPT += \
+ $(BUILDDIR)/system-onesegment.ld
+
+include make/module.mk
diff --git a/platform/imx/soc/imx6ul/include/imx-regs.h b/platform/imx/soc/imx6ul/include/imx-regs.h
new file mode 100644
index 0000000..1278c8e
--- /dev/null
+++ b/platform/imx/soc/imx6ul/include/imx-regs.h
@@ -0,0 +1,12 @@
+
+#ifndef _IMX_REGS_H_
+#define _IMX_REGS_H_
+
+#define GIC_BASE_PHY 0xa01000
+#define GIC_BASE_VIRT 0x70a01000
+
+#define SOC_REGS_PHY 0x02000000
+#define SOC_REGS_VIRT 0x72000000
+#define SOC_REGS_SIZE 0x00100000
+
+#endif
diff --git a/target/imx/rules.mk b/target/imx/rules.mk
new file mode 100644
index 0000000..5b7f7cc
--- /dev/null
+++ b/target/imx/rules.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2015, Google, Inc. All rights reserved
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+GLOBAL_INCLUDES += \
+ $(LOCAL_DIR)/include
+
+PLATFORM := imx
+
+#include make/module.mk