Add support for handling capabilities requests

Change-Id: Id5aa197312c88b0c448dc085d8477ed67da24724
diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp
index 1768271..ea1f7f4 100644
--- a/driver_library/src/ethosu.cpp
+++ b/driver_library/src/ethosu.cpp
@@ -112,6 +112,43 @@
 }
 
 /****************************************************************************
+ * Semantic Version
+ ****************************************************************************/
+
+bool SemanticVersion::operator==(const SemanticVersion &other) {
+    return other.major == major && other.minor == minor && other.patch == patch;
+}
+
+bool SemanticVersion::operator<(const SemanticVersion &other) {
+    if (other.major > major)
+        return true;
+    if (other.minor > minor)
+        return true;
+    return other.patch > patch;
+}
+
+bool SemanticVersion::operator<=(const SemanticVersion &other) {
+    return *this < other || *this == other;
+}
+
+bool SemanticVersion::operator!=(const SemanticVersion &other) {
+    return !(*this == other);
+}
+
+bool SemanticVersion::operator>(const SemanticVersion &other) {
+    return !(*this <= other);
+}
+
+bool SemanticVersion::operator>=(const SemanticVersion &other) {
+    return !(*this < other);
+}
+
+ostream &operator<<(ostream &out, const SemanticVersion &v) {
+    return out << "{ major=" << unsigned(v.major) << ", minor=" << unsigned(v.minor) << ", patch=" << unsigned(v.patch)
+               << " }";
+}
+
+/****************************************************************************
  * Device
  ****************************************************************************/
 
@@ -130,6 +167,23 @@
     return eioctl(fd, cmd, data);
 }
 
+Capabilities Device::capabilities() {
+    ethosu_uapi_device_capabilities uapi;
+    (void)eioctl(fd, ETHOSU_IOCTL_CAPABILITIES_REQ, static_cast<void *>(&uapi));
+
+    Capabilities capabilities(
+        HardwareId(uapi.hw_id.version_status,
+                   SemanticVersion(uapi.hw_id.version_major, uapi.hw_id.version_minor),
+                   SemanticVersion(uapi.hw_id.product_major),
+                   SemanticVersion(uapi.hw_id.arch_major_rev, uapi.hw_id.arch_minor_rev, uapi.hw_id.arch_patch_rev)),
+        HardwareConfiguration(uapi.hw_cfg.macs_per_cc,
+                              uapi.hw_cfg.cmd_stream_version,
+                              uapi.hw_cfg.shram_size,
+                              bool(uapi.hw_cfg.custom_dma)),
+        SemanticVersion(uapi.driver_major_rev, uapi.driver_minor_rev, uapi.driver_patch_rev));
+    return capabilities;
+}
+
 /****************************************************************************
  * Buffer
  ****************************************************************************/