1 /* 2 * Copyright (c) 2011 The Chromium OS Authors. 3 * SPDX-License-Identifier: GPL-2.0+ 4 */ 5 #define DEBUG 6 #include <common.h> 7 #include <errno.h> 8 #include <libfdt.h> 9 #include <os.h> 10 #include <asm/io.h> 11 #include <asm/state.h> 12 #include <dm/root.h> 13 14 DECLARE_GLOBAL_DATA_PTR; 15 16 /* Enable access to PCI memory with map_sysmem() */ 17 static bool enable_pci_map; 18 19 #ifdef CONFIG_PCI 20 /* Last device that was mapped into memory, and length of mapping */ 21 static struct udevice *map_dev; 22 unsigned long map_len; 23 #endif 24 25 void sandbox_exit(void) 26 { 27 /* Do this here while it still has an effect */ 28 os_fd_restore(); 29 if (state_uninit()) 30 os_exit(2); 31 32 if (dm_uninit()) 33 os_exit(2); 34 35 /* This is considered normal termination for now */ 36 os_exit(0); 37 } 38 39 /* delay x useconds */ 40 void __udelay(unsigned long usec) 41 { 42 struct sandbox_state *state = state_get_current(); 43 44 if (!state->skip_delays) 45 os_usleep(usec); 46 } 47 48 int cleanup_before_linux(void) 49 { 50 return 0; 51 } 52 53 int cleanup_before_linux_select(int flags) 54 { 55 return 0; 56 } 57 58 void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) 59 { 60 #if defined(CONFIG_PCI) && !defined(CONFIG_SPL_BUILD) 61 unsigned long plen = len; 62 void *ptr; 63 64 map_dev = NULL; 65 if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) { 66 if (plen != len) { 67 printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n", 68 __func__, paddr, len, plen); 69 } 70 map_len = len; 71 return ptr; 72 } 73 #endif 74 75 return (void *)(gd->arch.ram_buf + paddr); 76 } 77 78 void unmap_physmem(const void *vaddr, unsigned long flags) 79 { 80 #ifdef CONFIG_PCI 81 if (map_dev) { 82 pci_unmap_physmem(vaddr, map_len, map_dev); 83 map_dev = NULL; 84 } 85 #endif 86 } 87 88 void sandbox_set_enable_pci_map(int enable) 89 { 90 enable_pci_map = enable; 91 } 92 93 phys_addr_t map_to_sysmem(const void *ptr) 94 { 95 return (u8 *)ptr - gd->arch.ram_buf; 96 } 97 98 void flush_dcache_range(unsigned long start, unsigned long stop) 99 { 100 } 101 102 int sandbox_read_fdt_from_file(void) 103 { 104 struct sandbox_state *state = state_get_current(); 105 const char *fname = state->fdt_fname; 106 void *blob; 107 loff_t size; 108 int err; 109 int fd; 110 111 blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); 112 if (!state->fdt_fname) { 113 err = fdt_create_empty_tree(blob, 256); 114 if (!err) 115 goto done; 116 printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); 117 return -EINVAL; 118 } 119 120 err = os_get_filesize(fname, &size); 121 if (err < 0) { 122 printf("Failed to file FDT file '%s'\n", fname); 123 return err; 124 } 125 fd = os_open(fname, OS_O_RDONLY); 126 if (fd < 0) { 127 printf("Failed to open FDT file '%s'\n", fname); 128 return -EACCES; 129 } 130 if (os_read(fd, blob, size) != size) { 131 os_close(fd); 132 return -EIO; 133 } 134 os_close(fd); 135 136 done: 137 gd->fdt_blob = blob; 138 139 return 0; 140 } 141