summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuma copybara merger <zuma-automerger@google.com>2023-03-28 09:09:58 +0000
committerCopybara-Service <copybara-worker@google.com>2023-04-03 22:22:46 -0700
commit4ffe72f5aff84359a3499dd053e36a0f9135311c (patch)
tree81208a0b58fe0ca000769ddb30c2843c2874aa62
parent0a36ddb6b5b8c8b0de49b604b70eddd2d8b7ad54 (diff)
downloadrio-4ffe72f5aff84359a3499dd053e36a0f9135311c.tar.gz
[Copybara Auto Merge] Merge branch zuma into android14-gs-pixel-5.15
gcip: KCI accept out-of-order responses Bug: 274574929 edgetpu: Fix thermal node name Bug: 275529799 Revert "Revert "edgetpu: create debugfs symlinks for non-default device names"" Bug: 274860504 edgetpu: rename MMU flags for control cluster access Bug: 275112261 gcip: Define new gcip_kci_code for setting device properties Bug: 273578844 edgetpu: Clean-up scmversion vs GIT_REPO_TAG usage Bug: 274893782 edgetpu: Alloc NS fw ctx memory dynamically Bug: 272628133 edgetpu: Use scmversion instead of GIT_REPO_TAG Bug: 274893782 (repeat) edgetpu: Update Kbuild git tag to work with kleaf Bug: 274893782 (repeat) Revert "edgetpu: Continue powering up if the block is still on" Bug: 272701322 gcip: alloc_iova_fast requires the page number as power of 2 Bug: 274547226 Signed-off-by: Zuma copybara merger <zuma-automerger@google.com> GitOrigin-RevId: aa147e7086dda21a4c5bd212f42f3bd551536753 Change-Id: Iec6be7508d4d75674a22f3ef1607f023b1d00570
-rw-r--r--drivers/edgetpu/Kbuild10
-rw-r--r--drivers/edgetpu/edgetpu-core.c3
-rw-r--r--drivers/edgetpu/edgetpu-fs.c7
-rw-r--r--drivers/edgetpu/edgetpu-internal.h1
-rw-r--r--drivers/edgetpu/edgetpu-mmu.h16
-rw-r--r--drivers/edgetpu/edgetpu-mobile-platform.c47
-rw-r--r--drivers/edgetpu/edgetpu-mobile-platform.h19
-rw-r--r--drivers/edgetpu/edgetpu-thermal.c2
-rw-r--r--drivers/edgetpu/edgetpu-thermal.h3
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c7
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c2
-rw-r--r--drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h1
-rw-r--r--drivers/edgetpu/mobile-firmware.c69
-rw-r--r--drivers/edgetpu/mobile-pm.c2
14 files changed, 117 insertions, 72 deletions
diff --git a/drivers/edgetpu/Kbuild b/drivers/edgetpu/Kbuild
index 92554c6..1af2389 100644
--- a/drivers/edgetpu/Kbuild
+++ b/drivers/edgetpu/Kbuild
@@ -3,15 +3,15 @@
# Use the absolute path of this Makefile to get the source directory.
CURRENT_DIR=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
GIT_PATH=$(CURRENT_DIR)/../../
+GIT_BIN=/usr/bin/git
+GIT=$(GIT_BIN) -C $(GIT_PATH)
ccflags-y += $(EXTRA_CFLAGS) -DCONFIG_EDGETPU_TELEMETRY_TRACE=1 -DCONFIG_GCIP=1 \
-I$(CURRENT_DIR)/include \
-I$(CURRENT_DIR)/gcip-kernel-driver/include
-ifeq ($(shell git -C $(GIT_PATH) rev-parse --is-inside-work-tree),true)
- GIT_REPO_STATE=$(shell (git -C $(GIT_PATH) status --porcelain | grep -q .) && echo -dirty)
- ccflags-y += -DGIT_REPO_TAG=\"$(shell git -C $(GIT_PATH) rev-parse --short HEAD)$(GIT_REPO_STATE)\"
-else
- ccflags-y += -DGIT_REPO_TAG=\"Not\ a\ git\ repository\"
+ifeq ($(shell $(GIT) rev-parse --is-inside-work-tree),true)
+ GIT_REPO_STATE=$(shell ($(GIT) status --porcelain | grep -q .) && echo -dirty)
+ ccflags-y += -DGIT_REPO_TAG=\"$(shell $(GIT) rev-parse --short HEAD)$(GIT_REPO_STATE)\"
endif
obj-$(CONFIG_RIO) += rio.o
diff --git a/drivers/edgetpu/edgetpu-core.c b/drivers/edgetpu/edgetpu-core.c
index 2e46765..dc6af23 100644
--- a/drivers/edgetpu/edgetpu-core.c
+++ b/drivers/edgetpu/edgetpu-core.c
@@ -657,8 +657,7 @@ int edgetpu_alloc_coherent(struct edgetpu_dev *etdev, size_t size,
struct edgetpu_coherent_mem *mem,
enum edgetpu_context_id context_id)
{
- const u32 flags = EDGETPU_MMU_32 | EDGETPU_MMU_HOST |
- EDGETPU_MMU_COHERENT;
+ const u32 flags = EDGETPU_MMU_CC_ACCESS | EDGETPU_MMU_HOST | EDGETPU_MMU_COHERENT;
mem->vaddr = dma_alloc_coherent(etdev->dev, size, &mem->dma_addr,
GFP_KERNEL);
diff --git a/drivers/edgetpu/edgetpu-fs.c b/drivers/edgetpu/edgetpu-fs.c
index 888e301..c626500 100644
--- a/drivers/edgetpu/edgetpu-fs.c
+++ b/drivers/edgetpu/edgetpu-fs.c
@@ -1035,6 +1035,10 @@ static int edgeptu_fs_add_interface(struct edgetpu_dev *etdev, struct edgetpu_de
return ret;
}
+ if (etiparams->name)
+ etiface->d_entry =
+ debugfs_create_symlink(etiparams->name, edgetpu_debugfs_dir,
+ etdev->dev_name);
return 0;
}
@@ -1070,6 +1074,7 @@ void edgetpu_fs_remove(struct edgetpu_dev *etdev)
for (i = 0; i < etdev->num_ifaces; i++) {
struct edgetpu_dev_iface *etiface = &etdev->etiface[i];
+ debugfs_remove(etiface->d_entry);
device_destroy(edgetpu_class, etiface->devno);
etiface->etcdev = NULL;
cdev_del(&etiface->cdev);
@@ -1125,4 +1130,6 @@ struct dentry *edgetpu_fs_debugfs_dir(void)
MODULE_DESCRIPTION("Google EdgeTPU file operations");
MODULE_VERSION(DRIVER_VERSION);
MODULE_LICENSE("GPL v2");
+#ifdef GIT_REPO_TAG
MODULE_INFO(gitinfo, GIT_REPO_TAG);
+#endif
diff --git a/drivers/edgetpu/edgetpu-internal.h b/drivers/edgetpu/edgetpu-internal.h
index 1179ee4..0ed3e55 100644
--- a/drivers/edgetpu/edgetpu-internal.h
+++ b/drivers/edgetpu/edgetpu-internal.h
@@ -231,6 +231,7 @@ struct edgetpu_dev_iface {
struct edgetpu_dev *etdev; /* Pointer to core device struct */
dev_t devno; /* char device dev_t */
const char *name; /* interface specific device name */
+ struct dentry *d_entry; /* debugfs symlink if not default device name iface */
};
/* Firmware crash_type codes */
diff --git a/drivers/edgetpu/edgetpu-mmu.h b/drivers/edgetpu/edgetpu-mmu.h
index 29bf1a9..bff24c6 100644
--- a/drivers/edgetpu/edgetpu-mmu.h
+++ b/drivers/edgetpu/edgetpu-mmu.h
@@ -18,14 +18,14 @@
/* flags for MMU operations */
-/* Whether the TPU address to be allocated can be 64-bit wide. */
-#define EDGETPU_MMU_32 (0 << 0)
-#define EDGETPU_MMU_64 (1 << 0)
+/* Whether the TPU address allocated must be accessible to the control cluster. */
+#define EDGETPU_MMU_CC_ACCESS (0 << 0)
+#define EDGETPU_MMU_CC_NO_ACCESS (1 << 0)
/* The memory will be mapped to host DRAM or dma-buf. */
-#define EDGETPU_MMU_HOST (0 << 1)
-#define EDGETPU_MMU_DMABUF (1 << 1)
+#define EDGETPU_MMU_HOST (0 << 1)
+#define EDGETPU_MMU_DMABUF (1 << 1)
-#define EDGETPU_MMU_COHERENT (1 << 2)
+#define EDGETPU_MMU_COHERENT (1 << 2)
/*
* The max possible value of token is (EDGETPU_DOMAIN_TOKEN_END - 1), which
@@ -74,8 +74,8 @@ static inline u32 map_to_mmu_flags(edgetpu_map_flag_t flags)
{
u32 ret = 0;
- ret |= (flags & EDGETPU_MAP_CPU_NONACCESSIBLE) ? EDGETPU_MMU_64 :
- EDGETPU_MMU_32;
+ ret |= (flags & EDGETPU_MAP_CPU_NONACCESSIBLE) ? EDGETPU_MMU_CC_NO_ACCESS :
+ EDGETPU_MMU_CC_ACCESS;
ret |= (flags & EDGETPU_MAP_COHERENT) ? EDGETPU_MMU_COHERENT : 0;
return ret;
}
diff --git a/drivers/edgetpu/edgetpu-mobile-platform.c b/drivers/edgetpu/edgetpu-mobile-platform.c
index e9d9a5e..79a27d6 100644
--- a/drivers/edgetpu/edgetpu-mobile-platform.c
+++ b/drivers/edgetpu/edgetpu-mobile-platform.c
@@ -276,34 +276,15 @@ static void edgetpu_platform_remove_irq(struct edgetpu_mobile_platform_dev *etmd
edgetpu_unregister_irq(etdev, etmdev->irq[i]);
}
-/*
- * Fetch and set the firmware context region from device tree.
- */
-static int
-edgetpu_mobile_platform_set_fw_ctx_memory(struct edgetpu_mobile_platform_dev *etmdev)
+static inline const char *get_driver_commit(void)
{
- struct edgetpu_dev *etdev = &etmdev->edgetpu_dev;
- struct device *dev = etdev->dev;
- struct resource r;
- struct device_node *np;
- int ret;
-
- np = of_parse_phandle(dev->of_node, "memory-region", 1);
- if (!np) {
- etdev_warn(etdev, "No memory for firmware contexts");
- return -ENODEV;
- }
-
- ret = of_address_to_resource(np, 0, &r);
- of_node_put(np);
- if (ret) {
- etdev_warn(etdev, "No memory address for firmware contexts");
- return ret;
- }
-
- etmdev->fw_ctx_paddr = r.start;
- etmdev->fw_ctx_size = resource_size(&r);
- return 0;
+#if IS_ENABLED(CONFIG_MODULE_SCMVERSION)
+ return THIS_MODULE->scmversion;
+#elif defined(GIT_REPO_TAG)
+ return GIT_REPO_TAG;
+#else
+ return "Unknown";
+#endif
}
static int edgetpu_mobile_platform_probe(struct platform_device *pdev,
@@ -368,6 +349,9 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev,
goto out_cleanup_fw;
}
+ INIT_LIST_HEAD(&etmdev->fw_ctx_list);
+ mutex_init(&etmdev->fw_ctx_list_lock);
+
/*
* Parses PMU before edgetpu_device_add so edgetpu_chip_pm_create can know whether to set
* the is_block_down op.
@@ -416,12 +400,6 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev,
if (ret)
etdev_warn(etdev, "Failed to create thermal device: %d", ret);
- ret = edgetpu_mobile_platform_set_fw_ctx_memory(etmdev);
- if (ret) {
- etdev_err(etdev, "Failed to initialize fw context memory: %d", ret);
- goto out_destroy_thermal;
- }
-
ret = edgetpu_sync_fence_manager_create(etdev);
if (ret) {
etdev_err(etdev, "Failed to create DMA fence manager: %d", ret);
@@ -436,7 +414,8 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev,
}
}
- dev_info(dev, "%s edgetpu initialized. Build: %s", etdev->dev_name, GIT_REPO_TAG);
+ dev_info(dev, "%s edgetpu initialized. Build: %s", etdev->dev_name, get_driver_commit());
+
/* Turn the device off unless a client request is already received. */
gcip_pm_shutdown(etdev->pm, false);
diff --git a/drivers/edgetpu/edgetpu-mobile-platform.h b/drivers/edgetpu/edgetpu-mobile-platform.h
index eee53ac..e89e0f0 100644
--- a/drivers/edgetpu/edgetpu-mobile-platform.h
+++ b/drivers/edgetpu/edgetpu-mobile-platform.h
@@ -48,6 +48,17 @@ struct edgetpu_mobile_platform_pwr {
void (*post_fw_start)(struct edgetpu_dev *etdev);
};
+struct edgetpu_mobile_fw_ctx {
+ /* SG table for NS firmware context region mappings. */
+ struct sg_table *sgt;
+ /* DMA address of the NS firmware context region. */
+ dma_addr_t daddr;
+ /* Size of the NS firmware context region. */
+ size_t size;
+ /* List of all NS firmware context region mappings for the device. */
+ struct list_head list;
+};
+
struct edgetpu_mobile_platform_dev {
/* Generic edgetpu device */
struct edgetpu_dev edgetpu_dev;
@@ -67,10 +78,10 @@ struct edgetpu_mobile_platform_dev {
phys_addr_t shared_mem_paddr;
/* Size of the shared memory region size */
size_t shared_mem_size;
- /* Physical address of the firmware context region */
- phys_addr_t fw_ctx_paddr;
- /* Size of the firmware context region */
- size_t fw_ctx_size;
+ /* List of all NS firmware context region mappings for the device. */
+ struct list_head fw_ctx_list;
+ /* Lock to protect @fw_ctx_list. */
+ struct mutex fw_ctx_list_lock;
/*
* Pointer to GSA device for firmware authentication.
* May be NULL if the chip does not support firmware authentication
diff --git a/drivers/edgetpu/edgetpu-thermal.c b/drivers/edgetpu/edgetpu-thermal.c
index 7ea03c7..0eb9ffb 100644
--- a/drivers/edgetpu/edgetpu-thermal.c
+++ b/drivers/edgetpu/edgetpu-thermal.c
@@ -62,7 +62,7 @@ int edgetpu_thermal_create(struct edgetpu_dev *etdev)
.pm = etdev->pm,
.dentry = edgetpu_fs_debugfs_dir(),
.node_name = EDGETPU_COOLING_NAME,
- .type = EDGETPU_COOLING_NAME,
+ .type = EDGETPU_COOLING_TYPE,
.data = etdev,
.get_rate = __edgetpu_thermal_get_rate,
.set_rate = __edgetpu_thermal_set_rate,
diff --git a/drivers/edgetpu/edgetpu-thermal.h b/drivers/edgetpu/edgetpu-thermal.h
index 9bc2235..ec087ec 100644
--- a/drivers/edgetpu/edgetpu-thermal.h
+++ b/drivers/edgetpu/edgetpu-thermal.h
@@ -9,7 +9,8 @@
#include "edgetpu-internal.h"
-#define EDGETPU_COOLING_NAME "tpu_cooling"
+#define EDGETPU_COOLING_NAME "tpu-cooling"
+#define EDGETPU_COOLING_TYPE "tpu_cooling"
int edgetpu_thermal_create(struct edgetpu_dev *etdev);
void edgetpu_thermal_destroy(struct edgetpu_dev *etdev);
diff --git a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c
index 2e0dac6..979eb86 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c
@@ -102,7 +102,12 @@ static dma_addr_t iovad_alloc_iova_space(struct gcip_iommu_domain *domain, size_
{
unsigned long iova, shift = gcip_iommu_domain_shift(domain);
- iova = alloc_iova_fast(&domain->iova_space.iovad, size >> shift,
+ size = size >> shift;
+
+ if (size < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1)))
+ size = roundup_pow_of_two(size);
+
+ iova = alloc_iova_fast(&domain->iova_space.iovad, size,
domain->domain_pool->last_daddr >> shift, true);
return (dma_addr_t)iova << shift;
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 c3da416..58852d5 100644
--- a/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c
+++ b/drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c
@@ -477,7 +477,7 @@ int gcip_kci_init(struct gcip_kci *kci, const struct gcip_kci_args *args)
mailbox_args.timeout = args->timeout;
mailbox_args.ops = &gcip_mailbox_ops;
mailbox_args.data = kci;
- mailbox_args.ignore_seq_order = false;
+ mailbox_args.ignore_seq_order = true;
ret = gcip_mailbox_init(&kci->mailbox, &mailbox_args);
if (ret)
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 2aa721b..51dd803 100644
--- a/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h
+++ b/drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h
@@ -103,6 +103,7 @@ enum gcip_kci_code {
GCIP_KCI_CODE_FIRMWARE_TRACING_LEVEL = 19,
GCIP_KCI_CODE_THERMAL_CONTROL = 20,
GCIP_KCI_CODE_GET_USAGE_V2 = 21,
+ GCIP_KCI_CODE_SET_DEVICE_PROPERTIES = 22,
GCIP_KCI_CODE_RKCI_ACK = 256,
};
diff --git a/drivers/edgetpu/mobile-firmware.c b/drivers/edgetpu/mobile-firmware.c
index e8f156f..d85b27e 100644
--- a/drivers/edgetpu/mobile-firmware.c
+++ b/drivers/edgetpu/mobile-firmware.c
@@ -13,6 +13,7 @@
#include <linux/string.h>
#include <linux/types.h>
+#include <gcip/gcip-alloc-helper.h>
#include <gcip/gcip-image-config.h>
#include "edgetpu.h"
@@ -34,29 +35,69 @@ static int image_config_map(void *data, dma_addr_t daddr, phys_addr_t paddr, siz
{
struct edgetpu_dev *etdev = data;
struct edgetpu_mobile_platform_dev *etmdev = to_mobile_dev(etdev);
- bool ns = !(flags & GCIP_IMAGE_CONFIG_FLAGS_SECURE);
+ struct edgetpu_mobile_fw_ctx *fw_ctx;
+ int ret;
- if (ns) {
- if (paddr + size > etmdev->fw_ctx_size) {
- etdev_err(etdev, "Insufficient firmware context memory");
- return -ENOSPC;
- }
- /*
- * For non-secure mappings the physical addresses in image config are based on the
- * firmware context region.
- */
- paddr += etmdev->fw_ctx_paddr;
+ if (flags & GCIP_IMAGE_CONFIG_FLAGS_SECURE)
+ return edgetpu_mmu_add_translation(etdev, daddr, paddr, size,
+ IOMMU_READ | IOMMU_WRITE, EDGETPU_CONTEXT_KCI);
+
+ fw_ctx = kzalloc(sizeof(*fw_ctx), GFP_KERNEL);
+ if (!fw_ctx)
+ return -ENOMEM;
+
+ fw_ctx->daddr = daddr;
+ fw_ctx->size = size;
+ fw_ctx->sgt = gcip_alloc_noncontiguous(etdev->dev, size, GFP_KERNEL);
+ if (!fw_ctx->sgt) {
+ kfree(fw_ctx);
+ return -ENOMEM;
+ }
+
+ ret = edgetpu_mmu_map_iova_sgt(etdev, daddr, fw_ctx->sgt, DMA_BIDIRECTIONAL, 0,
+ EDGETPU_CONTEXT_KCI);
+ if (ret) {
+ gcip_free_noncontiguous(fw_ctx->sgt);
+ kfree(fw_ctx);
+ return ret;
}
- return edgetpu_mmu_add_translation(etdev, daddr, paddr, size,
- IOMMU_READ | IOMMU_WRITE, EDGETPU_CONTEXT_KCI);
+ mutex_lock(&etmdev->fw_ctx_list_lock);
+ list_add_tail(&fw_ctx->list, &etmdev->fw_ctx_list);
+ mutex_unlock(&etmdev->fw_ctx_list_lock);
+
+ return 0;
}
static void image_config_unmap(void *data, dma_addr_t daddr, size_t size, unsigned int flags)
{
struct edgetpu_dev *etdev = data;
+ struct edgetpu_mobile_platform_dev *etmdev = to_mobile_dev(etdev);
+ struct edgetpu_mobile_fw_ctx *fw_ctx = NULL, *cur;
+
+ if (flags & GCIP_IMAGE_CONFIG_FLAGS_SECURE) {
+ edgetpu_mmu_remove_translation(etdev, daddr, size, EDGETPU_CONTEXT_KCI);
+ return;
+ }
- edgetpu_mmu_remove_translation(etdev, daddr, size, EDGETPU_CONTEXT_KCI);
+ mutex_lock(&etmdev->fw_ctx_list_lock);
+ list_for_each_entry(cur, &etmdev->fw_ctx_list, list) {
+ if (cur->daddr == daddr && cur->size == size) {
+ fw_ctx = cur;
+ list_del(&cur->list);
+ break;
+ }
+ }
+ mutex_unlock(&etmdev->fw_ctx_list_lock);
+
+ if (fw_ctx) {
+ edgetpu_mmu_unmap_iova_sgt(etdev, daddr, fw_ctx->sgt, DMA_BIDIRECTIONAL,
+ EDGETPU_CONTEXT_KCI);
+ gcip_free_noncontiguous(fw_ctx->sgt);
+ kfree(fw_ctx);
+ } else {
+ etdev_warn(etdev, "Firmware context region SG table not found.");
+ }
}
static int mobile_firmware_after_create(struct edgetpu_firmware *et_fw)
diff --git a/drivers/edgetpu/mobile-pm.c b/drivers/edgetpu/mobile-pm.c
index 1e0cbb5..53571e0 100644
--- a/drivers/edgetpu/mobile-pm.c
+++ b/drivers/edgetpu/mobile-pm.c
@@ -213,7 +213,7 @@ static int mobile_power_up(void *data)
usleep_range(BLOCK_DOWN_MIN_DELAY_US, BLOCK_DOWN_MAX_DELAY_US);
} while (++times < BLOCK_DOWN_RETRY_TIMES);
if (times >= BLOCK_DOWN_RETRY_TIMES && !platform_pwr->is_block_down(etdev))
- etdev_warn(etdev, "Block is still on\n");
+ return -EAGAIN;
}
etdev_info(etdev, "Powering up\n");