Unverified Commit d8650c0c authored by Sven Peter's avatar Sven Peter Committed by Krzysztof Wilczyński
Browse files

PCI: apple: Initialize pcie->nvecs before use

The apple_pcie_setup_port() function computes ilog2(pcie->nvecs) to set
up the number of MSIs available for each port. However, it's called
before apple_msi_init(), which initializes pcie->nvecs.

Luckily, pcie->nvecs is part of kzalloc()-ed structure and, as such,
initialized as zero. ilog2(0) happens to be 0xffffffff which then simply
configures more MSIs in hardware than we have. This doesn't break
anything because we never hand out those vectors.

Thus, swap the order of the two calls so that the correctly initialized
value is then used.

[kwilczynski: commit log]
Link: https://lore.kernel.org/linux-pci/20230311133453.63246-1-sven@svenpeter.dev


Fixes: 476c41ed ("PCI: apple: Implement MSI support")
Signed-off-by: default avatarSven Peter <sven@svenpeter.dev>
Signed-off-by: default avatarKrzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Reviewed-by: default avatarAlyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: default avatarEric Curtin <ecurtin@redhat.com>
parent 06c2afb8
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -783,6 +783,10 @@ static int apple_pcie_init(struct pci_config_window *cfg)
	cfg->priv = pcie;
	INIT_LIST_HEAD(&pcie->ports);

	ret = apple_msi_init(pcie);
	if (ret)
		return ret;

	for_each_child_of_node(dev->of_node, of_port) {
		ret = apple_pcie_setup_port(pcie, of_port);
		if (ret) {
@@ -792,7 +796,7 @@ static int apple_pcie_init(struct pci_config_window *cfg)
		}
	}

	return apple_msi_init(pcie);
	return 0;
}

static int apple_pcie_probe(struct platform_device *pdev)