From: Graeme Gregory graeme.gregory@linaro.org
For armv8 ACPI on model before there is bootloader support pass an ACPI blob via the chosen node of the FDT. This is the same method used on armv7 prototype.
Signed-off-by: Graeme Gregory graeme.gregory@linaro.org --- Makefile | 36 +++++++++++++++++++++++++++--------- model.lds.S | 9 +++++++++ 2 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/Makefile b/Makefile index 38595a3..6704a69 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ GIC_CPU_BASE := 0x2c002000 CNTFRQ := 0x01800000 # 24Mhz
#INITRD_FLAGS := -DUSE_INITRD -CPPFLAGS += $(INITRD_FLAGS) +ACPI_FLAGS := -DUSE_ACPI +CPPFLAGS += $(INITRD_FLAGS) $(ACPI_FLAGS)
BOOTLOADER := boot.S MBOX_OFFSET := 0xfff8 @@ -30,6 +31,12 @@ FILESYSTEM_START:= $(shell echo $$(($(PHYS_OFFSET) + $(FS_OFFSET)))) FILESYSTEM_SIZE := $(shell stat -Lc %s $(FILESYSTEM) 2>/dev/null || echo 0) FILESYSTEM_END := $(shell echo $$(($(FILESYSTEM_START) + $(FILESYSTEM_SIZE))))
+ACPI := tables.acpi +ACPI_OFFSET := 0xF000000 +ACPI_START := $(shell echo $$(($(PHYS_OFFSET) + $(ACPI_OFFSET)))) +ACPI_SIZE := $(shell stat -Lc %s $(ACPI) 2>/dev/null || echo 0) +ACPI_END := $(shell echo $$(($(ACPI_START) + $(ACPI_SIZE)))) + FDT_SRC := rtsm_ve-aemv8a.dts FDT_INCL_REGEX := (/include/[[:space:]]*")([^"]+)(".*) FDT_DEPS := $(FDT_SRC) $(addprefix $(dir $(FDT_SRC)), $(shell sed -ne 'sq$(strip $(FDT_INCL_REGEX)q\2q p' < $(FDT_SRC)))) @@ -37,19 +44,30 @@ FDT_OFFSET := 0x08000000
BOOTARGS_COMMON := "console=ttyAMA0 earlyprintk=pl011,0x1c090000 $(BOOTARGS_EXTRA)"
+CHOSEN_NODE := chosen { ifneq (,$(findstring USE_INITRD,$(CPPFLAGS))) BOOTARGS := "$(BOOTARGS_COMMON)" -CHOSEN_NODE := chosen { \ - bootargs = "$(BOOTARGS)"; \ +CHOSEN_NODE += bootargs = "$(BOOTARGS)"; \ linux,initrd-start = <$(FILESYSTEM_START)>; \ - linux,initrd-end = <$(FILESYSTEM_END)>; \ - }; + linux,initrd-end = <$(FILESYSTEM_END)>; + +ifneq (,$(findstring USE_ACPI,$(CPPFLAGS))) +CHOSEN_NODE += linux,acpi-start = <$(ACPI_START)>; \ + linux,acpi-len = <$(ACPI_SIZE)>; +endif + else BOOTARGS := "root=/dev/nfs nfsroot=<serverip>:<rootfs>,tcp rw ip=dhcp $(BOOTARGS_COMMON)" CHOSEN_NODE := chosen { \ - bootargs = "$(BOOTARGS)"; \ - }; + bootargs = "$(BOOTARGS)"; + +ifneq (,$(findstring USE_ACPI,$(CPPFLAGS))) +CHOSEN_NODE += linux,acpi-start = <$(ACPI_START)>; \ + linux,acpi-len = <$(ACPI_SIZE)>; +endif + endif +CHOSEN_NODE += };
CROSS_COMPILE ?= aarch64-none-linux-gnu- CC := $(CROSS_COMPILE)gcc @@ -68,14 +86,14 @@ boot.o: $(BOOTLOADER) Makefile $(CC) $(CPPFLAGS) -DCNTFRQ=$(CNTFRQ) -DUART_BASE=$(UART_BASE) -DSYSREGS_BASE=$(SYSREGS_BASE) -DGIC_DIST_BASE=$(GIC_DIST_BASE) -DGIC_CPU_BASE=$(GIC_CPU_BASE) -c -o $@ $(BOOTLOADER)
model.lds: $(LD_SCRIPT) Makefile - $(CC) $(CPPFLAGS) -DPHYS_OFFSET=$(PHYS_OFFSET) -DMBOX_OFFSET=$(MBOX_OFFSET) -DKERNEL_OFFSET=$(KERNEL_OFFSET) -DFDT_OFFSET=$(FDT_OFFSET) -DFS_OFFSET=$(FS_OFFSET) -DKERNEL=$(KERNEL) -DFILESYSTEM=$(FILESYSTEM) -E -P -C -o $@ $< + $(CC) $(CPPFLAGS) -DPHYS_OFFSET=$(PHYS_OFFSET) -DMBOX_OFFSET=$(MBOX_OFFSET) -DKERNEL_OFFSET=$(KERNEL_OFFSET) -DFDT_OFFSET=$(FDT_OFFSET) -DFS_OFFSET=$(FS_OFFSET) -DKERNEL=$(KERNEL) -DFILESYSTEM=$(FILESYSTEM) -DACPI=$(ACPI) -DACPI_OFFSET=$(ACPI_OFFSET) -E -P -C -o $@ $<
ifeq ($(DTC),) $(error No dtc found! You can git clone from git://git.jdl.com/software/dtc.git) endif
fdt.dtb: $(FDT_DEPS) Makefile - ( echo "/include/ "$(FDT_SRC)"" ; echo "/ { $(CHOSEN_NODE) };" ) | $(DTC) -O dtb -o $@ - + ( echo "/include/ "$(FDT_SRC)"" ; echo "/ { $(CHOSEN_NODE) };" ) | tee chosen.dts | $(DTC) -O dtb -o $@ -
# The filesystem archive might not exist if INITRD is not being used .PHONY: all clean $(FILESYSTEM) diff --git a/model.lds.S b/model.lds.S index ec27433..f8d4683 100644 --- a/model.lds.S +++ b/model.lds.S @@ -15,6 +15,10 @@ INPUT(./boot.o) INPUT(KERNEL) INPUT(./fdt.dtb)
+#ifdef USE_ACPI +INPUT(ACPI) +#endif + #ifdef USE_INITRD INPUT(FILESYSTEM) #endif @@ -33,6 +37,11 @@ SECTIONS . = PHYS_OFFSET + FDT_OFFSET; dtb = .; .dtb : { ./fdt.dtb } + . = PHYS_OFFSET + ACPI_OFFSET; + acpi = .; +#ifdef USE_ACPI + .acpi : { ACPI } +#endif . = PHYS_OFFSET + FS_OFFSET; filesystem = .; #ifdef USE_INITRD
This version just fixes a typo in calculation which made the ACPI blob start address wrong.
I can see the linux,acpi-start and linux,acpi-len fields in armv8 kernel now!
root@genericarmv8:~# dmesg | grep acpi acpi: start info is 0x8F000000, 4300 bytes
But something is wrong when I phys_to_virt that address.
Graeme
On 6 June 2013 16:06, Graeme Gregory graeme.gregory@linaro.org wrote:
From: Graeme Gregory graeme.gregory@linaro.org
For armv8 ACPI on model before there is bootloader support pass an ACPI blob via the chosen node of the FDT. This is the same method used on armv7 prototype.
Signed-off-by: Graeme Gregory graeme.gregory@linaro.org
Makefile | 36 +++++++++++++++++++++++++++--------- model.lds.S | 9 +++++++++ 2 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/Makefile b/Makefile index 38595a3..6704a69 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ GIC_CPU_BASE := 0x2c002000 CNTFRQ := 0x01800000 # 24Mhz
#INITRD_FLAGS := -DUSE_INITRD -CPPFLAGS += $(INITRD_FLAGS) +ACPI_FLAGS := -DUSE_ACPI +CPPFLAGS += $(INITRD_FLAGS) $(ACPI_FLAGS)
BOOTLOADER := boot.S MBOX_OFFSET := 0xfff8 @@ -30,6 +31,12 @@ FILESYSTEM_START:= $(shell echo $$(($(PHYS_OFFSET) + $(FS_OFFSET)))) FILESYSTEM_SIZE := $(shell stat -Lc %s $(FILESYSTEM) 2>/dev/null || echo 0) FILESYSTEM_END := $(shell echo $$(($(FILESYSTEM_START) + $(FILESYSTEM_SIZE))))
+ACPI := tables.acpi +ACPI_OFFSET := 0xF000000 +ACPI_START := $(shell echo $$(($(PHYS_OFFSET) + $(ACPI_OFFSET)))) +ACPI_SIZE := $(shell stat -Lc %s $(ACPI) 2>/dev/null || echo 0) +ACPI_END := $(shell echo $$(($(ACPI_START) + $(ACPI_SIZE))))
FDT_SRC := rtsm_ve-aemv8a.dts FDT_INCL_REGEX := (/include/[[:space:]]*")([^"]+)(".*) FDT_DEPS := $(FDT_SRC) $(addprefix $(dir $(FDT_SRC)), $(shell sed -ne 'sq$(strip $(FDT_INCL_REGEX)q\2q p' < $(FDT_SRC)))) @@ -37,19 +44,30 @@ FDT_OFFSET := 0x08000000
BOOTARGS_COMMON := "console=ttyAMA0 earlyprintk=pl011,0x1c090000 $(BOOTARGS_EXTRA)"
+CHOSEN_NODE := chosen { ifneq (,$(findstring USE_INITRD,$(CPPFLAGS))) BOOTARGS := "$(BOOTARGS_COMMON)" -CHOSEN_NODE := chosen { \
bootargs = \"$(BOOTARGS)\"; \
+CHOSEN_NODE += bootargs = "$(BOOTARGS)"; \ linux,initrd-start = <$(FILESYSTEM_START)>; \
linux,initrd-end = <$(FILESYSTEM_END)>; \
};
linux,initrd-end = <$(FILESYSTEM_END)>;
+ifneq (,$(findstring USE_ACPI,$(CPPFLAGS))) +CHOSEN_NODE += linux,acpi-start = <$(ACPI_START)>; \
linux,acpi-len = <$(ACPI_SIZE)>;
+endif
else BOOTARGS := "root=/dev/nfs nfsroot=<serverip>:<rootfs>,tcp rw ip=dhcp $(BOOTARGS_COMMON)" CHOSEN_NODE := chosen { \
bootargs = \"$(BOOTARGS)\"; \
};
bootargs = \"$(BOOTARGS)\";
+ifneq (,$(findstring USE_ACPI,$(CPPFLAGS))) +CHOSEN_NODE += linux,acpi-start = <$(ACPI_START)>; \
linux,acpi-len = <$(ACPI_SIZE)>;
+endif
endif +CHOSEN_NODE += };
CROSS_COMPILE ?= aarch64-none-linux-gnu- CC := $(CROSS_COMPILE)gcc @@ -68,14 +86,14 @@ boot.o: $(BOOTLOADER) Makefile $(CC) $(CPPFLAGS) -DCNTFRQ=$(CNTFRQ) -DUART_BASE=$(UART_BASE) -DSYSREGS_BASE=$(SYSREGS_BASE) -DGIC_DIST_BASE=$(GIC_DIST_BASE) -DGIC_CPU_BASE=$(GIC_CPU_BASE) -c -o $@ $(BOOTLOADER)
model.lds: $(LD_SCRIPT) Makefile
$(CC) $(CPPFLAGS) -DPHYS_OFFSET=$(PHYS_OFFSET)
-DMBOX_OFFSET=$(MBOX_OFFSET) -DKERNEL_OFFSET=$(KERNEL_OFFSET) -DFDT_OFFSET=$(FDT_OFFSET) -DFS_OFFSET=$(FS_OFFSET) -DKERNEL=$(KERNEL) -DFILESYSTEM=$(FILESYSTEM) -E -P -C -o $@ $<
$(CC) $(CPPFLAGS) -DPHYS_OFFSET=$(PHYS_OFFSET)
-DMBOX_OFFSET=$(MBOX_OFFSET) -DKERNEL_OFFSET=$(KERNEL_OFFSET) -DFDT_OFFSET=$(FDT_OFFSET) -DFS_OFFSET=$(FS_OFFSET) -DKERNEL=$(KERNEL) -DFILESYSTEM=$(FILESYSTEM) -DACPI=$(ACPI) -DACPI_OFFSET=$(ACPI_OFFSET) -E -P -C -o $@ $<
ifeq ($(DTC),) $(error No dtc found! You can git clone from git:// git.jdl.com/software/dtc.git) endif
fdt.dtb: $(FDT_DEPS) Makefile
( echo "/include/ \"$(FDT_SRC)\"" ; echo "/ { $(CHOSEN_NODE) };" )
| $(DTC) -O dtb -o $@ -
( echo "/include/ \"$(FDT_SRC)\"" ; echo "/ { $(CHOSEN_NODE) };" )
| tee chosen.dts | $(DTC) -O dtb -o $@ -
# The filesystem archive might not exist if INITRD is not being used .PHONY: all clean $(FILESYSTEM) diff --git a/model.lds.S b/model.lds.S index ec27433..f8d4683 100644 --- a/model.lds.S +++ b/model.lds.S @@ -15,6 +15,10 @@ INPUT(./boot.o) INPUT(KERNEL) INPUT(./fdt.dtb)
+#ifdef USE_ACPI +INPUT(ACPI) +#endif
#ifdef USE_INITRD INPUT(FILESYSTEM) #endif @@ -33,6 +37,11 @@ SECTIONS . = PHYS_OFFSET + FDT_OFFSET; dtb = .; .dtb : { ./fdt.dtb }
. = PHYS_OFFSET + ACPI_OFFSET;
acpi = .;
+#ifdef USE_ACPI
.acpi : { ACPI }
+#endif . = PHYS_OFFSET + FS_OFFSET; filesystem = .;
#ifdef USE_INITRD
1.7.10.4