summaryrefslogtreecommitdiff
path: root/board/st/u8500/itp.c
blob: e7ef4fa7ea36a6ad5d6a1f007e6ab92d612c530a (plain)
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;
}