[PATCH] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-22 Thread Or Idgar
From: Or Idgar <orid...@gmail.com>

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar <orid...@gmail.com>
---
 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 141 +
 4 files changed, 161 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar <id...@virtualoco.com>
+   Gal Hammer <gham...@redhat.com>
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..9d7f09f9e7bd
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,141 @@
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar <orid...@gmail.com>
+ *   Gal Hammer <gham...@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar <orid...@gmail.com>");
+MODULE_AUTHOR("Gal Hammer <gham...@redhat.com>");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   s

[PATCH v2] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-25 Thread Or Idgar
From: Or Idgar <orid...@gmail.com>

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar <orid...@gmail.com>
---
 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 140 +
 4 files changed, 160 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar <id...@virtualoco.com>
+   Gal Hammer <gham...@redhat.com>
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6b7ec9bd45e8
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar <orid...@gmail.com>
+ *   Gal Hammer <gham...@redhat.com>
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar <orid...@gmail.com>");
+MODULE_AUTHOR("Gal Hammer <gham...@redhat.com>");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   union acpi_object *pss;
+   union acpi_obj

[PATCH v5] drivers/misc: vm_gen_counter: initial driver implementation

2018-03-01 Thread Or Idgar
From: Or Idgar <orid...@gmail.com>

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar <orid...@gmail.com>
---

Changes in v5:
- added to VMGENID module dependency on ACPI module.

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   7 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 142 +
 4 files changed, 163 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar <id...@virtualoco.com>
+   Gal Hammer <gham...@redhat.com>
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..a39feff6a867 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,13 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   depends on ACPI
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6c8d8fe75335
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar <orid...@gmail.com>
+ *   Gal Hammer <gham...@redhat.com>
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar <orid...@gmail.com>");
+MODULE_AUTHOR("Gal Hammer <gham...@redhat.com>");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phys_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   void __iomem *uuid_map;
+   uuid_t uuid;
+   ssize_t result;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+
+   memcpy_fromio(, uuid_map, sizeof(uuid_t));
+   result = sprintf(buf, "%pUl\n", );
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   void __iomem *uuid_map;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+   memcpy_fromio(buf, uuid_map, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static

[PATCH v4] drivers/misc: vm_gen_counter: initial driver implementation

2018-02-27 Thread Or Idgar
From: Or Idgar <orid...@gmail.com>

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar <orid...@gmail.com>
---

Changes in v4:
- variable phy_addr changed to phys_addr (nit)
- using iomem functions to support arch portability

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 142 +
 4 files changed, 162 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar <id...@virtualoco.com>
+   Gal Hammer <gham...@redhat.com>
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6c8d8fe75335
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar <orid...@gmail.com>
+ *   Gal Hammer <gham...@redhat.com>
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar <orid...@gmail.com>");
+MODULE_AUTHOR("Gal Hammer <gham...@redhat.com>");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phys_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   void __iomem *uuid_map;
+   uuid_t uuid;
+   ssize_t result;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+
+   memcpy_fromio(, uuid_map, sizeof(uuid_t));
+   result = sprintf(buf, "%pUl\n", );
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   void __iomem *uuid_map;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+   memcpy_fromio(buf, uuid_map, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = v

[PATCH v3] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-25 Thread Or Idgar
From: Or Idgar <orid...@gmail.com>

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar <orid...@gmail.com>
---

Changes in v3 from v1 (v2 lack of patch changelog):
- replaced GPL2 section with SPDX line.
- including linux/kobject.h for hypervisor_kobj.
- using acpi_os_map_memory instead acpi_os_map_iomem.

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 140 +
 4 files changed, 160 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar <id...@virtualoco.com>
+   Gal Hammer <gham...@redhat.com>
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6b7ec9bd45e8
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar <orid...@gmail.com>
+ *   Gal Hammer <gham...@redhat.com>
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar <orid...@gmail.com>");
+MODULE_AUTHOR("Gal Hammer <gham...@redhat.com>");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_

[PATCH v5] drivers/misc: vm_gen_counter: initial driver implementation

2018-03-01 Thread Or Idgar
From: Or Idgar 

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar 
---

Changes in v5:
- added to VMGENID module dependency on ACPI module.

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   7 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 142 +
 4 files changed, 163 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar 
+   Gal Hammer 
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..a39feff6a867 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,13 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   depends on ACPI
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6c8d8fe75335
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar 
+ *   Gal Hammer 
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar ");
+MODULE_AUTHOR("Gal Hammer ");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phys_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   void __iomem *uuid_map;
+   uuid_t uuid;
+   ssize_t result;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+
+   memcpy_fromio(, uuid_map, sizeof(uuid_t));
+   result = sprintf(buf, "%pUl\n", );
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   void __iomem *uuid_map;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+   memcpy_fromio(buf, uuid_map, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   union acpi_object *pss;
+   union acpi_objec

[PATCH] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-22 Thread Or Idgar
From: Or Idgar 

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar 
---
 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 141 +
 4 files changed, 161 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar 
+   Gal Hammer 
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..9d7f09f9e7bd
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,141 @@
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar 
+ *   Gal Hammer 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar ");
+MODULE_AUTHOR("Gal Hammer ");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   union acpi_object *pss;
+   union acpi_object *element;
+
+   status = acpi_evaluate_object(ha

[PATCH v2] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-25 Thread Or Idgar
From: Or Idgar 

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar 
---
 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 140 +
 4 files changed, 160 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar 
+   Gal Hammer 
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6b7ec9bd45e8
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar 
+ *   Gal Hammer 
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar ");
+MODULE_AUTHOR("Gal Hammer ");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   union acpi_object *pss;
+   union acpi_object *element;
+
+   status = acpi_evaluate_object(handle, "ADDR", NULL, );
+   if (ACPI_FAILURE(status)) {
+   ACPI_EXCEPTION((AE_INFO, status, "Evaluating _ADDR"));
+

[PATCH v3] drivers/virt: vm_gen_counter: initial driver implementation

2018-02-25 Thread Or Idgar
From: Or Idgar 

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar 
---

Changes in v3 from v1 (v2 lack of patch changelog):
- replaced GPL2 section with SPDX line.
- including linux/kobject.h for hypervisor_kobj.
- using acpi_os_map_memory instead acpi_os_map_iomem.

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 140 +
 4 files changed, 160 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar 
+   Gal Hammer 
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6b7ec9bd45e8
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar 
+ *   Gal Hammer 
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar ");
+MODULE_AUTHOR("Gal Hammer ");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phy_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   uuid_t *uuidp;
+   ssize_t result;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+
+   result = sprintf(buf, "%pUl\n", uuidp);
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   uuid_t *uuidp;
+
+   uuidp = acpi_os_map_memory(phy_addr, sizeof(uuid_t));
+   if (!uuidp)
+   return -EFAULT;
+   memcpy(buf, uuidp, sizeof(uuid_t));
+   acpi_os_unmap_memory(uuidp, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   union acpi_object *pss;
+   union acpi_objec

[PATCH v4] drivers/misc: vm_gen_counter: initial driver implementation

2018-02-27 Thread Or Idgar
From: Or Idgar 

This patch is a driver which expose the Virtual Machine Generation ID
via sysfs. The ID is a UUID value used to differentiate between virtual
machines.

The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple
hypervisor vendors.

Signed-off-by: Or Idgar 
---

Changes in v4:
- variable phy_addr changed to phys_addr (nit)
- using iomem functions to support arch portability

 Documentation/ABI/testing/sysfs-hypervisor |  13 +++
 drivers/misc/Kconfig   |   6 ++
 drivers/misc/Makefile  |   1 +
 drivers/misc/vmgenid.c | 142 +
 4 files changed, 162 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-hypervisor
 create mode 100644 drivers/misc/vmgenid.c

diff --git a/Documentation/ABI/testing/sysfs-hypervisor 
b/Documentation/ABI/testing/sysfs-hypervisor
new file mode 100644
index ..2f9a7b8eab70
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-hypervisor
@@ -0,0 +1,13 @@
+What:  /sys/hypervisor/vm_gen_counter
+Date:  February 2018
+Contact:   Or Idgar 
+   Gal Hammer 
+Description:   Expose the virtual machine generation ID. The directory
+   contains two files: "generation_id" and "raw". Both files
+   represent the same information.
+
+   "generation_id" file is a UUID string
+   representation.
+
+   "raw" file is a 128-bit integer
+   representation (binary).
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 03605f8fc0dc..5a74802bdfb4 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -500,6 +500,12 @@ config MISC_RTSX
tristate
default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config VMGENID
+   tristate "Virtual Machine Generation ID driver"
+   help
+ This is a Virtual Machine Generation ID driver which provides
+ a virtual machine unique identifier.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index c3c8624f4d95..067aa666bb6a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP)+= aspeed-lpc-snoop.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL) += ocxl/
 obj-$(CONFIG_MISC_RTSX)+= cardreader/
+obj-$(CONFIG_VMGENID)  += vmgenid.o
 
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)  += lkdtm_bugs.o
diff --git a/drivers/misc/vmgenid.c b/drivers/misc/vmgenid.c
new file mode 100644
index ..6c8d8fe75335
--- /dev/null
+++ b/drivers/misc/vmgenid.c
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Virtual Machine Generation ID driver
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All rights reserved.
+ * Authors:
+ *   Or Idgar 
+ *   Gal Hammer 
+ *
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Or Idgar ");
+MODULE_AUTHOR("Gal Hammer ");
+MODULE_DESCRIPTION("Virtual Machine Generation ID");
+MODULE_VERSION("0.1");
+
+ACPI_MODULE_NAME("vmgenid");
+
+static u64 phys_addr;
+
+static ssize_t generation_id_show(struct device *_d,
+ struct device_attribute *attr, char *buf)
+{
+   void __iomem *uuid_map;
+   uuid_t uuid;
+   ssize_t result;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+
+   memcpy_fromio(, uuid_map, sizeof(uuid_t));
+   result = sprintf(buf, "%pUl\n", );
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return result;
+}
+static DEVICE_ATTR_RO(generation_id);
+
+static ssize_t raw_show(struct device *_d,
+   struct device_attribute *attr,
+ char *buf)
+{
+   void __iomem *uuid_map;
+
+   uuid_map = acpi_os_map_iomem(phys_addr, sizeof(uuid_t));
+   if (!uuid_map)
+   return -EFAULT;
+   memcpy_fromio(buf, uuid_map, sizeof(uuid_t));
+   acpi_os_unmap_iomem(uuid_map, sizeof(uuid_t));
+   return sizeof(uuid_t);
+}
+static DEVICE_ATTR_RO(raw);
+
+static struct attribute *vmgenid_attrs[] = {
+   _attr_generation_id.attr,
+   _attr_raw.attr,
+   NULL,
+};
+static const struct attribute_group vmgenid_group = {
+   .name = "vm_gen_counter",
+   .attrs = vmgenid_attrs,
+};
+
+static int get_vmgenid(acpi_handle handle)
+{
+   int i;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   acpi_status status;
+   

RE: CMA enhancement - non-default areas in x86

2020-05-13 Thread Idgar, Or
> For what type of device?
NTB (Non-Transparent Bridge).

-Original Message-
From: gre...@linuxfoundation.org  
Sent: יום ד 13 מאי 2020 09:48
To: Idgar, Or
Cc: linux-kernel@vger.kernel.org; linux...@kvack.org; Ravich, Leonid
Subject: Re: CMA enhancement - non-default areas in x86


[EXTERNAL EMAIL] 

On Wed, May 13, 2020 at 06:13:55AM +0000, Idgar, Or wrote:
> Hi,
> I'm working with Linux kernel on x86 and needed a way to allocate a very 
> large contiguous memory (around 20GB) for DMA operations.

For what type of device?

> I've found out that CMA is one of the major ways to do so, but our problem is 
> that CMA's default behavior is to create one default area from which all 
> devices can allocate memory.
> when booting, there were some drivers that allocated memory for DMA and used 
> CMA memory if exist. The problem is that it takes memory that we need for our 
> device and we want to make sure this area is dedicated for our device.
> 
> As I saw, the only way to reserve a dedicated area is by enabling 
> OF_RESERVED_MEM which is available for several architectures but excluding 
> x86 (and as far as I understand relies on device tree which is not in use 
> with x86 or at least cannot be configured with OF_RESERVED_MEM).
> 
> I really want to leverage this mechanism/API and thought about modifying the 
> code (and hopefully merge it upstream) so multiple non-default areas will be 
> available for x86 and with a way to consume it by mapping specific area to 
> specific device.
> 
> Is it something that will be open for merging if written properly?

We always will be glad to review patches, no need to ask us about that.
Just post them!

good luck,

greg k-h