From 499d865ff2cd575746ed2f971d84e6d5248a92d0 Mon Sep 17 00:00:00 2001
From: Maximilian Luz <luzmaximilian@gmail.com>
Date: Sat, 1 Jun 2019 21:17:15 +0200
Subject: [PATCH 02/16] Add support for Intel Management Engine bus

Add support for devices connected via the Intel Management Engine (MEI).
This is required to support IPTS based devices, such as (among others)
the Microsoft Surface Books, Surface Pro 5 and 6, and Surface Laptops.
---
 libwacom/libwacom-database.c | 4 ++++
 libwacom/libwacom.c          | 5 +++++
 libwacom/libwacom.h          | 1 +
 test/test-tablet-validity.c  | 1 +
 test/test_data_files.py      | 1 +
 tools/debug-device.c         | 1 +
 6 files changed, 13 insertions(+)

diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
index 2c203a10..0c02cfd2 100644
--- a/libwacom/libwacom-database.c
+++ b/libwacom/libwacom-database.c
@@ -176,6 +176,8 @@ bus_from_str (const char *str)
 		return WBUSTYPE_I2C;
 	if (g_str_equal(str, "virt"))
 		return WBUSTYPE_VIRTUAL;
+	if (strcmp (str, "mei") == 0)
+		return WBUSTYPE_MEI;
 	return WBUSTYPE_UNKNOWN;
 }
 
@@ -196,6 +198,8 @@ bus_to_str (WacomBusType bus)
 		return "i2c";
 	case WBUSTYPE_VIRTUAL:
 		return "virt";
+	case WBUSTYPE_MEI:
+		return "mei";
 	}
 	g_assert_not_reached ();
 }
diff --git a/libwacom/libwacom.c b/libwacom/libwacom.c
index 42bec181..a906e930 100644
--- a/libwacom/libwacom.c
+++ b/libwacom/libwacom.c
@@ -157,6 +157,10 @@ get_bus_vid_pid (GUdevDevice  *device,
 		*bus = WBUSTYPE_VIRTUAL;
 		retval = TRUE;
 		break;
+	case 68:
+		*bus = WBUSTYPE_MEI;
+		retval = TRUE;
+		break;
 	}
 
 out:
@@ -1014,6 +1018,7 @@ static void print_match(int fd, const WacomMatch *match)
 		case WBUSTYPE_SERIAL:		bus_name = "serial";	break;
 		case WBUSTYPE_I2C:		bus_name = "i2c";	break;
 		case WBUSTYPE_VIRTUAL:		bus_name = "virt";	break;
+		case WBUSTYPE_MEI:		bus_name = "mei";	break;
 		case WBUSTYPE_UNKNOWN:		bus_name = "unknown";	break;
 		default:			g_assert_not_reached(); break;
 	}
diff --git a/libwacom/libwacom.h b/libwacom/libwacom.h
index 17dd7600..798a31dd 100644
--- a/libwacom/libwacom.h
+++ b/libwacom/libwacom.h
@@ -155,6 +155,7 @@ typedef enum {
 	WBUSTYPE_BLUETOOTH,	/**< Bluetooth tablet */
 	WBUSTYPE_I2C,		/**< I2C tablet */
 	WBUSTYPE_VIRTUAL,	/**< Virtual (uinput) tablet */
+	WBUSTYPE_MEI,		/**< MEI */
 } WacomBusType;
 
 /**
diff --git a/test/test-tablet-validity.c b/test/test-tablet-validity.c
index 4bc09b88..bd7160b2 100644
--- a/test/test-tablet-validity.c
+++ b/test/test-tablet-validity.c
@@ -178,6 +178,7 @@ assert_vidpid(WacomBusType bus, int vid, int pid)
 		case WBUSTYPE_BLUETOOTH:
 		case WBUSTYPE_I2C:
 		case WBUSTYPE_VIRTUAL:
+		case WBUSTYPE_MEI:
 			g_assert_cmpint(vid, >, 0);
 			g_assert_cmpint(pid, >, 0);
 			break;
diff --git a/test/test_data_files.py b/test/test_data_files.py
index ee6ffcd3..bd7d798f 100755
--- a/test/test_data_files.py
+++ b/test/test_data_files.py
@@ -48,6 +48,7 @@ def test_device_match(tabletfile):
             "i2c",
             "serial",
             "virt",
+            "mei",
         ], f"{tabletfile}: unknown bus type"
         assert re.match("[0-9a-f]{4}", vid), (
             f"{tabletfile}: {vid} must be lowercase hex"
diff --git a/tools/debug-device.c b/tools/debug-device.c
index 0c4efe06..e36a5208 100644
--- a/tools/debug-device.c
+++ b/tools/debug-device.c
@@ -177,6 +177,7 @@ handle_device(WacomDeviceDatabase *db, const char *path)
 			case WBUSTYPE_BLUETOOTH: busstr = "BLUETOOTH"; break;
 			case WBUSTYPE_I2C: busstr = "I2C"; break;
 			case WBUSTYPE_VIRTUAL: busstr = "VIRTUAL"; break;
+			case WBUSTYPE_MEI: busstr = "MEI"; break;
 		}
 		func(libwacom_get_bustype, "%s", busstr);
 	}
-- 
2.50.0

