14b0730d2SSimon Glass /* 24b0730d2SSimon Glass * Copyright (c) 2011 The Chromium OS Authors. 31a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 44b0730d2SSimon Glass */ 59569c406SSimon Glass #define DEBUG 64b0730d2SSimon Glass #include <common.h> 761336833SSimon Glass #include <dm/root.h> 87a9219c1SSimon Glass #include <os.h> 9b45122fdSSimon Glass #include <asm/io.h> 105c2859cdSSimon Glass #include <asm/state.h> 114b0730d2SSimon Glass 124b0730d2SSimon Glass DECLARE_GLOBAL_DATA_PTR; 134b0730d2SSimon Glass 149569c406SSimon Glass /* Enable access to PCI memory with map_sysmem() */ 159569c406SSimon Glass static bool enable_pci_map; 169569c406SSimon Glass 179569c406SSimon Glass #ifdef CONFIG_PCI 189569c406SSimon Glass /* Last device that was mapped into memory, and length of mapping */ 199569c406SSimon Glass static struct udevice *map_dev; 209569c406SSimon Glass unsigned long map_len; 219569c406SSimon Glass #endif 229569c406SSimon Glass 2388bd0e9dSSimon Glass void reset_cpu(ulong ignored) 244b0730d2SSimon Glass { 25*8939df09SSimon Glass /* Do this here while it still has an effect */ 26*8939df09SSimon Glass os_fd_restore(); 275c2859cdSSimon Glass if (state_uninit()) 285c2859cdSSimon Glass os_exit(2); 295c2859cdSSimon Glass 3061336833SSimon Glass if (dm_uninit()) 3161336833SSimon Glass os_exit(2); 3261336833SSimon Glass 337a9219c1SSimon Glass /* This is considered normal termination for now */ 347a9219c1SSimon Glass os_exit(0); 3588bd0e9dSSimon Glass } 3688bd0e9dSSimon Glass 3788bd0e9dSSimon Glass int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3888bd0e9dSSimon Glass { 3988bd0e9dSSimon Glass reset_cpu(0); 4088bd0e9dSSimon Glass 414b0730d2SSimon Glass return 0; 424b0730d2SSimon Glass } 434b0730d2SSimon Glass 444b0730d2SSimon Glass /* delay x useconds */ 454b0730d2SSimon Glass void __udelay(unsigned long usec) 464b0730d2SSimon Glass { 47d99a6874SMatthias Weisser os_usleep(usec); 484b0730d2SSimon Glass } 494b0730d2SSimon Glass 504b0730d2SSimon Glass int cleanup_before_linux(void) 514b0730d2SSimon Glass { 524b0730d2SSimon Glass return 0; 534b0730d2SSimon Glass } 544b0730d2SSimon Glass 554b0730d2SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) 564b0730d2SSimon Glass { 579569c406SSimon Glass #ifdef CONFIG_PCI 589569c406SSimon Glass unsigned long plen = len; 599569c406SSimon Glass void *ptr; 609569c406SSimon Glass 619569c406SSimon Glass map_dev = NULL; 629569c406SSimon Glass if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) { 639569c406SSimon Glass if (plen != len) { 649569c406SSimon Glass printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n", 659569c406SSimon Glass __func__, paddr, len, plen); 669569c406SSimon Glass } 679569c406SSimon Glass map_len = len; 689569c406SSimon Glass return ptr; 699569c406SSimon Glass } 709569c406SSimon Glass #endif 719569c406SSimon Glass 728ee666a7SSimon Glass return (void *)(gd->arch.ram_buf + paddr); 734b0730d2SSimon Glass } 744b0730d2SSimon Glass 759569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags) 769569c406SSimon Glass { 779569c406SSimon Glass #ifdef CONFIG_PCI 789569c406SSimon Glass if (map_dev) { 799569c406SSimon Glass pci_unmap_physmem(vaddr, map_len, map_dev); 809569c406SSimon Glass map_dev = NULL; 819569c406SSimon Glass } 829569c406SSimon Glass #endif 839569c406SSimon Glass } 849569c406SSimon Glass 859569c406SSimon Glass void sandbox_set_enable_pci_map(int enable) 869569c406SSimon Glass { 879569c406SSimon Glass enable_pci_map = enable; 889569c406SSimon Glass } 899569c406SSimon Glass 9066bd1cffSSimon Glass phys_addr_t map_to_sysmem(const void *ptr) 91781adb57SSimon Glass { 92781adb57SSimon Glass return (u8 *)ptr - gd->arch.ram_buf; 93781adb57SSimon Glass } 94781adb57SSimon Glass 954b0730d2SSimon Glass void flush_dcache_range(unsigned long start, unsigned long stop) 964b0730d2SSimon Glass { 974b0730d2SSimon Glass } 98b45122fdSSimon Glass 99b45122fdSSimon Glass int sandbox_read_fdt_from_file(void) 100b45122fdSSimon Glass { 101b45122fdSSimon Glass struct sandbox_state *state = state_get_current(); 102b45122fdSSimon Glass const char *fname = state->fdt_fname; 103b45122fdSSimon Glass void *blob; 104b45122fdSSimon Glass loff_t size; 105b45122fdSSimon Glass int err; 106b45122fdSSimon Glass int fd; 107b45122fdSSimon Glass 108b45122fdSSimon Glass blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); 109b45122fdSSimon Glass if (!state->fdt_fname) { 110b45122fdSSimon Glass err = fdt_create_empty_tree(blob, 256); 111b45122fdSSimon Glass if (!err) 112b45122fdSSimon Glass goto done; 113b45122fdSSimon Glass printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); 114b45122fdSSimon Glass return -EINVAL; 115b45122fdSSimon Glass } 116b45122fdSSimon Glass 117b45122fdSSimon Glass err = os_get_filesize(fname, &size); 118b45122fdSSimon Glass if (err < 0) { 119b45122fdSSimon Glass printf("Failed to file FDT file '%s'\n", fname); 120b45122fdSSimon Glass return err; 121b45122fdSSimon Glass } 122b45122fdSSimon Glass fd = os_open(fname, OS_O_RDONLY); 123b45122fdSSimon Glass if (fd < 0) { 124b45122fdSSimon Glass printf("Failed to open FDT file '%s'\n", fname); 125b45122fdSSimon Glass return -EACCES; 126b45122fdSSimon Glass } 127b45122fdSSimon Glass if (os_read(fd, blob, size) != size) { 128b45122fdSSimon Glass os_close(fd); 129b45122fdSSimon Glass return -EIO; 130b45122fdSSimon Glass } 131b45122fdSSimon Glass os_close(fd); 132b45122fdSSimon Glass 133b45122fdSSimon Glass done: 134b45122fdSSimon Glass gd->fdt_blob = blob; 135b45122fdSSimon Glass 136b45122fdSSimon Glass return 0; 137b45122fdSSimon Glass } 138