Lines Matching refs:ntb

5 #include <linux/ntb.h>
20 * @ntb: NTB device context
31 int ntb_msi_init(struct ntb_dev *ntb,
42 peers = ntb_peer_port_count(ntb);
46 struct_size = sizeof(*ntb->msi) + sizeof(*ntb->msi->peer_mws) * peers;
48 ntb->msi = devm_kzalloc(&ntb->dev, struct_size, GFP_KERNEL);
49 if (!ntb->msi)
52 ntb->msi->desc_changed = desc_changed;
55 peer_widx = ntb_peer_mw_count(ntb) - 1 - i;
57 ret = ntb_peer_mw_get_addr(ntb, peer_widx, &mw_phys_addr,
62 ntb->msi->peer_mws[i] = devm_ioremap(&ntb->dev, mw_phys_addr,
64 if (!ntb->msi->peer_mws[i]) {
74 if (ntb->msi->peer_mws[i])
75 devm_iounmap(&ntb->dev, ntb->msi->peer_mws[i]);
77 devm_kfree(&ntb->dev, ntb->msi);
78 ntb->msi = NULL;
85 * @ntb: NTB device context
97 int ntb_msi_setup_mws(struct ntb_dev *ntb)
108 if (!ntb->msi)
111 desc = first_msi_entry(&ntb->pdev->dev);
114 for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
115 peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
119 ret = ntb_mw_get_align(ntb, peer, peer_widx, &addr_align,
127 for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
128 peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
134 ret = ntb_mw_get_align(ntb, peer, peer_widx, NULL,
144 ret = ntb_mw_set_trans(ntb, peer, peer_widx,
150 ntb->msi->base_addr = addr;
151 ntb->msi->end_addr = addr + mw_min_size;
157 peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
161 ntb_mw_clear_trans(ntb, i, peer_widx);
170 * @ntb: NTB device context
174 void ntb_msi_clear_mws(struct ntb_dev *ntb)
179 for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
180 peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
184 ntb_mw_clear_trans(ntb, peer, peer_widx);
190 struct ntb_dev *ntb;
195 static int ntb_msi_set_desc(struct ntb_dev *ntb, struct msi_desc *entry,
203 if (addr < ntb->msi->base_addr || addr >= ntb->msi->end_addr) {
204 dev_warn_once(&ntb->dev,
206 entry->irq, addr, ntb->msi->base_addr,
207 ntb->msi->end_addr);
211 msi_desc->addr_offset = addr - ntb->msi->base_addr;
221 WARN_ON(ntb_msi_set_desc(dr->ntb, entry, dr->msi_desc));
223 if (dr->ntb->msi->desc_changed)
224 dr->ntb->msi->desc_changed(dr->ntb->ctx);
235 static int ntbm_msi_setup_callback(struct ntb_dev *ntb, struct msi_desc *entry,
245 dr->ntb = ntb;
249 devres_add(&ntb->dev, dr);
259 * @ntb: NTB device context
279 int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb, irq_handler_t handler,
288 if (!ntb->msi)
291 for_each_pci_msi_entry(entry, ntb->pdev) {
296 ret = devm_request_threaded_irq(&ntb->dev, entry->irq, handler,
301 if (ntb_msi_set_desc(ntb, entry, msi_desc)) {
302 devm_free_irq(&ntb->dev, entry->irq, dev_id);
306 ret = ntbm_msi_setup_callback(ntb, entry, msi_desc);
308 devm_free_irq(&ntb->dev, entry->irq, dev_id);
322 struct ntb_dev *ntb = dev_ntb(dev);
325 return dr->ntb == ntb && dr->entry == data;
330 * @ntb: NTB device context
337 void ntbm_msi_free_irq(struct ntb_dev *ntb, unsigned int irq, void *dev_id)
344 WARN_ON(devres_destroy(&ntb->dev, ntbm_msi_callback_release,
347 devm_free_irq(&ntb->dev, irq, dev_id);
353 * @ntb: NTB device context
363 int ntb_msi_peer_trigger(struct ntb_dev *ntb, int peer,
368 if (!ntb->msi)
371 idx = desc->addr_offset / sizeof(*ntb->msi->peer_mws[peer]);
373 iowrite32(desc->data, &ntb->msi->peer_mws[peer][idx]);
381 * @ntb: NTB device context
393 int ntb_msi_peer_addr(struct ntb_dev *ntb, int peer,
397 int peer_widx = ntb_peer_mw_count(ntb) - 1 - peer;
401 ret = ntb_peer_mw_get_addr(ntb, peer_widx, &mw_phys_addr, NULL);