OSDN Git Service

habanalabs: return block size + block ID
authorOded Gabbay <ogabbay@kernel.org>
Fri, 5 Feb 2021 14:04:34 +0000 (16:04 +0200)
committerOded Gabbay <ogabbay@kernel.org>
Mon, 8 Feb 2021 16:20:08 +0000 (18:20 +0200)
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>
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/memory.c
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/goya/goya.c
include/uapi/misc/habanalabs.h

index 46c37b0..dc9f5a8 100644 (file)
@@ -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);
index 7171e88..7cadf75 100644 (file)
@@ -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:
index f937d90..35342ed 100644 (file)
@@ -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;
 }
index c305246..ed566c5 100644 (file)
@@ -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;
 }
index 64ae83b..5a86b52 100644 (file)
@@ -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;
+               };
        };
 };