summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-02-02 15:23:42 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2016-02-04 14:38:33 +0100
commit48d74b1ca4e2de002f548980e3bc4de3547a4293 (patch)
tree2b309aa6e982d12976583266c160b0728054fe85
parent610cc35c1e062faa29265ccab8d17a4e76fe66eb (diff)
downloadbarebox-48d74b1ca4e2de002f548980e3bc4de3547a4293.tar.gz
barebox-48d74b1ca4e2de002f548980e3bc4de3547a4293.tar.xz
imx: hab: Make hab status functions SoC specific
The HABv4 functions need access a part of the ROM which is located in the zero page. This must be done early, before the MMU has been configured and the zero page has been set to faulting. The HAB functions currently use cpu_is_imxxy(). At the stage where HAB is called the i.MX CPU type variable is not yet initialized, so this code only works when only one i.MX type is enabled and cpu_is_imxxy() are compile time constants. To fix HAB support when more than one i.MX type is enabled make the HAB status function SoC specific so that we can drop the use of cpu_is_imxxy(). Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/hab/habv4.c46
-rw-r--r--include/hab.h9
2 files changed, 26 insertions, 29 deletions
diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c
index 8521b88d03..a44a94bd38 100644
--- a/drivers/hab/habv4.c
+++ b/drivers/hab/habv4.c
@@ -99,29 +99,6 @@ struct habv4_rvt {
void (*failsafe)(void);
} __packed;
-static const struct habv4_rvt *__rvt;
-
-static inline const struct habv4_rvt *habv4_get_rvt(void)
-{
- if (__rvt)
- return __rvt;
-
- if (cpu_is_mx28())
- __rvt = (void *)HABV4_RVT_IMX28;
- else if (cpu_is_mx6())
- __rvt = (void *)HABV4_RVT_IMX6;
-
- if (__rvt->header.tag != HAB_TAG_RVT) {
- pr_err("ERROR - RVT not found!\n");
- return NULL;
- }
-
- pr_info("Found RVT v%d.%d\n", __rvt->header.par >> 4,
- __rvt->header.par & 0xf);
-
- return __rvt;
-}
-
static const char *habv4_get_status_str(enum hab_status status)
{
switch (status) {
@@ -197,9 +174,8 @@ static void habv4_display_event(uint8_t *data, uint32_t len)
printf("\n\n");
}
-int habv4_get_status(void)
+static int habv4_get_status(const struct habv4_rvt *rvt)
{
- const struct habv4_rvt *rvt = habv4_get_rvt();
uint8_t data[256];
uint32_t len = sizeof(data);
uint32_t index = 0;
@@ -207,8 +183,10 @@ int habv4_get_status(void)
enum hab_config config = 0x0;
enum hab_state state = 0x0;
- if (!rvt)
- return -ENODEV;
+ if (rvt->header.tag != HAB_TAG_RVT) {
+ pr_err("ERROR - RVT not found!\n");
+ return -EINVAL;
+ }
status = rvt->report_status(&config, &state);
pr_info("Status: %s (0x%02x)\n", habv4_get_status_str(status), status);
@@ -235,3 +213,17 @@ int habv4_get_status(void)
return -EPERM;
}
+
+int imx6_hab_get_status(void)
+{
+ const struct habv4_rvt *rvt = (void *)HABV4_RVT_IMX6;
+
+ return habv4_get_status(rvt);
+}
+
+int imx28_hab_get_status(void)
+{
+ const struct habv4_rvt *rvt = (void *)HABV4_RVT_IMX28;
+
+ return habv4_get_status(rvt);
+} \ No newline at end of file
diff --git a/include/hab.h b/include/hab.h
index 411e995db3..818d7ca1c5 100644
--- a/include/hab.h
+++ b/include/hab.h
@@ -19,9 +19,14 @@
#define __HABV4_H
#ifdef CONFIG_HABV4
-int habv4_get_status(void);
+int imx28_hab_get_status(void);
+int imx6_hab_get_status(void);
#else
-static inline int habv4_get_status(void)
+static inline int imx28_hab_get_status(void)
+{
+ return -EPERM;
+}
+static inline int imx6_hab_get_status(void)
{
return -EPERM;
}