All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
@ 2022-03-17  7:00 kernel test robot
  2022-03-20 15:31 ` kernel test robot
  0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2022-03-17  7:00 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 22969 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220316114129.2520107-3-ogabbay@kernel.org>
References: <20220316114129.2520107-3-ogabbay@kernel.org>
TO: Oded Gabbay <ogabbay@kernel.org>

Hi Oded,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
:::::: branch date: 19 hours ago
:::::: commit date: 19 hours ago
config: riscv-randconfig-c006-20220313 (https://download.01.org/0day-ci/archive/20220317/202203171437.0m4BxdYd-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
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
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
        git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   Suppressed 10 warnings (2 in non-user code, 8 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/iio/dac/ad5761.c:63:8: warning: Excessive padding in 'struct ad5761_state' (67 padding bytes, where 3 is optimal). 
   Optimal fields order: 
   data, 
   vref, 
   spi, 
   vref_reg, 
   lock, 
   range, 
   use_intref, 
   consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
   struct ad5761_state {
   ~~~~~~~^~~~~~~~~~~~~~
   drivers/iio/dac/ad5761.c:63:8: note: Excessive padding in 'struct ad5761_state' (67 padding bytes, where 3 is optimal). Optimal fields order: data, vref, spi, vref_reg, lock, range, use_intref, consider reordering the fields or adding explicit padding members
   struct ad5761_state {
   ~~~~~~~^~~~~~~~~~~~~~
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/misc/genwqe/card_base.c:522:3: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores]
                   err = -ENODEV;
                   ^     ~~~~~~~
   drivers/misc/genwqe/card_base.c:522:3: note: Value stored to 'err' is never read
                   err = -ENODEV;
                   ^     ~~~~~~~
   drivers/misc/genwqe/card_base.c:921:3: warning: Value stored to 'rc' is never read [clang-analyzer-deadcode.DeadStores]
                   rc = wait_event_interruptible_timeout(cd->health_waitq,
                   ^
   drivers/misc/genwqe/card_base.c:921:3: note: Value stored to 'rc' is never read
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   13 warnings generated.
>> drivers/misc/habanalabs/common/mmu/mmu.c:220:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
           prop = &hdev->asic_prop;
           ^      ~~~~~~~~~~~~~~~~
   drivers/misc/habanalabs/common/mmu/mmu.c:220:2: note: Value stored to 'prop' is never read
           prop = &hdev->asic_prop;
           ^      ~~~~~~~~~~~~~~~~
   drivers/misc/habanalabs/common/mmu/mmu.c:287:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
           prop = &hdev->asic_prop;
           ^      ~~~~~~~~~~~~~~~~
   drivers/misc/habanalabs/common/mmu/mmu.c:287:2: note: Value stored to 'prop' is never read
           prop = &hdev->asic_prop;
           ^      ~~~~~~~~~~~~~~~~
   Suppressed 11 warnings (2 in non-user code, 9 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   drivers/misc/habanalabs/common/mmu/mmu_v1.c:381:2: warning: Value stored to 'hop2_pte_addr' is never read [clang-analyzer-deadcode.DeadStores]
           hop2_pte_addr = hop2_addr;
           ^               ~~~~~~~~~
   drivers/misc/habanalabs/common/mmu/mmu_v1.c:381:2: note: Value stored to 'hop2_pte_addr' is never read
           hop2_pte_addr = hop2_addr;
           ^               ~~~~~~~~~
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/iio/frequency/ad9523.c:266:8: warning: Excessive padding in 'struct ad9523_state' (110 padding bytes, where 46 is optimal). 
   Optimal fields order: 
   data, 
   spi, 
   reg, 
   pdata, 
   pwrdown_gpio, 
   reset_gpio, 
   sync_gpio, 
   vcxo_freq, 
   vco_freq, 
   vco_out_freq, 
   lock, 
   ad9523_channels, 
   vco_out_map, 
   consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
   struct ad9523_state {
   ~~~~~~~^~~~~~~~~~~~~~
   drivers/iio/frequency/ad9523.c:266:8: note: Excessive padding in 'struct ad9523_state' (110 padding bytes, where 46 is optimal). Optimal fields order: data, spi, reg, pdata, pwrdown_gpio, reset_gpio, sync_gpio, vcxo_freq, vco_freq, vco_out_freq, lock, ad9523_channels, vco_out_map, consider reordering the fields or adding explicit padding members
   struct ad9523_state {
   ~~~~~~~^~~~~~~~~~~~~~
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/iio/frequency/adf4350.c:33:8: warning: Excessive padding in 'struct adf4350_state' (100 padding bytes, where 36 is optimal). 
   Optimal fields order: 
   val, 
   r0_fract, 
   spi, 
   reg, 
   lock_detect_gpiod, 
   pdata, 
   clk, 
   clkin, 
   chspc, 
   fpfd, 
   min_out_freq, 
   freq_req, 
   regs, 
   regs_hw, 
   lock, 
   r0_int, 
   r1_mod, 
   r4_rf_div_sel, 

vim +/prop +220 drivers/misc/habanalabs/common/mmu/mmu.c

9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  184  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  185  /*
5c05487f155093 drivers/misc/habanalabs/common/mmu.c     Ofir Bitton    2020-10-22  186   * hl_mmu_unmap_page - unmaps a virtual addr
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  187   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  188   * @ctx: pointer to the context structure
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  189   * @virt_addr: virt addr to map from
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  190   * @page_size: size of the page to unmap
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  191   * @flush_pte: whether to do a PCI flush
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  192   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  193   * This function does the following:
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  194   * - Check that the virt addr is mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  195   * - Unmap the virt addr and frees pgts if possible
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  196   * - Returns 0 on success, -EINVAL if the given addr is not mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  197   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  198   * Because this function changes the page tables in the device and because it
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  199   * changes the MMU hash, it must be protected by a lock.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  200   * However, because it maps only a single page, the lock should be implemented
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  201   * in a higher level in order to protect the entire mapping of the memory area
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  202   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  203   * For optimization reasons PCI flush may be requested once after unmapping of
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  204   * large area.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  205   */
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  206  int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  207  {
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  208  	struct hl_device *hdev = ctx->hdev;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  209  	struct asic_fixed_properties *prop;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  210  	struct hl_mmu_properties *mmu_prop;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  211  	struct hl_mmu_funcs *mmu_funcs;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  212  	int i, pgt_residency, rc = 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  213  	u32 real_page_size, npages;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  214  	u64 real_virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  215  	bool is_dram_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  216  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  217  	if (!hdev->mmu_enable)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  218  		return 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  219  
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16 @220  	prop = &hdev->asic_prop;
9488307a555925 drivers/misc/habanalabs/common/mmu.c     Oded Gabbay    2021-01-11  221  	is_dram_addr = hl_is_dram_va(hdev, virt_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  222  	mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  223  
ccf979ee330b19 drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-10-05  224  	pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  225  	mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  226  
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  227  	rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  228  							is_dram_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  229  	if (rc)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  230  		return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  231  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  232  	npages = page_size / real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  233  	real_virt_addr = virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  234  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  235  	for (i = 0 ; i < npages ; i++) {
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  236  		rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  237  		if (rc)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  238  			break;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  239  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  240  		real_virt_addr += real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  241  	}
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  242  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  243  	if (flush_pte)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  244  		mmu_funcs->flush(ctx);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  245  
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  246  	return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  247  }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  248  

---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
  2022-03-17  7:00 [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific kernel test robot
@ 2022-03-20 15:31 ` kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2022-03-20 15:31 UTC (permalink / raw)
  To: Oded Gabbay; +Cc: llvm, kbuild-all, Ohad Sharabi

Hi Oded,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
config: riscv-randconfig-c006-20220313 (https://download.01.org/0day-ci/archive/20220317/202203171437.0m4BxdYd-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
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
         # install riscv cross compiling tool for clang build
         # apt-get install binutils-riscv64-linux-gnu
         # https://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
         git remote add linux-review https://github.com/0day-ci/linux
         git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
         git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
         # save the config file to linux build tree
         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <yujie.liu@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)

 >> drivers/misc/habanalabs/common/mmu/mmu.c:220:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
            prop = &hdev->asic_prop;
            ^      ~~~~~~~~~~~~~~~~

vim +/prop +220 drivers/misc/habanalabs/common/mmu/mmu.c

9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  184
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  185  /*
5c05487f155093 drivers/misc/habanalabs/common/mmu.c     Ofir Bitton    2020-10-22  186   * hl_mmu_unmap_page - unmaps a virtual addr
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  187   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  188   * @ctx: pointer to the context structure
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  189   * @virt_addr: virt addr to map from
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  190   * @page_size: size of the page to unmap
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  191   * @flush_pte: whether to do a PCI flush
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  192   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  193   * This function does the following:
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  194   * - Check that the virt addr is mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  195   * - Unmap the virt addr and frees pgts if possible
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  196   * - Returns 0 on success, -EINVAL if the given addr is not mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  197   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  198   * Because this function changes the page tables in the device and because it
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  199   * changes the MMU hash, it must be protected by a lock.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  200   * However, because it maps only a single page, the lock should be implemented
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  201   * in a higher level in order to protect the entire mapping of the memory area
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  202   *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  203   * For optimization reasons PCI flush may be requested once after unmapping of
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  204   * large area.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  205   */
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  206  int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  207  {
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  208  	struct hl_device *hdev = ctx->hdev;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16 @209  	struct asic_fixed_properties *prop;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  210  	struct hl_mmu_properties *mmu_prop;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  211  	struct hl_mmu_funcs *mmu_funcs;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  212  	int i, pgt_residency, rc = 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  213  	u32 real_page_size, npages;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  214  	u64 real_virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  215  	bool is_dram_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  216
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  217  	if (!hdev->mmu_enable)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  218  		return 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  219
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16 @220  	prop = &hdev->asic_prop;
9488307a555925 drivers/misc/habanalabs/common/mmu.c     Oded Gabbay    2021-01-11  221  	is_dram_addr = hl_is_dram_va(hdev, virt_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  222  	mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  223
ccf979ee330b19 drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-10-05  224  	pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  225  	mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  226
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  227  	rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  228  							is_dram_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  229  	if (rc)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  230  		return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  231
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  232  	npages = page_size / real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  233  	real_virt_addr = virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  234
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  235  	for (i = 0 ; i < npages ; i++) {
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  236  		rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  237  		if (rc)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  238  			break;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  239
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  240  		real_virt_addr += real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  241  	}
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  242
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  243  	if (flush_pte)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi   2022-03-16  244  		mmu_funcs->flush(ctx);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  245
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  246  	return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  247  }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c     Moti Haimovski 2020-08-12  248

--
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
  2022-03-16 11:41 ` [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific Oded Gabbay
@ 2022-03-16 22:33   ` kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2022-03-16 22:33 UTC (permalink / raw)
  To: Oded Gabbay; +Cc: llvm, kbuild-all

Hi Oded,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
config: x86_64-randconfig-a013-20220314 (https://download.01.org/0day-ci/archive/20220317/202203170651.S8azQIor-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
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://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
        git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
        # save the config file to linux build tree
        mkdir build_dir
        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 as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/misc/habanalabs/common/mmu/mmu.c:209:32: warning: variable 'prop' set but not used [-Wunused-but-set-variable]
           struct asic_fixed_properties *prop;
                                         ^
   drivers/misc/habanalabs/common/mmu/mmu.c:276:32: warning: variable 'prop' set but not used [-Wunused-but-set-variable]
           struct asic_fixed_properties *prop;
                                         ^
   2 warnings generated.


vim +/prop +209 drivers/misc/habanalabs/common/mmu/mmu.c

   184	
   185	/*
   186	 * hl_mmu_unmap_page - unmaps a virtual addr
   187	 *
   188	 * @ctx: pointer to the context structure
   189	 * @virt_addr: virt addr to map from
   190	 * @page_size: size of the page to unmap
   191	 * @flush_pte: whether to do a PCI flush
   192	 *
   193	 * This function does the following:
   194	 * - Check that the virt addr is mapped
   195	 * - Unmap the virt addr and frees pgts if possible
   196	 * - Returns 0 on success, -EINVAL if the given addr is not mapped
   197	 *
   198	 * Because this function changes the page tables in the device and because it
   199	 * changes the MMU hash, it must be protected by a lock.
   200	 * However, because it maps only a single page, the lock should be implemented
   201	 * in a higher level in order to protect the entire mapping of the memory area
   202	 *
   203	 * For optimization reasons PCI flush may be requested once after unmapping of
   204	 * large area.
   205	 */
   206	int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
   207	{
   208		struct hl_device *hdev = ctx->hdev;
 > 209		struct asic_fixed_properties *prop;
   210		struct hl_mmu_properties *mmu_prop;
   211		struct hl_mmu_funcs *mmu_funcs;
   212		int i, pgt_residency, rc = 0;
   213		u32 real_page_size, npages;
   214		u64 real_virt_addr;
   215		bool is_dram_addr;
   216	
   217		if (!hdev->mmu_enable)
   218			return 0;
   219	
   220		prop = &hdev->asic_prop;
   221		is_dram_addr = hl_is_dram_va(hdev, virt_addr);
   222		mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
   223	
   224		pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
   225		mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
   226	
   227		rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
   228								is_dram_addr);
   229		if (rc)
   230			return rc;
   231	
   232		npages = page_size / real_page_size;
   233		real_virt_addr = virt_addr;
   234	
   235		for (i = 0 ; i < npages ; i++) {
   236			rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
   237			if (rc)
   238				break;
   239	
   240			real_virt_addr += real_page_size;
   241		}
   242	
   243		if (flush_pte)
   244			mmu_funcs->flush(ctx);
   245	
   246		return rc;
   247	}
   248	

---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
  2022-03-16 11:41 [PATCH 01/11] habanalabs: set non-0 value in dram default page size Oded Gabbay
@ 2022-03-16 11:41 ` Oded Gabbay
  2022-03-16 22:33   ` kernel test robot
  0 siblings, 1 reply; 4+ messages in thread
From: Oded Gabbay @ 2022-03-16 11:41 UTC (permalink / raw)
  To: linux-kernel; +Cc: Ohad Sharabi

From: Ohad Sharabi <osharabi@habana.ai>

This patch breaks the cumbersome implementation of "get real page size"
along with it's multiple inner conditions and implement each case
(according to the real complexity) inside an ASIC function.

Signed-off-by: Ohad Sharabi <osharabi@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
---
 drivers/misc/habanalabs/common/habanalabs.h |   4 +
 drivers/misc/habanalabs/common/mmu/mmu.c    | 204 +++++++++++---------
 drivers/misc/habanalabs/gaudi/gaudi.c       |   3 +-
 drivers/misc/habanalabs/goya/goya.c         |   3 +-
 4 files changed, 116 insertions(+), 98 deletions(-)

diff --git a/drivers/misc/habanalabs/common/habanalabs.h b/drivers/misc/habanalabs/common/habanalabs.h
index af47accd4a56..990190fc3054 100644
--- a/drivers/misc/habanalabs/common/habanalabs.h
+++ b/drivers/misc/habanalabs/common/habanalabs.h
@@ -1450,6 +1450,8 @@ struct hl_asic_funcs {
 	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);
+	int (*mmu_get_real_page_size)(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+					u32 page_size, u32 *real_page_size, bool is_dram_addr);
 };
 
 
@@ -3109,6 +3111,8 @@ int hl_mmu_ctx_init(struct hl_ctx *ctx);
 void hl_mmu_ctx_fini(struct hl_ctx *ctx);
 int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
 		u32 page_size, bool flush_pte);
+int hl_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+				u32 page_size, u32 *real_page_size, bool is_dram_addr);
 int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
 		bool flush_pte);
 int hl_mmu_map_contiguous(struct hl_ctx *ctx, u64 virt_addr,
diff --git a/drivers/misc/habanalabs/common/mmu/mmu.c b/drivers/misc/habanalabs/common/mmu/mmu.c
index 810b73421ce1..eb85d9fb7462 100644
--- a/drivers/misc/habanalabs/common/mmu/mmu.c
+++ b/drivers/misc/habanalabs/common/mmu/mmu.c
@@ -9,6 +9,20 @@
 
 #include "../habanalabs.h"
 
+/**
+ * hl_mmu_get_funcs() - get MMU functions structure
+ * @hdev: habanalabs device structure.
+ * @pgt_residency: page table residency.
+ * @is_dram_addr: true if we need HMMU functions
+ *
+ * @return appropriate MMU functions structure
+ */
+static struct hl_mmu_funcs *hl_mmu_get_funcs(struct hl_device *hdev, int pgt_residency,
+									bool is_dram_addr)
+{
+	return &hdev->mmu_func[pgt_residency];
+}
+
 bool hl_is_dram_va(struct hl_device *hdev, u64 virt_addr)
 {
 	struct asic_fixed_properties *prop = &hdev->asic_prop;
@@ -121,6 +135,53 @@ void hl_mmu_ctx_fini(struct hl_ctx *ctx)
 	mutex_destroy(&ctx->mmu_lock);
 }
 
+/*
+ * hl_mmu_get_real_page_size - get real page size to use in map/unmap operation
+ *
+ * @hdev: pointer to device data.
+ * @mmu_prop: MMU properties.
+ * @page_size: page size
+ * @real_page_size: set here the actual page size to use for the operation
+ * @is_dram_addr: true if DRAM address, otherwise false.
+ *
+ * @return 0 on success, otherwise non 0 error code
+ *
+ * note that this is general implementation that can fit most MMU arch. but as this is used as an
+ * MMU function:
+ * 1. it shall not be called directly- only from mmu_func structure instance
+ * 2. each MMU may modify the implementation internally
+ */
+int hl_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+				u32 page_size, u32 *real_page_size, bool is_dram_addr)
+{
+	/*
+	 * The H/W handles mapping of specific page sizes. Hence if the page
+	 * size is bigger, we break it to sub-pages and map them separately.
+	 */
+	if ((page_size % mmu_prop->page_size) == 0) {
+		*real_page_size = mmu_prop->page_size;
+		return 0;
+	}
+
+	dev_err(hdev->dev, "page size of %u is not %uKB aligned, can't map\n",
+						page_size, mmu_prop->page_size >> 10);
+
+	return -EFAULT;
+}
+
+static struct hl_mmu_properties *hl_mmu_get_prop(struct hl_device *hdev, u32 page_size,
+							bool is_dram_addr)
+{
+	struct asic_fixed_properties *prop = &hdev->asic_prop;
+
+	if (is_dram_addr)
+		return &prop->dmmu;
+	else if ((page_size % prop->pmmu_huge.page_size) == 0)
+		return &prop->pmmu_huge;
+
+	return &prop->pmmu;
+}
+
 /*
  * hl_mmu_unmap_page - unmaps a virtual addr
  *
@@ -142,60 +203,37 @@ void hl_mmu_ctx_fini(struct hl_ctx *ctx)
  * For optimization reasons PCI flush may be requested once after unmapping of
  * large area.
  */
-int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
-		bool flush_pte)
+int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
 {
 	struct hl_device *hdev = ctx->hdev;
-	struct asic_fixed_properties *prop = &hdev->asic_prop;
+	struct asic_fixed_properties *prop;
 	struct hl_mmu_properties *mmu_prop;
-	u64 real_virt_addr;
+	struct hl_mmu_funcs *mmu_funcs;
+	int i, pgt_residency, rc = 0;
 	u32 real_page_size, npages;
-	int i, rc = 0, pgt_residency;
+	u64 real_virt_addr;
 	bool is_dram_addr;
 
 	if (!hdev->mmu_enable)
 		return 0;
 
+	prop = &hdev->asic_prop;
 	is_dram_addr = hl_is_dram_va(hdev, virt_addr);
-
-	if (is_dram_addr)
-		mmu_prop = &prop->dmmu;
-	else if ((page_size % prop->pmmu_huge.page_size) == 0)
-		mmu_prop = &prop->pmmu_huge;
-	else
-		mmu_prop = &prop->pmmu;
+	mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
 
 	pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
-	/*
-	 * The H/W handles mapping of specific page sizes. Hence if the page
-	 * size is bigger, we break it to sub-pages and unmap them separately.
-	 */
-	if ((page_size % mmu_prop->page_size) == 0) {
-		real_page_size = mmu_prop->page_size;
-	} else {
-		/*
-		 * MMU page size may differ from DRAM page size.
-		 * In such case work with the DRAM page size and let the MMU
-		 * scrambling routine to handle this mismatch when
-		 * calculating the address to remove from the MMU page table
-		 */
-		if (is_dram_addr && ((page_size % prop->dram_page_size) == 0)) {
-			real_page_size = prop->dram_page_size;
-		} else {
-			dev_err(hdev->dev,
-				"page size of %u is not %uKB aligned, can't unmap\n",
-				page_size, mmu_prop->page_size >> 10);
+	mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
 
-			return -EFAULT;
-		}
-	}
+	rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
+							is_dram_addr);
+	if (rc)
+		return rc;
 
 	npages = page_size / real_page_size;
 	real_virt_addr = virt_addr;
 
 	for (i = 0 ; i < npages ; i++) {
-		rc = hdev->mmu_func[pgt_residency].unmap(ctx,
-						real_virt_addr, is_dram_addr);
+		rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
 		if (rc)
 			break;
 
@@ -203,7 +241,7 @@ int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
 	}
 
 	if (flush_pte)
-		hdev->mmu_func[pgt_residency].flush(ctx);
+		mmu_funcs->flush(ctx);
 
 	return rc;
 }
@@ -230,56 +268,33 @@ int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
  * For optimization reasons PCI flush may be requested once after mapping of
  * large area.
  */
-int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
-		u32 page_size, bool flush_pte)
+int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr, u32 page_size,
+			bool flush_pte)
 {
+	int i, rc, pgt_residency, mapped_cnt = 0;
 	struct hl_device *hdev = ctx->hdev;
-	struct asic_fixed_properties *prop = &hdev->asic_prop;
+	struct asic_fixed_properties *prop;
 	struct hl_mmu_properties *mmu_prop;
 	u64 real_virt_addr, real_phys_addr;
+	struct hl_mmu_funcs *mmu_funcs;
 	u32 real_page_size, npages;
-	int i, rc, pgt_residency, mapped_cnt = 0;
 	bool is_dram_addr;
 
 
 	if (!hdev->mmu_enable)
 		return 0;
 
+	prop = &hdev->asic_prop;
 	is_dram_addr = hl_is_dram_va(hdev, virt_addr);
-
-	if (is_dram_addr)
-		mmu_prop = &prop->dmmu;
-	else if ((page_size % prop->pmmu_huge.page_size) == 0)
-		mmu_prop = &prop->pmmu_huge;
-	else
-		mmu_prop = &prop->pmmu;
+	mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
 
 	pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
+	mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
 
-	/*
-	 * The H/W handles mapping of specific page sizes. Hence if the page
-	 * size is bigger, we break it to sub-pages and map them separately.
-	 */
-	if ((page_size % mmu_prop->page_size) == 0) {
-		real_page_size = mmu_prop->page_size;
-	} else if (is_dram_addr && ((page_size % prop->dram_page_size) == 0) &&
-			(prop->dram_page_size < mmu_prop->page_size)) {
-		/*
-		 * MMU page size may differ from DRAM page size.
-		 * In such case work with the DRAM page size and let the MMU
-		 * scrambling routine handle this mismatch when calculating
-		 * the address to place in the MMU page table. (in that case
-		 * also make sure that the dram_page_size smaller than the
-		 * mmu page size)
-		 */
-		real_page_size = prop->dram_page_size;
-	} else {
-		dev_err(hdev->dev,
-			"page size of %u is not %uKB aligned, can't map\n",
-			page_size, mmu_prop->page_size >> 10);
-
-		return -EFAULT;
-	}
+	rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
+							is_dram_addr);
+	if (rc)
+		return rc;
 
 	/*
 	 * Verify that the phys and virt addresses are aligned with the
@@ -302,9 +317,8 @@ int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
 	real_phys_addr = phys_addr;
 
 	for (i = 0 ; i < npages ; i++) {
-		rc = hdev->mmu_func[pgt_residency].map(ctx,
-						real_virt_addr, real_phys_addr,
-						real_page_size, is_dram_addr);
+		rc = mmu_funcs->map(ctx, real_virt_addr, real_phys_addr, real_page_size,
+										is_dram_addr);
 		if (rc)
 			goto err;
 
@@ -314,22 +328,21 @@ int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
 	}
 
 	if (flush_pte)
-		hdev->mmu_func[pgt_residency].flush(ctx);
+		mmu_funcs->flush(ctx);
 
 	return 0;
 
 err:
 	real_virt_addr = virt_addr;
 	for (i = 0 ; i < mapped_cnt ; i++) {
-		if (hdev->mmu_func[pgt_residency].unmap(ctx,
-						real_virt_addr, is_dram_addr))
+		if (mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr))
 			dev_warn_ratelimited(hdev->dev,
 				"failed to unmap va: 0x%llx\n", real_virt_addr);
 
 		real_virt_addr += real_page_size;
 	}
 
-	hdev->mmu_func[pgt_residency].flush(ctx);
+	mmu_funcs->flush(ctx);
 
 	return rc;
 }
@@ -508,7 +521,7 @@ static void hl_mmu_pa_page_with_offset(struct hl_ctx *ctx, u64 virt_addr,
 		/*
 		 * Bit arithmetics cannot be used for non power of two page
 		 * sizes. In addition, since bit arithmetics is not used,
-		 * we cannot ignore dram base. All that shall be considerd.
+		 * we cannot ignore dram base. All that shall be considered.
 		 */
 
 		dram_page_size = prop->dram_page_size;
@@ -557,40 +570,39 @@ int hl_mmu_get_tlb_info(struct hl_ctx *ctx, u64 virt_addr,
 			struct hl_mmu_hop_info *hops)
 {
 	struct hl_device *hdev = ctx->hdev;
-	struct asic_fixed_properties *prop = &hdev->asic_prop;
+	struct asic_fixed_properties *prop;
 	struct hl_mmu_properties *mmu_prop;
-	int rc;
+	struct hl_mmu_funcs *mmu_funcs;
+	int pgt_residency, rc;
 	bool is_dram_addr;
 
 	if (!hdev->mmu_enable)
 		return -EOPNOTSUPP;
 
+	prop = &hdev->asic_prop;
 	hops->scrambled_vaddr = virt_addr;      /* assume no scrambling */
 
 	is_dram_addr = hl_mem_area_inside_range(virt_addr, prop->dmmu.page_size,
-						prop->dmmu.start_addr,
-						prop->dmmu.end_addr);
+								prop->dmmu.start_addr,
+								prop->dmmu.end_addr);
 
-	/* host-residency is the same in PMMU and HPMMU, use one of them */
+	/* host-residency is the same in PMMU and PMMU huge, no need to distinguish here */
 	mmu_prop = is_dram_addr ? &prop->dmmu : &prop->pmmu;
+	pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
+	mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
 
 	mutex_lock(&ctx->mmu_lock);
-
-	if (mmu_prop->host_resident)
-		rc = hdev->mmu_func[MMU_HR_PGT].get_tlb_info(ctx,
-							virt_addr, hops);
-	else
-		rc = hdev->mmu_func[MMU_DR_PGT].get_tlb_info(ctx,
-							virt_addr, hops);
-
+	rc = mmu_funcs->get_tlb_info(ctx, virt_addr, hops);
 	mutex_unlock(&ctx->mmu_lock);
 
+	if (rc)
+		return rc;
+
 	/* add page offset to physical address */
 	if (hops->unscrambled_paddr)
-		hl_mmu_pa_page_with_offset(ctx, virt_addr, hops,
-					&hops->unscrambled_paddr);
+		hl_mmu_pa_page_with_offset(ctx, virt_addr, hops, &hops->unscrambled_paddr);
 
-	return rc;
+	return 0;
 }
 
 int hl_mmu_if_set_funcs(struct hl_device *hdev)
diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index feb1323a8f4a..47afc5d1aef4 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -9487,7 +9487,8 @@ static const struct hl_asic_funcs gaudi_funcs = {
 	.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,
-	.is_valid_dram_page_size = NULL
+	.is_valid_dram_page_size = NULL,
+	.mmu_get_real_page_size = hl_mmu_get_real_page_size,
 };
 
 /**
diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
index 5bd665188ea6..e4b7b9706d1a 100644
--- a/drivers/misc/habanalabs/goya/goya.c
+++ b/drivers/misc/habanalabs/goya/goya.c
@@ -5765,7 +5765,8 @@ static const struct hl_asic_funcs goya_funcs = {
 	.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
+	.is_valid_dram_page_size = NULL,
+	.mmu_get_real_page_size = hl_mmu_get_real_page_size,
 };
 
 /*
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-03-20 15:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-17  7:00 [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific kernel test robot
2022-03-20 15:31 ` kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2022-03-16 11:41 [PATCH 01/11] habanalabs: set non-0 value in dram default page size Oded Gabbay
2022-03-16 11:41 ` [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific Oded Gabbay
2022-03-16 22:33   ` 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.