On Wed, 2018-07-18 at 21:42 -0700, Bin Meng wrote: > acpi_find_fadt(), acpi_find_wakeup_vector() and enter_acpi_mode() > are something unrelated to ACPI tables generation. Move these to > a separate library. > > This also fixes several style issues reported by checkpatch in the > original codes. >
Hi! Is it possible to have some test branch under your tree to try? > Signed-off-by: Bin Meng <bmeng...@gmail.com> > --- > > Changes in v2: None > > arch/x86/cpu/cpu.c | 1 + > arch/x86/include/asm/acpi.h | 41 +++++++++++++++ > arch/x86/include/asm/acpi_table.h | 28 ---------- > arch/x86/lib/Makefile | 1 + > arch/x86/lib/acpi.c | 108 > ++++++++++++++++++++++++++++++++++++++ > arch/x86/lib/acpi_s3.c | 1 + > arch/x86/lib/acpi_table.c | 101 +-------------------------- > -------- > 7 files changed, 153 insertions(+), 128 deletions(-) > create mode 100644 arch/x86/include/asm/acpi.h > create mode 100644 arch/x86/lib/acpi.c > > diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c > index 6aefa12..f7601b3 100644 > --- a/arch/x86/cpu/cpu.c > +++ b/arch/x86/cpu/cpu.c > @@ -24,6 +24,7 @@ > #include <errno.h> > #include <malloc.h> > #include <syscon.h> > +#include <asm/acpi.h> > #include <asm/acpi_s3.h> > #include <asm/acpi_table.h> > #include <asm/control_regs.h> > diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h > new file mode 100644 > index 0000000..4475d04 > --- /dev/null > +++ b/arch/x86/include/asm/acpi.h > @@ -0,0 +1,41 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Copyright (C) 2018, Bin Meng <bmeng...@gmail.com> > + */ > + > +#ifndef __ASM_ACPI_H__ > +#define __ASM_ACPI_H__ > + > +struct acpi_fadt; > + > +/** > + * acpi_find_fadt() - find ACPI FADT table in the system memory > + * > + * This routine parses the ACPI table to locate the ACPI FADT table. > + * > + * @return: a pointer to the ACPI FADT table in the system > memory > + */ > +struct acpi_fadt *acpi_find_fadt(void); > + > +/** > + * acpi_find_wakeup_vector() - find OS installed wake up vector > address > + * > + * This routine parses the ACPI table to locate the wake up vector > installed > + * by the OS previously. > + * > + * @fadt: a pointer to the ACPI FADT table in the system > memory > + * @return: wake up vector address installed by the OS > + */ > +void *acpi_find_wakeup_vector(struct acpi_fadt *fadt); > + > +/** > + * enter_acpi_mode() - enter into ACPI mode > + * > + * This programs the ACPI-defined PM1_CNT register to enable SCI > interrupt > + * so that the whole system swiches to ACPI mode. > + * > + * @pm1_cnt: PM1_CNT register I/O address > + */ > +void enter_acpi_mode(int pm1_cnt); > + > +#endif /* __ASM_ACPI_H__ */ > diff --git a/arch/x86/include/asm/acpi_table.h > b/arch/x86/include/asm/acpi_table.h > index 239bcdc..dd516df 100644 > --- a/arch/x86/include/asm/acpi_table.h > +++ b/arch/x86/include/asm/acpi_table.h > @@ -317,15 +317,6 @@ int acpi_create_mcfg_mmconfig(struct > acpi_mcfg_mmconfig *mmconfig, u32 base, > u16 seg_nr, u8 start, u8 end); > u32 acpi_fill_mcfg(u32 current); > void acpi_create_gnvs(struct acpi_global_nvs *gnvs); > -/** > - * enter_acpi_mode() - enter into ACPI mode > - * > - * This programs the ACPI-defined PM1_CNT register to enable SCI > interrupt > - * so that the whole system swiches to ACPI mode. > - * > - * @pm1_cnt: PM1_CNT register I/O address > - */ > -void enter_acpi_mode(int pm1_cnt); > ulong write_acpi_tables(ulong start); > > /** > @@ -336,22 +327,3 @@ ulong write_acpi_tables(ulong start); > * @return: ACPI RSDP table address > */ > ulong acpi_get_rsdp_addr(void); > - > -/** > - * acpi_find_fadt() - find ACPI FADT table in the sytem memory > - * > - * This routine parses the ACPI table to locate the ACPI FADT table. > - * > - * @return: a pointer to the ACPI FADT table in the system > memory > - */ > -struct acpi_fadt *acpi_find_fadt(void); > - > -/** > - * acpi_find_wakeup_vector() - find OS installed wake up vector > address > - * > - * This routine parses the ACPI table to locate the wake up vector > installed > - * by the OS previously. > - * > - * @return: wake up vector address installed by the OS > - */ > -void *acpi_find_wakeup_vector(struct acpi_fadt *); > diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile > index ba07ac7..1e8efcc 100644 > --- a/arch/x86/lib/Makefile > +++ b/arch/x86/lib/Makefile > @@ -33,6 +33,7 @@ obj-$(CONFIG_INTEL_MID) += scu.o > obj-y += sections.o > obj-y += sfi.o > obj-y += string.o > +obj-y += acpi.o > obj-$(CONFIG_HAVE_ACPI_RESUME) += acpi_s3.o > ifndef CONFIG_QEMU > obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o > diff --git a/arch/x86/lib/acpi.c b/arch/x86/lib/acpi.c > new file mode 100644 > index 0000000..cba9c24 > --- /dev/null > +++ b/arch/x86/lib/acpi.c > @@ -0,0 +1,108 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2018, Bin Meng <bmeng...@gmail.com> > + */ > + > +#include <common.h> > +#include <asm/acpi_table.h> > +#include <asm/io.h> > +#include <asm/tables.h> > + > +static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp) > +{ > + if (strncmp((char *)rsdp, RSDP_SIG, sizeof(RSDP_SIG) - 1) != > 0) > + return NULL; > + > + debug("Looking on %p for valid checksum\n", rsdp); > + > + if (table_compute_checksum((void *)rsdp, 20) != 0) > + return NULL; > + debug("acpi rsdp checksum 1 passed\n"); > + > + if ((rsdp->revision > 1) && > + (table_compute_checksum((void *)rsdp, rsdp->length) != > 0)) > + return NULL; > + debug("acpi rsdp checksum 2 passed\n"); > + > + return rsdp; > +} > + > +struct acpi_fadt *acpi_find_fadt(void) > +{ > + char *p, *end; > + struct acpi_rsdp *rsdp = NULL; > + struct acpi_rsdt *rsdt; > + struct acpi_fadt *fadt = NULL; > + int i; > + > + /* Find RSDP */ > + for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p > += 16) { > + rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p); > + if (rsdp) > + break; > + } > + > + if (!rsdp) > + return NULL; > + > + debug("RSDP found at %p\n", rsdp); > + rsdt = (struct acpi_rsdt *)(uintptr_t)rsdp->rsdt_address; > + > + end = (char *)rsdt + rsdt->header.length; > + debug("RSDT found at %p ends at %p\n", rsdt, end); > + > + for (i = 0; ((char *)&rsdt->entry[i]) < end; i++) { > + fadt = (struct acpi_fadt *)(uintptr_t)rsdt->entry[i]; > + if (strncmp((char *)fadt, "FACP", 4) == 0) > + break; > + fadt = NULL; > + } > + > + if (!fadt) > + return NULL; > + > + debug("FADT found at %p\n", fadt); > + return fadt; > +} > + > +void *acpi_find_wakeup_vector(struct acpi_fadt *fadt) > +{ > + struct acpi_facs *facs; > + void *wake_vec; > + > + debug("Trying to find the wakeup vector...\n"); > + > + facs = (struct acpi_facs *)(uintptr_t)fadt->firmware_ctrl; > + > + if (!facs) { > + debug("No FACS found, wake up from S3 not > possible.\n"); > + return NULL; > + } > + > + debug("FACS found at %p\n", facs); > + wake_vec = (void *)(uintptr_t)facs->firmware_waking_vector; > + debug("OS waking vector is %p\n", wake_vec); > + > + return wake_vec; > +} > + > +void enter_acpi_mode(int pm1_cnt) > +{ > + u16 val = inw(pm1_cnt); > + > + /* > + * PM1_CNT register bit0 selects the power management event > to be > + * either an SCI or SMI interrupt. When this bit is set, then > power > + * management events will generate an SCI interrupt. When > this bit > + * is reset power management events will generate an SMI > interrupt. > + * > + * Per ACPI spec, it is the responsibility of the hardware to > set > + * or reset this bit. OSPM always preserves this bit > position. > + * > + * U-Boot does not support SMI. And we don't have plan to > support > + * anything running in SMM within U-Boot. To create a legacy- > free > + * system, and expose ourselves to OSPM as working under ACPI > mode > + * already, turn this bit on. > + */ > + outw(val | PM1_CNT_SCI_EN, pm1_cnt); > +} > diff --git a/arch/x86/lib/acpi_s3.c b/arch/x86/lib/acpi_s3.c > index 514b92f..0391718 100644 > --- a/arch/x86/lib/acpi_s3.c > +++ b/arch/x86/lib/acpi_s3.c > @@ -4,6 +4,7 @@ > */ > > #include <common.h> > +#include <asm/acpi.h> > #include <asm/acpi_s3.h> > #include <asm/acpi_table.h> > #include <asm/post.h> > diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c > index 7c4321b..e26c54d 100644 > --- a/arch/x86/lib/acpi_table.c > +++ b/arch/x86/lib/acpi_table.c > @@ -12,8 +12,8 @@ > #include <dm/uclass-internal.h> > #include <version.h> > #include <asm/acpi/global_nvs.h> > +#include <asm/acpi.h> > #include <asm/acpi_table.h> > -#include <asm/io.h> > #include <asm/ioapic.h> > #include <asm/lapic.h> > #include <asm/mpspec.h> > @@ -337,27 +337,6 @@ static void acpi_create_mcfg(struct acpi_mcfg > *mcfg) > header->checksum = table_compute_checksum((void *)mcfg, > header->length); > } > > -void enter_acpi_mode(int pm1_cnt) > -{ > - u16 val = inw(pm1_cnt); > - > - /* > - * PM1_CNT register bit0 selects the power management event > to be > - * either an SCI or SMI interrupt. When this bit is set, then > power > - * management events will generate an SCI interrupt. When > this bit > - * is reset power management events will generate an SMI > interrupt. > - * > - * Per ACPI spec, it is the responsibility of the hardware to > set > - * or reset this bit. OSPM always preserves this bit > position. > - * > - * U-Boot does not support SMI. And we don't have plan to > support > - * anything running in SMM within U-Boot. To create a legacy- > free > - * system, and expose ourselves to OSPM as working under ACPI > mode > - * already, turn this bit on. > - */ > - outw(val | PM1_CNT_SCI_EN, pm1_cnt); > -} > - > /* > * QEMU's version of write_acpi_tables is defined in > drivers/misc/qfw.c > */ > @@ -482,81 +461,3 @@ ulong acpi_get_rsdp_addr(void) > { > return acpi_rsdp_addr; > } > - > -static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp) > -{ > - if (strncmp((char *)rsdp, RSDP_SIG, sizeof(RSDP_SIG) - 1) != > 0) > - return NULL; > - > - debug("Looking on %p for valid checksum\n", rsdp); > - > - if (table_compute_checksum((void *)rsdp, 20) != 0) > - return NULL; > - debug("acpi rsdp checksum 1 passed\n"); > - > - if ((rsdp->revision > 1) && > - (table_compute_checksum((void *)rsdp, rsdp->length) != > 0)) > - return NULL; > - debug("acpi rsdp checksum 2 passed\n"); > - > - return rsdp; > -} > - > -struct acpi_fadt *acpi_find_fadt(void) > -{ > - char *p, *end; > - struct acpi_rsdp *rsdp = NULL; > - struct acpi_rsdt *rsdt; > - struct acpi_fadt *fadt = NULL; > - int i; > - > - /* Find RSDP */ > - for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p > += 16) { > - rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p); > - if (rsdp) > - break; > - } > - > - if (rsdp == NULL) > - return NULL; > - > - debug("RSDP found at %p\n", rsdp); > - rsdt = (struct acpi_rsdt *)rsdp->rsdt_address; > - > - end = (char *)rsdt + rsdt->header.length; > - debug("RSDT found at %p ends at %p\n", rsdt, end); > - > - for (i = 0; ((char *)&rsdt->entry[i]) < end; i++) { > - fadt = (struct acpi_fadt *)rsdt->entry[i]; > - if (strncmp((char *)fadt, "FACP", 4) == 0) > - break; > - fadt = NULL; > - } > - > - if (fadt == NULL) > - return NULL; > - > - debug("FADT found at %p\n", fadt); > - return fadt; > -} > - > -void *acpi_find_wakeup_vector(struct acpi_fadt *fadt) > -{ > - struct acpi_facs *facs; > - void *wake_vec; > - > - debug("Trying to find the wakeup vector...\n"); > - > - facs = (struct acpi_facs *)fadt->firmware_ctrl; > - > - if (facs == NULL) { > - debug("No FACS found, wake up from S3 not > possible.\n"); > - return NULL; > - } > - > - debug("FACS found at %p\n", facs); > - wake_vec = (void *)facs->firmware_waking_vector; > - debug("OS waking vector is %p\n", wake_vec); > - > - return wake_vec; > -} -- Andy Shevchenko <andriy.shevche...@linux.intel.com> Intel Finland Oy _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot