12
12
13
13
#include <linux/interrupt.h>
14
14
#include <linux/irq.h>
15
+ #include <linux/irqchip/irq-msi-lib.h>
15
16
#include <linux/irqdomain.h>
16
17
#include <linux/kernel.h>
17
18
#include <linux/init.h>
@@ -203,11 +204,6 @@ static void xilinx_msi_top_irq_ack(struct irq_data *d)
203
204
*/
204
205
}
205
206
206
- static struct irq_chip xilinx_msi_top_chip = {
207
- .name = "PCIe MSI" ,
208
- .irq_ack = xilinx_msi_top_irq_ack ,
209
- };
210
-
211
207
static void xilinx_compose_msi_msg (struct irq_data * data , struct msi_msg * msg )
212
208
{
213
209
struct xilinx_pcie * pcie = irq_data_get_irq_chip_data (data );
@@ -264,29 +260,42 @@ static const struct irq_domain_ops xilinx_msi_domain_ops = {
264
260
.free = xilinx_msi_domain_free ,
265
261
};
266
262
267
- static struct msi_domain_info xilinx_msi_info = {
268
- .flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
269
- MSI_FLAG_NO_AFFINITY ,
270
- .chip = & xilinx_msi_top_chip ,
263
+ static bool xilinx_init_dev_msi_info (struct device * dev , struct irq_domain * domain ,
264
+ struct irq_domain * real_parent , struct msi_domain_info * info )
265
+ {
266
+ struct irq_chip * chip = info -> chip ;
267
+
268
+ if (!msi_lib_init_dev_msi_info (dev , domain , real_parent , info ))
269
+ return false;
270
+
271
+ chip -> irq_ack = xilinx_msi_top_irq_ack ;
272
+ return true;
273
+ }
274
+
275
+ #define XILINX_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
276
+ MSI_FLAG_USE_DEF_CHIP_OPS | \
277
+ MSI_FLAG_NO_AFFINITY)
278
+
279
+ static const struct msi_parent_ops xilinx_msi_parent_ops = {
280
+ .required_flags = XILINX_MSI_FLAGS_REQUIRED ,
281
+ .supported_flags = MSI_GENERIC_FLAGS_MASK ,
282
+ .bus_select_token = DOMAIN_BUS_PCI_MSI ,
283
+ .prefix = "xilinx-" ,
284
+ .init_dev_msi_info = xilinx_init_dev_msi_info ,
271
285
};
272
286
273
287
static int xilinx_allocate_msi_domains (struct xilinx_pcie * pcie )
274
288
{
275
- struct fwnode_handle * fwnode = dev_fwnode (pcie -> dev );
276
- struct irq_domain * parent ;
277
-
278
- parent = irq_domain_create_linear (fwnode , XILINX_NUM_MSI_IRQS ,
279
- & xilinx_msi_domain_ops , pcie );
280
- if (!parent ) {
281
- dev_err (pcie -> dev , "failed to create IRQ domain\n" );
282
- return - ENOMEM ;
283
- }
284
- irq_domain_update_bus_token (parent , DOMAIN_BUS_NEXUS );
285
-
286
- pcie -> msi_domain = pci_msi_create_irq_domain (fwnode , & xilinx_msi_info , parent );
289
+ struct irq_domain_info info = {
290
+ .fwnode = dev_fwnode (pcie -> dev ),
291
+ .ops = & xilinx_msi_domain_ops ,
292
+ .host_data = pcie ,
293
+ .size = XILINX_NUM_MSI_IRQS ,
294
+ };
295
+
296
+ pcie -> msi_domain = msi_create_parent_irq_domain (& info , & xilinx_msi_parent_ops );
287
297
if (!pcie -> msi_domain ) {
288
298
dev_err (pcie -> dev , "failed to create MSI domain\n" );
289
- irq_domain_remove (parent );
290
299
return - ENOMEM ;
291
300
}
292
301
@@ -295,10 +304,7 @@ static int xilinx_allocate_msi_domains(struct xilinx_pcie *pcie)
295
304
296
305
static void xilinx_free_msi_domains (struct xilinx_pcie * pcie )
297
306
{
298
- struct irq_domain * parent = pcie -> msi_domain -> parent ;
299
-
300
307
irq_domain_remove (pcie -> msi_domain );
301
- irq_domain_remove (parent );
302
308
}
303
309
304
310
/* INTx Functions */
0 commit comments