int arch_bootm(BT_u32 coreID, void *start_addr, void *fdt_addr) { BT_u32 machine_id = 0; BT_ENV_VARIABLE *machid = BT_ShellGetEnv("machid"); if(!machid) { printf("Warning : machine_id was not defined, set ${machid}:\n" "e.g : setenv machid 0xabad1dea\n"); } else { machine_id = strtoul(machid->o.string->s, NULL, 16); } BT_DCacheFlush(); BT_ICacheInvalidate(); BT_DCacheDisable(); if(coreID == BT_GetCoreID()) { BT_StopSystemTimer(); BT_DisableInterrupts(); jump_regs jumpr = (jump_regs) start_addr; jumpr(0, machine_id, (BT_u32) fdt_addr, 0); return -1; // Is this such a good idea? Could be in an indefined state. } else { BT_BootCore(coreID, start_addr, 0, machine_id, (bt_register_t) fdt_addr, 0); // Use the platform BootCore to run the boot_core function. } return 0; }
static BT_ERROR zynq_boot_core(BT_u32 ulCoreID, void *p) { volatile BT_u32 *core2 = (BT_u32 *) 0xFFFFFFF0; *core2 = (BT_u32) p; BT_DCacheFlush(); __asm volatile("sev"); return BT_ERR_NONE; }
static int bt_boot(int argc, char **argv) { if(argc != 2 && argc != 4) { bt_printf("Usage: %s {--core [coreID]} [start-address]\n", argv[0]); return -1; } BT_u32 coreID = 0; BT_u32 addr; if(argc == 4) { if(strcmp(argv[1], "--core")) { bt_printf("Invalid argument %s\n", argv[1]); return -1; } coreID = strtol(argv[2], NULL, 10); addr = strtol(argv[3], NULL, 16); } else { addr = strtol(argv[1], NULL, 16); } void *p = (void *) addr; BT_DCacheFlush(); BT_ICacheInvalidate(); BT_DCacheDisable(); if(!coreID) { BT_StopSystemTimer(); BT_DisableInterrupts(); jump jmp = p; jmp(); while(1) { __asm__ (""); } } else { // Must use MACH core boot interface. BT_BootCore(coreID, p); } return 0; }
static int bt_boot_jtag(int argc, char **argv) { if(argc != 3) { bt_printf("Usage: %s --core [coreID]\n", argv[0]); return -1; } BT_u32 coreID = 0; if(strcmp(argv[1], "--core")) { bt_printf("Invalid argument %s\n", argv[1]); return -1; } coreID = strtoul(argv[2], NULL, 10); void *p = (void *) wait_jtag; BT_DCacheFlush(); BT_ICacheInvalidate(); if(!coreID) { BT_StopSystemTimer(); BT_DisableInterrupts(); jump jmp = p; jmp(); while(1) { __asm__ (""); } } else { // Must use MACH core boot interface. BT_BootCore(coreID, p); } return 0; }
static int bt_load_fpga(BT_HANDLE hShell, int argc, char **argv) { BT_HANDLE hStdout = BT_ShellGetStdout(hShell); BT_ERROR Error; if(argc != 4 && argc != 5) { bt_fprintf(hStdout, "Usage: %s [buffer_address] [fpga_device] [bitstream] [length]\n", argv[0]); return -1; } BT_u32 length = 0; BT_u32 addr = strtoul(argv[1], NULL, 16); void *p = (void *) addr; if(argv[3][0] == '-' && argc == 5) { // Image loaded and length provided. length = strtoul(argv[4], NULL, 10); goto flush; } BT_HANDLE hFile = BT_Open(argv[3], BT_GetModeFlags("rb"), &Error); if(!hFile) { bt_fprintf(hStdout, "Could not open bitstream at %s\n", argv[3]); return -1; } BT_HANDLE hInode = BT_GetInode(argv[3], &Error); if(!hInode) { bt_fprintf(hStdout, "Could not stat bitstream at %s\n", argv[3]); BT_CloseHandle(hFile); return -1; } BT_INODE oInode; BT_ReadInode(hInode, &oInode); BT_kPrint("Loading %s at %08X (%llu bytes)", argv[3], addr, oInode.ullFileSize); BT_Read(hFile, 0, oInode.ullFileSize, p, &Error); BT_kPrint("Load successful"); if(hFile) { BT_CloseHandle(hFile); } if(hInode) { BT_CloseHandle(hInode); } length = oInode.ullFileSize; flush: BT_DCacheFlush(); BT_HANDLE hFPGA = BT_DeviceOpen(argv[2], &Error); if(!hFPGA) { bt_printf("Failed to open fpga device %s\n", argv[2]); return -1; } BT_Write(hFPGA, 0, length, p, &Error); BT_CloseHandle(hFPGA); return 0; }