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: Oded Gabbay <ogabbay@kernel.org>
This commit is contained in:
Родитель
5b6b780660
Коммит
6df50d2743
|
@ -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);
|
||||
|
|
|
@ -1289,12 +1289,13 @@ vm_type_err:
|
|||
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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче