drm: Branch 'master' - 3 commits

[email protected] (Alex Deucher)
Newsgroups gmane.comp.video.dri.patches
Message-ID <[email protected]>
 tests/amdgpu/amdgpu_test.c |  259 +++++++++++++++++++++++++++++++++++++++------
 tests/amdgpu/amdgpu_test.h |    3 
 tests/amdgpu/bo_tests.c    |    5 
 3 files changed, 233 insertions(+), 34 deletions(-)

New commits:
commit 8a89d5f620967a9086495d15825415ac27bf061a
Author: Alex Xie <[email protected]>
Date:   Tue Jan 24 17:29:52 2017 -0500

    amdgpu: A new option to run tests on render node
    
    Tested:
    1. As root, tests passed on primary.
    2. As root, tests passed on render node.
       BO export/import test was skipped
    3. As non-privileged user, tests failed on primary as expected.
    4. As non-privileged user, tests passed on render node.
       BO export/import test was skipped
    
    Reviewed-by: Emil Velikov <[email protected]>
    Signed-off-by: Alex Xie <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>

diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c
index c01ee54..3fd6820 100644
--- a/tests/amdgpu/amdgpu_test.c
+++ b/tests/amdgpu/amdgpu_test.c
@@ -56,6 +56,9 @@
  */
 int drm_amdgpu[MAX_CARDS_SUPPORTED];
 
+/** Open render node to test */
+int open_render_node = 0;	/* By default run most tests on primary node */
+
 /** The table of all known test suites to run */
 static CU_SuiteInfo suites[] = {
 	{
@@ -109,16 +112,17 @@ static void display_test_suites(void)
 
 /** Help string for command line parameters */
 static const char usage[] =
-	"Usage: %s [-hlp] [<-s <suite id>> [-t <test id>]] "
+	"Usage: %s [-hlpr] [<-s <suite id>> [-t <test id>]] "
 	"[-b <pci_bus_id> [-d <pci_device_id>]]\n"
 	"where:\n"
 	"       l - Display all suites and their tests\n"
+	"       r - Run the tests on render node\n"
 	"       b - Specify device's PCI bus id to run tests\n"
 	"       d - Specify device's PCI device id to run tests (optional)\n"
 	"       p - Display information of AMDGPU devices in system\n"
 	"       h - Display this help\n";
 /** Specified options strings for getopt */
-static const char options[]   = "hlps:t:b:d:";
+static const char options[]   = "hlrps:t:b:d:";
 
 /* Open AMD devices.
  * Return the number of AMD device openned.
@@ -326,6 +330,9 @@ int main(int argc, char **argv)
 		case 'p':
 			display_devices = 1;
 			break;
+		case 'r':
+			open_render_node = 1;
+			break;
 		case '?':
 		case 'h':
 			fprintf(stderr, usage, argv[0]);
@@ -336,7 +343,7 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (amdgpu_open_devices(0) <= 0) {
+	if (amdgpu_open_devices(open_render_node) <= 0) {
 		perror("Cannot open AMDGPU device");
 		exit(EXIT_FAILURE);
 	}
diff --git a/tests/amdgpu/amdgpu_test.h b/tests/amdgpu/amdgpu_test.h
index fca92ad..e30e231 100644
--- a/tests/amdgpu/amdgpu_test.h
+++ b/tests/amdgpu/amdgpu_test.h
@@ -35,6 +35,9 @@
 /* Forward reference for array to keep "drm" handles */
 extern int drm_amdgpu[MAX_CARDS_SUPPORTED];
 
+/* Global variables */
+extern int open_render_node;
+
 /*************************  Basic test suite ********************************/
 
 /*
diff --git a/tests/amdgpu/bo_tests.c b/tests/amdgpu/bo_tests.c
index 25df767..74b5e77 100644
--- a/tests/amdgpu/bo_tests.c
+++ b/tests/amdgpu/bo_tests.c
@@ -152,6 +152,11 @@ static void amdgpu_bo_export_import_do_type(enum amdgpu_bo_handle_type type)
 
 static void amdgpu_bo_export_import(void)
 {
+	if (open_render_node) {
+		printf("(DRM render node is used. Skip export/Import test) ");
+		return;
+	}
+
 	amdgpu_bo_export_import_do_type(amdgpu_bo_handle_type_gem_flink_name);
 	amdgpu_bo_export_import_do_type(amdgpu_bo_handle_type_dma_buf_fd);
 }
commit 12dd7a2e9cfa20a3022cfe091e824b09c0bfb9d1
Author: Alex Xie <[email protected]>
Date:   Tue Jan 24 17:29:51 2017 -0500

    amdgpu: A new option to choose which device to run most tests
    
    This can be used to test multiple GPUs
    
    v2: Use PCI bus ID and optional PCI device ID to choose device
        Add an option to display information of AMDGPU devices
    
    Tested:
       ./amdgpu_test -p
       ./amdgpu_test
       ./amdgpu_test -b 1 #fail as expected
       ./amdgpu_test -b 6 #pass
       ./amdgpu_test -b -d 1 #fail as expected
       ./amdgpu_test -b -d 0 #pass
    
    Reviewed-by: Emil Velikov <[email protected]>
    Signed-off-by: Alex Xie <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>

diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c
index d2b00d4..c01ee54 100644
--- a/tests/amdgpu/amdgpu_test.c
+++ b/tests/amdgpu/amdgpu_test.c
@@ -108,12 +108,17 @@ static void display_test_suites(void)
 
 
 /** Help string for command line parameters */
-static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n"
-				"where:\n"
-				"       l - Display all suites and their tests\n"
-				"       h - Display this help\n";
+static const char usage[] =
+	"Usage: %s [-hlp] [<-s <suite id>> [-t <test id>]] "
+	"[-b <pci_bus_id> [-d <pci_device_id>]]\n"
+	"where:\n"
+	"       l - Display all suites and their tests\n"
+	"       b - Specify device's PCI bus id to run tests\n"
+	"       d - Specify device's PCI device id to run tests (optional)\n"
+	"       p - Display information of AMDGPU devices in system\n"
+	"       h - Display this help\n";
 /** Specified options strings for getopt */
-static const char options[]   = "hls:t:";
+static const char options[]   = "hlps:t:b:d:";
 
 /* Open AMD devices.
  * Return the number of AMD device openned.
@@ -203,21 +208,79 @@ static void amdgpu_close_devices()
 static void amdgpu_print_devices()
 {
 	int i;
-	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
-		if (drm_amdgpu[i] >=0) {
-			/** Display version of DRM driver */
-			drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]);
+	drmDevicePtr device;
+
+	/* Open the first AMD devcie to print driver information. */
+	if (drm_amdgpu[0] >=0) {
+		/* Display AMD driver version information.*/
+		drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]);
+
+		if (retval == NULL) {
+			perror("Cannot get version for AMDGPU device");
+			return;
+		}
 
-			if (retval == NULL) {
-				perror("Cannot get version for AMDGPU device");
-				exit(EXIT_FAILURE);
+		printf("Driver name: %s, Date: %s, Description: %s.\n",
+			retval->name, retval->date, retval->desc);
+		drmFreeVersion(retval);
+	}
+
+	/* Display information of AMD devices */
+	printf("Devices:\n");
+	for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >=0; i++)
+		if (drmGetDevice2(drm_amdgpu[i],
+			DRM_DEVICE_GET_PCI_REVISION,
+			&device) == 0) {
+			if (device->bustype == DRM_BUS_PCI) {
+				printf("PCI ");
+				printf(" domain:%04x",
+					device->businfo.pci->domain);
+				printf(" bus:%02x",
+					device->businfo.pci->bus);
+				printf(" device:%02x",
+					device->businfo.pci->dev);
+				printf(" function:%01x",
+					device->businfo.pci->func);
+				printf(" vendor_id:%04x",
+					device->deviceinfo.pci->vendor_id);
+				printf(" device_id:%04x",
+					device->deviceinfo.pci->device_id);
+				printf(" subvendor_id:%04x",
+					device->deviceinfo.pci->subvendor_id);
+				printf(" subdevice_id:%04x",
+					device->deviceinfo.pci->subdevice_id);
+				printf(" revision_id:%02x",
+					device->deviceinfo.pci->revision_id);
+				printf("\n");
 			}
+			drmFreeDevice(&device);
+		}
+}
+
+/* Find a match AMD device in PCI bus
+ * Return the index of the device or -1 if not found
+ */
+static int amdgpu_find_device(uint8_t bus, uint8_t dev)
+{
+	int i;
+	drmDevicePtr device;
+
+	for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >=0; i++)
+		if (drmGetDevice2(drm_amdgpu[i],
+			DRM_DEVICE_GET_PCI_REVISION,
+			&device) == 0) {
+			if (device->bustype == DRM_BUS_PCI)
+				if (device->businfo.pci->bus == bus &&
+					device->businfo.pci->dev == dev) {
+
+					drmFreeDevice(&device);
+					return i;
+				}
 
-			printf("AMDGPU device #%d: "
-				"Name: [%s] : Date [%s] : Description [%s]\n",
-				i, retval->name, retval->date, retval->desc);
-			drmFreeVersion(retval);
+			drmFreeDevice(&device);
 		}
+
+	return -1;
 }
 
 /* The main() function for setting up and running the tests.
@@ -230,8 +293,12 @@ int main(int argc, char **argv)
 	int i = 0;
 	int suite_id = -1;	/* By default run everything */
 	int test_id  = -1;	/* By default run all tests in the suite */
+	int pci_bus_id = -1;    /* By default PC bus ID is not specified */
+	int pci_device_id = 0;  /* By default PC device ID is zero */
+	int display_devices = 0;/* By default not to display devices' info */
 	CU_pSuite pSuite = NULL;
 	CU_pTest  pTest  = NULL;
+	int test_device_index;
 
 	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
 		drm_amdgpu[i] = -1;
@@ -250,6 +317,15 @@ int main(int argc, char **argv)
 		case 't':
 			test_id = atoi(optarg);
 			break;
+		case 'b':
+			pci_bus_id = atoi(optarg);
+			break;
+		case 'd':
+			pci_device_id = atoi(optarg);
+			break;
+		case 'p':
+			display_devices = 1;
+			break;
 		case '?':
 		case 'h':
 			fprintf(stderr, usage, argv[0]);
@@ -270,7 +346,30 @@ int main(int argc, char **argv)
 		exit(EXIT_FAILURE);
 	}
 
-	amdgpu_print_devices();
+	if (display_devices) {
+		amdgpu_print_devices();
+		amdgpu_close_devices();
+		exit(EXIT_SUCCESS);
+	}
+
+	if (pci_bus_id > 0) {
+		/* A device was specified to run the test */
+		test_device_index = amdgpu_find_device((uint8_t)pci_bus_id,
+							(uint8_t)pci_device_id);
+
+		if (test_device_index >= 0) {
+			/* Most tests run on device of drm_amdgpu[0].
+			 * Swap the chosen device to drm_amdgpu[0].
+			 */
+			i = drm_amdgpu[0];
+			drm_amdgpu[0] = drm_amdgpu[test_device_index];
+			drm_amdgpu[test_device_index] = i;
+		} else {
+			fprintf(stderr,
+				"The specified GPU device does not exist.\n");
+			exit(EXIT_FAILURE);
+		}
+	}
 
 	/* Initialize test suites to run */
 
commit 5e0f7c5c65ca6714cd7352d72303ec2cbec35cb5
Author: Alex Xie <[email protected]>
Date:   Tue Jan 24 17:29:50 2017 -0500

    amdgpu: verify the tested device
    
    Verify the vender ID and driver name.
    Open all AMDGPU devices.
    Provide an option to open render node.
    
    Tested as root: PASS
    Tested as non-privileged user:
    All tests failed as expected
    
    v2: Return value in the ene of function amdgpu_open_devices.
        Check the return value of amdgpu_open_devices.
        amdgpu_test is not for USB device for the time being.
        Get the name of node from function drmGetDevices2.
        Drop the legacy drmAvailable() from the test.
    
    Reviewed-by: Emil Velikov <[email protected]>
    Signed-off-by: Alex Xie <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>

diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c
index 71f357c..d2b00d4 100644
--- a/tests/amdgpu/amdgpu_test.c
+++ b/tests/amdgpu/amdgpu_test.c
@@ -115,6 +115,111 @@ static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n"
 /** Specified options strings for getopt */
 static const char options[]   = "hls:t:";
 
+/* Open AMD devices.
+ * Return the number of AMD device openned.
+ */
+static int amdgpu_open_devices(int open_render_node)
+{
+	drmDevicePtr devices[MAX_CARDS_SUPPORTED];
+	int ret;
+	int i;
+	int drm_node;
+	int amd_index = 0;
+	int drm_count;
+	int fd;
+	drmVersionPtr version;
+
+	drm_count = drmGetDevices2(0, devices, MAX_CARDS_SUPPORTED);
+
+	if (drm_count < 0) {
+		fprintf(stderr,
+			"drmGetDevices2() returned an error %d\n",
+			drm_count);
+		return 0;
+	}
+
+	for (i = 0; i < drm_count; i++) {
+		/* If this is not PCI device, skip*/
+		if (devices[i]->bustype != DRM_BUS_PCI)
+			continue;
+
+		/* If this is not AMD GPU vender ID, skip*/
+		if (devices[i]->deviceinfo.pci->vendor_id != 0x1002)
+			continue;
+
+		if (open_render_node)
+			drm_node = DRM_NODE_RENDER;
+		else
+			drm_node = DRM_NODE_PRIMARY;
+
+		fd = -1;
+		if (devices[i]->available_nodes & 1 << drm_node)
+			fd = open(
+				devices[i]->nodes[drm_node],
+				O_RDWR | O_CLOEXEC);
+
+		/* This node is not available. */
+		if (fd < 0) continue;
+
+		version = drmGetVersion(fd);
+		if (!version) {
+			fprintf(stderr,
+				"Warning: Cannot get version for %s."
+				"Error is %s\n",
+				devices[i]->nodes[drm_node],
+				strerror(errno));
+			close(fd);
+			continue;
+		}
+
+		if (strcmp(version->name, "amdgpu")) {
+			/* This is not AMDGPU driver, skip.*/
+			drmFreeVersion(version);
+			close(fd);
+			continue;
+		}
+
+		drmFreeVersion(version);
+
+		drm_amdgpu[amd_index] = fd;
+		amd_index++;
+	}
+
+	drmFreeDevices(devices, drm_count);
+	return amd_index;
+}
+
+/* Close AMD devices.
+ */
+static void amdgpu_close_devices()
+{
+	int i;
+	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
+		if (drm_amdgpu[i] >=0)
+			close(drm_amdgpu[i]);
+}
+
+/* Print AMD devices information */
+static void amdgpu_print_devices()
+{
+	int i;
+	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
+		if (drm_amdgpu[i] >=0) {
+			/** Display version of DRM driver */
+			drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]);
+
+			if (retval == NULL) {
+				perror("Cannot get version for AMDGPU device");
+				exit(EXIT_FAILURE);
+			}
+
+			printf("AMDGPU device #%d: "
+				"Name: [%s] : Date [%s] : Description [%s]\n",
+				i, retval->name, retval->date, retval->desc);
+			drmFreeVersion(retval);
+		}
+}
+
 /* The main() function for setting up and running the tests.
  * Returns a CUE_SUCCESS on successful running, another
  * CUnit error code on failure.
@@ -128,14 +233,6 @@ int main(int argc, char **argv)
 	CU_pSuite pSuite = NULL;
 	CU_pTest  pTest  = NULL;
 
-	int aval = drmAvailable();
-
-	if (aval == 0) {
-		fprintf(stderr, "DRM driver is not available\n");
-		exit(EXIT_FAILURE);
-	}
-
-
 	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
 		drm_amdgpu[i] = -1;
 
@@ -163,35 +260,23 @@ int main(int argc, char **argv)
 		}
 	}
 
-	/* Try to open all possible radeon connections
-	 * Right now: Open only the 0.
-	 */
-	printf("Try to open the card 0..\n");
-	drm_amdgpu[0] = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
-
-	if (drm_amdgpu[0] < 0) {
-		perror("Cannot open /dev/dri/card0\n");
+	if (amdgpu_open_devices(0) <= 0) {
+		perror("Cannot open AMDGPU device");
 		exit(EXIT_FAILURE);
 	}
 
-	/** Display version of DRM driver */
-	drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]);
-
-	if (retval == NULL) {
-		perror("Could not get information about DRM driver");
+	if (drm_amdgpu[0] < 0) {
+		perror("Cannot open AMDGPU device");
 		exit(EXIT_FAILURE);
 	}
 
-	printf("DRM Driver: Name: [%s] : Date [%s] : Description [%s]\n",
-	       retval->name, retval->date, retval->desc);
-
-	drmFreeVersion(retval);
+	amdgpu_print_devices();
 
 	/* Initialize test suites to run */
 
 	/* initialize the CUnit test registry */
 	if (CUE_SUCCESS != CU_initialize_registry()) {
-		close(drm_amdgpu[0]);
+		amdgpu_close_devices();
 		return CU_get_error();
 	}
 
@@ -200,7 +285,7 @@ int main(int argc, char **argv)
 		fprintf(stderr, "suite registration failed - %s\n",
 				CU_get_error_msg());
 		CU_cleanup_registry();
-		close(drm_amdgpu[0]);
+		amdgpu_close_devices();
 		exit(EXIT_FAILURE);
 	}
 
@@ -222,7 +307,7 @@ int main(int argc, char **argv)
 					fprintf(stderr, "Invalid test id: %d\n",
 								test_id);
 					CU_cleanup_registry();
-					close(drm_amdgpu[0]);
+					amdgpu_close_devices();
 					exit(EXIT_FAILURE);
 				}
 			} else
@@ -231,13 +316,13 @@ int main(int argc, char **argv)
 			fprintf(stderr, "Invalid suite id : %d\n",
 					suite_id);
 			CU_cleanup_registry();
-			close(drm_amdgpu[0]);
+			amdgpu_close_devices();
 			exit(EXIT_FAILURE);
 		}
 	} else
 		CU_basic_run_tests();
 
 	CU_cleanup_registry();
-	close(drm_amdgpu[0]);
+	amdgpu_close_devices();
 	return CU_get_error();
 }

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
--
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.