Lines Matching +full:uuid +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
53 #include <dev/thunderbolt/nhi_reg.h>
54 #include <dev/thunderbolt/nhi_var.h>
55 #include <dev/thunderbolt/tb_reg.h>
56 #include <dev/thunderbolt/tb_var.h>
57 #include <dev/thunderbolt/tbcfg_reg.h>
58 #include <dev/thunderbolt/router_var.h>
59 #include <dev/thunderbolt/tb_debug.h>
80 struct router_softc **dev) in router_lookup_device() argument
86 KASSERT(dev != NULL, ("dev cannot be NULL\n")); in router_lookup_device()
118 if (hop > cursor->max_adap) { in router_lookup_device()
124 if (cursor->adapters == NULL) { in router_lookup_device()
130 cursor = cursor->adapters[hop]; in router_lookup_device()
136 *dev = cursor; in router_lookup_device()
154 if (((this_rt >> (sc->depth * 8)) > 0xffULL) || in router_insert()
155 (parent->depth + 1 != sc->depth)) { in router_insert()
158 sc->route.hi, sc->route.lo, parent->route.hi, in router_insert()
159 parent->route.lo); in router_insert()
163 this_hop = (uint8_t)(this_rt >> (sc->depth * 8)); in router_insert()
166 "of 0x%02x and depth of %d\n", sc->route.hi, sc->route.lo, in router_insert()
167 this_hop, sc->depth); in router_insert()
169 if (this_hop > parent->max_adap) { in router_insert()
175 if (parent->adapters[this_hop] != NULL) { in router_insert()
181 parent->adapters[this_hop] = sc; in router_insert()
184 "0x%08x%08x\n", sc->route.hi, sc->route.lo, parent->route.hi, in router_insert()
185 parent->route.lo); in router_insert()
200 return (nhi_register_pdf(sc->ring0, tx, rx)); in router_register_interrupts()
216 sc->dev = parent->dev; in tb_router_attach()
217 sc->debug = parent->debug; in tb_router_attach()
218 sc->ring0 = parent->ring0; in tb_router_attach()
219 sc->route = route; in tb_router_attach()
220 sc->nsc = parent->nsc; in tb_router_attach()
222 mtx_init(&sc->mtx, "tbcfg", "Thunderbolt Router Config", MTX_DEF); in tb_router_attach()
223 TAILQ_INIT(&sc->cmd_queue); in tb_router_attach()
244 sc->dev = nsc->dev; in tb_router_attach_root()
245 sc->debug = nsc->debug; in tb_router_attach_root()
246 sc->ring0 = nsc->ring0; in tb_router_attach_root()
247 sc->route = route; in tb_router_attach_root()
248 sc->nsc = nsc; in tb_router_attach_root()
250 mtx_init(&sc->mtx, "tbcfg", "Thunderbolt Router Config", MTX_DEF); in tb_router_attach_root()
251 TAILQ_INIT(&sc->cmd_queue); in tb_router_attach_root()
254 * This router is semi-virtual and represents the router that's part in tb_router_attach_root()
271 bcopy((uint8_t *)sc->uuid, nsc->uuid, 16); in tb_router_attach_root()
294 sc->max_adap = GET_ROUTER_CS_MAX_ADAP(cfg); in _tb_router_attach()
295 sc->depth = GET_ROUTER_CS_DEPTH(cfg); in _tb_router_attach()
296 sc->uuid[0] = cfg->uuid_lo; in _tb_router_attach()
297 sc->uuid[1] = cfg->uuid_hi; in _tb_router_attach()
298 sc->uuid[2] = 0xffffffff; in _tb_router_attach()
299 sc->uuid[3] = 0xffffffff; in _tb_router_attach()
301 "depth= %d\n", up, sc->max_adap, sc->depth); in _tb_router_attach()
305 sc->max_adap = MIN(sc->max_adap, ROUTER_CS1_MAX_ADAPTERS); in _tb_router_attach()
306 sc->adapters = malloc((1 + sc->max_adap) * sizeof(void *), in _tb_router_attach()
308 if (sc->adapters == NULL) { in _tb_router_attach()
315 sc->route.hi, sc->route.lo); in _tb_router_attach()
326 if (TAILQ_FIRST(&sc->cmd_queue) != NULL) in tb_router_detach()
329 mtx_destroy(&sc->mtx); in tb_router_detach()
331 if (sc->adapters != NULL) in tb_router_detach()
332 free(sc->adapters, M_THUNDERBOLT); in tb_router_detach()
351 if (cmd->ev == 0) in router_get_config_cb()
352 bcopy((uint8_t *)cmd->resp_buffer, in router_get_config_cb()
353 (uint8_t *)cmd->callback_arg, cmd->dwlen * 4); in router_get_config_cb()
355 mtx_lock(&sc->mtx); in router_get_config_cb()
356 sc->inflight_cmd = NULL; in router_get_config_cb()
358 if ((cmd->flags & RCMD_POLLED) == 0) in router_get_config_cb()
361 cmd->flags |= RCMD_POLL_COMPLETE; in router_get_config_cb()
364 mtx_unlock(&sc->mtx); in router_get_config_cb()
378 retries = cmd->retries; in tb_config_read()
379 mtx_lock(&sc->mtx); in tb_config_read()
380 while (retries-- >= 0) { in tb_config_read()
385 error = msleep(cmd, &sc->mtx, 0, "tbtcfg", cmd->timeout * hz); in tb_config_read()
388 sc->inflight_cmd = NULL; in tb_config_read()
392 if (cmd->ev != 0) in tb_config_read()
395 mtx_unlock(&sc->mtx); in tb_config_read()
410 retries = cmd->retries; in tb_config_read_polled()
411 cmd->flags |= RCMD_POLLED; in tb_config_read_polled()
412 timeout = cmd->timeout * 1000000; in tb_config_read_polled()
414 mtx_lock(&sc->mtx); in tb_config_read_polled()
415 while (retries-- >= 0) { in tb_config_read_polled()
419 mtx_unlock(&sc->mtx); in tb_config_read_polled()
423 if ((cmd->flags & RCMD_POLL_COMPLETE) != 0) in tb_config_read_polled()
425 timeout -= 100000; in tb_config_read_polled()
428 mtx_lock(&sc->mtx); in tb_config_read_polled()
429 if ((cmd->flags & RCMD_POLL_COMPLETE) == 0) { in tb_config_read_polled()
431 sc->inflight_cmd = NULL; in tb_config_read_polled()
438 if (cmd->ev != 0) in tb_config_read_polled()
441 mtx_unlock(&sc->mtx); in tb_config_read_polled()
475 msg->route.hi = sc->route.hi; in _tb_config_read()
476 msg->route.lo = sc->route.lo; in _tb_config_read()
477 msg->addr_attrs = TB_CONFIG_ADDR(0, space, adapter, dwlen, offset); in _tb_config_read()
478 cmd->callback = cb; in _tb_config_read()
479 cmd->callback_arg = buf; in _tb_config_read()
480 cmd->dwlen = dwlen; in _tb_config_read()
510 cmd->nhicmd = nhi_alloc_tx_frame(sc->ring0); in router_alloc_cmd()
511 if (cmd->nhicmd == NULL) { in router_alloc_cmd()
517 cmd->sc = sc; in router_alloc_cmd()
520 cmd->nhicmd->idx); in router_alloc_cmd()
534 if (cmd->nhicmd != NULL) { in router_free_cmd()
536 cmd->nhicmd->idx); in router_free_cmd()
537 nhi_free_tx_frame(sc->ring0, cmd->nhicmd); in router_free_cmd()
553 KASSERT(len != 0, ("Invalid zero-length command\n")); in router_prepare_read()
556 nhicmd = cmd->nhicmd; in router_prepare_read()
557 msglen = (len - 4) / 4; in router_prepare_read()
559 nhicmd->data[i] = htobe32(nhicmd->data[i]); in router_prepare_read()
561 msg = (uint32_t *)nhicmd->data; in router_prepare_read()
562 msg[msglen] = htobe32(tb_calc_crc(nhicmd->data, len-4)); in router_prepare_read()
564 nhicmd->pdf = PDF_READ; in router_prepare_read()
565 nhicmd->req_len = len; in router_prepare_read()
567 nhicmd->timeout = NHI_CMD_TIMEOUT; in router_prepare_read()
568 nhicmd->retries = 0; in router_prepare_read()
569 nhicmd->resp_buffer = (uint32_t *)cmd->resp_buffer; in router_prepare_read()
570 nhicmd->resp_len = (cmd->dwlen + 3) * 4; in router_prepare_read()
571 nhicmd->context = cmd; in router_prepare_read()
573 cmd->retries = CFG_DEFAULT_RETRIES; in router_prepare_read()
574 cmd->timeout = CFG_DEFAULT_TIMEOUT; in router_prepare_read()
584 mtx_lock(&sc->mtx); in router_schedule()
586 mtx_unlock(&sc->mtx); in router_schedule()
600 TAILQ_INSERT_TAIL(&sc->cmd_queue, cmd, link); in router_schedule_locked()
602 while ((sc->inflight_cmd == NULL) && in router_schedule_locked()
603 ((cmd = TAILQ_FIRST(&sc->cmd_queue)) != NULL)) { in router_schedule_locked()
605 TAILQ_REMOVE(&sc->cmd_queue, cmd, link); in router_schedule_locked()
606 nhicmd = cmd->nhicmd; in router_schedule_locked()
608 "Scheduling command with index %d\n", nhicmd->idx); in router_schedule_locked()
609 sc->inflight_cmd = cmd; in router_schedule_locked()
610 if ((error = nhi_tx_schedule(sc->ring0, nhicmd)) != 0) { in router_schedule_locked()
613 sc->inflight_cmd = NULL; in router_schedule_locked()
615 TAILQ_INSERT_HEAD(&sc->cmd_queue, cmd, link); in router_schedule_locked()
635 cmd = (struct router_command *)(nhicmd->context); in router_complete_intr()
636 sc = cmd->sc; in router_complete_intr()
639 if (nhicmd->flags & CMD_RESP_COMPLETE) { in router_complete_intr()
640 cmd->callback(sc, cmd, cmd->callback_arg); in router_complete_intr()
649 struct router_softc *sc, *dev; in router_response_intr() local
662 eof = ring->rxpost.eof_len >> RX_BUFFER_DESC_EOF_SHIFT; in router_response_intr()
665 write = (struct tb_cfg_write_resp *)nhicmd->data; in router_response_intr()
666 route.hi = be32toh(write->route.hi); in router_response_intr()
667 route.lo = be32toh(write->route.lo); in router_response_intr()
669 read = (struct tb_cfg_read_resp *)nhicmd->data; in router_response_intr()
670 route.hi = be32toh(read->route.hi); in router_response_intr()
671 route.lo = be32toh(read->route.lo); in router_response_intr()
672 attrs = be32toh(read->addr_attrs); in router_response_intr()
684 error = router_lookup_device(sc, route, &dev); in router_response_intr()
685 if (error != 0 || dev == NULL) { in router_response_intr()
692 "inflight_cmd= %p\n", device_get_nameunit(dev->dev), dev->route.hi, in router_response_intr()
693 dev->route.lo, dev->inflight_cmd); in router_response_intr()
695 cmd = dev->inflight_cmd; in router_response_intr()
697 tb_debug(dev, DBG_ROUTER, "Null inflight cmd\n"); in router_response_intr()
703 cmd->nhicmd->resp_buffer[i] = be32toh(read->data[i]); in router_response_intr()
706 cmd->nhicmd->flags |= CMD_RESP_COMPLETE; in router_response_intr()
707 if (cmd->nhicmd->flags & CMD_REQ_COMPLETE) { in router_response_intr()
709 cmd->callback(dev, cmd, cmd->callback_arg); in router_response_intr()
728 event.route.hi = be32toh(nhicmd->data[0]); in router_notify_intr()
729 event.route.lo = be32toh(nhicmd->data[1]); in router_notify_intr()
730 event.event_adap = be32toh(nhicmd->data[2]); in router_notify_intr()
753 if (sc->inflight_cmd != NULL) { in router_notify_intr()
754 cmd = sc->inflight_cmd; in router_notify_intr()
755 cmd->ev = ev; in router_notify_intr()
756 cmd->callback(sc, cmd, cmd->callback_arg); in router_notify_intr()
774 KASSERT(cap->next_cap != 0, ("next_cap cannot be 0\n")); in tb_config_next_cap()
778 current = cap->next_cap; in tb_config_next_cap()
779 error = tb_config_read(sc, cap->space, cap->adap, current, 1, buf); in tb_config_next_cap()
784 cap->cap_id = tbcap->hdr.cap_id; in tb_config_next_cap()
785 cap->next_cap = tbcap->hdr.next_cap; in tb_config_next_cap()
786 cap->current_cap = current; in tb_config_next_cap()
788 if ((cap->space != TB_CFG_CS_ROUTER) && in tb_config_next_cap()
789 (tbcap->hdr.cap_id != TB_CFG_CAP_VSC)) { in tb_config_next_cap()
794 tb_config_read(sc, cap->space, cap->adap, current, 2, buf); in tb_config_next_cap()
800 cap->vsc_id = tbcap->vsc.vsc_id; in tb_config_next_cap()
801 cap->vsc_len = tbcap->vsc.len; in tb_config_next_cap()
802 if (tbcap->vsc.len == 0) { in tb_config_next_cap()
803 cap->next_cap = tbcap->vsec.vsec_next_cap; in tb_config_next_cap()
804 cap->vsec_len = tbcap->vsec.vsec_len; in tb_config_next_cap()
819 cap_id = cap->cap_id; in tb_config_find_cap()
820 vsc_id = cap->vsc_id; in tb_config_find_cap()
822 cap->cap_id = cap->vsc_id = 0; in tb_config_find_cap()
823 while ((cap->cap_id != cap_id) || (cap->vsc_id != vsc_id)) { in tb_config_find_cap()
825 "Looking for cap %d at offset %d\n", cap->cap_id, in tb_config_find_cap()
826 cap->next_cap); in tb_config_find_cap()
827 if ((cap->next_cap == 0) || in tb_config_find_cap()
828 (cap->next_cap > TB_CFG_CAP_OFFSET_MAX)) in tb_config_find_cap()
917 tb_config_get_lc_uuid(struct router_softc *rsc, uint8_t *uuid) in tb_config_get_lc_uuid() argument
933 tb_debug(rsc, DBG_ROUTER, "Error fetching UUID: %d\n", error); in tb_config_get_lc_uuid()
937 bcopy(buf, uuid, 16); in tb_config_get_lc_uuid()