uboot/arch/sandbox/cpu/cpu.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2011 The Chromium OS Authors.
   3 * SPDX-License-Identifier:     GPL-2.0+
   4 */
   5#define DEBUG
   6#include <common.h>
   7#include <dm/root.h>
   8#include <os.h>
   9#include <asm/io.h>
  10#include <asm/state.h>
  11
  12DECLARE_GLOBAL_DATA_PTR;
  13
  14/* Enable access to PCI memory with map_sysmem() */
  15static bool enable_pci_map;
  16
  17#ifdef CONFIG_PCI
  18/* Last device that was mapped into memory, and length of mapping */
  19static struct udevice *map_dev;
  20unsigned long map_len;
  21#endif
  22
  23void sandbox_exit(void)
  24{
  25        /* Do this here while it still has an effect */
  26        os_fd_restore();
  27        if (state_uninit())
  28                os_exit(2);
  29
  30        if (dm_uninit())
  31                os_exit(2);
  32
  33        /* This is considered normal termination for now */
  34        os_exit(0);
  35}
  36
  37/* delay x useconds */
  38void __udelay(unsigned long usec)
  39{
  40        struct sandbox_state *state = state_get_current();
  41
  42        if (!state->skip_delays)
  43                os_usleep(usec);
  44}
  45
  46int cleanup_before_linux(void)
  47{
  48        return 0;
  49}
  50
  51int cleanup_before_linux_select(int flags)
  52{
  53        return 0;
  54}
  55
  56void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
  57{
  58#ifdef CONFIG_PCI
  59        unsigned long plen = len;
  60        void *ptr;
  61
  62        map_dev = NULL;
  63        if (enable_pci_map && !pci_map_physmem(paddr, &len, &map_dev, &ptr)) {
  64                if (plen != len) {
  65                        printf("%s: Warning: partial map at %x, wanted %lx, got %lx\n",
  66                               __func__, paddr, len, plen);
  67                }
  68                map_len = len;
  69                return ptr;
  70        }
  71#endif
  72
  73        return (void *)(gd->arch.ram_buf + paddr);
  74}
  75
  76void unmap_physmem(const void *vaddr, unsigned long flags)
  77{
  78#ifdef CONFIG_PCI
  79        if (map_dev) {
  80                pci_unmap_physmem(vaddr, map_len, map_dev);
  81                map_dev = NULL;
  82        }
  83#endif
  84}
  85
  86void sandbox_set_enable_pci_map(int enable)
  87{
  88        enable_pci_map = enable;
  89}
  90
  91phys_addr_t map_to_sysmem(const void *ptr)
  92{
  93        return (u8 *)ptr - gd->arch.ram_buf;
  94}
  95
  96void flush_dcache_range(unsigned long start, unsigned long stop)
  97{
  98}
  99
 100int sandbox_read_fdt_from_file(void)
 101{
 102        struct sandbox_state *state = state_get_current();
 103        const char *fname = state->fdt_fname;
 104        void *blob;
 105        loff_t size;
 106        int err;
 107        int fd;
 108
 109        blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
 110        if (!state->fdt_fname) {
 111                err = fdt_create_empty_tree(blob, 256);
 112                if (!err)
 113                        goto done;
 114                printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
 115                return -EINVAL;
 116        }
 117
 118        err = os_get_filesize(fname, &size);
 119        if (err < 0) {
 120                printf("Failed to file FDT file '%s'\n", fname);
 121                return err;
 122        }
 123        fd = os_open(fname, OS_O_RDONLY);
 124        if (fd < 0) {
 125                printf("Failed to open FDT file '%s'\n", fname);
 126                return -EACCES;
 127        }
 128        if (os_read(fd, blob, size) != size) {
 129                os_close(fd);
 130                return -EIO;
 131        }
 132        os_close(fd);
 133
 134done:
 135        gd->fdt_blob = blob;
 136
 137        return 0;
 138}
 139