summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Reyes <erickreyes@google.com>2020-07-09 11:53:32 -0700
committerErick Reyes <erickreyes@google.com>2020-07-09 11:54:43 -0700
commit4f6e7f7bd868a1485f73dc1fcfbf568abefdfd16 (patch)
treef41af7dee5624b9f360ebb989a8979c28aa88f79
parenta3cad9227e99dfc6405f2812173ff14eabd04393 (diff)
downloadabrolhos-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.c23
-rw-r--r--drivers/edgetpu/abrolhos-platform.c11
-rw-r--r--drivers/edgetpu/abrolhos-pm.c2
-rw-r--r--drivers/edgetpu/edgetpu-direct.c30
-rw-r--r--drivers/edgetpu/edgetpu-dmabuf.c44
-rw-r--r--drivers/edgetpu/edgetpu-dmabuf.h4
-rw-r--r--drivers/edgetpu/edgetpu-pm.c4
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);
}