]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/firmware/qcom_scm.c
firmware: qcom_scm: Cleanup code in qcom_scm_assign_mem()
[mirror_ubuntu-jammy-kernel.git] / drivers / firmware / qcom_scm.c
index c7e63af91567cf248f59f00934bb048d36be1926..4802ab170fe51a57fb83f962bbf6f8a4b7936717 100644 (file)
@@ -434,7 +434,8 @@ EXPORT_SYMBOL(qcom_scm_set_remote_state);
  */
 int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
                        unsigned int *srcvm,
-                       struct qcom_scm_vmperm *newvm, int dest_cnt)
+                       const struct qcom_scm_vmperm *newvm,
+                       unsigned int dest_cnt)
 {
        struct qcom_scm_current_perm_info *destvm;
        struct qcom_scm_mem_map_info *mem_to_map;
@@ -449,11 +450,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
        int next_vm;
        __le32 *src;
        void *ptr;
-       int ret;
-       int len;
-       int i;
+       int ret, i, b;
+       unsigned long srcvm_bits = *srcvm;
 
-       src_sz = hweight_long(*srcvm) * sizeof(*src);
+       src_sz = hweight_long(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) +
@@ -466,28 +466,26 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
 
        /* Fill source vmid detail */
        src = ptr;
-       len = hweight_long(*srcvm);
-       for (i = 0; i < len; i++) {
-               src[i] = cpu_to_le32(ffs(*srcvm) - 1);
-               *srcvm ^= 1 << (ffs(*srcvm) - 1);
-       }
+       i = 0;
+       for_each_set_bit(b, &srcvm_bits, BITS_PER_LONG)
+               src[i++] = cpu_to_le32(b);
 
        /* Fill details of mem buff to map */
        mem_to_map = ptr + ALIGN(src_sz, SZ_64);
        mem_to_map_phys = ptr_phys + ALIGN(src_sz, SZ_64);
-       mem_to_map[0].mem_addr = cpu_to_le64(mem_addr);
-       mem_to_map[0].mem_size = cpu_to_le64(mem_sz);
+       mem_to_map->mem_addr = cpu_to_le64(mem_addr);
+       mem_to_map->mem_size = cpu_to_le64(mem_sz);
 
        next_vm = 0;
        /* Fill details of next vmid detail */
        destvm = ptr + ALIGN(mem_to_map_sz, SZ_64) + ALIGN(src_sz, SZ_64);
        dest_phys = ptr_phys + ALIGN(mem_to_map_sz, SZ_64) + ALIGN(src_sz, SZ_64);
-       for (i = 0; i < dest_cnt; i++) {
-               destvm[i].vmid = cpu_to_le32(newvm[i].vmid);
-               destvm[i].perm = cpu_to_le32(newvm[i].perm);
-               destvm[i].ctx = 0;
-               destvm[i].ctx_size = 0;
-               next_vm |= BIT(newvm[i].vmid);
+       for (i = 0; i < dest_cnt; i++, destvm++, newvm++) {
+               destvm->vmid = cpu_to_le32(newvm->vmid);
+               destvm->perm = cpu_to_le32(newvm->perm);
+               destvm->ctx = 0;
+               destvm->ctx_size = 0;
+               next_vm |= BIT(newvm->vmid);
        }
 
        ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,