Index: sysutils/Makefile =================================================================== --- sysutils/Makefile +++ sysutils/Makefile @@ -990,7 +990,10 @@ SUBDIR += ttyload SUBDIR += tw_cli SUBDIR += tzdialog + SUBDIR += u-boot-bananapi SUBDIR += u-boot-beaglebone + SUBDIR += u-boot-cubieboard + SUBDIR += u-boot-cubieboard2 SUBDIR += u-boot-cubox-hummingboard SUBDIR += u-boot-duovero SUBDIR += u-boot-pandaboard Index: sysutils/u-boot-bananapi/Makefile =================================================================== --- /dev/null +++ sysutils/u-boot-bananapi/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ + +PKGNAMESUFFIX= -bananapi + +COMMENT= Cross-build U-Boot loader for Banana Pi + +LICENSE= GPLv2 + +# Local overrides +MASTERDIR= ${.CURDIR}/../u-boot-cubieboard +DESCR= ${.CURDIR}/pkg-descr +MODEL= bananapi +CONF_TARGET= Bananapi_defconfig + +.include "${MASTERDIR}/Makefile" Index: sysutils/u-boot-bananapi/pkg-descr =================================================================== --- /dev/null +++ sysutils/u-boot-bananapi/pkg-descr @@ -0,0 +1,19 @@ +U-Boot loader for Banana Pi. + +To install this bootloader, follow the instructions in + http://linux-sunxi.org/Bootable_SD_card#Bootloader + +This version is patched so that: + * ELF and API features are enabled. + * The default environment is trimmed to just what's needed to boot. + * The saveenv command writes to the file u-boot.env on the FAT partition. + * The DTB file name is chosen based on the board model and passed to ubldr + using the fdtfile env variable. ubldr loads the DTB from /boot/dtb/ on + the FreeBSD partition. + * By default, it loads ELF ubldr from file ubldr on the FAT partition + to address 0x42000000, and launches it. + +For information about running FreeBSD on Banana Pi, see + https://wiki.freebsd.org/FreeBSD/arm/Allwinner + +For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot Index: sysutils/u-boot-cubieboard/Makefile =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/Makefile @@ -0,0 +1,48 @@ +# $FreeBSD$ + +PORTNAME= u-boot +PORTVERSION= 2015.04 +CATEGORIES= sysutils +MASTER_SITES= ftp://ftp.denx.de/pub/u-boot/ +PKGNAMESUFFIX?= -cubieboard + +MAINTAINER= loos@FreeBSD.org +COMMENT?= Cross-build U-Boot loader for Cubieboard + +LICENSE= GPLv2 + +BUILD_DEPENDS= arm-none-eabi-gcc:${PORTSDIR}/devel/arm-none-eabi-gcc + +MODEL?= cubieboard +CONF_TARGET?= Cubieboard_defconfig + +NO_ARCH= yes + +WRKSRC= ${WRKDIR}/u-boot-${DISTVERSION} +USES= gmake tar:bzip2 +SSP_UNSAFE= yes # cross-LD does not support -fstack-protector + +U_BOOT_DIR= share/u-boot/${PORTNAME}${PKGNAMESUFFIX} +PLIST_FILES= ${U_BOOT_DIR}/u-boot.img \ + ${U_BOOT_DIR}/u-boot-sunxi-with-spl.bin \ + ${U_BOOT_DIR}/sunxi-spl.bin \ + ${U_BOOT_DIR}/README + +MAKE_ARGS+= ARCH=arm \ + CROSS_COMPILE=arm-none-eabi- + +post-patch: + @${REINPLACE_CMD} -e "s,%%MODEL%%,${MODEL}," \ + ${WRKSRC}/include/configs/sunxi-common.h + +do-configure: + (cd ${WRKSRC}; ${GMAKE} ${CONF_TARGET}) + +do-install: + ${MKDIR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${CP} ${WRKSRC}/spl/sunxi-spl.bin ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${CP} ${WRKSRC}/u-boot-sunxi-with-spl.bin ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${CP} ${WRKSRC}/u-boot.img ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} + ${CP} ${.CURDIR}/pkg-descr ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README + +.include Index: sysutils/u-boot-cubieboard/distinfo =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/distinfo @@ -0,0 +1,2 @@ +SHA256 (u-boot-2015.04.tar.bz2) = 0a1a70df586655f527befa6f12e184e96ed61b126e5a567382321b17200f5d60 +SIZE (u-boot-2015.04.tar.bz2) = 9471487 Index: sysutils/u-boot-cubieboard/files/patch-api_api.c =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-api_api.c @@ -0,0 +1,79 @@ +--- api/api.c.orig 2015-04-13 14:53:03 UTC ++++ api/api.c +@@ -495,45 +495,47 @@ static int API_env_set(va_list ap) + */ + static int API_env_enum(va_list ap) + { +- int i, n; +- char *last, **next; ++ int i; ++ char *last, **next, *s; ++ ENTRY *match, search; ++ static char *buf; + + last = (char *)va_arg(ap, u_int32_t); + + if ((next = (char **)va_arg(ap, u_int32_t)) == NULL) + return API_EINVAL; + +- if (last == NULL) +- /* start over */ +- *next = ((char *)env_get_addr(0)); +- else { +- *next = last; +- +- for (i = 0; env_get_char(i) != '\0'; i = n + 1) { +- for (n = i; env_get_char(n) != '\0'; ++n) { +- if (n >= CONFIG_ENV_SIZE) { +- /* XXX shouldn't we set *next = NULL?? */ +- return 0; +- } +- } +- +- if (envmatch((uchar *)last, i) < 0) +- continue; +- +- /* try to get next name */ +- i = n + 1; +- if (env_get_char(i) == '\0') { +- /* no more left */ +- *next = NULL; +- return 0; +- } +- +- *next = ((char *)env_get_addr(i)); +- return 0; ++ /* ++ * This leverages realloc's behavior of growing but never shrinking the ++ * existing buffer. ++ */ ++ if (last == NULL) { ++ i = 0; ++ buf = realloc(buf, 512); /* Start with reasonable size buf. */ ++ } else { ++ buf = realloc(buf, strlen(last) + 1); ++ strcpy(buf, last); ++ if ((s = strchr(buf, '=')) != NULL) ++ *s = 0; ++ search.key = buf; ++ if ((i = hsearch_r(search, FIND, &match, &env_htab, 0)) == 0) { ++ i = API_EINVAL; ++ goto done; + } + } + ++ /* hmatch on empty string is effectively "get next entry after i". */ ++ if ((i = hmatch_r("", i, &match, &env_htab)) == 0) ++ goto done; ++ buf = realloc(buf, strlen(match->key) + strlen(match->data) + 2); ++ snprintf(buf, buflen, "%s=%s", match->key, match->data); ++ *next = buf; + return 0; ++done: ++ free(buf); ++ buf = NULL; ++ *next = NULL; ++ return i; + } + + /* Index: sysutils/u-boot-cubieboard/files/patch-api_api__storage.c =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-api_api__storage.c @@ -0,0 +1,28 @@ +--- api/api_storage.c.orig 2015-04-13 14:53:03 UTC ++++ api/api_storage.c +@@ -107,10 +107,13 @@ static int dev_stor_get(int type, int fi + + if (first) { + di->cookie = (void *)get_dev(specs[type].name, 0); +- if (di->cookie == NULL) ++ if (di->cookie == NULL) { + return 0; +- else ++ } else { + found = 1; ++ if (specs[type].max_dev > 1) ++ *more = 1; ++ } + + } else { + for (i = 0; i < specs[type].max_dev; i++) +@@ -146,7 +149,8 @@ static int dev_stor_get(int type, int fi + dd = (block_dev_desc_t *)di->cookie; + if (dd->type == DEV_TYPE_UNKNOWN) { + debugf("device instance exists, but is not active.."); +- found = 0; ++ di->di_stor.block_count = 0; ++ di->di_stor.block_size = 0; + } else { + di->di_stor.block_count = dd->lba; + di->di_stor.block_size = dd->blksz; Index: sysutils/u-boot-cubieboard/files/patch-common_cmd__elf.c =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-common_cmd__elf.c @@ -0,0 +1,29 @@ +--- common/cmd_elf.c.orig 2015-04-13 14:53:03 UTC ++++ common/cmd_elf.c +@@ -35,22 +35,12 @@ static unsigned long do_bootelf_exec(ulo + unsigned long ret; + + /* +- * QNX images require the data cache is disabled. +- * Data cache is already flushed, so just turn it off. +- */ +- int dcache = dcache_status(); +- if (dcache) +- dcache_disable(); +- +- /* +- * pass address parameter as argv[0] (aka command name), +- * and all remaining args ++ * FreeBSD wants the caches enabled while ubldr runs, and as of r276397 ++ * the kernel can tolerate being entered with internal (but not external ++ * PL310) caches enabled on armv6/7 systems. So don't disable caches ++ * here, just launch the program directly. + */ + ret = entry(argc, argv); +- +- if (dcache) +- dcache_enable(); +- + return ret; + } + Index: sysutils/u-boot-cubieboard/files/patch-common_cmd__test.c =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-common_cmd__test.c @@ -0,0 +1,19 @@ +--- common/cmd_test.c.orig 2015-04-13 14:53:03 UTC ++++ common/cmd_test.c +@@ -65,9 +65,14 @@ static int do_test(cmd_tbl_t *cmdtp, int + char * const *ap; + int i, op, left, adv, expr, last_expr, last_unop, last_binop; + +- /* args? */ +- if (argc < 3) ++ /* ++ * If no args, that's bogus, return false. ++ * If op is -z and no other args, answer is Yes, string is empty. ++ */ ++ if (argc < 2) + return 1; ++ else if (argc == 2) ++ return !(strcmp(argv[1], "-z") == 0); + + #ifdef DEBUG + { Index: sysutils/u-boot-cubieboard/files/patch-drivers_mmc_mmc.c =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-drivers_mmc_mmc.c @@ -0,0 +1,80 @@ +--- drivers/mmc/mmc.c.orig 2015-04-13 14:53:03 UTC ++++ drivers/mmc/mmc.c +@@ -20,6 +20,7 @@ + + static struct list_head mmc_devices; + static int cur_dev_num = -1; ++static int mmc_error_print_max = -1; + + __weak int board_mmc_getwp(struct mmc *mmc) + { +@@ -1560,9 +1561,14 @@ void mmc_destroy(struct mmc *mmc) + block_dev_desc_t *mmc_get_dev(int dev) + { + struct mmc *mmc = find_mmc_device(dev); +- if (!mmc || mmc_init(mmc)) ++ if (!mmc) + return NULL; + ++ /* If mmc_init fails, mmc->block_dev will be of type ++ * DEV_TYPE_UNKNOWN with blksz and lba set to zero. ++ */ ++ mmc_init(mmc); ++ + return &mmc->block_dev; + } + #endif +@@ -1594,7 +1600,7 @@ int mmc_start_init(struct mmc *mmc) + err = mmc->cfg->ops->init(mmc); + + if (err) +- return err; ++ goto done; + + mmc->ddr_mode = 0; + mmc_set_bus_width(mmc, 1); +@@ -1604,7 +1610,7 @@ int mmc_start_init(struct mmc *mmc) + err = mmc_go_idle(mmc); + + if (err) +- return err; ++ goto done; + + /* The internal partition reset to user partition(0) at every CMD0*/ + mmc->part_num = 0; +@@ -1621,15 +1627,33 @@ int mmc_start_init(struct mmc *mmc) + + if (err && err != IN_PROGRESS) { + #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) +- printf("Card did not respond to voltage select!\n"); ++ if (mmc_error_print_max < 4) { ++ mmc_error_print_max++; ++ printf("Card did not respond to voltage select!\n"); ++ ++ if (mmc_error_print_max == 4) { ++ printf("Discarding further error messages\n"); ++ } ++ } + #endif +- return UNUSABLE_ERR; ++// return UNUSABLE_ERR; ++ goto done; + } + } + + if (err == IN_PROGRESS) + mmc->init_in_progress = 1; + ++done: ++ if (err) { ++ mmc->has_init = 0; ++ mmc->block_dev.type = DEV_TYPE_UNKNOWN; ++ mmc->block_dev.blksz = 0; ++ mmc->block_dev.lba = 0; ++ } else { ++ mmc->has_init = 1; ++ } ++ + return err; + } + Index: sysutils/u-boot-cubieboard/files/patch-include_configs_sunxi-common.h =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/files/patch-include_configs_sunxi-common.h @@ -0,0 +1,74 @@ +--- include/configs/sunxi-common.h.orig 2015-04-13 14:53:03 UTC ++++ include/configs/sunxi-common.h +@@ -406,4 +406,71 @@ extern int soft_i2c_gpio_scl; + #define CONFIG_EXTRA_ENV_SETTINGS + #endif + ++/***************************************************************************** ++ * FreeBSD customizations from here down. ++ ****************************************************************************/ ++ ++/* Add the API and ELF features needed for ubldr. */ ++#ifndef CONFIG_SPL_BUILD ++#define CONFIG_API ++#define CONFIG_CMD_ELF ++#define CONFIG_CMD_ENV_EXISTS ++#define CONFIG_EFI_PARTITION ++#endif ++ ++/* Turn off dcache. */ ++#ifndef CONFIG_SPL_BUILD ++#define CONFIG_SYS_DCACHE_OFF ++#define CONFIG_CMD_CACHE ++#endif ++ ++/* Save the env to the fat partition. */ ++#ifndef CONFIG_SPL_BUILD ++#undef CONFIG_ENV_IS_NOWHERE ++#undef CONFIG_ENV_IS_IN_NAND ++#undef CONFIG_ENV_IS_IN_MMC ++#undef CONFIG_ENV_IS_IN_SPI_FLASH ++#define CONFIG_ENV_IS_IN_FAT ++#define CONFIG_FAT_WRITE ++#define CONFIG_SYS_MMC_MAX_DEVICE 4 ++#define FAT_ENV_INTERFACE "mmc" ++#define FAT_ENV_DEVICE_AND_PART "0:1" ++#define FAT_ENV_FILE "u-boot.env" ++#endif ++ ++/* Create a small(ish) boot environment for FreeBSD. */ ++#ifndef CONFIG_SPL_BUILD ++#undef CONFIG_EXTRA_ENV_SETTINGS ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ MEM_LAYOUT_ENV_SETTINGS \ ++ CONSOLE_STDOUT_SETTINGS \ ++ "stdin=serial,usbkbd\0" \ ++ "fdtfile=%%MODEL%%.dtb\0" \ ++ "console=ttyS0,115200\0" \ ++ "Fatboot=" \ ++ "env exists loaderdev || env set loaderdev ${fatdev}; " \ ++ "env exists UserFatboot && run UserFatboot; " \ ++ "echo Booting from: ${fatdev} ${bootfile}; " \ ++ "fatload ${fatdev} ${kernel_addr_r} ${bootfile} && bootelf; " \ ++ "\0" \ ++ "Netboot=" \ ++ "env exists loaderdev || env set loaderdev net; " \ ++ "env exists UserNetboot && run UserNetboot; " \ ++ "dhcp ${kernel_addr_r} ${bootfile} && bootelf; " \ ++ "\0" \ ++ "preboot=usb start; " \ ++ "env exists bootfile || env set bootfile ubldr; " \ ++ "env exists SetupFatdev && run SetupFatdev; " \ ++ "env exists UserPreboot && run UserPreboot; " \ ++ "\0" \ ++ "SetupFatdev=" \ ++ "env exists fatdev || env set fatdev 'mmc 0'; " \ ++ "\0" ++ ++#undef CONFIG_BOOTCOMMAND ++#define CONFIG_BOOTCOMMAND "run Fatboot" ++#undef CONFIG_PREBOOT ++#define CONFIG_PREBOOT "run preboot" ++#endif ++ + #endif /* _SUNXI_COMMON_CONFIG_H */ Index: sysutils/u-boot-cubieboard/pkg-descr =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard/pkg-descr @@ -0,0 +1,19 @@ +U-Boot loader for Cubieboard. + +To install this bootloader, follow the instructions in + http://linux-sunxi.org/Bootable_SD_card#Bootloader + +This version is patched so that: + * ELF and API features are enabled. + * The default environment is trimmed to just what's needed to boot. + * The saveenv command writes to the file u-boot.env on the FAT partition. + * The DTB file name is chosen based on the board model and passed to ubldr + using the fdtfile env variable. ubldr loads the DTB from /boot/dtb/ on + the FreeBSD partition. + * By default, it loads ELF ubldr from file ubldr on the FAT partition + to address 0x42000000, and launches it. + +For information about running FreeBSD on Cubieboard, see + https://wiki.freebsd.org/FreeBSD/arm/Allwinner + +For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot Index: sysutils/u-boot-cubieboard2/Makefile =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard2/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ + +PKGNAMESUFFIX= -cubieboard2 + +COMMENT= Cross-build U-Boot loader for Cubieboard2 + +LICENSE= GPLv2 + +# Local overrides +MASTERDIR= ${.CURDIR}/../u-boot-cubieboard +DESCR= ${.CURDIR}/pkg-descr +MODEL= cubieboard2 +CONF_TARGET= Cubieboard2_defconfig + +.include "${MASTERDIR}/Makefile" Index: sysutils/u-boot-cubieboard2/pkg-descr =================================================================== --- /dev/null +++ sysutils/u-boot-cubieboard2/pkg-descr @@ -0,0 +1,19 @@ +U-Boot loader for Cubieboard2. + +To install this bootloader, follow the instructions in + http://linux-sunxi.org/Bootable_SD_card#Bootloader + +This version is patched so that: + * ELF and API features are enabled. + * The default environment is trimmed to just what's needed to boot. + * The saveenv command writes to the file u-boot.env on the FAT partition. + * The DTB file name is chosen based on the board model and passed to ubldr + using the fdtfile env variable. ubldr loads the DTB from /boot/dtb/ on + the FreeBSD partition. + * By default, it loads ELF ubldr from file ubldr on the FAT partition + to address 0x42000000, and launches it. + +For information about running FreeBSD on Cubieboard, see + https://wiki.freebsd.org/FreeBSD/arm/Allwinner + +For general information about U-Boot see WWW: http://www.denx.de/wiki/U-Boot