dsp, ipc: add fluence NN changes

Change-Id: Ie8323156c74601333871646052068a609c7cf474
This commit is contained in:
pavanisr
2020-11-05 13:37:49 +05:30
committed by Vikram Panduranga
parent e8e79f3322
commit ba39b85277
4 changed files with 68 additions and 17 deletions

View File

@@ -26,6 +26,7 @@
#endif #endif
#include <dsp/msm_audio_ion.h> #include <dsp/msm_audio_ion.h>
#include <linux/msm_audio.h> #include <linux/msm_audio.h>
#include <soc/qcom/secure_buffer.h>
#define MSM_AUDIO_ION_PROBED (1 << 0) #define MSM_AUDIO_ION_PROBED (1 << 0)
@@ -75,6 +76,7 @@ static bool msm_audio_ion_fd_list_init = false;
struct msm_audio_fd_data { struct msm_audio_fd_data {
int fd; int fd;
size_t plen;
void *handle; void *handle;
dma_addr_t paddr; dma_addr_t paddr;
struct device *dev; struct device *dev;
@@ -415,7 +417,7 @@ void msm_audio_delete_fd_entry(void *handle)
mutex_unlock(&(msm_audio_ion_fd_list.list_mutex)); mutex_unlock(&(msm_audio_ion_fd_list.list_mutex));
} }
int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr) int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr, size_t *pa_len)
{ {
struct msm_audio_fd_data *msm_audio_fd_data = NULL; struct msm_audio_fd_data *msm_audio_fd_data = NULL;
int status = -EINVAL; int status = -EINVAL;
@@ -430,6 +432,7 @@ int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr)
&msm_audio_ion_fd_list.fd_list, list) { &msm_audio_ion_fd_list.fd_list, list) {
if (msm_audio_fd_data->fd == fd) { if (msm_audio_fd_data->fd == fd) {
*paddr = msm_audio_fd_data->paddr; *paddr = msm_audio_fd_data->paddr;
*pa_len = msm_audio_fd_data->plen;
status = 0; status = 0;
pr_debug("%s Found fd %d paddr %pK\n", pr_debug("%s Found fd %d paddr %pK\n",
__func__, fd, paddr); __func__, fd, paddr);
@@ -507,6 +510,7 @@ static int msm_audio_ion_import(struct dma_buf **dma_buf, int fd,
goto err_ion_flag; goto err_ion_flag;
} }
} }
if (ion_data->smmu_enabled) {
rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr, ion_data); rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr, ion_data);
if (rc) { if (rc) {
pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc);
@@ -514,6 +518,9 @@ static int msm_audio_ion_import(struct dma_buf **dma_buf, int fd,
} }
pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, pr_debug("%s: mapped address = %pK, size=%zd\n", __func__,
*vaddr, bufsz); *vaddr, bufsz);
} else {
msm_audio_dma_buf_map(*dma_buf, paddr, plen, true, ion_data);
}
return 0; return 0;
err_ion_flag: err_ion_flag:
@@ -541,9 +548,11 @@ static int msm_audio_ion_free(struct dma_buf *dma_buf, struct msm_audio_ion_priv
return -EINVAL; return -EINVAL;
} }
if (ion_data->smmu_enabled) {
ret = msm_audio_ion_unmap_kernel(dma_buf, ion_data); ret = msm_audio_ion_unmap_kernel(dma_buf, ion_data);
if (ret) if (ret)
return ret; return ret;
}
msm_audio_dma_buf_unmap(dma_buf, ion_data); msm_audio_dma_buf_unmap(dma_buf, ion_data);
@@ -614,9 +623,16 @@ static long msm_audio_ion_ioctl(struct file *file, unsigned int ioctl_num,
size_t pa_len = 0; size_t pa_len = 0;
void *vaddr; void *vaddr;
int ret = 0; int ret = 0;
int dest_perms_map[2] = {PERM_READ | PERM_WRITE, PERM_READ | PERM_WRITE};
int source_vm_map[1] = {VMID_HLOS};
int dest_vm_map[3] = {VMID_LPASS, VMID_ADSP_HEAP, VMID_HLOS};
int dest_perms_unmap[1] = {PERM_READ | PERM_WRITE | PERM_EXEC};
int source_vm_unmap[3] = {VMID_LPASS, VMID_ADSP_HEAP, VMID_HLOS};
int dest_vm_unmap[1] = {VMID_HLOS};
struct msm_audio_fd_data *msm_audio_fd_data = NULL; struct msm_audio_fd_data *msm_audio_fd_data = NULL;
struct msm_audio_ion_private *ion_data = struct msm_audio_ion_private *ion_data =
container_of(file->f_inode->i_cdev, struct msm_audio_ion_private, cdev); container_of(file->f_inode->i_cdev, struct msm_audio_ion_private, cdev);
pr_debug("%s ioctl num %u\n", __func__, ioctl_num); pr_debug("%s ioctl num %u\n", __func__, ioctl_num);
switch (ioctl_num) { switch (ioctl_num) {
case IOCTL_MAP_PHYS_ADDR: case IOCTL_MAP_PHYS_ADDR:
@@ -634,6 +650,7 @@ static long msm_audio_ion_ioctl(struct file *file, unsigned int ioctl_num,
msm_audio_fd_data->fd = (int)ioctl_param; msm_audio_fd_data->fd = (int)ioctl_param;
msm_audio_fd_data->handle = mem_handle; msm_audio_fd_data->handle = mem_handle;
msm_audio_fd_data->paddr = paddr; msm_audio_fd_data->paddr = paddr;
msm_audio_fd_data->plen = pa_len;
msm_audio_fd_data->dev = ion_data->cb_dev; msm_audio_fd_data->dev = ion_data->cb_dev;
msm_audio_update_fd_list(msm_audio_fd_data); msm_audio_update_fd_list(msm_audio_fd_data);
break; break;
@@ -646,6 +663,36 @@ static long msm_audio_ion_ioctl(struct file *file, unsigned int ioctl_num,
} }
msm_audio_delete_fd_entry(mem_handle); msm_audio_delete_fd_entry(mem_handle);
break; break;
case IOCTL_MAP_HYP_ASSIGN:
ret = msm_audio_get_phy_addr((int)ioctl_param, &paddr, &pa_len);
if (ret < 0) {
pr_err("%s get phys addr failed %d\n", __func__, ret);
return ret;
}
ret = hyp_assign_phys(paddr, pa_len, source_vm_map, 1,
dest_vm_map, dest_perms_map, 2);
if (ret < 0) {
pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n",
__func__, ret, paddr, pa_len);
return ret;
}
pr_err("%s: hyp_assign_phys success\n", __func__);
break;
case IOCTL_UNMAP_HYP_ASSIGN:
ret = msm_audio_get_phy_addr((int)ioctl_param, &paddr, &pa_len);
if (ret < 0) {
pr_err("%s get phys addr failed %d\n", __func__, ret);
return ret;
}
ret = hyp_assign_phys(paddr, pa_len, source_vm_unmap, 2,
dest_vm_unmap, dest_perms_unmap, 1);
if (ret < 0) {
pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n",
__func__, ret, paddr, pa_len);
return ret;
}
pr_err("%s: hyp_assign_phys success\n", __func__);
break;
default: default:
pr_err("%s Entered default. Invalid ioctl num %u", pr_err("%s Entered default. Invalid ioctl num %u",
__func__, ioctl_num); __func__, ioctl_num);
@@ -808,6 +855,8 @@ static int msm_audio_ion_probe(struct platform_device *pdev)
msm_audio_ion_data->smmu_sid_bits = msm_audio_ion_data->smmu_sid_bits =
smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET; smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET;
} else {
msm_audio_ion_data->driver_name = "msm_audio_ion_cma";
} }
if (!rc) if (!rc)

View File

@@ -27,6 +27,6 @@ struct audio_buffer {
uint32_t actual_size; /* actual number of bytes read by DSP */ uint32_t actual_size; /* actual number of bytes read by DSP */
struct dma_buf *dma_buf; struct dma_buf *dma_buf;
}; };
int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr); int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr, size_t *pa_len);
void msm_audio_ion_crash_handler(void); void msm_audio_ion_crash_handler(void);
#endif /* _LINUX_MSM_AUDIO_ION_H */ #endif /* _LINUX_MSM_AUDIO_ION_H */

View File

@@ -2,7 +2,7 @@
/* /*
* *
* Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 Google, Inc.
* Copyright (c) 2012, 2014, 2017, 2020 The Linux Foundation. All rights reserved. * Copyright (c) 2012, 2014, 2017, 2020, 2021 The Linux Foundation. All rights reserved.
*/ */
#ifndef _UAPI_LINUX_MSM_AUDIO_H #ifndef _UAPI_LINUX_MSM_AUDIO_H
@@ -106,8 +106,9 @@
#define AUDIO_PM_RELAX _IOW(AUDIO_IOCTL_MAGIC, 106, unsigned int) #define AUDIO_PM_RELAX _IOW(AUDIO_IOCTL_MAGIC, 106, unsigned int)
#define AUDIO_REGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 107, struct msm_audio_ion_info) #define AUDIO_REGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 107, struct msm_audio_ion_info)
#define AUDIO_DEREGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 108, struct msm_audio_ion_info) #define AUDIO_DEREGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 108, struct msm_audio_ion_info)
#define AUDIO_MAX_COMMON_IOCTL_NUM 109 #define IOCTL_MAP_HYP_ASSIGN _IOW(AUDIO_IOCTL_MAGIC, 109, int)
#define IOCTL_UNMAP_HYP_ASSIGN _IOW(AUDIO_IOCTL_MAGIC, 110, int)
#define AUDIO_MAX_COMMON_IOCTL_NUM 111
#define HANDSET_MIC 0x01 #define HANDSET_MIC 0x01
#define HANDSET_SPKR 0x02 #define HANDSET_SPKR 0x02

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. /* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and * it under the terms of the GNU General Public License version 2 and
@@ -299,13 +299,14 @@ ssize_t audio_pkt_read(struct file *file, char __user *buf,
int audpkt_chk_and_update_physical_addr(struct audio_gpr_pkt *gpr_pkt) int audpkt_chk_and_update_physical_addr(struct audio_gpr_pkt *gpr_pkt)
{ {
int ret = 0; int ret = 0;
size_t pa_len = 0;
dma_addr_t paddr; dma_addr_t paddr;
if (gpr_pkt->audpkt_mem_map.mmap_header.property_flag & if (gpr_pkt->audpkt_mem_map.mmap_header.property_flag &
APM_MEMORY_MAP_BIT_MASK_IS_OFFSET_MODE) { APM_MEMORY_MAP_BIT_MASK_IS_OFFSET_MODE) {
ret = msm_audio_get_phy_addr( ret = msm_audio_get_phy_addr(
(int) gpr_pkt->audpkt_mem_map.mmap_payload.shm_addr_lsw, (int) gpr_pkt->audpkt_mem_map.mmap_payload.shm_addr_lsw,
&paddr); &paddr, &pa_len);
if (ret < 0) { if (ret < 0) {
AUDIO_PKT_ERR("%s Get phy. address failed, ret %d\n", AUDIO_PKT_ERR("%s Get phy. address failed, ret %d\n",
__func__, ret); __func__, ret);