aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/pci_msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/kernel/pci_msi.c')
-rw-r--r--arch/sparc/kernel/pci_msi.c58
1 files changed, 28 insertions, 30 deletions
diff --git a/arch/sparc/kernel/pci_msi.c b/arch/sparc/kernel/pci_msi.c
index 548b8ca9c210..580651af73f2 100644
--- a/arch/sparc/kernel/pci_msi.c
+++ b/arch/sparc/kernel/pci_msi.c
@@ -30,13 +30,10 @@ static irqreturn_t sparc64_msiq_interrupt(int irq, void *cookie)
30 30
31 err = ops->dequeue_msi(pbm, msiqid, &head, &msi); 31 err = ops->dequeue_msi(pbm, msiqid, &head, &msi);
32 if (likely(err > 0)) { 32 if (likely(err > 0)) {
33 struct irq_desc *desc; 33 unsigned int irq;
34 unsigned int virt_irq;
35 34
36 virt_irq = pbm->msi_irq_table[msi - pbm->msi_first]; 35 irq = pbm->msi_irq_table[msi - pbm->msi_first];
37 desc = irq_desc + virt_irq; 36 generic_handle_irq(irq);
38
39 desc->handle_irq(virt_irq, desc);
40 } 37 }
41 38
42 if (unlikely(err < 0)) 39 if (unlikely(err < 0))
@@ -114,14 +111,14 @@ static void free_msi(struct pci_pbm_info *pbm, int msi_num)
114 111
115static struct irq_chip msi_irq = { 112static struct irq_chip msi_irq = {
116 .name = "PCI-MSI", 113 .name = "PCI-MSI",
117 .mask = mask_msi_irq, 114 .irq_mask = mask_msi_irq,
118 .unmask = unmask_msi_irq, 115 .irq_unmask = unmask_msi_irq,
119 .enable = unmask_msi_irq, 116 .irq_enable = unmask_msi_irq,
120 .disable = mask_msi_irq, 117 .irq_disable = mask_msi_irq,
121 /* XXX affinity XXX */ 118 /* XXX affinity XXX */
122}; 119};
123 120
124static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, 121static int sparc64_setup_msi_irq(unsigned int *irq_p,
125 struct pci_dev *pdev, 122 struct pci_dev *pdev,
126 struct msi_desc *entry) 123 struct msi_desc *entry)
127{ 124{
@@ -131,17 +128,17 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p,
131 int msi, err; 128 int msi, err;
132 u32 msiqid; 129 u32 msiqid;
133 130
134 *virt_irq_p = virt_irq_alloc(0, 0); 131 *irq_p = irq_alloc(0, 0);
135 err = -ENOMEM; 132 err = -ENOMEM;
136 if (!*virt_irq_p) 133 if (!*irq_p)
137 goto out_err; 134 goto out_err;
138 135
139 set_irq_chip_and_handler_name(*virt_irq_p, &msi_irq, 136 irq_set_chip_and_handler_name(*irq_p, &msi_irq, handle_simple_irq,
140 handle_simple_irq, "MSI"); 137 "MSI");
141 138
142 err = alloc_msi(pbm); 139 err = alloc_msi(pbm);
143 if (unlikely(err < 0)) 140 if (unlikely(err < 0))
144 goto out_virt_irq_free; 141 goto out_irq_free;
145 142
146 msi = err; 143 msi = err;
147 144
@@ -152,7 +149,7 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p,
152 if (err) 149 if (err)
153 goto out_msi_free; 150 goto out_msi_free;
154 151
155 pbm->msi_irq_table[msi - pbm->msi_first] = *virt_irq_p; 152 pbm->msi_irq_table[msi - pbm->msi_first] = *irq_p;
156 153
157 if (entry->msi_attrib.is_64) { 154 if (entry->msi_attrib.is_64) {
158 msg.address_hi = pbm->msi64_start >> 32; 155 msg.address_hi = pbm->msi64_start >> 32;
@@ -163,24 +160,24 @@ static int sparc64_setup_msi_irq(unsigned int *virt_irq_p,
163 } 160 }
164 msg.data = msi; 161 msg.data = msi;
165 162
166 set_irq_msi(*virt_irq_p, entry); 163 irq_set_msi_desc(*irq_p, entry);
167 write_msi_msg(*virt_irq_p, &msg); 164 write_msi_msg(*irq_p, &msg);
168 165
169 return 0; 166 return 0;
170 167
171out_msi_free: 168out_msi_free:
172 free_msi(pbm, msi); 169 free_msi(pbm, msi);
173 170
174out_virt_irq_free: 171out_irq_free:
175 set_irq_chip(*virt_irq_p, NULL); 172 irq_set_chip(*irq_p, NULL);
176 virt_irq_free(*virt_irq_p); 173 irq_free(*irq_p);
177 *virt_irq_p = 0; 174 *irq_p = 0;
178 175
179out_err: 176out_err:
180 return err; 177 return err;
181} 178}
182 179
183static void sparc64_teardown_msi_irq(unsigned int virt_irq, 180static void sparc64_teardown_msi_irq(unsigned int irq,
184 struct pci_dev *pdev) 181 struct pci_dev *pdev)
185{ 182{
186 struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; 183 struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
@@ -189,12 +186,12 @@ static void sparc64_teardown_msi_irq(unsigned int virt_irq,
189 int i, err; 186 int i, err;
190 187
191 for (i = 0; i < pbm->msi_num; i++) { 188 for (i = 0; i < pbm->msi_num; i++) {
192 if (pbm->msi_irq_table[i] == virt_irq) 189 if (pbm->msi_irq_table[i] == irq)
193 break; 190 break;
194 } 191 }
195 if (i >= pbm->msi_num) { 192 if (i >= pbm->msi_num) {
196 printk(KERN_ERR "%s: teardown: No MSI for irq %u\n", 193 printk(KERN_ERR "%s: teardown: No MSI for irq %u\n",
197 pbm->name, virt_irq); 194 pbm->name, irq);
198 return; 195 return;
199 } 196 }
200 197
@@ -205,14 +202,14 @@ static void sparc64_teardown_msi_irq(unsigned int virt_irq,
205 if (err) { 202 if (err) {
206 printk(KERN_ERR "%s: teardown: ops->teardown() on MSI %u, " 203 printk(KERN_ERR "%s: teardown: ops->teardown() on MSI %u, "
207 "irq %u, gives error %d\n", 204 "irq %u, gives error %d\n",
208 pbm->name, msi_num, virt_irq, err); 205 pbm->name, msi_num, irq, err);
209 return; 206 return;
210 } 207 }
211 208
212 free_msi(pbm, msi_num); 209 free_msi(pbm, msi_num);
213 210
214 set_irq_chip(virt_irq, NULL); 211 irq_set_chip(irq, NULL);
215 virt_irq_free(virt_irq); 212 irq_free(irq);
216} 213}
217 214
218static int msi_bitmap_alloc(struct pci_pbm_info *pbm) 215static int msi_bitmap_alloc(struct pci_pbm_info *pbm)
@@ -287,8 +284,9 @@ static int bringup_one_msi_queue(struct pci_pbm_info *pbm,
287 284
288 nid = pbm->numa_node; 285 nid = pbm->numa_node;
289 if (nid != -1) { 286 if (nid != -1) {
290 cpumask_t numa_mask = *cpumask_of_node(nid); 287 cpumask_t numa_mask;
291 288
289 cpumask_copy(&numa_mask, cpumask_of_node(nid));
292 irq_set_affinity(irq, &numa_mask); 290 irq_set_affinity(irq, &numa_mask);
293 } 291 }
294 err = request_irq(irq, sparc64_msiq_interrupt, 0, 292 err = request_irq(irq, sparc64_msiq_interrupt, 0,