~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/common/env_nvram.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * (C) Copyright 2000-2010
 
3
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 
4
 *
 
5
 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
 
6
 * Andreas Heppel <aheppel@sysgo.de>
 
7
 
 
8
 * SPDX-License-Identifier:     GPL-2.0+
 
9
 */
 
10
 
 
11
/*
 
12
 * 09-18-2001 Andreas Heppel, Sysgo RTS GmbH <aheppel@sysgo.de>
 
13
 *
 
14
 * It might not be possible in all cases to use 'memcpy()' to copy
 
15
 * the environment to NVRAM, as the NVRAM might not be mapped into
 
16
 * the memory space. (I.e. this is the case for the BAB750). In those
 
17
 * cases it might be possible to access the NVRAM using a different
 
18
 * method. For example, the RTC on the BAB750 is accessible in IO
 
19
 * space using its address and data registers. To enable usage of
 
20
 * NVRAM in those cases I invented the functions 'nvram_read()' and
 
21
 * 'nvram_write()', which will be activated upon the configuration
 
22
 * #define CONFIG_SYS_NVRAM_ACCESS_ROUTINE. Note, that those functions are
 
23
 * strongly dependent on the used HW, and must be redefined for each
 
24
 * board that wants to use them.
 
25
 */
 
26
 
 
27
#include <common.h>
 
28
#include <command.h>
 
29
#include <environment.h>
 
30
#include <linux/stddef.h>
 
31
#include <search.h>
 
32
#include <errno.h>
 
33
 
 
34
DECLARE_GLOBAL_DATA_PTR;
 
35
 
 
36
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
 
37
extern void *nvram_read(void *dest, const long src, size_t count);
 
38
extern void nvram_write(long dest, const void *src, size_t count);
 
39
env_t *env_ptr;
 
40
#else
 
41
env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
 
42
#endif
 
43
 
 
44
char *env_name_spec = "NVRAM";
 
45
 
 
46
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
 
47
uchar env_get_char_spec(int index)
 
48
{
 
49
        uchar c;
 
50
 
 
51
        nvram_read(&c, CONFIG_ENV_ADDR + index, 1);
 
52
 
 
53
        return c;
 
54
}
 
55
#endif
 
56
 
 
57
void env_relocate_spec(void)
 
58
{
 
59
        char buf[CONFIG_ENV_SIZE];
 
60
 
 
61
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
 
62
        nvram_read(buf, CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
 
63
#else
 
64
        memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
 
65
#endif
 
66
        env_import(buf, 1);
 
67
}
 
68
 
 
69
int saveenv(void)
 
70
{
 
71
        env_t   env_new;
 
72
        int     rcode = 0;
 
73
 
 
74
        rcode = env_export(&env_new);
 
75
        if (rcode)
 
76
                return rcode;
 
77
 
 
78
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
 
79
        nvram_write(CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE);
 
80
#else
 
81
        if (memcpy((char *)CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE) == NULL)
 
82
                rcode = 1;
 
83
#endif
 
84
        return rcode;
 
85
}
 
86
 
 
87
/*
 
88
 * Initialize Environment use
 
89
 *
 
90
 * We are still running from ROM, so data use is limited
 
91
 */
 
92
int env_init(void)
 
93
{
 
94
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
 
95
        ulong crc;
 
96
        uchar data[ENV_SIZE];
 
97
 
 
98
        nvram_read(&crc, CONFIG_ENV_ADDR, sizeof(ulong));
 
99
        nvram_read(data, CONFIG_ENV_ADDR + sizeof(ulong), ENV_SIZE);
 
100
 
 
101
        if (crc32(0, data, ENV_SIZE) == crc) {
 
102
                gd->env_addr    = (ulong)CONFIG_ENV_ADDR + sizeof(long);
 
103
#else
 
104
        if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
 
105
                gd->env_addr    = (ulong)&env_ptr->data;
 
106
#endif
 
107
                gd->env_valid   = 1;
 
108
        } else {
 
109
                gd->env_addr    = (ulong)&default_environment[0];
 
110
                gd->env_valid   = 0;
 
111
        }
 
112
 
 
113
        return 0;
 
114
}