Commit 6df50d27 authored by Oded Gabbay's avatar Oded Gabbay
Browse files

habanalabs: return block size + block ID



When user gives us a block address to get its ID to mmap it, he also
needs to get from us the block size to pass to the driver in the mmap
function.

Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 5b6b7806
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -862,6 +862,8 @@ enum div_select_defs {
 *                   showing it to users.
 * @ack_protection_bits_errors: ack and dump all security violations
 * @get_hw_block_id: retrieve a HW block id to be used by the user to mmap it.
 *                   also returns the size of the block if caller supplies
 *                   a valid pointer for it
 * @hw_block_mmap: mmap a HW block with a given id.
 * @enable_events_from_fw: send interrupt to firmware to notify them the
 *                         driver is ready to receive asynchronous events. This
@@ -980,7 +982,7 @@ struct hl_asic_funcs {
	u64 (*descramble_addr)(struct hl_device *hdev, u64 addr);
	void (*ack_protection_bits_errors)(struct hl_device *hdev);
	int (*get_hw_block_id)(struct hl_device *hdev, u64 block_addr,
			u32 *block_id);
				u32 *block_size, u32 *block_id);
	int (*hw_block_mmap)(struct hl_device *hdev, struct vm_area_struct *vma,
			u32 block_id, u32 block_size);
	void (*enable_events_from_fw)(struct hl_device *hdev);
+11 −8
Original line number Diff line number Diff line
@@ -1289,12 +1289,13 @@ static int unmap_device_va(struct hl_ctx *ctx, struct hl_mem_in *args,
	return rc;
}

static int map_block(struct hl_device *hdev, u64 address, u64 *handle)
static int map_block(struct hl_device *hdev, u64 address, u64 *handle,
			u32 *size)
{
	u32 block_id = 0;
	int rc;

	rc = hdev->asic_funcs->get_hw_block_id(hdev, address, &block_id);
	rc = hdev->asic_funcs->get_hw_block_id(hdev, address, size, &block_id);

	*handle = block_id | HL_MMAP_TYPE_BLOCK;
	*handle <<= PAGE_SHIFT;
@@ -1371,7 +1372,7 @@ static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args)
	struct hl_device *hdev = hpriv->hdev;
	struct hl_ctx *ctx = hpriv->ctx;
	u64 block_handle, device_addr = 0;
	u32 handle = 0;
	u32 handle = 0, block_size;
	int rc;

	switch (args->in.op) {
@@ -1416,8 +1417,9 @@ static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args)

	case HL_MEM_OP_MAP_BLOCK:
		rc = map_block(hdev, args->in.map_block.block_addr,
							&block_handle);
		args->out.handle = block_handle;
				&block_handle, &block_size);
		args->out.block_handle = block_handle;
		args->out.block_size = block_size;
		break;

	default:
@@ -1437,7 +1439,7 @@ int hl_mem_ioctl(struct hl_fpriv *hpriv, void *data)
	struct hl_device *hdev = hpriv->hdev;
	struct hl_ctx *ctx = hpriv->ctx;
	u64 block_handle, device_addr = 0;
	u32 handle = 0;
	u32 handle = 0, block_size;
	int rc;

	if (!hl_device_operational(hdev, &status)) {
@@ -1524,8 +1526,9 @@ int hl_mem_ioctl(struct hl_fpriv *hpriv, void *data)

	case HL_MEM_OP_MAP_BLOCK:
		rc = map_block(hdev, args->in.map_block.block_addr,
							&block_handle);
		args->out.handle = block_handle;
				&block_handle, &block_size);
		args->out.block_handle = block_handle;
		args->out.block_size = block_size;
		break;

	default:
+1 −1
Original line number Diff line number Diff line
@@ -8490,7 +8490,7 @@ static u64 gaudi_get_device_time(struct hl_device *hdev)
}

static int gaudi_get_hw_block_id(struct hl_device *hdev, u64 block_addr,
					u32 *block_id)
				u32 *block_size, u32 *block_id)
{
	return -EPERM;
}
+1 −1
Original line number Diff line number Diff line
@@ -5390,7 +5390,7 @@ static void goya_ctx_fini(struct hl_ctx *ctx)
}

static int goya_get_hw_block_id(struct hl_device *hdev, u64 block_addr,
				u32 *block_id)
			u32 *block_size, u32 *block_id)
{
	return -EPERM;
}
+21 −6
Original line number Diff line number Diff line
@@ -782,10 +782,10 @@ struct hl_mem_in {
		/* HL_MEM_OP_MAP_BLOCK - map a hw block */
		struct {
			/*
			 * HW block address to map, a handle will be returned
			 * to the user and will be used to mmap the relevant
			 * block. Only addresses from configuration space are
			 * allowed.
			 * HW block address to map, a handle and size will be
			 * returned to the user and will be used to mmap the
			 * relevant block. Only addresses from configuration
			 * space are allowed.
			 */
			__u64 block_addr;
		} map_block;
@@ -816,11 +816,26 @@ struct hl_mem_out {
		__u64 device_virt_addr;

		/*
		 * Used for HL_MEM_OP_ALLOC and HL_MEM_OP_MAP_BLOCK.
		 * Used in HL_MEM_OP_ALLOC
		 * This is the assigned handle for the allocated memory
		 * or mapped block
		 */
		__u64 handle;

		struct {
			/*
			 * Used in HL_MEM_OP_MAP_BLOCK.
			 * This is the assigned handle for the mapped block
			 */
			__u64 block_handle;

			/*
			 * Used in HL_MEM_OP_MAP_BLOCK
			 * This is the size of the mapped block
			 */
			__u32 block_size;

			__u32 pad;
		};
	};
};