Thread (212 messages) 212 messages, 10 authors, 2016-01-08

[PATCH v3 52/62] arm/acpi: Prepare EFI memory descriptor for Dom0

flat view
STALE3928d

From: Stefano Stabellini <hidden>
Date: 2016-01-04 14:54:16

On Thu, 31 Dec 2015, Shannon Zhao wrote:
On 2015/11/27 22:30, Stefano Stabellini wrote:
quoted
On Tue, 17 Nov 2015, shannon.zhao at linaro.org wrote:
quoted
quoted
From: Shannon Zhao <redacted>

Create a few EFI memory descriptors to tell Dom0 the RAM region
information, ACPI table regions and EFI tables reserved resions.

Signed-off-by: Parth Dixit <redacted>
Signed-off-by: Shannon Zhao <redacted>
---
 xen/arch/arm/domain_build.c |  2 ++
 xen/common/efi/boot.c       | 48 +++++++++++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/setup.h |  4 ++++
 3 files changed, 54 insertions(+)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 9d667ea..073c634 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1737,6 +1737,8 @@ static int prepare_acpi(struct domain *d, struct kernel_info *kinfo)
     acpi_map_rest_tables(d);
     acpi_create_efi_system_table(d->arch.efi_acpi_gpa, d->arch.efi_acpi_table,
                                  tbl_add);
+    acpi_create_efi_mmap_table(d->arch.efi_acpi_gpa, d->arch.efi_acpi_table,
+                               &kinfo->mem, tbl_add);
 
     return 0;
 }
diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 75835ae..ff2faed 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -1256,6 +1256,54 @@ void __init acpi_create_efi_system_table(paddr_t paddr, void *efi_acpi_table,
     tbl_add[TBL_EFIT].start = table_addr;
     tbl_add[TBL_EFIT].size = table_size;
 }
+
+void __init acpi_create_efi_mmap_table(paddr_t paddr, void *efi_acpi_table,
+                                       const struct meminfo *mem,
+                                       struct membank tbl_add[])
This function shouldn't be in this file.


quoted
quoted
+{
+    EFI_MEMORY_DESCRIPTOR *memory_map;
+    int i, offset;
+    u8 *base_ptr;
+
+    tbl_add[TBL_MMAP].start = paddr + acpi_get_table_offset(tbl_add, TBL_MMAP);
+    tbl_add[TBL_MMAP].size = sizeof(EFI_MEMORY_DESCRIPTOR)
+                             * (mem->nr_banks + acpi_mem.nr_banks + TBL_MMAX);
+
+    base_ptr = efi_acpi_table + acpi_get_table_offset(tbl_add, TBL_MMAP);
+    memory_map = (EFI_MEMORY_DESCRIPTOR *)(base_ptr);
+
+    offset = 0;
+    for( i = 0; i < mem->nr_banks; i++, offset++ )
+    {
+        memory_map[offset].Type = EfiConventionalMemory;
+        memory_map[offset].PhysicalStart = mem->bank[i].start;
+        memory_map[offset].NumberOfPages = mem->bank[i].size/PAGE_SIZE;
Use PAGE_SHIFT throughout the function.

quoted
quoted
+        memory_map[offset].Attribute = EFI_MEMORY_WB;
+    }
+
+    for( i = 0; i < acpi_mem.nr_banks; i++, offset++ )
+    {
+        memory_map[offset].Type = EfiACPIReclaimMemory;
+        memory_map[offset].PhysicalStart = acpi_mem.bank[i].start;
+        memory_map[offset].NumberOfPages = acpi_mem.bank[i].size/PAGE_SIZE;
+        memory_map[offset].Attribute = EFI_MEMORY_WB;
+    }
+
+    for( i = 0; i < TBL_EFIT; i++, offset++ )
+    {
+        memory_map[offset].Type = EfiACPIReclaimMemory;
+        memory_map[offset].PhysicalStart = tbl_add[i].start;
+        memory_map[offset].NumberOfPages =tbl_add[i].size/PAGE_SIZE;
+        memory_map[offset].Attribute = EFI_MEMORY_WB;
+    }
Can't we just use a single EFI_MEMORY_DESCRIPTOR (or maybe 2, to cover
EfiACPIReclaimMemory and EfiReservedMemoryType regions) to describe the
whole efi_acpi_gpa region? Using one EFI_MEMORY_DESCRIPTOR per table,
and PAGE_ALIGNing each of them, looks like a waste of memory to me.
Unless it's an ACPI or EFI spec requirement.
Looking at the UEFI SPEC it says
"EFI memory descriptors of type EfiACPIReclaimMemory and EfiACPIMemoryNVS
must be aligned on a 4 KiB boundary and must be a multiple of 4 KiB in size"
OK, but can we use only one, 4 KiB aligned, descriptor for all tables?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help