qdev/prop: add pci devfn property
So we can parse "$slot.$fn" strings into devfn numbers. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
9574758134
commit
05cb5fe442
@ -198,6 +198,49 @@ PropertyInfo qdev_prop_macaddr = {
|
||||
.print = print_mac,
|
||||
};
|
||||
|
||||
/* --- pci address --- */
|
||||
|
||||
/*
|
||||
* bus-local address, i.e. "$slot" or "$slot.$fn"
|
||||
*/
|
||||
static int parse_pci_devfn(DeviceState *dev, Property *prop, const char *str)
|
||||
{
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
unsigned int slot, fn, n;
|
||||
|
||||
if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
|
||||
fn = 0;
|
||||
if (sscanf(str, "%x%n", &slot, &n) != 1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (str[n] != '\0')
|
||||
return -1;
|
||||
if (fn > 7)
|
||||
return -1;
|
||||
*ptr = slot << 3 | fn;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
{
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
|
||||
if (-1 == *ptr) {
|
||||
return snprintf(dest, len, "<unset>");
|
||||
} else {
|
||||
return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
|
||||
}
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_pci_devfn = {
|
||||
.name = "pci-devfn",
|
||||
.type = PROP_TYPE_UINT32,
|
||||
.size = sizeof(uint32_t),
|
||||
.parse = parse_pci_devfn,
|
||||
.print = print_pci_devfn,
|
||||
};
|
||||
|
||||
/* --- public helpers --- */
|
||||
|
||||
static Property *qdev_prop_walk(Property *props, const char *name)
|
||||
|
@ -151,6 +151,7 @@ extern PropertyInfo qdev_prop_hex32;
|
||||
extern PropertyInfo qdev_prop_hex64;
|
||||
extern PropertyInfo qdev_prop_ptr;
|
||||
extern PropertyInfo qdev_prop_macaddr;
|
||||
extern PropertyInfo qdev_prop_pci_devfn;
|
||||
|
||||
/* Set properties between creation and init. */
|
||||
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
|
||||
|
Loading…
Reference in New Issue
Block a user