-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Bjorn Helgaas
authored and
Jesse Barnes
committed
Dec 17, 2010
1 parent
39e8d34
commit 3ae54d6
Showing
2 changed files
with
38 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 30919b0bf356a8ee0ef4f7d38ca8ad99b96820b2 | ||
refs/heads/master: 4dc2287c1805e7fe8a7cb90bbcd44abee8cdb914 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,47 @@ | ||
#include <linux/ioport.h> | ||
#include <asm/e820.h> | ||
|
||
static void resource_clip(struct resource *res, resource_size_t start, | ||
resource_size_t end) | ||
{ | ||
resource_size_t low = 0, high = 0; | ||
|
||
if (res->end < start || res->start > end) | ||
return; /* no conflict */ | ||
|
||
if (res->start < start) | ||
low = start - res->start; | ||
|
||
if (res->end > end) | ||
high = res->end - end; | ||
|
||
/* Keep the area above or below the conflict, whichever is larger */ | ||
if (low > high) | ||
res->end = start - 1; | ||
else | ||
res->start = end + 1; | ||
} | ||
|
||
static void remove_e820_regions(struct resource *avail) | ||
{ | ||
int i; | ||
struct e820entry *entry; | ||
|
||
for (i = 0; i < e820.nr_map; i++) { | ||
entry = &e820.map[i]; | ||
|
||
resource_clip(avail, entry->addr, | ||
entry->addr + entry->size - 1); | ||
} | ||
} | ||
|
||
void arch_remove_reservations(struct resource *avail) | ||
{ | ||
/* Trim out BIOS area (low 1MB) */ | ||
/* Trim out BIOS area (low 1MB) and E820 regions */ | ||
if (avail->flags & IORESOURCE_MEM) { | ||
if (avail->start < BIOS_END) | ||
avail->start = BIOS_END; | ||
|
||
remove_e820_regions(avail); | ||
} | ||
} |