u16 address, unsigned int size)
{
u32 reg_data = get_rax_reg(guest_regs, size);
+ enum pci_access access;
- if (pci_cfg_write_moderate(cell, device, address,
- size, reg_data) == PCI_ACCESS_REJECT)
+ access = pci_cfg_write_moderate(cell, device, address, size, reg_data);
+ if (access == PCI_ACCESS_REJECT)
return -1;
-
- arch_pci_write_config(device->bdf, address, reg_data, size);
-
+ if (access == PCI_ACCESS_PERFORM)
+ arch_pci_write_config(device->bdf, address, reg_data, size);
return 1;
}
#define PCI_DEVFN(bdf) ((bdf) & 0xff)
#define PCI_BDF_PARAMS(bdf) (bdf) >> 8, ((bdf) >> 3) & 0x1f, (bdf) & 7
-enum pci_access { PCI_ACCESS_REJECT, PCI_ACCESS_PERFORM, PCI_ACCESS_EMULATE };
+enum pci_access { PCI_ACCESS_REJECT, PCI_ACCESS_PERFORM, PCI_ACCESS_DONE };
int pci_init(void);
* @address: Config space address
* @size: Access size (1, 2 or 4 bytes)
* @value: Pointer to buffer to receive the emulated value if
- * PCI_ACCESS_EMULATE is returned
+ * PCI_ACCESS_DONE is returned
*
- * Return: PCI_ACCESS_PERFORM or PCI_ACCESS_EMULATE.
+ * Return: PCI_ACCESS_PERFORM or PCI_ACCESS_DONE.
*/
enum pci_access
pci_cfg_read_moderate(const struct cell *cell,
if (!device) {
*value = -1;
- return PCI_ACCESS_EMULATE;
+ return PCI_ACCESS_DONE;
}
if (address < PCI_CONFIG_HEADER_SIZE)
* @size: Access size (1, 2 or 4 bytes)
* @value: Value to be written
*
- * Return: PCI_ACCESS_REJECT, PCI_ACCESS_PERFORM or PCI_ACCESS_EMULATE.
+ * Return: PCI_ACCESS_REJECT, PCI_ACCESS_PERFORM or PCI_ACCESS_DONE.
*/
enum pci_access
pci_cfg_write_moderate(const struct cell *cell,
*value);
if (access == PCI_ACCESS_REJECT)
goto invalid_access;
- mmio_write32(pci_space + mmcfg_offset, *value);
+ if (access == PCI_ACCESS_PERFORM)
+ mmio_write32(pci_space + mmcfg_offset, *value);
} else {
access = pci_cfg_read_moderate(cell, device, reg_addr, 4,
value);