Here is the first part of cpu topology and cpu-hotplug code for RFC.
In this part of code, MADT is being parsed and the cpu possible map and
cpu present map are prefilled.
CPU possible map is equal to the GIC entries in MADT no matter enabled or
disabled, and cpu present map limits to the enabled cpu in MADT.
Without this patch set, CPU possible map is equal to the cpus found in FDT,
and cpu possible map is the same as cpu present map with no hotplugble cpus.
Boot information with this patch (with --cores=4):
ACPI: GIC (acpi_id[0x0000] gic_id[0x0000] enabled) // MADT was parsed
ACPI: GIC (acpi_id[0x0001] gic_id[0x0001] enabled)
ACPI: GIC (acpi_id[0x0002] gic_id[0x0002] disabled)
ACPI: GIC (acpi_id[0x0003] gic_id[0x0003] disabled)
ACPI: GIC (acpi_id[0x0004] gic_id[0x0004] disabled)
ACPI: GIC (acpi_id[0x0005] gic_id[0x0005] disabled)
ACPI: GIC (acpi_id[0x0006] gic_id[0x0006] disabled)
ACPI: GIC (acpi_id[0x0007] gic_id[0x0007] disabled)
2 CPUs available, 8 CPUs total //find 2 enabled cpus which
// is the same as MADT described
ACPI: GIC Distributor (id[0x0000] address[0x2c001000] gsi_base[0]) // IOAPIC(GIC distributor is also parsed)
Using ACPI (MADT) for SMP configuration information
SMP: limits to 4 CPUs // the foundation model supports only 4 four cpus
SMP: Allowing 4 CPUs, 2 hotplug CPUs // so limits to 4 cpus, and 2 disabled in MADT can be hotpluged
PERCPU: Embedded 10 pages/cpu @ffffffc03ffa7000 s11520 r8192 d21248 u40960
[....]
CPU1: Booted secondary processor
Brought up 2 CPUs
SMP: Total of 2 processors activated (400.00 BogoMIPS).
Because only 2 cpus is enabled in MADT, so the system will up 2 cpus
in despite of --cores=4.
Next step will prototype cpu topology code for ACPI driver.
This is the RFC version only, will updated and rebased on the new acpi branch.
Hanjun Guo (3):
ARM / ACPI: MADT for armv8 foundation model
ARM / ACPI: Core functions for MADT parse
ARM / ACPI: Prefill cpu possible and present map when boot with MADT
arch/arm64/boot/asl/foundation-v8.acpi/apic.asl | 175 ++++++++-------
arch/arm64/include/asm/acpi.h | 3 +
arch/arm64/kernel/setup.c | 6 +
arch/arm64/kernel/smp.c | 2 +
drivers/acpi/plat/arm/boot.c | 261 ++++++++++++++++++++++-
drivers/acpi/tables.c | 21 ++
6 files changed, 374 insertions(+), 94 deletions(-)
--
1.7.9.5
Hi Guys,
Discussed this with Al and I think everyone is finished with 3.9 work
now! I am going to switch the acpi branch to be the contents of the
acpi-combined branch at 10AM tomorrow my local time!
The two branches will initially be :-
acpi - our work branch now based off 3.10-rcX kernel (and will track
mainline releases/rc releases)
acpi-ltfixes - is the acpi branch + some needed fixes from Samsung
landing team for Arndale prototyping.
We can of course create more short term branches for demos, prototyping
as needed.
Thanks
Graeme
From: Naresh Bhat <naresh.bhat(a)linaro.org>
CC drivers/acpi/fan.o
drivers/acpi/fan.c: In function ‘fan_get_cur_state’:
drivers/acpi/fan.c:96:9: warning: ‘acpi_state’ may be used uninitialized in this function [-Wuninitialized]
---
drivers/acpi/fan.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index f815da8..f61f7fd 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -84,7 +84,7 @@ static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long
{
struct acpi_device *device = cdev->devdata;
int result;
- int acpi_state;
+ int acpi_state = 0;
if (!device)
return -EINVAL;
--
1.7.9.5
From: Al Stone <ahs3(a)redhat.com>
There are a few places where the printk()s no longer serve
a useful purpose -- those printk()s are removed by the first
patch. The second and third patches remove printk() in favor
of proper use of pr_err() and pr_debug(), respectively.
Al Stone (3):
ARM: ACPI: remove some unneeded printk messages used for initial
debugging
ARM: ACPI: use pr_err() as one should and not printk()
ACPI: ARM: use pr_debug() as one should and not printk()
drivers/acpi/osl.c | 31 +++++++++++++++----------------
drivers/acpi/plat/arm/boot.c | 9 ---------
2 files changed, 15 insertions(+), 25 deletions(-)
--
1.8.1.4
Hi guys,
I have extracted the necessary fixes from Samsung Landing Team tree for
Arndale network (actually usb hack) and LPAE.
I have uploaded these on top of our acpi-combined branch as
acpi-combined-ltfixes. This should make it easier for people testing armv7.
I have attached my config file for this.
Thanks
Graeme
From: Graeme Gregory <graeme.gregory(a)linaro.org>
I some situations custom 64bit by 32bit divide was giving the wrong
values so replace it with the internal kernel do_div function instead.
Signed-off-by: Graeme Gregory <graeme.gregory(a)linaro.org>
---
arch/arm/include/asm/acpi.h | 18 ++---
drivers/acpi/plat/arm/Makefile | 1 -
drivers/acpi/plat/arm/acpi_div_64_by_32.S | 105 -----------------------------
3 files changed, 7 insertions(+), 117 deletions(-)
delete mode 100644 drivers/acpi/plat/arm/acpi_div_64_by_32.S
diff --git a/arch/arm/include/asm/acpi.h b/arch/arm/include/asm/acpi.h
index aafc276..e752c5c 100644
--- a/arch/arm/include/asm/acpi.h
+++ b/arch/arm/include/asm/acpi.h
@@ -31,6 +31,8 @@
#include <linux/init.h>
+#include <asm/div64.h>
+
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
@@ -54,17 +56,11 @@
#define ACPI_ENABLE_IRQS() local_irq_enable()
#define ACPI_FLUSH_CPU_CACHE() flush_cache_all()
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
- asm ("mov r0, %2\n" \
- "mov r1, %3\n" \
- "mov r2, %4\n" \
- "bl __arm_acpi_div_64_by_32\n" \
- "mov %0, r0\n" \
- "mov %1, r1\n" \
- : "=r"(q32), "=r"(r32) /* output operands */ \
- : "r"(n_hi), "r"(n_lo), "r"(d32) /* input operands */ \
- : "r0", "r1", "r2" /* clobbered registers */ \
- )
+#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) { \
+ u64 value = (u64)n_hi << 32 | n_lo; \
+ r32 = do_div(value, d32); \
+ q32 = value; \
+ }
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
asm ("mov r0, %2\n" \
diff --git a/drivers/acpi/plat/arm/Makefile b/drivers/acpi/plat/arm/Makefile
index aa9dd19..a1f056d 100644
--- a/drivers/acpi/plat/arm/Makefile
+++ b/drivers/acpi/plat/arm/Makefile
@@ -1,4 +1,3 @@
obj-y += boot.o
obj-y += sleep.o
-obj-$(CONFIG_ARM) += acpi_div_64_by_32.o
diff --git a/drivers/acpi/plat/arm/acpi_div_64_by_32.S b/drivers/acpi/plat/arm/acpi_div_64_by_32.S
deleted file mode 100644
index 573bce4..0000000
--- a/drivers/acpi/plat/arm/acpi_div_64_by_32.S
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2013, Al Stone <ahs3(a)redhat.com>
- *
- * __acpi_arm_div64_by_32: perform integer division of a 64-bit value
- * a 32-bit value
- *
- * The algorithm is borrowed from the GMP library, but has been redone
- * here in order to put this implementation under a GPLv2 license.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef __ARM_ARCH_7A__
-
-#include <linux/linkage.h>
-
-/*
- * This needs to be called in the following manner:
- * n_lo => r0 # these are the low 32 bits of the dividend
- * n_hi => r1 # the high 32 bits of the dividend
- * d32 => r2 # the 32-bit divisor
- *
- * The result is:
- * q32 <= r0 # the 32-bit quotient
- * r32 <= r1 # the 32-bit remainder
- *
- * This should be consistent with the normal ARMv7 calling conventions.
- *
- */
-
-ENTRY(__arm_acpi_div_64_by_32)
- mov r12, #32 // loop counter
- cmp r2, #0x80000000 // check divisor MSB and clear carry
- bcs bigdiv
-
-loop: adcs r1, r1, r1 // handle each bit
- adc r0, r0, r0
- cmp r0, r2
- subcs r0, r0, r2
- sub r12, r12, #1
- teq r12, #0
- bne loop
-
- mov r3, r0 // stash the remainder for a tic
- adc r0, r1, r1 // quotient: add in last carry
- mov r1, r3 // remainder (now in right register)
- mov pc, lr
-
-bigdiv: stmfd sp!, { r8, lr } // clear some scratch space
-
- and r8, r1, #1 // save LSB of dividend
- mov lr, r0, lsl #31
- orrs r1, lr, r1, lsr #1 // r1 = lower part >> 1 bit
- mov r0, r0, lsr #1 // r0 = higher part >> 1 bit
-
- and lr, r2, #1 // save LSB of divisor
- movs r2, r2, lsr #1 // r2 = floor(divisor / 2)
- adc r2, r2, #0 // r2 = ceil(divisor / 2)
-
-loop2: adcs r1, r1, r1 // handle each bit
- adc r0, r0, r0
- cmp r0, r2
- subcs r0, r0, r2
- sub r12, r12, #1
- teq r12, #0
- bne loop2
-
- adc r1, r1, r1 // shift and add last carry
- add r0, r8, r0, lsl #1 // shift in remaining dividend LSB
- tst lr, lr
- beq evendiv
-
- rsb r2, lr, r2, lsl #1 // restore divisor value
- adds r0, r0, r1 // adjust for omitted divisor LSB
- addcs r1, r1, #1 // adjust quotient if a carry results
- subcs r0, r0, r2 // adjust remainder, if carry
- cmp r0, r2
- subcs r0, r0, #1 // adjust remainder
- addcs r1, r1, #1 // adjust quotient
-
-evendiv:
- mov r3, r0 // stash the remainder for a tic
- mov r0, r1 // quotient
- mov r1, r3 // remainder
-
- ldmfd sp!, { r8, pc } // restore the registers used
-
-ENDPROC(__arm_acpi_div_64_by_32)
-
-#else /* ! __ARM_ARCH_7A__ */
-#error __arm_acpi_div_64_by_32 not defined for this architecture
-#endif
-
--
1.7.10.4
Hi Robert,
I am doing APEI implementation of ACPI specification. That is, ACPI
kernel side of RAS work. I am manage to test some of APEI functionality
now. I would like to ask about status of LEG-389 since I want to avoid
of doing work that may be actually already done.
Regards,
Tomasz Nowicki