thor: fix invalid larger device descriptor than requested
[profile/mobile/platform/kernel/u-boot-tm1.git] / common / idh_layout.c
1 #include <common.h>
2 #include <config.h>
3 #include <linux/types.h>
4 #include <asm/arch/bits.h>
5 #include <linux/string.h>
6 #include <linux/mtd/mtd.h>
7 #include <linux/mtd/nand.h>
8 #include <nand.h>
9 #include <malloc.h>
10
11 #define MTDPARTS_MAXLEN         (512)
12 #define PARTITION_NAME_LEN      (20)
13 #define UNDEFINE_PARTITION_LEN  (0xffffffff)
14
15 typedef struct _MTD_PARTITION_STRUCT
16 {
17         unsigned char   name[PARTITION_NAME_LEN];
18         unsigned long   size; /* KiB */
19
20 } MTD_PARTITION_T;
21
22 #ifndef MTDPARTS_DEFAULT
23 static unsigned long nandsize = 0;
24 #endif
25 unsigned char mtdpartbuffer[MTDPARTS_MAXLEN] = "mtdparts=sprd-nand:256k(spl),512k(2ndbl),256k(params),512k(vmjaluna),10m(modem),3840k(fixnv),3840k(backupfixnv),5120k(dsp),3840k(runtimenv),10m(boot),10m(recovery),250m(system),180m(userdata),20m(cache),256k(misc),1m(boot_logo),1m(fastboot_logo),3840k(productinfo),512k(kpanic)";
26
27 static MTD_PARTITION_T mtd_partition_cfg[] = {
28         {"spl",                 256},
29         {"2ndbl",               512},
30         {"params",              256},
31         {"vmjaluna",            512},
32         {"modem",               10 * 1024},
33         {"fixnv",               3840},
34         {"backupfixnv",         3840},
35         {"dsp",                 5120},
36         {"runtimenv",           3840},
37         {"boot",                10 * 1024},
38         {"recovery",            10 * 1024},
39         {"system",              250 * 1024},
40         {"userdata",            UNDEFINE_PARTITION_LEN},
41         {"cache",               UNDEFINE_PARTITION_LEN},
42         {"misc",                256},
43         {"boot_logo",           1 * 1024},
44         {"fastboot_logo",       1 * 1024},
45         {"productinfo",         3840},
46         {"kpanic",              512},
47         {"",                    0}
48 };
49
50 void create_mtdpart_buffer(unsigned long nandsize, unsigned long realsize)
51 {
52         unsigned long i;
53         unsigned long str_len;
54         
55         i = 0;
56         while (strcmp((char *)mtd_partition_cfg[i].name, "cache") != 0)
57                 i++;
58
59         if (nandsize <= (512 * 1024))
60                 mtd_partition_cfg[i].size = 20 * 1024;
61         else if (nandsize <= (1024 * 1024))
62                 mtd_partition_cfg[i].size = 130 * 1024;
63         realsize += mtd_partition_cfg[i].size;
64         
65         i = 0;
66         while (strcmp((char *)mtd_partition_cfg[i].name, "userdata") != 0)
67                 i++;
68
69         if (nandsize <= (512 * 1024))
70                 mtd_partition_cfg[i].size = 180 * 1024; /* 180 MiB */
71         else if (nandsize <= (1024 * 1024))
72                 mtd_partition_cfg[i].size = (nandsize - realsize) / 1024 * 1024; /* allign to MiB */
73
74         i = 0;
75         /*while (mtd_partition_cfg[i].size) {
76                 printf("i = %d  name = %s  size = %d\n", i, mtd_partition_cfg[i].name, mtd_partition_cfg[i].size);
77                 i++;
78         }*/
79
80         memset(mtdpartbuffer, 0, MTDPARTS_MAXLEN);
81         sprintf((char *)mtdpartbuffer, "mtdparts=sprd-nand:");
82         str_len = strlen((char *)mtdpartbuffer);
83         i = 0;
84         while (mtd_partition_cfg[i].size) {
85                 sprintf((char *)&mtdpartbuffer[str_len], "%luk(%s),", mtd_partition_cfg[i].size, (char *)mtd_partition_cfg[i].name);
86                 str_len = strlen((char *)mtdpartbuffer);
87                 i++;
88         }
89         str_len = strlen((char *)mtdpartbuffer);
90         mtdpartbuffer[str_len - 1] = '\0'; /* delete the last , */
91 }
92
93 char *get_mtdparts(void)
94 {
95 #if defined(MTDPARTS_DEFAULT)
96         return MTDPARTS_DEFAULT;
97 #else
98         unsigned long i, realsize;
99
100         if (nandsize == 0) {
101                 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
102                         nandsize += nand_info[i].size; /* Bytes */
103
104                 nandsize = nandsize / 1024; /* KiB */
105
106                 i = 0;
107                 realsize = 0;
108                 while (mtd_partition_cfg[i].size) {
109                         if (mtd_partition_cfg[i].size != UNDEFINE_PARTITION_LEN)
110                                 realsize += mtd_partition_cfg[i].size;
111                         i++;
112                 }
113
114                 if (realsize >= nandsize)
115                         printf("\nmtd_partition_cfg error, use default mtd partition table\n");
116                 else
117                         create_mtdpart_buffer(nandsize, realsize);
118         } /* if (nandsize == 0) */
119
120         return mtdpartbuffer;
121 #endif
122 }
123
124 int get_cal_enum_ms(void)
125 {
126     return CALIBRATE_ENUM_MS;
127 }
128 int get_cal_io_ms(void)
129 {
130     return CALIBRATE_IO_MS;
131 }
132 unsigned int get_bat_low_level(void)
133 {
134     return LOW_BAT_VOL;
135 }
136 unsigned int get_bat_low_level_chg(void)
137 {
138         return LOW_BAT_VOL_CHG;
139 }
140
141
142 unsigned int get_pwr_key_cnt(void)
143 {
144 #if defined(CONFIG_FPGA)
145     return 0;
146 #else
147     return PWR_KEY_DETECT_CNT;
148 #endif
149 }
150
151 unsigned int get_alarm_lead_set(void)
152 {
153     return ALARM_LEAD_SET_MS;
154 }