pci: make pci_parse_devfn() aware of func.
make pci_parse_devfn() aware of func. With func = NULL it behave as before. This will be used later. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5beb8ad503
commit
43c945f16a
34
hw/pci.c
34
hw/pci.c
|
@ -424,15 +424,18 @@ static void pci_set_default_subsystem_id(PCIDevice *pci_dev)
|
|||
}
|
||||
|
||||
/*
|
||||
* Parse [[<domain>:]<bus>:]<slot>, return -1 on error
|
||||
* Parse [[<domain>:]<bus>:]<slot>, return -1 on error if funcp == NULL
|
||||
* [[<domain>:]<bus>:]<slot>.<func>, return -1 on error
|
||||
*/
|
||||
static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
|
||||
int pci_parse_devaddr(const char *addr, int *domp, int *busp,
|
||||
unsigned int *slotp, unsigned int *funcp)
|
||||
{
|
||||
const char *p;
|
||||
char *e;
|
||||
unsigned long val;
|
||||
unsigned long dom = 0, bus = 0;
|
||||
unsigned slot = 0;
|
||||
unsigned int slot = 0;
|
||||
unsigned int func = 0;
|
||||
|
||||
p = addr;
|
||||
val = strtoul(p, &e, 16);
|
||||
|
@ -454,11 +457,24 @@ static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *s
|
|||
}
|
||||
}
|
||||
|
||||
if (dom > 0xffff || bus > 0xff || val > 0x1f)
|
||||
return -1;
|
||||
|
||||
slot = val;
|
||||
|
||||
if (funcp != NULL) {
|
||||
if (*e != '.')
|
||||
return -1;
|
||||
|
||||
p = e + 1;
|
||||
val = strtoul(p, &e, 16);
|
||||
if (e == p)
|
||||
return -1;
|
||||
|
||||
func = val;
|
||||
}
|
||||
|
||||
/* if funcp == NULL func is 0 */
|
||||
if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7)
|
||||
return -1;
|
||||
|
||||
if (*e)
|
||||
return -1;
|
||||
|
||||
|
@ -469,6 +485,8 @@ static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *s
|
|||
*domp = dom;
|
||||
*busp = bus;
|
||||
*slotp = slot;
|
||||
if (funcp != NULL)
|
||||
*funcp = func;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -479,7 +497,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
|
|||
if (!strncmp(addr, "pci_addr=", 9)) {
|
||||
addr += 9;
|
||||
}
|
||||
if (pci_parse_devaddr(addr, domp, busp, slotp)) {
|
||||
if (pci_parse_devaddr(addr, domp, busp, slotp, NULL)) {
|
||||
monitor_printf(mon, "Invalid pci address\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -496,7 +514,7 @@ PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
|
|||
return pci_find_bus(pci_find_root_bus(0), 0);
|
||||
}
|
||||
|
||||
if (pci_parse_devaddr(devaddr, &dom, &bus, &slot) < 0) {
|
||||
if (pci_parse_devaddr(devaddr, &dom, &bus, &slot, NULL) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
2
hw/pci.h
2
hw/pci.h
|
@ -227,6 +227,8 @@ PCIBus *pci_find_bus(PCIBus *bus, int bus_num);
|
|||
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, int slot, int function);
|
||||
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr);
|
||||
|
||||
int pci_parse_devaddr(const char *addr, int *domp, int *busp,
|
||||
unsigned int *slotp, unsigned int *funcp);
|
||||
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
|
||||
unsigned *slotp);
|
||||
|
||||
|
|
Loading…
Reference in a new issue