| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Configuration for MT8183 based boards |
| * |
| * Copyright (C) 2019 BayLibre, SAS |
| * Author: Fabien Parent <fparent@baylibre.com |
| */ |
| |
| #ifndef __MT8183_H |
| #define __MT8183_H |
| |
| #include <linux/sizes.h> |
| |
| #define CONFIG_ENV_SIZE SZ_4K |
| #define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_TEXT_BASE |
| #define CONFIG_SYS_MALLOC_LEN SZ_4M |
| |
| #define CONFIG_CPU_ARMV8 |
| #define COUNTER_FREQUENCY 13000000 |
| |
| #define CONFIG_SYS_NS16550_SERIAL |
| #define CONFIG_SYS_NS16550_REG_SIZE -4 |
| #define CONFIG_SYS_NS16550_MEM32 |
| #define CONFIG_SYS_NS16550_COM1 0x11005200 |
| #define CONFIG_SYS_NS16550_CLK 26000000 |
| |
| #define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE |
| #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + SZ_2M - \ |
| GENERATED_GBL_DATA_SIZE) |
| |
| #define CONFIG_SYS_BOOTM_LEN SZ_64M |
| |
| #define CONFIG_SYS_MMC_ENV_DEV 0 |
| #define CONFIG_SYS_MMC_ENV_PART 2 |
| #define CONFIG_ENV_OFFSET 0 |
| |
| #ifdef CONFIG_MTK_ANDROID |
| |
| #define MMC_LOAD_PART(_partname) \ |
| "part start mmc ${mmcdev} " _partname " " _partname "_part_start;" \ |
| "part size mmc ${mmcdev} " _partname " " _partname "_part_size;" \ |
| "mmc read ${loadaddr} ${" _partname "_part_start} ${" _partname "_part_size};" |
| |
| #define MMC_LOAD_DTB \ |
| MMC_LOAD_PART("dtbo") \ |
| "dtimg select ${loadaddr} ${dtb_index};" \ |
| "dtimg merge ${loadaddr} ${dtbo_index};" |
| |
| #ifdef CONFIG_CMD_AB_SELECT |
| |
| #define MMC_LOAD_PART_AB(_partname, _slot) \ |
| "part start mmc ${mmcdev} " _partname "_" _slot " " _partname "_part_start;" \ |
| "part size mmc ${mmcdev} " _partname "_" _slot " " _partname "_part_size;" \ |
| "mmc read ${loadaddr} ${" _partname "_part_start} ${" _partname "_part_size};" |
| |
| #define MMC_LOAD_BOOT MMC_LOAD_PART_AB("boot", "${android_ab_slot}") |
| |
| /* |
| * In the case of Android A/B, the recovery RAM disk |
| * is contained in the boot.img |
| * https://source.android.com/devices/tech/ota/ab/ab_implement#recovery |
| */ |
| #define ANDROID_BOOT_RECOVERY \ |
| MMC_LOAD_DTB \ |
| MMC_LOAD_BOOT \ |
| "bootm ${loadaddr};" |
| |
| #define ANDROID_BOOT_SYSTEM \ |
| MMC_LOAD_DTB \ |
| MMC_LOAD_BOOT \ |
| "part number-format dec;" \ |
| "part number mmc ${mmcdev} system_${android_ab_slot} rootfs_partition;" \ |
| "setenv bootargs \"${bootargs} root=/dev/mmcblk${mmcdev}p${rootfs_partition}\";" \ |
| "setenv bootargs \"${bootargs} androidboot.android_dt_dir=/proc/device-tree/odm/firmware/android/\";" \ |
| "setenv bootargs \"${bootargs} skip_initramfs\";" \ |
| "bootm ${loadaddr};" |
| |
| #define ANDROID_AB_GET_SLOT \ |
| "ab_select android_ab_slot mmc ${mmcdev}#misc;" \ |
| "setenv bootargs \"${bootargs} androidboot.slot_suffix=_${android_ab_slot}\";" |
| |
| #else |
| #define MMC_LOAD_RECOVERY MMC_LOAD_PART("recovery") |
| #define MMC_LOAD_BOOT MMC_LOAD_PART("boot") |
| |
| #define ANDROID_BOOT_RECOVERY \ |
| MMC_LOAD_DTB \ |
| MMC_LOAD_RECOVERY \ |
| "bootm ${loadaddr};" |
| |
| #define ANDROID_BOOT_SYSTEM \ |
| MMC_LOAD_DTB \ |
| MMC_LOAD_BOOT \ |
| "part number-format dec;" \ |
| "part number mmc ${mmcdev} system rootfs_partition;" \ |
| "setenv bootargs \"${bootargs} root=/dev/mmcblk${mmcdev}p${rootfs_partition}\";" \ |
| "setenv bootargs \"${bootargs} androidboot.android_dt_dir=/proc/device-tree/odm/firmware/android/\";" \ |
| "bootm ${loadaddr};" |
| |
| #define ANDROID_AB_GET_SLOT "" |
| |
| #endif // ifdef CONFIG_CMD_AB_SELECT |
| |
| /* |
| * checks if we should boot into android recovery mode |
| * |
| * This is a mix between BCB (misc partition) and Android system properties |
| * from userdata. |
| * |
| * To avoid booting twice in a row into recovery, always erase the system |
| * property |
| * |
| * sets androidboot_recovery to 1 if we should boot into recovery |
| */ |
| #define ANDROID_TEST_RECOVERY \ |
| "if bcb load ${mmcdev} misc; then " \ |
| "if bcb test command = boot-recovery; then " \ |
| "bcb clear command; bcb store;" \ |
| "aprop load ${mmcdev} userdata;" \ |
| "if aprop test persist.sys.boot.reason = recovery; then " \ |
| "aprop set persist.sys.boot.reason none; aprop store;" \ |
| "fi;" \ |
| "setenv androidboot_recovery 1;" \ |
| "else " \ |
| "if aprop load ${mmcdev} userdata; then " \ |
| "if aprop test persist.sys.boot.reason = recovery; then " \ |
| "aprop set persist.sys.boot.reason none; aprop store;" \ |
| "setenv androidboot_recovery 1;" \ |
| "fi;" \ |
| "fi;" \ |
| "fi;" \ |
| "fi;" \ |
| |
| #define MMCBOOT \ |
| "mmcdev=0\0" \ |
| "rootfs_partition=0\0" \ |
| "dtb_index=0\0" \ |
| "dtbo_index=1\0" \ |
| "loadaddr=0x50000000\0" \ |
| "androidboot_recovery=0\0" \ |
| "android_ab_slot=\0" \ |
| "mmcboot=" \ |
| ANDROID_AB_GET_SLOT \ |
| ANDROID_TEST_RECOVERY \ |
| "if test \"${androidboot_recovery}\" -eq 1; then " \ |
| "echo Android: booting into recovery;" \ |
| ANDROID_BOOT_RECOVERY \ |
| "fi;" \ |
| "echo Android: booting into system;" \ |
| ANDROID_BOOT_SYSTEM \ |
| "\0" |
| #else |
| #define MMCBOOT \ |
| "mmcdev=0\0" \ |
| "rootfs_partition=3\0" \ |
| "mmc_discover_partition=" \ |
| "part start mmc ${mmcdev} kernel kernel_part_addr;" \ |
| "part size mmc ${mmcdev} kernel kernel_part_size;\0" \ |
| "mmcboot=" \ |
| "mmc dev ${mmcdev};" \ |
| "run mmc_discover_partition;" \ |
| "mmc read ${kerneladdr} ${kernel_part_addr} ${kernel_part_size};" \ |
| "setenv bootargs ${bootargs} root=/dev/mmcblk${mmcdev}p${rootfs_partition} rootwait; " \ |
| "bootm ${kerneladdr}${boot_conf}; \0" |
| #endif /* CONFIG_MTK_ANDROID */ |
| |
| #define CONFIG_EXTRA_ENV_SETTINGS \ |
| "kerneladdr=0x4A000000\0" \ |
| MMCBOOT \ |
| "bootcmd=run mmcboot\0" |
| |
| #endif |