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) in ofw_bus_gen_setup_devinfo()
61 OF_getprop_alloc(node, "compatible", (void **)&obd->obd_compat); in ofw_bus_gen_setup_devinfo()
62 OF_getprop_alloc(node, "device_type", (void **)&obd->obd_type); in ofw_bus_gen_setup_devinfo()
63 OF_getprop_alloc(node, "model", (void **)&obd->obd_model); in ofw_bus_gen_setup_devinfo()
64 OF_getprop_alloc(node, "status", (void **)&obd->obd_status); in ofw_bus_gen_setup_devinfo()
65 obd->obd_node = node; in ofw_bus_gen_setup_devinfo()
75 if (obd->obd_compat != NULL) in ofw_bus_gen_destroy_devinfo()
76 free(obd->obd_compat, M_OFWPROP); in ofw_bus_gen_destroy_devinfo()
77 if (obd->obd_model != NULL) in ofw_bus_gen_destroy_devinfo()
78 free(obd->obd_model, M_OFWPROP); in ofw_bus_gen_destroy_devinfo()
79 if (obd->obd_name != NULL) in ofw_bus_gen_destroy_devinfo()
80 free(obd->obd_name, M_OFWPROP); in ofw_bus_gen_destroy_devinfo()
81 if (obd->obd_type != NULL) in ofw_bus_gen_destroy_devinfo()
82 free(obd->obd_type, M_OFWPROP); in ofw_bus_gen_destroy_devinfo()
83 if (obd->obd_status != NULL) in ofw_bus_gen_destroy_devinfo()
84 free(obd->obd_status, M_OFWPROP); in ofw_bus_gen_destroy_devinfo()
129 return (obd->obd_compat); in ofw_bus_gen_get_compat()
140 return (obd->obd_model); in ofw_bus_gen_get_model()
151 return (obd->obd_name); in ofw_bus_gen_get_name()
161 return ((phandle_t)-1); in ofw_bus_gen_get_node()
162 return (obd->obd_node); in ofw_bus_gen_get_node()
173 return (obd->obd_type); in ofw_bus_gen_get_type()
185 return (obd->obd_status); in ofw_bus_get_status()
236 /* Slide to the next sub-string. */ in ofw_bus_node_is_compatible_int()
239 len -= l; in ofw_bus_node_is_compatible_int()
274 if ((node = ofw_bus_get_node(dev)) == -1) in ofw_bus_is_compatible()
308 for (; compat->ocd_str != NULL; ++compat) { in ofw_bus_search_compatible()
309 if (ofw_bus_is_compatible(dev, compat->ocd_str)) in ofw_bus_search_compatible()
321 if ((node = ofw_bus_get_node(dev)) == -1) in ofw_bus_has_prop()
333 if (OF_getencprop(node, "#address-cells", &addrc, sizeof(addrc)) == -1) in ofw_bus_setup_iinfo()
335 ii->opi_addrc = addrc * sizeof(pcell_t); in ofw_bus_setup_iinfo()
337 ii->opi_imapsz = OF_getencprop_alloc(node, "interrupt-map", in ofw_bus_setup_iinfo()
338 (void **)&ii->opi_imap); in ofw_bus_setup_iinfo()
339 if (ii->opi_imapsz > 0) { in ofw_bus_setup_iinfo()
340 msksz = OF_getencprop_alloc(node, "interrupt-map-mask", in ofw_bus_setup_iinfo()
341 (void **)&ii->opi_imapmsk); in ofw_bus_setup_iinfo()
343 * Failure to get the mask is ignored; a full mask is used in ofw_bus_setup_iinfo()
344 * then. We barf on bad mask sizes, however. in ofw_bus_setup_iinfo()
346 if (msksz != -1 && msksz != ii->opi_addrc + intrsz) in ofw_bus_setup_iinfo()
347 panic("ofw_bus_setup_iinfo: bad interrupt-map-mask " in ofw_bus_setup_iinfo()
360 if (ii->opi_imapsz <= 0) in ofw_bus_lookup_imap()
362 KASSERT(regsz >= ii->opi_addrc, in ofw_bus_lookup_imap()
364 regsz, ii->opi_addrc)); in ofw_bus_lookup_imap()
365 if (node != -1) { in ofw_bus_lookup_imap()
370 return (ofw_bus_search_intrmap(pintr, pintrsz, reg, ii->opi_addrc, in ofw_bus_lookup_imap()
371 ii->opi_imap, ii->opi_imapsz, ii->opi_imapmsk, maskbuf, mintr, in ofw_bus_lookup_imap()
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, in ofw_bus_search_intrmap()
429 "#address-cells", &paddrsz, sizeof(paddrsz)) == -1) in ofw_bus_search_intrmap()
435 "#interrupt-cells", &pintrsz, sizeof(pintrsz)) == -1) in ofw_bus_search_intrmap()
439 /* Compute the map stride size. */ in ofw_bus_search_intrmap()
441 KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map")); in ofw_bus_search_intrmap()
452 i -= tsz; in ofw_bus_search_intrmap()
461 pcell_t *map, mask, msi_base, rid_base, rid_length; in ofw_bus_msimap() local
467 len = OF_getencprop_alloc_multi(node, "msi-map", sizeof(*map), in ofw_bus_msimap()
468 (void **)&map); in ofw_bus_msimap()
472 OF_getencprop(node, "msi-parent", msi_parent, in ofw_bus_msimap()
481 mask = 0xffffffff; in ofw_bus_msimap()
482 OF_getencprop(node, "msi-map-mask", &mask, sizeof(mask)); in ofw_bus_msimap()
484 masked_rid = pci_rid & mask; in ofw_bus_msimap()
486 rid_base = map[i + 0]; in ofw_bus_msimap()
487 rid_length = map[i + 3]; in ofw_bus_msimap()
493 msi_base = map[i + 2]; in ofw_bus_msimap()
496 *msi_parent = map[i + 1]; in ofw_bus_msimap()
498 *msi_rid = masked_rid - rid_base + msi_base; in ofw_bus_msimap()
503 free(map, M_OFWPROP); in ofw_bus_msimap()
512 pcell_t *map, mask, iommu_base, rid_base, rid_length; in ofw_bus_iommu_map() local
517 len = OF_getencprop_alloc_multi(node, "iommu-map", sizeof(*map), in ofw_bus_iommu_map()
518 (void **)&map); in ofw_bus_iommu_map()
523 mask = 0xffffffff; in ofw_bus_iommu_map()
524 OF_getencprop(node, "iommu-map-mask", &mask, sizeof(mask)); in ofw_bus_iommu_map()
526 masked_rid = pci_rid & mask; in ofw_bus_iommu_map()
528 rid_base = map[i + 0]; in ofw_bus_iommu_map()
529 rid_length = map[i + 3]; in ofw_bus_iommu_map()
535 iommu_base = map[i + 2]; in ofw_bus_iommu_map()
538 *iommu_parent = map[i + 1]; in ofw_bus_iommu_map()
540 *iommu_rid = masked_rid - rid_base + iommu_base; in ofw_bus_iommu_map()
545 free(map, M_OFWPROP); in ofw_bus_iommu_map()
564 if (ret == -1) in ofw_bus_reg_to_rl_helper()
569 nreg = (ret == -1) ? 0 : ret; in ofw_bus_reg_to_rl_helper()
591 phys, phys + size - 1, size); in ofw_bus_reg_to_rl_helper()
613 rl, "assigned-addresses")); in ofw_bus_assigned_addresses_to_rl()
617 * Get interrupt parent for given node.
618 * Returns 0 if interrupt parent doesn't exist.
625 if (OF_searchencprop(node, "interrupt-parent", &iparent, in ofw_bus_find_iparent()
626 sizeof(iparent)) == -1) { in ofw_bus_find_iparent()
629 if (OF_hasprop(iparent, "interrupt-controller")) in ofw_bus_find_iparent()
651 device_printf(dev, "No interrupt-parent found, " in ofw_bus_intr_to_rl()
657 "#interrupt-cells", &icells, sizeof(icells)) == -1) { in ofw_bus_intr_to_rl()
658 device_printf(dev, "Missing #interrupt-cells " in ofw_bus_intr_to_rl()
663 device_printf(dev, "Invalid #interrupt-cells property " in ofw_bus_intr_to_rl()
669 nintr = OF_getencprop_alloc_multi(node, "interrupts-extended", in ofw_bus_intr_to_rl()
681 "#interrupt-cells", &icells, sizeof(icells)) == -1) { in ofw_bus_intr_to_rl()
682 device_printf(dev, "Missing #interrupt-cells " in ofw_bus_intr_to_rl()
688 device_printf(dev, "Invalid #interrupt-cells " in ofw_bus_intr_to_rl()
717 device_printf(dev, "No interrupt-parent found, " in ofw_bus_intr_by_rid()
723 "#interrupt-cells", &icells, sizeof(icells)) == -1) { in ofw_bus_intr_by_rid()
724 device_printf(dev, "Missing #interrupt-cells " in ofw_bus_intr_by_rid()
729 device_printf(dev, "Invalid #interrupt-cells property " in ofw_bus_intr_by_rid()
735 nintr = OF_getencprop_alloc_multi(node, "interrupts-extended", in ofw_bus_intr_by_rid()
747 "#interrupt-cells", &icells, sizeof(icells)) == -1) { in ofw_bus_intr_by_rid()
748 device_printf(dev, "Missing #interrupt-cells " in ofw_bus_intr_by_rid()
754 device_printf(dev, "Invalid #interrupt-cells " in ofw_bus_intr_by_rid()
783 if (ret == -1) in ofw_bus_find_child()
834 if (node == -1) in ofw_bus_find_child_device_by_phandle()
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; in ofw_bus_parse_xref_list_internal()
891 cells_name, &pcells, sizeof(pcells)) == -1) { in ofw_bus_parse_xref_list_internal()
916 if (idx == -1 && rv == 0) in ofw_bus_parse_xref_list_internal()
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)); in ofw_bus_parse_xref_list_get_length()