hypervisor: add board specific configuration.

BUG=b:173824544
TEST=Boot supported boards.

Cq-Depend: chromium:2885078
Change-Id: I9fcbf4a35e5e00cfca8b3c9ff5317fa6f1b44c5d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/initramfs/+/2891428
Tested-by: Tomasz Jeznach <tjeznach@chromium.org>
Commit-Queue: Tomasz Jeznach <tjeznach@chromium.org>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
diff --git a/hypervisor/Makefile b/hypervisor/Makefile
index 3d5f4c1..a946cd1 100644
--- a/hypervisor/Makefile
+++ b/hypervisor/Makefile
@@ -21,5 +21,6 @@
 	lddtree --verbose --copy-non-elfs --root=$(SYSROOT) \
 		--copy-to-tree=$(STAGE) \
 		$(DATA_DEPS)
+	cp "$(SRCDIR)/boards/$(BOARD)/manatee.conf" "$(STAGE)/etc/manatee.conf"
 	cp "$(SRCDIR)/crosvm-direct.sh" "$(STAGE)/bin/crosvm-direct.sh"
 	$(call generate_ramfs)
diff --git a/hypervisor/boards/brya-manatee/manatee.conf b/hypervisor/boards/brya-manatee/manatee.conf
new file mode 100644
index 0000000..9b28e13
--- /dev/null
+++ b/hypervisor/boards/brya-manatee/manatee.conf
@@ -0,0 +1,10 @@
+# Copyright 2021 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+BOARD_IRQS="edge:1 level:14 level:27 level:39 edge:77 level:100 level:117"
+BOARD_PMIO="$((0x2e))-$((0x2f)),$((0x4e))-$((0x4f)),$((0x60)),\
+$((0x62))-$((0x67)),$((0x70))-$((0x77)),$((0x81))-$((0xef)),\
+$((0x200)),$((0x204)),$((0x800))-$((0x9ff)),\
+$((0x1800))-$((0x18ff))"
+
diff --git a/hypervisor/boards/eve-manatee/manatee.conf b/hypervisor/boards/eve-manatee/manatee.conf
new file mode 100644
index 0000000..13dbb61
--- /dev/null
+++ b/hypervisor/boards/eve-manatee/manatee.conf
@@ -0,0 +1,10 @@
+# Copyright 2021 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+BOARD_IRQS="edge:1 level:14 edge:24 level:34"
+BOARD_PMIO="$((0x2e))-$((0x2f)),$((0x4e))-$((0x4f)),$((0x60)),\
+$((0x62))-$((0x67)),$((0x70))-$((0x77)),$((0x81))-$((0xef)),\
+$((0x200)),$((0x204)),$((0x800))-$((0x9ff)),\
+$((0x1800))-$((0x18ff))"
+
diff --git a/hypervisor/boards/hatch-manatee/manatee.conf b/hypervisor/boards/hatch-manatee/manatee.conf
new file mode 100644
index 0000000..597f96c
--- /dev/null
+++ b/hypervisor/boards/hatch-manatee/manatee.conf
@@ -0,0 +1,10 @@
+# Copyright 2021 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+BOARD_IRQS="edge:1 edge:45 level:47 level:79 level:85 edge:93 edge:112"
+BOARD_PMIO="$((0x2e))-$((0x2f)),$((0x4e))-$((0x4f)),$((0x60)),\
+$((0x62))-$((0x67)),$((0x70))-$((0x77)),$((0x81))-$((0xef)),\
+$((0x200)),$((0x204)),$((0x800))-$((0x9ff)),\
+$((0x1800))-$((0x18ff))"
+
diff --git a/hypervisor/boards/volteer-manatee/manatee.conf b/hypervisor/boards/volteer-manatee/manatee.conf
new file mode 100644
index 0000000..8d29649
--- /dev/null
+++ b/hypervisor/boards/volteer-manatee/manatee.conf
@@ -0,0 +1,10 @@
+# Copyright 2021 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+BOARD_IRQS="edge:1 level:14 edge:35 edge:51 level:59 level:100 level:116"
+BOARD_PMIO="$((0x2e))-$((0x2f)),$((0x4e))-$((0x4f)),$((0x60)),\
+$((0x62))-$((0x67)),$((0x70))-$((0x77)),$((0x81))-$((0xef)),\
+$((0x200)),$((0x204)),$((0x800))-$((0x9ff)),\
+$((0x1800))-$((0x18ff))"
+
diff --git a/hypervisor/crosvm-direct.sh b/hypervisor/crosvm-direct.sh
index af740ad..a17504b 100755
--- a/hypervisor/crosvm-direct.sh
+++ b/hypervisor/crosvm-direct.sh
@@ -38,11 +38,17 @@
   echo "${vendor_id} ${device_id}" > /sys/bus/pci/drivers/vfio-pci/new_id
 }
 
+# Port I/O forwarding.
+get_platform_pmio() {
+  local pmio="${BOARD_PMIO:-128}"
+  echo "--no-legacy --direct-pmio /dev/port@${pmio}"
+}
+
 # Interrupt forwarding argument helper.
-get_irqs() {
-  local path
+get_platform_irqs() {
+  local irq
   local args=""
-  local irqs="edge:1 level:14 edge:35 edge:51 level:59 level:100 level:116"
+  local irqs="${BOARD_IRQS:-edge:1}"
   for irq in ${irqs}; do
     args="${args} --direct-${irq%:*}-irq ${irq#*:}"
   done
@@ -117,20 +123,18 @@
     fi
   done
 
-  # IOs
-  local pmio="128"               # POST
-  pmio="${pmio},178"             # SMI
-  pmio="${pmio},46-47,78-79"     # Super I/O
-  pmio="${pmio},96,98,100,102"   # KBD
-  pmio="${pmio},112-119"         # EC
-  pmio="${pmio},512,516,2048-2559,6144-6399"
-  args="${args} --direct-pmio /dev/port@${pmio}"
+  # Platform IOs
+  args="${args} $(get_platform_pmio)"
 
   # Platform IRQs
-  args="${args} $(get_irqs)"
+  args="${args} $(get_platform_irqs)"
 
   exec /sbin/crosvm-direct run ${args} --params "$(get_cmdline)" /boot/vmlinuz
 }
 
+if [[ -f "/etc/manatee.conf" ]]; then
+  source "/etc/manatee.conf"
+fi
+
 run