Lines Matching +full:msi +full:- +full:parent
1 // SPDX-License-Identifier: GPL-2.0
3 * Freescale Management Complex (MC) bus driver MSI support
5 * Copyright (C) 2015-2016 Freescale Semiconductor, Inc.
15 #include <linux/msi.h>
18 #include "fsl-mc-private.h"
22 * Generate a unique ID identifying the interrupt (only used within the MSI
32 return (irq_hw_number_t)(desc->fsl_mc.msi_index + (dev->icid * 10000)); in fsl_mc_domain_calc_hwirq()
38 arg->desc = desc; in fsl_mc_msi_set_desc()
39 arg->hwirq = fsl_mc_domain_calc_hwirq(to_fsl_mc_device(desc->dev), in fsl_mc_msi_set_desc()
48 struct msi_domain_ops *ops = info->ops; in fsl_mc_msi_update_dom_ops()
56 if (!ops->set_desc) in fsl_mc_msi_update_dom_ops()
57 ops->set_desc = fsl_mc_msi_set_desc; in fsl_mc_msi_update_dom_ops()
64 struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev; in __fsl_mc_msi_write_msg()
65 struct msi_desc *msi_desc = mc_dev_irq->msi_desc; in __fsl_mc_msi_write_msg()
69 * msi_desc->msg.address is 0x0 when this function is invoked in in __fsl_mc_msi_write_msg()
71 * really need to "unprogram" the MSI, so we just return. in __fsl_mc_msi_write_msg()
73 if (msi_desc->msg.address_lo == 0x0 && msi_desc->msg.address_hi == 0x0) in __fsl_mc_msi_write_msg()
79 irq_cfg.paddr = ((u64)msi_desc->msg.address_hi << 32) | in __fsl_mc_msi_write_msg()
80 msi_desc->msg.address_lo; in __fsl_mc_msi_write_msg()
81 irq_cfg.val = msi_desc->msg.data; in __fsl_mc_msi_write_msg()
82 irq_cfg.irq_num = msi_desc->irq; in __fsl_mc_msi_write_msg()
88 error = dprc_set_irq(mc_bus_dev->mc_io, in __fsl_mc_msi_write_msg()
90 mc_bus_dev->mc_handle, in __fsl_mc_msi_write_msg()
91 mc_dev_irq->dev_irq_index, in __fsl_mc_msi_write_msg()
94 dev_err(&owner_mc_dev->dev, in __fsl_mc_msi_write_msg()
101 error = dprc_set_obj_irq(mc_bus_dev->mc_io, in __fsl_mc_msi_write_msg()
103 mc_bus_dev->mc_handle, in __fsl_mc_msi_write_msg()
104 owner_mc_dev->obj_desc.type, in __fsl_mc_msi_write_msg()
105 owner_mc_dev->obj_desc.id, in __fsl_mc_msi_write_msg()
106 mc_dev_irq->dev_irq_index, in __fsl_mc_msi_write_msg()
109 dev_err(&owner_mc_dev->dev, in __fsl_mc_msi_write_msg()
122 struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev); in fsl_mc_msi_write_msg()
125 &mc_bus->irq_resources[msi_desc->fsl_mc.msi_index]; in fsl_mc_msi_write_msg()
127 msi_desc->msg = *msg; in fsl_mc_msi_write_msg()
130 * Program the MSI (paddr, value) pair in the device: in fsl_mc_msi_write_msg()
137 struct irq_chip *chip = info->chip; in fsl_mc_msi_update_chip_ops()
145 if (!chip->irq_write_msi_msg) in fsl_mc_msi_update_chip_ops()
146 chip->irq_write_msi_msg = fsl_mc_msi_write_msg; in fsl_mc_msi_update_chip_ops()
150 * fsl_mc_msi_create_irq_domain - Create a fsl-mc MSI interrupt domain
151 * @np: Optional device-tree node of the interrupt controller
152 * @info: MSI domain info
153 * @parent: Parent irq domain
155 * Updates the domain and chip ops and creates a fsl-mc MSI
163 struct irq_domain *parent) in fsl_mc_msi_create_irq_domain() argument
167 if (WARN_ON((info->flags & MSI_FLAG_LEVEL_CAPABLE))) in fsl_mc_msi_create_irq_domain()
168 info->flags &= ~MSI_FLAG_LEVEL_CAPABLE; in fsl_mc_msi_create_irq_domain()
169 if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS) in fsl_mc_msi_create_irq_domain()
171 if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS) in fsl_mc_msi_create_irq_domain()
174 domain = msi_create_irq_domain(fwnode, info, parent); in fsl_mc_msi_create_irq_domain()
189 bus_dev = root_dprc_dev->parent; in fsl_mc_find_msi_domain()
191 if (bus_dev->of_node) { in fsl_mc_find_msi_domain()
193 mc_dev->icid, in fsl_mc_find_msi_domain()
197 * if the msi-map property is missing assume that all the in fsl_mc_find_msi_domain()
198 * child containers inherit the domain from the parent in fsl_mc_find_msi_domain()
203 bus_dev->of_node, in fsl_mc_find_msi_domain()
206 msi_domain = iort_get_device_domain(dev, mc_dev->icid, in fsl_mc_find_msi_domain()
218 list_del(&desc->list); in fsl_mc_msi_free_descs()
233 dev_err(dev, "Failed to allocate msi entry\n"); in fsl_mc_msi_alloc_descs()
234 error = -ENOMEM; in fsl_mc_msi_alloc_descs()
238 msi_desc->fsl_mc.msi_index = i; in fsl_mc_msi_alloc_descs()
239 INIT_LIST_HEAD(&msi_desc->list); in fsl_mc_msi_alloc_descs()
240 list_add_tail(&msi_desc->list, dev_to_msi_list(dev)); in fsl_mc_msi_alloc_descs()
257 return -EINVAL; in fsl_mc_msi_domain_alloc_irqs()
265 error = -EINVAL; in fsl_mc_msi_domain_alloc_irqs()