Lines Matching +full:axi +full:- +full:pcie +full:- +full:host +full:- +full:1
2 * Xilinx PCIe host controller emulation.
25 #include "hw/qdev-properties.h"
27 #include "hw/pci-host/xilinx-pcie.h"
36 #define ROOTCFG_INTMASK_INTX (1 << 16)
38 #define ROOTCFG_INTMASK_MSI (1 << 17)
43 #define ROOTCFG_PSCR_LINK_UP (1 << 11)
48 #define ROOTCFG_RPSCR_BRIDGEEN (1 << 0)
50 #define ROOTCFG_RPSCR_INTNEMPTY (1 << 18)
52 #define ROOTCFG_RPSCR_INTOVF (1 << 19)
54 /* Root Port Interrupt FIFO Read Register 1 */
68 s->intr |= set; in xilinx_pcie_update_intr()
69 s->intr &= ~clear; in xilinx_pcie_update_intr()
71 if (s->intr_fifo_r != s->intr_fifo_w) { in xilinx_pcie_update_intr()
72 s->intr |= ROOTCFG_INTMASK_INTX; in xilinx_pcie_update_intr()
75 level = !!(s->intr & s->intr_mask); in xilinx_pcie_update_intr()
76 qemu_set_irq(s->irq, level); in xilinx_pcie_update_intr()
85 new_w = (s->intr_fifo_w + 1) % ARRAY_SIZE(s->intr_fifo); in xilinx_pcie_queue_intr()
86 if (new_w == s->intr_fifo_r) { in xilinx_pcie_queue_intr()
87 s->rpscr |= ROOTCFG_RPSCR_INTOVF; in xilinx_pcie_queue_intr()
91 intr = &s->intr_fifo[s->intr_fifo_w]; in xilinx_pcie_queue_intr()
92 s->intr_fifo_w = new_w; in xilinx_pcie_queue_intr()
94 intr->fifo_reg1 = fifo_reg1; in xilinx_pcie_queue_intr()
95 intr->fifo_reg2 = fifo_reg2; in xilinx_pcie_queue_intr()
107 (1 << ROOTCFG_RPIFR1_INT_VALID_SHIFT), in xilinx_pcie_set_irq()
118 snprintf(s->name, sizeof(s->name), "pcie%u", s->bus_nr); in xilinx_pcie_host_realize()
121 pcie_host_mmcfg_init(pex, s->cfg_size); in xilinx_pcie_host_realize()
124 memory_region_init(&s->mmio, OBJECT(s), "mmio", UINT64_MAX); in xilinx_pcie_host_realize()
125 memory_region_set_enabled(&s->mmio, false); in xilinx_pcie_host_realize()
128 memory_region_init(&s->io, OBJECT(s), "io", 16); in xilinx_pcie_host_realize()
131 qdev_init_gpio_out_named(dev, &s->irq, "interrupt_out", 1); in xilinx_pcie_host_realize()
133 sysbus_init_mmio(sbd, &pex->mmio); in xilinx_pcie_host_realize()
134 sysbus_init_mmio(sbd, &s->mmio); in xilinx_pcie_host_realize()
136 pci->bus = pci_register_root_bus(dev, s->name, xilinx_pcie_set_irq, in xilinx_pcie_host_realize()
137 pci_swizzle_map_irq_fn, s, &s->mmio, in xilinx_pcie_host_realize()
138 &s->io, 0, 4, TYPE_PCIE_BUS); in xilinx_pcie_host_realize()
140 qdev_realize(DEVICE(&s->root), BUS(pci->bus), &error_fatal); in xilinx_pcie_host_realize()
152 XilinxPCIERoot *root = &s->root; in xilinx_pcie_host_init()
164 DEFINE_PROP_SIZE("mmio_size", XilinxPCIEHost, mmio_size, 1 * MiB),
174 hc->root_bus_path = xilinx_pcie_host_root_bus_path; in xilinx_pcie_host_class_init()
175 dc->realize = xilinx_pcie_host_realize; in xilinx_pcie_host_class_init()
176 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); in xilinx_pcie_host_class_init()
177 dc->fw_name = "pci"; in xilinx_pcie_host_class_init()
192 XilinxPCIEHost *s = XILINX_PCIE_HOST(OBJECT(d)->parent); in xilinx_pcie_root_config_read()
197 val = s->intr; in xilinx_pcie_root_config_read()
200 val = s->intr_mask; in xilinx_pcie_root_config_read()
203 val = s->link_up ? ROOTCFG_PSCR_LINK_UP : 0; in xilinx_pcie_root_config_read()
206 if (s->intr_fifo_r != s->intr_fifo_w) { in xilinx_pcie_root_config_read()
207 s->rpscr &= ~ROOTCFG_RPSCR_INTNEMPTY; in xilinx_pcie_root_config_read()
209 s->rpscr |= ROOTCFG_RPSCR_INTNEMPTY; in xilinx_pcie_root_config_read()
211 val = s->rpscr; in xilinx_pcie_root_config_read()
214 if (s->intr_fifo_w == s->intr_fifo_r) { in xilinx_pcie_root_config_read()
218 val = s->intr_fifo[s->intr_fifo_r].fifo_reg1; in xilinx_pcie_root_config_read()
222 if (s->intr_fifo_w == s->intr_fifo_r) { in xilinx_pcie_root_config_read()
226 val = s->intr_fifo[s->intr_fifo_r].fifo_reg2; in xilinx_pcie_root_config_read()
239 XilinxPCIEHost *s = XILINX_PCIE_HOST(OBJECT(d)->parent); in xilinx_pcie_root_config_write()
245 s->intr_mask = val; in xilinx_pcie_root_config_write()
249 s->rpscr &= ~ROOTCFG_RPSCR_BRIDGEEN; in xilinx_pcie_root_config_write()
250 s->rpscr |= val & ROOTCFG_RPSCR_BRIDGEEN; in xilinx_pcie_root_config_write()
251 memory_region_set_enabled(&s->mmio, val & ROOTCFG_RPSCR_BRIDGEEN); in xilinx_pcie_root_config_write()
254 s->rpscr &= ~ROOTCFG_INTMASK_INTX; in xilinx_pcie_root_config_write()
259 if (s->intr_fifo_w == s->intr_fifo_r) { in xilinx_pcie_root_config_write()
263 s->intr_fifo_r = (s->intr_fifo_r + 1) % ARRAY_SIZE(s->intr_fifo); in xilinx_pcie_root_config_write()
275 XilinxPCIEHost *s = XILINX_PCIE_HOST(bus->parent); in xilinx_pcie_root_realize()
277 pci_set_word(pci_dev->config + PCI_COMMAND, in xilinx_pcie_root_realize()
279 pci_set_word(pci_dev->config + PCI_MEMORY_BASE, s->mmio_base >> 16); in xilinx_pcie_root_realize()
280 pci_set_word(pci_dev->config + PCI_MEMORY_LIMIT, in xilinx_pcie_root_realize()
281 ((s->mmio_base + s->mmio_size - 1) >> 16) & 0xfff0); in xilinx_pcie_root_realize()
286 error_setg(errp, "Failed to initialize PCIe capability"); in xilinx_pcie_root_realize()
295 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); in xilinx_pcie_root_class_init()
296 dc->desc = "Xilinx AXI-PCIe Host Bridge"; in xilinx_pcie_root_class_init()
297 k->vendor_id = PCI_VENDOR_ID_XILINX; in xilinx_pcie_root_class_init()
298 k->device_id = 0x7021; in xilinx_pcie_root_class_init()
299 k->revision = 0; in xilinx_pcie_root_class_init()
300 k->class_id = PCI_CLASS_BRIDGE_HOST; in xilinx_pcie_root_class_init()
301 k->realize = xilinx_pcie_root_realize; in xilinx_pcie_root_class_init()
302 k->exit = pci_bridge_exitfn; in xilinx_pcie_root_class_init()
304 k->config_read = xilinx_pcie_root_config_read; in xilinx_pcie_root_class_init()
305 k->config_write = xilinx_pcie_root_config_write; in xilinx_pcie_root_class_init()
307 * PCI-facing part of the host bridge, not usable without the in xilinx_pcie_root_class_init()
308 * host-facing part, which can't be device_add'ed, yet. in xilinx_pcie_root_class_init()
310 dc->user_creatable = false; in xilinx_pcie_root_class_init()