On 29/3/25 12:30, Rakesh J wrote:
Thanks for feedback on [PATCH v1]!

I've posted v2 incorporating the suggestions:ve posted v2 incorporating your suggestions

 Paolo: You pointed out the size issue with .min_access_size = 1 and .max_access_size = 4, where bswap32 was wrong for 2-byte accesses. I’ve fixed this with size-appropriate swaps (bswap16 for 2-byte, bswap32 for 4-byte). On the extra swap idea, I stuck with a single swap since it aligns PCI LE with guest BE expectations without overcomplicating it—let me know if I misunderstood.

  I’ve sent [PATCH v2] incorporating changes:
1.Removed gt64120_update_pci_cfgdata_mapping() and moved initialization code
   to gt64120_realize() for a simpler MByteSwap check.
2.Removed unused pci_host_data_be_ops and a misleading comment in dino.h

3.Size-specific swaps (bswap16 and bswap32)
 I included bswap16 for 2-byte accesses in v2—should this be restricted to 4-byte only (bswap32) per the spec, or does GT-64120 expect 2-byte config swaps too? It’s a minor tweak, so I left it in v2 for now—happy to adjust in a v3 if needed.

The new patch is available at:
https://mail.gnu.org/archive/html/qemu-devel/2025-03/msg06884.html <https://mail.gnu.org/archive/html/qemu-devel/2025-03/msg06884.html>  Could you take a look at [PATCH v2] and let me know your thoughts, especially on the 2-byte swap question? Thanks!

On Sat, Mar 29, 2025 at 4:05 PM Philippe Mathieu-Daudé <phi...@linaro.org <mailto:phi...@linaro.org>> wrote:

    On 28/3/25 18:34, Paolo Bonzini wrote:
     > On Fri, Mar 28, 2025 at 3:16 PM BALATON Zoltan
    <bala...@eik.bme.hu <mailto:bala...@eik.bme.hu>> wrote:
     >>> It should be fine.  You should take into account:
     >>>
     >>> - the endianness produced by pci_data_read/pci_data_write
    (always little
     >>> endian)
     >>>
     >>> - the endianness expected by the guest (big endian under the
    conditions in
     >>> the patch)
     >>>
     >>> - the endianness expected by memory.c (always little endian, as
    specified in
     >>> gt64120_pci_data_ops)
     >>>
     >>> Because there is either zero or one mismatch, bswap32 is fine.
     >>
     >> This may worth a comment but I'm still not convinced this works
    on big
     >> endian host because I think pci_data_read returns val in host
    endianness
     >> and if you want big endian then you only need to bswap on LE
    host not on
     >> BE host. Was this tested on BE host and confirmed it works?
     >
     > Looking again at the code, there is definitely one problem: since
    you have
     >
     > +        .min_access_size = 1,
     > +        .max_access_size = 4,
     >
     > the bswap can also be bswap16 if size == 2 (and bswap32 only if
    size == 4).

    Per 'PCI LOCAL BUS SPECIFICATION, REV. 3.0':

    '''
    3.2.2.3.2. Software Generation of Configuration Transactions

    Anytime a host bridge sees a full DWORD I/O write from the host
    to CONFIG_ADDRESS, the bridge must latch the data into its
    CONFIG_ADDRESS register. On full DWORD I/O reads to CONFIG_ADDRESS,
    the bridge must return the data in CONFIG_ADDRESS. Any other types
    of accesses to this address (non-DWORD) have no effect on
    CONFIG_ADDRESS
    and are executed as normal I/O transactions on the PCI bus. Therefore,
    the only I/O Space consumed by this register is a DWORD at the given
    address. I/O devices that share the same address but use BYTE or WORD
    registers are not affected because their transactions will pass through
    the host bridge unchanged.
    '''

    IIUC we don't need the bswap16.

What I'm questioning is why we need .min_access_size = 1
and not .min_access_size = 4.

Reply via email to