bootmode: normal: remove duplicated macro
[profile/mobile/platform/kernel/u-boot-tm1.git] / nvitem / nvitem_buf.c
1 \r
2 #include "nvitem_common.h"\r
3 #include "nvitem_os.h"\r
4 #include "nvitem_config.h"\r
5 #include "nvitem_buf.h"\r
6 #include "nvitem_fs.h"\r
7 \r
8 typedef struct\r
9 {\r
10         uint8*  diskbuf;                                                                // ramdisk buf\r
11         uint32  dirty[RAMNV_DIRTYTABLE_MAXSIZE];        // dirty bits, one bits indicate one sect\r
12 }_RAMNV_BUF_CTRL;\r
13 \r
14 typedef struct\r
15 {\r
16 // disk partition id\r
17         uint32  partId;\r
18         uint32  sctNum;                                                         // total number of sector in current disk\r
19 // disk buffer\r
20         _RAMNV_BUF_CTRL fromChannel;\r
21         _RAMNV_BUF_CTRL backup;\r
22         _RAMNV_BUF_CTRL toDisk;\r
23 // fs handle\r
24         RAMDISK_HANDLE  fdhandle;\r
25 }_RAMNV_PART_CTRL;\r
26 \r
27 typedef struct\r
28 {\r
29         uint32 partNum;\r
30         _RAMNV_PART_CTRL part[RAMNV_NUM];\r
31 }_RAMNV_CTL;\r
32 \r
33 static _RAMNV_CTL ramNvCtl;\r
34 \r
35 \r
36 //----------------------------\r
37 //      init buffer module\r
38 //----------------------------\r
39 void initBuf(void)\r
40 {\r
41         uint32 i,k;\r
42         const RAM_NV_CONFIG* config;\r
43 \r
44         ramNvCtl.partNum = 0;\r
45         for(i = 0; i < RAMNV_NUM; i++)\r
46         {\r
47                 ramNvCtl.part[i].sctNum = 0;\r
48                 for(k = 0; k < RAMNV_DIRTYTABLE_MAXSIZE; k++)\r
49                 {\r
50                         ramNvCtl.part[i].fromChannel.dirty[k] = 0;\r
51                         ramNvCtl.part[i].backup.dirty[k] = 0;\r
52                         ramNvCtl.part[i].toDisk.dirty[k] = 0;\r
53                 }\r
54         }\r
55 \r
56         config = ramDisk_Init();\r
57 \r
58         i = 0;\r
59         while(config->partId)\r
60         {\r
61 //------------------------------------------------------------\r
62                 ramNvCtl.part[i].fdhandle = ramDisk_Open(config->partId);\r
63 //------------------------------------------------------------\r
64                 if(0 == ramNvCtl.part[i].fdhandle)\r
65                 {\r
66                         config++;\r
67                         continue;\r
68                 }\r
69                 ramNvCtl.part[i].partId                                 = config->partId;\r
70                 ramNvCtl.part[i].sctNum                         = config->image_size/RAMNV_SECT_SIZE;\r
71                 ramNvCtl.part[i].fromChannel.diskbuf            = malloc(config->image_size+512);\r
72                 ramNvCtl.part[i].backup.diskbuf                 = malloc(config->image_size+512);\r
73                 ramNvCtl.part[i].toDisk.diskbuf                 = malloc(config->image_size+512);\r
74 //---for test---\r
75                 memset(ramNvCtl.part[i].fromChannel.diskbuf, 0, config->image_size);\r
76 //------------\r
77 //------------------------------------------------------------\r
78                 if(!ramDisk_Read(ramNvCtl.part[i].fdhandle, ramNvCtl.part[i].fromChannel.diskbuf, config->image_size))\r
79 //------------------------------------------------------------\r
80                 {\r
81                         free(ramNvCtl.part[i].fromChannel.diskbuf);\r
82                         free(ramNvCtl.part[i].backup.diskbuf);\r
83                         free(ramNvCtl.part[i].toDisk.diskbuf);\r
84                         config++;\r
85                         continue;\r
86                 }\r
87                 memcpy(ramNvCtl.part[i].backup.diskbuf,ramNvCtl.part[i].fromChannel.diskbuf,config->image_size+512);\r
88                 memcpy(ramNvCtl.part[i].toDisk.diskbuf,ramNvCtl.part[i].fromChannel.diskbuf,config->image_size+512);\r
89 //              backupData(i);\r
90                 ramNvCtl.partNum++;\r
91                 i++;\r
92                 config++;\r
93         }\r
94 }\r
95 \r
96 //----------------------------\r
97 //      uninit buffer module\r
98 //----------------------------\r
99 void uninitBuf(void)\r
100 {\r
101         uint32 i;\r
102 \r
103         for(i = 0; i < ramNvCtl.partNum; i++)\r
104         {\r
105                 ramDisk_Close(ramNvCtl.part[i].fdhandle);\r
106                 ramNvCtl.part[i].sctNum = 0;\r
107 //              for(k = 0; k < RAMNV_DIRTYTABLE_MAXSIZE; k++)\r
108 //              {\r
109 //                      ramNvCtl.part[i].fromChannel.dirty[k] = 0;\r
110 //                      ramNvCtl.part[i].backup.dirty[k] = 0;\r
111 //                      ramNvCtl.part[i].toDisk.dirty[k] = 0;\r
112 //              }\r
113                 if(ramNvCtl.part[i].fromChannel.diskbuf)        {free(ramNvCtl.part[i].fromChannel.diskbuf);}\r
114                 if(ramNvCtl.part[i].backup.diskbuf)             {free(ramNvCtl.part[i].backup.diskbuf);}\r
115                 if(ramNvCtl.part[i].toDisk.diskbuf)             {free(ramNvCtl.part[i].toDisk.diskbuf);}\r
116         }\r
117         ramNvCtl.partNum = 0;\r
118 }\r
119 \r
120 //----------------------------\r
121 //      partId to index of control array\r
122 //----------------------------\r
123 uint32 getCtlId(uint32 partId)\r
124 {\r
125         uint32 i;\r
126 \r
127         for(i = 0; i < ramNvCtl.partNum; i++)\r
128         {\r
129                 if(partId == ramNvCtl.part[i].partId)\r
130                 {\r
131                         return i;\r
132                 }\r
133         }\r
134         return (uint32)-1;\r
135 }\r
136 //----------------------------\r
137 // to "fromChannel" buffer\r
138 // unit is sector\r
139 //----------------------------\r
140 /*PASS*/\r
141 #define _U32MASK ((uint32)(-1))                 // 0xFFFFFFFF\r
142 #define _DIRTY_TABLE            (ramNvCtl.part[id].fromChannel.dirty)\r
143 void _markDirtyInfo(uint32 id, /*IN*/uint32 start, /*IN*/uint32 scts)\r
144 {\r
145         uint32 _bytes;\r
146         uint32 _bits;\r
147 \r
148         _bytes = start >> 5;                            // _bytes = start/32;\r
149         _bits = start - (_bytes<<5);            // _bits = start%32;\r
150 \r
151         while((32-_bits) < scts)\r
152         {\r
153                 _DIRTY_TABLE[_bytes] |= (_U32MASK << _bits);\r
154                 scts -= (32-_bits);\r
155                 _bytes++;\r
156                 _bits = 0;\r
157         }\r
158         _DIRTY_TABLE[_bytes] |= ((_U32MASK>>(32-scts))<<_bits);\r
159 }\r
160 #undef _DIRTY_TABLE\r
161 \r
162 #define _DIRTY_TABLE            (ramNvCtl.part[id].backup.dirty)\r
163 static BOOLEAN __ifHasDirty(uint32 id)\r
164 {\r
165         uint32 i;\r
166         for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)\r
167         {\r
168                 if(_DIRTY_TABLE[i])\r
169                 {\r
170                         return 1;\r
171                 }\r
172         }\r
173         return 0;\r
174 }\r
175 #undef _DIRTY_TABLE\r
176 \r
177 //----------------------------\r
178 // to "fromChannel" buffer\r
179 // unit is bytes\r
180 //----------------------------\r
181 void writeData(uint32 id,  uint32 start, uint32 bytesLen, uint8* buf)\r
182 {\r
183         if(bytesLen)\r
184         {\r
185                 memcpy(&ramNvCtl.part[id].fromChannel.diskbuf[start], buf, bytesLen);\r
186         }\r
187 }\r
188 \r
189 //----------------------------\r
190 // fromChannel -> backup\r
191 //----------------------------\r
192 BOOLEAN backupData(uint32 id)\r
193 {\r
194         uint32 i;\r
195 \r
196         getMutex();\r
197 \r
198         memcpy(ramNvCtl.part[id].backup.diskbuf, ramNvCtl.part[id].fromChannel.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);\r
199         for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)\r
200         {\r
201                 ramNvCtl.part[id].backup.dirty[i] |= ramNvCtl.part[id].fromChannel.dirty[i] ;\r
202         }\r
203 \r
204         putMutex();\r
205         giveEvent();\r
206 \r
207 //---for test---\r
208         __getData(id);\r
209         return ramDisk_Write(ramNvCtl.part[id].fdhandle, ramNvCtl.part[id].toDisk.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);\r
210 //------------\r
211         return 1;\r
212 }\r
213 \r
214 //----------------------------\r
215 // backup -> fromChannel\r
216 //----------------------------\r
217 void restoreData(uint32 id)\r
218 {\r
219         getMutex();\r
220 \r
221         memcpy(ramNvCtl.part[id].fromChannel.diskbuf, ramNvCtl.part[id].backup.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);\r
222         memcpy(ramNvCtl.part[id].fromChannel.dirty, ramNvCtl.part[id].backup.dirty, RAMNV_DIRTYTABLE_MAXSIZE*sizeof(uint32));\r
223 \r
224         putMutex();\r
225         return;\r
226 }\r
227 \r
228 //----------------------------\r
229 // backup -> toDisk\r
230 //----------------------------\r
231 void __getData(uint32 id)\r
232 {\r
233         uint32 i;\r
234 \r
235         getMutex();\r
236 \r
237         memcpy(ramNvCtl.part[id].toDisk.diskbuf, ramNvCtl.part[id].backup.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);\r
238         for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)\r
239         {\r
240                 ramNvCtl.part[id].toDisk.dirty[i] |= ramNvCtl.part[id].backup.dirty[i] ;\r
241                 ramNvCtl.part[id].backup.dirty[i]  = 0;\r
242         }\r
243 \r
244         putMutex();\r
245         return;\r
246 }\r
247 \r
248 void saveToDisk(void)\r
249 {\r
250         uint32 id,i;\r
251 \r
252         for(id = 0; id <ramNvCtl.partNum; id++)\r
253         {\r
254                 if(__ifHasDirty(id))\r
255                 {\r
256                         __getData(id);\r
257                         if(ramDisk_Write(ramNvCtl.part[id].fdhandle, ramNvCtl.part[id].toDisk.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum))\r
258                         {\r
259                                 // clean dirty bit of toDiskBuf\r
260                                         for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)\r
261                                         {\r
262                                                 ramNvCtl.part[id].toDisk.dirty[i]  = 0;\r
263                                         }\r
264                         }\r
265                 }\r
266         }\r
267 }\r
268         \r