xref: /rk3399_rockchip-uboot/arch/sandbox/cpu/cpu.c (revision 8939df092e24abdf39edb6fbca90fe9c2b44c3b1)
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 
2388bd0e9dSSimon Glass void reset_cpu(ulong ignored)
244b0730d2SSimon Glass {
25*8939df09SSimon Glass 	/* Do this here while it still has an effect */
26*8939df09SSimon 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 
3788bd0e9dSSimon Glass int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
3888bd0e9dSSimon Glass {
3988bd0e9dSSimon Glass 	reset_cpu(0);
4088bd0e9dSSimon Glass 
414b0730d2SSimon Glass 	return 0;
424b0730d2SSimon Glass }
434b0730d2SSimon Glass 
444b0730d2SSimon Glass /* delay x useconds */
454b0730d2SSimon Glass void __udelay(unsigned long usec)
464b0730d2SSimon Glass {
47d99a6874SMatthias Weisser 	os_usleep(usec);
484b0730d2SSimon Glass }
494b0730d2SSimon Glass 
504b0730d2SSimon Glass int cleanup_before_linux(void)
514b0730d2SSimon Glass {
524b0730d2SSimon Glass 	return 0;
534b0730d2SSimon Glass }
544b0730d2SSimon Glass 
554b0730d2SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
564b0730d2SSimon Glass {
579569c406SSimon Glass #ifdef CONFIG_PCI
589569c406SSimon Glass 	unsigned long plen = len;
599569c406SSimon Glass 	void *ptr;
609569c406SSimon Glass 
619569c406SSimon Glass 	map_dev = NULL;
629569c406SSimon Glass 	if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) {
639569c406SSimon Glass 		if (plen != len) {
649569c406SSimon Glass 			printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n",
659569c406SSimon Glass 			       __func__, paddr, len, plen);
669569c406SSimon Glass 		}
679569c406SSimon Glass 		map_len = len;
689569c406SSimon Glass 		return ptr;
699569c406SSimon Glass 	}
709569c406SSimon Glass #endif
719569c406SSimon Glass 
728ee666a7SSimon Glass 	return (void *)(gd->arch.ram_buf + paddr);
734b0730d2SSimon Glass }
744b0730d2SSimon Glass 
759569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags)
769569c406SSimon Glass {
779569c406SSimon Glass #ifdef CONFIG_PCI
789569c406SSimon Glass 	if (map_dev) {
799569c406SSimon Glass 		pci_unmap_physmem(vaddr, map_len, map_dev);
809569c406SSimon Glass 		map_dev = NULL;
819569c406SSimon Glass 	}
829569c406SSimon Glass #endif
839569c406SSimon Glass }
849569c406SSimon Glass 
859569c406SSimon Glass void sandbox_set_enable_pci_map(int enable)
869569c406SSimon Glass {
879569c406SSimon Glass 	enable_pci_map = enable;
889569c406SSimon Glass }
899569c406SSimon Glass 
9066bd1cffSSimon Glass phys_addr_t map_to_sysmem(const void *ptr)
91781adb57SSimon Glass {
92781adb57SSimon Glass 	return (u8 *)ptr - gd->arch.ram_buf;
93781adb57SSimon Glass }
94781adb57SSimon Glass 
954b0730d2SSimon Glass void flush_dcache_range(unsigned long start, unsigned long stop)
964b0730d2SSimon Glass {
974b0730d2SSimon Glass }
98b45122fdSSimon Glass 
99b45122fdSSimon Glass int sandbox_read_fdt_from_file(void)
100b45122fdSSimon Glass {
101b45122fdSSimon Glass 	struct sandbox_state *state = state_get_current();
102b45122fdSSimon Glass 	const char *fname = state->fdt_fname;
103b45122fdSSimon Glass 	void *blob;
104b45122fdSSimon Glass 	loff_t size;
105b45122fdSSimon Glass 	int err;
106b45122fdSSimon Glass 	int fd;
107b45122fdSSimon Glass 
108b45122fdSSimon Glass 	blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
109b45122fdSSimon Glass 	if (!state->fdt_fname) {
110b45122fdSSimon Glass 		err = fdt_create_empty_tree(blob, 256);
111b45122fdSSimon Glass 		if (!err)
112b45122fdSSimon Glass 			goto done;
113b45122fdSSimon Glass 		printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
114b45122fdSSimon Glass 		return -EINVAL;
115b45122fdSSimon Glass 	}
116b45122fdSSimon Glass 
117b45122fdSSimon Glass 	err = os_get_filesize(fname, &size);
118b45122fdSSimon Glass 	if (err < 0) {
119b45122fdSSimon Glass 		printf("Failed to file FDT file '%s'\n", fname);
120b45122fdSSimon Glass 		return err;
121b45122fdSSimon Glass 	}
122b45122fdSSimon Glass 	fd = os_open(fname, OS_O_RDONLY);
123b45122fdSSimon Glass 	if (fd < 0) {
124b45122fdSSimon Glass 		printf("Failed to open FDT file '%s'\n", fname);
125b45122fdSSimon Glass 		return -EACCES;
126b45122fdSSimon Glass 	}
127b45122fdSSimon Glass 	if (os_read(fd, blob, size) != size) {
128b45122fdSSimon Glass 		os_close(fd);
129b45122fdSSimon Glass 		return -EIO;
130b45122fdSSimon Glass 	}
131b45122fdSSimon Glass 	os_close(fd);
132b45122fdSSimon Glass 
133b45122fdSSimon Glass done:
134b45122fdSSimon Glass 	gd->fdt_blob = blob;
135b45122fdSSimon Glass 
136b45122fdSSimon Glass 	return 0;
137b45122fdSSimon Glass }
138