habanalabs: support debugfs Byte access to device DRAM

The habanalabs HW requires memory resources to be used by its
internal hardware structures. These structures are allocated and
initialized by the driver. We would like to use the device HBM for
that purpose. This memory is io-remapped and accessed using the
writel()/writeb()/writew() commands.
Since some of the HW structures are one byte in size we need to
add support for the  writeb() and readb() functions in the driver.

Signed-off-by: Moti Haimovski <mhaimovski@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Moti Haimovski 2022-04-05 11:45:51 +03:00 committed by Greg Kroah-Hartman
parent ab4ea58728
commit 0ff1d6f8f5
3 changed files with 17 additions and 0 deletions

View File

@ -688,6 +688,9 @@ static void hl_access_host_mem(struct hl_device *hdev, u64 addr, u64 *val,
case DEBUGFS_WRITE64: case DEBUGFS_WRITE64:
*(u64 *) phys_to_virt(addr - offset) = *val; *(u64 *) phys_to_virt(addr - offset) = *val;
break; break;
default:
dev_err(hdev->dev, "hostmem access-type %d id not supported\n", acc_type);
break;
} }
} }

View File

@ -53,6 +53,14 @@ static int hl_access_sram_dram_region(struct hl_device *hdev, u64 addr, u64 *val
} }
switch (acc_type) { switch (acc_type) {
case DEBUGFS_READ8:
*val = readb(hdev->pcie_bar[region->bar_id] +
addr - region->region_base + region->offset_in_bar);
break;
case DEBUGFS_WRITE8:
writeb(*val, hdev->pcie_bar[region->bar_id] +
addr - region->region_base + region->offset_in_bar);
break;
case DEBUGFS_READ32: case DEBUGFS_READ32:
*val = readl(hdev->pcie_bar[region->bar_id] + *val = readl(hdev->pcie_bar[region->bar_id] +
addr - region->region_base + region->offset_in_bar); addr - region->region_base + region->offset_in_bar);
@ -148,7 +156,11 @@ int hl_access_cfg_region(struct hl_device *hdev, u64 addr, u64 *val,
WREG32(addr - cfg_region->region_base, lower_32_bits(*val)); WREG32(addr - cfg_region->region_base, lower_32_bits(*val));
WREG32(addr + sizeof(u32) - cfg_region->region_base, upper_32_bits(*val)); WREG32(addr + sizeof(u32) - cfg_region->region_base, upper_32_bits(*val));
break; break;
default:
dev_err(hdev->dev, "access type %d is not supported\n", acc_type);
return -EOPNOTSUPP;
} }
return 0; return 0;
} }

View File

@ -1100,6 +1100,8 @@ enum div_select_defs {
}; };
enum debugfs_access_type { enum debugfs_access_type {
DEBUGFS_READ8,
DEBUGFS_WRITE8,
DEBUGFS_READ32, DEBUGFS_READ32,
DEBUGFS_WRITE32, DEBUGFS_WRITE32,
DEBUGFS_READ64, DEBUGFS_READ64,