All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marcel Apfelbaum <marcel@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: kraxel@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org,
	agraf@suse.de, alex.williamson@redhat.com, kevin@koconnor.net,
	hare@suse.de, imammedo@redhat.com, amit.shah@redhat.com,
	pbonzini@redhat.com, leon.alrae@imgtec.com, aurelien@aurel32.net,
	rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH V6 for-2.3 13/26] hw/pci-host: introduce TYPE_PCI_HOST_BRIDGE_SNOOPED interface
Date: Tue, 28 Apr 2015 13:21:14 +0300	[thread overview]
Message-ID: <553F5F1A.9080804@redhat.com> (raw)
In-Reply-To: <20150428104029-mutt-send-email-mst@redhat.com>

On 04/28/2015 11:43 AM, Michael S. Tsirkin wrote:
> On Tue, Apr 28, 2015 at 11:39:42AM +0300, Marcel Apfelbaum wrote:
>> On 04/27/2015 05:45 PM, Michael S. Tsirkin wrote:
>>> On Mon, Apr 27, 2015 at 04:01:16PM +0300, Marcel Apfelbaum wrote:
>>>> On 04/27/2015 03:14 PM, Michael S. Tsirkin wrote:
>>>>> On Thu, Mar 19, 2015 at 08:52:48PM +0200, Marcel Apfelbaum wrote:
>>>>>> TYPE_PCI_HOST_BRIDGE_SNOOPED is a special case of host bridge
>>>>>> whose configuration registers are snooped by other host bridges
>>>>>> to complete their configuration cycles.
>>>>>>
>>>>>> The interface exposes a list of snooping host bridges that
>>>>>> shall be used by the hosts implementing this interface
>>>>>> in order to emulate a snooping mechanism.
>>>>>>
>>>>>> The way that the snooping hosts are registered or how
>>>>>> the snooping is implemented are out of the interface scope,
>>>>>> it only provides a way to determine if a host bridge has
>>>>>> snooping hosts and list them.
>>>>>
>>>>>
>>>>>
>>>>>> Signed-off-by: Marcel Apfelbaum <marcel@redhat.com>
>>>>>> ---
>>>>>>   hw/pci/pci_host.c         |  8 ++++++++
>>>>>>   include/hw/pci/pci_host.h | 24 ++++++++++++++++++++++++
>>>>>>   2 files changed, 32 insertions(+)
>>>>>>
>>>>>> diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c
>>>>>> index 87180c8..288e74c 100644
>>>>>> --- a/hw/pci/pci_host.c
>>>>>> +++ b/hw/pci/pci_host.c
>>>>>> @@ -180,6 +180,12 @@ static const TypeInfo pci_main_host_interface_info = {
>>>>>>       .parent        = TYPE_INTERFACE,
>>>>>>   };
>>>>>>
>>>>>> +static const TypeInfo pci_host_bridge_snooped_interface_info = {
>>>>>> +    .name = TYPE_PCI_HOST_BRIDGE_SNOOPED,
>>>>>> +    .parent = TYPE_INTERFACE,
>>>>>> +    .class_size = sizeof(PCIHostBridgeSnoopedClass),
>>>>>> +};
>>>>>> +
>>>>>>   static const TypeInfo pci_host_type_info = {
>>>>>>       .name = TYPE_PCI_HOST_BRIDGE,
>>>>>>       .parent = TYPE_SYS_BUS_DEVICE,
>>>>>> @@ -191,7 +197,9 @@ static const TypeInfo pci_host_type_info = {
>>>>>>   static void pci_host_register_types(void)
>>>>>>   {
>>>>>>       type_register_static(&pci_main_host_interface_info);
>>>>>> +    type_register_static(&pci_host_bridge_snooped_interface_info);
>>>>>>       type_register_static(&pci_host_type_info);
>>>>>> +
>>>>>
>>>>> extra empty line
>>>> Will take care of it, thanks.
>>>>
>>>>>
>>>>>>   }
>>>>>>
>>>>>>   type_init(pci_host_register_types)
>>>>>> diff --git a/include/hw/pci/pci_host.h b/include/hw/pci/pci_host.h
>>>>>> index 3c72e26..a041919 100644
>>>>>> --- a/include/hw/pci/pci_host.h
>>>>>> +++ b/include/hw/pci/pci_host.h
>>>>>> @@ -63,6 +63,30 @@ typedef struct PCIHostBridgeClass {
>>>>>>       const char *(*root_bus_path)(PCIHostState *, PCIBus *);
>>>>>>   } PCIHostBridgeClass;
>>>>>>
>>>>>> +/**
>>>>>> + * A special case of host bridge whose configuration registers
>>>>>> + * are snooped by other host bridges to complete their
>>>>>> + * configuration cycles.
>>>>>> + */
>>>>>> +#define TYPE_PCI_HOST_BRIDGE_SNOOPED "pci-host-bridge-snooped"
>>>>>> +#define TYPE_PCI_HOST_BRIDGE_SNOOPED_CLASS(klass) \
>>>>>> +     OBJECT_CLASS_CHECK(PCIHostBridgeSnoopedClass, (klass), \
>>>>>> +                        TYPE_PCI_HOST_BRIDGE_SNOOPED)
>>>>>> +#define PCI_HOST_BRIDGE_SNOOPED_GET_CLASS(obj) \
>>>>>> +     OBJECT_GET_CLASS(PCIHostBridgeSnoopedClass, (obj), \
>>>>>> +                      TYPE_PCI_HOST_BRIDGE_SNOOPED)
>>>>>> +#define PCI_HOST_BRIDGE_SNOOPED(obj) \
>>>>>> +     INTERFACE_CHECK(PCIHostState, (obj), \
>>>>>> +                     TYPE_PCI_HOST_BRIDGE_SNOOPED)
>>>>>> +
>>>>>> +typedef struct PCIHostBridgeSnoopedClass {
>>>>>> +    /* <private> */
>>>>>> +    InterfaceClass parent_class;
>>>>>> +
>>>>>> +    /* <public> */
>>>>>> +    GPtrArray *(*snooping_hosts)(PCIHostState *);
>>>>>
>>>>> Why not just add GPtrArray here directly, and add an API to
>>>>> register/deregister?
>>>> The interface concentrates on usage, letting the way to fill the snooping
>>>> hosts to the specific implementation.
>>>>
>>>> Thanks,
>>>> Marcel
>>>
>>> IMO this is overdoing abstractions.
>> It will provide us with enough elasticity when we'll try the same for Q35.
>> Also this interface is used in several places and it will serve us when we'll go for Q35.
>
> I don't see how it helps, we don't just stick a virtual function
> in front of all new code we write on the assumption it
> helps elasticity.
It helps by letting us querying the interface instead of asking:
Is this host-bridge PIIX ? look for child buses and see if there are roots
else: is this host-bridge ...

>
>>>
>>> But all this might be moot, it's probably better to just
>>> add everyone to the child bus list, and drop the
>>> concept of snooping config cycles.
>> Well, this will be a problem, since the whole concept of the PXB is to snoop
>> on the configuration cycles and this interface gives us a more easy
>> way to understand the implementation.
>>
>> We already discussed this approach and was accepted.
>> The code is small and concise and the use of QOM makes sense in my opinion.
>> I prefer not to re-open it now.
>>
>> Thanks,
>> Marcel
>
> I'm talking about the implementation here.
> We already scan the child bus list on config
> transactions. Why not add your entry there,
> then you can snoop to your heart's content.
Maybe I didn't fully understand what you want.
Do you want to add the new root buses as child buses of root bus 0?
This interface is not used in this context, is used in other scenarios:
[PATCH V6 for-2.3 21/26] hw/pci: inform bios if the system has extra pci root buses
[PATCH V6 for-2.3 15/26] hw/acpi: add support for i440fx 'snooping' root busses

I can look for other usages, can you tell me how it will look without this interface?

Other thing, in config we have pci_data_write calling (in the end) pci_find_bus_nr that does  not support
multiple root buses.
Changing it could affect a lot of functionality and also looking at the function it will not be pretty or clear.
Keeping it at host-bridge level (see  [PATCH V6 for-2.3 14/26] hw/pci-host/piix: implement TYPE_PCI_HOST_BRIDGE_SNOOPED interface)
and having piix query its pxbs for the extra root buses seems a good fit.


Thanks,
Marce
>
>
>
>>>
>>>
>>>>>
>>>>>> +} PCIHostBridgeSnoopedClass;
>>>>>> +
>>>>>>   /* common internal helpers for PCI/PCIe hosts, cut off overflows */
>>>>>>   void pci_host_config_write_common(PCIDevice *pci_dev, uint32_t addr,
>>>>>>                                     uint32_t limit, uint32_t val, uint32_t len);
>>>>>> --
>>>>>> 2.1.0

  reply	other threads:[~2015-04-28 10:21 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-19 18:52 [Qemu-devel] [PATCH V6 for-2.3 00/26] hw/pc: implement multiple primary busses for pc machines Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 01/26] acpi: add aml_or() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 02/26] acpi: add aml_add() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 03/26] acpi: add aml_lless() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 04/26] acpi: add aml_index() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 05/26] acpi: add aml_shiftleft() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 06/26] acpi: add aml_shiftright() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 07/26] acpi: add aml_increment() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 08/26] acpi: add aml_while() term Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 09/26] hw/pci: move pci bus related code to separate files Marcel Apfelbaum
2015-04-27 11:14   ` Michael S. Tsirkin
2015-04-27 11:35     ` Paolo Bonzini
2015-04-27 11:49       ` Marcel Apfelbaum
2015-04-27 12:24         ` Michael S. Tsirkin
2015-04-28  7:31       ` Markus Armbruster
2015-04-28  8:25         ` Marcel Apfelbaum
2015-04-27 12:26     ` Marcel Apfelbaum
2015-04-28  8:30       ` Michael S. Tsirkin
2015-04-28  8:30         ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 10/26] hw/pci: made pci_bus_is_root a PCIBusClass method Marcel Apfelbaum
2015-04-27 11:37   ` Michael S. Tsirkin
2015-04-27 11:49     ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 11/26] hw/pci: made pci_bus_num " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 12/26] hw/pci: introduce TYPE_PCI_MAIN_HOST_BRIDGE interface Marcel Apfelbaum
2015-04-27 11:24   ` Michael S. Tsirkin
2015-04-27 12:30     ` Marcel Apfelbaum
2015-04-27 12:48       ` Michael S. Tsirkin
2015-04-27 13:04         ` Marcel Apfelbaum
2015-04-27 20:54           ` Michael S. Tsirkin
2015-04-28  8:33             ` Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 13/26] hw/pci-host: introduce TYPE_PCI_HOST_BRIDGE_SNOOPED interface Marcel Apfelbaum
2015-04-27 12:14   ` Michael S. Tsirkin
2015-04-27 13:01     ` Marcel Apfelbaum
2015-04-27 14:45       ` Michael S. Tsirkin
2015-04-28  8:39         ` Marcel Apfelbaum
2015-04-28  8:43           ` Michael S. Tsirkin
2015-04-28 10:21             ` Marcel Apfelbaum [this message]
2015-04-28 10:44               ` Michael S. Tsirkin
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 14/26] hw/pci-host/piix: implement " Marcel Apfelbaum
2015-04-27 12:23   ` Michael S. Tsirkin
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 15/26] hw/acpi: add support for i440fx 'snooping' root busses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 16/26] hw/apci: add _PRT method for extra PCI " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 17/26] hw/acpi: add _CRS method for extra " Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 18/26] hw/acpi: remove from root bus 0 the crs resources used by other busses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 19/26] hw/pci: removed 'rootbus nr is 0' assumption from qmp_pci_query Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 20/26] hw/pci: introduce PCI Expander Bridge (PXB) Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 21/26] hw/pci: inform bios if the system has extra pci root buses Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 22/26] hw/pxb: add map_irq func Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 23/26] hw/pci_bus: add support for NUMA nodes Marcel Apfelbaum
2015-03-19 18:52 ` [Qemu-devel] [PATCH V6 for-2.3 24/26] hw/pxb: add numa_node parameter Marcel Apfelbaum
2015-03-19 18:53 ` [Qemu-devel] [PATCH V6 for-2.3 25/26] apci: fix PXB behaviour if used with unsupported BIOS Marcel Apfelbaum
2015-04-27 11:19   ` Michael S. Tsirkin
2015-04-27 11:51     ` Gerd Hoffmann
2015-03-19 18:53 ` [Qemu-devel] [PATCH V6 for-2.3 26/26] docs: Add PXB documentation Marcel Apfelbaum
2015-03-19 21:45 ` [Qemu-devel] [PATCH V6 for-2.3 00/26] hw/pc: implement multiple primary busses for pc machines Paolo Bonzini
2015-03-20  8:37   ` Marcel Apfelbaum
2015-03-20 17:56     ` Paolo Bonzini
2015-03-20 18:07       ` Peter Maydell
2015-03-20  7:44 ` Gerd Hoffmann
2015-03-20  8:25   ` Marcel Apfelbaum
2015-03-21 18:49 ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=553F5F1A.9080804@redhat.com \
    --to=marcel@redhat.com \
    --cc=agraf@suse.de \
    --cc=alex.williamson@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=aurelien@aurel32.net \
    --cc=hare@suse.de \
    --cc=imammedo@redhat.com \
    --cc=kevin@koconnor.net \
    --cc=kraxel@redhat.com \
    --cc=leon.alrae@imgtec.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.