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