diff options
author | Nick Chung <nickchung@google.com> | 2022-01-25 11:00:33 +0800 |
---|---|---|
committer | Nick Chung <nickchung@google.com> | 2022-02-14 14:59:05 +0800 |
commit | c6293acc865e4259b0538c6f1161c1a4f2c81b96 (patch) | |
tree | 2cbcc78a9fcdd6729cc1ca7dfeaf8cf16c0196d6 | |
parent | 025fbd45ea3335aaddff680e47de1091ff548b3b (diff) | |
download | lwis-android-gs-raviole-5.10-t-preview-2.tar.gz |
IOMMUS: Refine IOMMU PAGE FAULT logs printandroid-t-preview-2_r0.4android-gs-raviole-5.10-t-preview-2
For debugging robustly, we provided more info to indicate
PAGE FAULT from which ISP.
- Move iommu from device to platform.
- Print all sysmmu ISP used.
- Check dmesg for sysmmu errors for avoiding misleading issues.
Bug: 215050600
Test: Logs and CTS, GCA
Signed-off-by: Nick Chung <nickchung@google.com>
Change-Id: Ic8bd4e08aad54d3cad0ed4c8a0ad1ac47c0106fe
-rw-r--r-- | lwis_device.h | 2 | ||||
-rw-r--r-- | lwis_dt.c | 5 | ||||
-rw-r--r-- | platform/anchorage/lwis_platform_anchorage.c | 22 | ||||
-rw-r--r-- | platform/busan/lwis_platform_busan.c | 22 |
4 files changed, 38 insertions, 13 deletions
diff --git a/lwis_device.h b/lwis_device.h index 76764e7..e0c51ea 100644 --- a/lwis_device.h +++ b/lwis_device.h @@ -206,8 +206,6 @@ struct lwis_device { DECLARE_HASHTABLE(event_states, EVENT_HASH_BITS); /* Virtual function table for sub classes */ struct lwis_device_subclass_operations vops; - /* Does the device have IOMMU. TODO: Move to platform */ - bool has_iommu; /* Mutex used to synchronize register access between clients */ struct mutex reg_rw_lock; /* Heartbeat timer structure */ @@ -959,8 +959,6 @@ int lwis_base_parse_dt(struct lwis_device *lwis_dev) { struct device *dev; struct device_node *dev_node; - struct property *iommus; - int iommus_len = 0; const char *name_str; int ret = 0; @@ -1067,9 +1065,6 @@ int lwis_base_parse_dt(struct lwis_device *lwis_dev) parse_bitwidths(lwis_dev); - iommus = of_find_property(dev_node, "iommus", &iommus_len); - lwis_dev->has_iommu = iommus && iommus_len; - lwis_dev->bts_scenario_name = NULL; of_property_read_string(dev_node, "bts-scenario", &lwis_dev->bts_scenario_name); diff --git a/platform/anchorage/lwis_platform_anchorage.c b/platform/anchorage/lwis_platform_anchorage.c index 0f6f26d..2eb8d9b 100644 --- a/platform/anchorage/lwis_platform_anchorage.c +++ b/platform/anchorage/lwis_platform_anchorage.c @@ -58,12 +58,24 @@ int lwis_platform_probe(struct lwis_device *lwis_dev) static int lwis_iommu_fault_handler(struct iommu_fault *fault, void *param) { + int ret; + struct of_phandle_iterator it; struct lwis_device *lwis_dev = (struct lwis_device *)param; struct lwis_mem_page_fault_event_payload event_payload; pr_err("############ LWIS IOMMU PAGE FAULT ############\n"); pr_err("\n"); - pr_err("Device: %s IOMMU Page Fault at Address: 0x%px Flag: 0x%08x\n", lwis_dev->name, + of_for_each_phandle (&it, ret, lwis_dev->plat_dev->dev.of_node, "iommus", 0, 0) { + u64 iommus_reg; + const char *port_name = NULL; + struct device_node *iommus_info = of_node_get(it.node); + of_property_read_u64(iommus_info, "reg", &iommus_reg); + of_property_read_string(iommus_info, "port-name", &port_name); + pr_info("Device [%s] registered IOMMUS :[%s] %#010llx.sysmmu\n", lwis_dev->name, + port_name, iommus_reg); + pr_err("\n"); + } + pr_err("IOMMU Page Fault at Address: 0x%px Flag: 0x%08x. Check dmesg for sysmmu errors\n", (void *)fault->event.addr, fault->event.flags); pr_err("\n"); lwis_debug_print_transaction_info(lwis_dev); @@ -89,6 +101,7 @@ static int lwis_iommu_fault_handler(struct iommu_fault *fault, void *param) int lwis_platform_device_enable(struct lwis_device *lwis_dev) { int ret; + int iommus_len = 0; struct lwis_platform *platform; const int core_clock_qos = 67000; @@ -110,7 +123,8 @@ int lwis_platform_device_enable(struct lwis_device *lwis_dev) return ret; } - if (lwis_dev->has_iommu) { + if (of_find_property(lwis_dev->plat_dev->dev.of_node, "iommus", &iommus_len) && + iommus_len) { /* Activate IOMMU for the platform device */ ret = iommu_register_device_fault_handler(&lwis_dev->plat_dev->dev, lwis_iommu_fault_handler, lwis_dev); @@ -162,6 +176,7 @@ int lwis_platform_device_enable(struct lwis_device *lwis_dev) int lwis_platform_device_disable(struct lwis_device *lwis_dev) { + int iommus_len = 0; struct lwis_platform *platform; if (!lwis_dev) { @@ -182,7 +197,8 @@ int lwis_platform_device_disable(struct lwis_device *lwis_dev) lwis_platform_remove_qos(lwis_dev); - if (lwis_dev->has_iommu) { + if (of_find_property(lwis_dev->plat_dev->dev.of_node, "iommus", &iommus_len) && + iommus_len) { /* Deactivate IOMMU */ iommu_unregister_device_fault_handler(&lwis_dev->plat_dev->dev); } diff --git a/platform/busan/lwis_platform_busan.c b/platform/busan/lwis_platform_busan.c index daf888e..b9fe7c0 100644 --- a/platform/busan/lwis_platform_busan.c +++ b/platform/busan/lwis_platform_busan.c @@ -55,12 +55,24 @@ int lwis_platform_probe(struct lwis_device *lwis_dev) static int lwis_iommu_fault_handler(struct iommu_fault *fault, void *param) { + int ret; + struct of_phandle_iterator it; struct lwis_device *lwis_dev = (struct lwis_device *)param; struct lwis_mem_page_fault_event_payload event_payload; pr_err("############ LWIS IOMMU PAGE FAULT ############\n"); pr_err("\n"); - pr_err("Device: %s IOMMU Page Fault at Address: 0x%px Flag: 0x%08x\n", lwis_dev->name, + of_for_each_phandle (&it, ret, lwis_dev->plat_dev->dev.of_node, "iommus", 0, 0) { + u64 iommus_reg; + const char *port_name = NULL; + struct device_node *iommus_info = of_node_get(it.node); + of_property_read_u64(iommus_info, "reg", &iommus_reg); + of_property_read_string(iommus_info, "port-name", &port_name); + pr_info("Device [%s] registered IOMMUS :[%s] %#010llx.sysmmu\n", lwis_dev->name, + port_name, iommus_reg); + pr_err("\n"); + } + pr_err("IOMMU Page Fault at Address: 0x%px Flag: 0x%08x. Check dmesg for sysmmu errors\n", (void *)fault->event.addr, fault->event.flags); pr_err("\n"); lwis_debug_print_transaction_info(lwis_dev); @@ -86,6 +98,7 @@ static int lwis_iommu_fault_handler(struct iommu_fault *fault, void *param) int lwis_platform_device_enable(struct lwis_device *lwis_dev) { int ret; + int iommus_len = 0; struct lwis_platform *platform; const int core_clock_qos = 67000; @@ -107,7 +120,8 @@ int lwis_platform_device_enable(struct lwis_device *lwis_dev) return ret; } - if (lwis_dev->has_iommu) { + if (of_find_property(lwis_dev->plat_dev->dev.of_node, "iommus", &iommus_len) && + iommus_len) { /* Activate IOMMU for the platform device */ ret = iommu_register_device_fault_handler(&lwis_dev->plat_dev->dev, lwis_iommu_fault_handler, lwis_dev); @@ -159,6 +173,7 @@ int lwis_platform_device_enable(struct lwis_device *lwis_dev) int lwis_platform_device_disable(struct lwis_device *lwis_dev) { + int iommus_len = 0; struct lwis_platform *platform; if (!lwis_dev) { @@ -179,7 +194,8 @@ int lwis_platform_device_disable(struct lwis_device *lwis_dev) lwis_platform_remove_qos(lwis_dev); - if (lwis_dev->has_iommu) { + if (of_find_property(lwis_dev->plat_dev->dev.of_node, "iommus", &iommus_len) && + iommus_len) { /* Deactivate IOMMU */ iommu_unregister_device_fault_handler(&lwis_dev->plat_dev->dev); } |