2 * Copyright IBM Corp. 2012
5 * Jan Glauber <jang@linux.vnet.ibm.com>
8 #define COMPONENT "zPCI"
9 #define pr_fmt(fmt) COMPONENT ": " fmt
11 #include <linux/kernel.h>
12 #include <linux/err.h>
13 #include <linux/rculist.h>
14 #include <linux/hash.h>
15 #include <linux/pci.h>
16 #include <linux/msi.h>
17 #include <asm/hw_irq.h>
19 /* mapping of irq numbers to msi_desc */
20 static struct hlist_head
*msi_hash
;
21 static const unsigned int msi_hash_bits
= 8;
22 #define MSI_HASH_BUCKETS (1U << msi_hash_bits)
23 #define msi_hashfn(nr) hash_long(nr, msi_hash_bits)
25 static DEFINE_SPINLOCK(msi_map_lock
);
27 struct msi_desc
*__irq_get_msi_desc(unsigned int irq
)
31 hlist_for_each_entry_rcu(map
,
32 &msi_hash
[msi_hashfn(irq
)], msi_chain
)
38 int zpci_msi_set_mask_bits(struct msi_desc
*msi
, u32 mask
, u32 flag
)
40 if (msi
->msi_attrib
.is_msix
) {
41 int offset
= msi
->msi_attrib
.entry_nr
* PCI_MSIX_ENTRY_SIZE
+
42 PCI_MSIX_ENTRY_VECTOR_CTRL
;
43 msi
->masked
= readl(msi
->mask_base
+ offset
);
44 writel(flag
, msi
->mask_base
+ offset
);
46 if (msi
->msi_attrib
.maskbit
) {
50 pos
= (long) msi
->mask_base
;
51 pci_read_config_dword(msi
->dev
, pos
, &mask_bits
);
53 mask_bits
|= flag
& mask
;
54 pci_write_config_dword(msi
->dev
, pos
, mask_bits
);
60 msi
->msi_attrib
.maskbit
= !!flag
;
64 int zpci_setup_msi_irq(struct zpci_dev
*zdev
, struct msi_desc
*msi
,
65 unsigned int nr
, int offset
)
71 map
= kmalloc(sizeof(*map
), GFP_KERNEL
);
77 zdev
->msi_map
[nr
& ZPCI_MSI_MASK
] = map
;
78 INIT_HLIST_NODE(&map
->msi_chain
);
80 pr_debug("%s hashing irq: %u to bucket nr: %llu\n",
81 __func__
, nr
, msi_hashfn(nr
));
82 hlist_add_head_rcu(&map
->msi_chain
, &msi_hash
[msi_hashfn(nr
)]);
84 spin_lock(&msi_map_lock
);
85 rc
= irq_set_msi_desc(nr
, msi
);
87 spin_unlock(&msi_map_lock
);
88 hlist_del_rcu(&map
->msi_chain
);
90 zdev
->msi_map
[nr
& ZPCI_MSI_MASK
] = NULL
;
93 spin_unlock(&msi_map_lock
);
95 msg
.data
= nr
- offset
;
96 msg
.address_lo
= zdev
->msi_addr
& 0xffffffff;
97 msg
.address_hi
= zdev
->msi_addr
>> 32;
98 write_msi_msg(nr
, &msg
);
102 void zpci_teardown_msi_irq(struct zpci_dev
*zdev
, struct msi_desc
*msi
)
104 int irq
= msi
->irq
& ZPCI_MSI_MASK
;
107 msi
->msg
.address_lo
= 0;
108 msi
->msg
.address_hi
= 0;
111 zpci_msi_set_mask_bits(msi
, 1, 1);
113 spin_lock(&msi_map_lock
);
114 map
= zdev
->msi_map
[irq
];
115 hlist_del_rcu(&map
->msi_chain
);
117 zdev
->msi_map
[irq
] = NULL
;
118 spin_unlock(&msi_map_lock
);
122 * The msi hash table has 256 entries which is good for 4..20
123 * devices (a typical device allocates 10 + CPUs MSI's). Maybe make
124 * the hash table size adjustable later.
126 int __init
zpci_msihash_init(void)
130 msi_hash
= kmalloc(MSI_HASH_BUCKETS
* sizeof(*msi_hash
), GFP_KERNEL
);
134 for (i
= 0; i
< MSI_HASH_BUCKETS
; i
++)
135 INIT_HLIST_HEAD(&msi_hash
[i
]);
139 void __init
zpci_msihash_exit(void)