OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [virtio-comment] comment on pci section


"Michael S. Tsirkin" <mst@redhat.com> writes:
> On Fri, Jan 31, 2014 at 01:10:30PM +1030, Rusty Russell wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> > On Thu, Jan 30, 2014 at 10:11:14AM +1030, Rusty Russell wrote:
>> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> > On Wed, Jan 29, 2014 at 04:38:58PM +1030, Rusty Russell wrote:
>> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> >> > Two comments received from a co-worker:
>> >> >> >
>> >> >> > 3.1 "The device MUST NOT consume buffers before DRIVER_OK ..." - I
>> >> >> > personally
>> >> >> > would like to see also something like:  "device must not generate
>> >> >> > interrupts if
>> >> >> > DRIVER_OK is not set” to better handle power management transitions.
>> >> >> 
>> >> >> That addition seems to make sense, but I don't understand the reference
>> >> >> to power management transitions?
>> >> >
>> >> > Well - ATM we do things like suspend by device reset and re-initialization,
>> >> > right? I'm guessing during e.g. resume it's important not to get
>> >> > interrupts too early. I'll check.
>> >> >
>> >> > Hmm actually we have a chapter about initialization but not cleanup.
>> >> > Might be a good addition.
>> >> 
>> >> Maybe, but it would only need to say to reset the device and you can
>> >> remove buffers safely.
>> >> 
>> >> Looking at the current Linux block driver, it drives the device before
>> >> setting DRIVER_OK (add_disk will do this to scan partitions).  Should we
>> >> make the rule that we can driver the device after FEATURES_OK instead?
>> >> In which case, perhaps we should just combine DRIVER_OK and FEATURES_OK
>> >> into one bit.
>> >
>> > Hmm we discussed this already.
>> > There are two distinct points:
>> >
>> > 1. driver has finalized device features (FEATURES_OK)
>> >
>> > after this point we start configuring the device:
>> > VQ setup etc
>> >
>> > 2. driver adds buffers, device consumes them (DRIVER_OK)
>> 
>> Yes, I think I agree.  On a similar note, we should make it clear that
>> device-specific configuration fields *can* be read before FEATURES_OK.
>> ie. if a device has a configuration field 'foo' which is only present if
>> FEATURE_FOO, and it offers FEATURE_FOO, the driver can read 'foo'
>> before deciding whether to accept FEATURE_FOO.
>> 
>> >> > Also, I note that QEMU implemented master abort bit by
>> >> > clearing DRIVER_OK - AFAIK useful to stop device in a
>> >> > standard way if driver malfunctions.
>> >> >
>> >> > Also with QEMU you can clear DRIVER_OK and this stops the device. I
>> >> > wonder if someone uses this.
>> >> 
>> >> The host should not change status bits, they should use a different
>> >> field.  This isn't explicitly stated in the spec, but it's a bit weird.
>> >
>> > Well - device already clears FEATURES_OK on configuration failure.
>> > It seems reasonable to clear DRIVER_OK to internal device failure, no?
>> 
>> The device refuses to accept the FEATURES_OK write, which is subtly
>> different from clearing the bit IMHO.
>> 
>> The status bits are for the driver to advertise its status, not the
>> device.
>
>
> I'd like to explain.
> What we are trying to implement is PCI bus master bit.
> Rules:
> - It must be set before DRIVER_OK.
> - If it set/cleared any number of time before DRIVER_OK, device will be
>   livea after DRIVER_OK
> - If it is cleared when driver sets DRIVER_OK, or if
>   it is cleared after driver sets DRIVER_OK, device stops
>   being live, you must reset to make it live again

I'm not sure what the semantics of the PCI bus master bit are on normal
devices.  I assume if you turn it off, the device stops working?  Why
would we insist on a reset to set it again?

Should we leave this interaction as undefined?

>> BTW, the struct virtio_pci_cfg_cap seems weird: why do you trigger on
>> offset read/write, rather than triggering on the actual pci_cfg_data?
>> Or am I misreading the spec?
>> 
>> Thanks,
>> Rusty.
>
> This is not what was intended.
> I see what gives you this impression:
>
> After this field is written by driver, the first length bytes in
> pci_cfg_data are written at the selected offset
> in the selected BAR.
> When this field is read by driver, length bytes at the selected offset
> in the selected BAR are read into
> pci_cfg_data.
>
> "this" should be replaced by pci_cfg_data.

Much better, it's just a simple window.

How's this?

==To access a device region, the driver writes into the capability
structure (ie. within the PCI configuration space) as follows:

\begin{itemize}
\item The driver sets the BAR to access by writing to the cap.bar field.

\item The driver sets the size of the access by writing 1, 2 or 4 to
  the cap.length field.

\item The driver sets the offset within the BAR by writing to the
  cap.offset field.  The driver MUST NOT write an offset which is not
  a multiple of cap.length (ie. all accesses must be aligned).
\end{itemsize}

At that point, the pci_cfg_data field will provide a window of size
cap.length into the given cap.bar at offset cap.offset: writes will
have the same effect as writes into the BAR, and reads will have the
same effect as reads.

The driver MUST perform reads/writes from/to pci_cfg_data of the same
width as given by cap.length.
==
(I assumed the last requirement).

Thanks,
Rusty.



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]