Merge pull request #685 from sandrine-bailleux-arm/sb/base-fvp-7.6
Move up to Base FVP version 7.6
diff --git a/drivers/arm/gic/v3/gicv3_main.c b/drivers/arm/gic/v3/gicv3_main.c
index 6c6c7af..e017033 100644
--- a/drivers/arm/gic/v3/gicv3_main.c
+++ b/drivers/arm/gic/v3/gicv3_main.c
@@ -280,9 +280,10 @@
write_icc_igrpen0_el1(read_icc_igrpen0_el1() &
~IGRPEN1_EL1_ENABLE_G0_BIT);
- /* Disable Group1 Secure interrupts */
+ /* Disable Group1 Secure and Non-Secure interrupts */
write_icc_igrpen1_el3(read_icc_igrpen1_el3() &
- ~IGRPEN1_EL3_ENABLE_G1S_BIT);
+ ~(IGRPEN1_EL3_ENABLE_G1NS_BIT |
+ IGRPEN1_EL3_ENABLE_G1S_BIT));
/* Synchronise accesses to group enable registers */
isb();
diff --git a/drivers/emmc/emmc.c b/drivers/emmc/emmc.c
index 5fe28ef..3fae2a1 100644
--- a/drivers/emmc/emmc.c
+++ b/drivers/emmc/emmc.c
@@ -40,6 +40,12 @@
static const emmc_ops_t *ops;
static unsigned int emmc_ocr_value;
static emmc_csd_t emmc_csd;
+static unsigned int emmc_flags;
+
+static int is_cmd23_enabled(void)
+{
+ return (!!(emmc_flags & EMMC_FLAG_CMD23));
+}
static int emmc_device_state(void)
{
@@ -174,11 +180,23 @@
ret = ops->prepare(lba, buf, size);
assert(ret == 0);
- memset(&cmd, 0, sizeof(emmc_cmd_t));
- if (size > EMMC_BLOCK_SIZE)
+ if (is_cmd23_enabled()) {
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
+ /* set block count */
+ cmd.cmd_idx = EMMC_CMD23;
+ cmd.cmd_arg = size / EMMC_BLOCK_SIZE;
+ cmd.resp_type = EMMC_RESPONSE_R1;
+ ret = ops->send_cmd(&cmd);
+ assert(ret == 0);
+
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
cmd.cmd_idx = EMMC_CMD18;
- else
- cmd.cmd_idx = EMMC_CMD17;
+ } else {
+ if (size > EMMC_BLOCK_SIZE)
+ cmd.cmd_idx = EMMC_CMD18;
+ else
+ cmd.cmd_idx = EMMC_CMD17;
+ }
if ((emmc_ocr_value & OCR_ACCESS_MODE_MASK) == OCR_BYTE_MODE)
cmd.cmd_arg = lba * EMMC_BLOCK_SIZE;
else
@@ -193,11 +211,13 @@
/* wait buffer empty */
emmc_device_state();
- if (size > EMMC_BLOCK_SIZE) {
- memset(&cmd, 0, sizeof(emmc_cmd_t));
- cmd.cmd_idx = EMMC_CMD12;
- ret = ops->send_cmd(&cmd);
- assert(ret == 0);
+ if (is_cmd23_enabled() == 0) {
+ if (size > EMMC_BLOCK_SIZE) {
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
+ cmd.cmd_idx = EMMC_CMD12;
+ ret = ops->send_cmd(&cmd);
+ assert(ret == 0);
+ }
}
/* Ignore improbable errors in release builds */
(void)ret;
@@ -218,11 +238,24 @@
ret = ops->prepare(lba, buf, size);
assert(ret == 0);
- memset(&cmd, 0, sizeof(emmc_cmd_t));
- if (size > EMMC_BLOCK_SIZE)
+ if (is_cmd23_enabled()) {
+ /* set block count */
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
+ cmd.cmd_idx = EMMC_CMD23;
+ cmd.cmd_arg = size / EMMC_BLOCK_SIZE;
+ cmd.resp_type = EMMC_RESPONSE_R1;
+ ret = ops->send_cmd(&cmd);
+ assert(ret == 0);
+
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
cmd.cmd_idx = EMMC_CMD25;
- else
- cmd.cmd_idx = EMMC_CMD24;
+ } else {
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
+ if (size > EMMC_BLOCK_SIZE)
+ cmd.cmd_idx = EMMC_CMD25;
+ else
+ cmd.cmd_idx = EMMC_CMD24;
+ }
if ((emmc_ocr_value & OCR_ACCESS_MODE_MASK) == OCR_BYTE_MODE)
cmd.cmd_arg = lba * EMMC_BLOCK_SIZE;
else
@@ -237,11 +270,13 @@
/* wait buffer empty */
emmc_device_state();
- if (size > EMMC_BLOCK_SIZE) {
- memset(&cmd, 0, sizeof(emmc_cmd_t));
- cmd.cmd_idx = EMMC_CMD12;
- ret = ops->send_cmd(&cmd);
- assert(ret == 0);
+ if (is_cmd23_enabled() == 0) {
+ if (size > EMMC_BLOCK_SIZE) {
+ memset(&cmd, 0, sizeof(emmc_cmd_t));
+ cmd.cmd_idx = EMMC_CMD12;
+ ret = ops->send_cmd(&cmd);
+ assert(ret == 0);
+ }
}
/* Ignore improbable errors in release builds */
(void)ret;
@@ -328,7 +363,8 @@
return size_erased;
}
-void emmc_init(const emmc_ops_t *ops_ptr, int clk, int width)
+void emmc_init(const emmc_ops_t *ops_ptr, int clk, int width,
+ unsigned int flags)
{
assert((ops_ptr != 0) &&
(ops_ptr->init != 0) &&
@@ -342,6 +378,7 @@
(width == EMMC_BUS_WIDTH_4) ||
(width == EMMC_BUS_WIDTH_8)));
ops = ops_ptr;
+ emmc_flags = flags;
emmc_enumerate(clk, width);
}
diff --git a/include/drivers/emmc.h b/include/drivers/emmc.h
index 61d4495..5f78dce 100644
--- a/include/drivers/emmc.h
+++ b/include/drivers/emmc.h
@@ -49,6 +49,7 @@
#define EMMC_CMD13 13
#define EMMC_CMD17 17
#define EMMC_CMD18 18
+#define EMMC_CMD23 23
#define EMMC_CMD24 24
#define EMMC_CMD25 25
#define EMMC_CMD35 35
@@ -111,6 +112,8 @@
#define EMMC_STATE_BTST 9
#define EMMC_STATE_SLP 10
+#define EMMC_FLAG_CMD23 (1 << 0)
+
typedef struct emmc_cmd {
unsigned int cmd_idx;
unsigned int cmd_arg;
@@ -177,6 +180,7 @@
size_t emmc_rpmb_read_blocks(int lba, uintptr_t buf, size_t size);
size_t emmc_rpmb_write_blocks(int lba, const uintptr_t buf, size_t size);
size_t emmc_rpmb_erase_blocks(int lba, size_t size);
-void emmc_init(const emmc_ops_t *ops, int clk, int bus_width);
+void emmc_init(const emmc_ops_t *ops, int clk, int bus_width,
+ unsigned int flags);
#endif /* __EMMC_H__ */
diff --git a/tools/fiptool/Makefile b/tools/fiptool/Makefile
index ec9dd99..3bc372a 100644
--- a/tools/fiptool/Makefile
+++ b/tools/fiptool/Makefile
@@ -68,8 +68,8 @@
@${ECHO_BLANK_LINE}
fip_create: fip_create.sh
- mkdir -p ../fip_create
- install -m 755 fip_create.sh ../fip_create/fip_create
+ ${Q}mkdir -p ../fip_create
+ ${Q}install -m 755 fip_create.sh ../fip_create/fip_create
%.o: %.c %.h ${COPIED_H_FILES} Makefile
@echo " CC $<"