diff options
author | Zuma copybara merger <zuma-automerger@google.com> | 2023-03-10 08:30:37 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-03-10 03:04:07 -0800 |
commit | 8aa7813672d57bdfe02dd09be95b6598734e597c (patch) | |
tree | 697c7a5d39414dea86ba8c8674814afd87d60123 | |
parent | 5df3ca7b7dd68e8efb1b30c36676a4cf315d3b19 (diff) | |
download | rio-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
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[]; |