summaryrefslogtreecommitdiff
path: root/hwdb/acpi-update.py
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2015-05-19 18:35:02 -0500
committerLennart Poettering <lennart@poettering.net>2016-06-10 23:27:58 +0200
commit3411164af3b765d1fc9f7bfa95be24e4e7acea2a (patch)
treedd894cd4cd99a7d084aa9db1054266fd2db06d44 /hwdb/acpi-update.py
parente373507d2570fe474a09fd6e3836ead32dca912f (diff)
hwdb: update UEFI/ACPI/PNP/EISA/EDID database from UEFI web site
Let's hook up the ACPI database we maintain from the upstream UEFI sources. This adds a tool to convert the database provided upstream to our native format, similar to how this is handled for the PCI and USB databases. Note that the upstream web site claims to offer an XLS download, but the actual data made available is an HTML file in reality, just one with the ".xls" suffix... The data provided from the UEFI folks is not very high quality nor complete, hence apply a patch after the conversion step that fixes up a few things and adds in more entries from various sources. For example, the EDID ids maintained by GNOME and other sources have been added too, as they all appear to use the same ID namespace. This also adds explicit support for 4 character ACPI ids, in addition to the normal 3 character PNP ids. Also fixes: https://bugs.freedesktop.org/show_bug.cgi?id=90524
Diffstat (limited to 'hwdb/acpi-update.py')
-rwxr-xr-xhwdb/acpi-update.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/hwdb/acpi-update.py b/hwdb/acpi-update.py
new file mode 100755
index 0000000000..2dc8c7c064
--- /dev/null
+++ b/hwdb/acpi-update.py
@@ -0,0 +1,79 @@
+#!/usr/bin/python3
+
+from html.parser import HTMLParser
+from enum import Enum
+
+class State(Enum):
+ NOWHERE = 0
+ COMPANY = 1
+ AFTER_COMPANY = 2
+ PNPID = 3
+ AFTER_PNPID = 4
+ DATE = 5
+
+class PNPTableParser(HTMLParser):
+
+ def __init__(self):
+ HTMLParser.__init__(self)
+ self.state = State.NOWHERE
+ self.data = ""
+ self.pnpid = None
+ self.company = None
+ self.table = []
+
+ def handle_starttag(self, tag, attrs):
+
+ if tag == "td":
+ if self.state == State.NOWHERE:
+ self.state = State.COMPANY
+ elif self.state == State.AFTER_COMPANY:
+ self.state = State.PNPID
+ elif self.state == State.AFTER_PNPID:
+ self.state = State.DATE
+ else:
+ raise Error("Unexpected field")
+
+ self.data = ""
+
+ def handle_endtag(self, tag):
+
+ if tag == "td":
+ if self.state == State.COMPANY:
+ self.company = ' '.join(self.data.strip().split())
+ self.state = State.AFTER_COMPANY
+ elif self.state == State.PNPID:
+ self.pnpid = self.data.strip()
+ self.state = State.AFTER_PNPID
+ self.table.append((self.pnpid, self.company))
+ elif self.state == State.DATE:
+ self.state = State.NOWHERE
+ else:
+ raise Error("Unexpected field")
+
+ def handle_data(self, data):
+ self.data += data
+
+def read_table(a):
+
+ parser = PNPTableParser()
+
+ for line in a:
+ parser.feed(line)
+
+ parser.close()
+ parser.table.sort()
+
+ for pnpid, company in parser.table:
+ print("\nacpi:{0}*:\n ID_VENDOR_FROM_DATABASE={1}".format(pnpid, company))
+
+a = open("acpi_id_registry.html")
+b = open("pnp_id_registry.html")
+
+print('# This file is part of systemd.\n'
+ '#\n'
+ '# Data imported from:\n'
+ '# http://www.uefi.org/uefi-pnp-export\n'
+ '# http://www.uefi.org/uefi-acpi-export')
+
+read_table(a)
+read_table(b)