Commit eb76d55e authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Rafael J. Wysocki
Browse files

ACPI: Unify the parsing of address_space and ext_address_space



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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e814f6de
Loading
Loading
Loading
Loading
+34 −56
Original line number Diff line number Diff line
@@ -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))
	if (ACPI_FAILURE(acpi_resource_to_address64(ares, &addr)))
		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:
		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);