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