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

Commit 60f061e1 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

i2o: Refactor i2o_iop_systab_set() PCI space allocation



Refactor the PCI space allocation in i2o_iop_systab_set().  This might
improve readability slightly, but mainly it is to make the next patch
simpler.

No functional change.

Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 5c513bd5
Loading
Loading
Loading
Loading
+46 −43
Original line number Diff line number Diff line
@@ -652,66 +652,69 @@ static int i2o_iop_activate(struct i2o_controller *c)
	return i2o_hrt_get(c);
};

/**
 *	i2o_iop_systab_set - Set the I2O System Table of the specified IOP
 *	@c: I2O controller to which the system table should be send
 *
 *	Before the systab could be set i2o_systab_build() must be called.
 *
 *	Returns 0 on success or negative error code on failure.
 */
static int i2o_iop_systab_set(struct i2o_controller *c)
static void i2o_res_alloc(struct i2o_controller *c, unsigned long flags)
{
	struct i2o_message *msg;
	i2o_status_block *sb = c->status_block.virt;
	struct device *dev = &c->pdev->dev;
	struct resource *root;
	int rc;
	struct resource *root, *res = &c->mem_resource;
	resource_size_t size, min, max, align;
	int err;

	if (sb->current_mem_size < sb->desired_mem_size) {
		struct resource *res = &c->mem_resource;
	res->name = c->pdev->bus->name;
		res->flags = IORESOURCE_MEM;
	res->flags = flags;
	res->start = 0;
	res->end = 0;
	osm_info("%s: requires private memory resources.\n", c->name);
	root = pci_find_parent_resource(c->pdev, res);
		if (root == NULL)
	if (root == NULL) {
		osm_warn("%s: Can't find parent resource!\n", c->name);
		if (root && allocate_resource(root, res, sb->desired_mem_size, sb->desired_mem_size, sb->desired_mem_size, 1 << 20,	/* Unspecified, so use 1Mb and play safe */
					      NULL, NULL) >= 0) {
			c->mem_alloc = 1;
			sb->current_mem_size = resource_size(res);
			sb->current_mem_base = res->start;
			osm_info("%s: allocated %llu bytes of PCI memory at "
				"0x%016llX.\n", c->name,
				(unsigned long long)resource_size(res),
				(unsigned long long)res->start);
		return;
	}

	if (flags & IORESOURCE_MEM) {
		size = min = max = sb->desired_mem_size;
		align = 1 << 20;	/* unspecified, use 1Mb and play safe */
	} else {
		size = min = max = sb->desired_io_size;
		align = 1 << 12;	/* unspecified, use 4Kb and play safe */
	}

	if (sb->current_io_size < sb->desired_io_size) {
		struct resource *res = &c->io_resource;
		res->name = c->pdev->bus->name;
		res->flags = IORESOURCE_IO;
		res->start = 0;
		res->end = 0;
		osm_info("%s: requires private memory resources.\n", c->name);
		root = pci_find_parent_resource(c->pdev, res);
		if (root == NULL)
			osm_warn("%s: Can't find parent resource!\n", c->name);
		if (root && allocate_resource(root, res, sb->desired_io_size, sb->desired_io_size, sb->desired_io_size, 1 << 12,	/* Unspecified, so use 4Kb and play safe */
					      NULL, NULL) >= 0) {
	err = allocate_resource(root, res, size, min, max, align, NULL, NULL);
	if (err < 0)
		return;

	if (flags & IORESOURCE_MEM) {
		c->mem_alloc = 1;
		sb->current_mem_size = resource_size(res);
		sb->current_mem_base = res->start;
	} else if (flags & IORESOURCE_IO) {
		c->io_alloc = 1;
		sb->current_io_size = resource_size(res);
		sb->current_io_base = res->start;
			osm_info("%s: allocated %llu bytes of PCI I/O at "
				"0x%016llX.\n", c->name,
				(unsigned long long)resource_size(res),
				(unsigned long long)res->start);
	}
	osm_info("%s: allocated PCI space %pR\n", c->name, res);
}

/**
 *	i2o_iop_systab_set - Set the I2O System Table of the specified IOP
 *	@c: I2O controller to which the system table should be send
 *
 *	Before the systab could be set i2o_systab_build() must be called.
 *
 *	Returns 0 on success or negative error code on failure.
 */
static int i2o_iop_systab_set(struct i2o_controller *c)
{
	struct i2o_message *msg;
	i2o_status_block *sb = c->status_block.virt;
	struct device *dev = &c->pdev->dev;
	int rc;

	if (sb->current_mem_size < sb->desired_mem_size)
		i2o_res_alloc(c, IORESOURCE_MEM);

	if (sb->current_io_size < sb->desired_io_size)
		i2o_res_alloc(c, IORESOURCE_IO);

	msg = i2o_msg_get_wait(c, I2O_TIMEOUT_MESSAGE_GET);
	if (IS_ERR(msg))
		return PTR_ERR(msg);