On Sun, Mar 08, 2015 at 12:13:40PM -0400, Kevin O'Connor wrote:
On Sun, Mar 08, 2015 at 01:16:15PM +0200, Marcel Apfelbaum wrote:
If multiple root busses are used, root bus 0 cannot use all the pci holes ranges. Remove the IO/mem ranges used by the other primary busses.
[...]
- aml_append(crs,
aml_word_io(aml_min_fixed, aml_max_fixed,
aml_pos_decode, aml_entire_range,
0x0000, 0x0D00, 0xFFFF, 0x0000, 0xF300));
- /* prepare PCI IO ranges */
- range.base = 0x0D00;
- range.limit = 0xFFFF;
- if (QLIST_EMPTY(&io_ranges)) {
aml_append(crs,
aml_word_io(aml_min_fixed, aml_max_fixed,
aml_pos_decode, aml_entire_range,
0x0000, range.base, range.limit,
0x0000, range.limit - range.base + 1));
- } else {
QLIST_FOREACH(entry, &io_ranges, entry) {
if (range.base < entry->base) {
aml_append(crs,
aml_word_io(aml_min_fixed, aml_max_fixed,
aml_pos_decode, aml_entire_range,
0x0000, range.base, entry->base - 1,
0x0000, entry->base - range.base));
}
range.base = entry->limit + 1;
if (!QLIST_NEXT(entry, entry)) {
aml_append(crs,
aml_word_io(aml_min_fixed, aml_max_fixed,
aml_pos_decode, aml_entire_range,
0x0000, range.base, range.limit,
0x0000, range.limit - range.base + 1));
}
}
- }
If I read this correctly, it looks like a machine with two root buses and 20 devices, each with one memory range and one io range, would end up with 40 CRS ranges (ie, a CRS range for every resource).
I think that's only if you stick multiple devices directly behind the bridge. Looks like with a single pci bridge behind root, there will only be 2 ranges.
Maybe try to enforce this sane topology?
It also looks like this furthers the requirement that the guest firmware assign the PCI resources prior to QEMU being able to generate the ACPI tables.
That seems unavoidable unless we want to assign ranges from hardware/management. Which I think would be a mistake: management doesn't really know, or care.
-Kevin