xref: /openbmc/qemu/hw/pci/msi.c (revision 081340d1ddfe27e80f653d707c278edf06a9a803)
1  /*
2   * msi.c
3   *
4   * Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp>
5   *                    VA Linux Systems Japan K.K.
6   *
7   * This program is free software; you can redistribute it and/or modify
8   * it under the terms of the GNU General Public License as published by
9   * the Free Software Foundation; either version 2 of the License, or
10   * (at your option) any later version.
11  
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Public License for more details.
16  
17   * You should have received a copy of the GNU General Public License along
18   * with this program; if not, see <http://www.gnu.org/licenses/>.
19   */
20  
21  #include "qemu/osdep.h"
22  #include "hw/pci/msi.h"
23  #include "hw/xen/xen.h"
24  #include "qemu/range.h"
25  #include "qapi/error.h"
26  #include "sysemu/xen.h"
27  
28  #include "hw/i386/kvm/xen_evtchn.h"
29  
30  /* PCI_MSI_ADDRESS_LO */
31  #define PCI_MSI_ADDRESS_LO_MASK         (~0x3)
32  
33  /* If we get rid of cap allocator, we won't need those. */
34  #define PCI_MSI_32_SIZEOF       0x0a
35  #define PCI_MSI_64_SIZEOF       0x0e
36  #define PCI_MSI_32M_SIZEOF      0x14
37  #define PCI_MSI_64M_SIZEOF      0x18
38  
39  #define PCI_MSI_VECTORS_MAX     32
40  
41  /*
42   * Flag for interrupt controllers to declare broken MSI/MSI-X support.
43   * values: false - broken; true - non-broken.
44   *
45   * Setting this flag to false will remove MSI/MSI-X capability from all devices.
46   *
47   * It is preferable for controllers to set this to true (non-broken) even if
48   * they do not actually support MSI/MSI-X: guests normally probe the controller
49   * type and do not attempt to enable MSI/MSI-X with interrupt controllers not
50   * supporting such, so removing the capability is not required, and
51   * it seems cleaner to have a given device look the same for all boards.
52   *
53   * TODO: some existing controllers violate the above rule. Identify and fix them.
54   */
55  bool msi_nonbroken;
56  
57  /* If we get rid of cap allocator, we won't need this. */
58  static inline uint8_t msi_cap_sizeof(uint16_t flags)
59  {
60      switch (flags & (PCI_MSI_FLAGS_MASKBIT | PCI_MSI_FLAGS_64BIT)) {
61      case PCI_MSI_FLAGS_MASKBIT | PCI_MSI_FLAGS_64BIT:
62          return PCI_MSI_64M_SIZEOF;
63      case PCI_MSI_FLAGS_64BIT:
64          return PCI_MSI_64_SIZEOF;
65      case PCI_MSI_FLAGS_MASKBIT:
66          return PCI_MSI_32M_SIZEOF;
67      case 0:
68          return PCI_MSI_32_SIZEOF;
69      default:
70          abort();
71          break;
72      }
73      return 0;
74  }
75  
76  //#define MSI_DEBUG
77  
78  #ifdef MSI_DEBUG
79  # define MSI_DPRINTF(fmt, ...)                                          \
80      fprintf(stderr, "%s:%d " fmt, __func__, __LINE__, ## __VA_ARGS__)
81  #else
82  # define MSI_DPRINTF(fmt, ...)  do { } while (0)
83  #endif
84  #define MSI_DEV_PRINTF(dev, fmt, ...)                                   \
85      MSI_DPRINTF("%s:%x " fmt, (dev)->name, (dev)->devfn, ## __VA_ARGS__)
86  
87  static inline unsigned int msi_nr_vectors(uint16_t flags)
88  {
89      return 1U <<
90          ((flags & PCI_MSI_FLAGS_QSIZE) >> ctz32(PCI_MSI_FLAGS_QSIZE));
91  }
92  
93  static inline uint8_t msi_flags_off(const PCIDevice* dev)
94  {
95      return dev->msi_cap + PCI_MSI_FLAGS;
96  }
97  
98  static inline uint8_t msi_address_lo_off(const PCIDevice* dev)
99  {
100      return dev->msi_cap + PCI_MSI_ADDRESS_LO;
101  }
102  
103  static inline uint8_t msi_address_hi_off(const PCIDevice* dev)
104  {
105      return dev->msi_cap + PCI_MSI_ADDRESS_HI;
106  }
107  
108  static inline uint8_t msi_data_off(const PCIDevice* dev, bool msi64bit)
109  {
110      return dev->msi_cap + (msi64bit ? PCI_MSI_DATA_64 : PCI_MSI_DATA_32);
111  }
112  
113  static inline uint8_t msi_mask_off(const PCIDevice* dev, bool msi64bit)
114  {
115      return dev->msi_cap + (msi64bit ? PCI_MSI_MASK_64 : PCI_MSI_MASK_32);
116  }
117  
118  static inline uint8_t msi_pending_off(const PCIDevice* dev, bool msi64bit)
119  {
120      return dev->msi_cap + (msi64bit ? PCI_MSI_PENDING_64 : PCI_MSI_PENDING_32);
121  }
122  
123  /*
124   * Special API for POWER to configure the vectors through
125   * a side channel. Should never be used by devices.
126   */
127  void msi_set_message(PCIDevice *dev, MSIMessage msg)
128  {
129      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
130      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
131  
132      if (msi64bit) {
133          pci_set_quad(dev->config + msi_address_lo_off(dev), msg.address);
134      } else {
135          pci_set_long(dev->config + msi_address_lo_off(dev), msg.address);
136      }
137      pci_set_word(dev->config + msi_data_off(dev, msi64bit), msg.data);
138  }
139  
140  static MSIMessage msi_prepare_message(PCIDevice *dev, unsigned int vector)
141  {
142      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
143      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
144      unsigned int nr_vectors = msi_nr_vectors(flags);
145      MSIMessage msg;
146  
147      assert(vector < nr_vectors);
148  
149      if (msi64bit) {
150          msg.address = pci_get_quad(dev->config + msi_address_lo_off(dev));
151      } else {
152          msg.address = pci_get_long(dev->config + msi_address_lo_off(dev));
153      }
154  
155      /* upper bit 31:16 is zero */
156      msg.data = pci_get_word(dev->config + msi_data_off(dev, msi64bit));
157      if (nr_vectors > 1) {
158          msg.data &= ~(nr_vectors - 1);
159          msg.data |= vector;
160      }
161  
162      return msg;
163  }
164  
165  MSIMessage msi_get_message(PCIDevice *dev, unsigned int vector)
166  {
167      return dev->msi_prepare_message(dev, vector);
168  }
169  
170  bool msi_enabled(const PCIDevice *dev)
171  {
172      return msi_present(dev) &&
173          (pci_get_word(dev->config + msi_flags_off(dev)) &
174           PCI_MSI_FLAGS_ENABLE);
175  }
176  
177  /*
178   * Make PCI device @dev MSI-capable.
179   * Non-zero @offset puts capability MSI at that offset in PCI config
180   * space.
181   * @nr_vectors is the number of MSI vectors (1, 2, 4, 8, 16 or 32).
182   * If @msi64bit, make the device capable of sending a 64-bit message
183   * address.
184   * If @msi_per_vector_mask, make the device support per-vector masking.
185   * @errp is for returning errors.
186   * Return 0 on success; set @errp and return -errno on error.
187   *
188   * -ENOTSUP means lacking msi support for a msi-capable platform.
189   * -EINVAL means capability overlap, happens when @offset is non-zero,
190   *  also means a programming error, except device assignment, which can check
191   *  if a real HW is broken.
192   */
193  int msi_init(struct PCIDevice *dev, uint8_t offset,
194               unsigned int nr_vectors, bool msi64bit,
195               bool msi_per_vector_mask, Error **errp)
196  {
197      unsigned int vectors_order;
198      uint16_t flags;
199      uint8_t cap_size;
200      int config_offset;
201  
202      if (!msi_nonbroken) {
203          error_setg(errp, "MSI is not supported by interrupt controller");
204          return -ENOTSUP;
205      }
206  
207      MSI_DEV_PRINTF(dev,
208                     "init offset: 0x%"PRIx8" vector: %"PRId8
209                     " 64bit %d mask %d\n",
210                     offset, nr_vectors, msi64bit, msi_per_vector_mask);
211  
212      assert(!(nr_vectors & (nr_vectors - 1)));   /* power of 2 */
213      assert(nr_vectors > 0);
214      assert(nr_vectors <= PCI_MSI_VECTORS_MAX);
215      /* the nr of MSI vectors is up to 32 */
216      vectors_order = ctz32(nr_vectors);
217  
218      flags = vectors_order << ctz32(PCI_MSI_FLAGS_QMASK);
219      if (msi64bit) {
220          flags |= PCI_MSI_FLAGS_64BIT;
221      }
222      if (msi_per_vector_mask) {
223          flags |= PCI_MSI_FLAGS_MASKBIT;
224      }
225  
226      cap_size = msi_cap_sizeof(flags);
227      config_offset = pci_add_capability(dev, PCI_CAP_ID_MSI, offset,
228                                          cap_size, errp);
229      if (config_offset < 0) {
230          return config_offset;
231      }
232  
233      dev->msi_cap = config_offset;
234      dev->cap_present |= QEMU_PCI_CAP_MSI;
235  
236      pci_set_word(dev->config + msi_flags_off(dev), flags);
237      pci_set_word(dev->wmask + msi_flags_off(dev),
238                   PCI_MSI_FLAGS_QSIZE | PCI_MSI_FLAGS_ENABLE);
239      pci_set_long(dev->wmask + msi_address_lo_off(dev),
240                   PCI_MSI_ADDRESS_LO_MASK);
241      if (msi64bit) {
242          pci_set_long(dev->wmask + msi_address_hi_off(dev), 0xffffffff);
243      }
244      pci_set_word(dev->wmask + msi_data_off(dev, msi64bit), 0xffff);
245  
246      if (msi_per_vector_mask) {
247          /* Make mask bits 0 to nr_vectors - 1 writable. */
248          pci_set_long(dev->wmask + msi_mask_off(dev, msi64bit),
249                       0xffffffff >> (PCI_MSI_VECTORS_MAX - nr_vectors));
250      }
251  
252      dev->msi_prepare_message = msi_prepare_message;
253  
254      return 0;
255  }
256  
257  void msi_uninit(struct PCIDevice *dev)
258  {
259      uint16_t flags;
260      uint8_t cap_size;
261  
262      if (!msi_present(dev)) {
263          return;
264      }
265      flags = pci_get_word(dev->config + msi_flags_off(dev));
266      cap_size = msi_cap_sizeof(flags);
267      pci_del_capability(dev, PCI_CAP_ID_MSI, cap_size);
268      dev->cap_present &= ~QEMU_PCI_CAP_MSI;
269      dev->msi_prepare_message = NULL;
270  
271      MSI_DEV_PRINTF(dev, "uninit\n");
272  }
273  
274  void msi_reset(PCIDevice *dev)
275  {
276      uint16_t flags;
277      bool msi64bit;
278  
279      if (!msi_present(dev)) {
280          return;
281      }
282  
283      flags = pci_get_word(dev->config + msi_flags_off(dev));
284      flags &= ~(PCI_MSI_FLAGS_QSIZE | PCI_MSI_FLAGS_ENABLE);
285      msi64bit = flags & PCI_MSI_FLAGS_64BIT;
286  
287      pci_set_word(dev->config + msi_flags_off(dev), flags);
288      pci_set_long(dev->config + msi_address_lo_off(dev), 0);
289      if (msi64bit) {
290          pci_set_long(dev->config + msi_address_hi_off(dev), 0);
291      }
292      pci_set_word(dev->config + msi_data_off(dev, msi64bit), 0);
293      if (flags & PCI_MSI_FLAGS_MASKBIT) {
294          pci_set_long(dev->config + msi_mask_off(dev, msi64bit), 0);
295          pci_set_long(dev->config + msi_pending_off(dev, msi64bit), 0);
296      }
297      MSI_DEV_PRINTF(dev, "reset\n");
298  }
299  
300  bool msi_is_masked(const PCIDevice *dev, unsigned int vector)
301  {
302      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
303      uint32_t mask, data;
304      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
305      assert(vector < PCI_MSI_VECTORS_MAX);
306  
307      if (!(flags & PCI_MSI_FLAGS_MASKBIT)) {
308          return false;
309      }
310  
311      data = pci_get_word(dev->config + msi_data_off(dev, msi64bit));
312      if (xen_enabled() && xen_is_pirq_msi(data)) {
313          return false;
314      }
315  
316      mask = pci_get_long(dev->config +
317                          msi_mask_off(dev, flags & PCI_MSI_FLAGS_64BIT));
318      return mask & (1U << vector);
319  }
320  
321  void msi_set_mask(PCIDevice *dev, int vector, bool mask, Error **errp)
322  {
323      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
324      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
325      uint32_t irq_state, vector_mask, pending;
326  
327      if (vector >= PCI_MSI_VECTORS_MAX) {
328          error_setg(errp, "msi: vector %d not allocated. max vector is %d",
329                     vector, (PCI_MSI_VECTORS_MAX - 1));
330          return;
331      }
332  
333      vector_mask = (1U << vector);
334  
335      irq_state = pci_get_long(dev->config + msi_mask_off(dev, msi64bit));
336  
337      if (mask) {
338          irq_state |= vector_mask;
339      } else {
340          irq_state &= ~vector_mask;
341      }
342  
343      pci_set_long(dev->config + msi_mask_off(dev, msi64bit), irq_state);
344  
345      pending = pci_get_long(dev->config + msi_pending_off(dev, msi64bit));
346      if (!mask && (pending & vector_mask)) {
347          pending &= ~vector_mask;
348          pci_set_long(dev->config + msi_pending_off(dev, msi64bit), pending);
349          msi_notify(dev, vector);
350      }
351  }
352  
353  void msi_notify(PCIDevice *dev, unsigned int vector)
354  {
355      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
356      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
357      unsigned int nr_vectors = msi_nr_vectors(flags);
358      MSIMessage msg;
359  
360      assert(vector < nr_vectors);
361      if (msi_is_masked(dev, vector)) {
362          assert(flags & PCI_MSI_FLAGS_MASKBIT);
363          pci_long_test_and_set_mask(
364              dev->config + msi_pending_off(dev, msi64bit), 1U << vector);
365          MSI_DEV_PRINTF(dev, "pending vector 0x%x\n", vector);
366          return;
367      }
368  
369      msg = msi_get_message(dev, vector);
370  
371      MSI_DEV_PRINTF(dev,
372                     "notify vector 0x%x"
373                     " address: 0x%"PRIx64" data: 0x%"PRIx32"\n",
374                     vector, msg.address, msg.data);
375      msi_send_message(dev, msg);
376  }
377  
378  void msi_send_message(PCIDevice *dev, MSIMessage msg)
379  {
380      dev->msi_trigger(dev, msg);
381  }
382  
383  /* Normally called by pci_default_write_config(). */
384  void msi_write_config(PCIDevice *dev, uint32_t addr, uint32_t val, int len)
385  {
386      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
387      bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
388      bool msi_per_vector_mask = flags & PCI_MSI_FLAGS_MASKBIT;
389      unsigned int nr_vectors;
390      uint8_t log_num_vecs;
391      uint8_t log_max_vecs;
392      unsigned int vector;
393      uint32_t pending;
394  
395      if (!msi_present(dev) ||
396          !ranges_overlap(addr, len, dev->msi_cap, msi_cap_sizeof(flags))) {
397          return;
398      }
399  
400  #ifdef MSI_DEBUG
401      MSI_DEV_PRINTF(dev, "addr 0x%"PRIx32" val 0x%"PRIx32" len %d\n",
402                     addr, val, len);
403      MSI_DEV_PRINTF(dev, "ctrl: 0x%"PRIx16" address: 0x%"PRIx32,
404                     flags,
405                     pci_get_long(dev->config + msi_address_lo_off(dev)));
406      if (msi64bit) {
407          fprintf(stderr, " address-hi: 0x%"PRIx32,
408                  pci_get_long(dev->config + msi_address_hi_off(dev)));
409      }
410      fprintf(stderr, " data: 0x%"PRIx16,
411              pci_get_word(dev->config + msi_data_off(dev, msi64bit)));
412      if (flags & PCI_MSI_FLAGS_MASKBIT) {
413          fprintf(stderr, " mask 0x%"PRIx32" pending 0x%"PRIx32,
414                  pci_get_long(dev->config + msi_mask_off(dev, msi64bit)),
415                  pci_get_long(dev->config + msi_pending_off(dev, msi64bit)));
416      }
417      fprintf(stderr, "\n");
418  #endif
419  
420      if (xen_mode == XEN_EMULATE) {
421          for (vector = 0; vector < msi_nr_vectors(flags); vector++) {
422              MSIMessage msg = msi_prepare_message(dev, vector);
423  
424              xen_evtchn_snoop_msi(dev, false, vector, msg.address, msg.data,
425                                   msi_is_masked(dev, vector));
426          }
427      }
428  
429      if (!(flags & PCI_MSI_FLAGS_ENABLE)) {
430          return;
431      }
432  
433      /*
434       * Now MSI is enabled, clear INTx# interrupts.
435       * the driver is prohibited from writing enable bit to mask
436       * a service request. But the guest OS could do this.
437       * So we just discard the interrupts as moderate fallback.
438       *
439       * 6.8.3.3. Enabling Operation
440       *   While enabled for MSI or MSI-X operation, a function is prohibited
441       *   from using its INTx# pin (if implemented) to request
442       *   service (MSI, MSI-X, and INTx# are mutually exclusive).
443       */
444      pci_device_deassert_intx(dev);
445  
446      /*
447       * nr_vectors might be set bigger than capable. So clamp it.
448       * This is not legal by spec, so we can do anything we like,
449       * just don't crash the host
450       */
451      log_num_vecs =
452          (flags & PCI_MSI_FLAGS_QSIZE) >> ctz32(PCI_MSI_FLAGS_QSIZE);
453      log_max_vecs =
454          (flags & PCI_MSI_FLAGS_QMASK) >> ctz32(PCI_MSI_FLAGS_QMASK);
455      if (log_num_vecs > log_max_vecs) {
456          flags &= ~PCI_MSI_FLAGS_QSIZE;
457          flags |= log_max_vecs << ctz32(PCI_MSI_FLAGS_QSIZE);
458          pci_set_word(dev->config + msi_flags_off(dev), flags);
459      }
460  
461      if (!msi_per_vector_mask) {
462          /* if per vector masking isn't supported,
463             there is no pending interrupt. */
464          return;
465      }
466  
467      nr_vectors = msi_nr_vectors(flags);
468  
469      /* This will discard pending interrupts, if any. */
470      pending = pci_get_long(dev->config + msi_pending_off(dev, msi64bit));
471      pending &= 0xffffffff >> (PCI_MSI_VECTORS_MAX - nr_vectors);
472      pci_set_long(dev->config + msi_pending_off(dev, msi64bit), pending);
473  
474      /* deliver pending interrupts which are unmasked */
475      for (vector = 0; vector < nr_vectors; ++vector) {
476          if (msi_is_masked(dev, vector) || !(pending & (1U << vector))) {
477              continue;
478          }
479  
480          pci_long_test_and_clear_mask(
481              dev->config + msi_pending_off(dev, msi64bit), 1U << vector);
482          msi_notify(dev, vector);
483      }
484  }
485  
486  unsigned int msi_nr_vectors_allocated(const PCIDevice *dev)
487  {
488      uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
489      return msi_nr_vectors(flags);
490  }
491