qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Implementation of BusLogic SCSI host adapter (BT-958)


From: Denis Dmitriev
Subject: Re: [Qemu-devel] Implementation of BusLogic SCSI host adapter (BT-958)
Date: Thu, 1 Sep 2016 16:17:24 +0300

2016-09-01 14:11 GMT+03:00 Paolo Bonzini <address@hidden>:
>
>
>
> 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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]