From: Sasha Levin Date: Tue, 15 Oct 2019 22:05:51 +0000 (-0400) Subject: fixes for 4.19 X-Git-Tag: v4.4.197~19^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c0708e42c6a2dab9df138a89e34c745379e74b89;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/acpi-pptt-add-support-for-acpi-6.3-thread-flag.patch b/queue-4.19/acpi-pptt-add-support-for-acpi-6.3-thread-flag.patch new file mode 100644 index 00000000000..55d78e99801 --- /dev/null +++ b/queue-4.19/acpi-pptt-add-support-for-acpi-6.3-thread-flag.patch @@ -0,0 +1,119 @@ +From 37f98c0e2efb2e788ad42d8450f8f47f20d6ad9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2019 17:56:25 +0800 +Subject: ACPI/PPTT: Add support for ACPI 6.3 thread flag + +From: Jeremy Linton + +Commit bbd1b70639f785a970d998f35155c713f975e3ac upstream. + +ACPI 6.3 adds a flag to the CPU node to indicate whether +the given PE is a thread. Add a function to return that +information for a given linux logical CPU. + +Signed-off-by: Jeremy Linton +Reviewed-by: Sudeep Holla +Reviewed-by: Robert Richter +Acked-by: Rafael J. Wysocki +Signed-off-by: Will Deacon +[jpg: backport for 4.19, replace acpi_pptt_warn_missing()] +Signed-off-by: John Garry +Signed-off-by: Sasha Levin +--- + drivers/acpi/pptt.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ + include/linux/acpi.h | 5 +++++ + 2 files changed, 57 insertions(+) + +diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c +index da031b1df6f5c..9dbf86a0c8277 100644 +--- a/drivers/acpi/pptt.c ++++ b/drivers/acpi/pptt.c +@@ -509,6 +509,44 @@ static int find_acpi_cpu_topology_tag(unsigned int cpu, int level, int flag) + return retval; + } + ++/** ++ * check_acpi_cpu_flag() - Determine if CPU node has a flag set ++ * @cpu: Kernel logical CPU number ++ * @rev: The minimum PPTT revision defining the flag ++ * @flag: The flag itself ++ * ++ * Check the node representing a CPU for a given flag. ++ * ++ * Return: -ENOENT if the PPTT doesn't exist, the CPU cannot be found or ++ * the table revision isn't new enough. ++ * 1, any passed flag set ++ * 0, flag unset ++ */ ++static int check_acpi_cpu_flag(unsigned int cpu, int rev, u32 flag) ++{ ++ struct acpi_table_header *table; ++ acpi_status status; ++ u32 acpi_cpu_id = get_acpi_id_for_cpu(cpu); ++ struct acpi_pptt_processor *cpu_node = NULL; ++ int ret = -ENOENT; ++ ++ status = acpi_get_table(ACPI_SIG_PPTT, 0, &table); ++ if (ACPI_FAILURE(status)) { ++ pr_warn_once("No PPTT table found, cpu topology may be inaccurate\n"); ++ return ret; ++ } ++ ++ if (table->revision >= rev) ++ cpu_node = acpi_find_processor_node(table, acpi_cpu_id); ++ ++ if (cpu_node) ++ ret = (cpu_node->flags & flag) != 0; ++ ++ acpi_put_table(table); ++ ++ return ret; ++} ++ + /** + * acpi_find_last_cache_level() - Determines the number of cache levels for a PE + * @cpu: Kernel logical cpu number +@@ -573,6 +611,20 @@ int cache_setup_acpi(unsigned int cpu) + return status; + } + ++/** ++ * acpi_pptt_cpu_is_thread() - Determine if CPU is a thread ++ * @cpu: Kernel logical CPU number ++ * ++ * Return: 1, a thread ++ * 0, not a thread ++ * -ENOENT ,if the PPTT doesn't exist, the CPU cannot be found or ++ * the table revision isn't new enough. ++ */ ++int acpi_pptt_cpu_is_thread(unsigned int cpu) ++{ ++ return check_acpi_cpu_flag(cpu, 2, ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD); ++} ++ + /** + * find_acpi_cpu_topology() - Determine a unique topology value for a given cpu + * @cpu: Kernel logical cpu number +diff --git a/include/linux/acpi.h b/include/linux/acpi.h +index b4d23b3a2ef2d..59a416dfcaaa2 100644 +--- a/include/linux/acpi.h ++++ b/include/linux/acpi.h +@@ -1291,10 +1291,15 @@ static inline int lpit_read_residency_count_address(u64 *address) + #endif + + #ifdef CONFIG_ACPI_PPTT ++int acpi_pptt_cpu_is_thread(unsigned int cpu); + int find_acpi_cpu_topology(unsigned int cpu, int level); + int find_acpi_cpu_topology_package(unsigned int cpu); + int find_acpi_cpu_cache_topology(unsigned int cpu, int level); + #else ++static inline int acpi_pptt_cpu_is_thread(unsigned int cpu) ++{ ++ return -EINVAL; ++} + static inline int find_acpi_cpu_topology(unsigned int cpu, int level) + { + return -EINVAL; +-- +2.20.1 + diff --git a/queue-4.19/acpica-acpi-6.3-pptt-add-additional-fields-in-proces.patch b/queue-4.19/acpica-acpi-6.3-pptt-add-additional-fields-in-proces.patch new file mode 100644 index 00000000000..30f0f4a483a --- /dev/null +++ b/queue-4.19/acpica-acpi-6.3-pptt-add-additional-fields-in-proces.patch @@ -0,0 +1,43 @@ +From 43ca0aa619d7031c85ae306e7fc9d8c5f8803734 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2019 17:56:24 +0800 +Subject: ACPICA: ACPI 6.3: PPTT add additional fields in Processor Structure + Flags + +From: Erik Schmauss + +Commit b5eab512e7cffb2bb37c4b342b5594e9e75fd486 upstream. + +ACPICA commit c736ea34add19a3a07e0e398711847cd6b95affd + +Link: https://github.com/acpica/acpica/commit/c736ea34 +Signed-off-by: Erik Schmauss +Signed-off-by: Bob Moore +Signed-off-by: Rafael J. Wysocki +Signed-off-by: John Garry +Signed-off-by: Sasha Levin +--- + include/acpi/actbl2.h | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h +index c50ef7e6b9425..1d4ef0621174d 100644 +--- a/include/acpi/actbl2.h ++++ b/include/acpi/actbl2.h +@@ -1472,8 +1472,11 @@ struct acpi_pptt_processor { + + /* Flags */ + +-#define ACPI_PPTT_PHYSICAL_PACKAGE (1) /* Physical package */ +-#define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID (2) /* ACPI Processor ID valid */ ++#define ACPI_PPTT_PHYSICAL_PACKAGE (1) ++#define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID (1<<1) ++#define ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD (1<<2) /* ACPI 6.3 */ ++#define ACPI_PPTT_ACPI_LEAF_NODE (1<<3) /* ACPI 6.3 */ ++#define ACPI_PPTT_ACPI_IDENTICAL (1<<4) /* ACPI 6.3 */ + + /* 1: Cache Type Structure */ + +-- +2.20.1 + diff --git a/queue-4.19/arm64-topology-use-pptt-to-determine-if-pe-is-a-thre.patch b/queue-4.19/arm64-topology-use-pptt-to-determine-if-pe-is-a-thre.patch new file mode 100644 index 00000000000..01add4c4196 --- /dev/null +++ b/queue-4.19/arm64-topology-use-pptt-to-determine-if-pe-is-a-thre.patch @@ -0,0 +1,73 @@ +From db74fabd29d4764953e5b13daf704f1b2fa38f25 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Oct 2019 17:56:26 +0800 +Subject: arm64: topology: Use PPTT to determine if PE is a thread + +From: Jeremy Linton + +Commit 98dc19902a0b2e5348e43d6a2c39a0a7d0fc639e upstream. + +ACPI 6.3 adds a thread flag to represent if a CPU/PE is +actually a thread. Given that the MPIDR_MT bit may not +represent this information consistently on homogeneous machines +we should prefer the PPTT flag if its available. + +Signed-off-by: Jeremy Linton +Reviewed-by: Sudeep Holla +Reviewed-by: Robert Richter +[will: made acpi_cpu_is_threaded() return 'bool'] +Signed-off-by: Will Deacon +Signed-off-by: John Garry +Signed-off-by: Sasha Levin +--- + arch/arm64/kernel/topology.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c +index 0825c4a856e33..6106c49f84bc8 100644 +--- a/arch/arm64/kernel/topology.c ++++ b/arch/arm64/kernel/topology.c +@@ -340,17 +340,28 @@ void remove_cpu_topology(unsigned int cpu) + } + + #ifdef CONFIG_ACPI ++static bool __init acpi_cpu_is_threaded(int cpu) ++{ ++ int is_threaded = acpi_pptt_cpu_is_thread(cpu); ++ ++ /* ++ * if the PPTT doesn't have thread information, assume a homogeneous ++ * machine and return the current CPU's thread state. ++ */ ++ if (is_threaded < 0) ++ is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK; ++ ++ return !!is_threaded; ++} ++ + /* + * Propagate the topology information of the processor_topology_node tree to the + * cpu_topology array. + */ + static int __init parse_acpi_topology(void) + { +- bool is_threaded; + int cpu, topology_id; + +- is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK; +- + for_each_possible_cpu(cpu) { + int i, cache_id; + +@@ -358,7 +369,7 @@ static int __init parse_acpi_topology(void) + if (topology_id < 0) + return topology_id; + +- if (is_threaded) { ++ if (acpi_cpu_is_threaded(cpu)) { + cpu_topology[cpu].thread_id = topology_id; + topology_id = find_acpi_cpu_topology(cpu, 1); + cpu_topology[cpu].core_id = topology_id; +-- +2.20.1 + diff --git a/queue-4.19/series b/queue-4.19/series index 2ce7c4309d3..bae37ca2c7e 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -60,3 +60,6 @@ gpiolib-don-t-clear-flag_is_out-when-emulating-open-.patch iio-adc-stm32-adc-move-registers-definitions.patch iio-adc-stm32-adc-fix-a-race-when-using-several-adcs.patch cifs-use-cifsinodeinfo-open_file_lock-while-iteratin.patch +acpica-acpi-6.3-pptt-add-additional-fields-in-proces.patch +acpi-pptt-add-support-for-acpi-6.3-thread-flag.patch +arm64-topology-use-pptt-to-determine-if-pe-is-a-thre.patch