lkml.org 
[lkml]   [2015]   [Feb]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[Patch v4 06/23] ACPI: Unify the parsing of address_space and ext_address_space
    Date
    From: Thomas Gleixner <tglx@linutronix.de>

    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 <tglx@linutronix.de>
    Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
    ---
    drivers/acpi/resource.c | 90 ++++++++++++++++++-----------------------------
    1 file changed, 34 insertions(+), 56 deletions(-)

    diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c
    index cdb1a3c4a0b9..99903d196024 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 *addr,
    + struct acpi_address64_attribute *attr)
    +{
    + u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16;
    + bool window = addr->producer_consumer == ACPI_PRODUCER;
    + bool wp = addr->info.mem.write_protect;
    + u64 len = attr->address_length;
    +
    + res->start = attr->minimum;
    + res->end = attr->maximum;
    +
    + switch (addr->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,13 @@ 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.address.minimum;
    - res->end = addr.address.maximum;
    - window = addr.producer_consumer == ACPI_PRODUCER;
    -
    - switch(addr.resource_type) {
    - case ACPI_MEMORY_RANGE:
    - acpi_dev_memresource_flags(res, addr.address.address_length,
    - addr.info.mem.write_protect,
    - window);
    - break;
    - case ACPI_IO_RANGE:
    - io_decode = addr.address.granularity == 0xfff ?
    - ACPI_DECODE_10 : ACPI_DECODE_16;
    - acpi_dev_ioresource_flags(res, addr.address.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, (struct acpi_resource_address *)&addr,
    + &addr.address);
    }
    EXPORT_SYMBOL_GPL(acpi_dev_resource_address_space);

    @@ -239,39 +242,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->address.minimum;
    - res->end = ext_addr->address.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.address_length,
    - ext_addr->info.mem.write_protect,
    - window);
    - break;
    - case ACPI_IO_RANGE:
    - io_decode = ext_addr->address.granularity == 0xfff ?
    - ACPI_DECODE_10 : ACPI_DECODE_16;
    - acpi_dev_ioresource_flags(res, ext_addr->address.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, (struct acpi_resource_address *)ext_addr,
    + &ext_addr->address);
    }
    EXPORT_SYMBOL_GPL(acpi_dev_resource_ext_address_space);

    --
    1.7.10.4


    \
     
     \ /
      Last update: 2015-02-05 07:21    [W:3.591 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site