http://downloads.netgear.com/files/GPL/GPL_Source_V361j_DM111PSP_series_consumer_rele...
[bcm963xx.git] / kernel / linux / arch / arm / boot / compressed / hw-bse.c
1 /*
2  * Bright Star Engineering Inc.
3  *
4  * code for readng parameters from the
5  * parameter blocks of the boot block
6  * flash memory
7  *
8  */
9
10 static int strcmp(const char *s1, const char *s2)
11 {
12   while (*s1 != '\0' && *s1 == *s2)
13     {
14       s1++;
15       s2++;
16     }
17
18   return (*(unsigned char *) s1) - (*(unsigned char *) s2);
19 }
20
21 struct pblk_t {
22   char type;
23   unsigned short size;
24 };
25
26 static char *bse_getflashparam(char *name) {
27   unsigned int esize;
28   char *q,*r;
29   unsigned char *p,*e;
30   struct pblk_t *thepb = (struct pblk_t *) 0x00004000;
31   struct pblk_t *altpb = (struct pblk_t *) 0x00006000;  
32   if (thepb->type&1) {
33     if (altpb->type&1) {
34       /* no valid param block */ 
35       return (char*)0;
36     } else {
37       /* altpb is valid */
38       struct pblk_t *tmp;
39       tmp = thepb;
40       thepb = altpb;
41       altpb = tmp;
42     }
43   }
44   p = (char*)thepb + sizeof(struct pblk_t);
45   e = p + thepb->size; 
46   while (p < e) {
47     q = p;
48     esize = *p;
49     if (esize == 0xFF) break;
50     if (esize == 0) break;
51     if (esize > 127) {
52       esize = (esize&0x7F)<<8 | p[1];
53       q++;
54     }
55     q++;
56     r=q;
57     if (*r && ((name == 0) || (!strcmp(name,r)))) {
58       while (*q++) ;
59       return q;
60     }
61     p+=esize;
62   }
63   return (char*)0;
64 }
65
66 void bse_setup(void) {
67   /* extract the linux cmdline from flash */
68   char *name=bse_getflashparam("linuxboot");
69   char *x = (char *)0xc0000100;
70   if (name) { 
71     while (*name) *x++=*name++;
72   }
73   *x=0;
74 }