X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fecam.c;h=e2b941246d09224da5e64bbb1e4db19c05a58b17;hb=93c1c6bcc9e2b52652b859986354ddd54ef34058;hp=961e4162d1dd1837e9a6b61d051c4d9ed3723567;hpb=6182921907ef3cc31be3394eb468b24bcd3955a8;p=pciutils.git diff --git a/lib/ecam.c b/lib/ecam.c index 961e416..e2b9412 100644 --- a/lib/ecam.c +++ b/lib/ecam.c @@ -618,6 +618,24 @@ validate_addrs(const char *addrs) return 1; } +static int +calculate_bus_addr(u8 start_bus, off_t start_addr, u32 total_length, u8 bus, off_t *addr, u32 *length) +{ + u32 offset; + + offset = 32*8*4096 * (bus - start_bus); + if (offset >= total_length) + return 0; + + *addr = start_addr + offset; + *length = total_length - offset; + + if (*length > 32*8*4096) + *length = 32*8*4096; + + return 1; +} + static int get_bus_addr(struct acpi_mcfg *mcfg, const char *addrs, int domain, u8 bus, off_t *addr, u32 *length) { @@ -626,7 +644,6 @@ get_bus_addr(struct acpi_mcfg *mcfg, const char *addrs, int domain, u8 bus, off_ u8 end_bus; off_t start_addr; u32 total_length; - u32 offset; int i, count; if (mcfg) @@ -636,14 +653,7 @@ get_bus_addr(struct acpi_mcfg *mcfg, const char *addrs, int domain, u8 bus, off_ { get_mcfg_allocation(mcfg, i, &cur_domain, &start_bus, &end_bus, &start_addr, &total_length); if (domain == cur_domain && bus >= start_bus && bus <= end_bus) - { - offset = 32*8*4096 * (bus - start_bus); - if (offset >= total_length) - return 0; - *addr = start_addr + offset; - *length = total_length - offset; - return 1; - } + return calculate_bus_addr(start_bus, start_addr, total_length, bus, addr, length); } return 0; } @@ -654,14 +664,7 @@ get_bus_addr(struct acpi_mcfg *mcfg, const char *addrs, int domain, u8 bus, off_ if (!parse_next_addrs(addrs, &addrs, &cur_domain, &start_bus, &end_bus, &start_addr, &total_length)) return 0; if (domain == cur_domain && bus >= start_bus && bus <= end_bus) - { - offset = 32*8*4096 * (bus - start_bus); - if (offset >= total_length) - return 0; - *addr = start_addr + offset; - *length = total_length - offset; - return 1; - } + return calculate_bus_addr(start_bus, start_addr, total_length, bus, addr, length); } return 0; }