On Sun, Jan 03, 2010 at 06:40:52PM +0100, Alexander Graf wrote:
> 
> On 03.01.2010, at 18:29, Michael S. Tsirkin wrote:
> 
> > On Sun, Jan 03, 2010 at 05:09:32PM +0100, Alexander Graf wrote:
> >> 
> >> On 03.01.2010, at 16:45, Michael S. Tsirkin wrote:
> >> 
> >>> On Sun, Jan 03, 2010 at 02:50:45AM +0100, Alexander Graf wrote:
> >>>> Different host buses may have different layouts for config space 
> >>>> accessors.
> >>>> 
> >>>> The Mac U3 for example uses the following define to access Type 0 
> >>>> (directly
> >>>> attached) devices:
> >>>> 
> >>>> #define MACRISC_CFA0(devfn, off)        \
> >>>>       ((1 << (unsigned int)PCI_SLOT(dev_fn)) \
> >>>>       | (((unsigned int)PCI_FUNC(dev_fn)) << 8) \
> >>>>       | (((unsigned int)(off)) & 0xFCUL))
> >>>> 
> >>>> Obviously, this is different from the encoding we interpret in qemu. In
> >>>> order to let host controllers take some influence there, we can just
> >>>> introduce a converter function that takes whatever accessor we have and
> >>>> makes a qemu understandable one out of it.
> >>>> 
> >>>> This patch is the groundwork for Uninorth PCI config space fixes.
> >>>> 
> >>>> Signed-off-by: Alexander Graf <ag...@suse.de>
> >>>> CC: Michael S. Tsirkin <m...@redhat.com>
> >>> 
> >>> Thanks!
> >>> 
> >>> It always bothered me that the code in pci_host uses x86 encoding and
> >>> other architectures are converted to x86.  As long as we are adding
> >>> redirection, maybe we should get rid of this, and make get_config_reg
> >>> return register and devfn separately, so we don't need to encode/decode
> >>> back and forth?
> >> 
> >> Hmm, when touching code I'm not 100% sure what I'm doing I usually try to 
> >> build on stuff that is there already. That's exactly what happened here.
> >> 
> >> I'm personally not against defining the x86 format as qemu default. That 
> >> way everyone knows what to deal with. I'm not sure if PCI defines anything 
> >> that couldn't be represented by the x86 encoding in 32 bits. I actually 
> >> doubt it. So it seems like a pretty good fit, especially given that all 
> >> the other code is already in place.
> >> 
> >>> OTOH if we are after a quick fix, won't it be simpler to have
> >>> unin_pci simply use its own routines instead of 
> >>> pci_host_conf_register_mmio
> >>> etc?
> >> 
> >> Hm, I figured this is less work :-).
> > 
> > Let me explain the idea: we have:
> > 
> >     static void pci_host_config_writel_ioport(void *opaque,
> >                                               uint32_t addr, uint32_t val)
> >     {
> >         PCIHostState *s = opaque;
> > 
> >         PCI_DPRINTF("%s addr %"PRIx32 " val %"PRIx32"\n", __func__, addr,
> >     val);
> >         s->config_reg = val;
> >     }
> > 
> >     static uint32_t pci_host_config_readl_ioport(void *opaque, uint32_t
> >     addr)
> >     {
> >         PCIHostState *s = opaque;
> >         uint32_t val = s->config_reg;
> > 
> >         PCI_DPRINTF("%s addr %"PRIx32" val %"PRIx32"\n", __func__, addr,
> >     val);
> >         return val;
> >     }
> > 
> >     void pci_host_conf_register_ioport(pio_addr_t ioport, PCIHostState *s)
> >     {
> >         register_ioport_write(ioport, 4, 4, pci_host_config_writel_ioport,
> >     s);
> >         register_ioport_read(ioport, 4, 4, pci_host_config_readl_ioport, s);
> >     }
> > 
> > If instead of a simple config_reg = val we translate to pc format
> > here, the rest will work. No?
> 
> Well, that'd mean I'd have to implement a config_reg read function and do the 
> conversion backwards again there. Or I could just save it off in the unin 
> state ... hmm ...

Right.

> Either way, let's better get this done right. I'd rather want to have a 
> proper framework in place in case someone else stumbles across something 
> similar.
> 
> Alex

There's already ugliness with swap/noswap versions in there.  Anything
that claims to be a proper framework would need to address that as well
IMO.

-- 
MST


Reply via email to