Re: [PATCH v6] tpm_crb: fix fTPM on AMD Zen+ CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on jss-tpmdd/next]
[cannot apply to v5.4-rc3 next-20191011]
[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/ivan-lazeev-gmail-com/tpm_crb-fix-fTPM-on-AMD-Zen-CPUs/20191003-054300
base:   git://git.infradead.org/users/jjs/linux-tpmdd next
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.1-rc1-43-g0ccb3b4-dirty
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)

>> drivers/char/tpm/tpm_crb.c:507:62: sparse: sparse: Using plain integer as NULL pointer

vim +507 drivers/char/tpm/tpm_crb.c

   501	
   502	static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
   503			      struct acpi_table_tpm2 *buf)
   504	{
   505		struct list_head acpi_resource_list;
   506		struct resource iores_array[TPM_CRB_MAX_RESOURCES];
 > 507		void __iomem *iobase_array[TPM_CRB_MAX_RESOURCES] = {0};
   508		struct resource *iores_range[] = {
   509			iores_array,
   510			iores_array + TPM_CRB_MAX_RESOURCES
   511		};
   512		struct device *dev = &device->dev;
   513		struct resource *iores;
   514		void __iomem **iobase_ptr;
   515		int num_resources, i;
   516		u32 pa_high, pa_low;
   517		u64 cmd_pa;
   518		u32 cmd_size;
   519		__le64 __rsp_pa;
   520		u64 rsp_pa;
   521		u32 rsp_size;
   522		int ret;
   523	
   524		INIT_LIST_HEAD(&acpi_resource_list);
   525		ret = acpi_dev_get_resources(device, &acpi_resource_list,
   526					     crb_check_resource, iores_range);
   527		if (ret < 0)
   528			return ret;
   529		acpi_dev_free_resource_list(&acpi_resource_list);
   530	
   531		if (iores_range[0] == iores_array) {
   532			dev_err(dev, FW_BUG "TPM2 ACPI table does not define a memory resource\n");
   533			return -EINVAL;
   534		} else if (!iores_range[0]) {
   535			dev_warn(dev, "TPM2 ACPI table defines too many memory resources\n");
   536			iores_range[0] = iores_range[1];
   537		}
   538	
   539		num_resources = iores_range[0] - iores_array;
   540	
   541		iores = NULL;
   542		iobase_ptr = NULL;
   543		for (i = 0; i < num_resources; ++i) {
   544			if (buf->control_address >= iores_array[i].start &&
   545			    buf->control_address + sizeof(struct crb_regs_tail) - 1 <=
   546			    iores_array[i].end) {
   547				iores = iores_array + i;
   548				iobase_ptr = iobase_array + i;
   549				break;
   550			}
   551		}
   552	
   553		priv->regs_t = crb_map_res(dev, iores, iobase_ptr, buf->control_address,
   554					   sizeof(struct crb_regs_tail));
   555	
   556		if (IS_ERR(priv->regs_t))
   557			return PTR_ERR(priv->regs_t);
   558	
   559		/* The ACPI IO region starts at the head area and continues to include
   560		 * the control area, as one nice sane region except for some older
   561		 * stuff that puts the control area outside the ACPI IO region.
   562		 */
   563		if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
   564		    (priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
   565			if (iores &&
   566			    buf->control_address == iores->start +
   567			    sizeof(*priv->regs_h))
   568				priv->regs_h = *iobase_ptr;
   569			else
   570				dev_warn(dev, FW_BUG "Bad ACPI memory layout");
   571		}
   572	
   573		ret = __crb_request_locality(dev, priv, 0);
   574		if (ret)
   575			return ret;
   576	
   577		/*
   578		 * PTT HW bug w/a: wake up the device to access
   579		 * possibly not retained registers.
   580		 */
   581		ret = __crb_cmd_ready(dev, priv);
   582		if (ret)
   583			goto out_relinquish_locality;
   584	
   585		pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
   586		pa_low  = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
   587		cmd_pa = ((u64)pa_high << 32) | pa_low;
   588		cmd_size = ioread32(&priv->regs_t->ctrl_cmd_size);
   589	
   590		iores = NULL;
   591		iobase_ptr = NULL;
   592		for (i = 0; i < num_resources; ++i) {
   593			if (cmd_pa >= iores_array[i].start &&
   594			    cmd_pa <= iores_array[i].end) {
   595				iores = iores_array + i;
   596				iobase_ptr = iobase_array + i;
   597				break;
   598			}
   599		}
   600	
   601		if (iores)
   602			cmd_size = crb_fixup_cmd_size(dev, iores, cmd_pa, cmd_size);
   603	
   604		dev_dbg(dev, "cmd_hi = %X cmd_low = %X cmd_size %X\n",
   605			pa_high, pa_low, cmd_size);
   606	
   607		priv->cmd = crb_map_res(dev, iores, iobase_ptr,	cmd_pa, cmd_size);
   608		if (IS_ERR(priv->cmd)) {
   609			ret = PTR_ERR(priv->cmd);
   610			goto out;
   611		}
   612	
   613		memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);
   614		rsp_pa = le64_to_cpu(__rsp_pa);
   615		rsp_size = ioread32(&priv->regs_t->ctrl_rsp_size);
   616	
   617		iores = NULL;
   618		iobase_ptr = NULL;
   619		for (i = 0; i < num_resources; ++i) {
   620			if (rsp_pa >= iores_array[i].start &&
   621			    rsp_pa <= iores_array[i].end) {
   622				iores = iores_array + i;
   623				iobase_ptr = iobase_array + i;
   624				break;
   625			}
   626		}
   627	
   628		if (iores)
   629			rsp_size = crb_fixup_cmd_size(dev, iores, rsp_pa, rsp_size);
   630	
   631		if (cmd_pa != rsp_pa) {
   632			priv->rsp = crb_map_res(dev, iores, iobase_ptr,
   633						rsp_pa, rsp_size);
   634			ret = PTR_ERR_OR_ZERO(priv->rsp);
   635			goto out;
   636		}
   637	
   638		/* According to the PTP specification, overlapping command and response
   639		 * buffer sizes must be identical.
   640		 */
   641		if (cmd_size != rsp_size) {
   642			dev_err(dev, FW_BUG "overlapping command and response buffer sizes are not identical");
   643			ret = -EINVAL;
   644			goto out;
   645		}
   646	
   647		priv->rsp = priv->cmd;
   648	
   649	out:
   650		if (!ret)
   651			priv->cmd_size = cmd_size;
   652	
   653		__crb_go_idle(dev, priv);
   654	
   655	out_relinquish_locality:
   656	
   657		__crb_relinquish_locality(dev, priv, 0);
   658	
   659		return ret;
   660	}
   661	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux Kernel Hardening]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux