[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Name the default PCI bus "pci.0" on all archite
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH] Name the default PCI bus "pci.0" on all architectures |
Date: |
Fri, 11 Jun 2010 15:00:46 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
Paul Brook <address@hidden> writes:
>> Paul Brook <address@hidden> writes:
>> >> The system emulators for each arch are using inconsistent
>> >> naming for the default PCI bus "pci" vs "pci.0". Since it
>> >> is conceivable we'll have multiple PCI buses in the future
>> >> standardize on "pci.0" for all architectures. This ensures
>> >> mgmt apps can rely on a name when assigning PCI devices an
>> >> address on the bus using eg '-device e1000,bus=pci.0,addr=3'
>> >
>> > No. Bus names are local to the parent device. None of the host bridges
>> > support multiple bridges, so the ".0" suffix makes no sense. The parent
>> > device has no idea whether it owns the "default" pci bus or not.
>> > If you have multiple PCI busses then you can identify them by the device
>> > path.
>>
>> From qbus_create_inplace():
>>
>> if (name) {
>> /* use supplied name */
>> bus->name = qemu_strdup(name);
>> } else if (parent && parent->id) {
>> /* parent device has id -> use it for bus name */
>> len = strlen(parent->id) + 16;
>> buf = qemu_malloc(len);
>> snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
>> bus->name = buf;
>> } else {
>> /* no id -> use lowercase bus type for bus name */
>> len = strlen(info->name) + 16;
>> buf = qemu_malloc(len);
>> len = snprintf(buf, len, "%s.%d", info->name,
>> parent ? parent->num_child_bus : 0);
>> for (i = 0; i < len; i++)
>> buf[i] = qemu_tolower(buf[i]);
>> bus->name = buf;
>> }
>>
>> If appending ".0" really makes no sense when the device has just one
>> bus, then we shouldn't append it in cases 2 & 3.
>
> IMO the code you quote is completely bogus. All devices should specify names
> for their child busses, failure to do so is a bug.
>
> These bus names are local to the parent device. Trying to use them as global
> identifiers is just plain wrong. A given device [type] should always have
> the
> same set of properties/child busses regardless of where it occurs in the
> device tree.
I agree.
Case in point: For a bug fix I'm working on, I need to find the drives
connected to an IDE controller. Should be easy enough: go from
controller qdev to its qbus, iterate over the qdevs on that bus. I need
to call qdev_get_child_bus() for the first step, obviously. But what to
pass as name argument? -EMAGIC.
Note that I *only* object to case 2 (derive bus name from parent
device's ID). Case 3 (derive bus name from bus type) is fine with me.
> Using a single counter for all busses is also wrong. The order of bus
> creation
> is a device implementation detail, under no circumstances should it be part
> of
> the user visible API. Consider a device that has both a PCI and I2C bus. It
> makes no sense to call there pci.0 and i2c.1.
Yes, that's a bit ugly.