]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RAS/AMD/ATL: Replace bitwise_xor_bits() with hweight16()
authorNikolay Borisov <nik.borisov@suse.com>
Mon, 24 Nov 2025 14:25:17 +0000 (16:25 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 24 Nov 2025 16:00:37 +0000 (17:00 +0100)
Doing hweight16() and checking whether the lsb is set is functionally
equivalent to what bitwise_xor_bits() does. In addition, it results in better
generated code as before gcc would inline the function 4 times.  With hweight16(),
the resulting code boils down to 2 instructions -  POPCNT and AND, and all
relevant CPUs support POPCNT.

An alternative would have been to use the __builtin_parity() function provided
by both Clang/GCC, however under some circumstances the compiler can choose not
to inline it but generate a library call which is unsupported in the kernel.

No functional changes.

  [ bp: Massage commit message. ]

Signed-off-by: Nikolay Borisov <nik.borisov@suse.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20251124142517.1708451-1-nik.borisov@suse.com
drivers/ras/amd/atl/umc.c

index 18ce419236a5d46c8b3880223e5cf8611ae7380b..befc616d5e8a87e583735c9bc4b84c965f5de812 100644 (file)
@@ -49,17 +49,6 @@ static u8 get_coh_st_inst_id_mi300(struct atl_err *err)
        return i;
 }
 
-/* XOR the bits in @val. */
-static u16 bitwise_xor_bits(u16 val)
-{
-       u16 tmp = 0;
-       u8 i;
-
-       for (i = 0; i < 16; i++)
-               tmp ^= (val >> i) & 0x1;
-
-       return tmp;
-}
 
 struct xor_bits {
        bool    xor_enable;
@@ -250,17 +239,17 @@ static unsigned long convert_dram_to_norm_addr_mi300(unsigned long addr)
                if (!addr_hash.bank[i].xor_enable)
                        continue;
 
-               temp  = bitwise_xor_bits(col & addr_hash.bank[i].col_xor);
-               temp ^= bitwise_xor_bits(row & addr_hash.bank[i].row_xor);
+               temp  = hweight16(col & addr_hash.bank[i].col_xor) & 1;
+               temp ^= hweight16(row & addr_hash.bank[i].row_xor) & 1;
                bank ^= temp << i;
        }
 
        /* Calculate hash for PC bit. */
        if (addr_hash.pc.xor_enable) {
-               temp  = bitwise_xor_bits(col  & addr_hash.pc.col_xor);
-               temp ^= bitwise_xor_bits(row  & addr_hash.pc.row_xor);
+               temp  = hweight16(col & addr_hash.pc.col_xor) & 1;
+               temp ^= hweight16(row & addr_hash.pc.row_xor) & 1;
                /* Bits SID[1:0] act as Bank[5:4] for PC hash, so apply them here. */
-               temp ^= bitwise_xor_bits((bank | sid << NUM_BANK_BITS) & addr_hash.bank_xor);
+               temp ^= hweight16((bank | sid << NUM_BANK_BITS) & addr_hash.bank_xor) & 1;
                pc   ^= temp;
        }