summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuma copybara merger <zuma-automerger@google.com>2023-03-10 08:30:37 +0000
committerCopybara-Service <copybara-worker@google.com>2023-03-10 03:04:07 -0800
commit8aa7813672d57bdfe02dd09be95b6598734e597c (patch)
tree697c7a5d39414dea86ba8c8674814afd87d60123
parent5df3ca7b7dd68e8efb1b30c36676a4cf315d3b19 (diff)
downloadrio-8aa7813672d57bdfe02dd09be95b6598734e597c.tar.gz
[Copybara Auto Merge] Merge branch zuma into android14-gs-pixel-5.15
edgetpu: gsx01: fix param to thermal suspend/resume gcip: Add gcip_pm_lock Bug: 264729080 edgetpu: Downgrade warning on external mailbox alloc Bug: 269476405 gcip: Make gcip_pm_{get_count,is_powered} lockless Bug: 271756295 gcip: generalize mem_pool gcip: utilize mock files on unittests Bug: 272216562 gcip: use GPL-2.0-only license Bug: 271797962 gcip: Make gcip_pm_{get_count,is_powered} lockless Bug: 271756295 (repeat) gcip: generalize mem_pool gcip: use GPL-2.0-only license Bug: 271797962 (repeat) gcip: Remove gcip_pm_put_async Bug: 271756295 (repeat) gcip: Add gcip_pm_trylock Bug: 271756295 (repeat) gcip: Remove gcip_pm_put_async Bug: 271756295 (repeat) gcip: Only call .power_up if needed edgetpu: Use gcip_pm_trylock in kci_update_usage Bug: 271756295 (repeat) edgetpu: rio: Update comments for dvfs table edgetpu: usage stats ignore metric fields beyond known size Bug: 271372136 edgetpu: Update power state Bug: 271615586 gcip: Add level -3 (FATAL) for firmware log Bug: 271596603 gcip: Print GCIP_FW_LOG_LEVEL_FATAL as error message Bug: 271596603 (repeat) Signed-off-by: Zuma copybara merger <zuma-automerger@google.com> GitOrigin-RevId: 5a868e712cd2e88c4e91aafab78e53088517568d Change-Id: Id585a1cb00d715ac58fe8ae458344f460972fb1a
-rw-r--r--drivers/edgetpu/edgetpu-external.c4
-rw-r--r--drivers/edgetpu/edgetpu-kci.c14
-rw-r--r--drivers/edgetpu/edgetpu-usage-stats.c11
-rw-r--r--drivers/edgetpu/edgetpu-usage-stats.h11
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/Makefile4
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-alloc-helper.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-dma-fence.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-domain-pool.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-firmware.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-image-config.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mailbox.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mem-pool.c27
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-pm.c34
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-telemetry.c3
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-thermal.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-alloc-helper.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-common-image-header.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-dma-fence.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-domain-pool.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-firmware.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-image-config.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mailbox.h2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mem-pool.h23
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-pm.h50
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-telemetry.h3
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-thermal.h2
-rw-r--r--drivers/edgetpu/mobile-pm.c6
-rw-r--r--drivers/edgetpu/mobile-soc-gsx01.c26
-rw-r--r--drivers/edgetpu/rio/config-pwr-state.h24
31 files changed, 156 insertions, 118 deletions
diff --git a/drivers/edgetpu/edgetpu-external.c b/drivers/edgetpu/edgetpu-external.c
index adf8d3b..301f565 100644
--- a/drivers/edgetpu/edgetpu-external.c
+++ b/drivers/edgetpu/edgetpu-external.c
@@ -104,8 +104,8 @@ static int edgetpu_external_mailbox_alloc(struct device *edgetpu_dev,
if (copy_from_user(&req.attr, (void __user *)client_info->attr, sizeof(req.attr))) {
if (!client_info->attr)
- etdev_warn(client->etdev,
- "Illegal mailbox attributes, using VII mailbox attrs\n");
+ etdev_dbg(client->etdev,
+ "Using VII mailbox attrs for external mailbox\n");
req.attr = group->mbox_attr;
}
diff --git a/drivers/edgetpu/edgetpu-kci.c b/drivers/edgetpu/edgetpu-kci.c
index 77c56f9..9258aba 100644
--- a/drivers/edgetpu/edgetpu-kci.c
+++ b/drivers/edgetpu/edgetpu-kci.c
@@ -455,11 +455,18 @@ int edgetpu_kci_update_usage(struct edgetpu_dev *etdev)
if (edgetpu_firmware_status_locked(etdev) != GCIP_FW_VALID)
goto fw_unlock;
- if (gcip_pm_get_if_powered(etdev->pm, false))
+ /*
+ * This function may run in a worker that is being canceled when the device is powering
+ * down, and the power down code holds the PM lock.
+ * Using trylock to prevent cancel_work_sync() waiting forever.
+ */
+ if (!gcip_pm_trylock(etdev->pm))
goto fw_unlock;
- ret = edgetpu_kci_update_usage_locked(etdev);
- gcip_pm_put_async(etdev->pm);
+ if (gcip_pm_is_powered(etdev->pm))
+ ret = edgetpu_kci_update_usage_locked(etdev);
+
+ gcip_pm_unlock(etdev->pm);
fw_unlock:
edgetpu_firmware_unlock(etdev);
@@ -477,6 +484,7 @@ int edgetpu_kci_update_usage_locked(struct edgetpu_dev *etdev)
.dma = {
.address = 0,
.size = 0,
+ .flags = EDGETPU_USAGE_METRIC_VERSION,
},
};
struct edgetpu_coherent_mem mem;
diff --git a/drivers/edgetpu/edgetpu-usage-stats.c b/drivers/edgetpu/edgetpu-usage-stats.c
index ba93d49..db7a793 100644
--- a/drivers/edgetpu/edgetpu-usage-stats.c
+++ b/drivers/edgetpu/edgetpu-usage-stats.c
@@ -248,12 +248,15 @@ void edgetpu_usage_stats_process_buffer(struct edgetpu_dev *etdev, void *buf)
etdev_dbg(etdev, "%s: n=%u sz=%u", __func__,
header->num_metrics, header->metric_size);
- if (header->metric_size != sizeof(struct edgetpu_usage_metric)) {
- etdev_dbg(etdev, "%s: expected sz=%zu, discard", __func__,
- sizeof(struct edgetpu_usage_metric));
+ if (header->metric_size < EDGETPU_USAGE_METRIC_SIZE_V1) {
+ etdev_warn_once(etdev, "fw metric size %u less than minimum %u",
+ header->metric_size, EDGETPU_USAGE_METRIC_SIZE_V1);
return;
}
+ if (header->metric_size > sizeof(struct edgetpu_usage_metric))
+ etdev_dbg(etdev, "fw metrics are later version with unknown fields");
+
for (i = 0; i < header->num_metrics; i++) {
switch (metric->type) {
case EDGETPU_METRIC_TYPE_TPU_USAGE:
@@ -284,7 +287,7 @@ void edgetpu_usage_stats_process_buffer(struct edgetpu_dev *etdev, void *buf)
break;
}
- metric++;
+ metric = (struct edgetpu_usage_metric *)((char *)metric + header->metric_size);
}
}
diff --git a/drivers/edgetpu/edgetpu-usage-stats.h b/drivers/edgetpu/edgetpu-usage-stats.h
index a60b107..6a89acb 100644
--- a/drivers/edgetpu/edgetpu-usage-stats.h
+++ b/drivers/edgetpu/edgetpu-usage-stats.h
@@ -10,6 +10,17 @@
#include <linux/hashtable.h>
#include <linux/mutex.h>
+/* The highest version of usage metrics handled by this driver. */
+#define EDGETPU_USAGE_METRIC_VERSION 1
+
+/*
+ * Size in bytes of usage metric v1.
+ * If fewer bytes than this are received then discard the invalid buffer.
+ * This size also identifies the fw response as v1; subsequent versions will add another field
+ * with the version number.
+ */
+#define EDGETPU_USAGE_METRIC_SIZE_V1 20
+
/* Header struct in the metric buffer. */
/* Must be kept in sync with firmware struct UsageTrackerHeader */
struct edgetpu_usage_header {
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/Makefile b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/Makefile
index c47f1c5..7de0874 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/Makefile
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/Makefile
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
#
# Makefile for GCIP framework.
#
@@ -24,6 +24,8 @@ ccflags-y += -I$(CURRENT_DIR)/../../include
ifdef CONFIG_GCIP_TEST
obj-y += unittests/
+include $(srctree)/drivers/gcip/unittests/Makefile.include
+$(call include_test_path, $(gcip-objs))
endif
modules modules_install clean:
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-alloc-helper.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-alloc-helper.c
index 85af8e5..4008dff 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-alloc-helper.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-alloc-helper.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP helpers for allocating memories.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-dma-fence.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-dma-fence.c
index 4f83670..ca49526 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-dma-fence.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-dma-fence.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP support of DMA fences.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-domain-pool.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-domain-pool.c
index 383b812..882aa80 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-domain-pool.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-domain-pool.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP IOMMU domain allocator.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-firmware.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-firmware.c
index da5ad08..52c3940 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-firmware.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-firmware.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP firmware interface.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-image-config.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-image-config.c
index 62acd0b..98a3546 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-image-config.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-image-config.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* Framework for parsing the firmware image configuration.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c
index 15b2c53..c3da416 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* Kernel Control Interface, implements the protocol between AP kernel and GCIP firmware.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mailbox.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mailbox.c
index 334a51d..6d20771 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mailbox.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mailbox.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP Mailbox Interface.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mem-pool.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mem-pool.c
index 3e18051..564991b 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mem-pool.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-mem-pool.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* A simple memory allocator to help allocating reserved memory pools.
*
@@ -12,21 +12,21 @@
#include <gcip/gcip-mem-pool.h>
-int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, phys_addr_t base_paddr,
+int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, unsigned long base_addr,
size_t size, size_t granule)
{
int ret;
- if (!base_paddr || granule == 0)
+ if (!base_addr || granule == 0)
return -EINVAL;
- if (base_paddr % granule || size % granule)
+ if (base_addr % granule || size % granule)
return -EINVAL;
pool->gen_pool = gen_pool_create(ilog2(granule), -1);
if (!pool->gen_pool) {
dev_err(dev, "gcip memory pool allocate gen_pool failed");
return -ENOMEM;
}
- ret = gen_pool_add(pool->gen_pool, base_paddr, size, -1);
+ ret = gen_pool_add(pool->gen_pool, base_addr, size, -1);
if (ret) {
gen_pool_destroy(pool->gen_pool);
pool->gen_pool = NULL;
@@ -35,7 +35,7 @@ int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, phys_addr
}
pool->dev = dev;
pool->granule = granule;
- pool->base_paddr = base_paddr;
+ pool->base_addr = base_addr;
return 0;
}
@@ -47,23 +47,20 @@ void gcip_mem_pool_exit(struct gcip_mem_pool *pool)
pool->gen_pool = NULL;
}
-phys_addr_t gcip_mem_pool_alloc(struct gcip_mem_pool *pool, size_t size)
+unsigned long gcip_mem_pool_alloc(struct gcip_mem_pool *pool, size_t size)
{
unsigned long addr;
- size_t aligned_size = ALIGN(size, pool->granule);
- addr = gen_pool_alloc(pool->gen_pool, aligned_size);
+ addr = gen_pool_alloc(pool->gen_pool, size);
if (!addr)
return 0;
- dev_dbg(pool->dev, "%s @ size = %#zx paddr=%#lx", __func__, size, addr);
- return (phys_addr_t)addr;
+ dev_dbg(pool->dev, "%s @ size = %#zx addr=%#lx", __func__, size, addr);
+ return addr;
}
-void gcip_mem_pool_free(struct gcip_mem_pool *pool, phys_addr_t paddr, size_t size)
+void gcip_mem_pool_free(struct gcip_mem_pool *pool, unsigned long addr, size_t size)
{
- unsigned long addr = paddr;
-
- dev_dbg(pool->dev, "%s @ size = %#zx paddr=%#lx", __func__, size, addr);
+ dev_dbg(pool->dev, "%s @ size = %#zx addr=%#lx", __func__, size, addr);
size = ALIGN(size, pool->granule);
gen_pool_free(pool->gen_pool, addr, size);
}
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-pm.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-pm.c
index 54589e0..b9907a1 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-pm.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-pm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* Power management interface for GCIP devices.
*
@@ -113,8 +113,10 @@ static int gcip_pm_get_locked(struct gcip_pm *pm)
gcip_pm_lockdep_assert_held(pm);
if (!pm->count) {
- pm->power_down_pending = false;
- ret = pm->power_up(pm->data);
+ if (pm->power_down_pending)
+ pm->power_down_pending = false;
+ else
+ ret = pm->power_up(pm->data);
}
if (!ret)
@@ -163,7 +165,7 @@ int gcip_pm_get(struct gcip_pm *pm)
return ret;
}
-static void __gcip_pm_put(struct gcip_pm *pm, bool async)
+void gcip_pm_put(struct gcip_pm *pm)
{
if (!pm)
return;
@@ -175,10 +177,7 @@ static void __gcip_pm_put(struct gcip_pm *pm, bool async)
if (!--pm->count) {
pm->power_down_pending = true;
- if (async)
- schedule_delayed_work(&pm->power_down_work, 0);
- else
- gcip_pm_try_power_down(pm);
+ gcip_pm_try_power_down(pm);
}
dev_dbg(pm->dev, "%s: %d\n", __func__, pm->count);
@@ -187,29 +186,12 @@ unlock:
mutex_unlock(&pm->lock);
}
-void gcip_pm_put(struct gcip_pm *pm)
-{
- __gcip_pm_put(pm, false);
-}
-
-void gcip_pm_put_async(struct gcip_pm *pm)
-{
- __gcip_pm_put(pm, true);
-}
-
int gcip_pm_get_count(struct gcip_pm *pm)
{
- int count = -EAGAIN;
-
if (!pm)
return 0;
- if (mutex_trylock(&pm->lock)) {
- count = pm->count;
- mutex_unlock(&pm->lock);
- }
-
- return count;
+ return pm->count;
}
bool gcip_pm_is_powered(struct gcip_pm *pm)
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-telemetry.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-telemetry.c
index f557c24..1599889 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-telemetry.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-telemetry.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* GCIP telemetry: logging and tracing.
*
@@ -126,6 +126,7 @@ void gcip_telemetry_fw_log(struct gcip_telemetry *log)
case GCIP_FW_LOG_LEVEL_WARN:
dev_warn(dev, "%s", buffer);
break;
+ case GCIP_FW_LOG_LEVEL_FATAL:
case GCIP_FW_LOG_LEVEL_ERROR:
dev_err(dev, "%s", buffer);
break;
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-thermal.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-thermal.c
index 1c74837..bc06cd5 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-thermal.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-thermal.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
/*
* Thermal management support for GCIP devices.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-alloc-helper.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-alloc-helper.h
index 3d2c110..17208bf 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-alloc-helper.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-alloc-helper.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP helpers for allocating memories.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-common-image-header.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-common-image-header.h
index d986fbc..b86b430 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-common-image-header.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-common-image-header.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Common authenticated image format for Google SoCs
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-dma-fence.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-dma-fence.h
index 1d4030a..ad765d2 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-dma-fence.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-dma-fence.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP support of DMA fences.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-domain-pool.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-domain-pool.h
index a5441a9..3a6ae4b 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-domain-pool.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-domain-pool.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP IOMMU domain allocator.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-firmware.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-firmware.h
index 4787572..52f5d11 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-firmware.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-firmware.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP firmware interface.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-image-config.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-image-config.h
index bcc506f..df09d39 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-image-config.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-image-config.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Framework for parsing the firmware image configuration.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h
index 03cc078..eb83550 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Kernel Control Interface, implements the protocol between AP kernel and GCIP firmware.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mailbox.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mailbox.h
index 649b574..c88d2d7 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mailbox.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mailbox.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP Mailbox Interface.
*
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mem-pool.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mem-pool.h
index c770300..44ea5f5 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mem-pool.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-mem-pool.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* A simple memory allocator to help allocating reserved memory pools.
*
@@ -15,7 +15,7 @@
struct gcip_mem_pool {
struct device *dev;
struct gen_pool *gen_pool;
- phys_addr_t base_paddr;
+ unsigned long base_addr;
size_t granule;
};
@@ -24,8 +24,7 @@ struct gcip_mem_pool {
*
* @pool: The memory pool object to be initialized.
* @dev: Used for logging only.
- * @base_paddr: The base physical address of the pool. Must be greater than 0 and a multiple of
- * @granule.
+ * @base_addr: The base address of the pool. Must be greater than 0 and a multiple of @granule.
* @size: The size of the pool. @size should be a multiple of @granule.
* @granule: The granule when invoking the allocator. Should be a power of 2.
*
@@ -33,7 +32,7 @@ struct gcip_mem_pool {
*
* Call gcip_mem_pool_exit() to release the resources of @pool.
*/
-int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, phys_addr_t base_paddr,
+int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, unsigned long base_addr,
size_t size, size_t granule);
/*
* Releases resources of @pool.
@@ -44,28 +43,28 @@ int gcip_mem_pool_init(struct gcip_mem_pool *pool, struct device *dev, phys_addr
void gcip_mem_pool_exit(struct gcip_mem_pool *pool);
/*
- * Allocates and returns the allocated physical address.
+ * Allocates and returns the allocated address.
*
* @size: Size to be allocated.
*
* Returns the allocated address. Returns 0 on allocation failure.
*/
-phys_addr_t gcip_mem_pool_alloc(struct gcip_mem_pool *pool, size_t size);
+unsigned long gcip_mem_pool_alloc(struct gcip_mem_pool *pool, size_t size);
/*
* Returns the address previously allocated by gcip_mem_pool_alloc().
*
* The size and address must match what previously passed to / returned by gcip_mem_pool_alloc().
*/
-void gcip_mem_pool_free(struct gcip_mem_pool *pool, phys_addr_t paddr, size_t size);
+void gcip_mem_pool_free(struct gcip_mem_pool *pool, unsigned long addr, size_t size);
/*
- * Returns the offset between @paddr and @base_paddr passed to gcip_mem_pool_init().
+ * Returns the offset between @addr and @base_addr passed to gcip_mem_pool_init().
*
- * @paddr must be a value returned by gcip_mem_pool_alloc().
+ * @addr must be a value returned by gcip_mem_pool_alloc().
*/
-static inline size_t gcip_mem_pool_offset(struct gcip_mem_pool *pool, phys_addr_t paddr)
+static inline size_t gcip_mem_pool_offset(struct gcip_mem_pool *pool, unsigned long addr)
{
- return paddr - pool->base_paddr;
+ return addr - pool->base_addr;
}
#endif /* __GCIP_MEM_POOL_H__ */
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-pm.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-pm.h
index c7673d8..4842598 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-pm.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-pm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Power management support for GCIP devices.
*
@@ -97,17 +97,10 @@ int gcip_pm_get(struct gcip_pm *pm);
*/
void gcip_pm_put(struct gcip_pm *pm);
-/*
- * Same as gcip_pm_put, but the power off will be scheduled later.
- * Caller should use this async gcip_pm_put if they're on the power off path to prevent deadlock,
- * e.g., a workqueue that will be canceled during power off.
- */
-void gcip_pm_put_async(struct gcip_pm *pm);
-
-/* Gets the power up counter. Retures -EAGAIN if device is in power state transition. */
+/* Gets the power up counter. Note that this is checked without PM lock. */
int gcip_pm_get_count(struct gcip_pm *pm);
-/* Checks if device is already on. Retures false if device is off or in power state transition. */
+/* Checks if device is already on. Note that this is checked without PM lock. */
bool gcip_pm_is_powered(struct gcip_pm *pm);
/* Shuts down the device if @pm->count equals to 0 or @force is true. */
@@ -122,4 +115,41 @@ static inline void gcip_pm_lockdep_assert_held(struct gcip_pm *pm)
lockdep_assert_held(&pm->lock);
}
+/*
+ * Lock the PM lock.
+ * Since all the PM requests will be blocked until gcip_pm_unlock is called, one should use the
+ * gcip_pm_{get,get_if_powered,put} if possible and uses this only if a power state transition can
+ * not be triggered, e.g., in a workqueue that will be canceled during power off or crash handler.
+ */
+static inline void gcip_pm_lock(struct gcip_pm *pm)
+{
+ if (!pm)
+ return;
+
+ mutex_lock(&pm->lock);
+}
+
+/*
+ * Lock the PM lock.
+ * Same as gcip_pm_lock, but returns 1 if the lock has been acquired successfully, and 0 on
+ * contention.
+ */
+static inline int gcip_pm_trylock(struct gcip_pm *pm)
+{
+ if (!pm)
+ return 1;
+
+ return mutex_trylock(&pm->lock);
+}
+
+/* Unlock the PM lock. */
+static inline void gcip_pm_unlock(struct gcip_pm *pm)
+{
+ if (!pm)
+ return;
+
+ lockdep_assert_held(&pm->lock);
+ mutex_unlock(&pm->lock);
+}
+
#endif /* __GCIP_PM_H__ */
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-telemetry.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-telemetry.h
index 4556291..ad26ee9 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-telemetry.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-telemetry.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* GCIP telemetry: logging and tracing.
*
@@ -22,6 +22,7 @@
#define GCIP_FW_LOG_LEVEL_INFO (0)
#define GCIP_FW_LOG_LEVEL_WARN (-1)
#define GCIP_FW_LOG_LEVEL_ERROR (-2)
+#define GCIP_FW_LOG_LEVEL_FATAL (-3)
#define GCIP_FW_DMESG_LOG_LEVEL (GCIP_FW_LOG_LEVEL_WARN)
diff --git a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-thermal.h b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-thermal.h
index 5d896f4..7c9ebc4 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-thermal.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-thermal.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Thermal management support for GCIP devices.
*
diff --git a/drivers/edgetpu/mobile-pm.c b/drivers/edgetpu/mobile-pm.c
index c4283f8..2c9eb1b 100644
--- a/drivers/edgetpu/mobile-pm.c
+++ b/drivers/edgetpu/mobile-pm.c
@@ -31,10 +31,8 @@
#define BLOCK_DOWN_MAX_DELAY_US 1500
enum edgetpu_pwr_state edgetpu_active_states[EDGETPU_NUM_STATES] = {
- TPU_ACTIVE_UUD,
- TPU_ACTIVE_SUD,
- TPU_ACTIVE_UD,
- TPU_ACTIVE_NOM,
+ TPU_ACTIVE_MIN, TPU_ACTIVE_ULTRA_LOW, TPU_ACTIVE_VERY_LOW, TPU_ACTIVE_SUB_LOW,
+ TPU_ACTIVE_LOW, TPU_ACTIVE_MEDIUM, TPU_ACTIVE_NOM,
};
uint32_t *edgetpu_states_display = edgetpu_active_states;
diff --git a/drivers/edgetpu/mobile-soc-gsx01.c b/drivers/edgetpu/mobile-soc-gsx01.c
index 143841d..b903ba1 100644
--- a/drivers/edgetpu/mobile-soc-gsx01.c
+++ b/drivers/edgetpu/mobile-soc-gsx01.c
@@ -328,13 +328,22 @@ long edgetpu_soc_pm_get_rate(struct edgetpu_dev *etdev, int flags)
*/
switch (TO_PLL_DIV_M(pll_con3)) {
case 221:
- curr_state = TPU_ACTIVE_UUD;
+ curr_state = TPU_ACTIVE_MIN;
+ break;
+ case 222:
+ curr_state = TPU_ACTIVE_ULTRA_LOW;
break;
case 153:
- curr_state = TPU_ACTIVE_SUD;
+ curr_state = TPU_ACTIVE_VERY_LOW;
+ break;
+ case 174:
+ curr_state = TPU_ACTIVE_SUB_LOW;
break;
case 206:
- curr_state = TPU_ACTIVE_UD;
+ curr_state = TPU_ACTIVE_LOW;
+ break;
+ case 118:
+ curr_state = TPU_ACTIVE_MEDIUM;
break;
case 182:
curr_state = TPU_ACTIVE_NOM;
@@ -567,17 +576,18 @@ void edgetpu_soc_pm_exit(struct edgetpu_dev *etdev)
exynos_pm_qos_remove_request(&etdev->soc_data->mif_min);
}
-static int tpu_pause_callback(enum thermal_pause_state action, void *dev)
+static int tpu_pause_callback(enum thermal_pause_state action, void *data)
{
+ struct gcip_thermal *thermal = data;
int ret = -EINVAL;
- if (!dev)
+ if (!thermal)
return ret;
if (action == THERMAL_SUSPEND)
- ret = gcip_thermal_suspend_device(dev);
+ ret = gcip_thermal_suspend_device(thermal);
else if (action == THERMAL_RESUME)
- ret = gcip_thermal_resume_device(dev);
+ ret = gcip_thermal_resume_device(thermal);
return ret;
}
@@ -587,7 +597,7 @@ void edgetpu_soc_thermal_init(struct edgetpu_dev *etdev)
struct gcip_thermal *thermal = etdev->thermal;
struct notifier_block *nb = gcip_thermal_get_notifier_block(thermal);
- register_tpu_thermal_pause_cb(tpu_pause_callback, thermal->dev);
+ register_tpu_thermal_pause_cb(tpu_pause_callback, thermal);
if (etdev->soc_data->bcl_dev)
exynos_pm_qos_add_notifier(PM_QOS_TPU_FREQ_MAX, nb);
diff --git a/drivers/edgetpu/rio/config-pwr-state.h b/drivers/edgetpu/rio/config-pwr-state.h
index 652c158..bd6b30c 100644
--- a/drivers/edgetpu/rio/config-pwr-state.h
+++ b/drivers/edgetpu/rio/config-pwr-state.h
@@ -8,25 +8,21 @@
#ifndef __RIO_CONFIG_PWR_STATE_H__
#define __RIO_CONFIG_PWR_STATE_H__
-/*
- * TPU Power States:
- * 0: Off
- * 225000 Ultra Underdrive @225MHz
- * 625000: Super Underdrive @625MHz
- * 845000: Underdrive @845MHz
- * 1120000: Nominal @1120MHz
- */
+/* TPU Power States. See zuma-dvfs table. */
enum edgetpu_pwr_state {
TPU_OFF = 0,
- TPU_ACTIVE_UUD = 225000,
- TPU_ACTIVE_SUD = 625000,
- TPU_ACTIVE_UD = 845000,
- TPU_ACTIVE_NOM = 1120000,
+ TPU_ACTIVE_MIN = 226000,
+ TPU_ACTIVE_ULTRA_LOW = 455000,
+ TPU_ACTIVE_VERY_LOW = 627000,
+ TPU_ACTIVE_SUB_LOW = 712000,
+ TPU_ACTIVE_LOW = 845000,
+ TPU_ACTIVE_MEDIUM = 967000,
+ TPU_ACTIVE_NOM = 1119000,
};
-#define MIN_ACTIVE_STATE TPU_ACTIVE_UUD
+#define MIN_ACTIVE_STATE TPU_ACTIVE_MIN
-#define EDGETPU_NUM_STATES 4
+#define EDGETPU_NUM_STATES 7
extern enum edgetpu_pwr_state edgetpu_active_states[];