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> 9*b45122fdSSimon 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 { 255c2859cdSSimon Glass if (state_uninit()) 265c2859cdSSimon Glass os_exit(2); 275c2859cdSSimon Glass 2861336833SSimon Glass if (dm_uninit()) 2961336833SSimon Glass os_exit(2); 3061336833SSimon Glass 317a9219c1SSimon Glass /* This is considered normal termination for now */ 327a9219c1SSimon Glass os_exit(0); 3388bd0e9dSSimon Glass } 3488bd0e9dSSimon Glass 3588bd0e9dSSimon Glass int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3688bd0e9dSSimon Glass { 3788bd0e9dSSimon Glass reset_cpu(0); 3888bd0e9dSSimon Glass 394b0730d2SSimon Glass return 0; 404b0730d2SSimon Glass } 414b0730d2SSimon Glass 424b0730d2SSimon Glass /* delay x useconds */ 434b0730d2SSimon Glass void __udelay(unsigned long usec) 444b0730d2SSimon Glass { 45d99a6874SMatthias Weisser os_usleep(usec); 464b0730d2SSimon Glass } 474b0730d2SSimon Glass 48e2ee100fSSimon Glass unsigned long __attribute__((no_instrument_function)) timer_get_us(void) 494b0730d2SSimon Glass { 50d99a6874SMatthias Weisser return os_get_nsec() / 1000; 514b0730d2SSimon Glass } 524b0730d2SSimon Glass 534b0730d2SSimon Glass int cleanup_before_linux(void) 544b0730d2SSimon Glass { 554b0730d2SSimon Glass return 0; 564b0730d2SSimon Glass } 574b0730d2SSimon Glass 584b0730d2SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) 594b0730d2SSimon Glass { 609569c406SSimon Glass #ifdef CONFIG_PCI 619569c406SSimon Glass unsigned long plen = len; 629569c406SSimon Glass void *ptr; 639569c406SSimon Glass 649569c406SSimon Glass map_dev = NULL; 659569c406SSimon Glass if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) { 669569c406SSimon Glass if (plen != len) { 679569c406SSimon Glass printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n", 689569c406SSimon Glass __func__, paddr, len, plen); 699569c406SSimon Glass } 709569c406SSimon Glass map_len = len; 719569c406SSimon Glass return ptr; 729569c406SSimon Glass } 739569c406SSimon Glass #endif 749569c406SSimon Glass 758ee666a7SSimon Glass return (void *)(gd->arch.ram_buf + paddr); 764b0730d2SSimon Glass } 774b0730d2SSimon Glass 789569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags) 799569c406SSimon Glass { 809569c406SSimon Glass #ifdef CONFIG_PCI 819569c406SSimon Glass if (map_dev) { 829569c406SSimon Glass pci_unmap_physmem(vaddr, map_len, map_dev); 839569c406SSimon Glass map_dev = NULL; 849569c406SSimon Glass } 859569c406SSimon Glass #endif 869569c406SSimon Glass } 879569c406SSimon Glass 889569c406SSimon Glass void sandbox_set_enable_pci_map(int enable) 899569c406SSimon Glass { 909569c406SSimon Glass enable_pci_map = enable; 919569c406SSimon Glass } 929569c406SSimon Glass 9366bd1cffSSimon Glass phys_addr_t map_to_sysmem(const void *ptr) 94781adb57SSimon Glass { 95781adb57SSimon Glass return (u8 *)ptr - gd->arch.ram_buf; 96781adb57SSimon Glass } 97781adb57SSimon Glass 984b0730d2SSimon Glass void flush_dcache_range(unsigned long start, unsigned long stop) 994b0730d2SSimon Glass { 1004b0730d2SSimon Glass } 101*b45122fdSSimon Glass 102*b45122fdSSimon Glass int sandbox_read_fdt_from_file(void) 103*b45122fdSSimon Glass { 104*b45122fdSSimon Glass struct sandbox_state *state = state_get_current(); 105*b45122fdSSimon Glass const char *fname = state->fdt_fname; 106*b45122fdSSimon Glass void *blob; 107*b45122fdSSimon Glass loff_t size; 108*b45122fdSSimon Glass int err; 109*b45122fdSSimon Glass int fd; 110*b45122fdSSimon Glass 111*b45122fdSSimon Glass blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); 112*b45122fdSSimon Glass if (!state->fdt_fname) { 113*b45122fdSSimon Glass err = fdt_create_empty_tree(blob, 256); 114*b45122fdSSimon Glass if (!err) 115*b45122fdSSimon Glass goto done; 116*b45122fdSSimon Glass printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); 117*b45122fdSSimon Glass return -EINVAL; 118*b45122fdSSimon Glass } 119*b45122fdSSimon Glass 120*b45122fdSSimon Glass err = os_get_filesize(fname, &size); 121*b45122fdSSimon Glass if (err < 0) { 122*b45122fdSSimon Glass printf("Failed to file FDT file '%s'\n", fname); 123*b45122fdSSimon Glass return err; 124*b45122fdSSimon Glass } 125*b45122fdSSimon Glass fd = os_open(fname, OS_O_RDONLY); 126*b45122fdSSimon Glass if (fd < 0) { 127*b45122fdSSimon Glass printf("Failed to open FDT file '%s'\n", fname); 128*b45122fdSSimon Glass return -EACCES; 129*b45122fdSSimon Glass } 130*b45122fdSSimon Glass if (os_read(fd, blob, size) != size) { 131*b45122fdSSimon Glass os_close(fd); 132*b45122fdSSimon Glass return -EIO; 133*b45122fdSSimon Glass } 134*b45122fdSSimon Glass os_close(fd); 135*b45122fdSSimon Glass 136*b45122fdSSimon Glass done: 137*b45122fdSSimon Glass gd->fdt_blob = blob; 138*b45122fdSSimon Glass 139*b45122fdSSimon Glass return 0; 140*b45122fdSSimon Glass } 141