Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 94823
b: refs/heads/master
c: e8ee6f0
h: refs/heads/master
i:
  94821: 18eb5d4
  94819: b02936d
  94815: 105962c
v: v3
  • Loading branch information
Yinghai Lu authored and Ingo Molnar committed Apr 26, 2008
1 parent 533ee4d commit 43333e7
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cbf9bd603ab1fc4d2ecb1c6a4b7bd1cc50a7e82a
refs/heads/master: e8ee6f0ae5cd860e8e6c02807edfa3c1fa01bcb5
56 changes: 38 additions & 18 deletions trunk/arch/x86/pci/k8-bus_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,25 @@ static void __init update_range(struct res_range *range, size_t start,
for (j = 0; j < RANGE_NUM; j++) {
if (!range[j].end)
continue;
if (start == range[j].start && end < range[j].end) {
range[j].start = end + 1;
break;
} else if (start == range[j].start && end == range[j].end) {

if (start <= range[j].start && end >= range[j].end) {
range[j].start = 0;
range[j].end = 0;
break;
} else if (start > range[j].start && end == range[j].end) {
continue;
}

if (start <= range[j].start && end < range[j].end && range[j].start < end + 1) {
range[j].start = end + 1;
continue;
}


if (start > range[j].start && end >= range[j].end && range[j].end > start - 1) {
range[j].end = start - 1;
break;
} else if (start > range[j].start && end < range[j].end) {
continue;
}

if (start > range[j].start && end < range[j].end) {
/* find the new spare */
for (i = 0; i < RANGE_NUM; i++) {
if (range[i].end == 0)
Expand All @@ -135,7 +143,7 @@ static void __init update_range(struct res_range *range, size_t start,
printk(KERN_ERR "run of slot in ranges\n");
}
range[j].end = start - 1;
break;
continue;
}
}
}
Expand All @@ -151,16 +159,24 @@ static void __init update_res(struct pci_root_info *info, size_t start,

/* try to merge it with old one */
for (i = 0; i < info->res_num; i++) {
size_t final_start, final_end;
size_t common_start, common_end;

res = &info->res[i];
if (res->flags != flags)
continue;
if (res->end + 1 == start) {
res->end = end;
return;
} else if (end + 1 == res->start) {
res->start = start;
return;
}

common_start = max((size_t)res->start, start);
common_end = min((size_t)res->end, end);
if (common_start > common_end + 1)
continue;

final_start = min((size_t)res->start, start);
final_end = max((size_t)res->end, end);

res->start = final_start;
res->end = final_end;
return;
}

addit:
Expand Down Expand Up @@ -336,7 +352,11 @@ static int __init early_fill_mp_bus_info(void)
info = &pci_root_info[j];
printk(KERN_DEBUG "node %d link %d: io port [%llx, %llx]\n",
node, link, (u64)start, (u64)end);
update_res(info, start, end, IORESOURCE_IO, 0);

/* kernel only handle 16 bit only */
if (end > 0xffff)
end = 0xffff;
update_res(info, start, end, IORESOURCE_IO, 1);
update_range(range, start, end);
}
/* add left over io port range to def node/link, [0, 0xffff] */
Expand Down Expand Up @@ -444,7 +464,7 @@ static int __init early_fill_mp_bus_info(void)
}
}

update_res(info, start, end, IORESOURCE_MEM, 0);
update_res(info, start, end, IORESOURCE_MEM, 1);
update_range(range, start, end);
printk(KERN_CONT "\n");
}
Expand Down

0 comments on commit 43333e7

Please sign in to comment.