lkml.org 
[lkml]   [2019]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 093/112] ACPI/PPTT: Add support for ACPI 6.3 thread flag
    Date
    From: Jeremy Linton <jeremy.linton@arm.com>

    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 <jeremy.linton@arm.com>
    Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
    Reviewed-by: Robert Richter <rrichter@marvell.com>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 1e7ac0bd0d3a0..9497298018a91 100644
    --- a/drivers/acpi/pptt.c
    +++ b/drivers/acpi/pptt.c
    @@ -540,6 +540,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)) {
    + acpi_pptt_warn_missing();
    + 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
    @@ -604,6 +642,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 9426b9aaed86f..9d0e20a2ac831 100644
    --- a/include/linux/acpi.h
    +++ b/include/linux/acpi.h
    @@ -1302,11 +1302,16 @@ 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_topology_hetero_id(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


    \
     
     \ /
      Last update: 2019-10-17 00:03    [W:2.605 / U:2.480 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site