mb/emulation/qemu-q35: Define and use MMCONF_BUS_NUMBER

Also refactor the machine type checks to avoid code duplication.

Tested, still boots to payload with 256, 128 and 64 busses.

Change-Id: Ib394ba605bbfeee75aa645e989c23034cceff348
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50025
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/mainboard/emulation/qemu-q35/memmap.c b/src/mainboard/emulation/qemu-q35/memmap.c
index 10b35d7..f3ce42c 100644
--- a/src/mainboard/emulation/qemu-q35/memmap.c
+++ b/src/mainboard/emulation/qemu-q35/memmap.c
@@ -2,6 +2,7 @@
 
 #define __SIMPLE_DEVICE__
 
+#include <assert.h>
 #include <console/console.h>
 #include <cpu/x86/smm.h>
 #include <device/pci_ops.h>
@@ -10,6 +11,28 @@
 
 #include "q35.h"
 
+static uint32_t encode_pciexbar_length(void)
+{
+	switch (CONFIG_MMCONF_BUS_NUMBER) {
+		case 256: return 0 << 1;
+		case 128: return 1 << 1;
+		case  64: return 2 << 1;
+		default:  return dead_code_t(uint32_t);
+	}
+}
+
+uint32_t make_pciexbar(void)
+{
+	return CONFIG_MMCONF_BASE_ADDRESS | encode_pciexbar_length() | 1;
+}
+
+/* Check that MCFG is active. If it's not, QEMU was started for machine PC */
+void mainboard_machine_check(void)
+{
+	if (pci_read_config32(HOST_BRIDGE, D0F0_PCIEXBAR_LO) != make_pciexbar())
+		die("You must run qemu for machine Q35 (-M q35)");
+}
+
 /* QEMU-specific register */
 #define EXT_TSEG_MBYTES	0x50