diff options
author | Nishant Prajapati <nishantpjpt@google.com> | 2021-05-06 09:36:41 +0530 |
---|---|---|
committer | Nishant Prajapati <nishantpjpt@google.com> | 2021-05-06 05:32:00 +0000 |
commit | a7c17065c3886f8debb97cdff8bf509de94714ee (patch) | |
tree | a0d39f291806239f94f46db1ce8af82a2277729e | |
parent | f9b2ca71995a76c1b892d07b920b68cad2547a03 (diff) | |
download | janeiro-a7c17065c3886f8debb97cdff8bf509de94714ee.tar.gz |
edgetpu: Remove abrolhos files
Signed-off-by: Nishant Prajapati <nishantpjpt@google.com>
Change-Id: I39df56c56489eaa465cbcc951b130a40254f86a8
-rw-r--r-- | drivers/edgetpu/abrolhos-core.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-debug-dump.c | 135 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-debug-dump.h | 16 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-device-group.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-device.c | 170 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-firmware.c | 235 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-firmware.h | 54 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-fs.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-iommu.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-platform.c | 423 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-platform.h | 61 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-pm.c | 794 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-pm.h | 166 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-thermal.c | 328 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-usage-stats.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-wakelock.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos/config-mailbox.h | 46 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos/config-tpu-cpu.h | 30 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos/config.h | 67 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos/csrs.h | 36 |
20 files changed, 0 insertions, 2573 deletions
diff --git a/drivers/edgetpu/abrolhos-core.c b/drivers/edgetpu/abrolhos-core.c deleted file mode 100644 index 02cf784..0000000 --- a/drivers/edgetpu/abrolhos-core.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-core.c" diff --git a/drivers/edgetpu/abrolhos-debug-dump.c b/drivers/edgetpu/abrolhos-debug-dump.c deleted file mode 100644 index a4dd732..0000000 --- a/drivers/edgetpu/abrolhos-debug-dump.c +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -#include <linux/platform_data/sscoredump.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -#include "abrolhos-platform.h" - -#include "edgetpu-debug-dump.c" - -static int abrolhos_sscd_generate_coredump(void *p_etdev, void *p_dump_setup) -{ - struct edgetpu_dev *etdev; - struct edgetpu_debug_dump_setup *dump_setup; - struct abrolhos_platform_dev *pdev; - struct sscd_platform_data *pdata; - struct platform_device *sscd_dev; - struct sscd_segment *segs; - struct edgetpu_debug_dump *debug_dump; - struct edgetpu_crash_reason *crash_reason; - struct edgetpu_dump_segment *dump_seg; - char crash_info[128]; - int dump_segments_num; - int i, ret; - u64 offset; - - if (!p_etdev || !p_dump_setup) - return -EINVAL; - - etdev = (struct edgetpu_dev *)p_etdev; - dump_setup = (struct edgetpu_debug_dump_setup *)p_dump_setup; - pdev = container_of(etdev, struct abrolhos_platform_dev, edgetpu_dev); - pdata = (struct sscd_platform_data *)pdev->sscd_info.pdata; - sscd_dev = (struct platform_device *)pdev->sscd_info.dev; - if (!pdata->sscd_report) { - etdev_err(etdev, "failed to generate coredump"); - return -ENOENT; - } - - offset = sizeof(struct edgetpu_debug_dump_setup); - debug_dump = (struct edgetpu_debug_dump *)((u64 *)dump_setup + - word_align_offset(offset)); - - /* Populate crash reason */ - crash_reason = (struct edgetpu_crash_reason *)((u64 *)dump_setup + - word_align_offset(debug_dump->crash_reason_offset)); - scnprintf(crash_info, sizeof(crash_info), - "[edgetpu_coredump] error code: 0x%llx", crash_reason->code); - - /* Populate dump segments */ - dump_segments_num = debug_dump->dump_segments_num; - segs = kmalloc_array(dump_segments_num, - sizeof(struct sscd_segment), - GFP_KERNEL); - if (!segs) - return -ENOMEM; - - dump_seg = (struct edgetpu_dump_segment *)((u64 *)dump_setup + - word_align_offset(debug_dump->dump_segments_offset)); - offset = debug_dump->dump_segments_offset + - sizeof(struct edgetpu_dump_segment); - for (i = 0; i < dump_segments_num; i++) { - segs[i].addr = &dump_seg[i].src_addr + 1; - segs[i].size = dump_seg[i].size; - segs[i].paddr = (void *)(etdev->debug_dump_mem.tpu_addr + - offset); - segs[i].vaddr = (void *)(etdev->debug_dump_mem.vaddr + - offset); - offset += sizeof(struct edgetpu_dump_segment) + dump_seg->size; - dump_seg = (struct edgetpu_dump_segment *) - ((u64 *)dump_seg + word_align_offset( - sizeof(struct edgetpu_dump_segment) + - dump_seg->size)); - } - - /* Pass dump data to SSCD daemon */ - etdev_dbg(etdev, "report: %d segments", dump_segments_num); - ret = pdata->sscd_report(sscd_dev, segs, dump_segments_num, - SSCD_FLAGS_ELFARM64HDR, crash_info); - - kfree(segs); - - return ret; -} - -int edgetpu_debug_dump_init(struct edgetpu_dev *etdev) -{ - size_t size; - int ret; - struct edgetpu_debug_dump_setup *dump_setup; - - size = EDGETPU_DEBUG_DUMP_MEM_SIZE; - - /* - * Allocate a buffer for various dump segments - */ - ret = edgetpu_alloc_coherent(etdev, size, &etdev->debug_dump_mem, - EDGETPU_CONTEXT_KCI); - if (ret) { - etdev_err(etdev, "Debug dump seg alloc failed"); - etdev->debug_dump_mem.vaddr = NULL; - return ret; - } - dump_setup = - (struct edgetpu_debug_dump_setup *)etdev->debug_dump_mem.vaddr; - dump_setup->dump_mem_size = size; - memset(dump_setup, 0, dump_setup->dump_mem_size); - - /* - * Allocate memory for debug dump handlers - */ - etdev->debug_dump_handlers = kcalloc(DUMP_REQ_REASON_NUM, - sizeof(*etdev->debug_dump_handlers), - GFP_KERNEL); - if (!etdev->debug_dump_handlers) - return -ENOMEM; - etdev->debug_dump_handlers[DUMP_REQ_REASON_BY_USER] = - abrolhos_sscd_generate_coredump; - - return ret; -} - -void edgetpu_debug_dump_exit(struct edgetpu_dev *etdev) -{ - if (!etdev->debug_dump_mem.vaddr) { - etdev_dbg(etdev, "Debug dump not allocated"); - return; - } - /* - * Free the memory assigned for debug dump - */ - edgetpu_free_coherent(etdev, &etdev->debug_dump_mem, - EDGETPU_CONTEXT_KCI); - kfree(etdev->debug_dump_handlers); -} diff --git a/drivers/edgetpu/abrolhos-debug-dump.h b/drivers/edgetpu/abrolhos-debug-dump.h deleted file mode 100644 index 62ef111..0000000 --- a/drivers/edgetpu/abrolhos-debug-dump.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Module that defines structure to retrieve debug dump segments - * from abrolhos firmware. - * - * Copyright (C) 2020 Google, Inc. - */ -#ifndef __ABROLHOS_DEBUG_DUMP_H__ -#define __ABROLHOS_DEBUG_DUMP_H__ - -struct abrolhos_sscd_info { - void *pdata; /* SSCD platform data */ - void *dev; /* SSCD platform device */ -}; - -#endif /* ABROLHOS_DEBUG_DUMP_H_ */ diff --git a/drivers/edgetpu/abrolhos-device-group.c b/drivers/edgetpu/abrolhos-device-group.c deleted file mode 100644 index d918348..0000000 --- a/drivers/edgetpu/abrolhos-device-group.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-device-group.c" diff --git a/drivers/edgetpu/abrolhos-device.c b/drivers/edgetpu/abrolhos-device.c deleted file mode 100644 index 8d08e33..0000000 --- a/drivers/edgetpu/abrolhos-device.c +++ /dev/null @@ -1,170 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Abrolhos Edge TPU ML accelerator device host support. - * - * Copyright (C) 2019 Google, Inc. - */ - -#include <linux/irqreturn.h> - -#include "edgetpu-config.h" -#include "edgetpu-debug-dump.h" -#include "edgetpu-internal.h" -#include "edgetpu-mailbox.h" -#include "abrolhos-platform.h" -#include "abrolhos-pm.h" -#include "edgetpu-telemetry.h" - -#define HOST_NONSECURE_INTRSRCMASKREG 0x000f0004 - -#define SSMT_NS_READ_STREAM_VID_OFFSET(n) (0x1000u + (0x4u * (n))) -#define SSMT_NS_WRITE_STREAM_VID_OFFSET(n) (0x1200u + (0x4u * (n))) - -#define SSMT_NS_READ_STREAM_VID_REG(base, n) \ - ((base) + SSMT_NS_READ_STREAM_VID_OFFSET(n)) -#define SSMT_NS_WRITE_STREAM_VID_REG(base, n) \ - ((base) + SSMT_NS_WRITE_STREAM_VID_OFFSET(n)) - -/* - * The interrupt handler for mailboxes. - * - * This handler reads the IntSrcStatusReg available on Abrolhos to get the - * response queue doorbell status of mailboxes 0-7 in one read. It loops - * through the bits to check pending interrupts and invokes their IRQ - * handlers. This allows for more efficient handling of interrupts than - * edgetpu_mailbox_handle_irq handler. - */ -static irqreturn_t -abrolhos_mailbox_handle_irq(struct edgetpu_mailbox_manager *mgr) -{ - struct edgetpu_mailbox *mailbox; - uint i; - u32 val, clear_val; - u8 mailbox_rsp_queue_status_bits; - - if (!mgr) - return IRQ_NONE; - - read_lock(&mgr->mailboxes_lock); - val = edgetpu_dev_read_32(mgr->etdev, - HOST_NONSECURE_INT_SRC_STATUS_REG); - clear_val = val & (0xff << 1); - edgetpu_dev_write_32(mgr->etdev, - HOST_NONSECURE_INT_SRC_CLEAR_REG, clear_val); - - mailbox_rsp_queue_status_bits = val >> 1; - for (i = 0; i < mgr->num_mailbox; i++) { - mailbox = mgr->mailboxes[i]; - if (mailbox && (mailbox_rsp_queue_status_bits & 0x1) && - mailbox->handle_irq) - mailbox->handle_irq(mailbox); - mailbox_rsp_queue_status_bits >>= 1; - if (!mailbox_rsp_queue_status_bits) - break; - } - read_unlock(&mgr->mailboxes_lock); - - return IRQ_HANDLED; -} - -irqreturn_t edgetpu_chip_irq_handler(int irq, void *arg) -{ - struct edgetpu_dev *etdev = arg; - - edgetpu_telemetry_irq_handler(etdev); - edgetpu_debug_dump_resp_handler(etdev); - - return abrolhos_mailbox_handle_irq(etdev->mailbox_manager); -} - -u64 edgetpu_chip_tpu_timestamp(struct edgetpu_dev *etdev) -{ - return edgetpu_dev_read_64(etdev, EDGETPU_REG_CPUNS_TIMESTAMP); -} - -void edgetpu_chip_init(struct edgetpu_dev *etdev) -{ - int i; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - - /* Disable the CustomBlock Interrupt. */ - edgetpu_dev_write_32(etdev, HOST_NONSECURE_INTRSRCMASKREG, 0x1); - - if (!abpdev->ssmt_base) - return; - - /* Setup non-secure SCIDs, assume VID = SCID */ - for (i = 0; i < EDGETPU_NCONTEXTS; i++) { - writel(i, SSMT_NS_READ_STREAM_VID_REG(abpdev->ssmt_base, i)); - writel(i, SSMT_NS_WRITE_STREAM_VID_REG(abpdev->ssmt_base, i)); - } -} - -void edgetpu_chip_exit(struct edgetpu_dev *etdev) -{ -} - -void edgetpu_mark_probe_fail(struct edgetpu_dev *etdev) -{ -} - -struct edgetpu_dumpregs_range edgetpu_chip_statusregs_ranges[] = { - { - .firstreg = EDGETPU_REG_USER_HIB_FIRST_ERROR_STATUS, - .lastreg = EDGETPU_REG_USER_HIB_FIRST_ERROR_STATUS, - }, - { - .firstreg = EDGETPU_REG_SC_RUNSTATUS, - .lastreg = EDGETPU_REG_SC_RUNSTATUS, - }, - { - .firstreg = EDGETPU_REG_USER_HIB_OUT_ACTVQ_INT_STAT, - .lastreg = EDGETPU_REG_USER_HIB_OUT_ACTVQ_INT_STAT, - }, - { - .firstreg = EDGETPU_REG_USER_HIB_IN_ACTVQ_INT_STAT, - .lastreg = EDGETPU_REG_USER_HIB_IN_ACTVQ_INT_STAT, - }, - { - .firstreg = EDGETPU_REG_USER_HIB_PARAMQ_INT_STAT, - .lastreg = EDGETPU_REG_USER_HIB_PARAMQ_INT_STAT, - }, - { - .firstreg = EDGETPU_REG_USER_HIB_TOPLVL_INT_STAT, - .lastreg = EDGETPU_REG_USER_HIB_TOPLVL_INT_STAT, - }, -}; -int edgetpu_chip_statusregs_nranges = - ARRAY_SIZE(edgetpu_chip_statusregs_ranges); - -struct edgetpu_dumpregs_range edgetpu_chip_tile_statusregs_ranges[] = { -}; -int edgetpu_chip_tile_statusregs_nranges = - ARRAY_SIZE(edgetpu_chip_tile_statusregs_ranges); - -static void edgetpu_chip_set_pm_qos(struct edgetpu_dev *etdev, u32 value) -{ - abrolhos_pm_set_pm_qos(etdev, value); -} - -static void edgetpu_chip_set_bts(struct edgetpu_dev *etdev, u32 value) -{ - abrolhos_pm_set_bts(etdev, value); -} - -void edgetpu_chip_handle_reverse_kci(struct edgetpu_dev *etdev, - struct edgetpu_kci_response_element *resp) -{ - switch (resp->code) { - case RKCI_CODE_PM_QOS: - edgetpu_chip_set_pm_qos(etdev, resp->retval); - break; - case RKCI_CODE_BTS: - edgetpu_chip_set_bts(etdev, resp->retval); - break; - default: - etdev_warn(etdev, "%s: Unrecognized KCI request: %u\n", - __func__, resp->code); - break; - } -} diff --git a/drivers/edgetpu/abrolhos-firmware.c b/drivers/edgetpu/abrolhos-firmware.c deleted file mode 100644 index 5fbec26..0000000 --- a/drivers/edgetpu/abrolhos-firmware.c +++ /dev/null @@ -1,235 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Abrolhos Edge TPU ML accelerator firmware download support. - * - * Copyright (C) 2020 Google, Inc. - */ - -#include <linux/dma-mapping.h> -#include <linux/gsa/gsa_tpu.h> -#include <linux/slab.h> - -#include "abrolhos-platform.h" -#include "edgetpu-config.h" -#include "edgetpu-firmware.h" -#include "edgetpu-internal.h" -#include "edgetpu-kci.h" -#include "edgetpu-mailbox.h" -#include "mobile-firmware.h" - -static int abrolhos_firmware_alloc_buffer( - struct edgetpu_firmware *et_fw, - struct edgetpu_firmware_buffer *fw_buf) -{ - struct edgetpu_dev *etdev = et_fw->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - - /* Allocate extra space the image header */ - size_t buffer_size = - abpdev->fw_region_size + MOBILE_FW_HEADER_SIZE; - - fw_buf->vaddr = kzalloc(buffer_size, GFP_KERNEL); - if (!fw_buf->vaddr) { - etdev_err(etdev, "%s: failed to allocate buffer (%zu bytes)\n", - __func__, buffer_size); - return -ENOMEM; - } - fw_buf->dma_addr = 0; - fw_buf->alloc_size = buffer_size; - fw_buf->used_size_align = 16; - return 0; -} - -static void abrolhos_firmware_free_buffer( - struct edgetpu_firmware *et_fw, - struct edgetpu_firmware_buffer *fw_buf) -{ - kfree(fw_buf->vaddr); - fw_buf->vaddr = NULL; - fw_buf->dma_addr = 0; - fw_buf->alloc_size = 0; - fw_buf->used_size_align = 0; -} - -static int abrolhos_firmware_setup_buffer( - struct edgetpu_firmware *et_fw, - struct edgetpu_firmware_buffer *fw_buf) -{ - return 0; -} - -static void abrolhos_firmware_teardown_buffer( - struct edgetpu_firmware *et_fw, - struct edgetpu_firmware_buffer *fw_buf) -{ -} - -static int abrolhos_firmware_restart(struct edgetpu_firmware *et_fw) -{ - struct edgetpu_dev *etdev = et_fw->etdev; - struct abrolhos_platform_dev *edgetpu_pdev = to_abrolhos_dev(etdev); - int tpu_state; - - tpu_state = gsa_send_tpu_cmd(edgetpu_pdev->gsa_dev, GSA_TPU_START); - - if (tpu_state < 0) { - etdev_err(etdev, "GSA restart firmware failed: %d\n", - tpu_state); - return -EIO; - } - - etdev_dbg(etdev, "Firmware restart successful\n"); - - return 0; -} - -static int abrolhos_firmware_prepare_run(struct edgetpu_firmware *et_fw, - struct edgetpu_firmware_buffer *fw_buf) -{ - struct edgetpu_dev *etdev = et_fw->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - void *image_vaddr, *header_vaddr; - struct mobile_image_config *image_config; - phys_addr_t image_start, image_end, carveout_start, carveout_end; - dma_addr_t header_dma_addr; - int ret, tpu_state; - - if (fw_buf->used_size < MOBILE_FW_HEADER_SIZE) { - etdev_err(etdev, "Invalid buffer size: %zu < %d\n", - fw_buf->used_size, MOBILE_FW_HEADER_SIZE); - return -EINVAL; - } - - tpu_state = gsa_send_tpu_cmd(abpdev->gsa_dev, GSA_TPU_GET_STATE); - - if (tpu_state < GSA_TPU_STATE_INACTIVE) { - etdev_warn(etdev, "GSA failed to retrieve current status: %d\n", - tpu_state); - etdev_warn(etdev, "Assuming device is inactive\n"); - tpu_state = GSA_TPU_STATE_INACTIVE; - } - - etdev_dbg(etdev, "GSA Reports TPU state: %d\n", tpu_state); - - if (tpu_state > GSA_TPU_STATE_INACTIVE) { - ret = gsa_unload_tpu_fw_image(abpdev->gsa_dev); - if (ret) { - etdev_warn(etdev, "GSA release failed: %d\n", ret); - return -EIO; - } - } - - image_vaddr = memremap(abpdev->fw_region_paddr, abpdev->fw_region_size, - MEMREMAP_WC); - - if (!image_vaddr) { - etdev_err(etdev, "memremap failed\n"); - return -ENOMEM; - } - - /* Skip the header */ - memcpy(image_vaddr, fw_buf->vaddr + MOBILE_FW_HEADER_SIZE, - fw_buf->used_size - MOBILE_FW_HEADER_SIZE); - - /* Allocate coherent memory for the image header */ - header_vaddr = dma_alloc_coherent(abpdev->gsa_dev, - MOBILE_FW_HEADER_SIZE, - &header_dma_addr, GFP_KERNEL); - if (!header_vaddr) { - etdev_err(etdev, - "Failed to allocate coherent memory for header\n"); - ret = -ENOMEM; - goto out_unmap; - } - - memcpy(header_vaddr, fw_buf->vaddr, MOBILE_FW_HEADER_SIZE); - etdev_dbg(etdev, - "Requesting GSA image load. meta = %llX payload = %llX", - header_dma_addr, (u64)abpdev->fw_region_paddr); - - ret = gsa_load_tpu_fw_image(abpdev->gsa_dev, header_dma_addr, - abpdev->fw_region_paddr); - if (ret) { - etdev_err(etdev, "GSA authentication failed: %d\n", ret); - ret = -EIO; - goto out_free_gsa; - } - - /* fetch the firmware versions */ - image_config = fw_buf->vaddr + MOBILE_IMAGE_CONFIG_OFFSET; - memcpy(&etdev->fw_version, &image_config->firmware_versions, - sizeof(etdev->fw_version)); - - /* - * GSA verifies the image config addresses and sizes are valid, - * so we don't perform overflow checks here. - */ - image_start = (phys_addr_t)image_config->carveout_base; - image_end = (phys_addr_t)(image_config->firmware_base + - image_config->firmware_size - 1); - carveout_start = abpdev->fw_region_paddr; - carveout_end = carveout_start + abpdev->fw_region_size - 1; - - /* Image must fit within the carveout */ - if (image_start < carveout_start || image_end > carveout_end) { - etdev_err(etdev, "Firmware image doesn't fit in carveout\n"); - etdev_err(etdev, "Image config: %pap - %pap\n", &image_start, - &image_end); - etdev_err(etdev, "Carveout: %pap - %pap\n", &carveout_start, - &carveout_end); - ret = -ERANGE; - goto out_free_gsa; - } - - /* Reset KCI mailbox before starting f/w, don't process anything old.*/ - edgetpu_mailbox_reset(etdev->kci->mailbox); - - tpu_state = gsa_send_tpu_cmd(abpdev->gsa_dev, GSA_TPU_START); - - if (tpu_state < 0) { - etdev_err(etdev, "GSA start firmware failed: %d\n", tpu_state); - ret = -EIO; - } - -out_free_gsa: - dma_free_coherent(abpdev->gsa_dev, MOBILE_FW_HEADER_SIZE, - header_vaddr, header_dma_addr); -out_unmap: - memunmap(image_vaddr); - return ret; -} - -static const struct edgetpu_firmware_handlers abrolhos_firmware_handlers = { - .alloc_buffer = abrolhos_firmware_alloc_buffer, - .free_buffer = abrolhos_firmware_free_buffer, - .setup_buffer = abrolhos_firmware_setup_buffer, - .teardown_buffer = abrolhos_firmware_teardown_buffer, - .prepare_run = abrolhos_firmware_prepare_run, - .restart = abrolhos_firmware_restart, -}; - -int mobile_edgetpu_firmware_create(struct edgetpu_dev *etdev) -{ - return edgetpu_firmware_create(etdev, &abrolhos_firmware_handlers); -} - -void mobile_edgetpu_firmware_destroy(struct edgetpu_dev *etdev) -{ - edgetpu_firmware_destroy(etdev); -} - -int edgetpu_chip_firmware_run(struct edgetpu_dev *etdev, const char *name, - enum edgetpu_firmware_flags flags) -{ - return edgetpu_firmware_run(etdev, name, flags); -} - -unsigned long edgetpu_chip_firmware_iova(struct edgetpu_dev *etdev) -{ - /* - * There is no IOVA in Abrolhos, since firmware the IOMMU is - * bypassed and the only translation in effect is the one - * done by instruction remap registers - */ - return EDGETPU_INSTRUCTION_REMAP_BASE; -} diff --git a/drivers/edgetpu/abrolhos-firmware.h b/drivers/edgetpu/abrolhos-firmware.h deleted file mode 100644 index 8e7db77..0000000 --- a/drivers/edgetpu/abrolhos-firmware.h +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Implements utilities for firmware management of Abrolhos. - * - * Copyright (C) 2020 Google, Inc. - */ -#ifndef __ABROLHOS_FIRMWARE_H__ -#define __ABROLHOS_FIRMWARE_H__ - -#include <linux/sizes.h> - -#include "edgetpu-internal.h" -#include "edgetpu.h" - -/* abrolhos FW header size */ -#define ABROLHOS_FW_HEADER_SIZE SZ_4K -/* The offset to the signed firmware header. */ -#define ABROLHOS_HEADER_OFFSET 0x400 -/* The offset to image configuration. */ -#define ABROLHOS_IMAGE_CONFIG_OFFSET (ABROLHOS_HEADER_OFFSET + 0x160) - -/* - * The image configuration attached to the signed firmware. - */ -struct abrolhos_image_config { - __u32 carveout_base; - __u32 firmware_base; - __u32 firmware_size; - struct edgetpu_fw_version firmware_versions; -} __packed; - -/* - * Abrolhos firmware header. - */ -struct abrolhos_image_header { - char sig[512]; - char pub[512]; - int Magic; - int Generation; - int RollbackInfo; - int Length; - char Flags[16]; - char BodyHash[32]; - char ChipId[32]; - char AuthConfig[256]; - struct abrolhos_image_config ImageConfig; -}; - -int abrolhos_edgetpu_firmware_create(struct edgetpu_dev *etdev); -void abrolhos_edgetpu_firmware_destroy(struct edgetpu_dev *etdev); - -int abrolhos_edgetpu_firmware_run_default(struct edgetpu_dev *etdev); - -#endif /* __ABROLHOS_FIRMWARE_H__ */ diff --git a/drivers/edgetpu/abrolhos-fs.c b/drivers/edgetpu/abrolhos-fs.c deleted file mode 100644 index 5babc06..0000000 --- a/drivers/edgetpu/abrolhos-fs.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-fs.c" diff --git a/drivers/edgetpu/abrolhos-iommu.c b/drivers/edgetpu/abrolhos-iommu.c deleted file mode 100644 index 52ce973..0000000 --- a/drivers/edgetpu/abrolhos-iommu.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-google-iommu.c" diff --git a/drivers/edgetpu/abrolhos-platform.c b/drivers/edgetpu/abrolhos-platform.c deleted file mode 100644 index 2661853..0000000 --- a/drivers/edgetpu/abrolhos-platform.c +++ /dev/null @@ -1,423 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Abrolhos device driver for the Google EdgeTPU ML accelerator. - * - * Copyright (C) 2019 Google, Inc. - */ - -#include <linux/device.h> -#include <linux/dma-mapping.h> -#include <linux/gsa/gsa_tpu.h> -#include <linux/init.h> -#include <linux/io.h> -#include <linux/iommu.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_platform.h> -#include <linux/platform_data/sscoredump.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/types.h> - -#include "abrolhos-platform.h" -#include "abrolhos-pm.h" -#include "edgetpu-config.h" -#include "edgetpu-firmware.h" -#include "edgetpu-internal.h" -#include "edgetpu-iremap-pool.h" -#include "edgetpu-mmu.h" -#include "edgetpu-pm.h" -#include "edgetpu-telemetry.h" -#include "mobile-firmware.h" - -static const struct of_device_id edgetpu_of_match[] = { - { .compatible = "google,darwinn", }, - { /* end of list */ }, -}; -MODULE_DEVICE_TABLE(of, edgetpu_of_match); - -static void sscd_release(struct device *dev) -{ - pr_debug(DRIVER_NAME " release\n"); -} -static struct sscd_platform_data sscd_pdata; -static struct platform_device sscd_dev = { - .name = DRIVER_NAME, - .driver_override = SSCD_NAME, - .id = -1, - .dev = { - .platform_data = &sscd_pdata, - .release = sscd_release, - }, -}; -/* - * Log and trace buffers at the beginning of the remapped region, - * pool memory afterwards. - */ - -#define EDGETPU_POOL_MEM_OFFSET (EDGETPU_TELEMETRY_BUFFER_SIZE * 2) - -static void abrolhos_get_telemetry_mem(struct abrolhos_platform_dev *etpdev, - enum edgetpu_telemetry_type type, - struct edgetpu_coherent_mem *mem) -{ - int offset = type == EDGETPU_TELEMETRY_TRACE ? - EDGETPU_TELEMETRY_BUFFER_SIZE : - 0; - mem->vaddr = etpdev->shared_mem_vaddr + offset; - mem->dma_addr = EDGETPU_REMAPPED_DATA_ADDR + offset; - mem->tpu_addr = EDGETPU_REMAPPED_DATA_ADDR + offset; - mem->host_addr = 0; - mem->size = EDGETPU_TELEMETRY_BUFFER_SIZE; -} - -/* Setup the firmware region carveout. */ -static int -edgetpu_platform_setup_fw_region(struct abrolhos_platform_dev *etpdev) -{ - struct edgetpu_dev *etdev = &etpdev->edgetpu_dev; - struct platform_device *gsa_pdev; - struct device *dev = etdev->dev; - struct resource r; - struct device_node *np; - int err; - u32 csr_phys, csr_iova, csr_size; - size_t region_map_size = - EDGETPU_FW_SIZE_MAX + EDGETPU_REMAPPED_DATA_SIZE; - - np = of_parse_phandle(dev->of_node, "memory-region", 0); - if (!np) { - dev_err(dev, "No memory region for firmware\n"); - return -ENODEV; - } - - err = of_address_to_resource(np, 0, &r); - of_node_put(np); - if (err) { - dev_err(dev, "No memory address assigned to firmware region\n"); - return err; - } - - if (resource_size(&r) < region_map_size) { - dev_err(dev, - "Memory region for firmware too small (%zu bytes needed, got %llu)\n", - region_map_size, resource_size(&r)); - return -ENOSPC; - } - - /* Get GSA device from device tree */ - np = of_parse_phandle(dev->of_node, "gsa-device", 0); - if (!np) { - dev_err(dev, "No gsa-dev in device tree\n"); - return -ENODEV; - } - gsa_pdev = of_find_device_by_node(np); - if (!gsa_pdev) { - dev_err(dev, "GSA device not found\n"); - of_node_put(np); - return -ENODEV; - } - etpdev->gsa_dev = &gsa_pdev->dev; - of_node_put(np); - - etpdev->fw_region_paddr = r.start; - etpdev->fw_region_size = EDGETPU_FW_SIZE_MAX; - - etpdev->shared_mem_vaddr = - memremap(r.start + EDGETPU_REMAPPED_DATA_OFFSET, - EDGETPU_REMAPPED_DATA_SIZE, MEMREMAP_WC); - if (!etpdev->shared_mem_vaddr) { - dev_err(dev, "Shared memory remap failed\n"); - return -EINVAL; - } - etpdev->shared_mem_paddr = r.start + EDGETPU_REMAPPED_DATA_OFFSET; - - err = of_property_read_u32(dev->of_node, "csr-iova", &csr_iova); - /* Device did not define a CSR region */ - if (err) - return 0; - - /* If an IOVA was found, we must also have physical address and size */ - err = of_property_read_u32(dev->of_node, "csr-phys", &csr_phys); - if (err) { - dev_err(dev, "Device tree: invalid CSR physical address\n"); - goto out_unmap; - } - - err = of_property_read_u32(dev->of_node, "csr-size", &csr_size); - if (err) { - dev_err(dev, "Device tree: invalid CSR size\n"); - goto out_unmap; - } - - etpdev->csr_paddr = csr_phys; - etpdev->csr_iova = csr_iova; - etpdev->csr_size = csr_size; - return 0; -out_unmap: - memunmap(etpdev->shared_mem_vaddr); - etpdev->shared_mem_vaddr = NULL; - return err; -} - -static void edgetpu_platform_cleanup_fw_region( - struct abrolhos_platform_dev *etpdev) -{ - gsa_unload_tpu_fw_image(etpdev->gsa_dev); - - if (!etpdev->shared_mem_vaddr) - return; - memunmap(etpdev->shared_mem_vaddr); - etpdev->shared_mem_vaddr = NULL; -} - -int edgetpu_setup_mmu(struct edgetpu_dev *etdev) -{ - int ret; - - /* No MMU info to pass to attach, IOMMU API will handle. */ - ret = edgetpu_mmu_attach(etdev, NULL); - if (ret) - dev_err(etdev->dev, "failed to attach IOMMU: %d\n", ret); - return ret; -} - -static int abrolhos_parse_ssmt(struct abrolhos_platform_dev *etpdev) -{ - struct edgetpu_dev *etdev = &etpdev->edgetpu_dev; - struct platform_device *pdev = to_platform_device(etdev->dev); - struct resource *res; - int rc; - void __iomem *ssmt_base; - - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ssmt"); - if (!res) { - etdev_warn(etdev, "Failed to find SSMT register base"); - return -EINVAL; - } - ssmt_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(ssmt_base)) { - rc = PTR_ERR(ssmt_base); - etdev_warn(etdev, "Failed to map SSMT register base: %d\n", rc); - return rc; - } - etpdev->ssmt_base = ssmt_base; - return 0; -} - -static int edgetpu_platform_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct abrolhos_platform_dev *abpdev; - struct resource *r; - struct edgetpu_mapped_resource regs; - int ret; - - abpdev = devm_kzalloc(dev, sizeof(*abpdev), GFP_KERNEL); - if (!abpdev) - return -ENOMEM; - - platform_set_drvdata(pdev, &abpdev->edgetpu_dev); - abpdev->edgetpu_dev.dev = dev; - - r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (IS_ERR_OR_NULL(r)) { - dev_err(dev, "failed to get memory resource\n"); - return -ENODEV; - } - regs.phys = r->start; - regs.size = resource_size(r); - - regs.mem = devm_ioremap_resource(dev, r); - if (IS_ERR_OR_NULL(regs.mem)) { - dev_err(dev, "failed to map registers\n"); - return -ENODEV; - } - - mutex_init(&abpdev->platform_pwr.policy_lock); - abpdev->platform_pwr.curr_policy = TPU_POLICY_MAX; - - ret = abrolhos_pm_create(&abpdev->edgetpu_dev); - - if (ret) { - dev_err(dev, "Failed to initialize PM interface (%d)\n", ret); - return ret; - } - - ret = edgetpu_platform_setup_fw_region(abpdev); - if (ret) { - dev_err(dev, "%s setup fw regions failed: %d\n", DRIVER_NAME, - ret); - goto out_shutdown; - } - - ret = edgetpu_iremap_pool_create( - &abpdev->edgetpu_dev, - /* Base virtual address (kernel address space) */ - abpdev->shared_mem_vaddr + EDGETPU_POOL_MEM_OFFSET, - /* Base DMA address */ - EDGETPU_REMAPPED_DATA_ADDR + EDGETPU_POOL_MEM_OFFSET, - /* Base TPU address */ - EDGETPU_REMAPPED_DATA_ADDR + EDGETPU_POOL_MEM_OFFSET, - /* Base physical address */ - abpdev->shared_mem_paddr + EDGETPU_POOL_MEM_OFFSET, - /* Size */ - EDGETPU_REMAPPED_DATA_SIZE - EDGETPU_POOL_MEM_OFFSET, - /* Granularity */ - PAGE_SIZE); - if (ret) { - dev_err(dev, - "%s failed to initialize remapped memory pool: %d\n", - DRIVER_NAME, ret); - goto out_cleanup_fw; - } - - abpdev->edgetpu_dev.mcp_id = -1; - abpdev->edgetpu_dev.mcp_die_index = 0; - abpdev->irq = platform_get_irq(pdev, 0); - ret = edgetpu_device_add(&abpdev->edgetpu_dev, ®s); - - if (!ret && abpdev->irq >= 0) - ret = edgetpu_register_irq(&abpdev->edgetpu_dev, abpdev->irq); - - if (ret) { - dev_err(dev, "%s edgetpu setup failed: %d\n", DRIVER_NAME, - ret); - goto out_destroy_iremap; - } - - ret = abrolhos_parse_ssmt(abpdev); - if (ret) - dev_warn( - dev, - "SSMT setup failed (%d). Context isolation not enforced\n", - ret); - - abrolhos_get_telemetry_mem(abpdev, EDGETPU_TELEMETRY_LOG, - &abpdev->log_mem); - abrolhos_get_telemetry_mem(abpdev, EDGETPU_TELEMETRY_TRACE, - &abpdev->trace_mem); - - ret = edgetpu_telemetry_init(&abpdev->edgetpu_dev, &abpdev->log_mem, - &abpdev->trace_mem); - if (ret) - goto out_remove_device; - - ret = mobile_edgetpu_firmware_create(&abpdev->edgetpu_dev); - if (ret) { - dev_err(dev, - "%s initialize firmware downloader failed: %d\n", - DRIVER_NAME, ret); - goto out_tel_exit; - } - - dev_dbg(dev, "Creating thermal device\n"); - abpdev->edgetpu_dev.thermal = devm_tpu_thermal_create(dev); - - dev_info(dev, "%s edgetpu initialized. Build: %s\n", - abpdev->edgetpu_dev.dev_name, GIT_REPO_TAG); - - dev_dbg(dev, "Probe finished, powering down\n"); - /* Turn the device off unless a client request is already received. */ - edgetpu_pm_shutdown(&abpdev->edgetpu_dev, false); - - abpdev->sscd_info.pdata = &sscd_pdata; - abpdev->sscd_info.dev = &sscd_dev; - - return ret; -out_tel_exit: - edgetpu_telemetry_exit(&abpdev->edgetpu_dev); -out_remove_device: - edgetpu_device_remove(&abpdev->edgetpu_dev); -out_destroy_iremap: - edgetpu_iremap_pool_destroy(&abpdev->edgetpu_dev); -out_cleanup_fw: - edgetpu_platform_cleanup_fw_region(abpdev); -out_shutdown: - dev_dbg(dev, "Probe finished with error %d, powering down\n", ret); - edgetpu_pm_shutdown(&abpdev->edgetpu_dev, true); - return ret; -} - -static int edgetpu_platform_remove(struct platform_device *pdev) -{ - struct edgetpu_dev *etdev = platform_get_drvdata(pdev); - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - - mobile_edgetpu_firmware_destroy(etdev); - if (abpdev->irq >= 0) - edgetpu_unregister_irq(etdev, abpdev->irq); - - edgetpu_pm_get(etdev->pm); - edgetpu_telemetry_exit(etdev); - edgetpu_device_remove(etdev); - edgetpu_iremap_pool_destroy(etdev); - edgetpu_platform_cleanup_fw_region(abpdev); - edgetpu_pm_put(etdev->pm); - edgetpu_pm_shutdown(etdev, true); - abrolhos_pm_destroy(etdev); - return 0; -} - -#if IS_ENABLED(CONFIG_PM_SLEEP) - -static int edgetpu_platform_suspend(struct device *dev) -{ - struct edgetpu_dev *etdev = dev_get_drvdata(dev); - - return edgetpu_pm_suspend(etdev); -} - -static int edgetpu_platform_resume(struct device *dev) -{ - struct edgetpu_dev *etdev = dev_get_drvdata(dev); - - return edgetpu_pm_resume(etdev); -} - -#endif /* IS_ENABLED(CONFIG_PM_SLEEP) */ - -static const struct dev_pm_ops edgetpu_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(edgetpu_platform_suspend, - edgetpu_platform_resume) -}; - -static struct platform_driver edgetpu_platform_driver = { - .probe = edgetpu_platform_probe, - .remove = edgetpu_platform_remove, - .driver = { - .name = "edgetpu_platform", - .of_match_table = edgetpu_of_match, - .pm = &edgetpu_pm_ops, - }, -}; - -static int __init edgetpu_platform_init(void) -{ - int ret; - - ret = edgetpu_init(); - if (ret) - return ret; - - /* Register SSCD platform device */ - ret = platform_device_register(&sscd_dev); - if (ret) - pr_err(DRIVER_NAME " SSCD platform device registration failed: %d\n", - ret); - return platform_driver_register(&edgetpu_platform_driver); -} - -static void __exit edgetpu_platform_exit(void) -{ - platform_driver_unregister(&edgetpu_platform_driver); - platform_device_unregister(&sscd_dev); - edgetpu_exit(); -} - -MODULE_DESCRIPTION("Google EdgeTPU platform driver"); -MODULE_LICENSE("GPL v2"); -module_init(edgetpu_platform_init); -module_exit(edgetpu_platform_exit); -MODULE_FIRMWARE(EDGETPU_DEFAULT_FIRMWARE_NAME); diff --git a/drivers/edgetpu/abrolhos-platform.h b/drivers/edgetpu/abrolhos-platform.h deleted file mode 100644 index 84e155e..0000000 --- a/drivers/edgetpu/abrolhos-platform.h +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Abrolhos device driver for the Google EdgeTPU ML accelerator. - * - * Copyright (C) 2019 Google, Inc. - */ -#ifndef __ABROLHOS_PLATFORM_H__ -#define __ABROLHOS_PLATFORM_H__ - -#include <linux/device.h> -#include <linux/io.h> -#include <linux/kernel.h> -#include <linux/mutex.h> -#include <linux/types.h> -#include <soc/google/bcl.h> -#include <soc/google/bts.h> -#include <soc/google/exynos_pm_qos.h> - -#include "abrolhos-debug-dump.h" -#include "abrolhos-pm.h" -#include "edgetpu-internal.h" - -#define to_abrolhos_dev(etdev) \ - container_of(etdev, struct abrolhos_platform_dev, edgetpu_dev) - -struct abrolhos_platform_pwr { - struct mutex policy_lock; - enum tpu_pwr_state curr_policy; - struct mutex state_lock; - u64 min_state; - u64 requested_state; - /* INT/MIF requests for memory bandwidth */ - struct exynos_pm_qos_request int_min; - struct exynos_pm_qos_request mif_min; - /* BTS */ - unsigned int performance_scenario; - int scenario_count; - struct mutex scenario_lock; -}; - -struct abrolhos_platform_dev { - struct edgetpu_dev edgetpu_dev; - struct abrolhos_platform_pwr platform_pwr; - int irq; - phys_addr_t fw_region_paddr; - size_t fw_region_size; - void *shared_mem_vaddr; - phys_addr_t shared_mem_paddr; - size_t shared_mem_size; - phys_addr_t csr_paddr; - dma_addr_t csr_iova; - size_t csr_size; - struct device *gsa_dev; - void __iomem *ssmt_base; - struct edgetpu_coherent_mem log_mem; - struct edgetpu_coherent_mem trace_mem; - struct abrolhos_sscd_info sscd_info; - struct gs101_bcl_dev *bcl_dev; -}; - -#endif /* __ABROLHOS_PLATFORM_H__ */ diff --git a/drivers/edgetpu/abrolhos-pm.c b/drivers/edgetpu/abrolhos-pm.c deleted file mode 100644 index 0562f30..0000000 --- a/drivers/edgetpu/abrolhos-pm.c +++ /dev/null @@ -1,794 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Abrolhos EdgeTPU power management support - * - * Copyright (C) 2020 Google, Inc. - */ - -#include <linux/atomic.h> -#include <linux/delay.h> -#include <linux/gsa/gsa_tpu.h> -#include <linux/module.h> -#include <linux/pm_runtime.h> -#include <soc/google/bcl.h> -#include <soc/google/bts.h> -#include <soc/google/exynos_pm_qos.h> - -#include "abrolhos-platform.h" -#include "abrolhos-pm.h" -#include "edgetpu-config.h" -#include "edgetpu-firmware.h" -#include "edgetpu-internal.h" -#include "edgetpu-kci.h" -#include "edgetpu-mailbox.h" -#include "edgetpu-pm.h" -#include "edgetpu-telemetry.h" - -#include "edgetpu-pm.c" - -/* - * Encode INT/MIF values as a 16 bit pair in the 32-bit return value - * (in units of MHz, to provide enough range) - */ -#define PM_QOS_INT_SHIFT (16) -#define PM_QOS_MIF_MASK (0xFFFF) -#define PM_QOS_FACTOR (1000) - -/* Default power state: the lowest power state that keeps firmware running */ -static int power_state = TPU_DEEP_SLEEP_CLOCKS_SLOW; - -module_param(power_state, int, 0660); - -#define MAX_VOLTAGE_VAL 1250000 - -static struct dentry *abrolhos_pwr_debugfs_dir; - -static int abrolhos_pwr_state_init(struct device *dev) -{ - int ret; - int curr_state; - - pm_runtime_enable(dev); - curr_state = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); - - if (curr_state > TPU_OFF) { - ret = pm_runtime_get_sync(dev); - if (ret) { - dev_err(dev, "pm_runtime_get_sync returned %d\n", ret); - return ret; - } - } - - ret = exynos_acpm_set_init_freq(TPU_ACPM_DOMAIN, curr_state); - if (ret) { - dev_err(dev, "error initializing tpu state: %d\n", ret); - if (curr_state > TPU_OFF) - pm_runtime_put_sync(dev); - return ret; - } - - return ret; -} - -static int abrolhos_pwr_state_set_locked(void *data, u64 val) -{ - int ret; - int curr_state; - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct device *dev = etdev->dev; - - curr_state = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); - - dev_dbg(dev, "Power state %d -> %llu\n", curr_state, val); - - if (curr_state == TPU_OFF && val > TPU_OFF) { - ret = pm_runtime_get_sync(dev); - if (ret) { - dev_err(dev, "pm_runtime_get_sync returned %d\n", ret); - return ret; - } - } - - ret = exynos_acpm_set_rate(TPU_ACPM_DOMAIN, (unsigned long)val); - if (ret) { - dev_err(dev, "error setting tpu state: %d\n", ret); - pm_runtime_put_sync(dev); - return ret; - } - - if (curr_state != TPU_OFF && val == TPU_OFF) { - ret = pm_runtime_put_sync(dev); - if (ret) { - dev_err(dev, "%s: pm_runtime_put_sync returned %d\n", - __func__, ret); - return ret; - } - } - - return ret; -} - -static int abrolhos_pwr_state_get_locked(void *data, u64 *val) -{ - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct device *dev = etdev->dev; - - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); - dev_dbg(dev, "current tpu state: %llu\n", *val); - - return 0; -} - -static int abrolhos_pwr_state_set(void *data, u64 val) -{ - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int ret = 0; - - mutex_lock(&platform_pwr->state_lock); - platform_pwr->requested_state = val; - if (val >= platform_pwr->min_state) - ret = abrolhos_pwr_state_set_locked(etdev, val); - mutex_unlock(&platform_pwr->state_lock); - return ret; -} - -static int abrolhos_pwr_state_get(void *data, u64 *val) -{ - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int ret; - - mutex_lock(&platform_pwr->state_lock); - ret = abrolhos_pwr_state_get_locked(etdev, val); - mutex_unlock(&platform_pwr->state_lock); - return ret; -} - -static int abrolhos_min_pwr_state_set(void *data, u64 val) -{ - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int ret = 0; - - mutex_lock(&platform_pwr->state_lock); - platform_pwr->min_state = val; - if (val >= platform_pwr->requested_state) - ret = abrolhos_pwr_state_set_locked(etdev, val); - mutex_unlock(&platform_pwr->state_lock); - return ret; -} - -static int abrolhos_min_pwr_state_get(void *data, u64 *val) -{ - struct edgetpu_dev *etdev = (typeof(etdev))data; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - - mutex_lock(&platform_pwr->state_lock); - *val = platform_pwr->min_state; - mutex_unlock(&platform_pwr->state_lock); - return 0; -} - -static int abrolhos_pwr_policy_set(void *data, u64 val) -{ - struct abrolhos_platform_dev *abpdev = (typeof(abpdev))data; - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int ret; - - mutex_lock(&platform_pwr->policy_lock); - ret = exynos_acpm_set_policy(TPU_ACPM_DOMAIN, val); - - if (ret) { - dev_err(abpdev->edgetpu_dev.dev, - "unable to set policy %lld (ret %d)\n", val, ret); - mutex_unlock(&platform_pwr->policy_lock); - return ret; - } - - platform_pwr->curr_policy = val; - mutex_unlock(&platform_pwr->policy_lock); - return 0; -} - -static int abrolhos_pwr_policy_get(void *data, u64 *val) -{ - struct abrolhos_platform_dev *abpdev = (typeof(abpdev))data; - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - - mutex_lock(&platform_pwr->policy_lock); - *val = platform_pwr->curr_policy; - mutex_unlock(&platform_pwr->policy_lock); - - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_pwr_policy, abrolhos_pwr_policy_get, - abrolhos_pwr_policy_set, "%llu\n"); - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_pwr_state, abrolhos_pwr_state_get, - abrolhos_pwr_state_set, "%llu\n"); - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_min_pwr_state, abrolhos_min_pwr_state_get, - abrolhos_min_pwr_state_set, "%llu\n"); - -static int edgetpu_core_rate_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CLK_CORE_DEBUG); - return 0; -} - -static int edgetpu_core_rate_set(void *data, u64 val) -{ - unsigned long dbg_rate_req; - - dbg_rate_req = TPU_DEBUG_REQ | TPU_CLK_CORE_DEBUG; - dbg_rate_req |= val; - - return exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_core_rate, edgetpu_core_rate_get, - edgetpu_core_rate_set, "%llu\n"); - -static int edgetpu_ctl_rate_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CLK_CTL_DEBUG); - return 0; -} - -static int edgetpu_ctl_rate_set(void *data, u64 val) -{ - unsigned long dbg_rate_req; - - dbg_rate_req = TPU_DEBUG_REQ | TPU_CLK_CTL_DEBUG; - dbg_rate_req |= 1000; - - return exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_ctl_rate, edgetpu_ctl_rate_get, - edgetpu_ctl_rate_set, "%llu\n"); - -static int edgetpu_axi_rate_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CLK_AXI_DEBUG); - return 0; -} - -static int edgetpu_axi_rate_set(void *data, u64 val) -{ - unsigned long dbg_rate_req; - - dbg_rate_req = TPU_DEBUG_REQ | TPU_CLK_AXI_DEBUG; - dbg_rate_req |= 1000; - - return exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_axi_rate, edgetpu_axi_rate_get, - edgetpu_axi_rate_set, "%llu\n"); - -static int edgetpu_apb_rate_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CLK_APB_DEBUG); - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_apb_rate, edgetpu_apb_rate_get, NULL, - "%llu\n"); - -static int edgetpu_uart_rate_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CLK_UART_DEBUG); - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_uart_rate, edgetpu_uart_rate_get, NULL, - "%llu\n"); - -static int edgetpu_vdd_int_m_set(void *data, u64 val) -{ - struct device *dev = (struct device *)data; - unsigned long dbg_rate_req; - - if (val > MAX_VOLTAGE_VAL) { - dev_err(dev, "Preventing INT_M voltage > %duV", - MAX_VOLTAGE_VAL); - return -EINVAL; - } - - dbg_rate_req = TPU_DEBUG_REQ | TPU_VDD_INT_M_DEBUG; - dbg_rate_req |= val; - - return exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); -} - -static int edgetpu_vdd_int_m_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_VDD_INT_M_DEBUG); - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_vdd_int_m, edgetpu_vdd_int_m_get, - edgetpu_vdd_int_m_set, "%llu\n"); - -static int edgetpu_vdd_tpu_set(void *data, u64 val) -{ - int ret; - struct device *dev = (struct device *)data; - unsigned long dbg_rate_req; - - if (val > MAX_VOLTAGE_VAL) { - dev_err(dev, "Preventing VDD_TPU voltage > %duV", - MAX_VOLTAGE_VAL); - return -EINVAL; - } - - dbg_rate_req = TPU_DEBUG_REQ | TPU_VDD_TPU_DEBUG; - dbg_rate_req |= val; - - ret = exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); - return ret; -} - -static int edgetpu_vdd_tpu_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_VDD_TPU_DEBUG); - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_vdd_tpu, edgetpu_vdd_tpu_get, - edgetpu_vdd_tpu_set, "%llu\n"); - -static int edgetpu_vdd_tpu_m_set(void *data, u64 val) -{ - int ret; - struct device *dev = (struct device *)data; - unsigned long dbg_rate_req; - - if (val > MAX_VOLTAGE_VAL) { - dev_err(dev, "Preventing VDD_TPU voltage > %duV", - MAX_VOLTAGE_VAL); - return -EINVAL; - } - - dbg_rate_req = TPU_DEBUG_REQ | TPU_VDD_TPU_M_DEBUG; - dbg_rate_req |= val; - - ret = exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); - return ret; -} - -static int edgetpu_vdd_tpu_m_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_VDD_TPU_M_DEBUG); - return 0; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_vdd_tpu_m, edgetpu_vdd_tpu_m_get, - edgetpu_vdd_tpu_m_set, "%llu\n"); - -static int abrolhos_core_pwr_get(void *data, u64 *val) -{ - *val = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, - TPU_DEBUG_REQ | TPU_CORE_PWR_DEBUG); - return 0; -} - -static int abrolhos_core_pwr_set(void *data, u64 val) -{ - int ret; - unsigned long dbg_rate_req; - - dbg_rate_req = TPU_DEBUG_REQ | TPU_CORE_PWR_DEBUG; - dbg_rate_req |= val; - - ret = exynos_acpm_set_rate(TPU_ACPM_DOMAIN, dbg_rate_req); - return ret; -} - -DEFINE_DEBUGFS_ATTRIBUTE(fops_tpu_core_pwr, abrolhos_core_pwr_get, - abrolhos_core_pwr_set, "%llu\n"); - -static int abrolhos_get_initial_pwr_state(struct device *dev) -{ - switch (power_state) { - case TPU_DEEP_SLEEP_CLOCKS_SLOW: - case TPU_DEEP_SLEEP_CLOCKS_FAST: - case TPU_RETENTION_CLOCKS_SLOW: - case TPU_ACTIVE_SUD: - case TPU_ACTIVE_UD: - case TPU_ACTIVE_NOM: - case TPU_ACTIVE_OD: - dev_info(dev, "Initial power state: %d\n", power_state); - break; - case TPU_OFF: - case TPU_DEEP_SLEEP_CLOCKS_OFF: - case TPU_SLEEP_CLOCKS_OFF: - dev_warn(dev, "Power state %d prevents control core booting", - power_state); - /* fall-thru */ - default: - dev_warn(dev, "Power state %d is invalid\n", power_state); - dev_warn(dev, "defaulting to active nominal\n"); - power_state = TPU_ACTIVE_NOM; - break; - } - return power_state; -} - -static void abrolhos_power_down(struct edgetpu_pm *etpm); - -static int abrolhos_power_up(struct edgetpu_pm *etpm) -{ - struct edgetpu_dev *etdev = etpm->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - int ret = abrolhos_pwr_state_set( - etpm->etdev, abrolhos_get_initial_pwr_state(etdev->dev)); - enum edgetpu_firmware_status firmware_status; - - etdev_info(etpm->etdev, "Powering up\n"); - - if (ret) - return ret; - - /* Clear out log / trace buffers */ - memset(abpdev->log_mem.vaddr, 0, EDGETPU_TELEMETRY_BUFFER_SIZE); -#if IS_ENABLED(CONFIG_EDGETPU_TELEMETRY_TRACE) - memset(abpdev->trace_mem.vaddr, 0, EDGETPU_TELEMETRY_BUFFER_SIZE); -#endif - - edgetpu_chip_init(etdev); - - if (etdev->kci) { - etdev_dbg(etdev, "Resetting KCI\n"); - edgetpu_kci_reinit(etdev->kci); - } - if (etdev->mailbox_manager) { - etdev_dbg(etdev, "Resetting VII mailboxes\n"); - edgetpu_mailbox_reset_vii(etdev->mailbox_manager); - } - - if (!etdev->firmware) - return 0; - - firmware_status = edgetpu_firmware_status_locked(etdev); - if (firmware_status == FW_LOADING) - return 0; - - /* attempt firmware run */ - mutex_lock(&etdev->state_lock); - if (etdev->state == ETDEV_STATE_FWLOADING) { - mutex_unlock(&etdev->state_lock); - return -EAGAIN; - } - etdev->state = ETDEV_STATE_FWLOADING; - mutex_unlock(&etdev->state_lock); - switch (firmware_status) { - case FW_VALID: - ret = edgetpu_firmware_restart_locked(etdev); - break; - case FW_INVALID: - ret = edgetpu_firmware_run_locked(etdev->firmware, - EDGETPU_DEFAULT_FIRMWARE_NAME, - FW_DEFAULT); - break; - default: - break; - } - mutex_lock(&etdev->state_lock); - if (ret == -EIO) - etdev->state = ETDEV_STATE_BAD; /* f/w handshake error */ - else if (ret) - etdev->state = ETDEV_STATE_NOFW; /* other errors */ - else - etdev->state = ETDEV_STATE_GOOD; /* f/w handshake success */ - mutex_unlock(&etdev->state_lock); - - if (ret) { - abrolhos_power_down(etpm); - } else { - if (!abpdev->bcl_dev) - abpdev->bcl_dev = gs101_retrieve_bcl_handle(); - if (abpdev->bcl_dev) - gs101_init_tpu_ratio(abpdev->bcl_dev); - } - - return ret; -} - -static void -abrolhos_pm_shutdown_firmware(struct abrolhos_platform_dev *etpdev, - struct edgetpu_dev *etdev, - struct abrolhos_platform_dev *abpdev) -{ - if (!edgetpu_pchannel_power_down(etdev, false)) - return; - - etdev_warn(etdev, "Firmware shutdown request failed!\n"); - etdev_warn(etdev, "Attempting firmware restart\n"); - - if (!edgetpu_firmware_restart_locked(etdev) && - !edgetpu_pchannel_power_down(etdev, false)) - return; - - edgetpu_kci_cancel_work_queues(etdev->kci); - etdev_warn(etdev, "Forcing shutdown through power policy\n"); - /* Request GSA shutdown to make sure the R52 core is reset */ - gsa_send_tpu_cmd(etpdev->gsa_dev, GSA_TPU_SHUTDOWN); - abrolhos_pwr_policy_set(abpdev, TPU_OFF); - pm_runtime_put_sync(etdev->dev); - /* - * TODO: experiment on hardware to verify if this delay - * is needed, what is a good value or an alternative way - * to make sure the power policy request turned the - * device off. - */ - msleep(100); - pm_runtime_get_sync(etdev->dev); - abrolhos_pwr_policy_set(abpdev, TPU_ACTIVE_OD); -} - -static void abrolhos_pm_cleanup_bts_scenario(struct edgetpu_dev *etdev) -{ - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int performance_scenario = platform_pwr->performance_scenario; - - if (!performance_scenario) - return; - - mutex_lock(&platform_pwr->scenario_lock); - while (platform_pwr->scenario_count) { - int ret = bts_del_scenario(performance_scenario); - - if (ret) { - platform_pwr->scenario_count = 0; - etdev_warn_once( - etdev, - "error %d in cleaning up BTS scenario %u\n", - ret, performance_scenario); - break; - } - platform_pwr->scenario_count--; - } - mutex_unlock(&platform_pwr->scenario_lock); -} - -static void abrolhos_power_down(struct edgetpu_pm *etpm) -{ - struct edgetpu_dev *etdev = etpm->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - u64 val; - int res; - int min_state = platform_pwr->min_state; - - etdev_info(etdev, "Powering down\n"); - - if (min_state >= TPU_DEEP_SLEEP_CLOCKS_SLOW) { - etdev_info(etdev, "Power down skipped due to min state = %d\n", - min_state); - return; - } - - if (abrolhos_pwr_state_get(etdev, &val)) { - etdev_warn(etdev, "Failed to read current power state\n"); - val = TPU_ACTIVE_NOM; - } - if (val == TPU_OFF) { - etdev_dbg(etdev, "Device already off, skipping shutdown\n"); - return; - } - - if (etdev->kci && edgetpu_firmware_status_locked(etdev) == FW_VALID) { - /* Update usage stats before we power off fw. */ - edgetpu_kci_update_usage_locked(etdev); - abrolhos_pm_shutdown_firmware(abpdev, etdev, abpdev); - edgetpu_kci_cancel_work_queues(etdev->kci); - } - - res = gsa_send_tpu_cmd(abpdev->gsa_dev, GSA_TPU_SHUTDOWN); - if (res < 0) - etdev_warn(etdev, "GSA shutdown request failed (%d)\n", res); - abrolhos_pwr_state_set(etdev, TPU_OFF); - - /* Remove our vote for INT/MIF state (if any) */ - exynos_pm_qos_update_request(&platform_pwr->int_min, 0); - exynos_pm_qos_update_request(&platform_pwr->mif_min, 0); - - abrolhos_pm_cleanup_bts_scenario(etdev); -} - -static int abrolhos_pm_after_create(struct edgetpu_pm *etpm) -{ - int ret; - struct edgetpu_dev *etdev = etpm->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct device *dev = etdev->dev; - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - - ret = abrolhos_pwr_state_init(dev); - if (ret) - return ret; - - mutex_init(&platform_pwr->policy_lock); - mutex_init(&platform_pwr->state_lock); - mutex_init(&platform_pwr->scenario_lock); - - exynos_pm_qos_add_request(&platform_pwr->int_min, - PM_QOS_DEVICE_THROUGHPUT, 0); - exynos_pm_qos_add_request(&platform_pwr->mif_min, PM_QOS_BUS_THROUGHPUT, - 0); - - platform_pwr->performance_scenario = - bts_get_scenindex("tpu_performance"); - if (!platform_pwr->performance_scenario) - etdev_warn(etdev, "tpu_performance BTS scenario not found\n"); - platform_pwr->scenario_count = 0; - - ret = abrolhos_pwr_state_set(etdev, - abrolhos_get_initial_pwr_state(dev)); - if (ret) - return ret; - abrolhos_pwr_debugfs_dir = - debugfs_create_dir("power", edgetpu_fs_debugfs_dir()); - if (!abrolhos_pwr_debugfs_dir) { - etdev_warn(etdev, "Failed to create debug FS power"); - /* don't fail the procedure on debug FS creation fails */ - return 0; - } - debugfs_create_file("state", 0660, abrolhos_pwr_debugfs_dir, etdev, - &fops_tpu_pwr_state); - debugfs_create_file("min_state", 0660, abrolhos_pwr_debugfs_dir, etdev, - &fops_tpu_min_pwr_state); - debugfs_create_file("vdd_tpu", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_vdd_tpu); - debugfs_create_file("vdd_tpu_m", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_vdd_tpu_m); - debugfs_create_file("vdd_int_m", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_vdd_int_m); - debugfs_create_file("core_rate", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_core_rate); - debugfs_create_file("ctl_rate", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_ctl_rate); - debugfs_create_file("axi_rate", 0660, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_axi_rate); - debugfs_create_file("apb_rate", 0440, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_apb_rate); - debugfs_create_file("uart_rate", 0440, abrolhos_pwr_debugfs_dir, dev, - &fops_tpu_uart_rate); - debugfs_create_file("policy", 0660, abrolhos_pwr_debugfs_dir, - abpdev, &fops_tpu_pwr_policy); - debugfs_create_file("core_pwr", 0660, abrolhos_pwr_debugfs_dir, - abpdev, &fops_tpu_core_pwr); - - return 0; -} - -static void abrolhos_pm_before_destroy(struct edgetpu_pm *etpm) -{ - struct edgetpu_dev *etdev = etpm->etdev; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - - debugfs_remove_recursive(abrolhos_pwr_debugfs_dir); - pm_runtime_disable(etpm->etdev->dev); - abrolhos_pm_cleanup_bts_scenario(etdev); - exynos_pm_qos_remove_request(&platform_pwr->int_min); - exynos_pm_qos_remove_request(&platform_pwr->mif_min); -} - -static struct edgetpu_pm_handlers abrolhos_pm_handlers = { - .after_create = abrolhos_pm_after_create, - .before_destroy = abrolhos_pm_before_destroy, - .power_up = abrolhos_power_up, - .power_down = abrolhos_power_down, -}; - -int abrolhos_pm_create(struct edgetpu_dev *etdev) -{ - return edgetpu_pm_create(etdev, &abrolhos_pm_handlers); -} - -void abrolhos_pm_destroy(struct edgetpu_dev *etdev) -{ - edgetpu_pm_destroy(etdev); -} - -void abrolhos_pm_set_pm_qos(struct edgetpu_dev *etdev, u32 pm_qos_val) -{ - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - s32 int_val = (pm_qos_val >> PM_QOS_INT_SHIFT) * PM_QOS_FACTOR; - s32 mif_val = (pm_qos_val & PM_QOS_MIF_MASK) * PM_QOS_FACTOR; - - etdev_dbg(etdev, "%s: pm_qos request - int = %d mif = %d\n", __func__, - int_val, mif_val); - - exynos_pm_qos_update_request(&platform_pwr->int_min, int_val); - exynos_pm_qos_update_request(&platform_pwr->mif_min, mif_val); -} - -static void abrolhos_pm_activate_bts_scenario(struct edgetpu_dev *etdev) -{ - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int performance_scenario = platform_pwr->performance_scenario; - - /* bts_add_scenario() keeps track of reference count internally.*/ - int ret; - - if (!performance_scenario) - return; - mutex_lock(&platform_pwr->scenario_lock); - ret = bts_add_scenario(performance_scenario); - if (ret) - etdev_warn_once(etdev, "error %d adding BTS scenario %u\n", ret, - performance_scenario); - else - platform_pwr->scenario_count++; - - etdev_dbg(etdev, "BTS Scenario activated: %d\n", - platform_pwr->scenario_count); - mutex_unlock(&platform_pwr->scenario_lock); -} - -static void abrolhos_pm_deactivate_bts_scenario(struct edgetpu_dev *etdev) -{ - /* bts_del_scenario() keeps track of reference count internally.*/ - int ret; - struct abrolhos_platform_dev *abpdev = to_abrolhos_dev(etdev); - struct abrolhos_platform_pwr *platform_pwr = &abpdev->platform_pwr; - int performance_scenario = platform_pwr->performance_scenario; - - if (!performance_scenario) - return; - mutex_lock(&platform_pwr->scenario_lock); - if (!platform_pwr->scenario_count) { - etdev_warn(etdev, "Unbalanced bts deactivate\n"); - mutex_unlock(&platform_pwr->scenario_lock); - return; - } - ret = bts_del_scenario(performance_scenario); - if (ret) - etdev_warn_once(etdev, "error %d deleting BTS scenario %u\n", - ret, performance_scenario); - else - platform_pwr->scenario_count--; - - etdev_dbg(etdev, "BTS Scenario deactivated: %d\n", - platform_pwr->scenario_count); - mutex_unlock(&platform_pwr->scenario_lock); -} - -void abrolhos_pm_set_bts(struct edgetpu_dev *etdev, u32 bts_val) -{ - etdev_dbg(etdev, "%s: bts request - val = %u\n", __func__, bts_val); - - switch (bts_val) { - case 0: - abrolhos_pm_deactivate_bts_scenario(etdev); - break; - case 1: - abrolhos_pm_activate_bts_scenario(etdev); - break; - default: - etdev_warn(etdev, "%s: invalid BTS request value: %u\n", - __func__, bts_val); - break; - } -} diff --git a/drivers/edgetpu/abrolhos-pm.h b/drivers/edgetpu/abrolhos-pm.h deleted file mode 100644 index bf0128f..0000000 --- a/drivers/edgetpu/abrolhos-pm.h +++ /dev/null @@ -1,166 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Power management header for Abrolhos. - * - * Copyright (C) 2020 Google, Inc. - */ -#ifndef __ABROLHOS_PM_H__ -#define __ABROLHOS_PM_H__ - -#include "edgetpu-kci.h" -#include "edgetpu-internal.h" - -/* Can't build out of tree with acpm_dvfs unless kernel supports ACPM */ -#if IS_ENABLED(CONFIG_ACPM_DVFS) - -#include <linux/acpm_dvfs.h> - -#else - -static unsigned long exynos_acpm_rate; -static inline int exynos_acpm_set_rate(unsigned int id, unsigned long rate) -{ - exynos_acpm_rate = rate; - return 0; -} -static inline int exynos_acpm_set_init_freq(unsigned int dfs_id, - unsigned long freq) -{ - return 0; -} -static inline unsigned long exynos_acpm_get_rate(unsigned int id, - unsigned long dbg_val) -{ - return exynos_acpm_rate; -} -static inline int exynos_acpm_set_policy(unsigned int id, unsigned long policy) -{ - return 0; -} -#endif /* IS_ENABLED(CONFIG_ACPM_DVFS) */ - -/* - * TPU Power States: - * 0: Off - * 1: Deep Sleep Clocks Off - * 2: Deep Sleep Clocks Slow - * 3: Deep Sleep Clocks Fast - * 4: Sleep Clocks Off - * 5: Sleep Clocks Slow - * 6: Retention Clocks Slow - * 500000: Super Underdrive @500MHz - * 800000: Underdrive @800MHz - * 1000000: Nominal @1066MHz - * 1200000: Overdrive @1230MHz - */ -enum tpu_pwr_state { - TPU_OFF = 0, - TPU_DEEP_SLEEP_CLOCKS_OFF = 1, - TPU_DEEP_SLEEP_CLOCKS_SLOW = 2, - TPU_DEEP_SLEEP_CLOCKS_FAST = 3, - TPU_SLEEP_CLOCKS_OFF = 4, - TPU_SLEEP_CLOCKS_SLOW = 5, - TPU_RETENTION_CLOCKS_SLOW = 6, - TPU_ACTIVE_SUD = 500000, - TPU_ACTIVE_UD = 800000, - TPU_ACTIVE_NOM = 1066000, - TPU_ACTIVE_OD = 1230000, -}; - -/* - * Request codes from firmware - * Values must match with firmware code base - */ -enum abrolhos_reverse_kci_code { - RKCI_CODE_PM_QOS = RKCI_CHIP_CODE_FIRST + 1, - RKCI_CODE_BTS = RKCI_CHIP_CODE_FIRST + 2, -}; - -#define TPU_POLICY_MAX TPU_ACTIVE_OD - -#define TPU_ACPM_DOMAIN 7 - -#define TPU_DEBUG_REQ (1 << 31) -#define TPU_VDD_TPU_DEBUG (0 << 27) -#define TPU_VDD_TPU_M_DEBUG (1 << 27) -#define TPU_VDD_INT_M_DEBUG (2 << 27) -#define TPU_CLK_CORE_DEBUG (3 << 27) -#define TPU_CLK_CTL_DEBUG (4 << 27) -#define TPU_CLK_AXI_DEBUG (5 << 27) -#define TPU_CLK_APB_DEBUG (6 << 27) -#define TPU_CLK_UART_DEBUG (7 << 27) -#define TPU_CORE_PWR_DEBUG (8 << 27) -#define TPU_DEBUG_VALUE_MASK ((1 << 27) - 1) - -#define OSCCLK_RATE 24576 -#define PLL_SHARED0_DIV0 1066000 -#define PLL_SHARED1_DIV2 933000 -#define PLL_SHARED2 800000 -#define PLL_SHARED3 666000 -#define PLL_SHARED0_DIV3 711000 -#define PLL_SHARED1_DIV3 622000 -#define PLL_SHARED0_DIV4 533000 -#define PLL_SHARED2_DIV2 400000 -#define PLL_SHARED3_DIV2 333000 - -#define TPU_CMU_TOP_REG 0x1E080000 -#define MUX_CLKCMU_TPU_TPU (TPU_CMU_TPU_REG + 0x10FC) -#define DIV_CLKCMU_TPU_TPU (TPU_CMU_TPU_REG + 0x18EC) - -#define MUX_CLKCMU_TPU_TPUCTL (TPU_CMU_TPU_REG + 0x1100) -#define DIV_CLKCMU_TPU_TPUCTL (TPU_CMU_TPU_REG + 0x18F0) - -#define MUX_CLKCMU_TPU_BUS (TPU_CMU_TPU_REG + 0x10F8) -#define DIV_CLKCMU_TPU_BUS (TPU_CMU_TPU_REG + 0x18E8) - -#define MUX_CLKCMU_TPU_UART (TPU_CMU_TPU_REG + 0x1104) -#define DIV_CLKCMU_TPU_UART (TPU_CMU_TPU_REG + 0x18F4) - -#define TPU_CMU_TPU_REG 0x1CC00000 - -#define PLL_CON0_PLL_TPU (TPU_CMU_TPU_REG + 0x0100) -#define PLL_CON2_PLL_TPU (TPU_CMU_TPU_REG + 0x0108) -#define MUX_CLK_TPU_TPU (TPU_CMU_TPU_REG + 0x1000) -#define MUX_CLKCMU_TPU_TPU_USER (TPU_CMU_TPU_REG + 0x0620) -#define DIV_CLK_TPU_TPU (TPU_CMU_TPU_REG + 0x1804) - -#define MUX_CLK_TPU_TPUCTL (TPU_CMU_TPU_REG + 0x1004) -#define MUX_CLKCMU_TPU_TPUCTL_USER (TPU_CMU_TPU_REG + 0x0610) -#define DIV_CLK_TPU_TPUCTL (TPU_CMU_TPU_REG + 0x1808) - -#define MUX_CLKCMU_TPU_BUS_USER (TPU_CMU_TPU_REG + 0x0600) - -#define DIV_CLK_TPU_BUSP (TPU_CMU_TPU_REG + 0x1800) - -#define MUX_CLKCMU_TPU_UART_USER (TPU_CMU_TPU_REG + 0x0630) - -#define MUX_USER_SEL_MASK 0x1 -#define MUX_USER_OSCCLK_SEL 0 -#define MUX_USER_CMUCLK_SEL 1 - -#define MUX_CMU_SEL_MASK 0x7 -#define MUX_CMU_S0_D0_SEL 0 -#define MUX_CMU_S1_D2_SEL 1 -#define MUX_CMU_S2_SEL 2 -#define MUX_CMU_S3_SEL 3 -#define MUX_CMU_S0_D3_SEL 4 -#define MUX_CMU_S1_D3_SEL 5 -#define MUX_CMU_S0_D4_SEL 6 - -#define MUX_CMU_UART_SEL_MASK 0x3 -#define MUX_CMU_UART_S0_D4_SEL 0 -#define MUX_CMU_UART_S2_D2_SEL 1 -#define MUX_CMU_UART_S3_D2_SEL 2 - -#define DIV_CMU_RATIO_MASK 0xf -#define DIV_USER_RATIO_MASK 0x7 - -int abrolhos_pm_create(struct edgetpu_dev *etdev); - -void abrolhos_pm_destroy(struct edgetpu_dev *etdev); - -void abrolhos_pm_set_pm_qos(struct edgetpu_dev *etdev, u32 pm_qos_val); - -void abrolhos_pm_set_bts(struct edgetpu_dev *etdev, u32 bts_val); - -#endif /* __ABROLHOS_PM_H__ */ diff --git a/drivers/edgetpu/abrolhos-thermal.c b/drivers/edgetpu/abrolhos-thermal.c deleted file mode 100644 index 27429a9..0000000 --- a/drivers/edgetpu/abrolhos-thermal.c +++ /dev/null @@ -1,328 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * EdgeTPU thermal driver for Abrolhos. - * - * Copyright (C) 2020 Google, Inc. - */ - -#include <linux/debugfs.h> -#include <linux/device.h> -#include <linux/gfp.h> -#include <linux/kernel.h> -#include <linux/mutex.h> -#include <linux/pm_runtime.h> -#include <linux/slab.h> -#include <linux/thermal.h> -#include <linux/version.h> -#include <linux/of.h> - -#include "abrolhos-platform.h" -#include "abrolhos-pm.h" -#include "edgetpu-config.h" -#include "edgetpu-internal.h" -#include "edgetpu-mmu.h" -#include "edgetpu-thermal.h" - -#define MAX_NUM_TPU_STATES 10 -#define OF_DATA_NUM_MAX MAX_NUM_TPU_STATES * 2 -static struct edgetpu_state_pwr state_pwr_map[MAX_NUM_TPU_STATES] = {0}; - -static int edgetpu_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - struct edgetpu_thermal *thermal = cdev->devdata; - - if (thermal->tpu_num_states <= 0) - return -ENOSYS; - - *state = thermal->tpu_num_states - 1; - return 0; -} - -/* - * Set cooling state. - */ -static int edgetpu_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state_original) -{ - int ret; - struct edgetpu_thermal *cooling = cdev->devdata; - struct device *dev = cooling->dev; - unsigned long pwr_state; - - if (state_original >= cooling->tpu_num_states) { - dev_err(dev, "%s: invalid cooling state %lu\n", __func__, - state_original); - return -EINVAL; - } - - mutex_lock(&cooling->lock); - pwr_state = state_pwr_map[state_original].state; - if (state_original != cooling->cooling_state) { - /* - * Cap the minimum state we request here. - * We cannot go to states below SUD until firmware/runtime - * handshake is added. - */ - if (pwr_state < TPU_ACTIVE_SUD) { - dev_warn_ratelimited( - dev, "Unable to go to state %lu, going to %d", - pwr_state, TPU_ACTIVE_SUD); - pwr_state = TPU_ACTIVE_SUD; - } - - ret = exynos_acpm_set_policy(TPU_ACPM_DOMAIN, pwr_state); - if (ret) { - dev_err(dev, "error setting tpu policy: %d\n", ret); - goto out; - } - cooling->cooling_state = state_original; - } else { - ret = -EALREADY; - } - -out: - mutex_unlock(&cooling->lock); - return ret; -} - -static int edgetpu_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - int ret = 0; - struct edgetpu_thermal *cooling = cdev->devdata; - - *state = cooling->cooling_state; - if (*state >= cooling->tpu_num_states) { - dev_warn(cooling->dev, - "Unknown cooling state: %lu, resetting\n", *state); - mutex_lock(&cooling->lock); - - ret = exynos_acpm_set_policy(TPU_ACPM_DOMAIN, TPU_ACTIVE_OD); - if (ret) { - dev_err(cooling->dev, "error setting tpu policy: %d\n", - ret); - mutex_unlock(&cooling->lock); - return ret; - } - - //setting back to "no cooling" - cooling->cooling_state = 0; - mutex_unlock(&cooling->lock); - } - - return 0; -} - -static int edgetpu_state2power_internal(unsigned long state, u32 *power, - struct edgetpu_thermal *thermal) -{ - int i; - - for (i = 0; i < thermal->tpu_num_states; ++i) { - if (state == state_pwr_map[i].state) { - *power = state_pwr_map[i].power; - return 0; - } - } - dev_err(thermal->dev, "Unknown state req for: %lu\n", state); - *power = 0; - return -EINVAL; -} - -static int edgetpu_get_requested_power(struct thermal_cooling_device *cdev, -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct thermal_zone_device *tz, -#endif - u32 *power) -{ - unsigned long state_original; - struct edgetpu_thermal *cooling = cdev->devdata; - - state_original = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); - return edgetpu_state2power_internal(state_original, power, - cooling); -} - -static int edgetpu_state2power(struct thermal_cooling_device *cdev, -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct thermal_zone_device *tz, -#endif - unsigned long state, u32 *power) -{ - struct edgetpu_thermal *cooling = cdev->devdata; - - if (state >= cooling->tpu_num_states) { - dev_err(cooling->dev, "%s: invalid state: %lu\n", __func__, - state); - return -EINVAL; - } - - return edgetpu_state2power_internal(state_pwr_map[state].state, power, - cooling); -} - -static int edgetpu_power2state(struct thermal_cooling_device *cdev, -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct thermal_zone_device *tz, -#endif - u32 power, unsigned long *state) -{ - int i, penultimate_throttle_state; - struct edgetpu_thermal *thermal = cdev->devdata; - - *state = 0; - if (thermal->tpu_num_states < 2) - return thermal->tpu_num_states == 1 ? 0 : -ENOSYS; - - penultimate_throttle_state = thermal->tpu_num_states - 2; - /* - * argument "power" is the maximum allowed power consumption in mW as - * defined by the PID control loop. Check for the first state that is - * less than or equal to the current allowed power. state_pwr_map is - * descending, so lowest power consumption is last value in the array - * return lowest state even if it consumes more power than allowed as - * not all platforms can handle throttling below an active state - */ - for (i = penultimate_throttle_state; i >= 0; --i) { - if (power < state_pwr_map[i].power) { - *state = i + 1; - break; - } - } - return 0; -} - -static struct thermal_cooling_device_ops edgetpu_cooling_ops = { - .get_max_state = edgetpu_get_max_state, - .get_cur_state = edgetpu_get_cur_state, - .set_cur_state = edgetpu_set_cur_state, - .get_requested_power = edgetpu_get_requested_power, - .state2power = edgetpu_state2power, - .power2state = edgetpu_power2state, -}; - -static void tpu_thermal_exit_cooling(struct edgetpu_thermal *thermal) -{ - if (!IS_ERR_OR_NULL(thermal->cdev)) - thermal_cooling_device_unregister(thermal->cdev); -} - -static void tpu_thermal_exit(struct edgetpu_thermal *thermal) -{ - tpu_thermal_exit_cooling(thermal); - debugfs_remove_recursive(thermal->cooling_root); -} - -static void devm_tpu_thermal_release(struct device *dev, void *res) -{ - struct edgetpu_thermal *thermal = res; - - tpu_thermal_exit(thermal); -} - -static int tpu_thermal_parse_dvfs_table(struct edgetpu_thermal *thermal) -{ - int row_size, col_size, tbl_size, i; - int of_data_int_array[OF_DATA_NUM_MAX]; - - if (of_property_read_u32_array(thermal->dev->of_node, - "tpu_dvfs_table_size", of_data_int_array, 2 )) - goto error; - - row_size = of_data_int_array[0]; - col_size = of_data_int_array[1]; - tbl_size = row_size * col_size; - if (row_size > MAX_NUM_TPU_STATES) { - dev_err(thermal->dev, "too many TPU states\n"); - goto error; - } - - if (tbl_size > OF_DATA_NUM_MAX) - goto error; - - if (of_property_read_u32_array(thermal->dev->of_node, - "tpu_dvfs_table", of_data_int_array, tbl_size)) - goto error; - - thermal->tpu_num_states = row_size; - for (i = 0; i < row_size; ++i) { - int idx = col_size * i; - state_pwr_map[i].state = of_data_int_array[idx]; - state_pwr_map[i].power = of_data_int_array[idx+1]; - } - - return 0; - -error: - dev_err(thermal->dev, "failed to parse DVFS table\n"); - return -EINVAL; -} - -static int -tpu_thermal_cooling_register(struct edgetpu_thermal *thermal, char *type) -{ - struct device_node *cooling_node = NULL; - int err = 0; - - thermal->op_data = NULL; - thermal->tpu_num_states = 0; - - err = tpu_thermal_parse_dvfs_table(thermal); - if (err) - return err; - - mutex_init(&thermal->lock); - cooling_node = of_find_node_by_name(NULL, "tpu-cooling"); - if (!cooling_node) - dev_warn(thermal->dev, "failed to find cooling node\n"); - // Initialize the cooling state as 0, means "no cooling" - thermal->cooling_state = 0; - thermal->cdev = thermal_of_cooling_device_register( - cooling_node, type, thermal, &edgetpu_cooling_ops); - if (IS_ERR(thermal->cdev)) - return PTR_ERR(thermal->cdev); - return 0; -} - -static int tpu_thermal_init(struct edgetpu_thermal *thermal, struct device *dev) -{ - int err; - struct dentry *d; - - d = debugfs_create_dir("cooling", edgetpu_fs_debugfs_dir()); - /* don't let debugfs creation failure abort the init procedure */ - if (!d) - dev_warn(dev, "failed to create debug fs for cooling"); - thermal->dev = dev; - thermal->cooling_root = d; - - err = tpu_thermal_cooling_register(thermal, EDGETPU_COOLING_NAME); - if (err) { - dev_err(dev, "failed to initialize external cooling\n"); - tpu_thermal_exit(thermal); - return err; - } - - return 0; -} - -struct edgetpu_thermal *devm_tpu_thermal_create(struct device *dev) -{ - struct edgetpu_thermal *thermal; - int err; - - thermal = devres_alloc(devm_tpu_thermal_release, sizeof(*thermal), - GFP_KERNEL); - if (!thermal) - return ERR_PTR(-ENOMEM); - - err = tpu_thermal_init(thermal, dev); - if (err) { - devres_free(thermal); - return ERR_PTR(err); - } - - devres_add(dev, thermal); - return thermal; -} diff --git a/drivers/edgetpu/abrolhos-usage-stats.c b/drivers/edgetpu/abrolhos-usage-stats.c deleted file mode 100644 index 1fd1fc2..0000000 --- a/drivers/edgetpu/abrolhos-usage-stats.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-usage-stats.c" diff --git a/drivers/edgetpu/abrolhos-wakelock.c b/drivers/edgetpu/abrolhos-wakelock.c deleted file mode 100644 index ab61fb2..0000000 --- a/drivers/edgetpu/abrolhos-wakelock.c +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "edgetpu-wakelock.c" diff --git a/drivers/edgetpu/abrolhos/config-mailbox.h b/drivers/edgetpu/abrolhos/config-mailbox.h deleted file mode 100644 index 7ec0ee6..0000000 --- a/drivers/edgetpu/abrolhos/config-mailbox.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Chip-dependent configuration for mailbox. - * - * Copyright (C) 2019 Google, Inc. - */ - -#ifndef __ABROLHOS_CONFIG_MAILBOX_H__ -#define __ABROLHOS_CONFIG_MAILBOX_H__ - -#include <linux/types.h> /* u32 */ - -#define EDGETPU_NUM_MAILBOXES 8 -#define EDGETPU_NUM_VII_MAILBOXES (EDGETPU_NUM_MAILBOXES - 1) -#define EDGETPU_NUM_P2P_MAILBOXES 0 - -#define ABROLHOS_CSR_MBOX2_CONTEXT_ENABLE 0xe0000 -#define ABROLHOS_CSR_MBOX2_CMD_QUEUE_DOORBELL_SET 0xe1000 -#define ABROLHOS_CSR_MBOX2_RESP_QUEUE_DOORBELL_SET 0xe1800 -#define EDGETPU_MBOX_CSRS_SIZE 0x2000 /* CSR size of each mailbox */ - -#define EDGETPU_MBOX_BASE ABROLHOS_CSR_MBOX2_CONTEXT_ENABLE - -/* CSR storing mailbox response queue doorbell status */ -#define HOST_NONSECURE_INT_SRC_STATUS_REG 0x000f0000 -#define HOST_NONSECURE_INT_SRC_CLEAR_REG 0x000f0008 - -static inline u32 edgetpu_mailbox_get_context_csr_base(u32 index) -{ - return ABROLHOS_CSR_MBOX2_CONTEXT_ENABLE + - index * EDGETPU_MBOX_CSRS_SIZE; -} - -static inline u32 edgetpu_mailbox_get_cmd_queue_csr_base(u32 index) -{ - return ABROLHOS_CSR_MBOX2_CMD_QUEUE_DOORBELL_SET + - index * EDGETPU_MBOX_CSRS_SIZE; -} - -static inline u32 edgetpu_mailbox_get_resp_queue_csr_base(u32 index) -{ - return ABROLHOS_CSR_MBOX2_RESP_QUEUE_DOORBELL_SET + - index * EDGETPU_MBOX_CSRS_SIZE; -} - -#endif /* __ABROLHOS_CONFIG_MAILBOX_H__ */ diff --git a/drivers/edgetpu/abrolhos/config-tpu-cpu.h b/drivers/edgetpu/abrolhos/config-tpu-cpu.h deleted file mode 100644 index 123dc57..0000000 --- a/drivers/edgetpu/abrolhos/config-tpu-cpu.h +++ /dev/null @@ -1,30 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Chip-dependent configuration for TPU CPU. - * - * Copyright (C) 2019 Google, Inc. - */ - -#ifndef __ABROLHOS_CONFIG_TPU_CPU_H__ -#define __ABROLHOS_CONFIG_TPU_CPU_H__ - -#define EDGETPU_REG_RESET_CONTROL 0x90010 -#define CPUPORESET (1 << 1) - -#define EDGETPU_REG_INSTRUCTION_REMAP_CONTROL 0x90050 -#define EDGETPU_REG_INSTRUCTION_REMAP_BASE 0x90058 -#define EDGETPU_REG_INSTRUCTION_REMAP_LIMIT 0x90060 -#define EDGETPU_REG_INSTRUCTION_REMAP_NEW_BASE 0x90068 -#define EDGETPU_REG_INSTRUCTION_REMAP_SECURITY 0x90070 -#define EDGETPU_REG_SECURITY 0x90048 - -/* Power Control signals for P-channel interface. */ -#define EDGETPU_REG_POWER_CONTROL 0xA0008 -#define PSTATE_SHIFT 0 -#define PSTATE (1 << PSTATE_SHIFT) -#define PREQ (1 << 1) -#define PDENY (1 << 2) -#define PACCEPT (1 << 3) -#define PACTIVE (1 << 5) - -#endif /* __ABROLHOS_CONFIG_TPU_CPU_H__ */ diff --git a/drivers/edgetpu/abrolhos/config.h b/drivers/edgetpu/abrolhos/config.h deleted file mode 100644 index f6397fd..0000000 --- a/drivers/edgetpu/abrolhos/config.h +++ /dev/null @@ -1,67 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Include all configuration files for Abrolhos. - * - * Copyright (C) 2019 Google, Inc. - */ - -#ifndef __ABROLHOS_CONFIG_H__ -#define __ABROLHOS_CONFIG_H__ - -#define DRIVER_NAME "abrolhos" - -#define EDGETPU_DEV_MAX 1 - -#define EDGETPU_HAS_MULTI_GROUPS - -#define EDGETPU_HAS_WAKELOCK - -/* - * A remapped data region is available. This will be accessible by the R52 - * regardless of active context and is typically used for logging buffer and - * non-secure mailbox queues. - */ -#define EDGETPU_HAS_REMAPPED_DATA - -/* - * The TPU VA where the firmware is located. - * - * The address is chosen to not overlap with any memory region specified in the - * firmware's linker file. - */ -#define FW_IOVA 0x16000000u -/* - * Size of the area in remapped DRAM reserved for firmware code and internal - * data. This must match the firmware's linker file. - */ -#define EDGETPU_FW_SIZE_MAX 0x100000 - -/* Data in remapped DRAM starts after firmware code and internal data */ -#define EDGETPU_REMAPPED_DATA_OFFSET EDGETPU_FW_SIZE_MAX - -/* - * Size of remapped DRAM data region. This must match the firmware's linker - * file - */ -#define EDGETPU_REMAPPED_DATA_SIZE 0x100000 - -/* - * Instruction remap registers make carveout memory appear at address - * 0x10000000 from the R52 perspective - */ -#define EDGETPU_INSTRUCTION_REMAP_BASE 0x10000000 - -/* Address from which the R52 can access data in the remapped region */ -#define EDGETPU_REMAPPED_DATA_ADDR \ - (EDGETPU_INSTRUCTION_REMAP_BASE + EDGETPU_REMAPPED_DATA_OFFSET) - -/* - * Size of memory for FW accessible debug dump segments - */ -#define EDGETPU_DEBUG_DUMP_MEM_SIZE 0x4E0000 - -#include "config-mailbox.h" -#include "config-tpu-cpu.h" -#include "csrs.h" - -#endif /* __ABROLHOS_CONFIG_H__ */ diff --git a/drivers/edgetpu/abrolhos/csrs.h b/drivers/edgetpu/abrolhos/csrs.h deleted file mode 100644 index 1bf69c7..0000000 --- a/drivers/edgetpu/abrolhos/csrs.h +++ /dev/null @@ -1,36 +0,0 @@ -enum edgetpu_csrs { - EDGETPU_REG_TILECONF1_DEEPSLEEP = 0x42028, - EDGETPU_REG_TILECONF1_ERROR_TILE = 0x42520, - EDGETPU_REG_TILECONF1_ERROR_MASK_TILE = 0x42528, - EDGETPU_REG_TILECONF1_ERROR_INFO_TILE = 0x42540, - - EDGETPU_REG_SC_RUNCTRL = 0x44018, - EDGETPU_REG_SC_CURRENTPC = 0x44028, - EDGETPU_REG_SC_DECODEPC = 0x44030, - EDGETPU_REG_SC_RUNSTATUS = 0x44398, - EDGETPU_REG_SC_ERROR = 0x44440, - EDGETPU_REG_SC_ERROR_MASK = 0x44448, - EDGETPU_REG_SC_ERROR_INFO = 0x44460, - - EDGETPU_REG_USER_HIB_OUT_ACTVQ_INT_STAT = 0x48060, - EDGETPU_REG_USER_HIB_INSTRQ_TAIL = 0x480A8, - EDGETPU_REG_USER_HIB_INSTRQ_INT_STAT = 0x480C8, - EDGETPU_REG_USER_HIB_IN_ACTVQ_INT_STAT = 0x48130, - EDGETPU_REG_USER_HIB_PARAMQ_INT_STAT = 0x48198, - EDGETPU_REG_USER_HIB_SC_HOST_INT_STAT = 0x481A8, - EDGETPU_REG_USER_HIB_TOPLVL_INT_STAT = 0x481B8, - EDGETPU_REG_USER_HIB_FATALERR_INT_STAT = 0x481C8, - EDGETPU_REG_USER_HIB_DMA_PAUSE = 0x481D8, - EDGETPU_REG_USER_HIB_DMA_PAUSED = 0x481E0, - EDGETPU_REG_USER_HIB_ERROR_STATUS = 0x48C20, - EDGETPU_REG_USER_HIB_ERROR_MASK = 0x48C28, - EDGETPU_REG_USER_HIB_FIRST_ERROR_STATUS = 0x48C08, - EDGETPU_REG_USER_HIB_TILECONFIG1 = 0x48268, - EDGETPU_REG_USER_HIB_SNAPSHOT = 0x48240, - - EDGETPU_REG_AON_RESET = 0x60000, - EDGETPU_REG_AON_CLOCK_ENABLE = 0x60008, - EDGETPU_REG_AON_FORCE_QUIESCE = 0x60010, - - EDGETPU_REG_CPUNS_TIMESTAMP = 0xa00e0, -}; |