From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com ([134.134.136.24]:27186 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755744AbbAHCai (ORCPT ); Wed, 7 Jan 2015 21:30:38 -0500 From: Jiang Liu To: "Rafael J. Wysocki" , Thomas Gleixner , Bjorn Helgaas , Yinghai Lu , Borislav Petkov , Len Brown Cc: Tony Luck , x86@kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-acpi@vger.kernel.org, Jiang Liu Subject: [RFC Patch 06/19] ACPI: Unify the parsing of address_space and ext_address_space Date: Thu, 8 Jan 2015 10:32:53 +0800 Message-Id: <1420684386-5975-7-git-send-email-jiang.liu@linux.intel.com> In-Reply-To: <1420684386-5975-1-git-send-email-jiang.liu@linux.intel.com> References: <1420684386-5975-1-git-send-email-jiang.liu@linux.intel.com> Sender: linux-pci-owner@vger.kernel.org List-ID: From: Thomas Gleixner With the unions in place which let us identify the substructs we can use a single parser for address_space and ext_address_space. Signed-off-by: Thomas Gleixner Signed-off-by: Jiang Liu --- drivers/acpi/resource.c | 88 ++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 55 deletions(-) diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index deb70a839f80..d1ceba02afde 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -178,6 +178,35 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res) } EXPORT_SYMBOL_GPL(acpi_dev_resource_io); +static bool acpi_decode_space(struct resource *res, + struct acpi_resource_address *base, + struct acpi_resource_address64_common *addr) +{ + u8 iodec = addr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16; + bool window = base->producer_consumer == ACPI_PRODUCER; + bool wp = base->info.mem.write_protect; + u64 len = addr->address_length; + + res->start = addr->minimum; + res->end = addr->maximum; + + switch(base->resource_type) { + case ACPI_MEMORY_RANGE: + acpi_dev_memresource_flags(res, len, wp, window); + break; + case ACPI_IO_RANGE: + acpi_dev_ioresource_flags(res, len, iodec, window); + break; + case ACPI_BUS_NUMBER_RANGE: + res->flags = IORESOURCE_BUS; + break; + default: + return false; + } + + return !(res->flags & IORESOURCE_DISABLED); +} + /** * acpi_dev_resource_address_space - Extract ACPI address space information. * @ares: Input ACPI resource object. @@ -190,39 +219,12 @@ EXPORT_SYMBOL_GPL(acpi_dev_resource_io); bool acpi_dev_resource_address_space(struct acpi_resource *ares, struct resource *res) { - acpi_status status; struct acpi_resource_address64 addr; - bool window; - u8 io_decode; - - status = acpi_resource_to_address64(ares, &addr); - if (ACPI_FAILURE(status)) - return false; - res->start = addr.minimum; - res->end = addr.maximum; - window = addr.producer_consumer == ACPI_PRODUCER; - - switch(addr.resource_type) { - case ACPI_MEMORY_RANGE: - acpi_dev_memresource_flags(res, addr.address_length, - addr.info.mem.write_protect, - window); - break; - case ACPI_IO_RANGE: - io_decode = addr.granularity == 0xfff ? - ACPI_DECODE_10 : ACPI_DECODE_16; - acpi_dev_ioresource_flags(res, addr.address_length, - io_decode, window); - break; - case ACPI_BUS_NUMBER_RANGE: - res->flags = IORESOURCE_BUS; - break; - default: + if (ACPI_FAILURE(acpi_resource_to_address64(ares, &addr))) return false; - } - return !(res->flags & IORESOURCE_DISABLED); + return acpi_decode_space(res, &addr.common.base, &addr.common.addr); } EXPORT_SYMBOL_GPL(acpi_dev_resource_address_space); @@ -239,38 +241,14 @@ bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares, struct resource *res) { struct acpi_resource_extended_address64 *ext_addr; - bool window; - u8 io_decode; if (ares->type != ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64) return false; ext_addr = &ares->data.ext_address64; - res->start = ext_addr->minimum; - res->end = ext_addr->maximum; - window = ext_addr->producer_consumer == ACPI_PRODUCER; - - switch(ext_addr->resource_type) { - case ACPI_MEMORY_RANGE: - acpi_dev_memresource_flags(res, ext_addr->address_length, - ext_addr->info.mem.write_protect, - window); - break; - case ACPI_IO_RANGE: - io_decode = ext_addr->granularity == 0xfff ? - ACPI_DECODE_10 : ACPI_DECODE_16; - acpi_dev_ioresource_flags(res, ext_addr->address_length, - io_decode, window); - break; - case ACPI_BUS_NUMBER_RANGE: - res->flags = IORESOURCE_BUS; - break; - default: - return false; - } - - return !(res->flags & IORESOURCE_DISABLED); + return acpi_decode_space(res, &ext_addr->common.base, + &ext_addr->common.addr); } EXPORT_SYMBOL_GPL(acpi_dev_resource_ext_address_space); -- 1.7.10.4