14b0730d2SSimon Glass /* 24b0730d2SSimon Glass * Copyright (c) 2011 The Chromium OS Authors. 31a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 44b0730d2SSimon Glass */ 5*9569c406SSimon Glass #define DEBUG 64b0730d2SSimon Glass #include <common.h> 761336833SSimon Glass #include <dm/root.h> 87a9219c1SSimon Glass #include <os.h> 95c2859cdSSimon Glass #include <asm/state.h> 104b0730d2SSimon Glass 114b0730d2SSimon Glass DECLARE_GLOBAL_DATA_PTR; 124b0730d2SSimon Glass 13*9569c406SSimon Glass /* Enable access to PCI memory with map_sysmem() */ 14*9569c406SSimon Glass static bool enable_pci_map; 15*9569c406SSimon Glass 16*9569c406SSimon Glass #ifdef CONFIG_PCI 17*9569c406SSimon Glass /* Last device that was mapped into memory, and length of mapping */ 18*9569c406SSimon Glass static struct udevice *map_dev; 19*9569c406SSimon Glass unsigned long map_len; 20*9569c406SSimon Glass #endif 21*9569c406SSimon Glass 2288bd0e9dSSimon Glass void reset_cpu(ulong ignored) 234b0730d2SSimon Glass { 245c2859cdSSimon Glass if (state_uninit()) 255c2859cdSSimon Glass os_exit(2); 265c2859cdSSimon Glass 2761336833SSimon Glass if (dm_uninit()) 2861336833SSimon Glass os_exit(2); 2961336833SSimon Glass 307a9219c1SSimon Glass /* This is considered normal termination for now */ 317a9219c1SSimon Glass os_exit(0); 3288bd0e9dSSimon Glass } 3388bd0e9dSSimon Glass 3488bd0e9dSSimon Glass int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3588bd0e9dSSimon Glass { 3688bd0e9dSSimon Glass reset_cpu(0); 3788bd0e9dSSimon Glass 384b0730d2SSimon Glass return 0; 394b0730d2SSimon Glass } 404b0730d2SSimon Glass 414b0730d2SSimon Glass /* delay x useconds */ 424b0730d2SSimon Glass void __udelay(unsigned long usec) 434b0730d2SSimon Glass { 44d99a6874SMatthias Weisser os_usleep(usec); 454b0730d2SSimon Glass } 464b0730d2SSimon Glass 47e2ee100fSSimon Glass unsigned long __attribute__((no_instrument_function)) timer_get_us(void) 484b0730d2SSimon Glass { 49d99a6874SMatthias Weisser return os_get_nsec() / 1000; 504b0730d2SSimon Glass } 514b0730d2SSimon Glass 524b0730d2SSimon Glass int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) 534b0730d2SSimon Glass { 5488bd0e9dSSimon Glass if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) { 5588bd0e9dSSimon Glass bootstage_mark(BOOTSTAGE_ID_RUN_OS); 5688bd0e9dSSimon Glass printf("## Transferring control to Linux (at address %08lx)...\n", 5788bd0e9dSSimon Glass images->ep); 5888bd0e9dSSimon Glass reset_cpu(0); 5988bd0e9dSSimon Glass } 6088bd0e9dSSimon Glass 6188bd0e9dSSimon Glass return 0; 624b0730d2SSimon Glass } 634b0730d2SSimon Glass 644b0730d2SSimon Glass int cleanup_before_linux(void) 654b0730d2SSimon Glass { 664b0730d2SSimon Glass return 0; 674b0730d2SSimon Glass } 684b0730d2SSimon Glass 694b0730d2SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) 704b0730d2SSimon Glass { 71*9569c406SSimon Glass #ifdef CONFIG_PCI 72*9569c406SSimon Glass unsigned long plen = len; 73*9569c406SSimon Glass void *ptr; 74*9569c406SSimon Glass 75*9569c406SSimon Glass map_dev = NULL; 76*9569c406SSimon Glass if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) { 77*9569c406SSimon Glass if (plen != len) { 78*9569c406SSimon Glass printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n", 79*9569c406SSimon Glass __func__, paddr, len, plen); 80*9569c406SSimon Glass } 81*9569c406SSimon Glass map_len = len; 82*9569c406SSimon Glass return ptr; 83*9569c406SSimon Glass } 84*9569c406SSimon Glass #endif 85*9569c406SSimon Glass 868ee666a7SSimon Glass return (void *)(gd->arch.ram_buf + paddr); 874b0730d2SSimon Glass } 884b0730d2SSimon Glass 89*9569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags) 90*9569c406SSimon Glass { 91*9569c406SSimon Glass #ifdef CONFIG_PCI 92*9569c406SSimon Glass if (map_dev) { 93*9569c406SSimon Glass pci_unmap_physmem(vaddr, map_len, map_dev); 94*9569c406SSimon Glass map_dev = NULL; 95*9569c406SSimon Glass } 96*9569c406SSimon Glass #endif 97*9569c406SSimon Glass } 98*9569c406SSimon Glass 99*9569c406SSimon Glass void sandbox_set_enable_pci_map(int enable) 100*9569c406SSimon Glass { 101*9569c406SSimon Glass enable_pci_map = enable; 102*9569c406SSimon Glass } 103*9569c406SSimon Glass 10466bd1cffSSimon Glass phys_addr_t map_to_sysmem(const void *ptr) 105781adb57SSimon Glass { 106781adb57SSimon Glass return (u8 *)ptr - gd->arch.ram_buf; 107781adb57SSimon Glass } 108781adb57SSimon Glass 1094b0730d2SSimon Glass void flush_dcache_range(unsigned long start, unsigned long stop) 1104b0730d2SSimon Glass { 1114b0730d2SSimon Glass } 112