Index: head/sysutils/u-boot-rpi3/Makefile =================================================================== --- head/sysutils/u-boot-rpi3/Makefile (revision 433335) +++ head/sysutils/u-boot-rpi3/Makefile (revision 433336) @@ -1,70 +1,75 @@ # $FreeBSD$ PORTNAME= u-boot -PORTVERSION= 2016.11 -PORTREVISION= 1 +PORTVERSION= 2017.01 CATEGORIES= sysutils MASTER_SITES= ftp://ftp.denx.de/pub/u-boot/ \ LOCAL/db:bootfiles PKGNAMESUFFIX= -rpi3 -DISTFILES= u-boot-${PORTVERSION}.tar.bz2 \ +DISTFILES= u-boot-${PORTVERSION}.tar.bz2:uboot \ rpi3-boot-files-2016.05.tar.bz2:bootfiles \ - rpi3-psci-monitor-master.tgz:bootfiles + rpi3-psci-monitor-master.tgz:pscimon MAINTAINER= db@FreeBSD.org COMMENT= Cross-build U-Boot loader for RPi3 LICENSE= GPLv2 BUILD_DEPENDS= aarch64-none-elf-gcc:devel/aarch64-none-elf-gcc +USE_GITHUB= nodefault +GH_ACCOUNT= gonzoua:pscimon +GH_PROJECT= rpi3-psci-monitor:pscimon +GIT_TAG= 5782052 +GH_TAGNAME= ${GIT_TAG}:pscimon + NO_ARCH= yes WRKSRC= ${WRKDIR}/u-boot-${DISTVERSION} USES= gmake tar:bzip2 SSP_UNSAFE= yes # cross-LD does not support -fstack-protector WRK_BOOTFILES= ${WRKDIR}/rpi3-boot-files-2016.05 -PSCI_MONITOR= rpi3-psci-monitor-master +PSCI_MONITOR= rpi3-psci-monitor-${GIT_TAG} PSCI_DIR= ${WRKDIR}/${PSCI_MONITOR} U_BOOT_DIR= share/u-boot/${PORTNAME}${PKGNAMESUFFIX} PLIST_FILES= ${U_BOOT_DIR}/u-boot.bin \ ${U_BOOT_DIR}/README \ ${U_BOOT_DIR}/bootcode.bin \ ${U_BOOT_DIR}/fixup.dat \ ${U_BOOT_DIR}/fixup_cd.dat \ ${U_BOOT_DIR}/fixup_db.dat \ ${U_BOOT_DIR}/fixup_x.dat \ ${U_BOOT_DIR}/start.elf \ ${U_BOOT_DIR}/start_cd.elf \ ${U_BOOT_DIR}/start_db.elf \ ${U_BOOT_DIR}/start_x.elf \ ${U_BOOT_DIR}/config.txt \ ${U_BOOT_DIR}/LICENCE.broadcom \ ${U_BOOT_DIR}/armstub8.bin MAKE_ARGS+= ARCH=arm \ CROSS_COMPILE=aarch64-none-elf- \ CONFIG_EFI=y do-configure: - (cd ${WRKDIR}; tar xvf ${DISTDIR}/${PSCI_MONITOR}.tgz) (cd ${WRKSRC}; ${GMAKE} rpi_3_defconfig) do-build: (cd ${WRKSRC}; ${GMAKE} ${MAKE_ARGS}) (cd ${PSCI_DIR}; ${MAKE}) # The output of the u-boot build process is u-boot.bin. Older firmware # versions require a standard header, but the recent versions (our case) # are capable of booting u-boot.bin directly. Also copy the entire # contents of the bootfiles distribution (these are proprietary binary # files required to boot). +# Also include the armstub8.bin needed to go SMP on RPI3 do-install: ${MKDIR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} ${INSTALL_DATA} ${WRKSRC}/u-boot.bin ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/ ${INSTALL_DATA} ${DESCR} ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/README ${INSTALL_DATA} ${WRK_BOOTFILES}/* ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR} ${INSTALL_DATA} ${PSCI_DIR}/pscimon.bin ${STAGEDIR}/${PREFIX}/${U_BOOT_DIR}/armstub8.bin .include Index: head/sysutils/u-boot-rpi3/distinfo =================================================================== --- head/sysutils/u-boot-rpi3/distinfo (revision 433335) +++ head/sysutils/u-boot-rpi3/distinfo (revision 433336) @@ -1,7 +1,9 @@ -TIMESTAMP = 1486071382 -SHA256 (u-boot-2016.11.tar.bz2) = 45813e6565dcc0436abe6752624324cdbf5f3ac106570d76d32b46ec529bcdc8 -SIZE (u-boot-2016.11.tar.bz2) = 12019669 +TIMESTAMP = 1486166232 +SHA256 (u-boot-2017.01.tar.bz2) = 6c425175f93a4bcf2ec9faf5658ef279633dbd7856a293d95bd1ff516528ecf2 +SIZE (u-boot-2017.01.tar.bz2) = 12224884 SHA256 (rpi3-boot-files-2016.05.tar.bz2) = 8d5a2e453c9140d989133bc7cd991456138f4eb6c9722cd9eee4af4c1722e216 SIZE (rpi3-boot-files-2016.05.tar.bz2) = 6905733 SHA256 (rpi3-psci-monitor-master.tgz) = 47bbda7baede4e0a018869e9a7a9a05e37de5f8255ce6b5939c90bbd4f42f5a2 SIZE (rpi3-psci-monitor-master.tgz) = 5033 +SHA256 (gonzoua-rpi3-psci-monitor-5782052_GH0.tar.gz) = 0d1095492a31a6bcb726b688a75769959099bc4d1701c888e46711b1d528c3ae +SIZE (gonzoua-rpi3-psci-monitor-5782052_GH0.tar.gz) = 5110 Index: head/sysutils/u-boot-rpi3/files/patch-include_efi__api.h =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-include_efi__api.h (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-include_efi__api.h (nonexistent) @@ -1,21 +0,0 @@ ---- include/efi_api.h.orig 2016-11-14 16:27:11 UTC -+++ include/efi_api.h -@@ -268,6 +268,18 @@ struct efi_device_path { - u16 length; - }; - -+struct efi_mac_addr { -+ u8 addr[32]; -+}; -+ -+#define DEVICE_PATH_TYPE_MESSAGING_DEVICE 0x03 -+struct efi_device_path_mac_addr { -+ struct efi_device_path dp; -+ struct efi_mac_addr mac; -+ u8 if_type; -+}; -+ -+# define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR 0x0b - #define DEVICE_PATH_TYPE_MEDIA_DEVICE 0x04 - # define DEVICE_PATH_SUB_TYPE_FILE_PATH 0x04 - Property changes on: head/sysutils/u-boot-rpi3/files/patch-include_efi__api.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -1 \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__console.c =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__console.c (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__console.c (nonexistent) @@ -1,40 +0,0 @@ ---- lib/efi_loader/efi_console.c.orig 2016-11-14 16:27:11 UTC -+++ lib/efi_loader/efi_console.c -@@ -9,9 +9,9 @@ - #include - #include - --/* If we can't determine the console size, default to 80x24 */ -+/* If we can't determine the console size, default to 80x25 */ - static int console_columns = 80; --static int console_rows = 24; -+static int console_rows = 25; - static bool console_size_queried; - - const efi_guid_t efi_guid_console_control = CONSOLE_CONTROL_GUID; -@@ -165,6 +165,8 @@ static efi_status_t EFIAPI efi_cout_quer - unsigned long mode_number, unsigned long *columns, - unsigned long *rows) - { -+ unsigned long current_mode; -+ - EFI_ENTRY("%p, %ld, %p, %p", this, mode_number, columns, rows); - - if (!console_size_queried) { -@@ -196,6 +198,16 @@ static efi_status_t EFIAPI efi_cout_quer - } - - out: -+ if (console_columns == 80 && console_rows == 25) -+ current_mode = 0; -+ else if (console_columns == 80 && console_rows == 50) -+ current_mode = 1; -+ else -+ current_mode = 2; -+ -+ if (mode_number != current_mode) -+ return EFI_EXIT(EFI_UNSUPPORTED); -+ - if (columns) - *columns = console_columns; - if (rows) Property changes on: head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__console.c ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -1 \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__net.c =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__net.c (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__net.c (nonexistent) @@ -1,48 +0,0 @@ ---- lib/efi_loader/efi_net.c.orig 2016-11-14 16:27:11 UTC -+++ lib/efi_loader/efi_net.c -@@ -27,7 +27,8 @@ struct efi_net_obj { - struct efi_simple_network net; - struct efi_simple_network_mode net_mode; - /* Device path to the network adapter */ -- struct efi_device_path_file_path dp[2]; -+ struct efi_device_path_mac_addr dp_mac; -+ struct efi_device_path_file_path dp_end; - /* PXE struct to transmit dhcp data */ - struct efi_pxe pxe; - struct efi_pxe_mode pxe_mode; -@@ -205,7 +206,7 @@ static efi_status_t EFIAPI efi_net_open_ - struct efi_simple_network *net = handle; - struct efi_net_obj *netobj = container_of(net, struct efi_net_obj, net); - -- *protocol_interface = netobj->dp; -+ *protocol_interface = &netobj->dp_mac; - - return EFI_SUCCESS; - } -@@ -236,11 +237,10 @@ void efi_net_set_dhcp_ack(void *pkt, int - int efi_net_register(void **handle) - { - struct efi_net_obj *netobj; -- struct efi_device_path_file_path dp_net = { -- .dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE, -- .dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH, -+ struct efi_device_path_mac_addr dp_net = { -+ .dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE, -+ .dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR, - .dp.length = sizeof(dp_net), -- .str = { 'N', 'e', 't' }, - }; - struct efi_device_path_file_path dp_end = { - .dp.type = DEVICE_PATH_TYPE_END, -@@ -279,8 +279,9 @@ int efi_net_register(void **handle) - netobj->net.receive = efi_net_receive; - netobj->net.mode = &netobj->net_mode; - netobj->net_mode.state = EFI_NETWORK_STARTED; -- netobj->dp[0] = dp_net; -- netobj->dp[1] = dp_end; -+ netobj->dp_mac = dp_net; -+ netobj->dp_end = dp_end; -+ memcpy(netobj->dp_mac.mac.addr, eth_get_ethaddr(), 6); - memcpy(netobj->net_mode.current_address.mac_addr, eth_get_ethaddr(), 6); - netobj->net_mode.max_packet_size = PKTSIZE; - Property changes on: head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__net.c ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -1 \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/sysutils/u-boot-rpi3/files/patch-arch_arm_include_asm_system.h =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-arch_arm_include_asm_system.h (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-arch_arm_include_asm_system.h (revision 433336) @@ -1,48 +1,48 @@ ---- arch/arm/include/asm/system.h.orig 2016-11-14 16:27:11 UTC +--- arch/arm/include/asm/system.h.orig 2017-01-09 16:57:05 UTC +++ arch/arm/include/asm/system.h -@@ -201,22 +201,6 @@ void __noreturn psci_system_off(void); +@@ -329,22 +329,6 @@ void psci_arch_init(void); * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3); */ -/** - * save_boot_params_ret() - Return from save_boot_params() - * - * If you provide save_boot_params(), then you should jump back to this - * function when done. Try to preserve all registers. - * - * If your implementation of save_boot_params() is in C then it is acceptable - * to simply call save_boot_params_ret() at the end of your function. Since - * there is no link register set up, you cannot just exit the function. U-Boot - * will return to the (initialised) value of lr, and likely crash/hang. - * - * If your implementation of save_boot_params() is in assembler then you - * should use 'b' or 'bx' to return to save_boot_params_ret. - */ -void save_boot_params_ret(void); - #ifdef CONFIG_ARMV7_LPAE void switch_to_hypervisor_ret(void); #endif -@@ -410,6 +394,22 @@ void mmu_page_table_flush(unsigned long +@@ -538,6 +522,22 @@ void mmu_page_table_flush(unsigned long #ifndef __ASSEMBLY__ /** + * save_boot_params_ret() - Return from save_boot_params() + * + * If you provide save_boot_params(), then you should jump back to this + * function when done. Try to preserve all registers. + * + * If your implementation of save_boot_params() is in C then it is acceptable + * to simply call save_boot_params_ret() at the end of your function. Since + * there is no link register set up, you cannot just exit the function. U-Boot + * will return to the (initialised) value of lr, and likely crash/hang. + * + * If your implementation of save_boot_params() is in assembler then you + * should use 'b' or 'bx' to return to save_boot_params_ret. + */ +void save_boot_params_ret(void); + +/** * Change the cache settings for a region. * * \param start start address of memory region to change Index: head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_lowlevel__init.S =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_lowlevel__init.S (nonexistent) +++ head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_lowlevel__init.S (revision 433336) @@ -0,0 +1,28 @@ +--- board/raspberrypi/rpi/lowlevel_init.S.orig 2017-01-09 16:57:05 UTC ++++ board/raspberrypi/rpi/lowlevel_init.S +@@ -9,10 +9,15 @@ + + .align 8 + .global fw_dtb_pointer +-fw_dtb_pointer: ++ + #ifdef CONFIG_ARM64 ++fw_dtb_pointer: ++ .dword 0x0 ++.global reserve_memory ++reserve_memory: + .dword 0x0 + #else ++fw_dtb_pointer: + .word 0x0 + #endif + +@@ -28,6 +33,8 @@ save_boot_params: + #ifdef CONFIG_ARM64 + adr x8, fw_dtb_pointer + str x0, [x8] ++ adr x8, reserve_memory ++ str x1, [x8] + #else + str r2, fw_dtb_pointer + #endif Property changes on: head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_lowlevel__init.S ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +1 \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_rpi.c =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_rpi.c (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-board_raspberrypi_rpi_rpi.c (revision 433336) @@ -1,44 +1,43 @@ ---- board/raspberrypi/rpi/rpi.c.orig 2016-11-14 16:27:11 UTC +--- board/raspberrypi/rpi/rpi.c.orig 2017-01-09 16:57:05 UTC +++ board/raspberrypi/rpi/rpi.c -@@ -13,6 +13,7 @@ +@@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include -@@ -253,6 +254,22 @@ static struct mm_region bcm2837_mem_map[ +@@ -27,7 +28,7 @@ DECLARE_GLOBAL_DATA_PTR; + + /* From lowlevel_init.S */ + extern unsigned long fw_dtb_pointer; +- ++extern unsigned long reserve_memory; + + struct msg_get_arm_mem { + struct bcm2835_mbox_hdr hdr; +@@ -220,6 +221,12 @@ static struct mm_region bcm2837_mem_map[ }; struct mm_region *mem_map = bcm2837_mem_map; + -+static u64 fw_fdt_address __attribute__ ((section(".data"))); -+static u64 reserve_memory __attribute__ ((section(".data"))); -+ -+void save_boot_params(u64 x0, u64 x1, u64 x2, u64 x3) -+{ -+ fw_fdt_address = x0; -+ reserve_memory = x1; -+ save_boot_params_ret(); -+} -+ +void dram_init_banksize(void) +{ + gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE + reserve_memory; + gd->bd->bi_dram[0].size = get_effective_memsize() - reserve_memory; +} #endif int dram_init(void) -@@ -362,6 +379,10 @@ int misc_init_r(void) +@@ -355,6 +362,10 @@ int misc_init_r(void) set_board_info(); #endif set_serial_number(); +#ifdef CONFIG_ARM64 -+ if (fw_fdt_address) -+ setenv_hex("fdt_addr_r", (ulong)fw_fdt_address); ++ if (fw_dtb_pointer) ++ setenv_hex("fdt_addr_r", (ulong)fw_dtb_pointer); +#endif return 0; } Index: head/sysutils/u-boot-rpi3/files/patch-include_configs_rpi.h =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-include_configs_rpi.h (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-include_configs_rpi.h (revision 433336) @@ -1,17 +1,17 @@ ---- include/configs/rpi.h.orig 2016-11-14 16:27:11 UTC +--- include/configs/rpi.h.orig 2017-01-09 16:57:05 UTC +++ include/configs/rpi.h -@@ -104,11 +104,13 @@ +@@ -99,11 +99,13 @@ #endif /* Console UART */ +/* #ifdef CONFIG_BCM2837 #define CONFIG_BCM283X_MU_SERIAL #else +*/ #define CONFIG_PL01X_SERIAL -#endif +/* #endif */ #define CONFIG_CONS_INDEX 0 #define CONFIG_BAUDRATE 115200 Index: head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__disk.c =================================================================== --- head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__disk.c (revision 433335) +++ head/sysutils/u-boot-rpi3/files/patch-lib_efi__loader_efi__disk.c (revision 433336) @@ -1,126 +1,126 @@ ---- lib/efi_loader/efi_disk.c.orig 2016-11-14 16:27:11 UTC +--- lib/efi_loader/efi_disk.c.orig 2017-01-09 16:57:05 UTC +++ lib/efi_loader/efi_disk.c @@ -197,11 +197,13 @@ static void efi_disk_add_dev(const char const char *if_typename, const struct blk_desc *desc, int dev_index, - lbaint_t offset) + disk_partition_t *info, + int logical_partition) { struct efi_disk_obj *diskobj; struct efi_device_path_file_path *dp; int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2); + static int mediaid = 0; /* Don't add empty devices */ if (!desc->lba) @@ -218,16 +220,28 @@ static void efi_disk_add_dev(const char diskobj->ops = block_io_disk_template; diskobj->ifname = if_typename; diskobj->dev_index = dev_index; - diskobj->offset = offset; + if (info) + diskobj->offset = info->start; + diskobj->desc = desc; /* Fill in EFI IO Media info (for read/write callbacks) */ diskobj->media.removable_media = desc->removable; diskobj->media.media_present = 1; - diskobj->media.block_size = desc->blksz; - diskobj->media.io_align = desc->blksz; - diskobj->media.last_block = desc->lba - offset; + diskobj->media.media_id = mediaid++; diskobj->ops.media = &diskobj->media; + if (logical_partition) { + printf("Adding logical partition\n"); + diskobj->media.logical_partition = 1; + diskobj->media.block_size = info->blksz; + diskobj->media.io_align = info->blksz; + diskobj->media.last_block = info->size - 1; + } + else { + diskobj->media.block_size = desc->blksz; + diskobj->media.io_align = desc->blksz; + diskobj->media.last_block = desc->lba; + } /* Fill in device path */ dp = (void*)&diskobj[1]; @@ -262,8 +276,7 @@ static int efi_disk_create_eltorito(stru while (!part_get_info(desc, part, &info)) { snprintf(devname, sizeof(devname), "%s:%d", pdevname, part); - efi_disk_add_dev(devname, if_typename, desc, diskid, - info.start); + efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0); part++; disks++; } @@ -272,6 +285,30 @@ static int efi_disk_create_eltorito(stru return disks; } +static int efi_disk_create_mbr(struct blk_desc *desc, + const struct blk_driver *cur_drvr, + int diskid) +{ + int disks = 0; + char devname[32] = { 0 }; /* dp->str is u16[32] long */ + disk_partition_t info; + int part = 1; + + if (desc->part_type != PART_TYPE_DOS) + return 0; + + while (!part_get_info(desc, part, &info)) { + snprintf(devname, sizeof(devname), "%s%d:%d", cur_drvr->if_typename, + diskid, part); + + efi_disk_add_dev(devname, cur_drvr->if_typename, desc, diskid, &info, 1); + part++; + disks++; + } + + return disks; +} + /* * U-Boot doesn't have a list of all online disk devices. So when running our * EFI payload, we scan through all of the potentially available ones and @@ -296,13 +333,14 @@ int efi_disk_register(void) const char *if_typename = dev->driver->name; printf("Scanning disk %s...\n", dev->name); - efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, 0); + efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, NULL, 0); disks++; /* * El Torito images show up as block devices in an EFI world, * so let's create them here */ + disks += efi_disk_create_mbr(desc, dev, desc->devnum); disks += efi_disk_create_eltorito(desc, if_typename, desc->devnum, dev->name); } @@ -332,15 +370,17 @@ int efi_disk_register(void) snprintf(devname, sizeof(devname), "%s%d", if_typename, i); - efi_disk_add_dev(devname, if_typename, desc, i, 0); + efi_disk_add_dev(devname, if_typename, desc, i, 0, 0); disks++; /* * El Torito images show up as block devices * in an EFI world, so let's create them here */ + disks += efi_disk_create_mbr(desc, cur_drvr, i); disks += efi_disk_create_eltorito(desc, if_typename, i, devname); + } } #endif