2016-09-01 14:11 GMT+03:00 Paolo Bonzini <pbonz...@redhat.com>: > > > > On 31/08/2016 15:48, Денис Дмитриев wrote: > > uint64_t buslogicReadOutgoingMailbox(BuslogicState *s, BUSLOGICTASKSTATE > > *TaskState) > > { > > uint64_t GCMailbox; > > Mailbox24 Mbx24; > > Mbx24.uCmdState = 0; > > PCIDevice *pci_dev = PCI_DEVICE(s); > > if (s->fMbxIs24Bit) > > { > > //try to calculate mailbox address > > GCMailbox = s->GCPhysAddrMailboxOutgoingBase + > > (s->uMailboxOutgoingPositionCurrent * sizeof(Mailbox24)); > > //try to read mailbox > > pci_dma_read(pci_dev, GCMailbox, &Mbx24, sizeof(Mailbox24)); > > //after that i have empty buffer > > TaskState->MailboxGuest.u32PhysAddrCCB = > > ADDR_TO_U32(Mbx24.aPhysAddrCCB); > > TaskState->MailboxGuest.u.out.uActionCode = Mbx24.uCmdState; > > } > > else > > { > > GCMailbox = s->GCPhysAddrMailboxOutgoingBase + > > (s->uMailboxOutgoingPositionCurrent * sizeof(Mailbox32)); > > pci_dma_read(pci_dev, GCMailbox, &TaskState->MailboxGuest, > > sizeof(Mailbox32)); > > } > > return GCMailbox; > > } > > This seems okay, so I am afraid you'll have to debug it. :(
I think that I am missing some initialization or something like that. To work with the registers I create a memory region, and associate it with the read and write handlers (as an example I used lsi53c895a.c). Maybe work with memory in which mailboxes are located must be built the same way? To me, it looks like I'm trying to get the data to the right place but I do not see them because there is something wrong with the mapping. The basis of the initialization function I took from lsi53c895a.c. Perhaps the root of evil in those lines, I commented out? If so, how can I understand what parameters should be passed in memory_region_init_io pci_register_bar and functions? void buslogic_scsi_realize(PCIDevice *dev, Error **errp) { BuslogicState *s = BUSLOGIC_BT958(dev); DeviceState *d = DEVICE(dev); uint8_t *pci_conf; pci_conf = dev->config; /* PCI latency timer = 255 */ pci_conf[PCI_LATENCY_TIMER] = 0xff; /* Interrupt pin A */ pci_conf[PCI_INTERRUPT_PIN] = 0x01; memory_region_init_io(&s->port_io, OBJECT(s), &bl_port_ops, s, "BusLogic", 0x4); // memory_region_init_io(&s->ram_io, OBJECT(s), &bl_ram_ops, s, // "BusLogic-ram", 0x2000); // memory_region_init_io(&s->io_io, OBJECT(s), &bl_io_ops, s, // "BusLogic-io", 256); pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->port_io); // pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_io); // pci_register_bar(dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->ram_io); QTAILQ_INIT(&s->queue); scsi_bus_new(&s->bus, sizeof(s->bus), d, &bl_scsi_info, NULL); if (!d->hotplugged) { scsi_bus_legacy_handle_cmdline(&s->bus, errp); } } -- Sincerely, Denis Dmitriev.