summaryrefslogtreecommitdiff
path: root/cleopatre/u-boot-1.1.6/common
diff options
context:
space:
mode:
authorOlivier Dufour2013-01-28 15:20:10 +0100
committerCyril Jourdan2013-01-31 15:36:12 +0100
commitd2a894a837599d008b6b76b062e0ddd87492149d (patch)
treede65a352dc9fe983574269a0a5dd8c8405cdf180 /cleopatre/u-boot-1.1.6/common
parent06f01e45aba02e186a41f1537126a3a80486f458 (diff)
{uboot, cleo, polux}: pass autoswitch enable in ATAG, closes #3722
U-boot decides to enable autoswitch if it finds images with different types.
Diffstat (limited to 'cleopatre/u-boot-1.1.6/common')
-rw-r--r--cleopatre/u-boot-1.1.6/common/cmd_spidboot.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/cleopatre/u-boot-1.1.6/common/cmd_spidboot.c b/cleopatre/u-boot-1.1.6/common/cmd_spidboot.c
index 7cddbef572..e7e1edac6d 100644
--- a/cleopatre/u-boot-1.1.6/common/cmd_spidboot.c
+++ b/cleopatre/u-boot-1.1.6/common/cmd_spidboot.c
@@ -56,6 +56,7 @@ extern void flush_dcache(void);
#define MAX_IMG 10 /* supported num of images */
static unsigned long img_addr[MAX_IMG] = {0};
static spidcom_image_desc_generic_t img_desc[MAX_IMG];
+static uint32_t autoswitch_en = 0;
#define LINUX_LOAD_ADDR (char *)0x40008000
@@ -149,6 +150,7 @@ void setup_spc300_tag (bd_t *bd, spidcom_image_desc_generic_t *hdr,
params->u.spc300.plc_mem_size = hdr->img_300.plc_ram;
}
params->u.spc300.cur_img_slot = img_slot;
+ params->u.spc300.autoswitch_en = autoswitch_en;
params = tag_next (params);
*tmp = params;
}
@@ -429,6 +431,7 @@ static int select_image(int img_nb)
ulong max_index = 0;
char img_version[65];
uint version_len;
+ spidcom_image_desc_image_type_t prev_img_type = SPIDCOM_IMG_DESC_IMAGE_TYPE_UNKNOWN;
int i;
for (i=0; i<img_nb; i++)
@@ -511,6 +514,26 @@ static int select_image(int img_nb)
}
}
+ /* Check if autoswitch has to be enabled. */
+ for (i = 0; i < img_nb; i++)
+ {
+ /* Save the type of the first valid image found. */
+ if (prev_img_type == SPIDCOM_IMG_DESC_IMAGE_TYPE_UNKNOWN
+ && (img_state[i] == IMAGE_OK || img_state[i] == IMAGE_OK_ORIGIN))
+ {
+ prev_img_type = img_desc[i].header->image_type;
+ continue;
+ }
+
+ if ((img_state[i] == IMAGE_OK || img_state[i] == IMAGE_OK_ORIGIN)
+ && prev_img_type != img_desc[i].header->image_type)
+ {
+ /* We need to activate autoswitch. */
+ autoswitch_en = 1;
+ break;
+ }
+ }
+
return sel_img;
}