mirror of
https://github.com/torvalds/linux.git
synced 2024-11-07 20:51:47 +00:00
Merge branch 'acpi-tables'
* acpi-tables: ACPI / x86: Increase override tables number limit
This commit is contained in:
commit
3f66c315f5
@ -26,6 +26,7 @@
|
|||||||
#include <acpi/pdc_intel.h>
|
#include <acpi/pdc_intel.h>
|
||||||
|
|
||||||
#include <asm/numa.h>
|
#include <asm/numa.h>
|
||||||
|
#include <asm/fixmap.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
|
@ -569,8 +569,10 @@ static const char * const table_sigs[] = {
|
|||||||
|
|
||||||
#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
||||||
|
|
||||||
/* Must not increase 10 or needs code modification below */
|
#define ACPI_OVERRIDE_TABLES 64
|
||||||
#define ACPI_OVERRIDE_TABLES 10
|
static struct cpio_data __initdata acpi_initrd_files[ACPI_OVERRIDE_TABLES];
|
||||||
|
|
||||||
|
#define MAP_CHUNK_SIZE (NR_FIX_BTMAPS << PAGE_SHIFT)
|
||||||
|
|
||||||
void __init acpi_initrd_override(void *data, size_t size)
|
void __init acpi_initrd_override(void *data, size_t size)
|
||||||
{
|
{
|
||||||
@ -579,8 +581,6 @@ void __init acpi_initrd_override(void *data, size_t size)
|
|||||||
struct acpi_table_header *table;
|
struct acpi_table_header *table;
|
||||||
char cpio_path[32] = "kernel/firmware/acpi/";
|
char cpio_path[32] = "kernel/firmware/acpi/";
|
||||||
struct cpio_data file;
|
struct cpio_data file;
|
||||||
struct cpio_data early_initrd_files[ACPI_OVERRIDE_TABLES];
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (data == NULL || size == 0)
|
if (data == NULL || size == 0)
|
||||||
return;
|
return;
|
||||||
@ -625,8 +625,8 @@ void __init acpi_initrd_override(void *data, size_t size)
|
|||||||
table->signature, cpio_path, file.name, table->length);
|
table->signature, cpio_path, file.name, table->length);
|
||||||
|
|
||||||
all_tables_size += table->length;
|
all_tables_size += table->length;
|
||||||
early_initrd_files[table_nr].data = file.data;
|
acpi_initrd_files[table_nr].data = file.data;
|
||||||
early_initrd_files[table_nr].size = file.size;
|
acpi_initrd_files[table_nr].size = file.size;
|
||||||
table_nr++;
|
table_nr++;
|
||||||
}
|
}
|
||||||
if (table_nr == 0)
|
if (table_nr == 0)
|
||||||
@ -652,14 +652,34 @@ void __init acpi_initrd_override(void *data, size_t size)
|
|||||||
memblock_reserve(acpi_tables_addr, all_tables_size);
|
memblock_reserve(acpi_tables_addr, all_tables_size);
|
||||||
arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
|
arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
|
||||||
|
|
||||||
p = early_ioremap(acpi_tables_addr, all_tables_size);
|
/*
|
||||||
|
* early_ioremap only can remap 256k one time. If we map all
|
||||||
|
* tables one time, we will hit the limit. Need to map chunks
|
||||||
|
* one by one during copying the same as that in relocate_initrd().
|
||||||
|
*/
|
||||||
for (no = 0; no < table_nr; no++) {
|
for (no = 0; no < table_nr; no++) {
|
||||||
memcpy(p + total_offset, early_initrd_files[no].data,
|
unsigned char *src_p = acpi_initrd_files[no].data;
|
||||||
early_initrd_files[no].size);
|
phys_addr_t size = acpi_initrd_files[no].size;
|
||||||
total_offset += early_initrd_files[no].size;
|
phys_addr_t dest_addr = acpi_tables_addr + total_offset;
|
||||||
|
phys_addr_t slop, clen;
|
||||||
|
char *dest_p;
|
||||||
|
|
||||||
|
total_offset += size;
|
||||||
|
|
||||||
|
while (size) {
|
||||||
|
slop = dest_addr & ~PAGE_MASK;
|
||||||
|
clen = size;
|
||||||
|
if (clen > MAP_CHUNK_SIZE - slop)
|
||||||
|
clen = MAP_CHUNK_SIZE - slop;
|
||||||
|
dest_p = early_ioremap(dest_addr & PAGE_MASK,
|
||||||
|
clen + slop);
|
||||||
|
memcpy(dest_p + slop, src_p, clen);
|
||||||
|
early_iounmap(dest_p, clen + slop);
|
||||||
|
src_p += clen;
|
||||||
|
dest_addr += clen;
|
||||||
|
size -= clen;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
early_iounmap(p, all_tables_size);
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */
|
#endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user