xref: /rk3399_rockchip-uboot/arch/sandbox/cpu/cpu.c (revision 9569c40668290408eac447f9be99dab603c8e34c)
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