Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e0e9c04 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Len Brown
Browse files

PNPACPI: add bus number support



Add support for bus number resources.  This is for bridges with a range of
bus numbers behind them.  Previously, PNP ignored bus number resources.

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent fa35b492
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -166,6 +166,9 @@ struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev,
struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
					  resource_size_t start,
					  resource_size_t start,
					  resource_size_t end, int flags);
					  resource_size_t end, int flags);
struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev,
					  resource_size_t start,
					  resource_size_t end);


extern int pnp_debug;
extern int pnp_debug;


+1 −0
Original line number Original line Diff line number Diff line
@@ -278,6 +278,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,
		switch (pnp_resource_type(res)) {
		switch (pnp_resource_type(res)) {
		case IORESOURCE_IO:
		case IORESOURCE_IO:
		case IORESOURCE_MEM:
		case IORESOURCE_MEM:
		case IORESOURCE_BUS:
			pnp_printf(buffer, " %#llx-%#llx%s\n",
			pnp_printf(buffer, " %#llx-%#llx%s\n",
				   (unsigned long long) res->start,
				   (unsigned long long) res->start,
				   (unsigned long long) res->end,
				   (unsigned long long) res->end,
+14 −0
Original line number Original line Diff line number Diff line
@@ -265,6 +265,14 @@ static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev,
	pnp_add_mem_resource(dev, start, end, flags);
	pnp_add_mem_resource(dev, start, end, flags);
}
}


static void pnpacpi_parse_allocated_busresource(struct pnp_dev *dev,
						u64 start, u64 len)
{
	u64 end = start + len - 1;

	pnp_add_bus_resource(dev, start, end);
}

static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
						  struct acpi_resource *res)
						  struct acpi_resource *res)
{
{
@@ -290,6 +298,9 @@ static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
			p->minimum, p->address_length,
			p->minimum, p->address_length,
			p->granularity == 0xfff ? ACPI_DECODE_10 :
			p->granularity == 0xfff ? ACPI_DECODE_10 :
				ACPI_DECODE_16, window);
				ACPI_DECODE_16, window);
	else if (p->resource_type == ACPI_BUS_NUMBER_RANGE)
		pnpacpi_parse_allocated_busresource(dev, p->minimum,
						    p->address_length);
}
}


static void pnpacpi_parse_allocated_ext_address_space(struct pnp_dev *dev,
static void pnpacpi_parse_allocated_ext_address_space(struct pnp_dev *dev,
@@ -309,6 +320,9 @@ static void pnpacpi_parse_allocated_ext_address_space(struct pnp_dev *dev,
			p->minimum, p->address_length,
			p->minimum, p->address_length,
			p->granularity == 0xfff ? ACPI_DECODE_10 :
			p->granularity == 0xfff ? ACPI_DECODE_10 :
				ACPI_DECODE_16, window);
				ACPI_DECODE_16, window);
	else if (p->resource_type == ACPI_BUS_NUMBER_RANGE)
		pnpacpi_parse_allocated_busresource(dev, p->minimum,
						    p->address_length);
}
}


static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
+26 −1
Original line number Original line Diff line number Diff line
@@ -470,7 +470,8 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)
unsigned long pnp_resource_type(struct resource *res)
unsigned long pnp_resource_type(struct resource *res)
{
{
	return res->flags & (IORESOURCE_IO  | IORESOURCE_MEM |
	return res->flags & (IORESOURCE_IO  | IORESOURCE_MEM |
			     IORESOURCE_IRQ | IORESOURCE_DMA);
			     IORESOURCE_IRQ | IORESOURCE_DMA |
			     IORESOURCE_BUS);
}
}


struct resource *pnp_get_resource(struct pnp_dev *dev,
struct resource *pnp_get_resource(struct pnp_dev *dev,
@@ -590,6 +591,30 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
	return pnp_res;
	return pnp_res;
}
}


struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev,
					  resource_size_t start,
					  resource_size_t end)
{
	struct pnp_resource *pnp_res;
	struct resource *res;

	pnp_res = pnp_new_resource(dev);
	if (!pnp_res) {
		dev_err(&dev->dev, "can't add resource for BUS %#llx-%#llx\n",
			(unsigned long long) start,
			(unsigned long long) end);
		return NULL;
	}

	res = &pnp_res->res;
	res->flags = IORESOURCE_BUS;
	res->start = start;
	res->end = end;

	pnp_dbg(&dev->dev, "  add %pr\n", res);
	return pnp_res;
}

/*
/*
 * Determine whether the specified resource is a possible configuration
 * Determine whether the specified resource is a possible configuration
 * for this device.
 * for this device.
+3 −1
Original line number Original line Diff line number Diff line
@@ -69,8 +69,10 @@ char *pnp_resource_type_name(struct resource *res)
		return "irq";
		return "irq";
	case IORESOURCE_DMA:
	case IORESOURCE_DMA:
		return "dma";
		return "dma";
	case IORESOURCE_BUS:
		return "bus";
	}
	}
	return NULL;
	return "unknown";
}
}


void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc)
void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc)