tests: usb: Generic usb device hotplug

use usb-tablet as a hotplugged usb device.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Igor Mammedov 2014-09-26 09:28:14 +00:00 committed by Andreas Färber
parent fbd942c993
commit b393768314
7 changed files with 87 additions and 9 deletions

View File

@ -344,10 +344,10 @@ tests/ac97-test$(EXESUF): tests/ac97-test.o
tests/es1370-test$(EXESUF): tests/es1370-test.o tests/es1370-test$(EXESUF): tests/es1370-test.o
tests/intel-hda-test$(EXESUF): tests/intel-hda-test.o tests/intel-hda-test$(EXESUF): tests/intel-hda-test.o
tests/ioh3420-test$(EXESUF): tests/ioh3420-test.o tests/ioh3420-test$(EXESUF): tests/ioh3420-test.o
tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o $(libqos-usb-obj-y)
tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb-obj-y) tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb-obj-y)
tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y) tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o $(qtest-obj-y) tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o $(qtest-obj-y)
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a

View File

@ -35,3 +35,37 @@ void uhci_port_test(struct qhc *hc, int port, uint16_t expect)
g_assert((value & mask) == (expect & mask)); g_assert((value & mask) == (expect & mask));
} }
void usb_test_hotplug(const char *hcd_id, const int port,
void (*port_check)(void))
{
QDict *response;
char *cmd;
cmd = g_strdup_printf("{'execute': 'device_add',"
" 'arguments': {"
" 'driver': 'usb-tablet',"
" 'port': '%d',"
" 'bus': '%s.0',"
" 'id': 'usbdev%d'"
"}}", port, hcd_id, port);
response = qmp(cmd);
g_free(cmd);
g_assert(response);
g_assert(!qdict_haskey(response, "error"));
QDECREF(response);
if (port_check) {
port_check();
}
cmd = g_strdup_printf("{'execute': 'device_del',"
" 'arguments': {"
" 'id': 'usbdev%d'"
"}}", port);
response = qmp(cmd);
g_free(cmd);
g_assert(response);
g_assert(qdict_haskey(response, "event"));
g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
}

View File

@ -11,4 +11,7 @@ struct qhc {
void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc, void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc,
uint32_t devfn, int bar); uint32_t devfn, int bar);
void uhci_port_test(struct qhc *hc, int port, uint16_t expect); void uhci_port_test(struct qhc *hc, int port, uint16_t expect);
void usb_test_hotplug(const char *bus_name, const int port,
void (*port_check)(void));
#endif #endif

View File

@ -128,6 +128,19 @@ static void pci_ehci_port_2(void)
} }
} }
static void pci_ehci_port_3_hotplug(void)
{
/* check for presence of hotplugged usb-tablet */
g_assert(pcibus != NULL);
ehci_port_test(&ehci1, 2, PORTSC_PPOWER | PORTSC_CONNECT);
}
static void pci_ehci_port_hotplug(void)
{
usb_test_hotplug("ich9-ehci-1", 3, pci_ehci_port_3_hotplug);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret; int ret;
@ -139,6 +152,7 @@ int main(int argc, char **argv)
qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config); qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config);
qtest_add_func("/ehci/pci/uhci-port-2", pci_uhci_port_2); qtest_add_func("/ehci/pci/uhci-port-2", pci_uhci_port_2);
qtest_add_func("/ehci/pci/ehci-port-2", pci_ehci_port_2); qtest_add_func("/ehci/pci/ehci-port-2", pci_ehci_port_2);
qtest_add_func("/ehci/pci/ehci-port-3-hotplug", pci_ehci_port_hotplug);
qtest_start("-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7," qtest_start("-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7,"
"multifunction=on,id=ich9-ehci-1 " "multifunction=on,id=ich9-ehci-1 "

View File

@ -11,15 +11,18 @@
#include <string.h> #include <string.h>
#include "libqtest.h" #include "libqtest.h"
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "libqos/usb.h"
static void test_ohci_init(void) static void test_ohci_init(void)
{ {
qtest_start("-device pci-ohci,id=ohci");
qtest_end();
} }
static void test_ohci_hotplug(void)
{
usb_test_hotplug("ohci", 1, NULL);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -28,8 +31,11 @@ int main(int argc, char **argv)
g_test_init(&argc, &argv, NULL); g_test_init(&argc, &argv, NULL);
qtest_add_func("/ohci/pci/init", test_ohci_init); qtest_add_func("/ohci/pci/init", test_ohci_init);
qtest_add_func("/ohci/pci/hotplug", test_ohci_hotplug);
qtest_start("-device pci-ohci,id=ohci");
ret = g_test_run(); ret = g_test_run();
qtest_end();
return ret; return ret;
} }

View File

@ -19,17 +19,32 @@ static void test_uhci_init(void)
{ {
} }
static void test_port_1(void) static void test_port(int port)
{ {
QPCIBus *pcibus; QPCIBus *pcibus;
struct qhc uhci; struct qhc uhci;
g_assert(port > 0);
pcibus = qpci_init_pc(); pcibus = qpci_init_pc();
g_assert(pcibus != NULL); g_assert(pcibus != NULL);
qusb_pci_init_one(pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4); qusb_pci_init_one(pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4);
uhci_port_test(&uhci, 0, UHCI_PORT_CCS); uhci_port_test(&uhci, port - 1, UHCI_PORT_CCS);
} }
static void test_port_1(void)
{
test_port(1);
}
static void test_port_2(void)
{
test_port(2);
}
static void test_uhci_hotplug(void)
{
usb_test_hotplug("uhci", 2, test_port_2);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -39,6 +54,7 @@ int main(int argc, char **argv)
qtest_add_func("/uhci/pci/init", test_uhci_init); qtest_add_func("/uhci/pci/init", test_uhci_init);
qtest_add_func("/uhci/pci/port1", test_port_1); qtest_add_func("/uhci/pci/port1", test_port_1);
qtest_add_func("/uhci/pci/hotplug", test_uhci_hotplug);
qtest_start("-device piix3-usb-uhci,id=uhci,addr=1d.0" qtest_start("-device piix3-usb-uhci,id=uhci,addr=1d.0"
" -device usb-tablet,bus=uhci.0,port=1"); " -device usb-tablet,bus=uhci.0,port=1");

View File

@ -11,15 +11,17 @@
#include <string.h> #include <string.h>
#include "libqtest.h" #include "libqtest.h"
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "libqos/usb.h"
static void test_xhci_init(void) static void test_xhci_init(void)
{ {
qtest_start("-device nec-usb-xhci,id=xhci");
qtest_end();
} }
static void test_xhci_hotplug(void)
{
usb_test_hotplug("xhci", 1, NULL);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -28,8 +30,11 @@ int main(int argc, char **argv)
g_test_init(&argc, &argv, NULL); g_test_init(&argc, &argv, NULL);
qtest_add_func("/xhci/pci/init", test_xhci_init); qtest_add_func("/xhci/pci/init", test_xhci_init);
qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug);
qtest_start("-device nec-usb-xhci,id=xhci");
ret = g_test_run(); ret = g_test_run();
qtest_end();
return ret; return ret;
} }