[PATCH v7 18/20] firmware: qcom_scm: Use fixed width src vm bitmap

2022-11-21 Thread Elliot Berman
The maximum VMID for assign_mem is 63. Use a u64 to represent this
bitmap instead of architecture-dependent "unsigned int" which varies in
size on 32-bit and 64-bit platforms.

Signed-off-by: Elliot Berman 
---

Note this will have build conflicts with
https://lore.kernel.org/all/20221114-narmstrong-sm8550-upstream-mpss_dsm-v2-2-f7c65d6f0...@linaro.org/
which would also need an "unsigned int" -> "u64" in struct 
qcom_mpss_dsm_mem:perms.

 drivers/firmware/qcom_scm.c   | 12 +++-
 drivers/misc/fastrpc.c|  6 --
 drivers/net/wireless/ath/ath10k/qmi.c |  4 ++--
 drivers/remoteproc/qcom_q6v5_mss.c|  8 
 drivers/soc/qcom/rmtfs_mem.c  |  2 +-
 include/linux/qcom_scm.h  |  2 +-
 6 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index cdbfe54c8146..92763dce6477 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -898,7 +898,7 @@ static int __qcom_scm_assign_mem(struct device *dev, 
phys_addr_t mem_region,
  * Return negative errno on failure or 0 on success with @srcvm updated.
  */
 int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
-   unsigned int *srcvm,
+   u64 *srcvm,
const struct qcom_scm_vmperm *newvm,
unsigned int dest_cnt)
 {
@@ -915,9 +915,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
__le32 *src;
void *ptr;
int ret, i, b;
-   unsigned long srcvm_bits = *srcvm;
+   u64 srcvm_bits = *srcvm;
 
-   src_sz = hweight_long(srcvm_bits) * sizeof(*src);
+   src_sz = hweight64(srcvm_bits) * sizeof(*src);
mem_to_map_sz = sizeof(*mem_to_map);
dest_sz = dest_cnt * sizeof(*destvm);
ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
@@ -930,8 +930,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t 
mem_sz,
/* Fill source vmid detail */
src = ptr;
i = 0;
-   for_each_set_bit(b, _bits, BITS_PER_LONG)
-   src[i++] = cpu_to_le32(b);
+   for (b = 0; b < BITS_PER_TYPE(u64); b++) {
+   if (srcvm_bits & BIT(b))
+   src[i++] = cpu_to_le32(b);
+   }
 
/* Fill details of mem buff to map */
mem_to_map = ptr + ALIGN(src_sz, SZ_64);
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 7ff0b63c25e3..2ad388f99fe1 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -299,11 +299,13 @@ static void fastrpc_free_map(struct kref *ref)
if (map->attr & FASTRPC_ATTR_SECUREMAP) {
struct qcom_scm_vmperm perm;
int err = 0;
+   u64 src;
 
+   src = BIT(map->fl->cctx->vmperms[0].vmid);
perm.vmid = QCOM_SCM_VMID_HLOS;
perm.perm = QCOM_SCM_PERM_RWX;
err = qcom_scm_assign_mem(map->phys, map->size,
-   &(map->fl->cctx->vmperms[0].vmid), , 1);
+   , , 1);
if (err) {
dev_err(map->fl->sctx->dev, "Failed to assign 
memory phys 0x%llx size 0x%llx err %d",
map->phys, map->size, err);
@@ -744,7 +746,7 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int 
fd,
 * If subsystem VMIDs are defined in DTSI, then do
 * hyp_assign from HLOS to those VM(s)
 */
-   unsigned int perms = BIT(QCOM_SCM_VMID_HLOS);
+   u64 perms = BIT(QCOM_SCM_VMID_HLOS);
 
map->attr = attr;
err = qcom_scm_assign_mem(map->phys, (u64)map->size, ,
diff --git a/drivers/net/wireless/ath/ath10k/qmi.c 
b/drivers/net/wireless/ath/ath10k/qmi.c
index 66cb7a1e628a..6d1d87e1cdde 100644
--- a/drivers/net/wireless/ath/ath10k/qmi.c
+++ b/drivers/net/wireless/ath/ath10k/qmi.c
@@ -28,7 +28,7 @@ static int ath10k_qmi_map_msa_permission(struct ath10k_qmi 
*qmi,
 {
struct qcom_scm_vmperm dst_perms[3];
struct ath10k *ar = qmi->ar;
-   unsigned int src_perms;
+   u64 src_perms;
u32 perm_count;
int ret;
 
@@ -60,7 +60,7 @@ static int ath10k_qmi_unmap_msa_permission(struct ath10k_qmi 
*qmi,
 {
struct qcom_scm_vmperm dst_perms;
struct ath10k *ar = qmi->ar;
-   unsigned int src_perms;
+   u64 src_perms;
int ret;
 
src_perms = BIT(QCOM_SCM_VMID_MSS_MSA) | BIT(QCOM_SCM_VMID_WLAN);
diff --git a/drivers/remoteproc/qcom_q6v5_mss.c 
b/drivers/remoteproc/qcom_q6v5_mss.c
index fddb63cffee0..9e8bde7a7ec4 100644
--- a/drivers/remoteproc/qcom_q6v5_mss.c
+++ b/drivers/remoteproc/qcom_q6v5_mss.c
@@ -227,8 +227,8 @@ struct q6v5 {
bool has_qaccept_regs;
bool has_ext_cntl_regs;
bool has_vq6;
-   int 

Re: [PATCH v7 18/20] firmware: qcom_scm: Use fixed width src vm bitmap

2022-11-21 Thread Kalle Valo
Elliot Berman  writes:

> The maximum VMID for assign_mem is 63. Use a u64 to represent this
> bitmap instead of architecture-dependent "unsigned int" which varies in
> size on 32-bit and 64-bit platforms.
>
> Signed-off-by: Elliot Berman 
> ---
>
> Note this will have build conflicts with
> https://lore.kernel.org/all/20221114-narmstrong-sm8550-upstream-mpss_dsm-v2-2-f7c65d6f0...@linaro.org/
> which would also need an "unsigned int" -> "u64" in struct 
> qcom_mpss_dsm_mem:perms.
>
>  drivers/firmware/qcom_scm.c   | 12 +++-
>  drivers/misc/fastrpc.c|  6 --
>  drivers/net/wireless/ath/ath10k/qmi.c |  4 ++--

For ath10k:

Acked-by: Kalle Valo 

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

___
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k