133 lines
4.2 KiB
Diff
133 lines
4.2 KiB
Diff
|
References: bnc#833251, bnc#834751
|
||
|
|
||
|
# Commit 2ee9cbf9d8eaeff6e21222905d22dbd58dc5fe29
|
||
|
# Date 2013-08-21 08:38:40 +0200
|
||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
ACPI: fix acpi_os_map_memory()
|
||
|
|
||
|
It using map_domain_page() was entirely wrong. Use __acpi_map_table()
|
||
|
instead for the time being, with locking added as the mappings it
|
||
|
produces get replaced with subsequent invocations. Using locking in
|
||
|
this way is acceptable here since the only two runtime callers are
|
||
|
acpi_os_{read,write}_memory(), which don't leave mappings pending upon
|
||
|
returning to their callers.
|
||
|
|
||
|
Also fix __acpi_map_table()'s first parameter's type - while benign for
|
||
|
unstable, backports to pre-4.3 trees will need this.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
# Commit c5ba8ed4c6f005d332a49d93a3ef8ff2b690b256
|
||
|
# Date 2013-08-21 08:40:22 +0200
|
||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
ACPI: use ioremap() in acpi_os_map_memory()
|
||
|
|
||
|
This drops the post-boot use of __acpi_map_table() here again (together
|
||
|
with the somewhat awkward locking), in favor of using ioremap().
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
--- a/xen/arch/x86/acpi/lib.c
|
||
|
+++ b/xen/arch/x86/acpi/lib.c
|
||
|
@@ -39,7 +39,7 @@ u32 __read_mostly x86_acpiid_to_apicid[M
|
||
|
* from the fixed base. That's why we start at FIX_ACPI_END and
|
||
|
* count idx down while incrementing the phys address.
|
||
|
*/
|
||
|
-char *__acpi_map_table(unsigned long phys, unsigned long size)
|
||
|
+char *__acpi_map_table(paddr_t phys, unsigned long size)
|
||
|
{
|
||
|
unsigned long base, offset, mapped_size;
|
||
|
int idx;
|
||
|
--- a/xen/drivers/acpi/osl.c
|
||
|
+++ b/xen/drivers/acpi/osl.c
|
||
|
@@ -38,6 +38,7 @@
|
||
|
#include <xen/spinlock.h>
|
||
|
#include <xen/domain_page.h>
|
||
|
#include <xen/efi.h>
|
||
|
+#include <xen/vmap.h>
|
||
|
|
||
|
#define _COMPONENT ACPI_OS_SERVICES
|
||
|
ACPI_MODULE_NAME("osl")
|
||
|
@@ -83,14 +84,25 @@ acpi_physical_address __init acpi_os_get
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-void __iomem *__init
|
||
|
+void __iomem *
|
||
|
acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
||
|
{
|
||
|
- return __acpi_map_table((unsigned long)phys, size);
|
||
|
+ if (system_state >= SYS_STATE_active) {
|
||
|
+ unsigned long pfn = PFN_DOWN(phys);
|
||
|
+ unsigned int offs = phys & (PAGE_SIZE - 1);
|
||
|
+
|
||
|
+ /* The low first Mb is always mapped. */
|
||
|
+ if ( !((phys + size - 1) >> 20) )
|
||
|
+ return __va(phys);
|
||
|
+ return __vmap(&pfn, PFN_UP(offs + size), 1, 1, PAGE_HYPERVISOR_NOCACHE) + offs;
|
||
|
+ }
|
||
|
+ return __acpi_map_table(phys, size);
|
||
|
}
|
||
|
|
||
|
-void __init acpi_os_unmap_memory(void __iomem * virt, acpi_size size)
|
||
|
+void acpi_os_unmap_memory(void __iomem * virt, acpi_size size)
|
||
|
{
|
||
|
+ if (system_state >= SYS_STATE_active)
|
||
|
+ vunmap((void *)((unsigned long)virt & PAGE_MASK));
|
||
|
}
|
||
|
|
||
|
acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
|
||
|
@@ -133,9 +145,8 @@ acpi_status
|
||
|
acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width)
|
||
|
{
|
||
|
u32 dummy;
|
||
|
- void __iomem *virt_addr;
|
||
|
+ void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3);
|
||
|
|
||
|
- virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT);
|
||
|
if (!value)
|
||
|
value = &dummy;
|
||
|
|
||
|
@@ -153,7 +164,7 @@ acpi_os_read_memory(acpi_physical_addres
|
||
|
BUG();
|
||
|
}
|
||
|
|
||
|
- unmap_domain_page(virt_addr);
|
||
|
+ acpi_os_unmap_memory(virt_addr, width >> 3);
|
||
|
|
||
|
return AE_OK;
|
||
|
}
|
||
|
@@ -161,9 +172,7 @@ acpi_os_read_memory(acpi_physical_addres
|
||
|
acpi_status
|
||
|
acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
|
||
|
{
|
||
|
- void __iomem *virt_addr;
|
||
|
-
|
||
|
- virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT);
|
||
|
+ void __iomem *virt_addr = acpi_os_map_memory(phys_addr, width >> 3);
|
||
|
|
||
|
switch (width) {
|
||
|
case 8:
|
||
|
@@ -179,7 +188,7 @@ acpi_os_write_memory(acpi_physical_addre
|
||
|
BUG();
|
||
|
}
|
||
|
|
||
|
- unmap_domain_page(virt_addr);
|
||
|
+ acpi_os_unmap_memory(virt_addr, width >> 3);
|
||
|
|
||
|
return AE_OK;
|
||
|
}
|
||
|
--- a/xen/include/xen/acpi.h
|
||
|
+++ b/xen/include/xen/acpi.h
|
||
|
@@ -56,7 +56,7 @@ typedef int (*acpi_table_handler) (struc
|
||
|
typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
|
||
|
|
||
|
unsigned int acpi_get_processor_id (unsigned int cpu);
|
||
|
-char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
|
||
|
+char * __acpi_map_table (paddr_t phys_addr, unsigned long size);
|
||
|
int acpi_boot_init (void);
|
||
|
int acpi_boot_table_init (void);
|
||
|
int acpi_numa_init (void);
|