void env_relocate_spec(void)
 {
        struct mtd_info *mtd = &onenand_mtd;
+       struct onenand_chip *this = &onenand_chip;
        loff_t env_addr;
        int use_default = 0;
        size_t retlen;
 
        env_addr = CONFIG_ENV_ADDR;
+       if (FLEXONENAND(this))
+               env_addr = CONFIG_ENV_ADDR_FLEX;
 
        /* Check OneNAND exist */
        if (mtd->writesize)
 int saveenv(void)
 {
        struct mtd_info *mtd = &onenand_mtd;
+       struct onenand_chip *this = &onenand_chip;
        loff_t env_addr = CONFIG_ENV_ADDR;
        struct erase_info instr = {
                .callback       = NULL,
        size_t retlen;
 
        instr.len = CONFIG_ENV_SIZE;
+       if (FLEXONENAND(this)) {
+               env_addr = CONFIG_ENV_ADDR_FLEX;
+               instr.len = CONFIG_ENV_SIZE_FLEX;
+               instr.len <<= onenand_mtd.eraseregions[0].numblocks == 1 ?
+                               1 : 0;
+       }
        instr.addr = env_addr;
        instr.mtd = mtd;
        if (mtd->erase(mtd, &instr)) {
 
  * Size of malloc() pool
  */
 #define        CONFIG_ENV_SIZE SZ_128K /* Total Size of Environment Sector */
+#define CONFIG_ENV_SIZE_FLEX SZ_256K
 #define        CONFIG_SYS_MALLOC_LEN   (CONFIG_ENV_SIZE + SZ_1M)
 /* bytes reserved for initial data */
 #define        CONFIG_SYS_GBL_DATA_SIZE        128
 #define CONFIG_SYS_MONITOR_LEN         SZ_256K /* U-Boot image size */
 #define        CONFIG_ENV_IS_IN_ONENAND        1
 #define CONFIG_ENV_ADDR                0x00020000
+#define CONFIG_ENV_ADDR_FLEX   0x00040000
 
 #define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */