Lines Matching +full:interrupt +full:- +full:map +full:- +full:mask
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2001 - 2003 by Thomas Moestl <tmm@FreeBSD.org>.
59 if ((OF_getprop_alloc(node, "name", (void **)&obd->obd_name)) == -1)
61 OF_getprop_alloc(node, "compatible", (void **)&obd->obd_compat);
62 OF_getprop_alloc(node, "device_type", (void **)&obd->obd_type);
63 OF_getprop_alloc(node, "model", (void **)&obd->obd_model);
64 OF_getprop_alloc(node, "status", (void **)&obd->obd_status);
65 obd->obd_node = node;
75 if (obd->obd_compat != NULL)
76 free(obd->obd_compat, M_OFWPROP);
77 if (obd->obd_model != NULL)
78 free(obd->obd_model, M_OFWPROP);
79 if (obd->obd_name != NULL)
80 free(obd->obd_name, M_OFWPROP);
81 if (obd->obd_type != NULL)
82 free(obd->obd_type, M_OFWPROP);
83 if (obd->obd_status != NULL)
84 free(obd->obd_status, M_OFWPROP);
129 return (obd->obd_compat);
140 return (obd->obd_model);
151 return (obd->obd_name);
161 return ((phandle_t)-1);
162 return (obd->obd_node);
173 return (obd->obd_type);
185 return (obd->obd_status);
236 /* Slide to the next sub-string. */
239 len -= l;
274 if ((node = ofw_bus_get_node(dev)) == -1)
308 for (; compat->ocd_str != NULL; ++compat) {
309 if (ofw_bus_is_compatible(dev, compat->ocd_str))
321 if ((node = ofw_bus_get_node(dev)) == -1)
333 if (OF_getencprop(node, "#address-cells", &addrc, sizeof(addrc)) == -1)
335 ii->opi_addrc = addrc * sizeof(pcell_t);
337 ii->opi_imapsz = OF_getencprop_alloc(node, "interrupt-map",
338 (void **)&ii->opi_imap);
339 if (ii->opi_imapsz > 0) {
340 msksz = OF_getencprop_alloc(node, "interrupt-map-mask",
341 (void **)&ii->opi_imapmsk);
343 * Failure to get the mask is ignored; a full mask is used
344 * then. We barf on bad mask sizes, however.
346 if (msksz != -1 && msksz != ii->opi_addrc + intrsz)
347 panic("ofw_bus_setup_iinfo: bad interrupt-map-mask "
360 if (ii->opi_imapsz <= 0)
362 KASSERT(regsz >= ii->opi_addrc,
364 regsz, ii->opi_addrc));
365 if (node != -1) {
370 return (ofw_bus_search_intrmap(pintr, pintrsz, reg, ii->opi_addrc,
371 ii->opi_imap, ii->opi_imapsz, ii->opi_imapmsk, maskbuf, mintr,
376 * Map an interrupt using the firmware reg, interrupt-map and
377 * interrupt-map-mask properties.
378 * The interrupt property to be mapped must be of size intrsz, and pointed to
383 * imap and imapsz hold the interrupt mask and it's size.
384 * imapmsk is a pointer to the interrupt-map-mask property, which must have
385 * a size of physsz + intrsz; it may be NULL, in which case a full mask is
388 * The interrupt is returned in result, which must point to a buffer of length
389 * rintrsz (which gives the expected size of the mapped interrupt).
390 * Returns number of cells in the interrupt if a mapping was found, 0 otherwise.
425 * CHRP-derived OF bindings, including ePAPR-compliant FDTs,
429 "#address-cells", &paddrsz, sizeof(paddrsz)) == -1)
435 "#interrupt-cells", &pintrsz, sizeof(pintrsz)) == -1)
439 /* Compute the map stride size. */
441 KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map"));
452 i -= tsz;
461 pcell_t *map, mask, msi_base, rid_base, rid_length;
467 len = OF_getencprop_alloc_multi(node, "msi-map", sizeof(*map),
468 (void **)&map);
472 OF_getencprop(node, "msi-parent", msi_parent,
481 mask = 0xffffffff;
482 OF_getencprop(node, "msi-map-mask", &mask, sizeof(mask));
484 masked_rid = pci_rid & mask;
486 rid_base = map[i + 0];
487 rid_length = map[i + 3];
493 msi_base = map[i + 2];
496 *msi_parent = map[i + 1];
498 *msi_rid = masked_rid - rid_base + msi_base;
503 free(map, M_OFWPROP);
512 pcell_t *map, mask, iommu_base, rid_base, rid_length;
517 len = OF_getencprop_alloc_multi(node, "iommu-map", sizeof(*map),
518 (void **)&map);
523 mask = 0xffffffff;
524 OF_getencprop(node, "iommu-map-mask", &mask, sizeof(mask));
526 masked_rid = pci_rid & mask;
528 rid_base = map[i + 0];
529 rid_length = map[i + 3];
535 iommu_base = map[i + 2];
538 *iommu_parent = map[i + 1];
540 *iommu_rid = masked_rid - rid_base + iommu_base;
545 free(map, M_OFWPROP);
564 if (ret == -1)
569 nreg = (ret == -1) ? 0 : ret;
591 phys, phys + size - 1, size);
613 rl, "assigned-addresses"));
617 * Get interrupt parent for given node.
618 * Returns 0 if interrupt parent doesn't exist.
625 if (OF_searchencprop(node, "interrupt-parent", &iparent,
626 sizeof(iparent)) == -1) {
629 if (OF_hasprop(iparent, "interrupt-controller"))
651 device_printf(dev, "No interrupt-parent found, "
657 "#interrupt-cells", &icells, sizeof(icells)) == -1) {
658 device_printf(dev, "Missing #interrupt-cells "
663 device_printf(dev, "Invalid #interrupt-cells property "
669 nintr = OF_getencprop_alloc_multi(node, "interrupts-extended",
681 "#interrupt-cells", &icells, sizeof(icells)) == -1) {
682 device_printf(dev, "Missing #interrupt-cells "
688 device_printf(dev, "Invalid #interrupt-cells "
717 device_printf(dev, "No interrupt-parent found, "
723 "#interrupt-cells", &icells, sizeof(icells)) == -1) {
724 device_printf(dev, "Missing #interrupt-cells "
729 device_printf(dev, "Invalid #interrupt-cells property "
735 nintr = OF_getencprop_alloc_multi(node, "interrupts-extended",
747 "#interrupt-cells", &icells, sizeof(icells)) == -1) {
748 device_printf(dev, "Missing #interrupt-cells "
754 device_printf(dev, "Invalid #interrupt-cells "
783 if (ret == -1)
834 if (node == -1)
861 * node - consumers device node
862 * list_name - name of parsed list - "clocks"
863 * cells_name - name of size property - "#clock-cells"
864 * idx - the index of the requested list entry, or, if -1, an indication
867 * producer - handle of producer
868 * ncells - number of cells in result or the number of items in the list when
869 * idx == -1.
870 * cells - array of decoded cells
887 rv = (idx == -1) ? 0 : ENOENT;
891 cells_name, &pcells, sizeof(pcells)) == -1) {
916 if (idx == -1 && rv == 0)
925 * node - consumers device node
926 * list_name - name of parsed list - "clocks"
927 * cells_name - name of size property - "#clock-cells"
928 * idx - the index of the requested list entry (>= 0)
930 * producer - handle of producer
931 * ncells - number of cells in result
932 * cells - array of decoded cells
952 * node - consumers device node
953 * list_name - name of parsed list - "clocks"
954 * cells_name - name of size property - "#clock-cells"
956 * count - number of items in list
964 -1, NULL, count, NULL));