mirror of
https://xff.cz/git/u-boot/
synced 2026-01-23 15:25:21 +01:00
pci: pci_mvebu: Fix write_config() with PCI_SIZE_8 or PCI_SIZE_16
Current implementation of write_config() is broken for PCI_SIZE_8 or PCI_SIZE_16 as it always uses writel(), which means that write operation is always 32-bit, so upper 24 bits for PCI_SIZE_8 and upper 16 bits for PCI_SIZE_16 are cleared. Fix this by using writeb() and writew(), respectively. Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
@@ -211,8 +211,19 @@ static int mvebu_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
|
||||
writel(PCIE_CONF_ADDR(bdf, offset), pcie->base + PCIE_CONF_ADDR_OFF);
|
||||
|
||||
/* write data */
|
||||
data = pci_conv_size_to_32(0, value, offset, size);
|
||||
writel(data, pcie->base + PCIE_CONF_DATA_OFF);
|
||||
switch (size) {
|
||||
case PCI_SIZE_8:
|
||||
writeb(value, pcie->base + PCIE_CONF_DATA_OFF + (offset & 3));
|
||||
break;
|
||||
case PCI_SIZE_16:
|
||||
writew(value, pcie->base + PCIE_CONF_DATA_OFF + (offset & 2));
|
||||
break;
|
||||
case PCI_SIZE_32:
|
||||
writel(value, pcie->base + PCIE_CONF_DATA_OFF);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user