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.
13 #include <linux/msi.h>
16 #include "fsl-mc-private.h"
20 * Generate a unique ID identifying the interrupt (only used within the MSI
30 return (irq_hw_number_t)(desc->msi_index + (dev->icid * 10000)); in fsl_mc_domain_calc_hwirq()
36 arg->desc = desc; in fsl_mc_msi_set_desc()
37 arg->hwirq = fsl_mc_domain_calc_hwirq(to_fsl_mc_device(desc->dev), in fsl_mc_msi_set_desc()
46 struct msi_domain_ops *ops = info->ops; in fsl_mc_msi_update_dom_ops()
54 if (!ops->set_desc) in fsl_mc_msi_update_dom_ops()
55 ops->set_desc = fsl_mc_msi_set_desc; in fsl_mc_msi_update_dom_ops()
63 struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev; in __fsl_mc_msi_write_msg()
67 * msi_desc->msg.address is 0x0 when this function is invoked in in __fsl_mc_msi_write_msg()
69 * really need to "unprogram" the MSI, so we just return. in __fsl_mc_msi_write_msg()
71 if (msi_desc->msg.address_lo == 0x0 && msi_desc->msg.address_hi == 0x0) in __fsl_mc_msi_write_msg()
77 irq_cfg.paddr = ((u64)msi_desc->msg.address_hi << 32) | in __fsl_mc_msi_write_msg()
78 msi_desc->msg.address_lo; in __fsl_mc_msi_write_msg()
79 irq_cfg.val = msi_desc->msg.data; in __fsl_mc_msi_write_msg()
80 irq_cfg.irq_num = msi_desc->irq; in __fsl_mc_msi_write_msg()
86 error = dprc_set_irq(mc_bus_dev->mc_io, in __fsl_mc_msi_write_msg()
88 mc_bus_dev->mc_handle, in __fsl_mc_msi_write_msg()
89 mc_dev_irq->dev_irq_index, in __fsl_mc_msi_write_msg()
92 dev_err(&owner_mc_dev->dev, in __fsl_mc_msi_write_msg()
99 error = dprc_set_obj_irq(mc_bus_dev->mc_io, in __fsl_mc_msi_write_msg()
101 mc_bus_dev->mc_handle, in __fsl_mc_msi_write_msg()
102 owner_mc_dev->obj_desc.type, in __fsl_mc_msi_write_msg()
103 owner_mc_dev->obj_desc.id, in __fsl_mc_msi_write_msg()
104 mc_dev_irq->dev_irq_index, in __fsl_mc_msi_write_msg()
107 dev_err(&owner_mc_dev->dev, in __fsl_mc_msi_write_msg()
120 struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev); in fsl_mc_msi_write_msg()
123 &mc_bus->irq_resources[msi_desc->msi_index]; in fsl_mc_msi_write_msg()
125 msi_desc->msg = *msg; in fsl_mc_msi_write_msg()
128 * Program the MSI (paddr, value) pair in the device: in fsl_mc_msi_write_msg()
135 struct irq_chip *chip = info->chip; in fsl_mc_msi_update_chip_ops()
143 if (!chip->irq_write_msi_msg) in fsl_mc_msi_update_chip_ops()
144 chip->irq_write_msi_msg = fsl_mc_msi_write_msg; in fsl_mc_msi_update_chip_ops()
148 * fsl_mc_msi_create_irq_domain - Create a fsl-mc MSI interrupt domain
150 * @info: MSI domain info
151 * @parent: Parent irq domain
153 * Updates the domain and chip ops and creates a fsl-mc MSI
161 struct irq_domain *parent) in fsl_mc_msi_create_irq_domain() argument
165 if (WARN_ON((info->flags & MSI_FLAG_LEVEL_CAPABLE))) in fsl_mc_msi_create_irq_domain()
166 info->flags &= ~MSI_FLAG_LEVEL_CAPABLE; in fsl_mc_msi_create_irq_domain()
167 if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS) in fsl_mc_msi_create_irq_domain()
169 if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS) in fsl_mc_msi_create_irq_domain()
171 info->flags |= MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS | MSI_FLAG_FREE_MSI_DESCS; in fsl_mc_msi_create_irq_domain()
173 domain = msi_create_irq_domain(fwnode, info, parent); in fsl_mc_msi_create_irq_domain()
188 bus_dev = root_dprc_dev->parent; in fsl_mc_find_msi_domain()
190 if (bus_dev->of_node) { in fsl_mc_find_msi_domain()
192 mc_dev->icid, in fsl_mc_find_msi_domain()
196 * if the msi-map property is missing assume that all the in fsl_mc_find_msi_domain()
197 * child containers inherit the domain from the parent in fsl_mc_find_msi_domain()
202 bus_dev->of_node, in fsl_mc_find_msi_domain()
205 msi_domain = iort_get_device_domain(dev, mc_dev->icid, in fsl_mc_find_msi_domain()
223 error = msi_domain_alloc_irqs_range(dev, MSI_DEFAULT_DOMAIN, 0, irq_count - 1); in fsl_mc_msi_domain_alloc_irqs()