提交 cdd85eb2 编写于 作者: Y Yi Min Zhao 提交者: Cornelia Huck

s390x/pci: replace fid with idx in msg data of msix

Present code uses fid as the part of message data of msix for looking
up the specific zpci device. However it limits the usable range of fid,
and the code looking up the zpci device may fail due to truncation of
the fid.

In addition, fh is composed of enabled bit, FH_VIRT and the array index.
So we can use the array index as the identifier to store in msg data.
Signed-off-by: NYi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: NPierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: NCornelia Huck <cornelia.huck@de.ibm.com>
上级 0a608a6e
...@@ -474,18 +474,18 @@ static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data, ...@@ -474,18 +474,18 @@ static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data,
{ {
S390PCIBusDevice *pbdev; S390PCIBusDevice *pbdev;
uint32_t io_int_word; uint32_t io_int_word;
uint32_t fid = data >> ZPCI_MSI_VEC_BITS; uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
uint32_t vec = data & ZPCI_MSI_VEC_MASK; uint32_t vec = data & ZPCI_MSI_VEC_MASK;
uint64_t ind_bit; uint64_t ind_bit;
uint32_t sum_bit; uint32_t sum_bit;
uint32_t e = 0; uint32_t e = 0;
DPRINTF("write_msix data 0x%" PRIx64 " fid %d vec 0x%x\n", data, fid, vec); DPRINTF("write_msix data 0x%" PRIx64 " idx %d vec 0x%x\n", data, idx, vec);
pbdev = s390_pci_find_dev_by_fid(fid); pbdev = s390_pci_find_dev_by_idx(idx);
if (!pbdev) { if (!pbdev) {
e |= (vec << ERR_EVENT_MVN_OFFSET); e |= (vec << ERR_EVENT_MVN_OFFSET);
s390_pci_generate_error_event(ERR_EVENT_NOMSI, 0, fid, addr, e); s390_pci_generate_error_event(ERR_EVENT_NOMSI, idx, 0, addr, e);
return; return;
} }
......
...@@ -419,7 +419,8 @@ static void update_msix_table_msg_data(S390PCIBusDevice *pbdev, uint64_t offset, ...@@ -419,7 +419,8 @@ static void update_msix_table_msg_data(S390PCIBusDevice *pbdev, uint64_t offset,
msg_data = (uint8_t *)data - offset % PCI_MSIX_ENTRY_SIZE + msg_data = (uint8_t *)data - offset % PCI_MSIX_ENTRY_SIZE +
PCI_MSIX_ENTRY_VECTOR_CTRL; PCI_MSIX_ENTRY_VECTOR_CTRL;
val = pci_get_long(msg_data) | (pbdev->fid << ZPCI_MSI_VEC_BITS); val = pci_get_long(msg_data) |
((pbdev->fh & FH_MASK_INDEX) << ZPCI_MSI_VEC_BITS);
pci_set_long(msg_data, val); pci_set_long(msg_data, val);
DPRINTF("update msix msg_data to 0x%" PRIx64 "\n", *data); DPRINTF("update msix msg_data to 0x%" PRIx64 "\n", *data);
} }
......
...@@ -2246,10 +2246,10 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, ...@@ -2246,10 +2246,10 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
uint64_t address, uint32_t data, PCIDevice *dev) uint64_t address, uint32_t data, PCIDevice *dev)
{ {
S390PCIBusDevice *pbdev; S390PCIBusDevice *pbdev;
uint32_t fid = data >> ZPCI_MSI_VEC_BITS; uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
uint32_t vec = data & ZPCI_MSI_VEC_MASK; uint32_t vec = data & ZPCI_MSI_VEC_MASK;
pbdev = s390_pci_find_dev_by_fid(fid); pbdev = s390_pci_find_dev_by_idx(idx);
if (!pbdev) { if (!pbdev) {
DPRINTF("add_msi_route no dev\n"); DPRINTF("add_msi_route no dev\n");
return -ENODEV; return -ENODEV;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册