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,
|
.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 --- */
|
/* --- public helpers --- */
|
||||||
|
|
||||||
static Property *qdev_prop_walk(Property *props, const char *name)
|
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_hex64;
|
||||||
extern PropertyInfo qdev_prop_ptr;
|
extern PropertyInfo qdev_prop_ptr;
|
||||||
extern PropertyInfo qdev_prop_macaddr;
|
extern PropertyInfo qdev_prop_macaddr;
|
||||||
|
extern PropertyInfo qdev_prop_pci_devfn;
|
||||||
|
|
||||||
/* Set properties between creation and init. */
|
/* Set properties between creation and init. */
|
||||||
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
|
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
|
||||||
|
Loading…
Reference in New Issue
Block a user