Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8801
-gerrit
commit c750dc24182412479d15e54ff1b39569c9bcbce6
Author: Furquan Shaikh <furquan(a)google.com>
Date: Wed Aug 27 15:57:47 2014 -0700
libpayload arm64: Add support for read and write registers at current EL in assembly
In order to ease the process of reading and writing any register at current EL,
provide read_current and write_current assembly macros. These are included in
arch/lib_helpers.h under the __ASSEMBLY__ macro condition. This is done to allow
the same header file to be included by .c and .S files.
BUG=chrome-os-partner:31634
BRANCH=None
TEST=Compiles successfully for ryu
Change-Id: I79241a944b68ebb24865e745a9835f54ab6d1a8f
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: 2b55fbde466126c4de7f5f7bb2d1427196be842f
Original-Change-Id: I678ab89c4aa1b08898166e135b5ab2d6453bb5e8
Original-Signed-off-by: Furquan Shaikh <furquan(a)google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/214576
Original-Tested-by: Furquan Shaikh <furquan(a)chromium.org>
Original-Reviewed-by: Aaron Durbin <adurbin(a)chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan(a)chromium.org>
---
.../libpayload/include/arm64/arch/lib_helpers.h | 57 ++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/payloads/libpayload/include/arm64/arch/lib_helpers.h b/payloads/libpayload/include/arm64/arch/lib_helpers.h
index f8d9546..abb08a4 100644
--- a/payloads/libpayload/include/arm64/arch/lib_helpers.h
+++ b/payloads/libpayload/include/arm64/arch/lib_helpers.h
@@ -33,6 +33,61 @@
#ifndef __ARCH_LIB_HELPERS_H__
#define __ARCH_LIB_HELPERS_H__
+#ifdef __ASSEMBLY__
+
+/* Macro to switch to label based on current el */
+.macro switch_el xreg label1 label2 label3
+ mrs \xreg, CurrentEL
+ /* Currently at EL1 */
+ cmp \xreg, 0x4
+ b.eq \label1
+ /* Currently at EL2 */
+ cmp \xreg, 0x8
+ b.eq \label2
+ /* Currently at EL3 */
+ cmp \xreg, 0xc
+ b.eq \label3
+.endm
+
+/* Macro to read sysreg at current EL
+ xreg - reg in which read value needs to be stored
+ sysreg - system reg that is to be read
+*/
+.macro read_current xreg sysreg
+ switch_el \xreg, 101f, 102f, 103f
+101:
+ mrs \xreg, \sysreg\()_el1
+ b 104f
+102:
+ mrs \xreg, \sysreg\()_el2
+ b 104f
+103:
+ mrs \xreg, \sysreg\()_el3
+ b 104f
+104:
+.endm
+
+/* Macro to write sysreg at current EL
+ xreg - reg from which value needs to be written
+ sysreg - system reg that is to be written
+ temp - temp reg that can be used to read current EL
+*/
+.macro write_current sysreg xreg temp
+ switch_el \temp, 101f, 102f, 103f
+101:
+ msr \sysreg\()_el1, \xreg
+ b 104f
+102:
+ msr \sysreg\()_el2, \xreg
+ b 104f
+103:
+ msr \sysreg\()_el3, \xreg
+ b 104f
+104:
+.endm
+
+#else
+
#define EL0 0
#define EL1 1
#define EL2 2
@@ -316,4 +371,6 @@ void tlbivaa_el1(uint64_t va);
/* Clock */
void set_cntfrq(uint32_t freq);
+#endif // __ASSEMBLY__
+
#endif //__ARCH_LIB_HELPERS_H__
Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8800
-gerrit
commit 1b7e44ff73b43aca65bc6a1ab6b00a7c4157362b
Author: Furquan Shaikh <furquan(a)google.com>
Date: Sat Jan 31 23:24:32 2015 -0800
libpayload arm64: Allow board to define upper address limit on DMA
Instead of forcing boards to have DMA region below 4GiB, provide
Kconfig option DMA_LIM_EXCL that a board can use to set the upper
limit in MiB units on the address range reserved by DMA. By default,
this value is 0x1000 i.e. 4GiB limit on the DMA upper address.
BUG=None
BRANCH=None
TEST=Compiles successfully for rush. Default value is seen as 0x1000.
Change-Id: Ie35d3844a0989486ae022f8922fdd4c9d7d57fb4
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: 6716cf312a103bc0440a558fc43c8c77869816e3
Original-Change-Id: I3ecbb4ec90995ab1568cb0924d5ce9467492697d
Original-Signed-off-by: Furquan Shaikh <furquan(a)google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/245250
Original-Tested-by: Furquan Shaikh <furquan(a)chromium.org>
Original-Reviewed-by: Aaron Durbin <adurbin(a)chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan(a)chromium.org>
---
payloads/libpayload/arch/arm64/Config.in | 4 ++++
payloads/libpayload/arch/arm64/mmu.c | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/payloads/libpayload/arch/arm64/Config.in b/payloads/libpayload/arch/arm64/Config.in
index 0f2596c..d2f8e56 100644
--- a/payloads/libpayload/arch/arm64/Config.in
+++ b/payloads/libpayload/arch/arm64/Config.in
@@ -33,4 +33,8 @@ config ARCH_SPECIFIC_OPTIONS # dummy
def_bool y
select LITTLE_ENDIAN
+config DMA_LIM_EXCL
+ hex "DMA address limit(exclusive) in MiB units"
+ default 0x1000
+
endif
diff --git a/payloads/libpayload/arch/arm64/mmu.c b/payloads/libpayload/arch/arm64/mmu.c
index da2127d..adbee0f 100644
--- a/payloads/libpayload/arch/arm64/mmu.c
+++ b/payloads/libpayload/arch/arm64/mmu.c
@@ -609,7 +609,7 @@ static struct mmu_memrange *mmu_add_dma_range(struct mmu_ranges *mmu_ranges)
/* DMA_DEFAULT_SIZE is multiple of GRANULE_SIZE */
assert((DMA_DEFAULT_SIZE % GRANULE_SIZE) == 0);
prop.size = DMA_DEFAULT_SIZE;
- prop.lim_excl = MIN_64_BIT_ADDR;
+ prop.lim_excl = (uint64_t)CONFIG_LP_DMA_LIM_EXCL * MiB;
prop.align = GRANULE_SIZE;
prop.is_valid_range = NULL;
prop.src_type = TYPE_NORMAL_MEM;
Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8801
-gerrit
commit 7f4d8ada54659b86fc17333d3a32f0a933871f84
Author: Furquan Shaikh <furquan(a)google.com>
Date: Wed Aug 27 15:57:47 2014 -0700
libpayload arm64: Add support for read and write registers at current EL in assembly
In order to ease the process of reading and writing any register at current EL,
provide read_current and write_current assembly macros. These are included in
arch/lib_helpers.h under the __ASSEMBLY__ macro condition. This is done to allow
the same header file to be included by .c and .S files.
BUG=chrome-os-partner:31634
BRANCH=None
TEST=Compiles successfully for ryu
Change-Id: I79241a944b68ebb24865e745a9835f54ab6d1a8f
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: 2b55fbde466126c4de7f5f7bb2d1427196be842f
Original-Change-Id: I678ab89c4aa1b08898166e135b5ab2d6453bb5e8
Original-Signed-off-by: Furquan Shaikh <furquan(a)google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/214576
Original-Tested-by: Furquan Shaikh <furquan(a)chromium.org>
Original-Reviewed-by: Aaron Durbin <adurbin(a)chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan(a)chromium.org>
---
.../libpayload/include/arm64/arch/lib_helpers.h | 57 ++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/payloads/libpayload/include/arm64/arch/lib_helpers.h b/payloads/libpayload/include/arm64/arch/lib_helpers.h
index a8eb396..ca68435 100644
--- a/payloads/libpayload/include/arm64/arch/lib_helpers.h
+++ b/payloads/libpayload/include/arm64/arch/lib_helpers.h
@@ -33,6 +33,61 @@
#ifndef __ARCH_LIB_HELPERS_H__
#define __ARCH_LIB_HELPERS_H__
+#ifdef __ASSEMBLY__
+
+/* Macro to switch to label based on current el */
+.macro switch_el xreg label1 label2 label3
+ mrs \xreg, CurrentEL
+ /* Currently at EL1 */
+ cmp \xreg, 0x4
+ b.eq \label1
+ /* Currently at EL2 */
+ cmp \xreg, 0x8
+ b.eq \label2
+ /* Currently at EL3 */
+ cmp \xreg, 0xc
+ b.eq \label3
+.endm
+
+/* Macro to read sysreg at current EL
+ xreg - reg in which read value needs to be stored
+ sysreg - system reg that is to be read
+*/
+.macro read_current xreg sysreg
+ switch_el \xreg, 101f, 102f, 103f
+101:
+ mrs \xreg, \sysreg\()_el1
+ b 104f
+102:
+ mrs \xreg, \sysreg\()_el2
+ b 104f
+103:
+ mrs \xreg, \sysreg\()_el3
+ b 104f
+104:
+.endm
+
+/* Macro to write sysreg at current EL
+ xreg - reg from which value needs to be written
+ sysreg - system reg that is to be written
+ temp - temp reg that can be used to read current EL
+*/
+.macro write_current sysreg xreg temp
+ switch_el \temp, 101f, 102f, 103f
+101:
+ msr \sysreg\()_el1, \xreg
+ b 104f
+102:
+ msr \sysreg\()_el2, \xreg
+ b 104f
+103:
+ msr \sysreg\()_el3, \xreg
+ b 104f
+104:
+.endm
+
+#else
+
#define EL0 0
#define EL1 1
#define EL2 2
@@ -347,4 +402,6 @@ void tlbivaa_el1(uint64_t va);
/* Clock */
void set_cntfrq(uint32_t freq);
+#endif // __ASSEMBLY__
+
#endif //__ARCH_LIB_HELPERS_H__
Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8800
-gerrit
commit 59512d055a87f01fb839257bbdf5a8d31c4ca071
Author: Furquan Shaikh <furquan(a)google.com>
Date: Sat Jan 31 23:24:32 2015 -0800
libpayload arm64: Allow board to define upper address limit on DMA
Instead of forcing boards to have DMA region below 4GiB, provide
Kconfig option DMA_LIM_EXCL that a board can use to set the upper
limit in MiB units on the address range reserved by DMA. By default,
this value is 0x1000 i.e. 4GiB limit on the DMA upper address.
BUG=None
BRANCH=None
TEST=Compiles successfully for rush. Default value is seen as 0x1000.
Change-Id: Ie35d3844a0989486ae022f8922fdd4c9d7d57fb4
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: 6716cf312a103bc0440a558fc43c8c77869816e3
Original-Change-Id: I3ecbb4ec90995ab1568cb0924d5ce9467492697d
Original-Signed-off-by: Furquan Shaikh <furquan(a)google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/245250
Original-Tested-by: Furquan Shaikh <furquan(a)chromium.org>
Original-Reviewed-by: Aaron Durbin <adurbin(a)chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan(a)chromium.org>
---
payloads/libpayload/arch/arm64/Config.in | 4 ++++
payloads/libpayload/arch/arm64/mmu.c | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/payloads/libpayload/arch/arm64/Config.in b/payloads/libpayload/arch/arm64/Config.in
index 0f2596c..d2f8e56 100644
--- a/payloads/libpayload/arch/arm64/Config.in
+++ b/payloads/libpayload/arch/arm64/Config.in
@@ -33,4 +33,8 @@ config ARCH_SPECIFIC_OPTIONS # dummy
def_bool y
select LITTLE_ENDIAN
+config DMA_LIM_EXCL
+ hex "DMA address limit(exclusive) in MiB units"
+ default 0x1000
+
endif
diff --git a/payloads/libpayload/arch/arm64/mmu.c b/payloads/libpayload/arch/arm64/mmu.c
index da2127d..adbee0f 100644
--- a/payloads/libpayload/arch/arm64/mmu.c
+++ b/payloads/libpayload/arch/arm64/mmu.c
@@ -609,7 +609,7 @@ static struct mmu_memrange *mmu_add_dma_range(struct mmu_ranges *mmu_ranges)
/* DMA_DEFAULT_SIZE is multiple of GRANULE_SIZE */
assert((DMA_DEFAULT_SIZE % GRANULE_SIZE) == 0);
prop.size = DMA_DEFAULT_SIZE;
- prop.lim_excl = MIN_64_BIT_ADDR;
+ prop.lim_excl = (uint64_t)CONFIG_LP_DMA_LIM_EXCL * MiB;
prop.align = GRANULE_SIZE;
prop.is_valid_range = NULL;
prop.src_type = TYPE_NORMAL_MEM;
Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8799
-gerrit
commit ada54a9805586db1ff33107f9537d9a1d313a3ce
Author: HC Yen <hc.yen(a)mediatek.com>
Date: Mon Jan 12 18:53:01 2015 +0800
libpayload arm64: fix mmu_disable() cache problem
The raw_write_sctlr_current() cannot be used in mmu_disable() because
it pushes some registers to cached stack, and then just after cache
disabled, the value was gone.
BRANCH=none
BUG=none
TEST=build and boot on mt8173-evb
Change-Id: I512405b7917f27d16bdd3c51d9459827ad714e67
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: aafe64922cc4cd01ecb099db106d04538e3e57ff
Original-Change-Id: I0dda8518d14c46fae1fe76e3629bd4ee81c1e0ee
Original-Signed-off-by: HC Yen <hc.yen(a)mediatek.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/240323
Original-Reviewed-by: Aaron Durbin <adurbin(a)chromium.org>
---
payloads/libpayload/arch/arm64/mmu.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/payloads/libpayload/arch/arm64/mmu.c b/payloads/libpayload/arch/arm64/mmu.c
index 86d9fc5..da2127d 100644
--- a/payloads/libpayload/arch/arm64/mmu.c
+++ b/payloads/libpayload/arch/arm64/mmu.c
@@ -332,9 +332,10 @@ static uint32_t is_mmu_enabled(void)
*/
void mmu_disable(void)
{
+ uint32_t el = get_current_el();
uint32_t sctlr;
- sctlr = raw_read_sctlr_current();
+ sctlr = raw_read_sctlr(el);
sctlr &= ~(SCTLR_C | SCTLR_M | SCTLR_I);
tlbiall_current();
@@ -343,7 +344,7 @@ void mmu_disable(void)
dsb();
isb();
- raw_write_sctlr_current(sctlr);
+ raw_write_sctlr(sctlr, el);
dcache_clean_invalidate_all();
dsb();
Patrick Georgi (pgeorgi(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8797
-gerrit
commit d20bf12bb93519f46cca415988d210cab94b0c80
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Nov 18 11:55:33 2014 -0600
libpayload arm64: don't modify cbtable entries
The framebuffer structure lives in the coreboot tables. Those
tables have a checksum calculation applied over all the entries.
Therefore, one shouldnot be modifying fields within the coreboot
table entries because the calculated checksum would be wrong.
BRANCH=none
BUG=chrome-os-partner:31936
TEST=On ryu, confirmed dev screen still works as well as cbmem utility
once booted.
Change-Id: I93830a8efe98aa848f2b0f8388688de0e93b2f82
Signed-off-by: Patrick Georgi <pgeorgi(a)chromium.org>
Original-Commit-Id: 6026ca5ad0254c14c30412882dc63550656c7d16
Original-Change-Id: Ic9c164ded03d10d6f6f3ce15e9b38b1f6ce61a91
Original-Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/230471
Original-Reviewed-by: Furquan Shaikh <furquan(a)chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan(a)chromium.org>
---
payloads/libpayload/arch/arm64/mmu.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/payloads/libpayload/arch/arm64/mmu.c b/payloads/libpayload/arch/arm64/mmu.c
index 41fb10b..86d9fc5 100644
--- a/payloads/libpayload/arch/arm64/mmu.c
+++ b/payloads/libpayload/arch/arm64/mmu.c
@@ -675,6 +675,7 @@ static void mmu_extract_ranges(struct memrange *cb_ranges,
static void mmu_add_fb_range(struct mmu_ranges *mmu_ranges)
{
struct mmu_memrange *fb_range;
+ static struct cb_framebuffer modified_fb;
struct cb_framebuffer *framebuffer = lib_sysinfo.framebuffer;
uint32_t fb_size;
@@ -695,8 +696,16 @@ static void mmu_add_fb_range(struct mmu_ranges *mmu_ranges)
if (fb_range == NULL)
mmu_error();
- /* Set framebuffer address */
- framebuffer->physical_address = fb_range->base;
+ /*
+ * Set framebuffer address. However, one needs to use a freshly
+ * allocated framebuffer structure because the one in the coreboot
+ * table is part of a checksum calculation. Therefore, one cannot
+ * modify a field without recomputing the necessary checksum
+ * calcuation.
+ */
+ modified_fb = *framebuffer;
+ modified_fb.physical_address = fb_range->base;
+ lib_sysinfo.framebuffer = &modified_fb;
}
/*