* [ogabbay:gaudi2 49/51] drivers/misc/habanalabs/gaudi2/gaudi2.c:5809:13: error: call to __compiletime_assert_452 declared with 'error' attribute: FIELD_PREP: value too large for the field
@ 2022-06-26 18:31 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2022-06-26 18:31 UTC (permalink / raw)
To: Oded Gabbay; +Cc: llvm, kbuild-all, linux-kernel
tree: https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git gaudi2
head: 07630ebc57c01dece654dea4d238f18a96851cec
commit: e86cc96aba150c067b57bfb623e093086d372403 [49/51] habanalabs: add gaudi2 asic-specific code
config: x86_64-randconfig-a005
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b0d6dd3905db145853c7c744ac92d49b00b1fa20)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git/commit/?id=e86cc96aba150c067b57bfb623e093086d372403
git remote add ogabbay https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux.git
git fetch --no-tags ogabbay gaudi2
git checkout e86cc96aba150c067b57bfb623e093086d372403
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/misc/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All error/warnings (new ones prefixed by >>):
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:1784:6: warning: no previous prototype for function 'gaudi2_host_phys_addr_valid' [-Wmissing-prototypes]
bool gaudi2_host_phys_addr_valid(u64 addr)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:1784:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
bool gaudi2_host_phys_addr_valid(u64 addr)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:1828:6: warning: variable 'hbm_drv_base_offset' set but not used [-Wunused-but-set-variable]
u64 hbm_drv_base_offset = 0;
^
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:1887:5: warning: no previous prototype for function 'gaudi2_set_fixed_properties' [-Wmissing-prototypes]
int gaudi2_set_fixed_properties(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:1887:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_set_fixed_properties(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2215:5: warning: no previous prototype for function 'gaudi2_set_tpc_binning_masks' [-Wmissing-prototypes]
int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2215:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2273:5: warning: no previous prototype for function 'gaudi2_set_dec_binning_masks' [-Wmissing-prototypes]
int gaudi2_set_dec_binning_masks(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2273:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_set_dec_binning_masks(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2395:5: warning: no previous prototype for function 'gaudi2_set_cluster_binning_masks_common' [-Wmissing-prototypes]
int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2395:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2622:5: warning: no previous prototype for function 'gaudi2_early_fini' [-Wmissing-prototypes]
int gaudi2_early_fini(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2622:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_early_fini(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2744:5: warning: no previous prototype for function 'gaudi2_late_init' [-Wmissing-prototypes]
int gaudi2_late_init(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2744:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_late_init(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2771:6: warning: no previous prototype for function 'gaudi2_late_fini' [-Wmissing-prototypes]
void gaudi2_late_fini(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2771:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_late_fini(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2808:6: warning: no previous prototype for function 'gaudi2_user_mapped_blocks_init' [-Wmissing-prototypes]
void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2808:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2915:6: warning: no previous prototype for function 'gaudi2_set_pci_memory_regions' [-Wmissing-prototypes]
void gaudi2_set_pci_memory_regions(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2915:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_set_pci_memory_regions(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2948:6: warning: no previous prototype for function 'gaudi2_user_interrupt_setup' [-Wmissing-prototypes]
void gaudi2_user_interrupt_setup(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2948:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_user_interrupt_setup(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:2981:5: warning: no previous prototype for function 'gaudi2_sw_init' [-Wmissing-prototypes]
int gaudi2_sw_init(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:2981:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_sw_init(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3081:5: warning: no previous prototype for function 'gaudi2_sw_fini' [-Wmissing-prototypes]
int gaudi2_sw_fini(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3081:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_sw_fini(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3161:6: warning: no previous prototype for function 'gaudi2_stop_dma_qmans' [-Wmissing-prototypes]
void gaudi2_stop_dma_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3161:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_dma_qmans(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3194:6: warning: no previous prototype for function 'gaudi2_stop_mme_qmans' [-Wmissing-prototypes]
void gaudi2_stop_mme_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3194:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_mme_qmans(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3209:6: warning: no previous prototype for function 'gaudi2_stop_tpc_qmans' [-Wmissing-prototypes]
void gaudi2_stop_tpc_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3209:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_tpc_qmans(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3227:6: warning: no previous prototype for function 'gaudi2_stop_rot_qmans' [-Wmissing-prototypes]
void gaudi2_stop_rot_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3227:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_rot_qmans(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3245:6: warning: no previous prototype for function 'gaudi2_stop_nic_qmans' [-Wmissing-prototypes]
void gaudi2_stop_nic_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3245:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_nic_qmans(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3273:6: warning: no previous prototype for function 'gaudi2_dma_stall' [-Wmissing-prototypes]
void gaudi2_dma_stall(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3273:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_dma_stall(struct hl_device *hdev)
^
static
>> drivers/misc/habanalabs/gaudi2/gaudi2.c:3305:6: warning: no previous prototype for function 'gaudi2_mme_stall' [-Wmissing-prototypes]
void gaudi2_mme_stall(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3305:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_mme_stall(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3317:6: warning: no previous prototype for function 'gaudi2_tpc_stall' [-Wmissing-prototypes]
void gaudi2_tpc_stall(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3317:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_tpc_stall(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3335:6: warning: no previous prototype for function 'gaudi2_rotator_stall' [-Wmissing-prototypes]
void gaudi2_rotator_stall(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3335:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_rotator_stall(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3361:6: warning: no previous prototype for function 'gaudi2_disable_dma_qmans' [-Wmissing-prototypes]
void gaudi2_disable_dma_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3361:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_disable_dma_qmans(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3393:6: warning: no previous prototype for function 'gaudi2_disable_mme_qmans' [-Wmissing-prototypes]
void gaudi2_disable_mme_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3393:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_disable_mme_qmans(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3405:6: warning: no previous prototype for function 'gaudi2_disable_tpc_qmans' [-Wmissing-prototypes]
void gaudi2_disable_tpc_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3405:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_disable_tpc_qmans(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3423:6: warning: no previous prototype for function 'gaudi2_disable_rot_qmans' [-Wmissing-prototypes]
void gaudi2_disable_rot_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3423:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_disable_rot_qmans(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3441:6: warning: no previous prototype for function 'gaudi2_disable_nic_qmans' [-Wmissing-prototypes]
void gaudi2_disable_nic_qmans(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3441:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_disable_nic_qmans(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3775:6: warning: no previous prototype for function 'gaudi2_stop_dec' [-Wmissing-prototypes]
void gaudi2_stop_dec(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3775:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_stop_dec(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3800:6: warning: no previous prototype for function 'gaudi2_halt_arcs' [-Wmissing-prototypes]
void gaudi2_halt_arcs(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3800:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_halt_arcs(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3810:6: warning: no previous prototype for function 'gaudi2_reset_arcs' [-Wmissing-prototypes]
void gaudi2_reset_arcs(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3810:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_reset_arcs(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3823:6: warning: no previous prototype for function 'gaudi2_nic_qmans_manual_flush' [-Wmissing-prototypes]
void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3823:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3890:5: warning: no previous prototype for function 'gaudi2_load_firmware_to_device' [-Wmissing-prototypes]
int gaudi2_load_firmware_to_device(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3890:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int gaudi2_load_firmware_to_device(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3899:6: warning: no previous prototype for function 'gaudi2_init_firmware_loader' [-Wmissing-prototypes]
void gaudi2_init_firmware_loader(struct hl_device *hdev)
^
drivers/misc/habanalabs/gaudi2/gaudi2.c:3899:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void gaudi2_init_firmware_loader(struct hl_device *hdev)
^
static
drivers/misc/habanalabs/gaudi2/gaudi2.c:3932:5: warning: no previous prototype for function 'gaudi2_init_cpu' [-Wmissing-prototypes]
int gaudi2_init_cpu(struct hl_device *hdev)
^
vim +/error +5809 drivers/misc/habanalabs/gaudi2/gaudi2.c
5615
> 5616 void *gaudi2_dma_alloc_coherent(struct hl_device *hdev, size_t size,
5617 dma_addr_t *dma_handle, gfp_t flags)
5618 {
5619 return dma_alloc_coherent(&hdev->pdev->dev, size, dma_handle, flags);
5620 }
5621
> 5622 void gaudi2_dma_free_coherent(struct hl_device *hdev, size_t size,
5623 void *cpu_addr, dma_addr_t dma_handle)
5624 {
5625 dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, dma_handle);
5626 }
5627
> 5628 int gaudi2_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,
5629 u32 timeout, u64 *result)
5630 {
5631 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5632
5633 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)) {
5634 if (result)
5635 *result = 0;
5636 return 0;
5637 }
5638
5639 if (!timeout)
5640 timeout = GAUDI2_MSG_TO_CPU_TIMEOUT_USEC;
5641
5642 return hl_fw_send_cpu_message(hdev, GAUDI2_QUEUE_ID_CPU_PQ, msg, len, timeout, result);
5643 }
5644
> 5645 void *gaudi2_dma_pool_zalloc(struct hl_device *hdev, size_t size,
5646 gfp_t mem_flags, dma_addr_t *dma_handle)
5647 {
5648 if (size > GAUDI2_DMA_POOL_BLK_SIZE)
5649 return NULL;
5650
5651 return dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);
5652 }
5653
> 5654 void gaudi2_dma_pool_free(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr)
5655 {
5656 dma_pool_free(hdev->dma_pool, vaddr, dma_addr);
5657 }
5658
> 5659 void *gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,
5660 dma_addr_t *dma_handle)
5661 {
5662 return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
5663 }
5664
> 5665 void gaudi2_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)
5666 {
5667 hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);
5668 }
5669
5670 static dma_addr_t gaudi2_dma_map_single(struct hl_device *hdev, void *addr, int len,
5671 enum dma_data_direction dir)
5672 {
5673 dma_addr_t dma_addr;
5674
5675 dma_addr = dma_map_single(&hdev->pdev->dev, addr, len, dir);
5676 if (unlikely(dma_mapping_error(&hdev->pdev->dev, dma_addr)))
5677 return 0;
5678
5679 return dma_addr;
5680 }
5681
5682 static void gaudi2_dma_unmap_single(struct hl_device *hdev, dma_addr_t addr, int len,
5683 enum dma_data_direction dir)
5684 {
5685 dma_unmap_single(&hdev->pdev->dev, addr, len, dir);
5686 }
5687
5688 static int gaudi2_validate_cb_address(struct hl_device *hdev, struct hl_cs_parser *parser)
5689 {
5690 struct asic_fixed_properties *asic_prop = &hdev->asic_prop;
5691 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5692
5693 if (!gaudi2_is_queue_enabled(hdev, parser->hw_queue_id)) {
5694 dev_err(hdev->dev, "h/w queue %d is disabled\n", parser->hw_queue_id);
5695 return -EINVAL;
5696 }
5697
5698 /* Just check if CB address is valid */
5699
5700 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5701 parser->user_cb_size,
5702 asic_prop->sram_user_base_address,
5703 asic_prop->sram_end_address))
5704 return 0;
5705
5706 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5707 parser->user_cb_size,
5708 asic_prop->dram_user_base_address,
5709 asic_prop->dram_end_address))
5710 return 0;
5711
5712 if ((gaudi2->hw_cap_initialized & HW_CAP_DMMU_MASK) &&
5713 hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5714 parser->user_cb_size,
5715 asic_prop->dmmu.start_addr,
5716 asic_prop->dmmu.end_addr))
5717 return 0;
5718
5719 if (gaudi2->hw_cap_initialized & HW_CAP_PMMU) {
5720 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5721 parser->user_cb_size,
5722 asic_prop->pmmu.start_addr,
5723 asic_prop->pmmu.end_addr) ||
5724 hl_mem_area_inside_range(
5725 (u64) (uintptr_t) parser->user_cb,
5726 parser->user_cb_size,
5727 asic_prop->pmmu_huge.start_addr,
5728 asic_prop->pmmu_huge.end_addr))
5729 return 0;
5730
5731 } else if (gaudi2_host_phys_addr_valid((u64) (uintptr_t) parser->user_cb)) {
5732 if (!hdev->pdev)
5733 return 0;
5734
5735 if (!device_iommu_mapped(&hdev->pdev->dev))
5736 return 0;
5737 }
5738
5739 dev_err(hdev->dev, "CB address %p + 0x%x for internal QMAN is not valid\n",
5740 parser->user_cb, parser->user_cb_size);
5741
5742 return -EFAULT;
5743 }
5744
> 5745 int gaudi2_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
5746 {
5747 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5748
5749 if (!parser->is_kernel_allocated_cb)
5750 return gaudi2_validate_cb_address(hdev, parser);
5751
5752 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
5753 dev_err(hdev->dev, "PMMU not initialized - Unsupported mode in Gaudi2\n");
5754 return -EINVAL;
5755 }
5756
5757 return 0;
5758 }
5759
> 5760 int gaudi2_send_heartbeat(struct hl_device *hdev)
5761 {
5762 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5763
5764 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
5765 return 0;
5766
5767 return hl_fw_send_heartbeat(hdev);
5768 }
5769
5770 /* This is an internal helper function, used to update the KDMA mmu props.
5771 * Should be called with a proper kdma lock.
5772 */
5773 static void gaudi2_kdma_set_mmbp_asid(struct hl_device *hdev,
5774 bool mmu_bypass, u32 asid)
5775 {
5776 u32 rw_asid, rw_mmu_bp;
5777
5778 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
5779 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
5780
5781 rw_mmu_bp = (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_SHIFT) |
5782 (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_SHIFT);
5783
5784 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_ASID, rw_asid);
5785 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP, rw_mmu_bp);
5786 }
5787
5788 static void gaudi2_arm_cq_monitor(struct hl_device *hdev, u32 index, u32 cq_id,
5789 u32 mon_payload, u32 sync_value)
5790 {
5791 int offset = index * 4;
5792 u32 sync_group_id, mask, mode, mon_arm;
5793
5794 /* Reset the SOB value */
5795 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset, 0);
5796
5797 /* Configure this address with CQ_ID 0 because CQ_EN is set */
5798 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + offset, cq_id);
5799
5800 /* Configure this address with CS index because CQ_EN is set */
5801 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + offset, mon_payload);
5802
5803 sync_group_id = index / 8;
5804 mask = ~(1 << (index & 0x7));
5805 mode = 1; /* comparison mode is "equal to" */
5806
5807 mon_arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, sync_value);
5808 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode);
> 5809 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask);
5810 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sync_group_id);
5811 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + offset, mon_arm);
5812 }
5813
5814 /* This is an internal helper function used by gaudi2_send_job_to_kdma only */
5815 static int gaudi2_send_job_to_kdma(struct hl_device *hdev,
5816 u64 src_addr, u64 dst_addr,
5817 u32 size, bool is_memset)
5818 {
5819 u32 comp_val, commit_mask, *polling_addr, timeout, status = 0;
5820 struct hl_cq_entry *cq_base;
5821 struct hl_cq *cq;
5822 u64 comp_addr;
5823 int rc;
5824
5825 gaudi2_arm_cq_monitor(hdev, GAUDI2_RESERVED_SOB_KDMA_COMP,
5826 GAUDI2_RESERVED_CQ_KDMA_COMPLETION, 1, 1);
5827
5828 comp_addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 +
5829 (GAUDI2_RESERVED_SOB_KDMA_COMP * sizeof(u32));
5830
5831 comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |
5832 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);
5833
5834 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_LO, lower_32_bits(src_addr));
5835 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_HI, upper_32_bits(src_addr));
5836 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_LO, lower_32_bits(dst_addr));
5837 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_HI, upper_32_bits(dst_addr));
5838 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_LO, lower_32_bits(comp_addr));
5839 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_HI, upper_32_bits(comp_addr));
5840 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_WDATA, comp_val);
5841 WREG32(mmARC_FARM_KDMA_CTX_DST_TSIZE_0, size);
5842
5843 commit_mask = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |
5844 FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);
5845
5846 if (is_memset)
5847 commit_mask |= FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1);
5848
5849 WREG32(mmARC_FARM_KDMA_CTX_COMMIT, commit_mask);
5850
5851 /* Wait for completion */
5852 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_KDMA_COMPLETION];
5853 cq_base = cq->kernel_address;
5854 polling_addr = (u32 *)&cq_base[cq->ci];
5855
5856 if (hdev->pldm)
5857 /* for each 1MB 20 second of timeout */
5858 timeout = ((size / SZ_1M) + 1) * USEC_PER_SEC * 20;
5859 else
5860 timeout = KDMA_TIMEOUT_USEC;
5861
5862 /* Polling */
5863 rc = hl_poll_timeout_memory(
5864 hdev,
5865 polling_addr,
5866 status,
5867 (status == 1),
5868 1000,
5869 timeout,
5870 true);
5871
5872 *polling_addr = 0;
5873
5874 if (rc) {
5875 dev_err(hdev->dev, "Timeout while waiting for KDMA to be idle\n");
5876 WREG32(mmARC_FARM_KDMA_CFG_1, 1 << ARC_FARM_KDMA_CFG_1_HALT_SHIFT);
5877 return rc;
5878 }
5879
5880 cq->ci = hl_cq_inc_ptr(cq->ci);
5881
5882 return 0;
5883 }
5884
5885 static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val)
5886 {
5887 u32 i;
5888
5889 for (i = 0 ; i < size ; i += sizeof(u32))
5890 WREG32(addr + i, val);
5891 }
5892
5893 static void gaudi2_qman_set_test_mode(struct hl_device *hdev, u32 hw_queue_id, bool enable)
5894 {
5895 u32 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
5896
5897 if (enable) {
5898 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED_TEST_MODE);
5899 WREG32(reg_base + QM_PQC_CFG_OFFSET, 0);
5900 } else {
5901 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED);
5902 WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);
5903 }
5904 }
5905
5906 static int gaudi2_test_queue(struct hl_device *hdev, u32 hw_queue_id)
5907 {
5908 u32 sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;
5909 u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
5910 u32 timeout_usec, tmp, sob_base = 1, sob_val = 0x5a5a;
5911 struct packet_msg_short *msg_short_pkt;
5912 dma_addr_t pkt_dma_addr;
5913 size_t pkt_size;
5914 int rc;
5915
5916 if (hdev->pldm)
5917 timeout_usec = GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC;
5918 else
5919 timeout_usec = GAUDI2_TEST_QUEUE_WAIT_USEC;
5920
5921 pkt_size = sizeof(*msg_short_pkt);
5922 msg_short_pkt = hl_asic_dma_pool_zalloc(hdev, pkt_size, GFP_KERNEL, &pkt_dma_addr);
5923 if (!msg_short_pkt) {
5924 dev_err(hdev->dev, "Failed to allocate packet for H/W queue %d testing\n",
5925 hw_queue_id);
5926 return -ENOMEM;
5927 }
5928
5929 tmp = (PACKET_MSG_SHORT << GAUDI2_PKT_CTL_OPCODE_SHIFT) |
5930 (1 << GAUDI2_PKT_CTL_EB_SHIFT) |
5931 (1 << GAUDI2_PKT_CTL_MB_SHIFT) |
5932 (sob_base << GAUDI2_PKT_SHORT_CTL_BASE_SHIFT) |
5933 (sob_offset << GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT);
5934
5935 msg_short_pkt->value = cpu_to_le32(sob_val);
5936 msg_short_pkt->ctl = cpu_to_le32(tmp);
5937
5938 /* Reset the SOB value */
5939 WREG32(sob_addr, 0);
5940
5941 rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, pkt_dma_addr);
5942 if (rc) {
5943 dev_err(hdev->dev, "Failed to send msg_short packet to H/W queue %d\n",
5944 hw_queue_id);
5945 goto free_pkt;
5946 }
5947
5948 rc = hl_poll_timeout(
5949 hdev,
5950 sob_addr,
5951 tmp,
5952 (tmp == sob_val),
5953 1000,
5954 timeout_usec);
5955
5956 if (rc == -ETIMEDOUT) {
5957 dev_err(hdev->dev, "H/W queue %d test failed (SOB_OBJ_0 == 0x%x)\n",
5958 hw_queue_id, tmp);
5959 rc = -EIO;
5960 }
5961
5962 /* Reset the SOB value */
5963 WREG32(sob_addr, 0);
5964
5965 free_pkt:
5966 hl_asic_dma_pool_free(hdev, (void *) msg_short_pkt, pkt_dma_addr);
5967 return rc;
5968 }
5969
> 5970 int gaudi2_test_cpu_queue(struct hl_device *hdev)
5971 {
5972 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5973
5974 /*
5975 * check capability here as send_cpu_message() won't update the result
5976 * value if no capability
5977 */
5978 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
5979 return 0;
5980
5981 return hl_fw_test_cpu_queue(hdev);
5982 }
5983
> 5984 int gaudi2_test_queues(struct hl_device *hdev)
5985 {
5986 int i, rc, ret_val = 0;
5987
5988 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {
5989 if (!gaudi2_is_queue_enabled(hdev, i))
5990 continue;
5991
5992 gaudi2_qman_set_test_mode(hdev, i, true);
5993 rc = gaudi2_test_queue(hdev, i);
5994 gaudi2_qman_set_test_mode(hdev, i, false);
5995
5996 if (rc) {
5997 ret_val = -EINVAL;
5998 goto done;
5999 }
6000 }
6001
6002 rc = gaudi2_test_cpu_queue(hdev);
6003 if (rc) {
6004 ret_val = -EINVAL;
6005 goto done;
6006 }
6007
6008 done:
6009 return ret_val;
6010 }
6011
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-26 18:32 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-26 18:31 [ogabbay:gaudi2 49/51] drivers/misc/habanalabs/gaudi2/gaudi2.c:5809:13: error: call to __compiletime_assert_452 declared with 'error' attribute: FIELD_PREP: value too large for the field kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.