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 235010d98fSSimon Glass void sandbox_exit(void) 244b0730d2SSimon Glass { 258939df09SSimon Glass /* Do this here while it still has an effect */ 268939df09SSimon 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 374b0730d2SSimon Glass /* delay x useconds */ 384b0730d2SSimon Glass void __udelay(unsigned long usec) 394b0730d2SSimon Glass { 40*9723563aSSimon Glass struct sandbox_state *state = state_get_current(); 41*9723563aSSimon Glass 42*9723563aSSimon Glass if (!state->skip_delays) 43d99a6874SMatthias Weisser os_usleep(usec); 444b0730d2SSimon Glass } 454b0730d2SSimon Glass 464b0730d2SSimon Glass int cleanup_before_linux(void) 474b0730d2SSimon Glass { 484b0730d2SSimon Glass return 0; 494b0730d2SSimon Glass } 504b0730d2SSimon Glass 5129748515SSimon Glass int cleanup_before_linux_select(int flags) 5229748515SSimon Glass { 5329748515SSimon Glass return 0; 5429748515SSimon Glass } 5529748515SSimon Glass 564b0730d2SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) 574b0730d2SSimon Glass { 589569c406SSimon Glass #ifdef CONFIG_PCI 599569c406SSimon Glass unsigned long plen = len; 609569c406SSimon Glass void *ptr; 619569c406SSimon Glass 629569c406SSimon Glass map_dev = NULL; 639569c406SSimon Glass if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) { 649569c406SSimon Glass if (plen != len) { 659569c406SSimon Glass printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n", 669569c406SSimon Glass __func__, paddr, len, plen); 679569c406SSimon Glass } 689569c406SSimon Glass map_len = len; 699569c406SSimon Glass return ptr; 709569c406SSimon Glass } 719569c406SSimon Glass #endif 729569c406SSimon Glass 738ee666a7SSimon Glass return (void *)(gd->arch.ram_buf + paddr); 744b0730d2SSimon Glass } 754b0730d2SSimon Glass 769569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags) 779569c406SSimon Glass { 789569c406SSimon Glass #ifdef CONFIG_PCI 799569c406SSimon Glass if (map_dev) { 809569c406SSimon Glass pci_unmap_physmem(vaddr, map_len, map_dev); 819569c406SSimon Glass map_dev = NULL; 829569c406SSimon Glass } 839569c406SSimon Glass #endif 849569c406SSimon Glass } 859569c406SSimon Glass 869569c406SSimon Glass void sandbox_set_enable_pci_map(int enable) 879569c406SSimon Glass { 889569c406SSimon Glass enable_pci_map = enable; 899569c406SSimon Glass } 909569c406SSimon Glass 9166bd1cffSSimon Glass phys_addr_t map_to_sysmem(const void *ptr) 92781adb57SSimon Glass { 93781adb57SSimon Glass return (u8 *)ptr - gd->arch.ram_buf; 94781adb57SSimon Glass } 95781adb57SSimon Glass 964b0730d2SSimon Glass void flush_dcache_range(unsigned long start, unsigned long stop) 974b0730d2SSimon Glass { 984b0730d2SSimon Glass } 99b45122fdSSimon Glass 100b45122fdSSimon Glass int sandbox_read_fdt_from_file(void) 101b45122fdSSimon Glass { 102b45122fdSSimon Glass struct sandbox_state *state = state_get_current(); 103b45122fdSSimon Glass const char *fname = state->fdt_fname; 104b45122fdSSimon Glass void *blob; 105b45122fdSSimon Glass loff_t size; 106b45122fdSSimon Glass int err; 107b45122fdSSimon Glass int fd; 108b45122fdSSimon Glass 109b45122fdSSimon Glass blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); 110b45122fdSSimon Glass if (!state->fdt_fname) { 111b45122fdSSimon Glass err = fdt_create_empty_tree(blob, 256); 112b45122fdSSimon Glass if (!err) 113b45122fdSSimon Glass goto done; 114b45122fdSSimon Glass printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); 115b45122fdSSimon Glass return -EINVAL; 116b45122fdSSimon Glass } 117b45122fdSSimon Glass 118b45122fdSSimon Glass err = os_get_filesize(fname, &size); 119b45122fdSSimon Glass if (err < 0) { 120b45122fdSSimon Glass printf("Failed to file FDT file '%s'\n", fname); 121b45122fdSSimon Glass return err; 122b45122fdSSimon Glass } 123b45122fdSSimon Glass fd = os_open(fname, OS_O_RDONLY); 124b45122fdSSimon Glass if (fd < 0) { 125b45122fdSSimon Glass printf("Failed to open FDT file '%s'\n", fname); 126b45122fdSSimon Glass return -EACCES; 127b45122fdSSimon Glass } 128b45122fdSSimon Glass if (os_read(fd, blob, size) != size) { 129b45122fdSSimon Glass os_close(fd); 130b45122fdSSimon Glass return -EIO; 131b45122fdSSimon Glass } 132b45122fdSSimon Glass os_close(fd); 133b45122fdSSimon Glass 134b45122fdSSimon Glass done: 135b45122fdSSimon Glass gd->fdt_blob = blob; 136b45122fdSSimon Glass 137b45122fdSSimon Glass return 0; 138b45122fdSSimon Glass } 139