From: Paolo Bonzini <pbonzini@redhat.com>
To: minyard@acm.org, "Andreas Färber" <afaerber@suse.de>,
"Michael S. Tsirkin" <mst@redhat.com>
Cc: Corey Minyard <cminyard@mvista.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 02/17] ipmi: Add a PC ISA type structure
Date: Sat, 16 May 2015 15:47:44 +0200 [thread overview]
Message-ID: <55574A80.4070802@redhat.com> (raw)
In-Reply-To: <5556A1EB.8020205@acm.org>
On 16/05/2015 03:48, Corey Minyard wrote:
> On 05/13/2015 09:52 AM, Paolo Bonzini wrote:
>>
>> On 11/05/2015 21:58, Corey Minyard wrote:
>>> I've debated this in my mind since I've been learning more about
>>> qemu. Some of the bmc properties are being passed in to the interface
>>> and passed on to the bmc. Plus some IPMI systems have multiple
>>> interfaces that point to the same bmc. It might be best to have the
>>> user create a bmc device then tie an interface device to it.
>>>
>>> If I do this, what is the acceptable way to look up another object
>>> this way? I hunted a bit and didn't come up with anything clean.
>> Yes, you're right indeed!!! I think you want something like
>>
>> -object ipmi-bmc-extern,id=bmc0,chardev=foo
>> -device isa-ipmi-kcs,bmc=bmc0
>>
>> vs.
>>
>> -object ipmi-bmc,id=bmc0
>> -device isa-ipmi-bt,bmc=bmc0
>>
>> ipmi-bmc would be a subclass of Object like the one that you have, but
>> it needs to implement the UserCreatable interface; see backends/rng.c
>> for an example.
>>
>> Then ipmi-isa-kcs would be your usual ISA device, so a subclass of
>> TYPE_ISA_DEVICE; however it would implement IPMIInterface, which would
>> be an interface rather than an abstract class. For an example of
>> interface boilerplate, see hw/core/hotplug.c. For an example of how to
>> implement the "bmc" property, see hw/mem/pc-dimm.c.
>>
>> Paolo
> I've been trying to piece this together, and the problem is that BT and
> KCS can sit on different kinds of busses, not just ISA. There are PCI
> and memory based implementations. I'd prefer to have one implementation
> for all, so I'm trying to figure out a way to piece all these things
> together.
>
> What I've come up with is the following class structure:
>
> IPMIBmc (abstract subclass of Device)
> Implements the base BMC handling
This is actually a subclass of Object that implements UserCreatable.
But that's a detail.
> IPMIBmcInternal (subclass of IPMIBmc)
> An internal BMC
>
> IPMIBmcExternal (subclass of IPMIBmc)
> A connection to an external BMC
These are good.
> BusDevice (subclass of Interface)
> An interface where a device can connect to a bus and do I/O and
> interrupts.
>
> BusDeviceISA (subclass of ISADevice, implements BusDevice)
> An ISA interface for BusDevice
See below...
> IPMIInterface (subclass of Interface)
> An Interface that connects between a BMC and a physical IPMI interface
> (BT, KCS, SMBus)
This is okay.
> IPMIDevice (abstract subclass of Device, implements IPMIInterface)
> The base class for the various IPMI devices. This code finds the IPMIBmc
> and the BusDevice objects and plugs them in to the subclasses of this
> class.
>
> IPMIDevKCS (subclass of IPMIDevice)
> KCS interface
>
> IPMIDevBT (subclass of IPMIDevice)
> BT interface
For now I would just make IPMIDevKCS and IPMIDevBT two ISADevice
subclasses. Any code reuse between them can be placed in the
implementation of IPMIInterface: interface methods need not be abstract,
they can have a default implementation.
Regarding BusDevice, if a PCI interface is added in the future we can
use C composition (structs :)) to group the common KCS and BT code.
There's no need for an explicit class hierarchy; for an example see the
AHCI and EHCI devices.
The SMBus interface can be added already (through a subclass of I2CSlave
that implements IPMIInterface.
> So on the command line, you would say:
>
> -device isadev,irq=5,id=ipmiisadev,addr=0xca2 -device
> ipmi-bmc-internal,id=bmc1
> -device ipmi-kcs,bmc=bmc1,busdev=ipmiisadev
In my proposal this would be
-object ipmi-bmc-internal,id=bmc1
-device isa-ipmi-kcs,bmc=bmc1,irq=5,iobase=0xca2
(the irq and iobase can be given suitable defaults of course; iobase is
a more standard name for ISA I/O ports).
> This seems rather complicated, but it seem like the only way to break
> this up.
If you want a pure QOM solution it is. But we can use plain struct
composition too, in order to keep the implementation simple. The same
is done in the kernel, which uses structs or kobjects depending on the
use case.
> And I don't know if object_property_add_link() works on interfaces
Yes, it does.
> Does this sound plausible?
It did---does what I wrote also sound plausible? :)
Paolo
next prev parent reply other threads:[~2015-05-16 13:47 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-23 22:57 [Qemu-devel] [PATCH 00/17] Update to adding an IPMI device to qemu minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 01/17] Add a base IPMI interface minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 02/17] ipmi: Add a PC ISA type structure minyard
2015-04-26 8:58 ` Michael S. Tsirkin
2015-04-26 9:07 ` Michael S. Tsirkin
2015-05-08 21:16 ` Corey Minyard
2015-05-11 14:21 ` Paolo Bonzini
2015-05-11 17:26 ` Andreas Färber
2015-05-11 19:42 ` Paolo Bonzini
2015-05-11 19:58 ` Corey Minyard
2015-05-13 14:52 ` Paolo Bonzini
2015-05-16 1:48 ` Corey Minyard
2015-05-16 13:47 ` Paolo Bonzini [this message]
2015-04-26 9:05 ` Michael S. Tsirkin
2015-04-26 17:03 ` Paolo Bonzini
2015-05-08 20:59 ` Corey Minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 03/17] ipmi: Add a KCS low-level interface minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 04/17] ipmi: Add a BT " minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 05/17] ipmi: Add a local BMC simulation minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 06/17] ipmi: Add an external connection simulation interface minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 07/17] ipmi: Add tests minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 08/17] ipmi: Add documentation minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 09/17] ipmi: Add migration capability to the IPMI device minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 10/17] ipmi: Add a firmware configuration repository minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 12/17] smbios: Add a function to directly add an entry minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 13/17] pc: Postpone SMBIOS table installation to post machine init minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 14/17] ipmi: Add SMBIOS table entry minyard
2015-04-26 8:36 ` Michael S. Tsirkin
2015-04-23 22:57 ` [Qemu-devel] [PATCH 15/17] acpi: Add a way for devices to add ACPI tables minyard
2015-04-23 22:57 ` [Qemu-devel] [PATCH 16/17] ipmi: Add ACPI table entries minyard
2015-04-26 8:36 ` Michael S. Tsirkin
2015-04-23 22:57 ` [Qemu-devel] [PATCH 17/17] bios: Add tests for the IPMI ACPI and SMBIOS entries minyard
2015-04-23 23:11 ` [Qemu-devel] [PATCH 00/17] Update to adding an IPMI device to qemu Eric Blake
2015-04-26 11:39 ` Andreas Färber
2015-04-26 16:52 ` Paolo Bonzini
2015-04-27 13:19 ` Corey Minyard
2015-04-24 9:38 ` Paolo Bonzini
2015-04-24 13:07 ` Corey Minyard
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=55574A80.4070802@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=cminyard@mvista.com \
--cc=minyard@acm.org \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).