diff options
-rw-r--r-- | .shippable.yml | 1 | ||||
-rw-r--r-- | MAINTAINERS | 5 | ||||
-rw-r--r-- | core/arch/arm/plat-amlogic/conf.mk | 22 | ||||
-rw-r--r-- | core/arch/arm/plat-amlogic/link.mk | 17 | ||||
-rw-r--r-- | core/arch/arm/plat-amlogic/main.c | 39 | ||||
-rw-r--r-- | core/arch/arm/plat-amlogic/platform_config.h | 20 | ||||
-rwxr-xr-x | core/arch/arm/plat-amlogic/scripts/aml_bin2img.py | 127 | ||||
-rw-r--r-- | core/arch/arm/plat-amlogic/sub.mk | 2 | ||||
-rw-r--r-- | core/drivers/amlogic_uart.c | 75 | ||||
-rw-r--r-- | core/drivers/sub.mk | 1 | ||||
-rw-r--r-- | core/include/drivers/amlogic_uart.h | 16 |
11 files changed, 325 insertions, 0 deletions
diff --git a/.shippable.yml b/.shippable.yml index 402abdd7..7b02b378 100644 --- a/.shippable.yml +++ b/.shippable.yml @@ -135,3 +135,4 @@ build: - _make PLATFORM=sunxi-sun50i_a64 - _make PLATFORM=bcm-ns3 CFG_ARM64_core=y - _make PLATFORM=hisilicon-hi3519av100_demo + - _make PLATFORM=amlogic diff --git a/MAINTAINERS b/MAINTAINERS index 74665b00..f3758a66 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -54,6 +54,11 @@ R: Amit Singh Tomar <amittomer25@gmail.com> [@Amit-Radur] S: Maintained F: core/arch/arm/plat-sunxi/ +AmLogic AXG (A113D) +R: Carlo Caione <ccaione@baylibre.com> [@carlocaione] +S: Maintained +F: core/arch/arm/plat-amlogic/ + Atmel ATSAMA5D2-XULT R: Akshay Bhat <akshay.bhat@timesys.com> [@nodeax] R: [@OP-TEE/plat-sam] diff --git a/core/arch/arm/plat-amlogic/conf.mk b/core/arch/arm/plat-amlogic/conf.mk new file mode 100644 index 00000000..1b644f82 --- /dev/null +++ b/core/arch/arm/plat-amlogic/conf.mk @@ -0,0 +1,22 @@ +PLATFORM_FLAVOR ?= axg + +include core/arch/arm/cpu/cortex-armv8-0.mk + +$(call force,CFG_TEE_CORE_NB_CORE,4) + +CFG_TZDRAM_START ?= 0x05300000 +CFG_TZDRAM_SIZE ?= 0x00c00000 +CFG_SHMEM_START ?= 0x05000000 +CFG_SHMEM_SIZE ?= 0x00100000 + +$(call force,CFG_GENERIC_BOOT,y) +$(call force,CFG_PM_STUBS,y) +$(call force,CFG_SECURE_TIME_SOURCE_CNTPCT,y) +$(call force,CFG_WITH_ARM_TRUSTED_FW,y) +$(call force,CFG_AMLOGIC_UART,y) + +$(call force,CFG_WITH_PAGER,n) +$(call force,CFG_ARM64_core,y) +$(call force,CFG_WITH_LPAE,y) + +CFG_WITH_STACK_CANARIES ?= y diff --git a/core/arch/arm/plat-amlogic/link.mk b/core/arch/arm/plat-amlogic/link.mk new file mode 100644 index 00000000..704996b6 --- /dev/null +++ b/core/arch/arm/plat-amlogic/link.mk @@ -0,0 +1,17 @@ +include core/arch/arm/kernel/link.mk + +# Create BL32 image from the native binary images + +define aml_bin2img_cmd + @$(cmd-echo-silent) ' GEN $@' + $(q)./core/arch/arm/plat-amlogic/scripts/aml_bin2img.py +endef + +ifneq (,$(filter $(PLATFORM_FLAVOR),axg)) +all: $(link-out-dir)/bl32.img +cleanfiles += $(link-out-dir)/bl32.img +$(link-out-dir)/bl32.img: $(link-out-dir)/tee-pager_v2.bin + $(aml_bin2img_cmd) --source $< --dest $@ --entry 0x5300000 \ + --res_mem_start 0x5300000 --res_mem_size 0x1000000 \ + --sec_mem_start 0x5300000 --sec_mem_size 0xc00000 +endif diff --git a/core/arch/arm/plat-amlogic/main.c b/core/arch/arm/plat-amlogic/main.c new file mode 100644 index 00000000..f2560528 --- /dev/null +++ b/core/arch/arm/plat-amlogic/main.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-2-Clause +/* + * Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com> + */ + +#include <console.h> +#include <kernel/generic_boot.h> +#include <kernel/panic.h> +#include <kernel/pm_stubs.h> +#include <mm/core_memprot.h> +#include <platform_config.h> +#include <stdint.h> +#include <tee/entry_std.h> +#include <tee/entry_fast.h> +#include <drivers/amlogic_uart.h> + +static const struct thread_handlers handlers = { + .cpu_on = cpu_on_handler, + .cpu_off = pm_do_nothing, + .cpu_suspend = pm_do_nothing, + .cpu_resume = pm_do_nothing, + .system_off = pm_do_nothing, + .system_reset = pm_do_nothing, +}; + +const struct thread_handlers *generic_boot_get_handlers(void) +{ + return &handlers; +} + +static struct amlogic_uart_data console_data; +register_phys_mem_pgdir(MEM_AREA_IO_SEC, CONSOLE_UART_BASE, + CORE_MMU_PGDIR_SIZE); + +void console_init(void) +{ + amlogic_uart_init(&console_data, CONSOLE_UART_BASE); + register_serial_console(&console_data.chip); +} diff --git a/core/arch/arm/plat-amlogic/platform_config.h b/core/arch/arm/plat-amlogic/platform_config.h new file mode 100644 index 00000000..a791e469 --- /dev/null +++ b/core/arch/arm/plat-amlogic/platform_config.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com> + */ + +#ifndef PLATFORM_CONFIG_H +#define PLATFORM_CONFIG_H + +#include <mm/generic_ram_layout.h> + +/* Make stacks aligned to data cache line length */ +#define STACK_ALIGNMENT 64 + +#define GIC_BASE 0xFFC01000 +#define GICC_OFFSET 0x2000 +#define GICD_OFFSET 0x1000 + +#define CONSOLE_UART_BASE 0xFF803000 + +#endif /*PLATFORM_CONFIG_H*/ diff --git a/core/arch/arm/plat-amlogic/scripts/aml_bin2img.py b/core/arch/arm/plat-amlogic/scripts/aml_bin2img.py new file mode 100755 index 00000000..28a037d4 --- /dev/null +++ b/core/arch/arm/plat-amlogic/scripts/aml_bin2img.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com> +# +# Derived from plat-stm32mp1/scripts/stm32image.py +# + +import argparse +import struct +import mmap + +header_size = 0x200 +ext_magic_number = 0x12348765 +version = 0x00002710 + + +def get_size(file): + file.seek(0, 2) # End of the file + size = file.tell() + return size + + +def aml_set_header(dest_fd, entry, res_mem_start, res_mem_size, sec_mem_start, + sec_mem_size): + dest_fd.seek(0, 0) + + dest_fd.write(struct.pack('<IIQQQQQ', + ext_magic_number, + version, + entry, + res_mem_start, + res_mem_size, + sec_mem_start, + sec_mem_size)) + + # Padding + dest_fd.write(b'\x00' * 464) + dest_fd.close() + + +def aml_create_header_file(source, dest, entry, res_mem_start, res_mem_size, + sec_mem_start, sec_mem_size): + dest_fd = open(dest, 'w+b') + src_fd = open(source, 'rb') + + dest_fd.write(b'\x00' * header_size) + + sizesrc = get_size(src_fd) + if sizesrc > 0: + mmsrc = mmap.mmap(src_fd.fileno(), 0, access=mmap.ACCESS_READ) + dest_fd.write(mmsrc[:sizesrc]) + mmsrc.close() + + src_fd.close() + + aml_set_header(dest_fd, entry, res_mem_start, res_mem_size, sec_mem_start, + sec_mem_size) + + dest_fd.close() + + +def auto_int(x): + return int(x, 0) + + +def get_args(): + parser = argparse.ArgumentParser() + + parser.add_argument('--source', + required=True, + help='Source file') + + parser.add_argument('--dest', + required=True, + help='Destination file') + + parser.add_argument('--entry', + required=True, + type=auto_int, + help='Entry point') + + parser.add_argument('--res_mem_start', + required=True, + type=auto_int, + help='Reserved memory start') + + parser.add_argument('--res_mem_size', + required=True, + type=auto_int, + help='Reserved memory size') + + parser.add_argument('--sec_mem_start', + required=True, + type=auto_int, + help='Secure memory start') + + parser.add_argument('--sec_mem_size', + required=True, + type=auto_int, + help='Secure memory size') + + return parser.parse_args() + + +def main(): + args = get_args() + + source_file = args.source + destination_file = args.dest + entry_point = args.entry + res_mem_start = args.res_mem_start + res_mem_size = args.res_mem_size + sec_mem_start = args.sec_mem_start + sec_mem_size = args.sec_mem_size + + aml_create_header_file(source_file, + destination_file, + entry_point, + res_mem_start, + res_mem_size, + sec_mem_start, + sec_mem_size) + + +if __name__ == "__main__": + main() diff --git a/core/arch/arm/plat-amlogic/sub.mk b/core/arch/arm/plat-amlogic/sub.mk new file mode 100644 index 00000000..8ddc2fd4 --- /dev/null +++ b/core/arch/arm/plat-amlogic/sub.mk @@ -0,0 +1,2 @@ +global-incdirs-y += . +srcs-y += main.c diff --git a/core/drivers/amlogic_uart.c b/core/drivers/amlogic_uart.c new file mode 100644 index 00000000..c5366090 --- /dev/null +++ b/core/drivers/amlogic_uart.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BSD-2-Clause +/* + * Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com> + */ + +#include <assert.h> +#include <drivers/amlogic_uart.h> +#include <io.h> +#include <keep.h> +#include <util.h> + +/* Registers */ +#define AML_UART_WFIFO 0x0000 +#define AML_UART_RFIFO 0x0004 +#define AML_UART_CONTROL 0x0008 +#define AML_UART_STATUS 0x000C +#define AML_UART_MISC 0x0010 + +/* AML_UART_STATUS bits */ +#define AML_UART_RX_EMPTY BIT(20) +#define AML_UART_TX_FULL BIT(21) +#define AML_UART_TX_EMPTY BIT(22) + +static vaddr_t chip_to_base(struct serial_chip *chip) +{ + struct amlogic_uart_data *pd = + container_of(chip, struct amlogic_uart_data, chip); + + return io_pa_or_va(&pd->base); +} + +static void amlogic_uart_flush(struct serial_chip *chip) +{ + vaddr_t base = chip_to_base(chip); + + while (!(io_read32(base + AML_UART_STATUS) & AML_UART_TX_EMPTY)) + ; +} + +static int amlogic_uart_getchar(struct serial_chip *chip) +{ + vaddr_t base = chip_to_base(chip); + + if (io_read32(base + AML_UART_STATUS) & AML_UART_RX_EMPTY) + return -1; + + return io_read32(base + AML_UART_RFIFO) & 0xff; +} + +static void amlogic_uart_putc(struct serial_chip *chip, int ch) +{ + vaddr_t base = chip_to_base(chip); + + while (io_read32(base + AML_UART_STATUS) & AML_UART_TX_FULL) + ; + + io_write32(base + AML_UART_WFIFO, ch); +} + +static const struct serial_ops amlogic_uart_ops = { + .flush = amlogic_uart_flush, + .getchar = amlogic_uart_getchar, + .putc = amlogic_uart_putc, +}; + +void amlogic_uart_init(struct amlogic_uart_data *pd, paddr_t base) +{ + pd->base.pa = base; + pd->chip.ops = &amlogic_uart_ops; + + /* + * Do nothing, debug uart (AO) shared with normal world, everything for + * uart initialization is done in bootloader. + */ +} diff --git a/core/drivers/sub.mk b/core/drivers/sub.mk index 1dabc74e..f94ed3e3 100644 --- a/core/drivers/sub.mk +++ b/core/drivers/sub.mk @@ -19,6 +19,7 @@ srcs-$(CFG_SCIF) += scif.c srcs-$(CFG_DRA7_RNG) += dra7_rng.c srcs-$(CFG_STIH_UART) += stih_asc.c srcs-$(CFG_ATMEL_UART) += atmel_uart.c +srcs-$(CFG_AMLOGIC_UART) += amlogic_uart.c srcs-$(CFG_MVEBU_UART) += mvebu_uart.c srcs-$(CFG_STM32_BSEC) += stm32_bsec.c srcs-$(CFG_STM32_ETZPC) += stm32_etzpc.c diff --git a/core/include/drivers/amlogic_uart.h b/core/include/drivers/amlogic_uart.h new file mode 100644 index 00000000..97b55f22 --- /dev/null +++ b/core/include/drivers/amlogic_uart.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +#ifndef AMLOGIC_UART_H +#define AMLOGIC_UART_H + +#include <types_ext.h> +#include <drivers/serial.h> + +struct amlogic_uart_data { + struct io_pa_va base; + struct serial_chip chip; +}; + +void amlogic_uart_init(struct amlogic_uart_data *pd, paddr_t base); + +#endif /* AMLOGIC_UART_H */ |