Lines Matching +full:function +full:- +full:enumerator

1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * - Added Port-Write/Error Management initialization and handling
14 * - Added Input- Output- enable functionality, to allow full communication
21 #include <linux/dma-mapping.h>
49 * rio_destid_alloc - Allocate next available destID for given network
59 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_alloc()
61 spin_lock(&idtab->lock); in rio_destid_alloc()
62 destid = find_first_zero_bit(idtab->table, idtab->max); in rio_destid_alloc()
64 if (destid < idtab->max) { in rio_destid_alloc()
65 set_bit(destid, idtab->table); in rio_destid_alloc()
66 destid += idtab->start; in rio_destid_alloc()
70 spin_unlock(&idtab->lock); in rio_destid_alloc()
75 * rio_destid_reserve - Reserve the specified destID
85 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_reserve()
87 destid -= idtab->start; in rio_destid_reserve()
88 spin_lock(&idtab->lock); in rio_destid_reserve()
89 oldbit = test_and_set_bit(destid, idtab->table); in rio_destid_reserve()
90 spin_unlock(&idtab->lock); in rio_destid_reserve()
95 * rio_destid_free - free a previously allocated destID
103 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_free()
105 destid -= idtab->start; in rio_destid_free()
106 spin_lock(&idtab->lock); in rio_destid_free()
107 clear_bit(destid, idtab->table); in rio_destid_free()
108 spin_unlock(&idtab->lock); in rio_destid_free()
112 * rio_destid_first - return first destID in use
118 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_first()
120 spin_lock(&idtab->lock); in rio_destid_first()
121 destid = find_first_bit(idtab->table, idtab->max); in rio_destid_first()
122 if (destid >= idtab->max) in rio_destid_first()
125 destid += idtab->start; in rio_destid_first()
126 spin_unlock(&idtab->lock); in rio_destid_first()
131 * rio_destid_next - return next destID in use
138 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_next()
140 spin_lock(&idtab->lock); in rio_destid_next()
141 destid = find_next_bit(idtab->table, idtab->max, from); in rio_destid_next()
142 if (destid >= idtab->max) in rio_destid_next()
145 destid += idtab->start; in rio_destid_next()
146 spin_unlock(&idtab->lock); in rio_destid_next()
151 * rio_get_device_id - Get the base/extended device id for a device
157 * 8/16-bit device ID.
165 return RIO_GET_DID(port->sys_size, result); in rio_get_device_id()
169 * rio_set_device_id - Set the base/extended device id for a device
180 RIO_SET_DID(port->sys_size, did)); in rio_set_device_id()
184 * rio_clear_locks- Release all host locks and signal enumeration complete
189 * each device. Returns 0 on success or %-EINVAL on failure.
193 struct rio_mport *port = net->hport; in rio_clear_locks()
200 port->host_deviceid); in rio_clear_locks()
206 ret = -EINVAL; in rio_clear_locks()
208 list_for_each_entry(rdev, &net->devices, net_list) { in rio_clear_locks()
210 port->host_deviceid); in rio_clear_locks()
215 rdev->vid, rdev->did); in rio_clear_locks()
216 ret = -EINVAL; in rio_clear_locks()
221 rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_clear_locks()
225 rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_clear_locks()
233 * rio_enum_host- Set host lock and initialize host destination ID
238 * by the platform. Returns %0 on success or %-1 on failure.
246 port->host_deviceid); in rio_enum_host()
249 if ((result & 0xffff) != port->host_deviceid) in rio_enum_host()
250 return -1; in rio_enum_host()
253 rio_local_set_device_id(port, port->host_deviceid); in rio_enum_host()
258 * rio_device_has_destid- Test if a device contains a destination ID register
276 * rio_release_dev- Frees a RIO device struct
291 * rio_is_switch- Tests if a RIO device has switch capabilities
301 if (rdev->pef & RIO_PEF_SWITCH) in rio_is_switch()
307 * rio_setup_device- Allocates and sets up a RIO device
349 rdev->net = net; in rio_setup_device()
350 rdev->pef = result; in rio_setup_device()
351 rdev->swpinfo = swpinfo; in rio_setup_device()
354 rdev->did = result >> 16; in rio_setup_device()
355 rdev->vid = result & 0xffff; in rio_setup_device()
357 &rdev->device_rev); in rio_setup_device()
360 rdev->asm_did = result >> 16; in rio_setup_device()
361 rdev->asm_vid = result & 0xffff; in rio_setup_device()
364 rdev->asm_rev = result >> 16; in rio_setup_device()
365 if (rdev->pef & RIO_PEF_EXT_FEATURES) { in rio_setup_device()
366 rdev->efptr = result & 0xffff; in rio_setup_device()
367 rdev->phys_efptr = rio_mport_get_physefb(port, 0, destid, in rio_setup_device()
368 hopcount, &rdev->phys_rmap); in rio_setup_device()
370 __func__, rdev->phys_rmap); in rio_setup_device()
372 rdev->em_efptr = rio_mport_get_feature(port, 0, destid, in rio_setup_device()
374 if (!rdev->em_efptr) in rio_setup_device()
375 rdev->em_efptr = rio_mport_get_feature(port, 0, destid, in rio_setup_device()
380 &rdev->src_ops); in rio_setup_device()
382 &rdev->dst_ops); in rio_setup_device()
392 rdev->comp_tag = next_comptag++; in rio_setup_device()
393 rdev->do_enum = true; in rio_setup_device()
397 &rdev->comp_tag); in rio_setup_device()
400 if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)) { in rio_setup_device()
403 rdev->destid = next_destid; in rio_setup_device()
406 rdev->destid = rio_get_device_id(port, destid, hopcount); in rio_setup_device()
408 rdev->hopcount = 0xff; in rio_setup_device()
413 rdev->destid = destid; in rio_setup_device()
414 rdev->hopcount = hopcount; in rio_setup_device()
419 rswitch = rdev->rswitch; in rio_setup_device()
420 rswitch->port_ok = 0; in rio_setup_device()
421 spin_lock_init(&rswitch->lock); in rio_setup_device()
422 rswitch->route_table = in rio_setup_device()
423 kzalloc(RIO_MAX_ROUTE_ENTRIES(port->sys_size), in rio_setup_device()
425 if (!rswitch->route_table) in rio_setup_device()
428 for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES(port->sys_size); in rio_setup_device()
430 rswitch->route_table[rdid] = RIO_INVALID_ROUTE; in rio_setup_device()
431 dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id, in rio_setup_device()
432 rdev->comp_tag & RIO_CTAG_UDEVID); in rio_setup_device()
441 dev_set_name(&rdev->dev, "%02x:e:%04x", rdev->net->id, in rio_setup_device()
442 rdev->comp_tag & RIO_CTAG_UDEVID); in rio_setup_device()
445 rdev->dev.parent = &net->dev; in rio_setup_device()
447 rdev->dev.release = rio_release_dev; in rio_setup_device()
448 rdev->dma_mask = DMA_BIT_MASK(32); in rio_setup_device()
449 rdev->dev.dma_mask = &rdev->dma_mask; in rio_setup_device()
450 rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); in rio_setup_device()
452 if (rdev->dst_ops & RIO_DST_OPS_DOORBELL) in rio_setup_device()
453 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE], in rio_setup_device()
466 kfree(rswitch->route_table); in rio_setup_device()
473 * rio_sport_is_active- Tests if a switch port has an active connection.
494 * rio_get_host_deviceid_lock- Reads the Host Device ID Lock CSR on a device
505 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), hopcount, in rio_get_host_deviceid_lock()
512 * rio_enum_peer- Recursively enumerate a RIO network through a master port
530 RIO_ANY_DESTID(port->sys_size), hopcount)) { in rio_enum_peer()
532 return -1; in rio_enum_peer()
535 if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) { in rio_enum_peer()
541 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
550 prev->rswitch->nextdev[prev_port] = rdev; in rio_enum_peer()
558 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
560 RIO_HOST_DID_LOCK_CSR, port->host_deviceid); in rio_enum_peer()
562 < port->host_deviceid) { in rio_enum_peer()
566 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
569 port->host_deviceid); in rio_enum_peer()
572 if (rio_get_host_deviceid_lock(port, hopcount) > port->host_deviceid) { in rio_enum_peer()
575 return -1; in rio_enum_peer()
579 rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
582 rdev->prev = prev; in rio_enum_peer()
584 prev->rswitch->nextdev[prev_port] = rdev; in rio_enum_peer()
586 return -1; in rio_enum_peer()
595 sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo); in rio_enum_peer()
597 port->host_deviceid, sw_inport, 0); in rio_enum_peer()
598 rdev->rswitch->route_table[port->host_deviceid] = sw_inport; in rio_enum_peer()
602 if (destid != port->host_deviceid) { in rio_enum_peer()
605 rdev->rswitch->route_table[destid] = sw_inport; in rio_enum_peer()
611 rio_name(rdev), rdev->vid, rdev->did, in rio_enum_peer()
612 RIO_GET_TOTAL_PORTS(rdev->swpinfo)); in rio_enum_peer()
615 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo); in rio_enum_peer()
619 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
621 rdev->rswitch->port_ok |= (1 << port_num); in rio_enum_peer()
632 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
634 rdev->rswitch->port_ok |= (1 << port_num); in rio_enum_peer()
636 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
641 return -1; in rio_enum_peer()
648 if (destid != port->host_deviceid) { in rio_enum_peer()
654 rdev->rswitch-> in rio_enum_peer()
666 if (rdev->em_efptr) in rio_enum_peer()
669 rdev->rswitch->port_ok &= ~(1 << port_num); in rio_enum_peer()
673 /* Direct Port-write messages to the enumeratiing host */ in rio_enum_peer()
674 if ((rdev->src_ops & RIO_SRC_OPS_PORT_WRITE) && in rio_enum_peer()
675 (rdev->em_efptr)) { in rio_enum_peer()
677 rdev->em_efptr + RIO_EM_PW_TGT_DEVID, in rio_enum_peer()
678 (port->host_deviceid << 16) | in rio_enum_peer()
679 (port->sys_size << 15)); in rio_enum_peer()
688 rdev->destid = sw_destid; in rio_enum_peer()
691 rio_name(rdev), rdev->vid, rdev->did); in rio_enum_peer()
697 * rio_enum_complete- Tests if enumeration of a network is complete
700 * Tests the PGCCSR discovered bit for non-zero value (enumeration
708 rio_local_read_config_32(port, port->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_enum_complete()
714 * rio_disc_peer- Recursively discovers a RIO network through a master port
735 rdev->prev = prev; in rio_disc_peer()
737 prev->rswitch->nextdev[prev_port] = rdev; in rio_disc_peer()
739 return -1; in rio_disc_peer()
743 rdev->destid = destid; in rio_disc_peer()
747 rio_name(rdev), rdev->vid, rdev->did, in rio_disc_peer()
748 RIO_GET_TOTAL_PORTS(rdev->swpinfo)); in rio_disc_peer()
750 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo); in rio_disc_peer()
752 if (RIO_GET_PORT_NUM(rdev->swpinfo) == port_num) in rio_disc_peer()
763 ndestid < RIO_ANY_DESTID(port->sys_size); in rio_disc_peer()
773 if (ndestid == RIO_ANY_DESTID(port->sys_size)) in rio_disc_peer()
778 return -1; in rio_disc_peer()
783 rio_name(rdev), rdev->vid, rdev->did); in rio_disc_peer()
789 * rio_mport_is_active- Tests if master port link is active
802 port->phys_efptr + in rio_mport_is_active()
803 RIO_PORT_N_ERR_STS_CSR(port->index, port->phys_rmap), in rio_mport_is_active()
810 pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id); in rio_scan_release_net()
811 kfree(net->enum_data); in rio_scan_release_net()
819 pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id); in rio_scan_release_dev()
824 * rio_scan_alloc_net - Allocate and configure a new RIO network
829 * Allocates a new RIO network structure and initializes enumerator-specific
846 RIO_MAX_ROUTE_ENTRIES(mport->sys_size) in rio_scan_alloc_net()
856 net->enum_data = idtab; in rio_scan_alloc_net()
857 net->release = rio_scan_release_net; in rio_scan_alloc_net()
858 idtab->start = start; in rio_scan_alloc_net()
859 idtab->max = RIO_MAX_ROUTE_ENTRIES(mport->sys_size); in rio_scan_alloc_net()
860 spin_lock_init(&idtab->lock); in rio_scan_alloc_net()
865 net->id = mport->id; in rio_scan_alloc_net()
866 net->hport = mport; in rio_scan_alloc_net()
867 dev_set_name(&net->dev, "rnet_%d", net->id); in rio_scan_alloc_net()
868 net->dev.parent = &mport->dev; in rio_scan_alloc_net()
869 net->dev.release = rio_scan_release_dev; in rio_scan_alloc_net()
877 * rio_update_route_tables- Updates route tables in switches
891 list_for_each_entry(rdev, &net->devices, net_list) { in rio_update_route_tables()
893 destid = rdev->destid; in rio_update_route_tables()
895 list_for_each_entry(rswitch, &net->switches, node) { in rio_update_route_tables()
897 if (rio_is_switch(rdev) && (rdev->rswitch == rswitch)) in rio_update_route_tables()
900 if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) { in rio_update_route_tables()
904 if (swrdev->destid == destid) in rio_update_route_tables()
907 sport = RIO_GET_PORT_NUM(swrdev->swpinfo); in rio_update_route_tables()
911 rswitch->route_table[destid] = sport; in rio_update_route_tables()
918 * rio_init_em - Initializes RIO Error Management (for switches)
921 * For each enumerated switch, call device-specific error management
926 if (rio_is_switch(rdev) && (rdev->em_efptr) && in rio_init_em()
927 rdev->rswitch->ops && rdev->rswitch->ops->em_init) { in rio_init_em()
928 rdev->rswitch->ops->em_init(rdev); in rio_init_em()
933 * rio_enum_mport- Start enumeration through a master port
940 * enumeration succeeds or %-EBUSY if enumeration fails.
947 printk(KERN_INFO "RIO: enumerate master port %d, %s\n", mport->id, in rio_enum_mport()
948 mport->name); in rio_enum_mport()
956 if (mport->nnode.next || mport->nnode.prev) in rio_enum_mport()
957 return -EBUSY; in rio_enum_mport()
963 mport->id); in rio_enum_mport()
964 rc = -EBUSY; in rio_enum_mport()
973 rc = -ENOMEM; in rio_enum_mport()
978 rio_destid_reserve(net, mport->host_deviceid); in rio_enum_mport()
993 mport->id); in rio_enum_mport()
995 rc = -EBUSY; in rio_enum_mport()
1005 mport->id); in rio_enum_mport()
1006 rc = -EINVAL; in rio_enum_mport()
1014 * rio_build_route_tables- Generate route tables from switch route entries
1027 list_for_each_entry(rswitch, &net->switches, node) { in rio_build_route_tables()
1030 rio_lock_device(net->hport, rdev->destid, in rio_build_route_tables()
1031 rdev->hopcount, 1000); in rio_build_route_tables()
1033 i < RIO_MAX_ROUTE_ENTRIES(net->hport->sys_size); in rio_build_route_tables()
1038 rswitch->route_table[i] = sport; in rio_build_route_tables()
1041 rio_unlock_device(net->hport, rdev->destid, rdev->hopcount); in rio_build_route_tables()
1046 * rio_disc_mport- Start discovery through a master port
1054 * peer discovery. Returns %0 if discovery succeeds or %-EBUSY
1062 printk(KERN_INFO "RIO: discover master port %d, %s\n", mport->id, in rio_disc_mport()
1063 mport->name); in rio_disc_mport()
1070 return -EAGAIN; in rio_disc_mport()
1082 mport->id, mport->name); in rio_disc_mport()
1093 /* Read DestID assigned by enumerator */ in rio_disc_mport()
1095 &mport->host_deviceid); in rio_disc_mport()
1096 mport->host_deviceid = RIO_GET_DID(mport->sys_size, in rio_disc_mport()
1097 mport->host_deviceid); in rio_disc_mport()
1099 if (rio_disc_peer(net, mport, RIO_ANY_DESTID(mport->sys_size), in rio_disc_mport()
1103 mport->id); in rio_disc_mport()
1112 return -EBUSY; in rio_disc_mport()
1129 * When this enumeration/discovery method is loaded as a module this function
1134 * Returns 0 for success or -EIO if unable to register itself.
1143 return -EIO; in rio_basic_attach()