Add support for handling capabilities requests

Change-Id: Id5aa197312c88b0c448dc085d8477ed67da24724
diff --git a/driver_library/include/ethosu.hpp b/driver_library/include/ethosu.hpp
index 70d0701..d3f7421 100644
--- a/driver_library/include/ethosu.hpp
+++ b/driver_library/include/ethosu.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Arm Limited. All rights reserved.
+ * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -19,10 +19,25 @@
 #pragma once
 
 #include <algorithm>
+#include <iostream>
 #include <memory>
 #include <string>
 #include <vector>
 
+/*
+ *The following undef are necessary to avoid clash with macros in GNU C Library
+ * if removed the following warning/error are produced:
+ *
+ *  In the GNU C Library, "major" ("minor") is defined
+ *  by <sys/sysmacros.h>. For historical compatibility, it is
+ *  currently defined by <sys/types.h> as well, but we plan to
+ *  remove this soon. To use "major" ("minor"), include <sys/sysmacros.h>
+ *  directly. If you did not intend to use a system-defined macro
+ *  "major" ("minor"), you should undefine it after including <sys/types.h>.
+ */
+#undef major
+#undef minor
+
 namespace EthosU {
 
 class Exception : public std::exception {
@@ -35,12 +50,95 @@
     std::string msg;
 };
 
+/**
+ * Sematic Version : major.minor.patch
+ */
+class SemanticVersion {
+public:
+    SemanticVersion(uint32_t _major = 0, uint32_t _minor = 0, uint32_t _patch = 0) :
+        major(_major), minor(_minor), patch(_patch){};
+
+    bool operator==(const SemanticVersion &other);
+    bool operator<(const SemanticVersion &other);
+    bool operator<=(const SemanticVersion &other);
+    bool operator!=(const SemanticVersion &other);
+    bool operator>(const SemanticVersion &other);
+    bool operator>=(const SemanticVersion &other);
+
+    uint32_t major;
+    uint32_t minor;
+    uint32_t patch;
+};
+
+std::ostream &operator<<(std::ostream &out, const SemanticVersion &v);
+
+/*
+ * Hardware Identifier
+ * @versionStatus:             Version status
+ * @version:                   Version revision
+ * @product:                   Product revision
+ * @architecture:              Architecture revison
+ */
+struct HardwareId {
+public:
+    HardwareId(uint32_t _versionStatus,
+               const SemanticVersion &_version,
+               const SemanticVersion &_product,
+               const SemanticVersion &_architecture) :
+        versionStatus(_versionStatus),
+        version(_version), product(_product), architecture(_architecture) {}
+
+    uint32_t versionStatus;
+    SemanticVersion version;
+    SemanticVersion product;
+    SemanticVersion architecture;
+};
+
+/*
+ * Hardware Configuration
+ * @macsPerClockCycle:         MACs per clock cycle
+ * @cmdStreamVersion:          NPU command stream version
+ * @shramSize:                 SHRAM size
+ * @customDma:                 Custom DMA enabled
+ */
+struct HardwareConfiguration {
+public:
+    HardwareConfiguration(uint32_t _macsPerClockCycle,
+                          uint32_t _cmdStreamVersion,
+                          uint32_t _shramSize,
+                          bool _customDma) :
+        macsPerClockCycle(_macsPerClockCycle),
+        cmdStreamVersion(_cmdStreamVersion), shramSize(_shramSize), customDma(_customDma) {}
+
+    uint32_t macsPerClockCycle;
+    uint32_t cmdStreamVersion;
+    uint32_t shramSize;
+    bool customDma;
+};
+
+/**
+ * Device capabilities
+ * @hwId:                      Hardware
+ * @driver:                    Driver revision
+ * @hwCfg                      Hardware configuration
+ */
+class Capabilities {
+public:
+    Capabilities(const HardwareId &_hwId, const HardwareConfiguration &_hwCfg, const SemanticVersion &_driver) :
+        hwId(_hwId), hwCfg(_hwCfg), driver(_driver) {}
+
+    HardwareId hwId;
+    HardwareConfiguration hwCfg;
+    SemanticVersion driver;
+};
+
 class Device {
 public:
     Device(const char *device = "/dev/ethosu0");
     virtual ~Device();
 
     int ioctl(unsigned long cmd, void *data = nullptr);
+    Capabilities capabilities();
 
 private:
     int fd;