@@ -401,6 +401,31 @@ static void pci_config_init(PCIDevice *pci_dev)
PCI_CONFIG_ALLOC(pci_dev, used, config_size);
}
+static void pci_conf_init(PCIDevice *d, uint32_t addr, uint32_t wmask, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++) {
+ d->wmask[addr + i] = wmask & 0xff;
+ wmask >>= 8;
+ }
+}
+
+void pci_conf_initb(PCIDevice *d, uint32_t addr, uint32_t wmask)
+{
+ pci_conf_init(d, addr, wmask, 1);
+}
+
+void pci_conf_initw(PCIDevice *d, uint32_t addr, uint32_t wmask)
+{
+ pci_conf_init(d, addr, wmask, 2);
+}
+
+void pci_conf_initl(PCIDevice *d, uint32_t addr, uint32_t wmask)
+{
+ pci_conf_init(d, addr, wmask, 4);
+}
+
/* -1 for devfn means auto assign */
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
const char *name, int devfn,
@@ -254,6 +254,10 @@ struct PCIDevice {
target_phys_addr_t msix_page_size;
};
+void pci_conf_initb(PCIDevice *d, uint32_t addr, uint32_t wmask);
+void pci_conf_initw(PCIDevice *d, uint32_t addr, uint32_t wmask);
+void pci_conf_initl(PCIDevice *d, uint32_t addr, uint32_t wmask);
+
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
int instance_size, int devfn,
PCIConfigReadFunc *config_read,
add helper function to initialize wmask. This will be used later. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> --- hw/pci.c | 25 +++++++++++++++++++++++++ hw/pci.h | 4 ++++ 2 files changed, 29 insertions(+), 0 deletions(-)