linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: John Garry <john.garry@huawei.com>
To: <rjw@rjwysocki.net>, <lenb@kernel.org>
Cc: <jeremy.linton@arm.com>, <arnd@arndb.de>, <olof@lixom.net>,
	<linux-kernel@vger.kernel.org>, <linux-acpi@vger.kernel.org>,
	<guohanjun@huawei.com>, <gregkh@linuxfoundation.org>,
	John Garry <john.garry@huawei.com>
Subject: [PATCH RFC 1/2] ACPI/PPTT: Add acpi_pptt_get_package_info() API
Date: Tue, 28 Jan 2020 19:14:18 +0800	[thread overview]
Message-ID: <1580210059-199540-2-git-send-email-john.garry@huawei.com> (raw)
In-Reply-To: <1580210059-199540-1-git-send-email-john.garry@huawei.com>

The ACPI PPTT ID structure (see 6.2 spec, section 5.2.29.3) allows the
vendor to provide an identifier (or vendor specific part number) for a
particular processor hierarchy node structure. That may be a processor
identifier for a processor node, or some chip identifier for a processor
package node.

In some circumstances it can be useful to learn the SoC package identifiers
in the system. An example is in [0], where the userspace perf tool needs
to know the SoC identifier for certain per-SoC event matching. So for this
purpose, add an API to get ID structure members for a processor package
node index, which may be used by some driver to expose this info to
userspace.

The ID structure table has a number of fields, which are left open to
interpretation per implementation. However the spec does provide reference
examples of how the fields could be used. As such, just provide the
table fields directly in the API, which the caller may interpret (probably
as per spec example).

https://lore.kernel.org/linux-arm-kernel/1579876505-113251-6-git-send-email-john.garry@huawei.com/

Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/acpi/pptt.c  | 81 ++++++++++++++++++++++++++++++++++++++++++++
 include/linux/acpi.h | 13 +++++++
 2 files changed, 94 insertions(+)

diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c
index f31544d3656e..ea4ed6300d0b 100644
--- a/drivers/acpi/pptt.c
+++ b/drivers/acpi/pptt.c
@@ -760,3 +760,84 @@ int find_acpi_cpu_topology_hetero_id(unsigned int cpu)
 	return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE,
 					  ACPI_PPTT_ACPI_IDENTICAL);
 }
+
+/**
+ * acpi_pptt_get_package_info() - Get processor package information
+ * @index: Index into processor package
+ * @info: Pointer to structure to fill in processor package info
+ *
+ * For a particular processor package index, fill in the acpi_pptt_package_info
+ * structure.
+ *
+ * Return: -ENOENT if the PPTT or processor package index doesn't exist,
+ *	   -EINVAL for invalid arguments, 0 for success.
+ */
+int acpi_pptt_get_package_info(int index, struct acpi_pptt_package_info *info)
+{
+	struct acpi_subtable_header *entry;
+	struct acpi_table_header *table;
+	unsigned long table_end;
+	acpi_status status;
+	int ret, count = 0;
+
+	if (!info)
+		return -EINVAL;
+
+	status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
+	if (ACPI_FAILURE(status)) {
+		acpi_pptt_warn_missing();
+		return -ENOENT;
+	}
+
+	table_end = (unsigned long)table + table->length;
+	entry = ACPI_ADD_PTR(struct acpi_subtable_header, table,
+			     sizeof(struct acpi_table_pptt));
+
+	ret = -ENOENT;
+	while (entry) {
+		struct acpi_pptt_processor *cpu_node;
+
+		cpu_node = (struct acpi_pptt_processor *)entry;
+
+		if (entry->type == ACPI_PPTT_TYPE_PROCESSOR &&
+		    cpu_node->flags & ACPI_PPTT_PHYSICAL_PACKAGE) {
+			int cnt = cpu_node->number_of_priv_resources;
+			int i;
+
+			for (i = 0; i < cnt; i++) {
+				struct acpi_subtable_header *r;
+
+				r = acpi_get_pptt_resource(table, cpu_node, i);
+
+				if (r->type == ACPI_PPTT_TYPE_ID &&
+				    count == index) {
+					struct acpi_pptt_id *id;
+
+					id = (struct acpi_pptt_id *)r;
+					info->LEVEL_2_ID =
+						le64_to_cpu(id->level2_id);
+					info->vendor_id =
+						le32_to_cpu(id->vendor_id);
+
+					ret = 0;
+					goto out;
+				}
+
+				if (r->type == ACPI_PPTT_TYPE_ID)
+					count++;
+			}
+		}
+
+		entry = ACPI_ADD_PTR(struct acpi_subtable_header, entry,
+				     entry->length);
+		if ((unsigned long)entry >= table_end)
+			break;
+	}
+
+out:
+	acpi_put_table(table);
+
+	return ret;
+
+}
+EXPORT_SYMBOL_GPL(acpi_pptt_get_package_info);
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 0f37a7d5fa77..0a911a298731 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -1268,13 +1268,26 @@ static inline int lpit_read_residency_count_address(u64 *address)
 }
 #endif
 
+struct acpi_pptt_package_info {
+	u64 LEVEL_2_ID;
+	u32 vendor_id;
+};
+
 #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);
+int acpi_pptt_get_package_info(int index, struct acpi_pptt_package_info *info);
 #else
+static inline int acpi_pptt_get_package_info(int index,
+					     struct acpi_pptt_package_info *info);
+{
+	return -EINVAL;
+
+}
+
 static inline int acpi_pptt_cpu_is_thread(unsigned int cpu)
 {
 	return -EINVAL;
-- 
2.17.1


  reply	other threads:[~2020-01-28 11:18 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-28 11:14 [PATCH RFC 0/2] Add basic generic ACPI soc driver John Garry
2020-01-28 11:14 ` John Garry [this message]
2020-01-28 12:34   ` [PATCH RFC 1/2] ACPI/PPTT: Add acpi_pptt_get_package_info() API Sudeep Holla
2020-01-28 14:04     ` John Garry
2020-01-28 14:54       ` Sudeep Holla
2020-01-29 11:03         ` John Garry
2020-01-30 11:23     ` Sudeep Holla
2020-01-30 16:12       ` John Garry
2020-01-30 17:41         ` Sudeep Holla
2020-01-31 10:58           ` John Garry
2020-01-28 11:14 ` [PATCH RFC 2/2] soc: Add a basic ACPI generic driver John Garry
2020-01-28 11:56   ` Greg KH
2020-01-28 13:33     ` John Garry
2020-01-28 12:50   ` Arnd Bergmann
2020-01-28 14:46     ` John Garry
2020-01-28 15:20   ` Sudeep Holla
2020-01-28 15:59     ` John Garry
2020-01-28 16:17       ` Sudeep Holla
2020-01-28 17:51   ` Olof Johansson
2020-01-28 18:22     ` John Garry
2020-01-28 19:11       ` Rafael J. Wysocki
2020-01-28 19:28         ` John Garry
2020-01-28 22:30           ` Rafael J. Wysocki
2020-01-29 10:27             ` John Garry
2020-01-28 20:06       ` Olof Johansson
2020-01-29  9:58         ` John Garry
2020-01-28 16:56 ` [PATCH RFC 0/2] Add basic generic ACPI soc driver Jeremy Linton
2020-01-28 17:28   ` John Garry
2020-01-28 19:04     ` Jeremy Linton
2020-01-28 20:07       ` John Garry

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1580210059-199540-2-git-send-email-john.garry@huawei.com \
    --to=john.garry@huawei.com \
    --cc=arnd@arndb.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=guohanjun@huawei.com \
    --cc=jeremy.linton@arm.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).