Ping!

Id really appreciate some input on this issue (rather than going ahead
and doing it to discover that someone disagrees with the approach).

Regards,
Peter

On Mon, Jun 18, 2012 at 3:13 PM, Peter Crosthwaite
<peter.crosthwa...@petalogix.com> wrote:
> HI All,
>
> Have another one of these long RFCs for you all RE some QOM
> refactoring. This time around SSI/SPI and supporting multiple devices
> connected to one chip select.
>
> I have a pending series that is in Limbo, mainly this patch is problematic:
>
> http://lists.gnu.org/archive/html/qemu-devel/2012-06/msg00227.html
>
> Im trying to get some nice clean multi-device SPI device support going
> to match the Xilinx XPI controller, but other machine models (mainly
> stellaris) have a more ah-hoc approach to SSI around point-to-point
> links.
>
> Lets start this again by describing the real hardware. We have two
> machines to discuss this time, Stellaris, and Xilinx. I have attached
> an image that sums up the Stellaris architecture
> (stellaris_real_hw.jpg), Paul correct me if this is inaccurate. For
> those who like words instead, it can be summed up as:
>
> - Two SSI devices (OLED + SD) attached to single controller, PL022
> - Tx and Rx lines shared between both devices
> - One chip select (CS) line (for OLED) comes from the PL022
> - The other CS (for SD) comes from a GPIO
>
> Problem is, no SSI device in QEMU emulates CS behaviour, so there is
> this virtual mux device in the stellaris machine model that emulates
> the CS behaviour of each device (stellaris_emulated.jpg). I have
> attached an image that sums it up. For those who prefer code (from
> hw/stellaris.c):
>
> typedef struct {
>    SSISlave ssidev;
>    qemu_irq irq;
>    int current_dev;
>    SSIBus *bus[2];
> } stellaris_ssi_bus_state;
>
> static void stellaris_ssi_bus_select(void *opaque, int irq, int level)
> {
>    stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
>
>    s->current_dev = level;
> }
>
> static uint32_t stellaris_ssi_bus_transfer(SSISlave *dev, uint32_t val)
> {
>    stellaris_ssi_bus_state *s = FROM_SSI_SLAVE(stellaris_ssi_bus_state, dev);
>
>    return ssi_transfer(s->bus[s->current_dev], val);
> }
>
> static const VMStateDescription vmstate_stellaris_ssi_bus = {
>    .name = "stellaris_ssi_bus",
>    .version_id = 1,
> ...
> };
>
> The thing is, there is no actual hardware for this mux. its just three
> copper traces on a board.
>
> Moving onto Xilinx, the real hardware is summed up in the attached
> image (xilinx_real_hw.jpg). For those that prefer words:
>
> - N SSI devices attached to a single controller, xps_spi
> - Tx and Rx lines shared between all devices
> - N chip selects come from the xps_spi controller for the N devices
>
> So, here are the issues:
>
> A: We need to emulate CS behavior (without machine models having to
> create these strange glue devices).
> B: We need to emulate multiple devices attached to one SPI controller
> (again without glue devices).
>
> Heres the proposal:
>
> -SSI bus is changed to multiple device. You can attach as many devices
> as you want to a single SSI bus. When the master initiates a transfer,
> all devices have their transfer() function called. The results are
> logically or'ed together from each device (youll see how this works
> out if you keep reading). There is no CS behaviour emulated in the bus
> itself (which is contrary to my patch - its my new proposal).
>
> -SSI_Slave becomes an abstract device. which defines an abstract
> function do_transfer(). The SSI Slave devices we have today inherirt
> from this and the existing transfer() function for each SPI device
> becomes this do_transfer function. The abstract class (SSISlave)
> defines a single GPIO input for the CS line. The transfer() function
> (which is called by the bus or controller) is implemented on the
> SSISlave abstract layer, and will call and return do_transfer() if the
> CS GPIO is set, otherwise is returns 0. The big advantage is there is
> no or only trivial changes to the existing SSI devices. This all
> happens at the abstract layer and a little bit of machine model
> improvement - i.e. this means steallaris' virtual Mux will go away
> completly (as the CS GPIOs are attached directly to the SSISlave
> device).
>
> My Xilinx spi controller will have N GPIO outs that just connect to
> the N SPI devices on the machine model layer.
>
> So here are the nitty-gritty details around the pending QOM stuff:
>
> Anthony is currently overhauling QBus, and im guessing the SSI bus is
> part of that? qom-next stable enough in this area to look at or not?
> Also Anthony mentioned recently some GPIO refactoring stuff - Are
> GPIOs on multiple levels of abstraction supported yet? IE if I have a
> SPI GPIO device, I need a GPIO on the SSISlave layer but also GPIOs on
> my (concrete) device layer. I know this currently doesnt work cos of
> qdev but thats going away right?
>
> Regards,
> Peter

Reply via email to