diff options
author | Erick Reyes <erickreyes@google.com> | 2020-07-09 11:53:32 -0700 |
---|---|---|
committer | Erick Reyes <erickreyes@google.com> | 2020-07-09 11:54:43 -0700 |
commit | 4f6e7f7bd868a1485f73dc1fcfbf568abefdfd16 (patch) | |
tree | f41af7dee5624b9f360ebb989a8979c28aa88f79 | |
parent | a3cad9227e99dfc6405f2812173ff14eabd04393 (diff) | |
download | abrolhos-4f6e7f7bd868a1485f73dc1fcfbf568abefdfd16.tar.gz |
Merge branch 'whitechapel' into 'android-gs-pixel-4.19'
Squash merge at commit:
4119033a50e8 Merge branch 'darwinn-2.0' into whitechapel
Signed-off-by: Erick Reyes <erickreyes@google.com>
Change-Id: I08f71e9b7ab699dbf372792da875483756bf21b9
-rw-r--r-- | drivers/edgetpu/abrolhos-firmware.c | 23 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-platform.c | 11 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-pm.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-direct.c | 30 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-dmabuf.c | 44 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-dmabuf.h | 4 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-pm.c | 4 |
7 files changed, 47 insertions, 71 deletions
diff --git a/drivers/edgetpu/abrolhos-firmware.c b/drivers/edgetpu/abrolhos-firmware.c index 0ab104d..831df44 100644 --- a/drivers/edgetpu/abrolhos-firmware.c +++ b/drivers/edgetpu/abrolhos-firmware.c @@ -56,19 +56,6 @@ static int abrolhos_firmware_setup_buffer( struct edgetpu_firmware *et_fw, struct edgetpu_firmware_buffer *fw_buf) { - struct edgetpu_dev *etdev = et_fw->etdev; - struct device *dev = etdev->dev; - struct edgetpu_platform_dev *edgetpu_pdev = container_of( - etdev, struct edgetpu_platform_dev, edgetpu_dev); - - fw_buf->dma_addr = dma_map_single(dev, edgetpu_pdev->fw_region_vaddr, - edgetpu_pdev->fw_region_size, - DMA_TO_DEVICE); - if (dma_mapping_error(dev, fw_buf->dma_addr)) { - dev_err(dev, "%s: dma map failed\n", __func__); - fw_buf->dma_addr = 0; - return -ENOMEM; - } return 0; } @@ -76,20 +63,12 @@ static void abrolhos_firmware_teardown_buffer( struct edgetpu_firmware *et_fw, struct edgetpu_firmware_buffer *fw_buf) { - struct device *dev = et_fw->etdev->dev; - - if (fw_buf->dma_addr) { - dma_unmap_single(dev, fw_buf->dma_addr, fw_buf->alloc_size, - DMA_TO_DEVICE); - fw_buf->dma_addr = 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 device *dev = etdev->dev; /* Clear Substream ID (aka SCID) for instruction remapped addresses */ u32 sec_reg = edgetpu_dev_read_32( @@ -103,8 +82,6 @@ static int abrolhos_firmware_prepare_run(struct edgetpu_firmware *et_fw, sec_reg &= ~(0x0F << 10); edgetpu_dev_write_32(etdev, EDGETPU_REG_SECURITY, sec_reg); - dma_sync_single_for_device(dev, fw_buf->dma_addr, fw_buf->alloc_size, - DMA_TO_DEVICE); r52_reset(etdev, 1); /* Reset KCI mailbox before start f/w, don't process anything old. */ diff --git a/drivers/edgetpu/abrolhos-platform.c b/drivers/edgetpu/abrolhos-platform.c index f897a71..0f39cfa 100644 --- a/drivers/edgetpu/abrolhos-platform.c +++ b/drivers/edgetpu/abrolhos-platform.c @@ -60,7 +60,7 @@ static int edgetpu_platform_setup_fw_region(struct edgetpu_platform_dev *etpdev) } etpdev->fw_region_vaddr = - memremap(r.start, resource_size(&r), MEMREMAP_WB); + memremap(r.start, resource_size(&r), MEMREMAP_WC); if (!etpdev->fw_region_vaddr) { dev_err(dev, "Firmware memory remap failed\n"); return -EINVAL; @@ -222,13 +222,6 @@ static int edgetpu_platform_probe(struct platform_device *pdev) return ret; } - ret = edgetpu_pm_get(edgetpu_pdev->edgetpu_dev.pm); - if (ret) { - dev_err(dev, "%s failed to do initial power-up: %d\n", - DRIVER_NAME, ret); - return ret; - } - dev_dbg(dev, "Creating thermal device\n"); edgetpu_pdev->edgetpu_dev.thermal = devm_tpu_thermal_create(dev); @@ -236,7 +229,7 @@ static int edgetpu_platform_probe(struct platform_device *pdev) dev_dbg(dev, "Probe finished, powering down\n"); /* Turn the device off until a client request is received */ - edgetpu_pm_put(edgetpu_pdev->edgetpu_dev.pm); + edgetpu_pm_shutdown(&edgetpu_pdev->edgetpu_dev); return 0; } diff --git a/drivers/edgetpu/abrolhos-pm.c b/drivers/edgetpu/abrolhos-pm.c index 7e8ed93..50e994c 100644 --- a/drivers/edgetpu/abrolhos-pm.c +++ b/drivers/edgetpu/abrolhos-pm.c @@ -64,6 +64,8 @@ static int abrolhos_pwr_state_set(void *data, u64 val) curr_state = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); + dev_dbg(dev, "Power state %d -> %d\n", curr_state, val); + if (curr_state == TPU_OFF && val > TPU_OFF) { ret = pm_runtime_get_sync(dev); if (ret) { diff --git a/drivers/edgetpu/edgetpu-direct.c b/drivers/edgetpu/edgetpu-direct.c index 9f0f582..17e927d 100644 --- a/drivers/edgetpu/edgetpu-direct.c +++ b/drivers/edgetpu/edgetpu-direct.c @@ -328,6 +328,32 @@ static int etdirect_unmap_dmabuf(struct edgetpu_device_group *group, return edgetpu_unmap_dmabuf(group, ibuf.die_index, ibuf.device_address); } +static int edgetpu_ioctl_sync_fence_create( + struct edgetpu_create_sync_fence_data __user *datap) +{ + struct edgetpu_create_sync_fence_data data; + int ret; + + if (copy_from_user(&data, (void __user *)datap, sizeof(data))) + return -EFAULT; + ret = edgetpu_sync_fence_create(&data); + if (ret) + return ret; + if (copy_to_user((void __user *)datap, &data, sizeof(data))) + ret = -EFAULT; + return ret; +} + +static int edgetpu_ioctl_sync_fence_signal( + struct edgetpu_signal_sync_fence_data __user *datap) +{ + struct edgetpu_signal_sync_fence_data data; + + if (copy_from_user(&data, (void __user *)datap, sizeof(data))) + return -EFAULT; + return edgetpu_sync_fence_signal(&data); +} + static bool etdirect_ioctl_check_permissions(struct file *file, uint cmd) { return file->f_mode & FMODE_WRITE; @@ -424,10 +450,10 @@ static long etdirect_ioctl(struct file *file, uint cmd, ulong arg) ret = etdirect_unmap_dmabuf(client->group, argp); break; case EDGETPU_CREATE_SYNC_FENCE: - ret = edgetpu_sync_fence_create(argp); + ret = edgetpu_ioctl_sync_fence_create(argp); break; case EDGETPU_SIGNAL_SYNC_FENCE: - ret = edgetpu_sync_fence_signal(argp); + ret = edgetpu_ioctl_sync_fence_signal(argp); break; default: return -ENOTTY; /* unknown command */ diff --git a/drivers/edgetpu/edgetpu-dmabuf.c b/drivers/edgetpu/edgetpu-dmabuf.c index ccd5677..f6ae2e4 100644 --- a/drivers/edgetpu/edgetpu-dmabuf.c +++ b/drivers/edgetpu/edgetpu-dmabuf.c @@ -731,33 +731,25 @@ static const struct dma_fence_ops edgetpu_dma_fence_ops = { }; int edgetpu_sync_fence_create( - struct edgetpu_create_sync_fence_data __user *datap) + struct edgetpu_create_sync_fence_data *datap) { - int fd = get_unused_fd_flags(O_CLOEXEC); + int fd; int ret; struct edgetpu_dma_fence *etfence; struct sync_file *sync_file; - struct edgetpu_create_sync_fence_data data; unsigned long flags; - if (copy_from_user(&data, (void __user *)datap, sizeof(data))) { - ret = -EFAULT; - goto err_putfd; - } - etfence = kzalloc(sizeof(*etfence), GFP_KERNEL); - if (!etfence) { - ret = -ENOMEM; - goto err_putfd; - } + if (!etfence) + return -ENOMEM; spin_lock_init(&etfence->lock); - memcpy(&etfence->timeline_name, &data.timeline_name, + memcpy(&etfence->timeline_name, &datap->timeline_name, EDGETPU_SYNC_TIMELINE_NAME_LEN - 1); dma_fence_init(&etfence->fence, &edgetpu_dma_fence_ops, &etfence->lock, dma_fence_context_alloc(1), - data.seqno); + datap->seqno); sync_file = sync_file_create(&etfence->fence); dma_fence_put(&etfence->fence); @@ -766,49 +758,35 @@ int edgetpu_sync_fence_create( goto err_freefence; } - data.fence = fd; - if (copy_to_user((void __user *)datap, &data, sizeof(data))) { - ret = -EFAULT; - goto err_putsyncfile; - } - + fd = get_unused_fd_flags(O_CLOEXEC); + datap->fence = fd; fd_install(fd, sync_file->file); spin_lock_irqsave(&etfence_list_lock, flags); list_add_tail(&etfence->etfence_list, &etfence_list_head); spin_unlock_irqrestore(&etfence_list_lock, flags); return 0; -err_putsyncfile: - fput(sync_file->file); - err_freefence: kfree(etfence); - -err_putfd: - put_unused_fd(fd); return ret; } int edgetpu_sync_fence_signal( - struct edgetpu_signal_sync_fence_data __user *datap) + struct edgetpu_signal_sync_fence_data *datap) { - struct edgetpu_signal_sync_fence_data data; struct dma_fence *fence; struct edgetpu_dma_fence *etfence; int errno; int ret; - if (copy_from_user(&data, (void __user *)datap, sizeof(data))) - return -EFAULT; - - fence = sync_file_get_fence(data.fence); + fence = sync_file_get_fence(datap->fence); if (!fence) return -EINVAL; etfence = to_etfence(fence); if (!etfence) return -EINVAL; - errno = data.error; + errno = datap->error; if (errno > 0) errno = -errno; diff --git a/drivers/edgetpu/edgetpu-dmabuf.h b/drivers/edgetpu/edgetpu-dmabuf.h index 778309b..cab8abc 100644 --- a/drivers/edgetpu/edgetpu-dmabuf.h +++ b/drivers/edgetpu/edgetpu-dmabuf.h @@ -27,10 +27,10 @@ int edgetpu_unmap_dmabuf(struct edgetpu_device_group *group, u32 die_index, tpu_addr_t tpu_addr); /* Create a DMA sync fence via ioctl */ int edgetpu_sync_fence_create( - struct edgetpu_create_sync_fence_data __user *datap); + struct edgetpu_create_sync_fence_data *datap); /* Signal a DMA sync fence, optionally specifying error status */ int edgetpu_sync_fence_signal( - struct edgetpu_signal_sync_fence_data __user *datap); + struct edgetpu_signal_sync_fence_data *datap); /* Dump sync fence info from debugfs */ int edgetpu_sync_fence_debugfs_show(struct seq_file *s, void *unused); diff --git a/drivers/edgetpu/edgetpu-pm.c b/drivers/edgetpu/edgetpu-pm.c index a93c75f..164667a 100644 --- a/drivers/edgetpu/edgetpu-pm.c +++ b/drivers/edgetpu/edgetpu-pm.c @@ -111,8 +111,8 @@ void edgetpu_pm_shutdown(struct edgetpu_dev *etdev) if (etpm->p->power_up_count) { etdev_warn(etdev, "Leaving %d clients behind!\n", etpm->p->power_up_count); - if (etpm->p->handlers && etpm->p->handlers->power_down) - etpm->p->handlers->power_down(etpm); } + if (etpm->p->handlers && etpm->p->handlers->power_down) + etpm->p->handlers->power_down(etpm); edgetpu_firmware_unlock(etdev); } |