diff mbox series

iommu/arm-smmu: Don't bypass pinned stream mappings

Message ID 20200609180516.14362-1-jcrouse@codeaurora.org
State New
Headers show
Series iommu/arm-smmu: Don't bypass pinned stream mappings | expand

Commit Message

Jordan Crouse June 9, 2020, 6:05 p.m. UTC
Commit 0e764a01015d ("iommu/arm-smmu: Allow client devices to select
direct mapping") sets the initial domain type to SMMU_DOMAIN_IDENTITY
for devices that select direct mapping. This ends up setting the domain
as ARM_SMMU_DOMAIN_BYPASS which causes the stream ID mappings
for the device to be programmed to S2CR_TYPE_BYPASS.

This causes a problem for stream mappings that are inherited from
the bootloader since rewriting the stream to BYPASS will disrupt the
display controller access to DDR.

This is an extension to ("iommu/arm-smmu: Allow inheriting stream mapping
from bootloader") [1] that identifies streams that are already configured
 and marked them as pinned. This patch extends that to not re-write pinned
stream mappings for ARM_SMMU_DOMAIN_BYPASS domains.

[1] https://lore.kernel.org/r/20191226221709.3844244-4-bjorn.andersson@linaro.org

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

 drivers/iommu/arm-smmu.c | 4 ++++
 1 file changed, 4 insertions(+)


kernel test robot June 10, 2020, 12:59 a.m. UTC | #1
Hi Jordan,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on iommu/next]
[also build test ERROR on v5.7 next-20200609]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Jordan-Crouse/iommu-arm-smmu-Don-t-bypass-pinned-stream-mappings/20200610-020733
base:   https://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git next
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
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
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=riscv 

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

All errors (new ones prefixed by >>, old ones prefixed by <<):

drivers/iommu/arm-smmu.c: In function 'arm_smmu_domain_add_master':
>> drivers/iommu/arm-smmu.c:1143:44: error: 'struct arm_smmu_s2cr' has no member named 'pinned'
1143 |   if (type == S2CR_TYPE_BYPASS && s2cr[idx].pinned)
|                                            ^

vim +1143 drivers/iommu/arm-smmu.c

  1123	static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
  1124					      struct arm_smmu_master_cfg *cfg,
  1125					      struct iommu_fwspec *fwspec)
  1126	{
  1127		struct arm_smmu_device *smmu = smmu_domain->smmu;
  1128		struct arm_smmu_s2cr *s2cr = smmu->s2crs;
  1129		u8 cbndx = smmu_domain->cfg.cbndx;
  1130		enum arm_smmu_s2cr_type type;
  1131		int i, idx;
  1133		if (smmu_domain->stage == ARM_SMMU_DOMAIN_BYPASS)
  1134			type = S2CR_TYPE_BYPASS;
  1135		else
  1136			type = S2CR_TYPE_TRANS;
  1138		for_each_cfg_sme(cfg, fwspec, i, idx) {
  1139			if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)
  1140				continue;
  1142			/* Don't bypasss pinned streams; leave them as they are */
> 1143			if (type == S2CR_TYPE_BYPASS && s2cr[idx].pinned)
  1144				continue;
  1146			s2cr[idx].type = type;
  1147			s2cr[idx].privcfg = S2CR_PRIVCFG_DEFAULT;
  1148			s2cr[idx].cbndx = cbndx;
  1149			arm_smmu_write_s2cr(smmu, idx);
  1150		}
  1151		return 0;
  1152	}

0-DAY CI Kernel Test Service, Intel Corporation
diff mbox series


diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index c7add09f11c1..9c1e5ba948a7 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1143,6 +1143,10 @@  static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,
 		if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)
+		/* Don't bypasss pinned streams; leave them as they are */
+		if (type == S2CR_TYPE_BYPASS && s2cr[idx].pinned)
+			continue;
 		s2cr[idx].type = type;
 		s2cr[idx].privcfg = S2CR_PRIVCFG_DEFAULT;
 		s2cr[idx].cbndx = cbndx;