Index: uspace/lib/ddev/include/ddev.h
===================================================================
--- uspace/lib/ddev/include/ddev.h	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/include/ddev.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -36,12 +36,15 @@
 #define _LIBDDEV_DDEV_H_
 
+#include <ddev/info.h>
 #include <errno.h>
 #include <gfx/context.h>
 #include <stdbool.h>
 #include "types/ddev.h"
+#include "types/ddev/info.h"
 
 extern errno_t ddev_open(const char *, ddev_t **);
 extern void ddev_close(ddev_t *);
 extern errno_t ddev_get_gc(ddev_t *, gfx_context_t **);
+extern errno_t ddev_get_info(ddev_t *, ddev_info_t *);
 
 #endif
Index: uspace/lib/ddev/include/ddev/info.h
===================================================================
--- uspace/lib/ddev/include/ddev/info.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
+++ uspace/lib/ddev/include/ddev/info.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libddev
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBDDEV_DDEV_INFO_H_
+#define _LIBDDEV_DDEV_INFO_H_
+
+#include "types/ddev/info.h"
+
+extern void ddev_info_init(ddev_info_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/ddev/include/ddev_srv.h
===================================================================
--- uspace/lib/ddev/include/ddev_srv.h	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/include/ddev_srv.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <gfx/context.h>
+#include "types/ddev/info.h"
 
 typedef struct ddev_ops ddev_ops_t;
@@ -51,4 +52,5 @@
 struct ddev_ops {
 	errno_t (*get_gc)(void *, sysarg_t *, sysarg_t *);
+	errno_t (*get_info)(void *, ddev_info_t *);
 };
 
Index: uspace/lib/ddev/include/ipc/ddev.h
===================================================================
--- uspace/lib/ddev/include/ipc/ddev.h	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/include/ipc/ddev.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -39,5 +39,6 @@
 
 typedef enum {
-	DDEV_GET_GC = IPC_FIRST_USER_METHOD
+	DDEV_GET_GC = IPC_FIRST_USER_METHOD,
+	DDEV_GET_INFO
 } ddev_request_t;
 
Index: uspace/lib/ddev/include/types/ddev/info.h
===================================================================
--- uspace/lib/ddev/include/types/ddev/info.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
+++ uspace/lib/ddev/include/types/ddev/info.h	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libddev
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBDDEV_TYPES_DDEV_INFO_H_
+#define _LIBDDEV_TYPES_DDEV_INFO_H_
+
+#include <gfx/coord.h>
+
+/** Display device information */
+typedef struct {
+	/** Bounding rectangle */
+	gfx_rect_t rect;
+} ddev_info_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/ddev/meson.build
===================================================================
--- uspace/lib/ddev/meson.build	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/meson.build	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -31,4 +31,5 @@
 	'src/ddev.c',
 	'src/ddev_srv.c',
+	'src/info.c',
 )
 
Index: uspace/lib/ddev/src/ddev.c
===================================================================
--- uspace/lib/ddev/src/ddev.c	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/src/ddev.c	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -111,4 +111,32 @@
 }
 
+/** Get display device information.
+ *
+ * @param ddev Display device
+ * @param info Place to store information
+ */
+errno_t ddev_get_info(ddev_t *ddev, ddev_info_t *info)
+{
+	async_exch_t *exch;
+	errno_t retval;
+	ipc_call_t answer;
+
+	exch = async_exchange_begin(ddev->sess);
+	aid_t req = async_send_0(exch, DDEV_GET_INFO, &answer);
+
+	errno_t rc = async_data_read_start(exch, info, sizeof(ddev_info_t));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &retval);
+	if (retval != EOK)
+		return rc;
+
+	return EOK;
+}
+
 /** @}
  */
Index: uspace/lib/ddev/src/ddev_srv.c
===================================================================
--- uspace/lib/ddev/src/ddev_srv.c	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/src/ddev_srv.c	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -70,4 +70,49 @@
 }
 
+/** Get display device information */
+static void ddev_get_info_srv(ddev_srv_t *srv, ipc_call_t *icall)
+{
+	ddev_info_t info;
+	errno_t rc;
+
+	printf("ddev_get_info_srv\n");
+
+	ipc_call_t call;
+	size_t size;
+	if (!async_data_read_receive(&call, &size)) {
+		async_answer_0(&call, EREFUSED);
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(ddev_info_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	if (srv->ops->get_info == NULL) {
+		printf("get_info is NULL -> ENOTSUP\n");
+		async_answer_0(&call, ENOTSUP);
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->get_info(srv->arg, &info);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	rc = async_data_read_finalize(&call, &info, sizeof(ddev_info_t));
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
 void ddev_conn(ipc_call_t *icall, ddev_srv_t *srv)
 {
@@ -92,4 +137,7 @@
 		case DDEV_GET_GC:
 			ddev_get_gc_srv(srv, &call);
+			break;
+		case DDEV_GET_INFO:
+			ddev_get_info_srv(srv, &call);
 			break;
 		default:
Index: uspace/lib/ddev/src/info.c
===================================================================
--- uspace/lib/ddev/src/info.c	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
+++ uspace/lib/ddev/src/info.c	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <ddev/info.h>
+#include <mem.h>
+
+/** Initialize display device information structure.
+ *
+ * @param info Display device information structure
+ */
+void ddev_info_init(ddev_info_t *info)
+{
+	memset(info, 0, sizeof(ddev_info_t));
+}
+
+/** @}
+ */
Index: uspace/lib/ddev/test/ddev.c
===================================================================
--- uspace/lib/ddev/test/ddev.c	(revision 0b63dc2113d59db4ebb4bb8aa8ed9adeb8235809)
+++ uspace/lib/ddev/test/ddev.c	(revision a8eed5fbd3a0a8c9b9d42cf67e4146914e1b1be4)
@@ -49,8 +49,10 @@
 
 static errno_t test_get_gc(void *, sysarg_t *, sysarg_t *);
+static errno_t test_get_info(void *, ddev_info_t *);
 static errno_t test_gc_set_color(void *, gfx_color_t *);
 
 static ddev_ops_t test_ddev_ops = {
-	.get_gc = test_get_gc
+	.get_gc = test_get_gc,
+	.get_info = test_get_info
 };
 
@@ -66,4 +68,5 @@
 	bool set_color_called;
 	ddev_srv_t *srv;
+	ddev_info_t info;
 } test_response_t;
 
@@ -172,4 +175,78 @@
 }
 
+/** ddev_get_info with server returning failure */
+PCUT_TEST(dev_get_info_failure)
+{
+	errno_t rc;
+	service_id_t sid;
+	ddev_t *ddev = NULL;
+	test_response_t resp;
+	ddev_info_t info;
+
+	async_set_fallback_port_handler(test_ddev_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_ddev_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_ddev_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ddev_open(test_ddev_svc, &ddev);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(ddev);
+
+	resp.rc = ENOMEM;
+	rc = ddev_get_info(ddev, &info);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	ddev_close(ddev);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** ddev_get_info with server returning success */
+PCUT_TEST(dev_get_info_success)
+{
+	errno_t rc;
+	service_id_t sid;
+	ddev_t *ddev = NULL;
+	test_response_t resp;
+	ddev_info_t info;
+
+	async_set_fallback_port_handler(test_ddev_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_ddev_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_ddev_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ddev_open(test_ddev_svc, &ddev);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(ddev);
+
+	resp.rc = EOK;
+
+	ddev_info_init(&resp.info);
+	resp.info.rect.p0.x = 1;
+	resp.info.rect.p0.y = 2;
+	resp.info.rect.p1.x = 3;
+	resp.info.rect.p1.y = 4;
+
+	rc = ddev_get_info(ddev, &info);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	PCUT_ASSERT_INT_EQUALS(resp.info.rect.p0.x, info.rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(resp.info.rect.p0.y, info.rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(resp.info.rect.p1.x, info.rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(resp.info.rect.p1.y, info.rect.p1.y);
+
+	ddev_close(ddev);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
 /** Test display device connection.
  *
@@ -222,4 +299,15 @@
 }
 
+static errno_t test_get_info(void *arg, ddev_info_t *info)
+{
+	test_response_t *resp = (test_response_t *) arg;
+
+	if (resp->rc != EOK)
+		return resp->rc;
+
+	*info = resp->info;
+	return EOK;
+}
+
 static errno_t test_gc_set_color(void *arg, gfx_color_t *color)
 {
