| From 35a10028af4a2d44e55e08b6561914c1194822eb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 3 Jun 2021 00:24:32 +0300 |
| Subject: habanalabs: fix mask to obtain page offset |
| |
| From: Ohad Sharabi <osharabi@habana.ai> |
| |
| [ Upstream commit 0f37510ca34848718db1003479bb4671e8f3c112 ] |
| |
| When converting virtual address to physical we need to add correct |
| offset to the physical page. |
| |
| For this we need to use mask that include ALL bits of page offset. |
| |
| Signed-off-by: Ohad Sharabi <osharabi@habana.ai> |
| Reviewed-by: Oded Gabbay <ogabbay@kernel.org> |
| Signed-off-by: Oded Gabbay <ogabbay@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/misc/habanalabs/common/mmu/mmu.c | 14 +++++++++++--- |
| 1 file changed, 11 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/misc/habanalabs/common/mmu/mmu.c b/drivers/misc/habanalabs/common/mmu/mmu.c |
| index 93c9e5f587e1..86dfa7c41ee7 100644 |
| --- a/drivers/misc/habanalabs/common/mmu/mmu.c |
| +++ b/drivers/misc/habanalabs/common/mmu/mmu.c |
| @@ -501,12 +501,20 @@ static void hl_mmu_pa_page_with_offset(struct hl_ctx *ctx, u64 virt_addr, |
| |
| if ((hops->range_type == HL_VA_RANGE_TYPE_DRAM) && |
| !is_power_of_2(prop->dram_page_size)) { |
| - u32 bit; |
| + unsigned long dram_page_size = prop->dram_page_size; |
| u64 page_offset_mask; |
| u64 phys_addr_mask; |
| + u32 bit; |
| |
| - bit = __ffs64((u64)prop->dram_page_size); |
| - page_offset_mask = ((1ull << bit) - 1); |
| + /* |
| + * find last set bit in page_size to cover all bits of page |
| + * offset. note that 1 has to be added to bit index. |
| + * note that the internal ulong variable is used to avoid |
| + * alignment issue. |
| + */ |
| + bit = find_last_bit(&dram_page_size, |
| + sizeof(dram_page_size) * BITS_PER_BYTE) + 1; |
| + page_offset_mask = (BIT_ULL(bit) - 1); |
| phys_addr_mask = ~page_offset_mask; |
| *phys_addr = (tmp_phys_addr & phys_addr_mask) | |
| (virt_addr & page_offset_mask); |
| -- |
| 2.30.2 |
| |