- First stab at getting the ppc ports building and working.
[coreboot.git] / src / mainboard / motorola / sandpointx3_altimus_mpc7410 / nvram / nvram.c
1 /* Copyright 2000  AG Electronics Ltd. */
2 /* This code is distributed without warranty under the GPL v2 (see COPYING) */
3
4 #include <console/console.h>
5 #include <stdlib.h>
6 #include "../nvram.h"
7
8 /* NVRAM layout
9  * 
10  * Environment variable record runs:
11  * [length]NAME=value[length]NAME=value[0]\0
12  * A deleted variable is:
13  * [length]\0AME=value
14  * 
15  * When memory is full, we compact.
16  * 
17  */
18 static nvram_device *nvram_dev = 0;
19 static unsigned char *nvram_buffer = 0;
20 static unsigned nvram_size = 0;
21 static uint8_t nvram_csum = 0;
22 #define NVRAM_INVALID (! nvram_dev)
23
24 static void update_device(unsigned i, unsigned char data)
25 {
26     if (i < nvram_size)
27     {
28         nvram_csum -= nvram_buffer[i];
29         nvram_buffer[i] = data;
30         nvram_dev->write_byte(nvram_dev, i, data);
31         nvram_csum += data;
32     }
33     else
34         printk_info("Offset %d out of range in nvram\n", i);
35 }
36
37 static void update_csum(void)
38 {
39     nvram_dev->write_byte(nvram_dev, nvram_size, nvram_csum);
40     if (nvram_dev->commit)
41         nvram_dev->commit(nvram_dev);
42 }
43
44 static void update_string_device(unsigned i, const unsigned char *data,
45                             unsigned len)
46 {
47     if (i + len < nvram_size)
48     {
49         unsigned j;
50         for(j = 0; j < len; j++)
51         {
52             nvram_csum -= nvram_buffer[i];
53             nvram_buffer[i] = *data;
54             nvram_dev->write_byte(nvram_dev, i, *data);
55             nvram_csum += *data;
56             data++;
57             i++;
58         }   
59     }
60     else
61         printk_info("Offset %d out of range in nvram\n", i + len);
62 }
63
64 int nvram_init (struct nvram_device *dev)
65 {
66     nvram_dev = dev;
67     
68     if (! nvram_size)
69         nvram_size = dev->size(dev) - 1;
70     printk_info("NVRAM size is %d\n", nvram_size);
71     if (!nvram_buffer)
72     {
73         unsigned i;
74         
75         nvram_buffer = malloc (nvram_size);
76         if (!nvram_buffer)
77             return -1;
78
79         nvram_csum = 0;
80         dev->read_block(dev, 0, nvram_buffer, nvram_size+1);
81         for(i = 0; i < nvram_size; i++)
82             nvram_csum += nvram_buffer[i];
83
84         if (nvram_csum != nvram_buffer[nvram_size])
85         {
86             printk_info("NVRAM checksum invalid - erasing\n");
87             //update_device(0, 0);
88             //update_csum();
89         }
90     }
91     printk_info("Initialised nvram\n");
92     return 0;
93 }
94
95 void nvram_clear(void)
96 {
97     printk_info("Erasing NVRAM\n");
98     update_device(0, 0);
99     update_csum();    
100 }
101