1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
/*
* Copyright (C) ST-Ericsson SA 2010
*
* Author: Mikael Larsson <mikael.xt.larsson@stericsson.com> for ST-Ericsson.
*
* License terms: GNU General Public License (GPL), version 2.
*/
#include <common.h>
#include <malloc.h>
#include <part.h>
#include <mmc.h>
#include <asm/arch/ab8500.h>
#include "itp.h"
#include "cspsa_fp.h"
static int itp_load_toc_entry(block_dev_desc_t *block_dev,
const char *partname,
u32 *loadaddress)
{
u32 n;
u32 offset;
u32 size;
debug("itp_load_toc_entry: Loading %s\n", partname);
if (get_entry_info_toc(block_dev, partname, &offset,
&size, loadaddress)) {
printf("itp_load_toc_entry: get_entry_info_toc failed\n");
return 1;
}
size = (size / block_dev->blksz) +
((size % block_dev->blksz) ? 1 : 0);
n = block_dev->block_read(block_dev->dev,
offset / block_dev->blksz,
size,
loadaddress);
if (n != size) {
printf("itp_load_toc_entry: Failed to load %s!\n", partname);
return 1;
}
return 0;
}
/*
* itp_load_itp - Loads itp depending on config.
* If itp is loaded ok it will be executed and u-boot execution will stop
*/
int itp_load_itp(block_dev_desc_t *block_dev)
{
u32 cspsa_key;
void (*loadaddress)(void) = NULL;
debug("\nitp_load_itp\n");
if (cspsa_fp_read(block_dev,
ITP_CSPSA_KEY,
&cspsa_key)) {
printf("itp_load_itp: cspsa_fp_read failed\n");
return 1;
}
if (cspsa_key & ITP_LOAD_ITP) {
if (itp_load_toc_entry(block_dev,
ITP_TOC_ITP_NAME,
(u32 *)loadaddress)) {
printf("itp_load_itp: itp_load_partition failed\n");
return 1;
}
loadaddress(); /* U-boot execution will end here*/
printf("itp_load_itp: itp execution failed\n");
return 1;
}
return 0;
}
|