Thread (32 messages) flat view 32 messages, 9 authors, 2016-08-09

[PATCH V7 1/8] ACPI: I/O Remapping Table (IORT) initial support

From: Tomasz Nowicki <hidden>
Date: 2016-06-22 11:06:12
Also in: linux-acpi, linux-pci, lkml

On 22.06.2016 12:50, Marc Zyngier wrote:
quoted hunk ↗ jump to hunk
On 21/06/16 08:12, Hanjun Guo wrote:
quoted
Hi Tomasz,

Sorry for jumping out late, just one comment below.

On 2016/6/20 19:02, Tomasz Nowicki wrote:
quoted
IORT shows representation of IO topology for ARM based systems.
It describes how various components are connected together on
parent-child basis e.g. PCI RC -> SMMU -> ITS. Also see IORT spec.

Initial support allows to detect IORT table presence and save its
root pointer obtained through acpi_get_table(). The pointer validity
depends on acpi_gbl_permanent_mmap because if acpi_gbl_permanent_mmap
is not set while using IORT nodes we would dereference unmapped pointers.

For the aforementioned reason call iort_table_detect() from acpi_init()
which guarantees acpi_gbl_permanent_mmap to be set at that point.

Add generic helpers which are helpful for scanning and retrieving
information from IORT table content. List of the most important helpers:
- iort_find_dev_node() finds IORT node for a given device
- iort_node_map_rid() maps device RID and returns IORT node which provides
   final translation

Signed-off-by: Tomasz Nowicki <redacted>
---
  drivers/acpi/Kconfig  |   3 +
  drivers/acpi/Makefile |   1 +
  drivers/acpi/bus.c    |   2 +
  drivers/acpi/iort.c   | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++
  include/linux/iort.h  |  30 +++++++
[...]
quoted
+static acpi_status
+iort_match_node_callback(struct acpi_iort_node *node, void *context)
+{
+	struct device *dev = context;
+
+	switch (node->type) {
+	case ACPI_IORT_NODE_NAMED_COMPONENT: {
+		struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
ACPI_ALLOCATE_BUFFER is used here, so ...
quoted
+		struct acpi_device *adev = to_acpi_device_node(dev->fwnode);
+		struct acpi_iort_named_component *ncomp;
+
+		if (!adev)
+			break;
+
+		ncomp = (struct acpi_iort_named_component *)node->node_data;
+
+		if (ACPI_FAILURE(acpi_get_name(adev->handle,
+					       ACPI_FULL_PATHNAME, &buffer))) {
+			dev_warn(dev, "Can't get device full path name\n");
+			break;
+		}
+
+		if (!strcmp(ncomp->device_name, (char *)buffer.pointer))
+			return AE_OK;
... we need to kfree(buffer.pointer) before we return or break.
For the record, I've queued this patch on top:
diff --git a/drivers/acpi/iort.c b/drivers/acpi/iort.c
index 496dcf6..3b9e55b 100644
--- a/drivers/acpi/iort.c
+++ b/drivers/acpi/iort.c
@@ -158,11 +158,15 @@ iort_match_node_callback(struct acpi_iort_node *node, void *context)
  		if (ACPI_FAILURE(acpi_get_name(adev->handle,
  					       ACPI_FULL_PATHNAME, &buffer))) {
  			dev_warn(dev, "Can't get device full path name\n");
-			break;
-		}
+		} else {
+			int match;

-		if (!strcmp(ncomp->device_name, (char *)buffer.pointer))
-			return AE_OK;
+			match = !strcmp(ncomp->device_name, buffer.pointer);
+			acpi_os_free(&buffer);
+
+			if (match)
+				return AE_OK;
+		}

  		break;
  	}

assuming that Rafael is OK with the general approach, of course.
Thanks Marc. As Lorenzo pointed out, we need another fix for 
iort_node_map_rid(). Do you want me to refresh the whole series or this 
patch only?

Tomasz
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help