From: "Guo Ren (Alibaba DAMO Academy)" <guo...@kernel.org>

The RV32 employs 9-bit asid_bits due to CSR's xlen=32 constraint,
whereas RV64ILP32 ABI, rooted in RV64 ISA, features a 64-bit
satp CSR. Hence, for rv64ilp32 abi, the exact asid mechanism as
in 64-bit architecture is adopted.

Signed-off-by: Guo Ren (Alibaba DAMO Academy) <guo...@kernel.org>
---
 arch/riscv/mm/context.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/arch/riscv/mm/context.c b/arch/riscv/mm/context.c
index 4abe3de23225..c3f9926d9337 100644
--- a/arch/riscv/mm/context.c
+++ b/arch/riscv/mm/context.c
@@ -226,14 +226,18 @@ static inline void set_mm(struct mm_struct *prev,
 
 static int __init asids_init(void)
 {
-       unsigned long asid_bits, old;
+       xlen_t asid_bits, old;
 
        /* Figure-out number of ASID bits in HW */
        old = csr_read(CSR_SATP);
        asid_bits = old | (SATP_ASID_MASK << SATP_ASID_SHIFT);
        csr_write(CSR_SATP, asid_bits);
        asid_bits = (csr_read(CSR_SATP) >> SATP_ASID_SHIFT)  & SATP_ASID_MASK;
-       asid_bits = fls_long(asid_bits);
+#if __riscv_xlen == 64
+       asid_bits = fls64(asid_bits);
+#else
+       asid_bits = fls(asid_bits);
+#endif
        csr_write(CSR_SATP, old);
 
        /*
@@ -265,9 +269,9 @@ static int __init asids_init(void)
                static_branch_enable(&use_asid_allocator);
 
                pr_info("ASID allocator using %lu bits (%lu entries)\n",
-                       asid_bits, num_asids);
+                       (ulong)asid_bits, num_asids);
        } else {
-               pr_info("ASID allocator disabled (%lu bits)\n", asid_bits);
+               pr_info("ASID allocator disabled (%lu bits)\n", 
(ulong)asid_bits);
        }
 
        return 0;
-- 
2.40.1


Reply via email to