Lines Matching refs:vector

36 static MSIMessage msix_prepare_message(PCIDevice *dev, unsigned vector)  in msix_prepare_message()  argument
38 uint8_t *table_entry = dev->msix_table + vector * PCI_MSIX_ENTRY_SIZE; in msix_prepare_message()
46 MSIMessage msix_get_message(PCIDevice *dev, unsigned vector) in msix_get_message() argument
48 return dev->msix_prepare_message(dev, vector); in msix_get_message()
55 void msix_set_message(PCIDevice *dev, int vector, struct MSIMessage msg) in msix_set_message() argument
57 uint8_t *table_entry = dev->msix_table + vector * PCI_MSIX_ENTRY_SIZE; in msix_set_message()
64 static uint8_t msix_pending_mask(int vector) in msix_pending_mask() argument
66 return 1 << (vector % 8); in msix_pending_mask()
69 static uint8_t *msix_pending_byte(PCIDevice *dev, int vector) in msix_pending_byte() argument
71 return dev->msix_pba + vector / 8; in msix_pending_byte()
74 static int msix_is_pending(PCIDevice *dev, int vector) in msix_is_pending() argument
76 return *msix_pending_byte(dev, vector) & msix_pending_mask(vector); in msix_is_pending()
79 void msix_set_pending(PCIDevice *dev, unsigned int vector) in msix_set_pending() argument
81 *msix_pending_byte(dev, vector) |= msix_pending_mask(vector); in msix_set_pending()
84 void msix_clr_pending(PCIDevice *dev, int vector) in msix_clr_pending() argument
86 *msix_pending_byte(dev, vector) &= ~msix_pending_mask(vector); in msix_clr_pending()
89 static bool msix_vector_masked(PCIDevice *dev, unsigned int vector, bool fmask) in msix_vector_masked() argument
91 unsigned offset = vector * PCI_MSIX_ENTRY_SIZE; in msix_vector_masked()
102 bool msix_is_masked(PCIDevice *dev, unsigned int vector) in msix_is_masked() argument
104 return msix_vector_masked(dev, vector, dev->msix_function_masked); in msix_is_masked()
108 unsigned int vector, bool is_masked) in msix_fire_vector_notifier() argument
117 dev->msix_vector_release_notifier(dev, vector); in msix_fire_vector_notifier()
119 msg = msix_get_message(dev, vector); in msix_fire_vector_notifier()
120 ret = dev->msix_vector_use_notifier(dev, vector, msg); in msix_fire_vector_notifier()
125 static void msix_handle_mask_update(PCIDevice *dev, int vector, bool was_masked) in msix_handle_mask_update() argument
127 bool is_masked = msix_is_masked(dev, vector); in msix_handle_mask_update()
130 MSIMessage msg = msix_prepare_message(dev, vector); in msix_handle_mask_update()
132 xen_evtchn_snoop_msi(dev, true, vector, msg.address, msg.data, in msix_handle_mask_update()
140 msix_fire_vector_notifier(dev, vector, is_masked); in msix_handle_mask_update()
142 if (!is_masked && msix_is_pending(dev, vector)) { in msix_handle_mask_update()
143 msix_clr_pending(dev, vector); in msix_handle_mask_update()
144 msix_notify(dev, vector); in msix_handle_mask_update()
148 void msix_set_mask(PCIDevice *dev, int vector, bool mask) in msix_set_mask() argument
153 assert(vector < dev->msix_entries_nr); in msix_set_mask()
155 offset = vector * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_VECTOR_CTRL; in msix_set_mask()
157 was_masked = msix_is_masked(dev, vector); in msix_set_mask()
165 msix_handle_mask_update(dev, vector, was_masked); in msix_set_mask()
183 int vector; in msix_write_config() local
205 for (vector = 0; vector < dev->msix_entries_nr; ++vector) { in msix_write_config()
206 msix_handle_mask_update(dev, vector, in msix_write_config()
207 msix_vector_masked(dev, vector, was_masked)); in msix_write_config()
224 int vector = addr / PCI_MSIX_ENTRY_SIZE; in msix_table_mmio_write() local
229 was_masked = msix_is_masked(dev, vector); in msix_table_mmio_write()
231 msix_handle_mask_update(dev, vector, was_masked); in msix_table_mmio_write()
280 int vector; in msix_mask_all() local
282 for (vector = 0; vector < nentries; ++vector) { in msix_mask_all()
284 vector * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_VECTOR_CTRL; in msix_mask_all()
285 bool was_masked = msix_is_masked(dev, vector); in msix_mask_all()
288 msix_handle_mask_update(dev, vector, was_masked); in msix_mask_all()
432 int vector; in msix_free_irq_entries() local
434 for (vector = 0; vector < dev->msix_entries_nr; ++vector) { in msix_free_irq_entries()
435 dev->msix_entry_used[vector] = 0; in msix_free_irq_entries()
436 msix_clr_pending(dev, vector); in msix_free_irq_entries()
442 int vector; in msix_clear_all_vectors() local
444 for (vector = 0; vector < dev->msix_entries_nr; ++vector) { in msix_clear_all_vectors()
445 msix_clr_pending(dev, vector); in msix_clear_all_vectors()
494 unsigned int vector; in msix_load() local
505 for (vector = 0; vector < n; vector++) { in msix_load()
506 msix_handle_mask_update(dev, vector, true); in msix_load()
525 void msix_notify(PCIDevice *dev, unsigned vector) in msix_notify() argument
529 assert(vector < dev->msix_entries_nr); in msix_notify()
531 if (!dev->msix_entry_used[vector]) { in msix_notify()
535 if (msix_is_masked(dev, vector)) { in msix_notify()
536 msix_set_pending(dev, vector); in msix_notify()
540 msg = msix_get_message(dev, vector); in msix_notify()
567 void msix_vector_use(PCIDevice *dev, unsigned vector) in msix_vector_use() argument
569 assert(vector < dev->msix_entries_nr); in msix_vector_use()
570 dev->msix_entry_used[vector]++; in msix_vector_use()
574 void msix_vector_unuse(PCIDevice *dev, unsigned vector) in msix_vector_unuse() argument
576 assert(vector < dev->msix_entries_nr); in msix_vector_unuse()
577 if (!dev->msix_entry_used[vector]) { in msix_vector_unuse()
580 if (--dev->msix_entry_used[vector]) { in msix_vector_unuse()
583 msix_clr_pending(dev, vector); in msix_vector_unuse()
599 static int msix_set_notifier_for_vector(PCIDevice *dev, unsigned int vector) in msix_set_notifier_for_vector() argument
603 if (msix_is_masked(dev, vector)) { in msix_set_notifier_for_vector()
606 msg = msix_get_message(dev, vector); in msix_set_notifier_for_vector()
607 return dev->msix_vector_use_notifier(dev, vector, msg); in msix_set_notifier_for_vector()
610 static void msix_unset_notifier_for_vector(PCIDevice *dev, unsigned int vector) in msix_unset_notifier_for_vector() argument
612 if (msix_is_masked(dev, vector)) { in msix_unset_notifier_for_vector()
615 dev->msix_vector_release_notifier(dev, vector); in msix_unset_notifier_for_vector()
623 int vector, ret; in msix_set_vector_notifiers() local
633 for (vector = 0; vector < dev->msix_entries_nr; vector++) { in msix_set_vector_notifiers()
634 ret = msix_set_notifier_for_vector(dev, vector); in msix_set_vector_notifiers()
646 while (--vector >= 0) { in msix_set_vector_notifiers()
647 msix_unset_notifier_for_vector(dev, vector); in msix_set_vector_notifiers()
657 int vector; in msix_unset_vector_notifiers() local
664 for (vector = 0; vector < dev->msix_entries_nr; vector++) { in msix_unset_vector_notifiers()
665 msix_unset_notifier_for_vector(dev, vector); in msix_unset_vector_notifiers()