*                              devices)
  * @configurable_stop_on_err: is stop-on-error option configurable via debugfs.
  * @set_max_power_on_device_init: true if need to set max power in F/W on device init.
+ * @supports_user_set_page_size: true if user can set the allocation page size.
  */
 struct asic_fixed_properties {
        struct hw_queue_properties      *hw_queues_props;
        u8                              allow_inference_soft_reset;
        u8                              configurable_stop_on_err;
        u8                              set_max_power_on_device_init;
+       u8                              supports_user_set_page_size;
 };
 
 /**
  * @get_sob_addr: get SOB base address offset.
  * @set_pci_memory_regions: setting properties of PCI memory regions
  * @get_stream_master_qid_arr: get pointer to stream masters QID array
+ * @is_valid_dram_page_size: return true if page size is supported in device
+ *                           memory allocation, otherwise false.
  */
 struct hl_asic_funcs {
        int (*early_init)(struct hl_device *hdev);
        u32 (*get_sob_addr)(struct hl_device *hdev, u32 sob_id);
        void (*set_pci_memory_regions)(struct hl_device *hdev);
        u32* (*get_stream_master_qid_arr)(void);
+       bool (*is_valid_dram_page_size)(u32 page_size);
 };
 
 
 
 static int allocate_timestamps_buffers(struct hl_fpriv *hpriv,
                        struct hl_mem_in *args, u64 *handle);
 
+static int set_alloc_page_size(struct hl_device *hdev, struct hl_mem_in *args, u32 *page_size)
+{
+       struct asic_fixed_properties *prop = &hdev->asic_prop;
+       u32 psize;
+
+       /*
+        * for ASIC that supports setting the allocation page size by user we will address
+        * user's choice only if it is not 0 (as 0 means taking the default page size)
+        */
+       if (prop->supports_user_set_page_size && args->alloc.page_size) {
+               psize = args->alloc.page_size;
+
+               if (!hdev->asic_funcs->is_valid_dram_page_size(psize)) {
+                       dev_err(hdev->dev, "user page size (%#x) is not valid\n", psize);
+                       return -EINVAL;
+               }
+       } else {
+               psize = hdev->asic_prop.dram_page_size;
+       }
+
+       *page_size = psize;
+
+       return 0;
+}
+
 /*
  * The va ranges in context object contain a list with the available chunks of
  * device virtual memory.
        bool contiguous;
 
        num_curr_pgs = 0;
-       page_size = hdev->asic_prop.dram_page_size;
+
+       rc = set_alloc_page_size(hdev, args, &page_size);
+       if (rc)
+               return rc;
+
        num_pgs = DIV_ROUND_UP_ULL(args->alloc.mem_size, page_size);
        total_size = num_pgs * page_size;
 
 
        .state_dump_init = gaudi_state_dump_init,
        .get_sob_addr = gaudi_get_sob_addr,
        .set_pci_memory_regions = gaudi_set_pci_memory_regions,
-       .get_stream_master_qid_arr = gaudi_get_stream_master_qid_arr
+       .get_stream_master_qid_arr = gaudi_get_stream_master_qid_arr,
+       .is_valid_dram_page_size = NULL
 };
 
 /**
 
        .get_sob_addr = &goya_get_sob_addr,
        .set_pci_memory_regions = goya_set_pci_memory_regions,
        .get_stream_master_qid_arr = goya_get_stream_master_qid_arr,
+       .is_valid_dram_page_size = NULL
 };
 
 /*
 
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
  *
- * Copyright 2016-2021 HabanaLabs, Ltd.
+ * Copyright 2016-2022 HabanaLabs, Ltd.
  * All Rights Reserved.
  *
  */
                /**
                 * structure for device memory allocation (used with the HL_MEM_OP_ALLOC op)
                 * @mem_size: memory size to allocate
+                * @page_size: page size to use on allocation. when the value is 0 the default page
+                *             size will be taken.
                 */
                struct {
                        __u64 mem_size;
+                       __u64 page_size;
                } alloc;
 
                /**