@@ -32,7 +32,7 @@ static uint32_t pci_bar_get(pcidevaddr_t dev, int bar_num)
return pci_config_readl(dev, PCI_BASE_ADDRESS_0 + bar_num * 4);
}
-phys_addr_t pci_bar_addr(pcidevaddr_t dev, int bar_num)
+phys_addr_t pci_bar_get_addr(pcidevaddr_t dev, int bar_num)
{
uint32_t bar = pci_bar_get(dev, bar_num);
uint32_t mask = pci_bar_mask(bar);
@@ -44,6 +44,16 @@ phys_addr_t pci_bar_addr(pcidevaddr_t dev, int bar_num)
return pci_translate_addr(dev, addr);
}
+void pci_bar_set_addr(pcidevaddr_t dev, int bar_num, phys_addr_t addr)
+{
+ int off = PCI_BASE_ADDRESS_0 + bar_num * 4;
+
+ pci_config_writel(dev, off, (uint32_t)addr);
+
+ if (pci_bar_is64(dev, bar_num))
+ pci_config_writel(dev, off + 4, (uint32_t)(addr >> 32));
+}
+
/*
* To determine the amount of address space needed by a PCI device,
* one must save the original value of the BAR, write a value of
@@ -29,7 +29,8 @@ extern pcidevaddr_t pci_find_dev(uint16_t vendor_id, uint16_t device_id);
* It is expected the caller is aware of the device BAR layout and never
* tries to address the middle of a 64-bit register.
*/
-extern phys_addr_t pci_bar_addr(pcidevaddr_t dev, int bar_num);
+extern phys_addr_t pci_bar_get_addr(pcidevaddr_t dev, int bar_num);
+extern void pci_bar_set_addr(pcidevaddr_t dev, int bar_num, phys_addr_t addr);
extern phys_addr_t pci_bar_size(pcidevaddr_t dev, int bar_num);
extern bool pci_bar_is64(pcidevaddr_t dev, int bar_num);
extern bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num);
@@ -392,10 +392,10 @@ int main(int ac, char **av)
continue;
}
if (pci_bar_is_memory(pcidev, i)) {
- membar = pci_bar_addr(pcidev, i);
+ membar = pci_bar_get_addr(pcidev, i);
pci_test.memaddr = ioremap(membar, PAGE_SIZE);
} else {
- pci_test.iobar = pci_bar_addr(pcidev, i);
+ pci_test.iobar = pci_bar_get_addr(pcidev, i);
}
}
printf("pci-testdev at 0x%x membar %lx iobar %x\n",