Lines Matching +full:array +full:- +full:nest
2 * QEMU rocker switch emulation - PCI device
20 #include "hw/qdev-properties.h"
21 #include "hw/qdev-properties-system.h"
27 #include "qapi/qapi-commands-rocker.h"
52 uint32_t fp_ports; /* front-panel port count */
54 MACAddr fp_start_macaddr; /* front-panel port 0 mac addr */
57 /* front-panel ports */
65 uint64_t lower32; /* lower 32-bit val in 2-part 64-bit access */
84 if (strcmp(r->name, name) == 0) { in rocker_find()
94 return r->worlds[type]; in rocker_get_world()
111 rocker->name = g_strdup(r->name); in qmp_query_rocker()
112 rocker->id = r->switch_id; in qmp_query_rocker()
113 rocker->ports = r->fp_ports; in qmp_query_rocker()
130 for (i = r->fp_ports - 1; i >= 0; i--) { in qmp_query_rocker_ports()
131 QAPI_LIST_PREPEND(list, fp_port_get_info(r->fp_port[i])); in qmp_query_rocker_ports()
140 return (desc_ring_index(ring) - 2) / 2 + 1; in rocker_get_pport_by_tx_ring()
162 return -ROCKER_ENXIO; in tx_consume()
168 return -ROCKER_EINVAL; in tx_consume()
173 return -ROCKER_EINVAL; in tx_consume()
183 return -ROCKER_EINVAL; in tx_consume()
189 return -ROCKER_EINVAL; in tx_consume()
219 err = -ROCKER_EINVAL; in tx_consume()
227 err = -ROCKER_EINVAL; in tx_consume()
246 err = fp_port_eg(r->fp_port[port], iov, iovcnt); in tx_consume()
262 RockerTlv *nest; in cmd_get_port_settings() local
281 return -ROCKER_EINVAL; in cmd_get_port_settings()
286 return -ROCKER_EINVAL; in cmd_get_port_settings()
288 fp_port = r->fp_port[port]; in cmd_get_port_settings()
300 tlv_size = rocker_tlv_total_size(0) + /* nest */ in cmd_get_port_settings()
311 return -ROCKER_EMSGSIZE; in cmd_get_port_settings()
315 nest = rocker_tlv_nest_start(buf, &pos, ROCKER_TLV_CMD_INFO); in cmd_get_port_settings()
327 rocker_tlv_nest_end(buf, &pos, nest); in cmd_get_port_settings()
351 return -ROCKER_EINVAL; in cmd_set_port_settings()
356 return -ROCKER_EINVAL; in cmd_set_port_settings()
358 fp_port = r->fp_port[port]; in cmd_set_port_settings()
377 return -ROCKER_EINVAL; in cmd_set_port_settings()
388 return -ROCKER_EINVAL; in cmd_set_port_settings()
391 if (!fp_port_check_world(fp_port, r->worlds[mode])) { in cmd_set_port_settings()
392 return -ROCKER_EINVAL; in cmd_set_port_settings()
415 return -ROCKER_ENXIO; in cmd_consume()
421 return -ROCKER_EINVAL; in cmd_consume()
428 * Every world will have an array of command handlers from in cmd_consume()
444 world = r->worlds[ROCKER_WORLD_TYPE_OF_DPA]; in cmd_consume()
454 err = -ROCKER_EINVAL; in cmd_consume()
465 DPRINTF("MSI-X notify request for vector %d\n", vector); in rocker_msix_irq()
466 if (vector >= ROCKER_MSIX_VEC_COUNT(r->fp_ports)) { in rocker_msix_irq()
475 DescRing *ring = r->rings[ROCKER_RING_EVENT]; in rocker_event_link_changed()
477 RockerTlv *nest; in rocker_event_link_changed() local
484 return -ROCKER_ENOBUFS; in rocker_event_link_changed()
488 rocker_tlv_total_size(0) + /* nest */ in rocker_event_link_changed()
493 err = -ROCKER_EMSGSIZE; in rocker_event_link_changed()
499 err = -ROCKER_ENOMEM; in rocker_event_link_changed()
506 nest = rocker_tlv_nest_start(buf, &pos, ROCKER_TLV_EVENT_INFO); in rocker_event_link_changed()
510 rocker_tlv_nest_end(buf, &pos, nest); in rocker_event_link_changed()
526 DescRing *ring = r->rings[ROCKER_RING_EVENT]; in rocker_event_mac_vlan_seen()
530 RockerTlv *nest; in rocker_event_mac_vlan_seen() local
537 return -ROCKER_EINVAL; in rocker_event_mac_vlan_seen()
539 fp_port = r->fp_port[port]; in rocker_event_mac_vlan_seen()
546 return -ROCKER_ENOBUFS; in rocker_event_mac_vlan_seen()
550 rocker_tlv_total_size(0) + /* nest */ in rocker_event_mac_vlan_seen()
556 err = -ROCKER_EMSGSIZE; in rocker_event_mac_vlan_seen()
562 err = -ROCKER_ENOMEM; in rocker_event_mac_vlan_seen()
569 nest = rocker_tlv_nest_start(buf, &pos, ROCKER_TLV_EVENT_INFO); in rocker_event_mac_vlan_seen()
573 rocker_tlv_nest_end(buf, &pos, nest); in rocker_event_mac_vlan_seen()
589 return r->rings[(pport - 1) * 2 + 3]; in rocker_get_rx_ring_by_pport()
612 return -ROCKER_ENOBUFS; in rx_produce()
617 err = -ROCKER_ENXIO; in rx_produce()
624 err = -ROCKER_EINVAL; in rx_produce()
632 err = -ROCKER_EMSGSIZE; in rx_produce()
649 err = -ROCKER_EMSGSIZE; in rx_produce()
676 rocker_msix_irq(r, ROCKER_MSIX_VEC_RX(pport - 1)); in rx_produce()
689 return -ROCKER_EINVAL; in rocker_port_eg()
692 fp_port = r->fp_port[port]; in rocker_port_eg()
703 buf = g_malloc(r->test_dma_size); in rocker_test_dma_ctrl()
707 memset(buf, 0, r->test_dma_size); in rocker_test_dma_ctrl()
710 memset(buf, 0x96, r->test_dma_size); in rocker_test_dma_ctrl()
713 pci_dma_read(dev, r->test_dma_addr, buf, r->test_dma_size); in rocker_test_dma_ctrl()
714 for (i = 0; i < r->test_dma_size; i++) { in rocker_test_dma_ctrl()
722 pci_dma_write(dev, r->test_dma_addr, buf, r->test_dma_size); in rocker_test_dma_ctrl()
742 * - command ring in rocker_pci_ring_count()
743 * - event ring in rocker_pci_ring_count()
744 * - tx and rx ring per each port in rocker_pci_ring_count()
746 return 2 + (2 * r->fp_ports); in rocker_pci_ring_count()
764 for (i = 0; i < r->fp_ports; i++) { in rocker_port_phys_enable_write()
765 fp_port = r->fp_port[i]; in rocker_port_phys_enable_write()
772 fp_port_enable(r->fp_port[i]); in rocker_port_phys_enable_write()
774 fp_port_disable(r->fp_port[i]); in rocker_port_phys_enable_write()
789 r->lower32 = (uint64_t)val; in rocker_io_writel()
792 desc_ring_set_base_addr(r->rings[index], in rocker_io_writel()
793 ((uint64_t)val) << 32 | r->lower32); in rocker_io_writel()
794 r->lower32 = 0; in rocker_io_writel()
797 desc_ring_set_size(r->rings[index], val); in rocker_io_writel()
800 if (desc_ring_set_head(r->rings[index], val)) { in rocker_io_writel()
801 rocker_msix_irq(r, desc_ring_get_msix_vector(r->rings[index])); in rocker_io_writel()
805 desc_ring_set_ctrl(r->rings[index], val); in rocker_io_writel()
808 if (desc_ring_ret_credits(r->rings[index], val)) { in rocker_io_writel()
809 rocker_msix_irq(r, desc_ring_get_msix_vector(r->rings[index])); in rocker_io_writel()
823 r->test_reg = val; in rocker_io_writel()
828 r->lower32 = (uint64_t)val; in rocker_io_writel()
831 r->test_reg64 = ((uint64_t)val) << 32 | r->lower32; in rocker_io_writel()
832 r->lower32 = 0; in rocker_io_writel()
838 r->test_dma_size = val & 0xFFFF; in rocker_io_writel()
841 r->test_dma_addr = ((uint64_t)val) << 32 | r->lower32; in rocker_io_writel()
842 r->lower32 = 0; in rocker_io_writel()
851 rocker_port_phys_enable_write(r, ((uint64_t)val) << 32 | r->lower32); in rocker_io_writel()
852 r->lower32 = 0; in rocker_io_writel()
871 desc_ring_set_base_addr(r->rings[index], val); in rocker_io_writeq()
884 r->test_reg64 = val; in rocker_io_writeq()
887 r->test_dma_addr = val; in rocker_io_writeq()
919 sprintf(ring_name, "%s-%d", index % 2 ? "rx" : "tx", in rocker_reg_name()
920 (index - 2) / 2); in rocker_reg_name()
1004 for (i = 0; i < r->fp_ports; i++) { in rocker_port_phys_link_status()
1005 FpPort *port = r->fp_port[i]; in rocker_port_phys_link_status()
1019 for (i = 0; i < r->fp_ports; i++) { in rocker_port_phys_enable_read()
1020 FpPort *port = r->fp_port[i]; in rocker_port_phys_enable_read()
1040 ret = (uint32_t)desc_ring_get_base_addr(r->rings[index]); in rocker_io_readl()
1043 ret = (uint32_t)(desc_ring_get_base_addr(r->rings[index]) >> 32); in rocker_io_readl()
1046 ret = desc_ring_get_size(r->rings[index]); in rocker_io_readl()
1049 ret = desc_ring_get_head(r->rings[index]); in rocker_io_readl()
1052 ret = desc_ring_get_tail(r->rings[index]); in rocker_io_readl()
1055 ret = desc_ring_get_credits(r->rings[index]); in rocker_io_readl()
1074 ret = r->test_reg * 2; in rocker_io_readl()
1077 ret = (uint32_t)(r->test_reg64 * 2); in rocker_io_readl()
1080 ret = (uint32_t)((r->test_reg64 * 2) >> 32); in rocker_io_readl()
1083 ret = r->test_dma_size; in rocker_io_readl()
1086 ret = (uint32_t)r->test_dma_addr; in rocker_io_readl()
1089 ret = (uint32_t)(r->test_dma_addr >> 32); in rocker_io_readl()
1092 ret = r->fp_ports; in rocker_io_readl()
1107 ret = (uint32_t)r->switch_id; in rocker_io_readl()
1110 ret = (uint32_t)(r->switch_id >> 32); in rocker_io_readl()
1131 ret = desc_ring_get_base_addr(r->rings[index]); in rocker_io_readq()
1148 ret = r->test_reg64 * 2; in rocker_io_readq()
1151 ret = r->test_dma_addr; in rocker_io_readq()
1160 ret = r->switch_id; in rocker_io_readq()
1182 return -1; in rocker_mmio_read()
1225 err = msix_init(dev, ROCKER_MSIX_VEC_COUNT(r->fp_ports), in rocker_msix_init()
1226 &r->msix_bar, in rocker_msix_init()
1228 &r->msix_bar, in rocker_msix_init()
1235 rocker_msix_vectors_use(r, ROCKER_MSIX_VEC_COUNT(r->fp_ports)); in rocker_msix_init()
1244 msix_uninit(dev, &r->msix_bar, &r->msix_bar); in rocker_msix_uninit()
1245 rocker_msix_vectors_unuse(r, ROCKER_MSIX_VEC_COUNT(r->fp_ports)); in rocker_msix_uninit()
1253 if (strcmp(name, world_name(r->worlds[i])) == 0) { in rocker_world_type_by_name()
1254 return r->worlds[i]; in rocker_world_type_by_name()
1270 r->worlds[ROCKER_WORLD_TYPE_OF_DPA] = of_dpa_world_alloc(r); in pci_rocker_realize()
1272 if (!r->world_name) { in pci_rocker_realize()
1273 r->world_name = g_strdup(world_name(r->worlds[ROCKER_WORLD_TYPE_OF_DPA])); in pci_rocker_realize()
1276 r->world_dflt = rocker_world_type_by_name(r, r->world_name); in pci_rocker_realize()
1277 if (!r->world_dflt) { in pci_rocker_realize()
1280 r->world_name); in pci_rocker_realize()
1284 /* set up memory-mapped region at BAR0 */ in pci_rocker_realize()
1286 memory_region_init_io(&r->mmio, OBJECT(r), &rocker_mmio_ops, r, in pci_rocker_realize()
1287 "rocker-mmio", ROCKER_PCI_BAR0_SIZE); in pci_rocker_realize()
1289 PCI_BASE_ADDRESS_SPACE_MEMORY, &r->mmio); in pci_rocker_realize()
1291 /* set up memory-mapped region for MSI-X */ in pci_rocker_realize()
1293 memory_region_init(&r->msix_bar, OBJECT(r), "rocker-msix-bar", in pci_rocker_realize()
1296 PCI_BASE_ADDRESS_SPACE_MEMORY, &r->msix_bar); in pci_rocker_realize()
1298 /* MSI-X init */ in pci_rocker_realize()
1307 if (!r->name) { in pci_rocker_realize()
1308 r->name = g_strdup(TYPE_ROCKER); in pci_rocker_realize()
1311 if (rocker_find(r->name)) { in pci_rocker_realize()
1312 error_setg(errp, "%s already exists", r->name); in pci_rocker_realize()
1320 * digits, so leave room for it too (-1 for string terminator, -3 for in pci_rocker_realize()
1321 * p# and -3 for b#) in pci_rocker_realize()
1324 #define MAX_ROCKER_NAME_LEN (ROCKER_IFNAMSIZ - 1 - 3 - 3) in pci_rocker_realize()
1325 if (strlen(r->name) > MAX_ROCKER_NAME_LEN) { in pci_rocker_realize()
1332 if (memcmp(&r->fp_start_macaddr, &zero, sizeof(zero)) == 0) { in pci_rocker_realize()
1333 memcpy(&r->fp_start_macaddr, &dflt, sizeof(dflt)); in pci_rocker_realize()
1334 r->fp_start_macaddr.a[4] += (sw_index++); in pci_rocker_realize()
1337 if (!r->switch_id) { in pci_rocker_realize()
1338 memcpy(&r->switch_id, &r->fp_start_macaddr, in pci_rocker_realize()
1339 sizeof(r->fp_start_macaddr)); in pci_rocker_realize()
1342 if (r->fp_ports > ROCKER_FP_PORTS_MAX) { in pci_rocker_realize()
1343 r->fp_ports = ROCKER_FP_PORTS_MAX; in pci_rocker_realize()
1346 r->rings = g_new(DescRing *, rocker_pci_ring_count(r)); in pci_rocker_realize()
1349 * - command ring in pci_rocker_realize()
1350 * - event ring in pci_rocker_realize()
1351 * - port0 tx ring in pci_rocker_realize()
1352 * - port0 rx ring in pci_rocker_realize()
1353 * - port1 tx ring in pci_rocker_realize()
1354 * - port1 rx ring in pci_rocker_realize()
1367 ROCKER_MSIX_VEC_TX((i - 2) / 2)); in pci_rocker_realize()
1369 desc_ring_set_consume(ring, NULL, ROCKER_MSIX_VEC_RX((i - 3) / 2)); in pci_rocker_realize()
1372 r->rings[i] = ring; in pci_rocker_realize()
1375 for (i = 0; i < r->fp_ports; i++) { in pci_rocker_realize()
1377 fp_port_alloc(r, r->name, &r->fp_start_macaddr, in pci_rocker_realize()
1378 i, &r->fp_ports_peers[i]); in pci_rocker_realize()
1380 r->fp_port[i] = port; in pci_rocker_realize()
1381 fp_port_set_world(port, r->world_dflt); in pci_rocker_realize()
1392 object_unparent(OBJECT(&r->msix_bar)); in pci_rocker_realize()
1393 object_unparent(OBJECT(&r->mmio)); in pci_rocker_realize()
1396 if (r->worlds[i]) { in pci_rocker_realize()
1397 world_free(r->worlds[i]); in pci_rocker_realize()
1409 for (i = 0; i < r->fp_ports; i++) { in pci_rocker_uninit()
1410 FpPort *port = r->fp_port[i]; in pci_rocker_uninit()
1413 r->fp_port[i] = NULL; in pci_rocker_uninit()
1417 if (r->rings[i]) { in pci_rocker_uninit()
1418 desc_ring_free(r->rings[i]); in pci_rocker_uninit()
1421 g_free(r->rings); in pci_rocker_uninit()
1424 object_unparent(OBJECT(&r->msix_bar)); in pci_rocker_uninit()
1425 object_unparent(OBJECT(&r->mmio)); in pci_rocker_uninit()
1428 if (r->worlds[i]) { in pci_rocker_uninit()
1429 world_free(r->worlds[i]); in pci_rocker_uninit()
1432 g_free(r->fp_ports_peers); in pci_rocker_uninit()
1441 if (r->worlds[i]) { in rocker_reset()
1442 world_reset(r->worlds[i]); in rocker_reset()
1445 for (i = 0; i < r->fp_ports; i++) { in rocker_reset()
1446 fp_port_reset(r->fp_port[i]); in rocker_reset()
1447 fp_port_set_world(r->fp_port[i], r->world_dflt); in rocker_reset()
1450 r->test_reg = 0; in rocker_reset()
1451 r->test_reg64 = 0; in rocker_reset()
1452 r->test_dma_addr = 0; in rocker_reset()
1453 r->test_dma_size = 0; in rocker_reset()
1456 desc_ring_reset(r->rings[i]); in rocker_reset()
1483 k->realize = pci_rocker_realize; in rocker_class_init()
1484 k->exit = pci_rocker_uninit; in rocker_class_init()
1485 k->vendor_id = PCI_VENDOR_ID_REDHAT; in rocker_class_init()
1486 k->device_id = PCI_DEVICE_ID_REDHAT_ROCKER; in rocker_class_init()
1487 k->revision = ROCKER_PCI_REVISION; in rocker_class_init()
1488 k->class_id = PCI_CLASS_NETWORK_OTHER; in rocker_class_init()
1489 set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); in rocker_class_init()
1490 dc->desc = "Rocker Switch"; in rocker_class_init()
1493 dc->vmsd = &rocker_vmsd; in rocker_class_init()