accel/habanalabs: fix DRAM BAR base address calculation
authorTomer Tayar <ttayar@habana.ai>
Thu, 14 Dec 2023 08:38:06 +0000 (10:38 +0200)
committerOded Gabbay <ogabbay@kernel.org>
Mon, 26 Feb 2024 07:30:40 +0000 (09:30 +0200)
When the DRAM region size in the BAR is not a power of 2, calculating
the corresponding BAR base address should be done using the offset from
the DRAM start address, and not using directly the DRAM address.

Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/accel/habanalabs/common/device.c

index 5eacbc73f1bb989483e816fe8a2072f82e1a6644..5c46826e365929e7fb7c11b599d31153ce6052a0 100644 (file)
@@ -55,7 +55,8 @@ static u64 hl_set_dram_bar(struct hl_device *hdev, u64 addr, struct pci_mem_regi
        if (is_power_of_2(prop->dram_pci_bar_size))
                bar_base_addr = addr & ~(prop->dram_pci_bar_size - 0x1ull);
        else
-               bar_base_addr = DIV_ROUND_DOWN_ULL(addr, prop->dram_pci_bar_size) *
+               bar_base_addr = region->region_base +
+                               div64_u64((addr - region->region_base), prop->dram_pci_bar_size) *
                                prop->dram_pci_bar_size;
 
        old_base = hdev->asic_funcs->set_dram_bar_base(hdev, bar_base_addr);