Skip to contentSkip to conversation

x86: Initial ACPI support for Intel BayTrail

PATCH New Bin Meng 3 participants 44 messages May 2, 2016 – May 7, 2016

Subsystems (2)
lore
Share & tools
lore

Bin Meng

author
#0 lore raw

cover x86: Initial ACPI support for Intel BayTrail

This series introduces initial ACPI support for Intel BayTrail.

Advanced Configuration and Power Interface (ACPI) aims to establish industry-standard interfaces enabling OS-directed configuration, power management, and thermal management of mobile, desktop, and server platforms.

Linux can boot without ACPI with "acpi=off" command line parameter, but with ACPI the kernel gains the capabilities to handle power management. For Windows, ACPI is a must-have firmware feature since Windows Vista. CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in U-Boot. This requires Intel ACPI compiler to be installed on your host to compile ACPI DSDT table written in ASL format to AML format. You can get the compiler via "apt-get install iasl" if you are on Ubuntu or download the source from acpica website to compile one by yourself.

Current ACPI support in U-Boot is not complete. More features will be added in the future. The status as of today is:

* Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
* Support one static DSDT table only, compiled by Intel ACPI compiler.
* Support S0/S5 only, no S3/S4 boot path support yet.
* No ACPI global NVS support (this can be optional, but we may need it in the future to simplify ASL code logic when utilizing NVS variables).
* No dynamic AML bytecodes insertion at run-time (this is optional as we can always describe the board in the static way).
* All ACPI interrupts are routed to SCI for OS to handle. No legacy SMI implementation within U-Boot.
* Install Ubuntu from U-Boot plus SeaBIOS does not work.
* Install Windows 8.1/10 from U-Boot plus SeaBIOS does not work.

So far ACPI is enabled on BayTrail based boards. Testing was done by booting a pre-installed Ubuntu 14.04 from a SATA drive. Most devices seem to work correctly and the board can respond a reboot/shutdown command from Ubuntu.

This series is available at u-boot-x86/acpi-working.

Bin Meng (26):
x86: Drop asm/acpi.h
x86: Fix build warning in tables.c when CONFIG_SEABIOS
x86: acpi: Fix compiler warnings in write_acpi_tables()
x86: irq: Reserve IRQ9 for ACPI in PIC mode
x86: irq: Enable SCI on IRQ9
x86: dts: Update to include ACTL register details
acpi: Change build log for ASL files
acpi: Explicitly spell out dsdt.c in the make rule
acpi: Specify U-Boot include path for ASL files
acpi: Do not disable all errors/warnings/remarks when compiling ASL
x86: acpi: Remove unneeded codes
x86: acpi: Various changes to acpi_table.h
x86: acpi: Reorder codes in acpi_table.h
x86: acpi: Remove acpi_create_ssdt_generator()
x86: acpi: Change fill_header()
x86: acpi: Adjust orders in acpi_table.c
x86: acpi: Change table write routine signature to use u32
x86: acpi: Align FACS table to a 64 byte boundary
x86: acpi: Add some generic ASL libraries
x86: baytrail: Add platform ASL files
x86: baytrail: Generate ACPI FADT/MADT tables
x86: baytrail: Enable ACPI table generation for all boards
x86: baytrail: Add .gitignore for ACPI enabled boards
x86: Remove acpi=off boot parameter when ACPI is on
x86: doc: Minor update for accuracy
x86: doc: Document ACPI support

 arch/x86/cpu/baytrail/Makefile                     |   1 +
 arch/x86/cpu/baytrail/acpi.c                       | 162 +++++++
 arch/x86/cpu/irq.c                                 |  29 ++
 arch/x86/cpu/ivybridge/lpc.c                       |   1 -
 arch/x86/cpu/ivybridge/model_206ax.c               |   1 -
 arch/x86/cpu/ivybridge/northbridge.c               |   1 -
 arch/x86/dts/bayleybay.dts                         |   1 +
 arch/x86/dts/conga-qeval20-qa3-e3845.dts           |   1 +
 arch/x86/dts/crownbay.dts                          |   1 +
 arch/x86/dts/galileo.dts                           |   1 +
 arch/x86/dts/minnowmax.dts                         |   1 +
 arch/x86/dts/qemu-x86_q35.dts                      |   2 +
 arch/x86/include/asm/acpi.h                        |  24 -
 arch/x86/include/asm/acpi/debug.asl                | 136 ++++++
 arch/x86/include/asm/acpi/globutil.asl             | 113 +++++
 arch/x86/include/asm/acpi/statdef.asl              |  82 ++++
 arch/x86/include/asm/acpi_table.h                  | 447 ++++++++-----------
 .../include/asm/arch-baytrail/acpi/irq_helper.h    | 111 +++++
 .../include/asm/arch-baytrail/acpi/irqlinks.asl    | 489 +++++++++++++++++++++
 .../include/asm/arch-baytrail/acpi/irqroute.asl    |  48 ++
 arch/x86/include/asm/arch-baytrail/acpi/irqroute.h |  27 ++
 arch/x86/include/asm/arch-baytrail/acpi/lpc.asl    | 121 +++++
 .../include/asm/arch-baytrail/acpi/platform.asl    |  34 ++
 .../include/asm/arch-baytrail/acpi/sleepstates.asl |  13 +
 .../asm/arch-baytrail/acpi/southcluster.asl        | 211 +++++++++
 arch/x86/include/asm/arch-baytrail/acpi/usb.asl    |  34 ++
 arch/x86/include/asm/arch-baytrail/acpi/xhci.asl   |  31 ++
 arch/x86/include/asm/arch-baytrail/device.h        |  74 ++++
 arch/x86/include/asm/arch-baytrail/iomap.h         |  70 +++
 arch/x86/include/asm/arch-baytrail/irq.h           |  86 ++++
 arch/x86/include/asm/irq.h                         |   4 +
 arch/x86/lib/acpi_table.c                          | 311 ++++++-------
 arch/x86/lib/tables.c                              |   1 +
 board/congatec/conga-qeval20-qa3-e3845/.gitignore  |   3 +
 board/congatec/conga-qeval20-qa3-e3845/Makefile    |   1 +
 .../conga-qeval20-qa3-e3845/acpi/mainboard.asl     |  13 +
 board/congatec/conga-qeval20-qa3-e3845/dsdt.asl    |  14 +
 board/intel/bayleybay/.gitignore                   |   3 +
 board/intel/bayleybay/Makefile                     |   1 +
 board/intel/bayleybay/acpi/mainboard.asl           |  11 +
 board/intel/bayleybay/dsdt.asl                     |  14 +
 board/intel/minnowmax/.gitignore                   |   3 +
 board/intel/minnowmax/Makefile                     |   1 +
 board/intel/minnowmax/acpi/mainboard.asl           |  11 +
 board/intel/minnowmax/dsdt.asl                     |  14 +
 configs/bayleybay_defconfig                        |   1 +
 configs/conga-qeval20-qa3-e3845_defconfig          |   1 +
 configs/minnowmax_defconfig                        |   1 +
 doc/README.x86                                     |  76 +++-
 doc/device-tree-bindings/misc/intel,irq-router.txt |   5 +
 include/configs/x86-common.h                       |   9 +-
 scripts/Makefile.lib                               |   8 +-
 52 files changed, 2368 insertions(+), 491 deletions(-)
 create mode 100644 arch/x86/cpu/baytrail/acpi.c
 delete mode 100644 arch/x86/include/asm/acpi.h
 create mode 100644 arch/x86/include/asm/acpi/debug.asl
 create mode 100644 arch/x86/include/asm/acpi/globutil.asl
 create mode 100644 arch/x86/include/asm/acpi/statdef.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/lpc.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/platform.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/usb.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/xhci.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/device.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/iomap.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/irq.h
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/.gitignore
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/dsdt.asl
 create mode 100644 board/intel/bayleybay/.gitignore
 create mode 100644 board/intel/bayleybay/acpi/mainboard.asl
 create mode 100644 board/intel/bayleybay/dsdt.asl
 create mode 100644 board/intel/minnowmax/.gitignore
 create mode 100644 board/intel/minnowmax/acpi/mainboard.asl
 create mode 100644 board/intel/minnowmax/dsdt.asl
Signature · 1 line
1.8.2.1
author
#1 lore raw

PATCH 1/26 x86: Drop asm/acpi.h

Remove asm/acpi.h which is never used.

---

 arch/x86/cpu/ivybridge/lpc.c         |  1 -
 arch/x86/cpu/ivybridge/model_206ax.c |  1 -
 arch/x86/cpu/ivybridge/northbridge.c |  1 -
 arch/x86/include/asm/acpi.h          | 24 ------------------------
 4 files changed, 27 deletions(-)
 delete mode 100644 arch/x86/include/asm/acpi.h
arch/x86/cpu/ivybridge/lpc.c +0 -1
index 88ab797..ff1faa5 100644
@@ -12,7 +12,6 @@
 #include <fdtdec.h>
 #include <rtc.h>
 #include <pci.h>
-#include <asm/acpi.h>
 #include <asm/intel_regs.h>
 #include <asm/interrupt.h>
 #include <asm/io.h>
arch/x86/cpu/ivybridge/model_206ax.c +0 -1
index cef4256..e710ac4 100644
@@ -12,7 +12,6 @@
 #include <dm.h>
 #include <fdtdec.h>
 #include <malloc.h>
-#include <asm/acpi.h>
 #include <asm/cpu.h>
 #include <asm/cpu_x86.h>
 #include <asm/lapic.h>
arch/x86/cpu/ivybridge/northbridge.c +0 -1
index f7e0bc3..491f289 100644
@@ -10,7 +10,6 @@
 #include <common.h>
 #include <dm.h>
 #include <asm/msr.h>
-#include <asm/acpi.h>
 #include <asm/cpu.h>
 #include <asm/intel_regs.h>
 #include <asm/io.h>
arch/x86/include/asm/acpi.h deleted +0 -24
deleted file mode 100644
index 4872b92..0000000
@@ -1,24 +0,0 @@
-/*
- * From coreboot
- *
- * Copyright (C) 2004 SUSE LINUX AG
- * Copyright (C) 2004 Nick Barker
- * Copyright (C) 2008-2009 coresystems GmbH
- * (Written by Stefan Reinauer <[email protected]>)
- *
- * SPDX-License-Identifier:	GPL-2.0
- */
-
-#ifndef __ASM_ACPI_H
-#define __ASM_ACPI_H
-
-#define RSDP_SIG		"RSD PTR "  /* RSDT pointer signature */
-#define ACPI_TABLE_CREATOR	"U-BootAC"  /* Must be exactly 8 bytes long! */
-#define OEM_ID			"U-Boot"    /* Must be exactly 6 bytes long! */
-#define ASLC			"U-Bo"      /* Must be exactly 4 bytes long! */
-
-/* 0 = S0, 1 = S1 ...*/
-int acpi_get_slp_type(void);
-void apci_set_slp_type(int type);
-
-#endif
Signature · 1 line
1.8.2.1
author
#2 lore raw

PATCH 2/26 x86: Fix build warning in tables.c when CONFIG_SEABIOS

In reply to Bin Meng

The following build warning is seen in tables.c:

warning: implicit declaration of function 'memalign'

Add the missing header file to fix it.

---

 arch/x86/lib/tables.c | 1 +
 1 file changed, 1 insertion(+)
arch/x86/lib/tables.c +1 -0
index a156f2c..1213a9c 100644
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <asm/sfi.h>
 #include <asm/mpspec.h>
 #include <asm/smbios.h>
Signature · 1 line
1.8.2.1
author
#3 lore raw

PATCH 3/26 x86: acpi: Fix compiler warnings in write_acpi_tables()

In reply to Bin Meng

Fix the following two build warnings in function 'write_acpi_tables':

warning: format '%lx' expects argument of type 'long unsigned int', but argument 2 has type 'u32' [-Wformat=]

---

 arch/x86/lib/acpi_table.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/lib/acpi_table.c +2 -2
index 790f6fb..0b1775c 100644
@@ -353,7 +353,7 @@ u32 write_acpi_tables(u32 start)
 	/* Align ACPI tables to 16byte */
 	current = ALIGN(current, 16);
 
-	debug("ACPI: Writing ACPI tables at %lx.\n", start);
+	debug("ACPI: Writing ACPI tables at %x.\n", start);
 
 	/* We need at least an RSDP and an RSDT Table */
 	rsdp = (struct acpi_rsdp *)current;
@@ -432,7 +432,7 @@ u32 write_acpi_tables(u32 start)
 		current = ALIGN(current, 16);
 	}
 
-	debug("current = %lx\n", current);
+	debug("current = %x\n", current);
 
 	debug("ACPI: done.\n");
 
Signature · 1 line
1.8.2.1
author
#4 lore raw

PATCH 4/26 x86: irq: Reserve IRQ9 for ACPI in PIC mode

In reply to Bin Meng

Reserve IRQ9 which is to be used as SCI interrupt number for ACPI in PIC mode.

---

 arch/x86/cpu/irq.c | 4 ++++
 1 file changed, 4 insertions(+)
arch/x86/cpu/irq.c +4 -0
index 2950783..ae90b0c 100644
@@ -120,6 +120,10 @@ static int create_pirq_routing_table(struct udevice *dev)
 
 	priv->irq_mask = fdtdec_get_int(blob, node,
 					"intel,pirq-mask", PIRQ_BITMAP);
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+	/* Reserve IRQ9 for SCI */
+	priv->irq_mask &= ~(1 << 9);
+#endif
 
 	if (priv->config == PIRQ_VIA_IBASE) {
 		int ibase_off;
Signature · 1 line
1.8.2.1
#5 lore raw

PATCH 4/26 x86: irq: Reserve IRQ9 for ACPI in PIC mode

Hi Bin,

Quoted 14 lines · Bin Meng

Reserve IRQ9 which is to be used as SCI interrupt number for ACPI in PIC mode.

---

  arch/x86/cpu/irq.c | 4 ++++
  1 file changed, 4 insertions(+)
arch/x86/cpu/irq.c +0 -0
index 2950783..ae90b0c 100644

arch/x86/cpu/irq.c static int create_pirq_routing_table(struct udevice *dev) · line 126

Quoted 7 lines
arch/x86/cpu/irq.c +4 -0
@@ -120,6 +120,10 @@ static int create_pirq_routing_table(struct udevice *dev)
 
  	priv->irq_mask = fdtdec_get_int(blob, node,
  					"intel,pirq-mask", PIRQ_BITMAP);
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+	/* Reserve IRQ9 for SCI */
+	priv->irq_mask &= ~(1 << 9);
+#endif

Does it make sense to change this into using IS_ENABLED()?

	if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
		/* Reserve IRQ9 for SCI */
		priv->irq_mask &= ~(1 << 9);
	}

To drop the #ifdef here?

Thanks,
Stefan

author
#6 lore raw

PATCH 4/26 x86: irq: Reserve IRQ9 for ACPI in PIC mode

Hi Stefan,

Quoted 30 lines · Stefan Roese

Hi Bin,

Quoted 15 lines · Bin Meng

Reserve IRQ9 which is to be used as SCI interrupt number for ACPI in PIC mode.

---

  arch/x86/cpu/irq.c | 4 ++++
  1 file changed, 4 insertions(+)
arch/x86/cpu/irq.c +0 -0
index 2950783..ae90b0c 100644

arch/x86/cpu/irq.c static int create_pirq_routing_table(struct udevice · line 127

Quoted 8 lines
arch/x86/cpu/irq.c +4 -0
@@ -120,6 +120,10 @@ static int create_pirq_routing_table(struct udevice
 *dev)
 
        priv->irq_mask = fdtdec_get_int(blob, node,
                                        "intel,pirq-mask", PIRQ_BITMAP);
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       /* Reserve IRQ9 for SCI */
+       priv->irq_mask &= ~(1 << 9);
+#endif

Does it make sense to change this into using IS_ENABLED()?

Quoted 7 lines
        if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
                /* Reserve IRQ9 for SCI */
                priv->irq_mask &= ~(1 << 9);
        }

To drop the #ifdef here?

Ah, this bothers me sometimes. I see some places in U-Boot uses #ifdef but IS_ENABLED somewhere else. I am not sure what the recommended guideline of U-Boot with regard to this?

Regards,
Bin

#7 lore raw

PATCH 4/26 x86: irq: Reserve IRQ9 for ACPI in PIC mode

Hi Bin,

Quoted 36 lines · Bin Meng
Quoted 35 lines · Stefan Roese

Hi Bin,

Quoted 15 lines · Bin Meng

Reserve IRQ9 which is to be used as SCI interrupt number for ACPI in PIC mode.

---

   arch/x86/cpu/irq.c | 4 ++++
   1 file changed, 4 insertions(+)
arch/x86/cpu/irq.c +0 -0
index 2950783..ae90b0c 100644

arch/x86/cpu/irq.c static int create_pirq_routing_table(struct udevice · line 127

Quoted 8 lines
arch/x86/cpu/irq.c +4 -0
@@ -120,6 +120,10 @@ static int create_pirq_routing_table(struct udevice
 *dev)
 
         priv->irq_mask = fdtdec_get_int(blob, node,
                                         "intel,pirq-mask", PIRQ_BITMAP);
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       /* Reserve IRQ9 for SCI */
+       priv->irq_mask &= ~(1 << 9);
+#endif

Does it make sense to change this into using IS_ENABLED()?

         if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
                 /* Reserve IRQ9 for SCI */
                 priv->irq_mask &= ~(1 << 9);
         }
Quoted 6 lines
Quoted 2 lines

To drop the #ifdef here?

Ah, this bothers me sometimes. I see some places in U-Boot uses #ifdef but IS_ENABLED somewhere else. I am not sure what the recommended guideline of U-Boot with regard to this?

We definitely strive to remove (or at least not add new) #ifdef's from the U-Boot code base. And IS_ENABLED() is a good way to achieve this. But it can only be used with config options available via Kconfig. And since CONFIG_GENERATE_ACPI_TABLE is a Kconfig symbol, my recommendation is to use it.

Thanks,
Stefan

author
#8 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

In reply to Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

 arch/x86/cpu/irq.c                                 | 25 ++++++++++++++++++++++
 arch/x86/include/asm/irq.h                         |  4 ++++
 doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
 3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +25 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice *dev)
 		priv->ibase &= ~0xf;
 	}
 
+	priv->actl_8bit = fdtdec_get_bool(blob, node, "intel,actl-8bit");
+	priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr", 0);
+
 	cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
 	if (!cell || len % sizeof(struct pirq_routing))
 		return -EINVAL;
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice *dev)
 	return 0;
 }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+	struct irq_router *priv = dev_get_priv(dev);
+
+	if (priv->actl_8bit) {
+		/* Bit7 must be turned on to enable ACPI */
+		dm_pci_write_config8(dev->parent, priv->actl_addr, 0x80);
+	} else {
+		/* Write 0 to enable SCI on IRQ9 */
+		if (priv->config == PIRQ_VIA_PCI)
+			dm_pci_write_config32(dev->parent, priv->actl_addr, 0);
+		else
+			writel(0, priv->ibase + priv->actl_addr);
+	}
+}
+#endif
+
 int irq_router_common_init(struct udevice *dev)
 {
 	int ret;
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
 	pirq_route_irqs(dev, pirq_routing_table->slots,
 			get_irq_slot_count(pirq_routing_table));
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+	irq_enable_sci(dev);
+#endif
+
 	return 0;
 }
 
arch/x86/include/asm/irq.h +4 -0
index 5b9e673..ddb529e 100644
@@ -34,6 +34,8 @@ enum pirq_config {
  *		IRQ N is available to be routed
  * @lb_bdf:	irq router's PCI bus/device/function number encoding
  * @ibase:	IBASE register block base address
+ * @actl_8bit:	ACTL register width is 8-bit (for ICH series chipset)
+ * @actl_addr:	ACTL register offset
  */
 struct irq_router {
 	int config;
@@ -41,6 +43,8 @@ struct irq_router {
 	u16 irq_mask;
 	u32 bdf;
 	u32 ibase;
+	bool actl_8bit;
+	int actl_addr;
 };
 
 struct pirq_routing {
doc/device-tree-bindings/misc/intel,irq-router.txt +5 -0
index e4d8ead..04ad346 100644
@@ -14,6 +14,11 @@ Required properties :
       "ibase": IRQ routing is in the memory-mapped IBASE register block
 - intel,ibase-offset : IBASE register offset in the interrupt router's PCI
     configuration space, required only if intel,pirq-config = "ibase".
+- intel,actl-8bit : If ACTL (ACPI control) register width is 8-bit, this must
+    be specified. The 8-bit ACTL register is seen on ICH series chipset, like
+    ICH9/Panther Point/etc. On Atom chipset it is a 32-bit register.
+- intel,actl-addr : ACTL (ACPI control) register offset. ACTL can be either
+    in the interrupt router's PCI configuration space, or IBASE.
 - intel,pirq-link : Specifies the PIRQ link information with two cells. The
     first cell is the register offset that controls the first PIRQ link routing.
     The second cell is the total number of PIRQ links the router supports.
Signature · 1 line
1.8.2.1
#9 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

Hi Bin,

Quoted 52 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

  arch/x86/cpu/irq.c                                 | 25 ++++++++++++++++++++++
  arch/x86/include/asm/irq.h                         |  4 ++++
  doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
  3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +21 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice *dev)
  		priv->ibase &= ~0xf;
  	}
 
+	priv->actl_8bit = fdtdec_get_bool(blob, node, "intel,actl-8bit");
+	priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr", 0);
+
  	cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
  	if (!cell || len % sizeof(struct pirq_routing))
  		return -EINVAL;
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice *dev)
  	return 0;
  }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+	struct irq_router *priv = dev_get_priv(dev);
+
+	if (priv->actl_8bit) {
+		/* Bit7 must be turned on to enable ACPI */
+		dm_pci_write_config8(dev->parent, priv->actl_addr, 0x80);
+	} else {
+		/* Write 0 to enable SCI on IRQ9 */
+		if (priv->config == PIRQ_VIA_PCI)
+			dm_pci_write_config32(dev->parent, priv->actl_addr, 0);
+		else
+			writel(0, priv->ibase + priv->actl_addr);
+	}
+}
+#endif
+
  int irq_router_common_init(struct udevice *dev)
  {
  	int ret;

arch/x86/cpu/irq.c int irq_router_common_init(struct udevice *dev) · line 254

Quoted 6 lines
arch/x86/cpu/irq.c +3 -0
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
  	pirq_route_irqs(dev, pirq_routing_table->slots,
  			get_irq_slot_count(pirq_routing_table));
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+	irq_enable_sci(dev);
+#endif

Again, this could also use IS_ENABLED.

Thanks,
Stefan

author
#10 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

Hi Stefan,

Quoted 65 lines · Stefan Roese

Hi Bin,

Quoted 61 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

  arch/x86/cpu/irq.c                                 | 25
++++++++++++++++++++++
  arch/x86/include/asm/irq.h                         |  4 ++++
  doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
  3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +3 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice
 *dev)
                priv->ibase &= ~0xf;
        }
 
+       priv->actl_8bit = fdtdec_get_bool(blob, node, "intel,actl-8bit");
+       priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr",
 0);
+
        cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
        if (!cell || len % sizeof(struct pirq_routing))
                return -EINVAL;
arch/x86/cpu/irq.c +18 -0
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice
 *dev)
        return 0;
  }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+       struct irq_router *priv = dev_get_priv(dev);
+
+       if (priv->actl_8bit) {
+               /* Bit7 must be turned on to enable ACPI */
+               dm_pci_write_config8(dev->parent, priv->actl_addr, 0x80);
+       } else {
+               /* Write 0 to enable SCI on IRQ9 */
+               if (priv->config == PIRQ_VIA_PCI)
+                       dm_pci_write_config32(dev->parent,
 priv->actl_addr, 0);
+               else
+                       writel(0, priv->ibase + priv->actl_addr);
+       }
+}
+#endif
+
  int irq_router_common_init(struct udevice *dev)
  {
        int ret;
arch/x86/cpu/irq.c +0 -0
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
        pirq_route_irqs(dev, pirq_routing_table->slots,
                        get_irq_slot_count(pirq_routing_table));
 
Quoted 7 lines

arch/x86/cpu/irq.c int irq_router_common_init(struct udevice *dev) · line 254

Quoted 3 lines
arch/x86/cpu/irq.c +3 -0
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       irq_enable_sci(dev);
+#endif

Again, this could also use IS_ENABLED.

If changing to use IS_ENABLED here, buildman reports:

05: x86: irq: Enable SCI on IRQ9
x86: + coreboot-x86 cougarcanyon2 minnowmax
chromebox_panther chromebook_samus crownbay conga-qeval20-qa3-e3845 efi-x86 bayleybay galileo chromebook_link
+ irq_enable_sci(dev);
+ ^
w+../arch/x86/cpu/irq.c: In function 'irq_router_common_init':
w+../arch/x86/cpu/irq.c:254:3: warning: implicit declaration of function 'irq_enable_sci' [-Wimplicit-function-declaration]

This is due to irq_enable_sci() is wrapped by #ifdef CONFIG_GENERATE_ACPI_TABLE and I don't think IS_ENABLED can be used there.

Regards,
Bin

#11 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

Hi Bin,

Quoted 86 lines · Bin Meng
Quoted 65 lines · Stefan Roese

Hi Bin,

Quoted 61 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

   arch/x86/cpu/irq.c                                 | 25
++++++++++++++++++++++
   arch/x86/include/asm/irq.h                         |  4 ++++
   doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
   3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +3 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice
 *dev)
                 priv->ibase &= ~0xf;
         }
 
+       priv->actl_8bit = fdtdec_get_bool(blob, node, "intel,actl-8bit");
+       priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr",
 0);
+
         cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
         if (!cell || len % sizeof(struct pirq_routing))
                 return -EINVAL;
arch/x86/cpu/irq.c +18 -0
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice
 *dev)
         return 0;
   }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+       struct irq_router *priv = dev_get_priv(dev);
+
+       if (priv->actl_8bit) {
+               /* Bit7 must be turned on to enable ACPI */
+               dm_pci_write_config8(dev->parent, priv->actl_addr, 0x80);
+       } else {
+               /* Write 0 to enable SCI on IRQ9 */
+               if (priv->config == PIRQ_VIA_PCI)
+                       dm_pci_write_config32(dev->parent,
 priv->actl_addr, 0);
+               else
+                       writel(0, priv->ibase + priv->actl_addr);
+       }
+}
+#endif
+
   int irq_router_common_init(struct udevice *dev)
   {
         int ret;
arch/x86/cpu/irq.c +0 -0
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
         pirq_route_irqs(dev, pirq_routing_table->slots,
                         get_irq_slot_count(pirq_routing_table));
 
Quoted 7 lines

arch/x86/cpu/irq.c int irq_router_common_init(struct udevice *dev) · line 254

Quoted 3 lines
arch/x86/cpu/irq.c +3 -0
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       irq_enable_sci(dev);
+#endif

Again, this could also use IS_ENABLED.

If changing to use IS_ENABLED here, buildman reports:

05: x86: irq: Enable SCI on IRQ9
x86: + coreboot-x86 cougarcanyon2 minnowmax
chromebox_panther chromebook_samus crownbay conga-qeval20-qa3-e3845 efi-x86 bayleybay galileo chromebook_link

(quoted diff) +2 -0
+   irq_enable_sci(dev);
+   ^

w+../arch/x86/cpu/irq.c: In function 'irq_router_common_init':
w+../arch/x86/cpu/irq.c:254:3: warning: implicit declaration of function 'irq_enable_sci' [-Wimplicit-function-declaration]

Quoted 3 lines

This is due to irq_enable_sci() is wrapped by #ifdef CONFIG_GENERATE_ACPI_TABLE and I don't think IS_ENABLED can be used there.

Right. This only works in functions. I think the general rule is, that the #ifdef in the code itself are much worse than "just" around a whole function body. Thats why its okay (I think) to do it this way.

Thanks,
Stefan

author
#12 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

Hi Stefan,

Quoted 101 lines · Stefan Roese

Hi Bin,

Quoted 92 lines · Bin Meng
Quoted 69 lines · Stefan Roese

Hi Bin,

Quoted 64 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

   arch/x86/cpu/irq.c                                 | 25
++++++++++++++++++++++
   arch/x86/include/asm/irq.h                         |  4 ++++
   doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
   3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +3 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice
 *dev)
                 priv->ibase &= ~0xf;
         }
 
+       priv->actl_8bit = fdtdec_get_bool(blob, node,
 "intel,actl-8bit");
+       priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr",
 0);
+
         cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
         if (!cell || len % sizeof(struct pirq_routing))
                 return -EINVAL;
arch/x86/cpu/irq.c +18 -0
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice
 *dev)
         return 0;
   }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+       struct irq_router *priv = dev_get_priv(dev);
+
+       if (priv->actl_8bit) {
+               /* Bit7 must be turned on to enable ACPI */
+               dm_pci_write_config8(dev->parent, priv->actl_addr,
 0x80);
+       } else {
+               /* Write 0 to enable SCI on IRQ9 */
+               if (priv->config == PIRQ_VIA_PCI)
+                       dm_pci_write_config32(dev->parent,
 priv->actl_addr, 0);
+               else
+                       writel(0, priv->ibase + priv->actl_addr);
+       }
+}
+#endif
+
   int irq_router_common_init(struct udevice *dev)
   {
         int ret;
arch/x86/cpu/irq.c +0 -0
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
         pirq_route_irqs(dev, pirq_routing_table->slots,
                         get_irq_slot_count(pirq_routing_table));
 
Quoted 8 lines

arch/x86/cpu/irq.c int irq_router_common_init(struct udevice *dev) · line 254

Quoted 3 lines
arch/x86/cpu/irq.c +3 -0
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       irq_enable_sci(dev);
+#endif

Again, this could also use IS_ENABLED.

If changing to use IS_ENABLED here, buildman reports:

05: x86: irq: Enable SCI on IRQ9
x86: + coreboot-x86 cougarcanyon2 minnowmax
chromebox_panther chromebook_samus crownbay conga-qeval20-qa3-e3845 efi-x86 bayleybay galileo chromebook_link

(quoted diff) +2 -0
+   irq_enable_sci(dev);
+   ^

w+../arch/x86/cpu/irq.c: In function 'irq_router_common_init':
w+../arch/x86/cpu/irq.c:254:3: warning: implicit declaration of function 'irq_enable_sci' [-Wimplicit-function-declaration]

Quoted 3 lines

This is due to irq_enable_sci() is wrapped by #ifdef CONFIG_GENERATE_ACPI_TABLE and I don't think IS_ENABLED can be used there.

Quoted 5 lines

Right. This only works in functions. I think the general rule is, that the #ifdef in the code itself are much worse than "just" around a whole function body. Thats why its okay (I think) to do it this way.

So for this commit, leave it as it was?

Regards,
Bin

#13 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

Hi Bin,

Quoted 102 lines · Bin Meng
Quoted 101 lines · Stefan Roese

Hi Bin,

Quoted 95 lines · Bin Meng
Quoted 69 lines · Stefan Roese

Hi Bin,

Quoted 64 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

    arch/x86/cpu/irq.c                                 | 25
++++++++++++++++++++++
    arch/x86/include/asm/irq.h                         |  4 ++++
    doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
    3 files changed, 34 insertions(+)
arch/x86/cpu/irq.c +3 -0
index ae90b0c..487ac23 100644
@@ -146,6 +146,9 @@ static int create_pirq_routing_table(struct udevice
 *dev)
                  priv->ibase &= ~0xf;
          }
 
+       priv->actl_8bit = fdtdec_get_bool(blob, node,
 "intel,actl-8bit");
+       priv->actl_addr = fdtdec_get_int(blob, node, "intel,actl-addr",
 0);
+
          cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
          if (!cell || len % sizeof(struct pirq_routing))
                  return -EINVAL;
arch/x86/cpu/irq.c +18 -0
@@ -215,6 +218,24 @@ static int create_pirq_routing_table(struct udevice
 *dev)
          return 0;
    }
 
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+static void irq_enable_sci(struct udevice *dev)
+{
+       struct irq_router *priv = dev_get_priv(dev);
+
+       if (priv->actl_8bit) {
+               /* Bit7 must be turned on to enable ACPI */
+               dm_pci_write_config8(dev->parent, priv->actl_addr,
 0x80);
+       } else {
+               /* Write 0 to enable SCI on IRQ9 */
+               if (priv->config == PIRQ_VIA_PCI)
+                       dm_pci_write_config32(dev->parent,
 priv->actl_addr, 0);
+               else
+                       writel(0, priv->ibase + priv->actl_addr);
+       }
+}
+#endif
+
    int irq_router_common_init(struct udevice *dev)
    {
          int ret;
arch/x86/cpu/irq.c +0 -0
@@ -228,6 +249,10 @@ int irq_router_common_init(struct udevice *dev)
          pirq_route_irqs(dev, pirq_routing_table->slots,
                          get_irq_slot_count(pirq_routing_table));
 
Quoted 8 lines

arch/x86/cpu/irq.c int irq_router_common_init(struct udevice *dev) · line 254

Quoted 3 lines
arch/x86/cpu/irq.c +3 -0
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+       irq_enable_sci(dev);
+#endif

Again, this could also use IS_ENABLED.

If changing to use IS_ENABLED here, buildman reports:

05: x86: irq: Enable SCI on IRQ9
x86: + coreboot-x86 cougarcanyon2 minnowmax
chromebox_panther chromebook_samus crownbay conga-qeval20-qa3-e3845 efi-x86 bayleybay galileo chromebook_link

(quoted diff) +2 -0
+   irq_enable_sci(dev);
+   ^

w+../arch/x86/cpu/irq.c: In function 'irq_router_common_init':
w+../arch/x86/cpu/irq.c:254:3: warning: implicit declaration of function 'irq_enable_sci' [-Wimplicit-function-declaration]

This is due to irq_enable_sci() is wrapped by #ifdef CONFIG_GENERATE_ACPI_TABLE and I don't think IS_ENABLED can be used there.

Quoted 7 lines
Quoted 5 lines

Right. This only works in functions. I think the general rule is, that the #ifdef in the code itself are much worse than "just" around a whole function body. Thats why its okay (I think) to do it this way.

So for this commit, leave it as it was?

What does the compiler generate when you remove the #ifdef around the function body?

Thanks,
Stefan

#14 lore raw

PATCH 5/26 x86: irq: Enable SCI on IRQ9

In reply to Bin Meng
Quoted 11 lines · Bin Meng

By default SCI is disabled after power on. ACTL is the register to enable SCI and route it to PIC/APIC. To support both ACPI in PIC mode and APIC mode, configure SCI to use IRQ9.

---

 arch/x86/cpu/irq.c                                 | 25 ++++++++++++++++++++++
 arch/x86/include/asm/irq.h                         |  4 ++++
 doc/device-tree-bindings/misc/intel,irq-router.txt |  5 +++++
 3 files changed, 34 insertions(+)
author
#15 lore raw

PATCH 6/26 x86: dts: Update to include ACTL register details

In reply to Bin Meng

This updates all x86 boards that currently have IRQ router in the dts files to include ACTL register details.

---

 arch/x86/dts/bayleybay.dts               | 1 +
 arch/x86/dts/conga-qeval20-qa3-e3845.dts | 1 +
 arch/x86/dts/crownbay.dts                | 1 +
 arch/x86/dts/galileo.dts                 | 1 +
 arch/x86/dts/minnowmax.dts               | 1 +
 arch/x86/dts/qemu-x86_q35.dts            | 2 ++
 6 files changed, 7 insertions(+)
arch/x86/dts/bayleybay.dts +1 -0
index 4ea9262..444de1b 100644
@@ -84,6 +84,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
arch/x86/dts/conga-qeval20-qa3-e3845.dts +1 -0
index 478dece..624d66d 100644
@@ -88,6 +88,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
arch/x86/dts/crownbay.dts +1 -0
index 337513b..78a1ef4 100644
@@ -154,6 +154,7 @@
 			irq-router {
 				compatible = "intel,queensbay-irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-addr = <0x58>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0xcee0>;
 				intel,pirq-routing = <
arch/x86/dts/galileo.dts +1 -0
index 21c3641..f784c50 100644
@@ -88,6 +88,7 @@
 			irq-router {
 				compatible = "intel,quark-irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-addr = <0x58>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0xdef8>;
 				intel,pirq-routing = <
arch/x86/dts/minnowmax.dts +1 -0
index 60bd05a..a6c86c9 100644
@@ -117,6 +117,7 @@
 				compatible = "intel,irq-router";
 				intel,pirq-config = "ibase";
 				intel,ibase-offset = <0x50>;
+				intel,actl-addr = <0>;
 				intel,pirq-link = <8 8>;
 				intel,pirq-mask = <0xdee0>;
 				intel,pirq-routing = <
arch/x86/dts/qemu-x86_q35.dts +2 -0
index 5d601b3..0d462a9 100644
@@ -69,6 +69,8 @@
 			irq-router {
 				compatible = "intel,irq-router";
 				intel,pirq-config = "pci";
+				intel,actl-8bit;
+				intel,actl-addr = <0x44>;
 				intel,pirq-link = <0x60 8>;
 				intel,pirq-mask = <0x0e40>;
 				intel,pirq-routing = <
Signature · 1 line
1.8.2.1
author
#16 lore raw

PATCH 7/26 acpi: Change build log for ASL files

In reply to Bin Meng

Currently when compiling U-Boot with ASL file, the build log says:

ASL board/intel/bayleybay/dsdt.c

This looks odd as ASL compiler's input is ASL file, not C file. Change the make rule to use $< instead.

---

 scripts/Makefile.lib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.lib +1 -1
index ad1d9b5..4f882f1 100644
@@ -323,7 +323,7 @@ $(obj)/%.S: $(src)/%.ttf
 
 # ACPI
 # ---------------------------------------------------------------------------
-quiet_cmd_acpi_c_asl= ASL     $@
+quiet_cmd_acpi_c_asl= ASL     $<
 cmd_acpi_c_asl=         \
 	$(CPP) -x assembler-with-cpp -P -o $<.tmp $<; \
 	iasl -p $< -tc -va $<.tmp; \
Signature · 1 line
1.8.2.1
author
#17 lore raw

PATCH 8/26 acpi: Explicitly spell out dsdt.c in the make rule

In reply to Bin Meng

Currently the make rule for dsdt.c uses a wildcard, as below:

  $(obj)/%.c:    $(src)/%.asl

To avoid any side effect, explicitly mention dsdt.c as this is the file we intend to use for ACPI DSDT AML generation.

---

 scripts/Makefile.lib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.lib +1 -1
index 4f882f1..85b5819 100644
@@ -329,7 +329,7 @@ cmd_acpi_c_asl=         \
 	iasl -p $< -tc -va $<.tmp; \
 	mv $(patsubst %.asl,%.hex,$<) $@
 
-$(obj)/%.c:    $(src)/%.asl
+$(obj)/dsdt.c:    $(src)/dsdt.asl
 	$(call cmd,acpi_c_asl)
 
 # Bzip2
Signature · 1 line
1.8.2.1
author
#18 lore raw

PATCH 9/26 acpi: Specify U-Boot include path for ASL files

In reply to Bin Meng

It will be much easier if we split the whole dsdt.asl file into multiple smaller ASL parts and have access to U-Boot include files.

---

 scripts/Makefile.lib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.lib +1 -1
index 85b5819..5f0b050 100644
@@ -325,7 +325,7 @@ $(obj)/%.S: $(src)/%.ttf
 # ---------------------------------------------------------------------------
 quiet_cmd_acpi_c_asl= ASL     $<
 cmd_acpi_c_asl=         \
-	$(CPP) -x assembler-with-cpp -P -o $<.tmp $<; \
+	$(CPP) -x assembler-with-cpp -P $(UBOOTINCLUDE) -o $<.tmp $<; \
 	iasl -p $< -tc -va $<.tmp; \
 	mv $(patsubst %.asl,%.hex,$<) $@
 
Signature · 1 line
1.8.2.1
author
#19 lore raw

PATCH 10/26 acpi: Do not disable all errors/warnings/remarks when compiling ASL

In reply to Bin Meng

Remove -va option when invoking IASL compiler so that we can see errors/warnings/remarks in the build log.

---

 scripts/Makefile.lib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.lib +1 -1
index 5f0b050..44534e1 100644
@@ -326,7 +326,7 @@ $(obj)/%.S: $(src)/%.ttf
 quiet_cmd_acpi_c_asl= ASL     $<
 cmd_acpi_c_asl=         \
 	$(CPP) -x assembler-with-cpp -P $(UBOOTINCLUDE) -o $<.tmp $<; \
-	iasl -p $< -tc -va $<.tmp; \
+	iasl -p $< -tc $<.tmp; \
 	mv $(patsubst %.asl,%.hex,$<) $@
 
 $(obj)/dsdt.c:    $(src)/dsdt.asl
Signature · 1 line
1.8.2.1
author
#20 lore raw

PATCH 11/26 x86: acpi: Remove unneeded codes

In reply to Bin Meng

- Remove #include <> header files.
- Remove APM_CNT register defines, which should not be here as they are SMI related.
- Remove MP_IRQ_ defines as they are duplicates of the same ones in asm/mpspec.h.
- Remove ACTL register defines, which should not be here as they are chipset specific.
- Remove functional fixed hardware defines, which are not used.
- Remove dev_scope related defines, which are not used.

---

 arch/x86/include/asm/acpi_table.h | 68 ---------------------------------------
 1 file changed, 68 deletions(-)
arch/x86/include/asm/acpi_table.h +0 -68
index 9856fa6..e82752a 100644
@@ -6,11 +6,6 @@
  * SPDX-License-Identifier: GPL-2.0+
  */
 
-#include <common.h>
-#include <malloc.h>
-#include <asm/post.h>
-#include <linux/string.h>
-
 #define RSDP_SIG		"RSD PTR "	/* RSDT pointer signature */
 #define ACPI_TABLE_CREATOR	"UBOOT   "	/* Must be 8 bytes long! */
 #define OEM_ID			"UBOOT "	/* Must be 6 bytes long! */
@@ -19,42 +14,6 @@
 #define OEM_REVISION	42
 #define ASL_COMPILER_REVISION	42
 
-/* IO ports to generate SMIs */
-#define APM_CNT			0xb2
-#define APM_CNT_CST_CONTROL	0x85
-#define APM_CNT_PST_CONTROL	0x80
-#define APM_CNT_ACPI_DISABLE	0x1e
-#define APM_CNT_ACPI_ENABLE	0xe1
-#define APM_CNT_MBI_UPDATE	0xeb
-#define APM_CNT_GNVS_UPDATE	0xea
-#define APM_CNT_FINALIZE	0xcb
-#define APM_CNT_LEGACY		0xcc
-#define APM_ST			0xb3
-
-/* Multiple Processor Interrupts */
-#define MP_IRQ_POLARITY_DEFAULT	0x0
-#define MP_IRQ_POLARITY_HIGH	0x1
-#define MP_IRQ_POLARITY_LOW	0x3
-#define MP_IRQ_POLARITY_MASK	0x3
-#define MP_IRQ_TRIGGER_DEFAULT	0x0
-#define MP_IRQ_TRIGGER_EDGE	0x4
-#define MP_IRQ_TRIGGER_LEVEL	0xc
-#define MP_IRQ_TRIGGER_MASK	0xc
-
-/*
- * Interrupt assigned for SCI in order to
- * create the ACPI MADT IRQ override entry
- */
-#define ACTL		0x00
-#define SCIS_MASK	0x07
-#define SCIS_IRQ9	0x00
-#define SCIS_IRQ10	0x01
-#define SCIS_IRQ11	0x02
-#define SCIS_IRQ20	0x04
-#define SCIS_IRQ21	0x05
-#define SCIS_IRQ22	0x06
-#define SCIS_IRQ23	0x07
-
 #define ACPI_REV_ACPI_1_0	1
 #define ACPI_REV_ACPI_2_0	1
 #define ACPI_REV_ACPI_3_0	2
@@ -105,14 +64,6 @@ enum acpi_address_space_type {
 	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
 };
 
-/* functional fixed hardware */
-#define ACPI_FFIXEDHW_VENDOR_INTEL	1	/* Intel */
-#define ACPI_FFIXEDHW_CLASS_HLT		0	/* C1 Halt */
-#define ACPI_FFIXEDHW_CLASS_IO_HLT	1	/* C1 I/O then Halt */
-#define ACPI_FFIXEDHW_CLASS_MWAIT	2	/* MWAIT Native C-state */
-#define ACPI_FFIXEDHW_FLAG_HW_COORD	1	/* Hardware Coordination bit */
-#define ACPI_FFIXEDHW_FLAG_BM_STS	2	/* BM_STS avoidance bit */
-
 /* Access size definitions for Generic address structure */
 enum acpi_address_space_size {
 	ACPI_ACCESS_SIZE_UNDEFINED = 0,	/* Undefined (legacy reasons) */
@@ -172,25 +123,6 @@ struct acpi_madt {
 	u32 flags;			/* Multiple APIC flags */
 } acpi_madt_t;
 
-enum dev_scope_type {
-	SCOPE_PCI_ENDPOINT = 1,
-	SCOPE_PCI_SUB = 2,
-	SCOPE_IOAPIC = 3,
-	SCOPE_MSI_HPET = 4
-};
-
-typedef struct dev_scope {
-	u8 type;
-	u8 length;
-	u8 reserved[2];
-	u8 enumeration;
-	u8 start_bus;
-	struct {
-		u8 dev;
-		u8 fn;
-	} path[0];
-} __packed dev_scope_t;
-
 /* MADT: APIC Structure Type*/
 enum acpi_apic_types {
 	LOCALAPIC	= 0,	/* Processor local APIC */
Signature · 1 line
1.8.2.1
#21 lore raw

PATCH 11/26 x86: acpi: Remove unneeded codes

Hi Bin,

only a minor nitpicking comment about the patch subject. Perhaps its better to say:

x86: acpi: Remove unused code

Quoted 107 lines · Bin Meng

- Remove #include <> header files.
- Remove APM_CNT register defines, which should not be here as they are SMI related.
- Remove MP_IRQ_ defines as they are duplicates of the same ones in asm/mpspec.h.
- Remove ACTL register defines, which should not be here as they are chipset specific.
- Remove functional fixed hardware defines, which are not used.
- Remove dev_scope related defines, which are not used.

---

  arch/x86/include/asm/acpi_table.h | 68 ---------------------------------------
  1 file changed, 68 deletions(-)
arch/x86/include/asm/acpi_table.h +0 -61
index 9856fa6..e82752a 100644
@@ -6,11 +6,6 @@
   * SPDX-License-Identifier: GPL-2.0+
   */
 
-#include <common.h>
-#include <malloc.h>
-#include <asm/post.h>
-#include <linux/string.h>
-
  #define RSDP_SIG		"RSD PTR "	/* RSDT pointer signature */
  #define ACPI_TABLE_CREATOR	"UBOOT   "	/* Must be 8 bytes long! */
  #define OEM_ID			"UBOOT "	/* Must be 6 bytes long! */
@@ -19,42 +14,6 @@
  #define OEM_REVISION	42
  #define ASL_COMPILER_REVISION	42
 
-/* IO ports to generate SMIs */
-#define APM_CNT			0xb2
-#define APM_CNT_CST_CONTROL	0x85
-#define APM_CNT_PST_CONTROL	0x80
-#define APM_CNT_ACPI_DISABLE	0x1e
-#define APM_CNT_ACPI_ENABLE	0xe1
-#define APM_CNT_MBI_UPDATE	0xeb
-#define APM_CNT_GNVS_UPDATE	0xea
-#define APM_CNT_FINALIZE	0xcb
-#define APM_CNT_LEGACY		0xcc
-#define APM_ST			0xb3
-
-/* Multiple Processor Interrupts */
-#define MP_IRQ_POLARITY_DEFAULT	0x0
-#define MP_IRQ_POLARITY_HIGH	0x1
-#define MP_IRQ_POLARITY_LOW	0x3
-#define MP_IRQ_POLARITY_MASK	0x3
-#define MP_IRQ_TRIGGER_DEFAULT	0x0
-#define MP_IRQ_TRIGGER_EDGE	0x4
-#define MP_IRQ_TRIGGER_LEVEL	0xc
-#define MP_IRQ_TRIGGER_MASK	0xc
-
-/*
- * Interrupt assigned for SCI in order to
- * create the ACPI MADT IRQ override entry
- */
-#define ACTL		0x00
-#define SCIS_MASK	0x07
-#define SCIS_IRQ9	0x00
-#define SCIS_IRQ10	0x01
-#define SCIS_IRQ11	0x02
-#define SCIS_IRQ20	0x04
-#define SCIS_IRQ21	0x05
-#define SCIS_IRQ22	0x06
-#define SCIS_IRQ23	0x07
-
  #define ACPI_REV_ACPI_1_0	1
  #define ACPI_REV_ACPI_2_0	1
  #define ACPI_REV_ACPI_3_0	2
@@ -105,14 +64,6 @@ enum acpi_address_space_type {
  	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
  };
 
-/* functional fixed hardware */
-#define ACPI_FFIXEDHW_VENDOR_INTEL	1	/* Intel */
-#define ACPI_FFIXEDHW_CLASS_HLT		0	/* C1 Halt */
-#define ACPI_FFIXEDHW_CLASS_IO_HLT	1	/* C1 I/O then Halt */
-#define ACPI_FFIXEDHW_CLASS_MWAIT	2	/* MWAIT Native C-state */
-#define ACPI_FFIXEDHW_FLAG_HW_COORD	1	/* Hardware Coordination bit */
-#define ACPI_FFIXEDHW_FLAG_BM_STS	2	/* BM_STS avoidance bit */
-
  /* Access size definitions for Generic address structure */
  enum acpi_address_space_size {
  	ACPI_ACCESS_SIZE_UNDEFINED = 0,	/* Undefined (legacy reasons) */
@@ -172,25 +123,6 @@ struct acpi_madt {
  	u32 flags;			/* Multiple APIC flags */
  } acpi_madt_t;
 
-enum dev_scope_type {
-	SCOPE_PCI_ENDPOINT = 1,
-	SCOPE_PCI_SUB = 2,
-	SCOPE_IOAPIC = 3,
-	SCOPE_MSI_HPET = 4
-};
-
-typedef struct dev_scope {
-	u8 type;
-	u8 length;
-	u8 reserved[2];
-	u8 enumeration;

arch/x86/include/asm/acpi_table.h struct acpi_madt { · line 128

Quoted 10 lines
arch/x86/include/asm/acpi_table.h +0 -7
-	u8 start_bus;
-	struct {
-		u8 dev;
-		u8 fn;
-	} path[0];
-} __packed dev_scope_t;
-
  /* MADT: APIC Structure Type*/
  enum acpi_apic_types {
  	LOCALAPIC	= 0,	/* Processor local APIC */

Thanks,
Stefan

author
#22 lore raw

PATCH 12/26 x86: acpi: Various changes to acpi_table.h

In reply to Bin Meng

- Use "U-BOOT" and "U-BOOTBL" for the OEM ID and OEM table ID.
- Do not typedef acpi_header_t, instead use struct acpi_table_hader.
- Use a shorter name aslc_id and aslc-revision.
- Change MCFG base address to use 32-bit value pairs (_l and _h).
- Apply ACPI_APIC_ prefix to MADT APIC type macros and make their names to be more readable.
- Apply __packed to struct acpi_madt_irqoverride and struct acpi_madt_lapic_nmi tables, which are not naturally aligned by the compiler.
- Rename model to res1 as it is reserved after ACPI spec 1.0.
- Apply ACPI_ prefix to the PM profile macros and change them to enum.
- Add ospm_flags to FACS structure which is defined since ACPI 4.0.

---

 arch/x86/include/asm/acpi_table.h | 72 +++++++++++++++++++++------------------
 arch/x86/lib/acpi_table.c         | 71 ++++++++++++++++++++------------------
 2 files changed, 75 insertions(+), 68 deletions(-)
arch/x86/include/asm/acpi_table.h +38 -34
index e82752a..418870e 100644
@@ -6,10 +6,10 @@
  * SPDX-License-Identifier: GPL-2.0+
  */
 
-#define RSDP_SIG		"RSD PTR "	/* RSDT pointer signature */
-#define ACPI_TABLE_CREATOR	"UBOOT   "	/* Must be 8 bytes long! */
-#define OEM_ID			"UBOOT "	/* Must be 6 bytes long! */
-#define ASLC			"INTL"		/* Must be 4 bytes long! */
+#define RSDP_SIG		"RSD PTR "	/* RSDP pointer signature */
+#define OEM_ID			"U-BOOT"	/* U-Boot */
+#define OEM_TABLE_ID		"U-BOOTBL"	/* U-Boot Table */
+#define ASLC_ID			"INTL"		/* Intel ASL Compiler */
 
 #define OEM_REVISION	42
 #define ASL_COMPILER_REVISION	42
@@ -74,7 +74,7 @@ enum acpi_address_space_size {
 };
 
 /* Generic ACPI header, provided by (almost) all tables */
-typedef struct acpi_table_header {
+struct acpi_table_header {
 	char signature[4];	/* ACPI signature (4 ASCII characters) */
 	u32 length;		/* Table length in bytes (incl. header) */
 	u8 revision;		/* Table version (not ACPI version!) */
@@ -82,9 +82,9 @@ typedef struct acpi_table_header {
 	char oem_id[6];		/* OEM identification */
 	char oem_table_id[8];	/* OEM table identification */
 	u32 oem_revision;	/* OEM revision number */
-	char asl_compiler_id[4]; /* ASL compiler vendor ID */
-	u32 asl_compiler_revision; /* ASL compiler revision number */
-} acpi_header_t;
+	char aslc_id[4];	/* ASL compiler vendor ID */
+	u32 aslc_revision;	/* ASL compiler revision number */
+};
 
 /* A maximum number of 32 ACPI tables ought to be enough for now */
 #define MAX_ACPI_TABLES	32
@@ -108,8 +108,8 @@ struct acpi_mcfg {
 };
 
 struct acpi_mcfg_mmconfig {
-	u32 base_address;
-	u32 base_reserved;
+	u32 base_address_l;
+	u32 base_address_h;
 	u16 pci_segment_group_number;
 	u8 start_bus_number;
 	u8 end_bus_number;
@@ -125,17 +125,17 @@ struct acpi_madt {
 
 /* MADT: APIC Structure Type*/
 enum acpi_apic_types {
-	LOCALAPIC	= 0,	/* Processor local APIC */
-	IOAPIC,			/* I/O APIC */
-	IRQSOURCEOVERRIDE,	/* Interrupt source override */
-	NMITYPE,		/* NMI source */
-	LOCALNMITYPE, 		/* Local APIC NMI */
-	LAPICADDRESSOVERRIDE,	/* Local APIC address override */
-	IOSAPIC,		/* I/O SAPIC */
-	LOCALSAPIC,		/* Local SAPIC */
-	PLATFORMIRQSOURCES,	/* Platform interrupt sources */
-	LOCALX2SAPIC,		/* Processor local x2APIC */
-	LOCALX2APICNMI,		/* Local x2APIC NMI */
+	ACPI_APIC_LAPIC	= 0,		/* Processor local APIC */
+	ACPI_APIC_IOAPIC,		/* I/O APIC */
+	ACPI_APIC_IRQ_SRC_OVERRIDE,	/* Interrupt source override */
+	ACPI_APIC_NMI_SRC,		/* NMI source */
+	ACPI_APIC_LAPIC_NMI,		/* Local APIC NMI */
+	ACPI_APIC_LAPIC_ADDR_OVERRIDE,	/* Local APIC address override */
+	ACPI_APIC_IOSAPIC,		/* I/O SAPIC */
+	ACPI_APIC_LSAPIC,		/* Local SAPIC */
+	ACPI_APIC_PLATFORM_IRQ_SRC,	/* Platform interrupt sources */
+	ACPI_APIC_LX2APIC,		/* Processor local x2APIC */
+	ACPI_APIC_LX2APIC_NMI,		/* Local x2APIC NMI */
 };
 
 /* MADT: Processor Local APIC Structure */
@@ -153,7 +153,7 @@ struct acpi_madt_lapic {
 /* bits 1-31: reserved */
 
 /* MADT: Local APIC NMI Structure */
-struct acpi_madt_lapic_nmi {
+struct __packed acpi_madt_lapic_nmi {
 	u8 type;		/* Type (4) */
 	u8 length;		/* Length in bytes (6) */
 	u8 processor_id;	/* ACPI processor ID */
@@ -172,7 +172,7 @@ struct acpi_madt_ioapic {
 };
 
 /* MADT: Interrupt Source Override Structure */
-struct acpi_madt_irqoverride {
+struct __packed acpi_madt_irqoverride {
 	u8 type;		/* Type (2) */
 	u8 length;		/* Length in bytes (10) */
 	u8 bus;			/* ISA (0) */
@@ -186,7 +186,7 @@ struct __packed acpi_fadt {
 	struct acpi_table_header header;
 	u32 firmware_ctrl;
 	u32 dsdt;
-	u8 model;
+	u8 res1;
 	u8 preferred_pm_profile;
 	u16 sci_int;
 	u32 smi_cmd;
@@ -281,15 +281,17 @@ struct __packed acpi_fadt {
 #define ACPI_FADT_LEGACY_FREE		0x00
 
 /* FADT Preferred Power Management Profile */
-#define PM_UNSPECIFIED		0
-#define PM_DESKTOP		1
-#define PM_MOBILE		2
-#define PM_WORKSTATION		3
-#define PM_ENTERPRISE_SERVER	4
-#define PM_SOHO_SERVER		5
-#define PM_APPLIANCE_PC		6
-#define PM_PERFORMANCE_SERVER	7
-#define PM_TABLET		8	/* ACPI 5.0 */
+enum acpi_pm_profile {
+	ACPI_PM_UNSPECIFIED = 0,
+	ACPI_PM_DESKTOP,
+	ACPI_PM_MOBILE,
+	ACPI_PM_WORKSTATION,
+	ACPI_PM_ENTERPRISE_SERVER,
+	ACPI_PM_SOHO_SERVER,
+	ACPI_PM_APPLIANCE_PC,
+	ACPI_PM_PERFORMANCE_SERVER,
+	ACPI_PM_TABLET
+};
 
 /* FACS (Firmware ACPI Control Structure) */
 struct acpi_facs {
@@ -302,7 +304,9 @@ struct acpi_facs {
 	u32 x_firmware_waking_vector_l;		/* X FW waking vector, low */
 	u32 x_firmware_waking_vector_h;		/* X FW waking vector, high */
 	u8 version;				/* ACPI 4.0: 2 */
-	u8 resv[31];				/* FIXME: 4.0: ospm_flags */
+	u8 res1[3];
+	u32 ospm_flags;				/* OSPM enabled flags */
+	u8 res2[24];
 };
 
 /* FACS flags */
arch/x86/lib/acpi_table.c +37 -34

187 lines not on this page · raw message

Signature · 1 line
1.8.2.1
author
#23 lore raw

PATCH 13/26 x86: acpi: Reorder codes in acpi_table.h

In reply to Bin Meng

Reorder the ACPI tables appearance by following the order:
RSDP, RSDT, XSDT, FADT, FACS, MADT, MCFG. And adjust the table flags defines accordingly.

---

 arch/x86/include/asm/acpi_table.h | 347 +++++++++++++++++++-------------------
 1 file changed, 169 insertions(+), 178 deletions(-)
arch/x86/include/asm/acpi_table.h +169 -178
index 418870e..9175e7a 100644
@@ -2,6 +2,7 @@
  * Based on acpi.c from coreboot
  *
  * Copyright (C) 2015, Saket Sinha <[email protected]>
+ * Copyright (C) 2016, Bin Meng <[email protected]>
  *
  * SPDX-License-Identifier: GPL-2.0+
  */
@@ -11,33 +12,9 @@
 #define OEM_TABLE_ID		"U-BOOTBL"	/* U-Boot Table */
 #define ASLC_ID			"INTL"		/* Intel ASL Compiler */
 
-#define OEM_REVISION	42
-#define ASL_COMPILER_REVISION	42
-
-#define ACPI_REV_ACPI_1_0	1
-#define ACPI_REV_ACPI_2_0	1
-#define ACPI_REV_ACPI_3_0	2
-#define ACPI_REV_ACPI_4_0	3
-#define ACPI_REV_ACPI_5_0	5
-
 #define ACPI_RSDP_REV_ACPI_1_0	0
 #define ACPI_RSDP_REV_ACPI_2_0	2
 
-typedef struct acpi_gen_regaddr {
-	u8  space_id;	/* Address space ID */
-	u8  bit_width;	/* Register size in bits */
-	u8  bit_offset;	/* Register bit offset */
-	union {
-		/* Reserved in ACPI 2.0 - 2.0b */
-		u8  resv;
-		/* Access size in ACPI 2.0c/3.0/4.0/5.0 */
-		u8  access_size;
-	};
-	u32 addrl;	/* Register address, low 32 bits */
-	u32 addrh;	/* Register address, high 32 bits */
-} acpi_addr_t;
-
-
 /*
  * RSDP (Root System Description Pointer)
  * Note: ACPI 1.0 didn't have length, xsdt_address, and ext_checksum
@@ -46,7 +23,7 @@ struct acpi_rsdp {
 	char signature[8];	/* RSDP signature */
 	u8 checksum;		/* Checksum of the first 20 bytes */
 	char oem_id[6];		/* OEM ID */
-	u8 revision;		/* 0 for ACPI 1.0, 2 for ACPI 2.0/3.0/4.0 */
+	u8 revision;		/* 0 for ACPI 1.0, others 2 */
 	u32 rsdt_address;	/* Physical address of RSDT (32 bits) */
 	u32 length;		/* Total RSDP length (incl. extended part) */
 	u64 xsdt_address;	/* Physical address of XSDT (64 bits) */
@@ -54,24 +31,11 @@ struct acpi_rsdp {
 	u8 reserved[3];
 };
 
-enum acpi_address_space_type {
-	ACPI_ADDRESS_SPACE_MEMORY = 0,	/* System memory */
-	ACPI_ADDRESS_SPACE_IO,		/* System I/O */
-	ACPI_ADDRESS_SPACE_PCI,		/* PCI config space */
-	ACPI_ADDRESS_SPACE_EC,		/* Embedded controller */
-	ACPI_ADDRESS_SPACE_SMBUS,	/* SMBus */
-	ACPI_ADDRESS_SPACE_PCC = 0x0a,	/* Platform Comm. Channel */
-	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
-};
-
-/* Access size definitions for Generic address structure */
-enum acpi_address_space_size {
-	ACPI_ACCESS_SIZE_UNDEFINED = 0,	/* Undefined (legacy reasons) */
-	ACPI_ACCESS_SIZE_BYTE_ACCESS = 1,
-	ACPI_ACCESS_SIZE_WORD_ACCESS = 2,
-	ACPI_ACCESS_SIZE_DWORD_ACCESS = 3,
-	ACPI_ACCESS_SIZE_QWORD_ACCESS = 4
-};
+#define ACPI_REV_ACPI_1_0	1
+#define ACPI_REV_ACPI_2_0	1
+#define ACPI_REV_ACPI_3_0	2
+#define ACPI_REV_ACPI_4_0	3
+#define ACPI_REV_ACPI_5_0	5
 
 /* Generic ACPI header, provided by (almost) all tables */
 struct acpi_table_header {
@@ -87,7 +51,7 @@ struct acpi_table_header {
 };
 
 /* A maximum number of 32 ACPI tables ought to be enough for now */
-#define MAX_ACPI_TABLES	32
+#define MAX_ACPI_TABLES		32
 
 /* RSDT (Root System Description Table) */
 struct acpi_rsdt {
@@ -101,84 +65,80 @@ struct acpi_xsdt {
 	u64 entry[MAX_ACPI_TABLES];
 };
 
-/* MCFG (PCI Express MMIO config space BAR description table) */
-struct acpi_mcfg {
-	struct acpi_table_header header;
-	u8 reserved[8];
-};
-
-struct acpi_mcfg_mmconfig {
-	u32 base_address_l;
-	u32 base_address_h;
-	u16 pci_segment_group_number;
-	u8 start_bus_number;
-	u8 end_bus_number;
-	u8 reserved[4];
+/* FADT Preferred Power Management Profile */
+enum acpi_pm_profile {
+	ACPI_PM_UNSPECIFIED = 0,
+	ACPI_PM_DESKTOP,
+	ACPI_PM_MOBILE,
+	ACPI_PM_WORKSTATION,
+	ACPI_PM_ENTERPRISE_SERVER,
+	ACPI_PM_SOHO_SERVER,
+	ACPI_PM_APPLIANCE_PC,
+	ACPI_PM_PERFORMANCE_SERVER,
+	ACPI_PM_TABLET
 };
 
-/* MADT (Multiple APIC Description Table) */
-struct acpi_madt {
-	struct acpi_table_header header;
-	u32 lapic_addr;			/* Local APIC address */
-	u32 flags;			/* Multiple APIC flags */
-} acpi_madt_t;
-
-/* MADT: APIC Structure Type*/
-enum acpi_apic_types {
-	ACPI_APIC_LAPIC	= 0,		/* Processor local APIC */
-	ACPI_APIC_IOAPIC,		/* I/O APIC */
-	ACPI_APIC_IRQ_SRC_OVERRIDE,	/* Interrupt source override */
-	ACPI_APIC_NMI_SRC,		/* NMI source */
-	ACPI_APIC_LAPIC_NMI,		/* Local APIC NMI */
-	ACPI_APIC_LAPIC_ADDR_OVERRIDE,	/* Local APIC address override */
-	ACPI_APIC_IOSAPIC,		/* I/O SAPIC */
-	ACPI_APIC_LSAPIC,		/* Local SAPIC */
-	ACPI_APIC_PLATFORM_IRQ_SRC,	/* Platform interrupt sources */
-	ACPI_APIC_LX2APIC,		/* Processor local x2APIC */
-	ACPI_APIC_LX2APIC_NMI,		/* Local x2APIC NMI */
-};
+/* FADT flags for p_lvl2_lat and p_lvl3_lat */
+#define ACPI_FADT_C2_NOT_SUPPORTED	101
+#define ACPI_FADT_C3_NOT_SUPPORTED	1001
 
-/* MADT: Processor Local APIC Structure */
-struct acpi_madt_lapic {
-	u8 type;		/* Type (0) */
-	u8 length;		/* Length in bytes (8) */
-	u8 processor_id;	/* ACPI processor ID */
-	u8 apic_id;		/* Local APIC ID */
-	u32 flags;		/* Local APIC flags */
-};
+/* FADT Boot Architecture Flags */
+#define ACPI_FADT_LEGACY_FREE		0x00
+#define ACPI_FADT_LEGACY_DEVICES	(1 << 0)
+#define ACPI_FADT_8042			(1 << 1)
+#define ACPI_FADT_VGA_NOT_PRESENT	(1 << 2)
+#define ACPI_FADT_MSI_NOT_SUPPORTED	(1 << 3)
+#define ACPI_FADT_NO_PCIE_ASPM_CONTROL	(1 << 4)
 
-#define LOCAL_APIC_FLAG_ENABLED	(1 << 0)
-/* bits 1-31: reserved */
-#define PCAT_COMPAT		(1 << 0)
-/* bits 1-31: reserved */
+/* FADT Feature Flags */
+#define ACPI_FADT_WBINVD		(1 << 0)
+#define ACPI_FADT_WBINVD_FLUSH		(1 << 1)
+#define ACPI_FADT_C1_SUPPORTED		(1 << 2)
+#define ACPI_FADT_C2_MP_SUPPORTED	(1 << 3)
+#define ACPI_FADT_POWER_BUTTON		(1 << 4)
+#define ACPI_FADT_SLEEP_BUTTON		(1 << 5)
+#define ACPI_FADT_FIXED_RTC		(1 << 6)
+#define ACPI_FADT_S4_RTC_WAKE		(1 << 7)
+#define ACPI_FADT_32BIT_TIMER		(1 << 8)
+#define ACPI_FADT_DOCKING_SUPPORTED	(1 << 9)
+#define ACPI_FADT_RESET_REGISTER	(1 << 10)
+#define ACPI_FADT_SEALED_CASE		(1 << 11)
+#define ACPI_FADT_HEADLESS		(1 << 12)
+#define ACPI_FADT_SLEEP_TYPE		(1 << 13)
+#define ACPI_FADT_PCI_EXPRESS_WAKE	(1 << 14)
+#define ACPI_FADT_PLATFORM_CLOCK	(1 << 15)
+#define ACPI_FADT_S4_RTC_VALID		(1 << 16)
+#define ACPI_FADT_REMOTE_POWER_ON	(1 << 17)
+#define ACPI_FADT_APIC_CLUSTER		(1 << 18)
+#define ACPI_FADT_APIC_PHYSICAL		(1 << 19)
+#define ACPI_FADT_HW_REDUCED_ACPI	(1 << 20)
+#define ACPI_FADT_LOW_PWR_IDLE_S0	(1 << 21)
 
-/* MADT: Local APIC NMI Structure */
-struct __packed acpi_madt_lapic_nmi {
-	u8 type;		/* Type (4) */
-	u8 length;		/* Length in bytes (6) */
-	u8 processor_id;	/* ACPI processor ID */
-	u16 flags;		/* MPS INTI flags */
-	u8 lint;		/* Local APIC LINT# */
+enum acpi_address_space_type {
+	ACPI_ADDRESS_SPACE_MEMORY = 0,	/* System memory */
+	ACPI_ADDRESS_SPACE_IO,		/* System I/O */
+	ACPI_ADDRESS_SPACE_PCI,		/* PCI config space */
+	ACPI_ADDRESS_SPACE_EC,		/* Embedded controller */
+	ACPI_ADDRESS_SPACE_SMBUS,	/* SMBus */
+	ACPI_ADDRESS_SPACE_PCC = 0x0a,	/* Platform Comm. Channel */
+	ACPI_ADDRESS_SPACE_FIXED = 0x7f	/* Functional fixed hardware */
 };
 
-/* MADT: I/O APIC Structure */
-struct acpi_madt_ioapic {
-	u8 type;		/* Type (1) */
-	u8 length;		/* Length in bytes (12) */
-	u8 ioapic_id;		/* I/O APIC ID */
-	u8 reserved;
-	u32 ioapic_addr;	/* I/O APIC address */
-	u32 gsi_base;		/* Global system interrupt base */
+enum acpi_address_space_size {
+	ACPI_ACCESS_SIZE_UNDEFINED = 0,
+	ACPI_ACCESS_SIZE_BYTE_ACCESS,
+	ACPI_ACCESS_SIZE_WORD_ACCESS,
+	ACPI_ACCESS_SIZE_DWORD_ACCESS,
+	ACPI_ACCESS_SIZE_QWORD_ACCESS
 };
 
-/* MADT: Interrupt Source Override Structure */
-struct __packed acpi_madt_irqoverride {
-	u8 type;		/* Type (2) */
-	u8 length;		/* Length in bytes (10) */
-	u8 bus;			/* ISA (0) */
-	u8 source;		/* Bus-relative int. source (IRQ) */
-	u32 gsirq;		/* Global system interrupt */
-	u16 flags;		/* MPS INTI flags */
+struct acpi_gen_regaddr {
+	u8 space_id;	/* Address space ID */
+	u8 bit_width;	/* Register size in bits */
+	u8 bit_offset;	/* Register bit offset */
+	u8 access_size;	/* Access size */
+	u32 addrl;	/* Register address, low 32 bits */
+	u32 addrh;	/* Register address, high 32 bits */
 };
 
 /* FADT (Fixed ACPI Description Table) */
@@ -241,78 +201,109 @@ struct __packed acpi_fadt {
 	struct acpi_gen_regaddr x_gpe1_blk;
 };
 
-/* Flags for p_lvl2_lat and p_lvl3_lat */
-#define ACPI_FADT_C2_NOT_SUPPORTED	101
-#define ACPI_FADT_C3_NOT_SUPPORTED	1001
-
-/* FADT Feature Flags */
-#define ACPI_FADT_WBINVD		(1 << 0)
-#define ACPI_FADT_WBINVD_FLUSH		(1 << 1)
-#define ACPI_FADT_C1_SUPPORTED		(1 << 2)
-#define ACPI_FADT_C2_MP_SUPPORTED	(1 << 3)
-#define ACPI_FADT_POWER_BUTTON		(1 << 4)
-#define ACPI_FADT_SLEEP_BUTTON		(1 << 5)
-#define ACPI_FADT_FIXED_RTC		(1 << 6)
-#define ACPI_FADT_S4_RTC_WAKE		(1 << 7)
-#define ACPI_FADT_32BIT_TIMER		(1 << 8)
-#define ACPI_FADT_DOCKING_SUPPORTED	(1 << 9)
-#define ACPI_FADT_RESET_REGISTER	(1 << 10)
-#define ACPI_FADT_SEALED_CASE		(1 << 11)
-#define ACPI_FADT_HEADLESS		(1 << 12)
-#define ACPI_FADT_SLEEP_TYPE		(1 << 13)
-#define ACPI_FADT_PCI_EXPRESS_WAKE	(1 << 14)
-#define ACPI_FADT_PLATFORM_CLOCK	(1 << 15)
-#define ACPI_FADT_S4_RTC_VALID		(1 << 16)
-#define ACPI_FADT_REMOTE_POWER_ON	(1 << 17)
-#define ACPI_FADT_APIC_CLUSTER		(1 << 18)
-#define ACPI_FADT_APIC_PHYSICAL		(1 << 19)
-/* Bits 20-31: reserved ACPI 3.0 & 4.0 */
-#define ACPI_FADT_HW_REDUCED_ACPI	(1 << 20)
-#define ACPI_FADT_LOW_PWR_IDLE_S0	(1 << 21)
-/* bits 22-31: reserved ACPI 5.0 */
-
-/* FADT Boot Architecture Flags */
-#define ACPI_FADT_LEGACY_DEVICES	(1 << 0)
-#define ACPI_FADT_8042			(1 << 1)
-#define ACPI_FADT_VGA_NOT_PRESENT	(1 << 2)
-#define ACPI_FADT_MSI_NOT_SUPPORTED	(1 << 3)
-#define ACPI_FADT_NO_PCIE_ASPM_CONTROL	(1 << 4)
-/* No legacy devices (including 8042) */
-#define ACPI_FADT_LEGACY_FREE		0x00
-
-/* FADT Preferred Power Management Profile */
-enum acpi_pm_profile {
-	ACPI_PM_UNSPECIFIED = 0,
-	ACPI_PM_DESKTOP,
-	ACPI_PM_MOBILE,
-	ACPI_PM_WORKSTATION,
-	ACPI_PM_ENTERPRISE_SERVER,
-	ACPI_PM_SOHO_SERVER,
-	ACPI_PM_APPLIANCE_PC,
-	ACPI_PM_PERFORMANCE_SERVER,
-	ACPI_PM_TABLET
-};
+/* FACS flags */
+#define ACPI_FACS_S4BIOS_F	(1 << 0)
+#define ACPI_FACS_64BIT_WAKE_F	(1 << 1)
 
 /* FACS (Firmware ACPI Control Structure) */
 struct acpi_facs {
-	char signature[4];			/* "FACS" */
-	u32 length;				/* Length in bytes (>= 64) */
-	u32 hardware_signature;			/* Hardware signature */
-	u32 firmware_waking_vector;		/* Firmware waking vector */
-	u32 global_lock;			/* Global lock */
-	u32 flags;				/* FACS flags */
-	u32 x_firmware_waking_vector_l;		/* X FW waking vector, low */
-	u32 x_firmware_waking_vector_h;		/* X FW waking vector, high */
-	u8 version;				/* ACPI 4.0: 2 */
+	char signature[4];		/* "FACS" */
+	u32 length;			/* Length in bytes (>= 64) */
+	u32 hardware_signature;		/* Hardware signature */
+	u32 firmware_waking_vector;	/* Firmware waking vector */
+	u32 global_lock;		/* Global lock */
+	u32 flags;			/* FACS flags */
+	u32 x_firmware_waking_vector_l;	/* X FW waking vector, low */
+	u32 x_firmware_waking_vector_h;	/* X FW waking vector, high */
+	u8 version;			/* Version 2 */
 	u8 res1[3];
-	u32 ospm_flags;				/* OSPM enabled flags */
+	u32 ospm_flags;			/* OSPM enabled flags */
 	u8 res2[24];
 };
 
-/* FACS flags */
-#define ACPI_FACS_S4BIOS_F	(1 << 0)
-#define ACPI_FACS_64BIT_WAKE_F	(1 << 1)
-/* Bits 31..2: reserved */
+/* MADT flags */
+#define ACPI_MADT_PCAT_COMPAT	(1 << 0)
+
+/* MADT (Multiple APIC Description Table) */
+struct acpi_madt {
+	struct acpi_table_header header;
+	u32 lapic_addr;			/* Local APIC address */
+	u32 flags;			/* Multiple APIC flags */
+};
+
+/* MADT: APIC Structure Type*/
+enum acpi_apic_types {
+	ACPI_APIC_LAPIC	= 0,		/* Processor local APIC */
+	ACPI_APIC_IOAPIC,		/* I/O APIC */
+	ACPI_APIC_IRQ_SRC_OVERRIDE,	/* Interrupt source override */
+	ACPI_APIC_NMI_SRC,		/* NMI source */
+	ACPI_APIC_LAPIC_NMI,		/* Local APIC NMI */
+	ACPI_APIC_LAPIC_ADDR_OVERRIDE,	/* Local APIC address override */
+	ACPI_APIC_IOSAPIC,		/* I/O SAPIC */
+	ACPI_APIC_LSAPIC,		/* Local SAPIC */
+	ACPI_APIC_PLATFORM_IRQ_SRC,	/* Platform interrupt sources */
+	ACPI_APIC_LX2APIC,		/* Processor local x2APIC */
+	ACPI_APIC_LX2APIC_NMI,		/* Local x2APIC NMI */
+};
+
+/* MADT: Processor Local APIC Structure */
+
+#define LOCAL_APIC_FLAG_ENABLED	(1 << 0)
+
+struct acpi_madt_lapic {
+	u8 type;		/* Type (0) */
+	u8 length;		/* Length in bytes (8) */
+	u8 processor_id;	/* ACPI processor ID */
+	u8 apic_id;		/* Local APIC ID */
+	u32 flags;		/* Local APIC flags */
+};
+
+/* MADT: I/O APIC Structure */
+struct acpi_madt_ioapic {
+	u8 type;		/* Type (1) */
+	u8 length;		/* Length in bytes (12) */
+	u8 ioapic_id;		/* I/O APIC ID */
+	u8 reserved;
+	u32 ioapic_addr;	/* I/O APIC address */
+	u32 gsi_base;		/* Global system interrupt base */
+};
+
+/* MADT: Interrupt Source Override Structure */
+struct __packed acpi_madt_irqoverride {
+	u8 type;		/* Type (2) */
+	u8 length;		/* Length in bytes (10) */
+	u8 bus;			/* ISA (0) */
+	u8 source;		/* Bus-relative int. source (IRQ) */
+	u32 gsirq;		/* Global system interrupt */
+	u16 flags;		/* MPS INTI flags */
+};
+
+/* MADT: Local APIC NMI Structure */
+struct __packed acpi_madt_lapic_nmi {
+	u8 type;		/* Type (4) */
+	u8 length;		/* Length in bytes (6) */
+	u8 processor_id;	/* ACPI processor ID */
+	u16 flags;		/* MPS INTI flags */
+	u8 lint;		/* Local APIC LINT# */
+};
+
+/* MCFG (PCI Express MMIO config space BAR description table) */
+struct acpi_mcfg {
+	struct acpi_table_header header;
+	u8 reserved[8];
+};
+
+struct acpi_mcfg_mmconfig {
+	u32 base_address_l;
+	u32 base_address_h;
+	u16 pci_segment_group_number;
+	u8 start_bus_number;
+	u8 end_bus_number;
+	u8 reserved[4];
+};
+
+#define OEM_REVISION		42
+#define ASL_COMPILER_REVISION	42
 
 /* These can be used by the target port */
 
Signature · 1 line
1.8.2.1
#24 lore raw

PATCH 13/26 x86: acpi: Reorder codes in acpi_table.h

Hi Bin,

Nitpicking comment:

x86: acpi: Reorder code in acpi_table.h

Quoted 3 lines · Bin Meng

Reorder the ACPI tables appearance by following the order:
RSDP, RSDT, XSDT, FADT, FACS, MADT, MCFG. And adjust the table flags defines accordingly.

and "adjust the table flag defines" sound more correct to my (non-native English) ears.

Thanks,
Stefan

author
#25 lore raw

PATCH 14/26 x86: acpi: Remove acpi_create_ssdt_generator()

In reply to Bin Meng

This acpi_create_ssdt_generator() currently does nothing. Remove this for now.

---

 arch/x86/include/asm/acpi_table.h |  3 ---
 arch/x86/lib/acpi_table.c         | 33 ---------------------------------
 2 files changed, 36 deletions(-)
arch/x86/include/asm/acpi_table.h +0 -3
index 9175e7a..c6688ea 100644
@@ -302,9 +302,6 @@ struct acpi_mcfg_mmconfig {
 	u8 reserved[4];
 };
 
-#define OEM_REVISION		42
-#define ASL_COMPILER_REVISION	42
-
 /* These can be used by the target port */
 
 unsigned long acpi_create_madt_lapics(unsigned long current);
arch/x86/lib/acpi_table.c +0 -33
index 75fa429..62fe39d 100644
@@ -311,29 +311,6 @@ static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
 			sizeof(struct acpi_rsdp));
 }
 
-static void acpi_create_ssdt_generator(struct acpi_table_header *ssdt,
-			 const char *oem_table_id)
-{
-	unsigned long current = (unsigned long)ssdt +
-				sizeof(struct acpi_table_header);
-
-	memset((void *)ssdt, 0, sizeof(struct acpi_table_header));
-
-	memcpy(&ssdt->signature, "SSDT", 4);
-	/* Access size in ACPI 2.0c/3.0/4.0/5.0 */
-	ssdt->revision = ACPI_REV_ACPI_3_0;
-	memcpy(&ssdt->oem_id, OEM_ID, 6);
-	memcpy(&ssdt->oem_table_id, oem_table_id, 8);
-	ssdt->oem_revision = OEM_REVISION;
-	memcpy(&ssdt->aslc_id, ASLC_ID, 4);
-	ssdt->aslc_revision = ASL_COMPILER_REVISION;
-	ssdt->length = sizeof(struct acpi_table_header);
-
-	/* (Re)calculate length and checksum */
-	ssdt->length = current - (unsigned long)ssdt;
-	ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length);
-}
-
 /*
  * QEMU's version of write_acpi_tables is defined in
  * arch/x86/cpu/qemu/fw_cfg.c
@@ -349,7 +326,6 @@ u32 write_acpi_tables(u32 start)
 	struct acpi_fadt *fadt;
 	struct acpi_mcfg *mcfg;
 	struct acpi_madt *madt;
-	struct acpi_table_header *ssdt;
 
 	current = start;
 
@@ -426,15 +402,6 @@ u32 write_acpi_tables(u32 start)
 	}
 	current = ALIGN(current, 16);
 
-	debug("ACPI:    * SSDT\n");
-	ssdt = (struct acpi_table_header *)current;
-	acpi_create_ssdt_generator(ssdt, OEM_TABLE_ID);
-	if (ssdt->length > sizeof(struct acpi_table_header)) {
-		current += ssdt->length;
-		acpi_add_table(rsdp, ssdt);
-		current = ALIGN(current, 16);
-	}
-
 	debug("current = %x\n", current);
 
 	debug("ACPI: done.\n");
Signature · 1 line
1.8.2.1
author
#26 lore raw

PATCH 15/26 x86: acpi: Change fill_header()

In reply to Bin Meng

Rename fill_header() to acpi_fill_header() for consistency. Change its signature to remove the 'length' parameter and make it a public API.

Also remove the unnecessary include files, and improve the AmlCode[] comment a little bit.

---

 arch/x86/include/asm/acpi_table.h |  1 +
 arch/x86/lib/acpi_table.c         | 22 ++++++++--------------
 2 files changed, 9 insertions(+), 14 deletions(-)
arch/x86/include/asm/acpi_table.h +1 -0
index c6688ea..5a829de 100644
@@ -304,6 +304,7 @@ struct acpi_mcfg_mmconfig {
 
 /* These can be used by the target port */
 
+void acpi_fill_header(struct acpi_table_header *header, char *signature);
 unsigned long acpi_create_madt_lapics(unsigned long current);
 int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
 			 u32 gsi_base);
arch/x86/lib/acpi_table.c +8 -14
index 62fe39d..97d90f7 100644
@@ -10,18 +10,13 @@
 #include <cpu.h>
 #include <dm.h>
 #include <dm/uclass-internal.h>
-#include <dm/lists.h>
 #include <asm/acpi_table.h>
-#include <asm/cpu.h>
-#include <asm/ioapic.h>
 #include <asm/lapic.h>
 #include <asm/tables.h>
-#include <asm/pci.h>
 
 /*
- * IASL compiles the dsdt entries and
- * writes the hex values to AmlCode array.
- * CamelCase cannot be handled here.
+ * IASL compiles the dsdt entries and writes the hex values
+ * to a C array AmlCode[] (see dsdt.c).
  */
 extern const unsigned char AmlCode[];
 
@@ -151,10 +146,9 @@ int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
 	return lapic_nmi->length;
 }
 
-static void fill_header(struct acpi_table_header *header, char *signature,
-			int length)
+void acpi_fill_header(struct acpi_table_header *header, char *signature)
 {
-	memcpy(header->signature, signature, length);
+	memcpy(header->signature, signature, 4);
 	memcpy(header->oem_id, OEM_ID, 6);
 	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
 	memcpy(header->aslc_id, ASLC_ID, 4);
@@ -168,7 +162,7 @@ static void acpi_create_madt(struct acpi_madt *madt)
 	memset((void *)madt, 0, sizeof(struct acpi_madt));
 
 	/* Fill out header fields */
-	fill_header(header, "APIC", 4);
+	acpi_fill_header(header, "APIC");
 	header->length = sizeof(struct acpi_madt);
 
 	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
@@ -216,7 +210,7 @@ static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
 	memset((void *)mcfg, 0, sizeof(struct acpi_mcfg));
 
 	/* Fill out header fields */
-	fill_header(header, "MCFG", 4);
+	acpi_fill_header(header, "MCFG");
 	header->length = sizeof(struct acpi_mcfg);
 
 	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
@@ -249,7 +243,7 @@ static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
 	struct acpi_table_header *header = &(rsdt->header);
 
 	/* Fill out header fields */
-	fill_header(header, "RSDT", 4);
+	acpi_fill_header(header, "RSDT");
 	header->length = sizeof(struct acpi_rsdt);
 
 	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
@@ -267,7 +261,7 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
 	struct acpi_table_header *header = &(xsdt->header);
 
 	/* Fill out header fields */
-	fill_header(header, "XSDT", 4);
+	acpi_fill_header(header, "XSDT");
 	header->length = sizeof(struct acpi_xsdt);
 
 	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
Signature · 1 line
1.8.2.1
author
#27 lore raw

PATCH 16/26 x86: acpi: Adjust orders in acpi_table.c

In reply to Bin Meng

Rearrange the routine order a little bit, to follow the order in which ACPI table is defined in acpi_table.h.

---

 arch/x86/include/asm/acpi_table.h |  14 +--
 arch/x86/lib/acpi_table.c         | 227 +++++++++++++++++++-------------------
 2 files changed, 121 insertions(+), 120 deletions(-)
arch/x86/include/asm/acpi_table.h +7 -7
index 5a829de..ad39902 100644
@@ -305,14 +305,14 @@ struct acpi_mcfg_mmconfig {
 /* These can be used by the target port */
 
 void acpi_fill_header(struct acpi_table_header *header, char *signature);
+void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
+		      void *dsdt);
 unsigned long acpi_create_madt_lapics(unsigned long current);
-int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
-			 u32 gsi_base);
+int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
+			    u32 addr, u32 gsi_base);
 int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
-			 u8 bus, u8 source, u32 gsirq, u16 flags);
+				 u8 bus, u8 source, u32 gsirq, u16 flags);
+int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
+			       u8 cpu, u16 flags, u8 lint);
 unsigned long acpi_fill_madt(unsigned long current);
-void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
-			 void *dsdt);
-int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi, u8 cpu,
-			 u16 flags, u8 lint);
 u32 write_acpi_tables(u32 start);
arch/x86/lib/acpi_table.c +114 -113

320 lines not on this page · raw message

Signature · 1 line
1.8.2.1
#28 lore raw

PATCH 16/26 x86: acpi: Adjust orders in acpi_table.c

Hi Bin,

Nitpicking:

x86: acpi: Adjust order in acpi_table.c

(s/orders/order)

Quoted 365 lines · Bin Meng

Rearrange the routine order a little bit, to follow the order in which ACPI table is defined in acpi_table.h.

---

  arch/x86/include/asm/acpi_table.h |  14 +--
  arch/x86/lib/acpi_table.c         | 227 +++++++++++++++++++-------------------
  2 files changed, 121 insertions(+), 120 deletions(-)
arch/x86/include/asm/acpi_table.h +7 -7
index 5a829de..ad39902 100644
@@ -305,14 +305,14 @@ struct acpi_mcfg_mmconfig {
  /* These can be used by the target port */
 
  void acpi_fill_header(struct acpi_table_header *header, char *signature);
+void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
+		      void *dsdt);
  unsigned long acpi_create_madt_lapics(unsigned long current);
-int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
-			 u32 gsi_base);
+int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
+			    u32 addr, u32 gsi_base);
  int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
-			 u8 bus, u8 source, u32 gsirq, u16 flags);
+				 u8 bus, u8 source, u32 gsirq, u16 flags);
+int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
+			       u8 cpu, u16 flags, u8 lint);
  unsigned long acpi_fill_madt(unsigned long current);
-void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
-			 void *dsdt);
-int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi, u8 cpu,
-			 u16 flags, u8 lint);
  u32 write_acpi_tables(u32 start);
arch/x86/lib/acpi_table.c +107 -113
index 97d90f7..4891f20 100644
@@ -2,6 +2,7 @@
   * Based on acpi.c from coreboot
   *
   * Copyright (C) 2015, Saket Sinha <[email protected]>
+ * Copyright (C) 2016, Bin Meng <[email protected]>
   *
   * SPDX-License-Identifier: GPL-2.0+
   */
@@ -20,10 +21,85 @@
   */
  extern const unsigned char AmlCode[];
 
+static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
+			    struct acpi_xsdt *xsdt)
+{
+	memset(rsdp, 0, sizeof(struct acpi_rsdp));
+
+	memcpy(rsdp->signature, RSDP_SIG, 8);
+	memcpy(rsdp->oem_id, OEM_ID, 6);
+
+	rsdp->length = sizeof(struct acpi_rsdp);
+	rsdp->rsdt_address = (u32)rsdt;
+
+	/*
+	 * Revision: ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2
+	 *
+	 * Some OSes expect an XSDT to be present for RSD PTR revisions >= 2.
+	 * If we don't have an ACPI XSDT, force ACPI 1.0 (and thus RSD PTR
+	 * revision 0)
+	 */
+	if (xsdt == NULL) {
+		rsdp->revision = ACPI_RSDP_REV_ACPI_1_0;
+	} else {
+		rsdp->xsdt_address = (u64)(u32)xsdt;
+		rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
+	}
+
+	/* Calculate checksums */
+	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
+	rsdp->ext_checksum = table_compute_checksum((void *)rsdp,
+			sizeof(struct acpi_rsdp));
+}
+
+void acpi_fill_header(struct acpi_table_header *header, char *signature)
+{
+	memcpy(header->signature, signature, 4);
+	memcpy(header->oem_id, OEM_ID, 6);
+	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
+	memcpy(header->aslc_id, ASLC_ID, 4);
+}
+
+static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
+{
+	struct acpi_table_header *header = &(rsdt->header);
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "RSDT");
+	header->length = sizeof(struct acpi_rsdt);
+
+	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
+	header->revision = ACPI_REV_ACPI_2_0;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum((void *)rsdt,
+			sizeof(struct acpi_rsdt));
+}
+
+static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
+{
+	struct acpi_table_header *header = &(xsdt->header);
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "XSDT");
+	header->length = sizeof(struct acpi_xsdt);
+
+	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
+	header->revision = ACPI_REV_ACPI_2_0;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum((void *)xsdt,
+			sizeof(struct acpi_xsdt));
+}
+
  /**
-* Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
-* and checksum.
-*/
+ * Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
+ * and checksum.
+ */
  static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
  {
  	int i, entries_num;
@@ -54,12 +130,12 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
 
  	/* Fix RSDT length or the kernel will assume invalid entries */
  	rsdt->header.length = sizeof(struct acpi_table_header) +
-			      (sizeof(u32) * (i + 1));
+				(sizeof(u32) * (i + 1));
 
  	/* Re-calculate checksum */
  	rsdt->header.checksum = 0;
  	rsdt->header.checksum = table_compute_checksum((u8 *)rsdt,
-						       rsdt->header.length);
+			rsdt->header.length);
 
  	/*
  	 * And now the same thing for the XSDT. We use the same index as for
@@ -71,7 +147,7 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
 
  		/* Fix XSDT length */
  		xsdt->header.length = sizeof(struct acpi_table_header) +
-			 (sizeof(u64) * (i + 1));
+			(sizeof(u64) * (i + 1));
 
  		/* Re-calculate checksum */
  		xsdt->header.checksum = 0;
@@ -80,12 +156,27 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
  	}
  }
 
+static void acpi_create_facs(struct acpi_facs *facs)
+{
+	memset((void *)facs, 0, sizeof(struct acpi_facs));
+
+	memcpy(facs->signature, "FACS", 4);
+	facs->length = sizeof(struct acpi_facs);
+	facs->hardware_signature = 0;
+	facs->firmware_waking_vector = 0;
+	facs->global_lock = 0;
+	facs->flags = 0;
+	facs->x_firmware_waking_vector_l = 0;
+	facs->x_firmware_waking_vector_h = 0;
+	facs->version = 1;
+}
+
  static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
  			 u8 cpu, u8 apic)
  {
-	lapic->type = ACPI_APIC_LAPIC; /* Local APIC structure */
+	lapic->type = ACPI_APIC_LAPIC;
  	lapic->length = sizeof(struct acpi_madt_lapic);
-	lapic->flags = LOCAL_APIC_FLAG_ENABLED; /* Processor/LAPIC enabled */
+	lapic->flags = LOCAL_APIC_FLAG_ENABLED;
  	lapic->processor_id = cpu;
  	lapic->apic_id = apic;
 
@@ -108,8 +199,8 @@ unsigned long acpi_create_madt_lapics(unsigned long current)
  		return current;
  }
 
-int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
-			 u32 gsi_base)
+int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
+			    u32 addr, u32 gsi_base)
  {
  	ioapic->type = ACPI_APIC_IOAPIC;
  	ioapic->length = sizeof(struct acpi_madt_ioapic);
@@ -122,7 +213,7 @@ int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
  }
 
  int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
-			 u8 bus, u8 source, u32 gsirq, u16 flags)
+				 u8 bus, u8 source, u32 gsirq, u16 flags)
  {
  	irqoverride->type = ACPI_APIC_IRQ_SRC_OVERRIDE;
  	irqoverride->length = sizeof(struct acpi_madt_irqoverride);
@@ -135,7 +226,7 @@ int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
  }
 
  int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
-			 u8 cpu, u16 flags, u8 lint)
+			       u8 cpu, u16 flags, u8 lint)
  {
  	lapic_nmi->type = ACPI_APIC_LAPIC_NMI;
  	lapic_nmi->length = sizeof(struct acpi_madt_lapic_nmi);
@@ -146,14 +237,6 @@ int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
  	return lapic_nmi->length;
  }
 
-void acpi_fill_header(struct acpi_table_header *header, char *signature)
-{
-	memcpy(header->signature, signature, 4);
-	memcpy(header->oem_id, OEM_ID, 6);
-	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
-	memcpy(header->aslc_id, ASLC_ID, 4);
-}
-
  static void acpi_create_madt(struct acpi_madt *madt)
  {
  	struct acpi_table_header *header = &(madt->header);
@@ -180,7 +263,7 @@ static void acpi_create_madt(struct acpi_madt *madt)
  }
 
  static int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig,
-			 u32 base, u16 seg_nr, u8 start, u8 end)
+				     u32 base, u16 seg_nr, u8 start, u8 end)
  {
  	memset(mmconfig, 0, sizeof(*mmconfig));
  	mmconfig->base_address_l = base;
@@ -196,7 +279,7 @@ static unsigned long acpi_fill_mcfg(unsigned long current)
  {
  	current += acpi_create_mcfg_mmconfig
  		((struct acpi_mcfg_mmconfig *)current,
-		 CONFIG_PCIE_ECAM_BASE, 0x0, 0x0, 255);
+		CONFIG_PCIE_ECAM_BASE, 0x0, 0x0, 255);
 
  	return current;
  }
@@ -223,88 +306,6 @@ static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
  	header->checksum = table_compute_checksum((void *)mcfg, header->length);
  }
 
-static void acpi_create_facs(struct acpi_facs *facs)
-{
-	memset((void *)facs, 0, sizeof(struct acpi_facs));
-
-	memcpy(facs->signature, "FACS", 4);
-	facs->length = sizeof(struct acpi_facs);
-	facs->hardware_signature = 0;
-	facs->firmware_waking_vector = 0;
-	facs->global_lock = 0;
-	facs->flags = 0;
-	facs->x_firmware_waking_vector_l = 0;
-	facs->x_firmware_waking_vector_h = 0;
-	facs->version = 1; /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */
-}
-
-static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
-{
-	struct acpi_table_header *header = &(rsdt->header);
-
-	/* Fill out header fields */
-	acpi_fill_header(header, "RSDT");
-	header->length = sizeof(struct acpi_rsdt);
-
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)rsdt,
-			sizeof(struct acpi_rsdt));
-}
-
-static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
-{
-	struct acpi_table_header *header = &(xsdt->header);
-
-	/* Fill out header fields */
-	acpi_fill_header(header, "XSDT");
-	header->length = sizeof(struct acpi_xsdt);
-
-	/* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */
-	header->revision = ACPI_REV_ACPI_2_0;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)xsdt,
-			sizeof(struct acpi_xsdt));
-}
-
-static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
-			 struct acpi_xsdt *xsdt)
-{
-	memset(rsdp, 0, sizeof(struct acpi_rsdp));
-
-	memcpy(rsdp->signature, RSDP_SIG, 8);
-	memcpy(rsdp->oem_id, OEM_ID, 6);
-
-	rsdp->length = sizeof(struct acpi_rsdp);
-	rsdp->rsdt_address = (u32)rsdt;
-
-	/*
-	* Revision: ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2
-	*
-	* Some OSes expect an XSDT to be present for RSD PTR revisions >= 2.
-	* If we don't have an ACPI XSDT, force ACPI 1.0 (and thus RSD PTR
-	* revision 0)
-	*/
-	if (xsdt == NULL) {
-		rsdp->revision = ACPI_RSDP_REV_ACPI_1_0;
-	} else {
-		rsdp->xsdt_address = (u64)(u32)xsdt;
-		rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
-	}
-
-	/* Calculate checksums */
-	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
-	rsdp->ext_checksum = table_compute_checksum((void *)rsdp,
-			sizeof(struct acpi_rsdp));
-}
-
  /*
   * QEMU's version of write_acpi_tables is defined in
   * arch/x86/cpu/qemu/fw_cfg.c
@@ -378,15 +379,6 @@ u32 write_acpi_tables(u32 start)
  	acpi_create_fadt(fadt, facs, dsdt);
  	acpi_add_table(rsdp, fadt);
 
-	debug("ACPI:    * MCFG\n");
-	mcfg = (struct acpi_mcfg *)current;
-	acpi_create_mcfg(mcfg);
-	if (mcfg->header.length > sizeof(struct acpi_mcfg)) {
-		current += mcfg->header.length;
-		current = ALIGN(current, 16);
-		acpi_add_table(rsdp, mcfg);
-	}
-
  	debug("ACPI:    * MADT\n");
  	madt = (struct acpi_madt *)current;
  	acpi_create_madt(madt);
@@ -396,6 +388,15 @@ u32 write_acpi_tables(u32 start)
  	}
  	current = ALIGN(current, 16);
 
+	debug("ACPI:    * MCFG\n");
+	mcfg = (struct acpi_mcfg *)current;

arch/x86/lib/acpi_table.c u32 write_acpi_tables(u32 start) · line 402

Quoted 10 lines
arch/x86/lib/acpi_table.c +7 -0
+	acpi_create_mcfg(mcfg);
+	if (mcfg->header.length > sizeof(struct acpi_mcfg)) {
+		current += mcfg->header.length;
+		current = ALIGN(current, 16);
+		acpi_add_table(rsdp, mcfg);
+	}
+
  	debug("current = %x\n", current);
 
  	debug("ACPI: done.\n");

Thanks,
Stefan

author
#29 lore raw

PATCH 17/26 x86: acpi: Change table write routine signature to use u32

In reply to Bin Meng

Use u32 instead of unsigned long in the table write routines, as other routines do.

---

 arch/x86/include/asm/acpi_table.h | 4 ++--
 arch/x86/lib/acpi_table.c         | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
arch/x86/include/asm/acpi_table.h +2 -2
index ad39902..44f528e 100644
@@ -307,12 +307,12 @@ struct acpi_mcfg_mmconfig {
 void acpi_fill_header(struct acpi_table_header *header, char *signature);
 void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
 		      void *dsdt);
-unsigned long acpi_create_madt_lapics(unsigned long current);
+u32 acpi_create_madt_lapics(u32 current);
 int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
 			    u32 addr, u32 gsi_base);
 int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
 				 u8 bus, u8 source, u32 gsirq, u16 flags);
 int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
 			       u8 cpu, u16 flags, u8 lint);
-unsigned long acpi_fill_madt(unsigned long current);
+u32 acpi_fill_madt(u32 current);
 u32 write_acpi_tables(u32 start);
arch/x86/lib/acpi_table.c +2 -2
index 4891f20..0e43452 100644
@@ -183,7 +183,7 @@ static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
 	return lapic->length;
 }
 
-unsigned long acpi_create_madt_lapics(unsigned long current)
+u32 acpi_create_madt_lapics(u32 current)
 {
 	struct udevice *dev;
 
@@ -275,7 +275,7 @@ static int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig,
 	return sizeof(struct acpi_mcfg_mmconfig);
 }
 
-static unsigned long acpi_fill_mcfg(unsigned long current)
+static u32 acpi_fill_mcfg(u32 current)
 {
 	current += acpi_create_mcfg_mmconfig
 		((struct acpi_mcfg_mmconfig *)current,
Signature · 1 line
1.8.2.1
author
#30 lore raw

PATCH 18/26 x86: acpi: Align FACS table to a 64 byte boundary

In reply to Bin Meng

Per ACPI spec, the FACS table address must be aligned to a 64 byte boundary (Windows checks this, but Linux does not).

---

 arch/x86/lib/acpi_table.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/lib/acpi_table.c +1 -1
index 0e43452..9f2623a 100644
@@ -338,7 +338,7 @@ u32 write_acpi_tables(u32 start)
 	current = ALIGN(current, 16);
 	xsdt = (struct acpi_xsdt *)current;
 	current += sizeof(struct acpi_xsdt);
-	current = ALIGN(current, 16);
+	current = ALIGN(current, 64);
 
 	/* clear all table memory */
 	memset((void *)start, 0, current - start);
Signature · 1 line
1.8.2.1
author
#31 lore raw

PATCH 19/26 x86: acpi: Add some generic ASL libraries

In reply to Bin Meng

This adds several generic ASL libraries that can be included by other ASL files, which are:

- debug.asl: for debug output using POST I/O port and legacy serial port
- globutil.asl: for string compare routines
- statdef.asl: for _STA status values

---

 arch/x86/include/asm/acpi/debug.asl    | 136 +++++++++++++++++++++++++++++++++
 arch/x86/include/asm/acpi/globutil.asl | 113 +++++++++++++++++++++++++++
 arch/x86/include/asm/acpi/statdef.asl  |  82 ++++++++++++++++++++
 3 files changed, 331 insertions(+)
 create mode 100644 arch/x86/include/asm/acpi/debug.asl
 create mode 100644 arch/x86/include/asm/acpi/globutil.asl
 create mode 100644 arch/x86/include/asm/acpi/statdef.asl
arch/x86/include/asm/acpi/debug.asl new file +136 -0
new file mode 100644
index 0000000..8e7b603
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016 Bin Meng <[email protected]>
+ *
+ * Modified from coreboot src/arch/x86/acpi/debug.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* POST register region */
+OperationRegion(X80, SystemIO, 0x80, 1)
+Field(X80, ByteAcc, NoLock, Preserve)
+{
+	P80, 8
+}
+
+/* Legacy serial port register region */
+OperationRegion(CREG, SystemIO, 0x3F8, 8)
+Field(CREG, ByteAcc, NoLock, Preserve)
+{
+	CDAT, 8,
+	CDLM, 8,
+	    , 8,
+	CLCR, 8,
+	CMCR, 8,
+	CLSR, 8
+}
+
+/* DINI - Initialize the serial port to 115200 8-N-1 */
+Method(DINI)
+{
+	Store(0x83, CLCR)
+	Store(0x01, CDAT)	/* 115200 baud (low) */
+	Store(0x00, CDLM)	/* 115200 baud (high) */
+	Store(0x03, CLCR)	/* word=8 stop=1 parity=none */
+	Store(0x03, CMCR)	/* DTR=1 RTS=1 out1/2=Off loop=Off */
+	Store(0x00, CDLM)	/* turn off interrupts */
+}
+
+/* THRE - Wait for serial port transmitter holding register to go empty */
+Method(THRE)
+{
+	And(CLSR, 0x20, Local0)
+	While (LEqual(Local0, Zero)) {
+		And(CLSR, 0x20, Local0)
+	}
+}
+
+/* OUTX - Send a single raw character */
+Method(OUTX, 1)
+{
+	THRE()
+	Store(Arg0, CDAT)
+}
+
+/* OUTC - Send a single character, expanding LF into CR/LF */
+Method(OUTC, 1)
+{
+	If (LEqual(Arg0, 0x0a)) {
+		OUTX(0x0d)
+	}
+	OUTX(Arg0)
+}
+
+/* DBGN - Send a single hex nibble */
+Method(DBGN, 1)
+{
+	And(Arg0, 0x0f, Local0)
+	If (LLess(Local0, 10)) {
+		Add(Local0, 0x30, Local0)
+	} Else {
+		Add(Local0, 0x37, Local0)
+	}
+	OUTC(Local0)
+}
+
+/* DBGB - Send a hex byte */
+Method(DBGB, 1)
+{
+	ShiftRight(Arg0, 4, Local0)
+	DBGN(Local0)
+	DBGN(Arg0)
+}
+
+/* DBGW - Send a hex word */
+Method(DBGW, 1)
+{
+	ShiftRight(Arg0, 8, Local0)
+	DBGB(Local0)
+	DBGB(Arg0)
+}
+
+/* DBGD - Send a hex dword */
+Method(DBGD, 1)
+{
+	ShiftRight(Arg0, 16, Local0)
+	DBGW(Local0)
+	DBGW(Arg0)
+}
+
+/* Get a char from a string */
+Method(GETC, 2)
+{
+	CreateByteField(Arg0, Arg1, DBGC)
+	Return (DBGC)
+}
+
+/* DBGO - Send either a string or an integer */
+Method(DBGO, 1, Serialized)
+{
+	If (LEqual(ObjectType(Arg0), 1)) {
+		If (LGreater(Arg0, 0xffff)) {
+			DBGD(Arg0)
+		} Else {
+			If (LGreater(Arg0, 0xff)) {
+				DBGW(Arg0)
+			} Else {
+				DBGB(Arg0)
+			}
+		}
+	} Else {
+		Name(BDBG, Buffer(80) {})
+		Store(Arg0, BDBG)
+		Store(0, Local1)
+		While (One) {
+			Store(GETC(BDBG, Local1), Local0)
+			If (LEqual(Local0, 0)) {
+				Return (Zero)
+			}
+			OUTC(Local0)
+			Increment(Local1)
+		}
+	}
+
+	Return (Zero)
+}
arch/x86/include/asm/acpi/globutil.asl new file +113 -0

113 lines not on this page · raw message

arch/x86/include/asm/acpi/statdef.asl new file +82 -0

82 lines not on this page · raw message

Signature · 1 line
1.8.2.1
author
#32 lore raw

PATCH 20/26 x86: baytrail: Add platform ASL files

In reply to Bin Meng

This adds basic BayTrail platform ASL files. They are intended to be included in dsdt.asl of any board that is based on this platform.

Note: ACPI mode support for GPIO/LPSS/SCC/LPE are not supported for now. They will be added in the future.

---

 .../include/asm/arch-baytrail/acpi/irq_helper.h    | 111 +++++
 .../include/asm/arch-baytrail/acpi/irqlinks.asl    | 489 +++++++++++++++++++++
 .../include/asm/arch-baytrail/acpi/irqroute.asl    |  48 ++
 arch/x86/include/asm/arch-baytrail/acpi/irqroute.h |  27 ++
 arch/x86/include/asm/arch-baytrail/acpi/lpc.asl    | 121 +++++
 .../include/asm/arch-baytrail/acpi/platform.asl    |  34 ++
 .../include/asm/arch-baytrail/acpi/sleepstates.asl |  13 +
 .../asm/arch-baytrail/acpi/southcluster.asl        | 211 +++++++++
 arch/x86/include/asm/arch-baytrail/acpi/usb.asl    |  34 ++
 arch/x86/include/asm/arch-baytrail/acpi/xhci.asl   |  31 ++
 arch/x86/include/asm/arch-baytrail/device.h        |  74 ++++
 arch/x86/include/asm/arch-baytrail/iomap.h         |  70 +++
 arch/x86/include/asm/arch-baytrail/irq.h           |  86 ++++
 13 files changed, 1349 insertions(+)
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/lpc.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/platform.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/usb.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/xhci.asl
 create mode 100644 arch/x86/include/asm/arch-baytrail/device.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/iomap.h
 create mode 100644 arch/x86/include/asm/arch-baytrail/irq.h
arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h new file +111 -0
new file mode 100644
index 0000000..2c3585a
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Copyright (C) 2014 Sage Electronics Engineering, LLC.
+ * Copyright (C) 2016 Bin Meng <[email protected]>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/include/soc/irq_helper.h
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/*
+ * This file intentionally gets included multiple times, to set pic and apic
+ * modes, so should not have guard statements added.
+ */
+
+/*
+ * This file will use irqroute.asl and irqroute.h to generate the ACPI IRQ
+ * routing for the platform being compiled.
+ *
+ * This method uses #defines in irqroute.h along with the macros contained
+ * in this file to generate an IRQ routing for each PCI device in the system.
+ */
+
+#undef PCI_DEV_PIRQ_ROUTES
+#undef PCI_DEV_PIRQ_ROUTE
+#undef ACPI_DEV_IRQ
+#undef PCIE_BRIDGE_DEV
+#undef RP_IRQ_ROUTES
+#undef ROOTPORT_METHODS
+#undef ROOTPORT_IRQ_ROUTES
+#undef RP_METHOD
+
+#if defined(PIC_MODE)
+
+#define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \
+	Package() { ## dev_ ## ffff, pin_, \_SB.PCI0.LPCB.LNK ## pin_name_, 0 }
+
+#define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \
+Name(prefix_ ## func_ ## P, Package() \
+{ \
+	ACPI_DEV_IRQ(0x0000, 0, a_), \
+	ACPI_DEV_IRQ(0x0000, 1, b_), \
+	ACPI_DEV_IRQ(0x0000, 2, c_), \
+	ACPI_DEV_IRQ(0x0000, 3, d_), \
+})
+
+/* define as blank so ROOTPORT_METHODS only gets inserted once */
+#define ROOTPORT_METHODS(prefix_, dev_)
+
+#else /* defined(PIC_MODE) */
+
+#define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \
+	Package() { ## dev_ ## ffff, pin_, 0, PIRQ ## pin_name_ ## _APIC_IRQ }
+
+#define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \
+Name(prefix_ ## func_ ## A, Package() \
+{ \
+	ACPI_DEV_IRQ(0x0000, 0, a_), \
+	ACPI_DEV_IRQ(0x0000, 1, b_), \
+	ACPI_DEV_IRQ(0x0000, 2, c_), \
+	ACPI_DEV_IRQ(0x0000, 3, d_), \
+})
+
+#define ROOTPORT_METHODS(prefix_, dev_) \
+	RP_METHOD(prefix_, dev_, 0) \
+	RP_METHOD(prefix_, dev_, 1) \
+	RP_METHOD(prefix_, dev_, 2) \
+	RP_METHOD(prefix_, dev_, 3) \
+	RP_METHOD(prefix_, dev_, 4) \
+	RP_METHOD(prefix_, dev_, 5) \
+	RP_METHOD(prefix_, dev_, 6) \
+	RP_METHOD(prefix_, dev_, 7)
+
+#endif /* defined(PIC_MODE) */
+
+#define PCI_DEV_PIRQ_ROUTE(dev_, a_, b_, c_, d_) \
+	ACPI_DEV_IRQ(dev_, 0, a_), \
+	ACPI_DEV_IRQ(dev_, 1, b_), \
+	ACPI_DEV_IRQ(dev_, 2, c_), \
+	ACPI_DEV_IRQ(dev_, 3, d_)
+
+#define PCIE_BRIDGE_DEV(prefix_, dev_, a_, b_, c_, d_) \
+	ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \
+	ROOTPORT_METHODS(prefix_, dev_)
+
+#define ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 0, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 1, b_, c_, d_, a_) \
+	RP_IRQ_ROUTES(prefix_, 2, c_, d_, a_, b_) \
+	RP_IRQ_ROUTES(prefix_, 3, d_, a_, b_, c_) \
+	RP_IRQ_ROUTES(prefix_, 4, a_, b_, c_, d_) \
+	RP_IRQ_ROUTES(prefix_, 5, b_, c_, d_, a_) \
+	RP_IRQ_ROUTES(prefix_, 6, c_, d_, a_, b_) \
+	RP_IRQ_ROUTES(prefix_, 7, d_, a_, b_, c_)
+
+#define RP_METHOD(prefix_, dev_, func_)\
+Device (prefix_ ## 0 ## func_) \
+{ \
+	Name(_ADR, dev_ ## 000 ## func_) \
+	Name(_PRW, Package() { 0, 0 }) \
+	Method(_PRT) { \
+		If (PICM) { \
+			Return (prefix_ ## func_ ## A) \
+		} Else { \
+			Return (prefix_ ## func_ ## P) \
+		} \
+	} \
+}
+
+/* SoC specific PIRQ route configuration */
+#include "irqroute.h"
arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl new file +489 -0

489 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl new file +48 -0

48 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/acpi/irqroute.h new file +27 -0
new file mode 100644
index 0000000..924660e
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm/arch/device.h>
+
+#define PCI_DEV_PIRQ_ROUTES \
+	PCI_DEV_PIRQ_ROUTE(GFX_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(EMMC_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SDIO_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SD_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SATA_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(XHCI_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(LPE_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(MMC45_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SIO1_DEV,	A, C, D, B), \
+	PCI_DEV_PIRQ_ROUTE(TXE_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(HDA_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(PCIE_DEV,	A, B, C, D), \
+	PCI_DEV_PIRQ_ROUTE(EHCI_DEV,	A, A, A, A), \
+	PCI_DEV_PIRQ_ROUTE(SIO2_DEV,	A, D, B, C), \
+	PCI_DEV_PIRQ_ROUTE(PCU_DEV,	A, B, C, D)
+
+#define PCIE_BRIDGE_IRQ_ROUTES \
+	PCIE_BRIDGE_DEV(RP, PCIE_DEV,	A, B, C, D)
arch/x86/include/asm/arch-baytrail/acpi/lpc.asl new file +121 -0

121 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/acpi/platform.asl new file +34 -0
new file mode 100644
index 0000000..f6fa53b
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm/acpi/statdef.asl>
+#include <asm/arch/iomap.h>
+#include <asm/arch/irq.h>
+
+/*
+ * The _PTS method (Prepare To Sleep) is called before the OS is
+ * entering a sleep state. The sleep state number is passed in Arg0.
+ */
+Method(_PTS, 1)
+{
+}
+
+/* The _WAK method is called on system wakeup */
+Method(_WAK, 1)
+{
+	Return (Package() {0, 0})
+}
+
+/* TODO: add CPU ASL support */
+/* #include "cpu.asl" */
+
+Scope (\_SB)
+{
+	#include "southcluster.asl"
+}
+
+/* Chipset specific sleep states */
+#include "sleepstates.asl"
arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl new file +13 -0
new file mode 100644
index 0000000..eb5ae76
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2016 Bin Meng <[email protected]>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/sleepstates.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+Name(\_S0, Package() {0x0, 0x0, 0x0, 0x0})
+Name(\_S3, Package() {0x5, 0x0, 0x0, 0x0})
+Name(\_S4, Package() {0x6, 0x0, 0x0, 0x0})
+Name(\_S5, Package() {0x7, 0x0, 0x0, 0x0})
arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl new file +211 -0

211 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/acpi/usb.asl new file +34 -0
new file mode 100644
index 0000000..311f471
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2007-2009 coresystems GmbH
+ * Copyright (C) 2016 Bin Meng <[email protected]>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/usb.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* EHCI Controller 0:1d.0 */
+
+Device (EHC1)
+{
+	Name(_ADR, 0x001d0000)
+
+	/* Power Resources for Wake */
+	Name(_PRW, Package() { 13, 4 })
+
+	/* Highest D state in S3 state */
+	Name(_S3D, 2)
+
+	/* Highest D state in S4 state */
+	Name(_S4D, 2)
+
+	Device (HUB7)
+	{
+		Name(_ADR, 0x00000000)
+
+		Device(PRT1) { Name(_ADR, 1) }	/* USB Port 0 */
+		Device(PRT2) { Name(_ADR, 2) }	/* USB Port 1 */
+		Device(PRT3) { Name(_ADR, 3) }	/* USB Port 2 */
+		Device(PRT4) { Name(_ADR, 4) }	/* USB Port 3 */
+	}
+}
arch/x86/include/asm/arch-baytrail/acpi/xhci.asl new file +31 -0
new file mode 100644
index 0000000..a5a4404
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ * Copyright (C) 2016 Bin Meng <[email protected]>
+ *
+ * Modified from coreboot src/soc/intel/baytrail/acpi/xhci.asl
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* XHCI Controller 0:14.0 */
+
+Device (XHCI)
+{
+	Name(_ADR, 0x00140000)
+
+	/* Power Resources for Wake */
+	Name(_PRW, Package() { 13, 3 })
+
+	/* Highest D state in S3 state */
+	Name(_S3D, 3)
+
+	Device (RHUB)
+	{
+		Name(_ADR, 0x00000000)
+
+		Device (PRT1) { Name(_ADR, 1) }	/* USB Port 0 */
+		Device (PRT2) { Name(_ADR, 2) }	/* USB Port 1 */
+		Device (PRT3) { Name(_ADR, 3) }	/* USB Port 2 */
+		Device (PRT4) { Name(_ADR, 4) }	/* USB Port 3 */
+	}
+}
arch/x86/include/asm/arch-baytrail/device.h new file +74 -0

74 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/iomap.h new file +70 -0

70 lines not on this page · raw message

arch/x86/include/asm/arch-baytrail/irq.h new file +86 -0

86 lines not on this page · raw message

Signature · 1 line
1.8.2.1
author
#33 lore raw

PATCH 21/26 x86: baytrail: Generate ACPI FADT/MADT tables

In reply to Bin Meng

FADT/MADT tables are platform specific. Generate them for BayTrail.

---

 arch/x86/cpu/baytrail/Makefile |   1 +
 arch/x86/cpu/baytrail/acpi.c   | 162 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+)
 create mode 100644 arch/x86/cpu/baytrail/acpi.c
arch/x86/cpu/baytrail/Makefile +1 -0
index 5be5491..a0216f3 100644
@@ -8,3 +8,4 @@ obj-y += cpu.o
 obj-y += early_uart.o
 obj-y += fsp_configs.o
 obj-y += valleyview.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi.o
arch/x86/cpu/baytrail/acpi.c new file +162 -0

162 lines not on this page · raw message

Signature · 1 line
1.8.2.1
#34 lore raw

PATCH 21/26 x86: baytrail: Generate ACPI FADT/MADT tables

Hi Bin,

Quoted 169 lines · Bin Meng

FADT/MADT tables are platform specific. Generate them for BayTrail.

---

  arch/x86/cpu/baytrail/Makefile |   1 +
  arch/x86/cpu/baytrail/acpi.c   | 162 +++++++++++++++++++++++++++++++++++++++++
  2 files changed, 163 insertions(+)

create mode 100644 arch/x86/cpu/baytrail/acpi.c

arch/x86/cpu/baytrail/Makefile +1 -0
index 5be5491..a0216f3 100644
@@ -8,3 +8,4 @@ obj-y += cpu.o
  obj-y += early_uart.o
  obj-y += fsp_configs.o
  obj-y += valleyview.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi.o
arch/x86/cpu/baytrail/acpi.c new file +144 -0
new file mode 100644
index 0000000..a9c79f0
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/acpi_table.h>
+#include <asm/ioapic.h>
+#include <asm/mpspec.h>
+#include <asm/tables.h>
+#include <asm/arch/iomap.h>
+
+void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
+		      void *dsdt)
+{
+	struct acpi_table_header *header = &(fadt->header);
+	u16 pmbase = ACPI_BASE_ADDRESS;
+
+	memset((void *)fadt, 0, sizeof(struct acpi_fadt));
+
+	acpi_fill_header(header, "FACP");
+	header->length = sizeof(struct acpi_fadt);
+	header->revision = 3;
+
+	fadt->firmware_ctrl = (u32)facs;
+	fadt->dsdt = (u32)dsdt;
+	fadt->preferred_pm_profile = ACPI_PM_MOBILE;
+	fadt->sci_int = 9;
+	fadt->smi_cmd = 0;
+	fadt->acpi_enable = 0;
+	fadt->acpi_disable = 0;
+	fadt->s4bios_req = 0x0;
+	fadt->pstate_cnt = 0;
+	fadt->pm1a_evt_blk = pmbase;
+	fadt->pm1b_evt_blk = 0x0;
+	fadt->pm1a_cnt_blk = pmbase + 0x4;
+	fadt->pm1b_cnt_blk = 0x0;
+	fadt->pm2_cnt_blk = pmbase + 0x50;
+	fadt->pm_tmr_blk = pmbase + 0x8;
+	fadt->gpe0_blk = pmbase + 0x20;
+	fadt->gpe1_blk = 0;
+	fadt->pm1_evt_len = 4;
+	fadt->pm1_cnt_len = 2;
+	fadt->pm2_cnt_len = 1;
+	fadt->pm_tmr_len = 4;
+	fadt->gpe0_blk_len = 16;
+	fadt->gpe1_blk_len = 0;
+	fadt->gpe1_base = 0;
+	fadt->cst_cnt = 0;
+	fadt->p_lvl3_lat = 87;
+	fadt->flush_size = 1024;
+	fadt->flush_stride = 16;
+	fadt->duty_offset = 1;
+	fadt->day_alrm = 0xd;
+	fadt->mon_alrm = 0x00;
+	fadt->century = 0x00;
+	fadt->iapc_boot_arch = ACPI_FADT_LEGACY_DEVICES | ACPI_FADT_8042;
+
+	fadt->flags = ACPI_FADT_WBINVD |
+		ACPI_FADT_C1_SUPPORTED |
+		ACPI_FADT_SLEEP_BUTTON |
+		ACPI_FADT_RESET_REGISTER |
+		ACPI_FADT_SEALED_CASE |
+		ACPI_FADT_S4_RTC_WAKE |
+		ACPI_FADT_PLATFORM_CLOCK;
+	fadt->reset_reg.space_id = 1;
+	fadt->reset_reg.bit_width = 8;
+	fadt->reset_reg.bit_offset = 0;
+	fadt->reset_reg.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+	fadt->reset_reg.addrl = 0xcf9;
+	fadt->reset_reg.addrh = 0;
+	fadt->reset_value = 6;
+	fadt->x_firmware_ctl_l = (u32)facs;
+	fadt->x_firmware_ctl_h = 0;
+	fadt->x_dsdt_l = (u32)dsdt;
+	fadt->x_dsdt_h = 0;
+
+	fadt->x_pm1a_evt_blk.space_id = 1;
+	fadt->x_pm1a_evt_blk.bit_width = 32;
+	fadt->x_pm1a_evt_blk.bit_offset = 0;
+	fadt->x_pm1a_evt_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_pm1a_evt_blk.addrl = pmbase;
+	fadt->x_pm1a_evt_blk.addrh = 0x0;
+
+	fadt->x_pm1b_evt_blk.space_id = 1;
+	fadt->x_pm1b_evt_blk.bit_width = 0;
+	fadt->x_pm1b_evt_blk.bit_offset = 0;
+	fadt->x_pm1b_evt_blk.access_size = 0;
+	fadt->x_pm1b_evt_blk.addrl = 0x0;
+	fadt->x_pm1b_evt_blk.addrh = 0x0;
+
+	fadt->x_pm1a_cnt_blk.space_id = 1;
+	fadt->x_pm1a_cnt_blk.bit_width = 16;
+	fadt->x_pm1a_cnt_blk.bit_offset = 0;
+	fadt->x_pm1a_cnt_blk.access_size = ACPI_ACCESS_SIZE_WORD_ACCESS;
+	fadt->x_pm1a_cnt_blk.addrl = pmbase + 0x4;
+	fadt->x_pm1a_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm1b_cnt_blk.space_id = 1;
+	fadt->x_pm1b_cnt_blk.bit_width = 0;
+	fadt->x_pm1b_cnt_blk.bit_offset = 0;
+	fadt->x_pm1b_cnt_blk.access_size = 0;
+	fadt->x_pm1b_cnt_blk.addrl = 0x0;
+	fadt->x_pm1b_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm2_cnt_blk.space_id = 1;
+	fadt->x_pm2_cnt_blk.bit_width = 8;
+	fadt->x_pm2_cnt_blk.bit_offset = 0;
+	fadt->x_pm2_cnt_blk.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+	fadt->x_pm2_cnt_blk.addrl = pmbase + 0x50;
+	fadt->x_pm2_cnt_blk.addrh = 0x0;
+
+	fadt->x_pm_tmr_blk.space_id = 1;
+	fadt->x_pm_tmr_blk.bit_width = 32;
+	fadt->x_pm_tmr_blk.bit_offset = 0;
+	fadt->x_pm_tmr_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_pm_tmr_blk.addrl = pmbase + 0x8;
+	fadt->x_pm_tmr_blk.addrh = 0x0;
+
+	fadt->x_gpe0_blk.space_id = 1;
+	fadt->x_gpe0_blk.bit_width = 128;
+	fadt->x_gpe0_blk.bit_offset = 0;
+	fadt->x_gpe0_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+	fadt->x_gpe0_blk.addrl = pmbase + 0x20;
+	fadt->x_gpe0_blk.addrh = 0x0;
+
+	fadt->x_gpe1_blk.space_id = 1;
+	fadt->x_gpe1_blk.bit_width = 0;
+	fadt->x_gpe1_blk.bit_offset = 0;
+	fadt->x_gpe1_blk.access_size = 0;
+	fadt->x_gpe1_blk.addrl = 0x0;
+	fadt->x_gpe1_blk.addrh = 0x0;
+
+	header->checksum = table_compute_checksum(fadt, header->length);
+}
+
+u32 acpi_madt_irq_overrides(u32 current)
+{
+	struct acpi_madt_irqoverride *irqovr;
+	u16 sci_flags = MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH;
+
+	irqovr = (void *)current;
+	current += acpi_create_madt_irqoverride(irqovr, 0, 0, 2, 0);

arch/x86/cpu/baytrail/acpi.c line 154

Quoted 10 lines
arch/x86/cpu/baytrail/acpi.c new file +10 -0
+
+	irqovr = (void *)current;
+	current += acpi_create_madt_irqoverride(irqovr, 0, 9, 9, sci_flags);
+
+	return current;
+}
+
+u32 acpi_fill_madt(u32 current)
+{
+	current = acpi_create_madt_lapics(current);

I'm not sure if you need '+=' here?

arch/x86/cpu/baytrail/acpi.c line 159

Quoted 5 lines
arch/x86/cpu/baytrail/acpi.c new file +5 -0
+
+	current += acpi_create_madt_ioapic((struct acpi_madt_ioapic *)current,
+			2, IO_APIC_ADDR, 0);
+
+	current = acpi_madt_irq_overrides(current);

Here '+=' definitely seems to be necessary.

Thanks,
Stefan

author
#35 lore raw

PATCH 21/26 x86: baytrail: Generate ACPI FADT/MADT tables

Hi Stefan,

Quoted 182 lines · Stefan Roese

Hi Bin,

Quoted 178 lines · Bin Meng

FADT/MADT tables are platform specific. Generate them for BayTrail.

---

  arch/x86/cpu/baytrail/Makefile |   1 +
  arch/x86/cpu/baytrail/acpi.c   | 162
+++++++++++++++++++++++++++++++++++++++++
  2 files changed, 163 insertions(+)

create mode 100644 arch/x86/cpu/baytrail/acpi.c

arch/x86/cpu/baytrail/Makefile +1 -0
index 5be5491..a0216f3 100644
@@ -8,3 +8,4 @@ obj-y += cpu.o
  obj-y += early_uart.o
  obj-y += fsp_configs.o
  obj-y += valleyview.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi.o
arch/x86/cpu/baytrail/acpi.c new file +147 -0
new file mode 100644
index 0000000..a9c79f0
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/acpi_table.h>
+#include <asm/ioapic.h>
+#include <asm/mpspec.h>
+#include <asm/tables.h>
+#include <asm/arch/iomap.h>
+
+void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
+                     void *dsdt)
+{
+       struct acpi_table_header *header = &(fadt->header);
+       u16 pmbase = ACPI_BASE_ADDRESS;
+
+       memset((void *)fadt, 0, sizeof(struct acpi_fadt));
+
+       acpi_fill_header(header, "FACP");
+       header->length = sizeof(struct acpi_fadt);
+       header->revision = 3;
+
+       fadt->firmware_ctrl = (u32)facs;
+       fadt->dsdt = (u32)dsdt;
+       fadt->preferred_pm_profile = ACPI_PM_MOBILE;
+       fadt->sci_int = 9;
+       fadt->smi_cmd = 0;
+       fadt->acpi_enable = 0;
+       fadt->acpi_disable = 0;
+       fadt->s4bios_req = 0x0;
+       fadt->pstate_cnt = 0;
+       fadt->pm1a_evt_blk = pmbase;
+       fadt->pm1b_evt_blk = 0x0;
+       fadt->pm1a_cnt_blk = pmbase + 0x4;
+       fadt->pm1b_cnt_blk = 0x0;
+       fadt->pm2_cnt_blk = pmbase + 0x50;
+       fadt->pm_tmr_blk = pmbase + 0x8;
+       fadt->gpe0_blk = pmbase + 0x20;
+       fadt->gpe1_blk = 0;
+       fadt->pm1_evt_len = 4;
+       fadt->pm1_cnt_len = 2;
+       fadt->pm2_cnt_len = 1;
+       fadt->pm_tmr_len = 4;
+       fadt->gpe0_blk_len = 16;
+       fadt->gpe1_blk_len = 0;
+       fadt->gpe1_base = 0;
+       fadt->cst_cnt = 0;
+       fadt->p_lvl3_lat = 87;
+       fadt->flush_size = 1024;
+       fadt->flush_stride = 16;
+       fadt->duty_offset = 1;
+       fadt->day_alrm = 0xd;
+       fadt->mon_alrm = 0x00;
+       fadt->century = 0x00;
+       fadt->iapc_boot_arch = ACPI_FADT_LEGACY_DEVICES | ACPI_FADT_8042;
+
+       fadt->flags = ACPI_FADT_WBINVD |
+               ACPI_FADT_C1_SUPPORTED |
+               ACPI_FADT_SLEEP_BUTTON |
+               ACPI_FADT_RESET_REGISTER |
+               ACPI_FADT_SEALED_CASE |
+               ACPI_FADT_S4_RTC_WAKE |
+               ACPI_FADT_PLATFORM_CLOCK;
+       fadt->reset_reg.space_id = 1;
+       fadt->reset_reg.bit_width = 8;
+       fadt->reset_reg.bit_offset = 0;
+       fadt->reset_reg.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+       fadt->reset_reg.addrl = 0xcf9;
+       fadt->reset_reg.addrh = 0;
+       fadt->reset_value = 6;
+       fadt->x_firmware_ctl_l = (u32)facs;
+       fadt->x_firmware_ctl_h = 0;
+       fadt->x_dsdt_l = (u32)dsdt;
+       fadt->x_dsdt_h = 0;
+
+       fadt->x_pm1a_evt_blk.space_id = 1;
+       fadt->x_pm1a_evt_blk.bit_width = 32;
+       fadt->x_pm1a_evt_blk.bit_offset = 0;
+       fadt->x_pm1a_evt_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+       fadt->x_pm1a_evt_blk.addrl = pmbase;
+       fadt->x_pm1a_evt_blk.addrh = 0x0;
+
+       fadt->x_pm1b_evt_blk.space_id = 1;
+       fadt->x_pm1b_evt_blk.bit_width = 0;
+       fadt->x_pm1b_evt_blk.bit_offset = 0;
+       fadt->x_pm1b_evt_blk.access_size = 0;
+       fadt->x_pm1b_evt_blk.addrl = 0x0;
+       fadt->x_pm1b_evt_blk.addrh = 0x0;
+
+       fadt->x_pm1a_cnt_blk.space_id = 1;
+       fadt->x_pm1a_cnt_blk.bit_width = 16;
+       fadt->x_pm1a_cnt_blk.bit_offset = 0;
+       fadt->x_pm1a_cnt_blk.access_size = ACPI_ACCESS_SIZE_WORD_ACCESS;
+       fadt->x_pm1a_cnt_blk.addrl = pmbase + 0x4;
+       fadt->x_pm1a_cnt_blk.addrh = 0x0;
+
+       fadt->x_pm1b_cnt_blk.space_id = 1;
+       fadt->x_pm1b_cnt_blk.bit_width = 0;
+       fadt->x_pm1b_cnt_blk.bit_offset = 0;
+       fadt->x_pm1b_cnt_blk.access_size = 0;
+       fadt->x_pm1b_cnt_blk.addrl = 0x0;
+       fadt->x_pm1b_cnt_blk.addrh = 0x0;
+
+       fadt->x_pm2_cnt_blk.space_id = 1;
+       fadt->x_pm2_cnt_blk.bit_width = 8;
+       fadt->x_pm2_cnt_blk.bit_offset = 0;
+       fadt->x_pm2_cnt_blk.access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
+       fadt->x_pm2_cnt_blk.addrl = pmbase + 0x50;
+       fadt->x_pm2_cnt_blk.addrh = 0x0;
+
+       fadt->x_pm_tmr_blk.space_id = 1;
+       fadt->x_pm_tmr_blk.bit_width = 32;
+       fadt->x_pm_tmr_blk.bit_offset = 0;
+       fadt->x_pm_tmr_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+       fadt->x_pm_tmr_blk.addrl = pmbase + 0x8;
+       fadt->x_pm_tmr_blk.addrh = 0x0;
+
+       fadt->x_gpe0_blk.space_id = 1;
+       fadt->x_gpe0_blk.bit_width = 128;
+       fadt->x_gpe0_blk.bit_offset = 0;
+       fadt->x_gpe0_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
+       fadt->x_gpe0_blk.addrl = pmbase + 0x20;
+       fadt->x_gpe0_blk.addrh = 0x0;
+
+       fadt->x_gpe1_blk.space_id = 1;
+       fadt->x_gpe1_blk.bit_width = 0;
+       fadt->x_gpe1_blk.bit_offset = 0;
+       fadt->x_gpe1_blk.access_size = 0;
+       fadt->x_gpe1_blk.addrl = 0x0;
+       fadt->x_gpe1_blk.addrh = 0x0;
+
+       header->checksum = table_compute_checksum(fadt, header->length);
+}
+
+u32 acpi_madt_irq_overrides(u32 current)
+{
+       struct acpi_madt_irqoverride *irqovr;
+       u16 sci_flags = MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH;
+
+       irqovr = (void *)current;
+       current += acpi_create_madt_irqoverride(irqovr, 0, 0, 2, 0);
+
+       irqovr = (void *)current;
+       current += acpi_create_madt_irqoverride(irqovr, 0, 9, 9,

sci_flags);

arch/x86/cpu/baytrail/acpi.c new file +2 -0
+
+       return current;
Quoted 8 lines

arch/x86/cpu/baytrail/acpi.c line 154

Quoted 5 lines
arch/x86/cpu/baytrail/acpi.c new file +5 -0
+}
+
+u32 acpi_fill_madt(u32 current)
+{
+       current = acpi_create_madt_lapics(current);

I'm not sure if you need '+=' here?

No, it's not needed.

Quoted 11 lines

arch/x86/cpu/baytrail/acpi.c line 159

Quoted 7 lines
arch/x86/cpu/baytrail/acpi.c new file +2 -0
+
+       current += acpi_create_madt_ioapic((struct acpi_madt_ioapic

*)current,

arch/x86/cpu/baytrail/acpi.c new file +3 -0
+                       2, IO_APIC_ADDR, 0);
+
+       current = acpi_madt_irq_overrides(current);

Here '+=' definitely seems to be necessary.

= is actually correct. But I admit these are confusing due to inconsistent return values (some are table length while some are table end address). I will create a new patch to unify them.

Regards,
Bin

author
#36 lore raw

PATCH 22/26 x86: baytrail: Enable ACPI table generation for all boards

In reply to Bin Meng

Enable ACPI table generation by creating a DSDT table for all baytrail
boards: conga-qeval20-qa3-e3845, bayleybay and minnowmax.

---

 board/congatec/conga-qeval20-qa3-e3845/Makefile           |  1 +
 board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl | 13 +++++++++++++
 board/congatec/conga-qeval20-qa3-e3845/dsdt.asl           | 14 ++++++++++++++
 board/intel/bayleybay/Makefile                            |  1 +
 board/intel/bayleybay/acpi/mainboard.asl                  | 11 +++++++++++
 board/intel/bayleybay/dsdt.asl                            | 14 ++++++++++++++
 board/intel/minnowmax/Makefile                            |  1 +
 board/intel/minnowmax/acpi/mainboard.asl                  | 11 +++++++++++
 board/intel/minnowmax/dsdt.asl                            | 14 ++++++++++++++
 configs/bayleybay_defconfig                               |  1 +
 configs/conga-qeval20-qa3-e3845_defconfig                 |  1 +
 configs/minnowmax_defconfig                               |  1 +
 12 files changed, 83 insertions(+)
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/dsdt.asl
 create mode 100644 board/intel/bayleybay/acpi/mainboard.asl
 create mode 100644 board/intel/bayleybay/dsdt.asl
 create mode 100644 board/intel/minnowmax/acpi/mainboard.asl
 create mode 100644 board/intel/minnowmax/dsdt.asl
board/congatec/conga-qeval20-qa3-e3845/Makefile +1 -0
index 23b8748..b784510 100644
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= conga-qeval20-qa3.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl new file +13 -0
new file mode 100644
index 0000000..eace459
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
+
+/* TODO: Need add Winbond SuperIO chipset W83627 ASL codes */
board/congatec/conga-qeval20-qa3-e3845/dsdt.asl new file +14 -0
new file mode 100644
index 0000000..6042011
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
board/intel/bayleybay/Makefile +1 -0
index 88b5aad..52dda7d 100644
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= bayleybay.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
board/intel/bayleybay/acpi/mainboard.asl new file +11 -0
new file mode 100644
index 0000000..21785ea
@@ -0,0 +1,11 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
board/intel/bayleybay/dsdt.asl new file +14 -0
new file mode 100644
index 0000000..6042011
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
board/intel/minnowmax/Makefile +1 -0
index 1a61432..73e5a8f 100644
@@ -5,3 +5,4 @@
 #
 
 obj-y	+= minnowmax.o start.o
+obj-$(CONFIG_GENERATE_ACPI_TABLE) += dsdt.o
board/intel/minnowmax/acpi/mainboard.asl new file +11 -0
new file mode 100644
index 0000000..21785ea
@@ -0,0 +1,11 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+/* Power Button */
+Device (PWRB)
+{
+	Name(_HID, EISAID("PNP0C0C"))
+}
board/intel/minnowmax/dsdt.asl new file +14 -0
new file mode 100644
index 0000000..6042011
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2016, Bin Meng <[email protected]>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+DefinitionBlock("dsdt.aml", "DSDT", 2, "U-BOOT", "U-BOOTBL", 0x00010000)
+{
+	/* platform specific */
+	#include <asm/arch/acpi/platform.asl>
+
+	/* board specific */
+	#include "acpi/mainboard.asl"
+}
configs/bayleybay_defconfig +1 -0
index dfafb0b..465394e 100644
@@ -9,6 +9,7 @@ CONFIG_HAVE_VGA_BIOS=y
 CONFIG_VGA_BIOS_ADDR=0xfffa0000
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
 CONFIG_FIT=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
configs/conga-qeval20-qa3-e3845_defconfig +1 -0
index 24a927d..044045d 100644
@@ -8,6 +8,7 @@ CONFIG_SMP=y
 CONFIG_HAVE_VGA_BIOS=y
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_BOOTSTAGE=y
configs/minnowmax_defconfig +1 -0
index efb9c1e..cebd660 100644
@@ -8,6 +8,7 @@ CONFIG_SMP=y
 CONFIG_HAVE_VGA_BIOS=y
 CONFIG_GENERATE_PIRQ_TABLE=y
 CONFIG_GENERATE_MP_TABLE=y
+CONFIG_GENERATE_ACPI_TABLE=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_BOOTSTAGE=y
Signature · 1 line
1.8.2.1
author
#37 lore raw

PATCH 23/26 x86: baytrail: Add .gitignore for ACPI enabled boards

In reply to Bin Meng

Let git ignore dsdt.aml and dsdt.asl.tmp files.

---

 board/congatec/conga-qeval20-qa3-e3845/.gitignore | 3 +++
 board/intel/bayleybay/.gitignore                  | 3 +++
 board/intel/minnowmax/.gitignore                  | 3 +++
 3 files changed, 9 insertions(+)
 create mode 100644 board/congatec/conga-qeval20-qa3-e3845/.gitignore
 create mode 100644 board/intel/bayleybay/.gitignore
 create mode 100644 board/intel/minnowmax/.gitignore
board/congatec/conga-qeval20-qa3-e3845/.gitignore new file +3 -0
new file mode 100644
index 0000000..6eb8a54
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
board/intel/bayleybay/.gitignore new file +3 -0
new file mode 100644
index 0000000..6eb8a54
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
board/intel/minnowmax/.gitignore new file +3 -0
new file mode 100644
index 0000000..6eb8a54
@@ -0,0 +1,3 @@
+dsdt.aml
+dsdt.asl.tmp
+dsdt.c
Signature · 1 line
1.8.2.1
author
#38 lore raw

PATCH 24/26 x86: Remove acpi=off boot parameter when ACPI is on

In reply to Bin Meng

Remove the kernel boot parameter acpi=off so that kernel can turn on ACPI support.

---

 include/configs/x86-common.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
include/configs/x86-common.h +7 -2
index ea815c2..1e0f451 100644
@@ -207,14 +207,19 @@
 #define CONFIG_HOSTNAME		x86
 #define CONFIG_BOOTFILE		"bzImage"
 #define CONFIG_LOADADDR		0x1000000
-#define CONFIG_RAMDISK_ADDR		0x4000000
+#define CONFIG_RAMDISK_ADDR	0x4000000
+#ifdef CONFIG_GENERATE_ACPI_TABLE
+#define CONFIG_OTHBOOTARGS	"othbootargs=\0"
+#else
+#define CONFIG_OTHBOOTARGS	"othbootargs=acpi=off\0"
+#endif
 
 #define CONFIG_EXTRA_ENV_SETTINGS			\
 	CONFIG_STD_DEVICES_SETTINGS			\
 	"pciconfighost=1\0"				\
 	"netdev=eth0\0"					\
 	"consoledev=ttyS0\0"				\
-	"othbootargs=acpi=off\0"			\
+	CONFIG_OTHBOOTARGS				\
 	"ramdiskaddr=0x4000000\0"			\
 	"ramdiskfile=initramfs.gz\0"
 
Signature · 1 line
1.8.2.1
author
#39 lore raw

PATCH 25/26 x86: doc: Minor update for accuracy

In reply to Bin Meng

This updates the doc for the following places:
- Mention CRB for Bayley Bay
- Limit part of the QEMU paragraphs to 80 cols
- Correct some typos (drive, it's, Ubuntu)
- Add description for "console=ttyS0,115200"
- Remove CONFIG_BOOTDELAY description which is already in x86-common.h

---

 doc/README.x86 | 40 +++++++++++++++++-----------------------
 1 file changed, 17 insertions(+), 23 deletions(-)
doc/README.x86 +17 -23
index c5c3010..a5dfb86 100644
@@ -23,7 +23,7 @@ In this case, known as bare mode, from the fact that it runs on the
 'bare metal', U-Boot acts like a BIOS replacement. The following platforms
 are supported:
 
-   - Bayley Bay
+   - Bayley Bay CRB
    - Cougar Canyon 2 CRB
    - Crown Bay CRB
    - Galileo
@@ -412,18 +412,19 @@ If you want to check both consoles, use '-serial stdio'.
 Multicore is also supported by QEMU via '-smp n' where n is the number of cores
 to instantiate. Note, the maximum supported CPU number in QEMU is 255.
 
-The fw_cfg interface in QEMU also provides information about kernel data, initrd,
-command-line arguments and more. U-Boot supports directly accessing these informtion
-from fw_cfg interface, this saves the time of loading them from hard disk or
-network again, through emulated devices. To use it , simply providing them in
-QEMU command line:
+The fw_cfg interface in QEMU also provides information about kernel data,
+initrd, command-line arguments and more. U-Boot supports directly accessing
+these informtion from fw_cfg interface, which saves the time of loading them
+from hard disk or network again, through emulated devices. To use it , simply
+providing them in QEMU command line:
 
 $ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024 -kernel /path/to/bzImage
     -append 'root=/dev/ram console=ttyS0' -initrd /path/to/initrd -smp 8
 
 Note: -initrd and -smp are both optional
 
-Then start QEMU, in U-Boot command line use the following U-Boot command to setup kernel:
+Then start QEMU, in U-Boot command line use the following U-Boot command to
+setup kernel:
 
  => qfw
 qfw - QEMU firmware interface
@@ -437,8 +438,8 @@ qfw <command>
 => qfw load
 loading kernel to address 01000000 size 5d9d30 initrd 04000000 size 1b1ab50
 
-Here the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then, 'zboot'
-can be used to boot the kernel:
+Here the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then,
+'zboot' can be used to boot the kernel:
 
 => zboot 02000000 - 04000000 1b1ab50
 
@@ -490,8 +491,8 @@ Booting Ubuntu
 --------------
 As an example of how to set up your boot flow with U-Boot, here are
 instructions for starting Ubuntu from U-Boot. These instructions have been
-tested on Minnowboard MAX with a SATA driver but are equally applicable on
-other platforms and other media. There are really only four steps and its a
+tested on Minnowboard MAX with a SATA drive but are equally applicable on
+other platforms and other media. There are really only four steps and it's a
 very simple script, but a more detailed explanation is provided here for
 completeness.
 
@@ -499,7 +500,7 @@ Note: It is possible to set up U-Boot to boot automatically using syslinux.
 It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
 GUID. If you figure these out, please post patches to this README.
 
-Firstly, you will need Ubunutu installed on an available disk. It should be
+Firstly, you will need Ubuntu installed on an available disk. It should be
 possible to make U-Boot start a USB start-up disk but for now let's assume
 that you used another boot loader to install Ubuntu.
 
@@ -659,7 +660,7 @@ U-Boot:
    Loading bzImage at address 100000 (5805728 bytes)
    Magic signature found
    Initial RAM disk at linear address 0x04000000, size 19215259 bytes
-   Kernel command line: "console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
+   Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
 
    Starting kernel ...
 
@@ -679,13 +680,14 @@ above commands into a script since then it will be faster.
                   240,329  ahci
                 1,422,704  vesa display
 
-Now the kernel actually starts:
+Now the kernel actually starts: (if you want to examine kernel boot up message
+on the serial console, append "console=ttyS0,115200" to the kernel command line)
 
    [    0.000000] Initializing cgroup subsys cpuset
    [    0.000000] Initializing cgroup subsys cpu
    [    0.000000] Initializing cgroup subsys cpuacct
    [    0.000000] Linux version 3.13.0-58-generic (buildd at allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
-   [    0.000000] Command line: console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
+   [    0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
 
 It continues for a long time. Along the way you will see it pick up your
 ramdisk:
@@ -736,14 +738,6 @@ If you want to put this in a script you can use something like this:
 The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
 command.
 
-You will also need to add this to your board configuration file, e.g.
-include/configs/minnowmax.h:
-
-   #define CONFIG_BOOTDELAY	2
-
-Now when you reset your board it wait a few seconds (in case you want to
-interrupt) and then should boot straight into Ubuntu.
-
 You can also bake this behaviour into your build by hard-coding the
 environment variables if you add this to minnowmax.h:
 
Signature · 1 line
1.8.2.1
author
#40 lore raw

PATCH 26/26 x86: doc: Document ACPI support

In reply to Bin Meng

Remove ACPI from the TODO list and add a new section to document current ACPI support in U-Boot.

---

 doc/README.x86 | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
doc/README.x86 +35 -1
index a5dfb86..d74e6e4 100644
@@ -957,12 +957,44 @@ transformations. Remember to add attribution to coreboot for new files added
 to U-Boot. This should go at the top of each file and list the coreboot
 filename where the code originated.
 
+ACPI Support Status
+-------------------
+Advanced Configuration and Power Interface (ACPI) [16] aims to establish
+industry-standard interfaces enabling OS-directed configuration, power
+management, and thermal management of mobile, desktop, and server platforms.
+
+Linux can boot without ACPI with "acpi=off" command line parameter, but
+with ACPI the kernel gains the capabilities to handle power management.
+For Windows, ACPI is a must-have firmware feature since Windows Vista.
+CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in
+U-Boot. This requires Intel ACPI compiler to be installed on your host to
+compile ACPI DSDT table written in ASL format to AML format. You can get
+the compiler via "apt-get install iasl" if you are on Ubuntu or download
+the source from [17] to compile one by yourself.
+
+Current ACPI support in U-Boot is not complete. More features will be added
+in the future. The status as of today is:
+
+ * Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
+ * Support one static DSDT table only, compiled by Intel ACPI compiler.
+ * Support S0/S5 only, no S3/S4 boot path support yet.
+ * No ACPI global NVS support (this can be optional, but we may need it in
+   the future to simplify ASL code logic when utilizing NVS variables).
+ * No dynamic AML bytecodes insertion at run-time (this is optional as we
+   can always describe the board in the static way).
+ * All ACPI interrupts are routed to SCI for OS to handle. No legacy SMI
+   implementation within U-Boot.
+ * Install Ubuntu from U-Boot plus SeaBIOS does not work.
+ * Install Windows 8.1/10 from U-Boot plus SeaBIOS does not work.
+
+So far ACPI is enabled on BayTrail based boards. Testing was done by booting
+a pre-installed Ubuntu 14.04 from a SATA drive. Most devices seem to work
+correctly and the board can respond a reboot/shutdown command from Ubuntu.
 
 TODO List
 ---------
 - Audio
 - Chrome OS verified boot
-- SMI and ACPI support, to provide platform info and facilities to Linux
 
 References
 ----------
@@ -981,3 +1013,5 @@ References
 [13] http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
 [14] http://www.seabios.org/SeaBIOS
 [15] doc/device-tree-bindings/misc/intel,irq-router.txt
+[16] http://www.acpi.info
+[17] https://www.acpica.org/downloads
Signature · 1 line
1.8.2.1
#41 lore raw

cover x86: Initial ACPI support for Intel BayTrail

In reply to Bin Meng

Hi Bin,

thank you very much for this patch series. I've given the patchset a quick review and tested it shortly on the BayTrail Congatec board. And have seen no issues so far. Shutdown and reboot also seem to work just fine. I'll definitely give it a more thorough test in the next days / weeks.

I've sent you a few minor comments to some of the patches. But please add my:

to all patches.

Thanks,
Stefan

Quoted 137 lines · Bin Meng

This series introduces initial ACPI support for Intel BayTrail.

Advanced Configuration and Power Interface (ACPI) aims to establish industry-standard interfaces enabling OS-directed configuration, power management, and thermal management of mobile, desktop, and server platforms.

Linux can boot without ACPI with "acpi=off" command line parameter, but with ACPI the kernel gains the capabilities to handle power management. For Windows, ACPI is a must-have firmware feature since Windows Vista. CONFIG_GENERATE_ACPI_TABLE is the config option to turn on ACPI support in U-Boot. This requires Intel ACPI compiler to be installed on your host to compile ACPI DSDT table written in ASL format to AML format. You can get the compiler via "apt-get install iasl" if you are on Ubuntu or download the source from acpica website to compile one by yourself.

Current ACPI support in U-Boot is not complete. More features will be added in the future. The status as of today is:

* Support generating RSDT, XSDT, FACS, FADT, MADT, MCFG tables.
* Support one static DSDT table only, compiled by Intel ACPI compiler.
* Support S0/S5 only, no S3/S4 boot path support yet.
* No ACPI global NVS support (this can be optional, but we may need it in the future to simplify ASL code logic when utilizing NVS variables).
* No dynamic AML bytecodes insertion at run-time (this is optional as we can always describe the board in the static way).
* All ACPI interrupts are routed to SCI for OS to handle. No legacy SMI implementation within U-Boot.
* Install Ubuntu from U-Boot plus SeaBIOS does not work.
* Install Windows 8.1/10 from U-Boot plus SeaBIOS does not work.

So far ACPI is enabled on BayTrail based boards. Testing was done by booting a pre-installed Ubuntu 14.04 from a SATA drive. Most devices seem to work correctly and the board can respond a reboot/shutdown command from Ubuntu.

This series is available at u-boot-x86/acpi-working.

Bin Meng (26):
x86: Drop asm/acpi.h
x86: Fix build warning in tables.c when CONFIG_SEABIOS
x86: acpi: Fix compiler warnings in write_acpi_tables()
x86: irq: Reserve IRQ9 for ACPI in PIC mode
x86: irq: Enable SCI on IRQ9
x86: dts: Update to include ACTL register details
acpi: Change build log for ASL files
acpi: Explicitly spell out dsdt.c in the make rule
acpi: Specify U-Boot include path for ASL files
acpi: Do not disable all errors/warnings/remarks when compiling ASL
x86: acpi: Remove unneeded codes
x86: acpi: Various changes to acpi_table.h
x86: acpi: Reorder codes in acpi_table.h
x86: acpi: Remove acpi_create_ssdt_generator()
x86: acpi: Change fill_header()
x86: acpi: Adjust orders in acpi_table.c
x86: acpi: Change table write routine signature to use u32
x86: acpi: Align FACS table to a 64 byte boundary
x86: acpi: Add some generic ASL libraries
x86: baytrail: Add platform ASL files
x86: baytrail: Generate ACPI FADT/MADT tables
x86: baytrail: Enable ACPI table generation for all boards
x86: baytrail: Add .gitignore for ACPI enabled boards
x86: Remove acpi=off boot parameter when ACPI is on
x86: doc: Minor update for accuracy
x86: doc: Document ACPI support

  arch/x86/cpu/baytrail/Makefile                     |   1 +
  arch/x86/cpu/baytrail/acpi.c                       | 162 +++++++
  arch/x86/cpu/irq.c                                 |  29 ++
  arch/x86/cpu/ivybridge/lpc.c                       |   1 -
  arch/x86/cpu/ivybridge/model_206ax.c               |   1 -
  arch/x86/cpu/ivybridge/northbridge.c               |   1 -
  arch/x86/dts/bayleybay.dts                         |   1 +
  arch/x86/dts/conga-qeval20-qa3-e3845.dts           |   1 +
  arch/x86/dts/crownbay.dts                          |   1 +
  arch/x86/dts/galileo.dts                           |   1 +
  arch/x86/dts/minnowmax.dts                         |   1 +
  arch/x86/dts/qemu-x86_q35.dts                      |   2 +
  arch/x86/include/asm/acpi.h                        |  24 -
  arch/x86/include/asm/acpi/debug.asl                | 136 ++++++
  arch/x86/include/asm/acpi/globutil.asl             | 113 +++++
  arch/x86/include/asm/acpi/statdef.asl              |  82 ++++
  arch/x86/include/asm/acpi_table.h                  | 447 ++++++++-----------
  .../include/asm/arch-baytrail/acpi/irq_helper.h    | 111 +++++
  .../include/asm/arch-baytrail/acpi/irqlinks.asl    | 489 +++++++++++++++++++++
  .../include/asm/arch-baytrail/acpi/irqroute.asl    |  48 ++
  arch/x86/include/asm/arch-baytrail/acpi/irqroute.h |  27 ++
  arch/x86/include/asm/arch-baytrail/acpi/lpc.asl    | 121 +++++
  .../include/asm/arch-baytrail/acpi/platform.asl    |  34 ++
  .../include/asm/arch-baytrail/acpi/sleepstates.asl |  13 +
  .../asm/arch-baytrail/acpi/southcluster.asl        | 211 +++++++++
  arch/x86/include/asm/arch-baytrail/acpi/usb.asl    |  34 ++
  arch/x86/include/asm/arch-baytrail/acpi/xhci.asl   |  31 ++
  arch/x86/include/asm/arch-baytrail/device.h        |  74 ++++
  arch/x86/include/asm/arch-baytrail/iomap.h         |  70 +++
  arch/x86/include/asm/arch-baytrail/irq.h           |  86 ++++
  arch/x86/include/asm/irq.h                         |   4 +
  arch/x86/lib/acpi_table.c                          | 311 ++++++-------
  arch/x86/lib/tables.c                              |   1 +
  board/congatec/conga-qeval20-qa3-e3845/.gitignore  |   3 +
  board/congatec/conga-qeval20-qa3-e3845/Makefile    |   1 +
  .../conga-qeval20-qa3-e3845/acpi/mainboard.asl     |  13 +
  board/congatec/conga-qeval20-qa3-e3845/dsdt.asl    |  14 +
  board/intel/bayleybay/.gitignore                   |   3 +
  board/intel/bayleybay/Makefile                     |   1 +
  board/intel/bayleybay/acpi/mainboard.asl           |  11 +
  board/intel/bayleybay/dsdt.asl                     |  14 +
  board/intel/minnowmax/.gitignore                   |   3 +
  board/intel/minnowmax/Makefile                     |   1 +
  board/intel/minnowmax/acpi/mainboard.asl           |  11 +
  board/intel/minnowmax/dsdt.asl                     |  14 +
  configs/bayleybay_defconfig                        |   1 +
  configs/conga-qeval20-qa3-e3845_defconfig          |   1 +
  configs/minnowmax_defconfig                        |   1 +
  doc/README.x86                                     |  76 +++-
  doc/device-tree-bindings/misc/intel,irq-router.txt |   5 +
  include/configs/x86-common.h                       |   9 +-
  scripts/Makefile.lib                               |   8 +-
  52 files changed, 2368 insertions(+), 491 deletions(-)

create mode 100644 arch/x86/cpu/baytrail/acpi.c
delete mode 100644 arch/x86/include/asm/acpi.h
create mode 100644 arch/x86/include/asm/acpi/debug.asl
create mode 100644 arch/x86/include/asm/acpi/globutil.asl create mode 100644 arch/x86/include/asm/acpi/statdef.asl
create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irq_helper.h create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqlinks.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/irqroute.h create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/lpc.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/platform.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/sleepstates.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/southcluster.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/usb.asl create mode 100644 arch/x86/include/asm/arch-baytrail/acpi/xhci.asl create mode 100644 arch/x86/include/asm/arch-baytrail/device.h create mode 100644 arch/x86/include/asm/arch-baytrail/iomap.h create mode 100644 arch/x86/include/asm/arch-baytrail/irq.h create mode 100644 board/congatec/conga-qeval20-qa3-e3845/.gitignore

Quoted 9 lines

create mode 100644 board/congatec/conga-qeval20-qa3-e3845/acpi/mainboard.asl create mode 100644 board/congatec/conga-qeval20-qa3-e3845/dsdt.asl create mode 100644 board/intel/bayleybay/.gitignore
create mode 100644 board/intel/bayleybay/acpi/mainboard.asl create mode 100644 board/intel/bayleybay/dsdt.asl
create mode 100644 board/intel/minnowmax/.gitignore
create mode 100644 board/intel/minnowmax/acpi/mainboard.asl create mode 100644 board/intel/minnowmax/dsdt.asl

Viele Gr??e,
Stefan

Signature · 3 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
author
#42 lore raw

cover x86: Initial ACPI support for Intel BayTrail

Quoted 11 lines · Stefan Roese

Hi Bin,

thank you very much for this patch series. I've given the patchset a quick review and tested it shortly on the BayTrail Congatec board. And have seen no issues so far. Shutdown and reboot also seem to work just fine. I'll definitely give it a more thorough test in the next days / weeks.

I've sent you a few minor comments to some of the patches. But please add my:

Quoted 7 lines

to all patches.

Thanks,
Stefan

Thank you Stefan for the review and testing!

Hi Simon,

Do you get a chance to look at this series?

Regards,
Bin

#43 lore raw

cover x86: Initial ACPI support for Intel BayTrail

Hi Bin,

Quoted 18 lines · Bin Meng
Quoted 16 lines · Stefan Roese

Hi Bin,

thank you very much for this patch series. I've given the patchset a quick review and tested it shortly on the BayTrail Congatec board. And have seen no issues so far. Shutdown and reboot also seem to work just fine. I'll definitely give it a more thorough test in the next days / weeks.

I've sent you a few minor comments to some of the patches. But please add my:

to all patches.

Quoted 8 lines
Quoted 2 lines

Thanks,
Stefan

Thank you Stefan for the review and testing!

Hi Simon,

Do you get a chance to look at this series?

Not yet, sorry. Hopefully in the next few days.

Regards,
Simon