diff options
author | Zuma copybara merger <zuma-automerger@google.com> | 2023-03-28 09:09:58 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-04-03 22:22:46 -0700 |
commit | 4ffe72f5aff84359a3499dd053e36a0f9135311c (patch) | |
tree | 81208a0b58fe0ca000769ddb30c2843c2874aa62 | |
parent | 0a36ddb6b5b8c8b0de49b604b70eddd2d8b7ad54 (diff) | |
download | rio-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/Kbuild | 10 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-core.c | 3 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-fs.c | 7 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-internal.h | 1 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-mmu.h | 16 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-mobile-platform.c | 47 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-mobile-platform.h | 19 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-thermal.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-thermal.h | 3 | ||||
-rw-r--r-- | drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-iommu.c | 7 | ||||
-rw-r--r-- | drivers/edgetpu/gcip-kernel-driver/drivers/gcip/gcip-kci.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/gcip-kernel-driver/include/gcip/gcip-kci.h | 1 | ||||
-rw-r--r-- | drivers/edgetpu/mobile-firmware.c | 69 | ||||
-rw-r--r-- | drivers/edgetpu/mobile-pm.c | 2 |
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"); |