diff options
| author | Stefan Agner <stefan.agner@toradex.com> | 2019-10-14 11:29:40 +0200 | 
|---|---|---|
| committer | Stefan Agner <stefan.agner@toradex.com> | 2019-10-14 11:29:40 +0200 | 
| commit | f2fbbb0846d4d0737cd5bbf0e7a6a136f0334c5e (patch) | |
| tree | bc8a63d51e366fb4d65f6547497e33ad3c3c4869 /drivers/firmware | |
| parent | 73e1c506b9ffb348af15763d62b3677378bd8d91 (diff) | |
| parent | a2fc8ee6676067f27d2f5c6e4d512adff3d9938c (diff) | |
Merge tag 'v5.3.6' into toradex_5.3.y
This is the 5.3.6 stable release
Diffstat (limited to 'drivers/firmware')
| -rw-r--r-- | drivers/firmware/arm_scmi/driver.c | 8 | ||||
| -rw-r--r-- | drivers/firmware/efi/cper.c | 15 | ||||
| -rw-r--r-- | drivers/firmware/qcom_scm.c | 7 | 
3 files changed, 28 insertions, 2 deletions
| diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index b5bc4c7a8fab..b49c9e6f4bf1 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -271,6 +271,14 @@ static void scmi_tx_prepare(struct mbox_client *cl, void *m)  	struct scmi_chan_info *cinfo = client_to_scmi_chan_info(cl);  	struct scmi_shared_mem __iomem *mem = cinfo->payload; +	/* +	 * Ideally channel must be free by now unless OS timeout last +	 * request and platform continued to process the same, wait +	 * until it releases the shared memory, otherwise we may endup +	 * overwriting its response with new message payload or vice-versa +	 */ +	spin_until_cond(ioread32(&mem->channel_status) & +			SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE);  	/* Mark channel busy + clear error */  	iowrite32(0x0, &mem->channel_status);  	iowrite32(t->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED, diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c index 8fa977c7861f..addf0749dd8b 100644 --- a/drivers/firmware/efi/cper.c +++ b/drivers/firmware/efi/cper.c @@ -390,6 +390,21 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,  		printk(  	"%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n",  	pfx, pcie->bridge.secondary_status, pcie->bridge.control); + +	/* Fatal errors call __ghes_panic() before AER handler prints this */ +	if ((pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) && +	    (gdata->error_severity & CPER_SEV_FATAL)) { +		struct aer_capability_regs *aer; + +		aer = (struct aer_capability_regs *)pcie->aer_info; +		printk("%saer_uncor_status: 0x%08x, aer_uncor_mask: 0x%08x\n", +		       pfx, aer->uncor_status, aer->uncor_mask); +		printk("%saer_uncor_severity: 0x%08x\n", +		       pfx, aer->uncor_severity); +		printk("%sTLP Header: %08x %08x %08x %08x\n", pfx, +		       aer->header_log.dw0, aer->header_log.dw1, +		       aer->header_log.dw2, aer->header_log.dw3); +	}  }  static void cper_print_tstamp(const char *pfx, diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 2ddc118dba1b..74b84244a0db 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -9,6 +9,7 @@  #include <linux/init.h>  #include <linux/cpumask.h>  #include <linux/export.h> +#include <linux/dma-direct.h>  #include <linux/dma-mapping.h>  #include <linux/module.h>  #include <linux/types.h> @@ -440,6 +441,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,  	phys_addr_t mem_to_map_phys;  	phys_addr_t dest_phys;  	phys_addr_t ptr_phys; +	dma_addr_t ptr_dma;  	size_t mem_to_map_sz;  	size_t dest_sz;  	size_t src_sz; @@ -457,9 +459,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,  	ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +  			ALIGN(dest_sz, SZ_64); -	ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); +	ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL);  	if (!ptr)  		return -ENOMEM; +	ptr_phys = dma_to_phys(__scm->dev, ptr_dma);  	/* Fill source vmid detail */  	src = ptr; @@ -489,7 +492,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,  	ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,  				    ptr_phys, src_sz, dest_phys, dest_sz); -	dma_free_coherent(__scm->dev, ALIGN(ptr_sz, SZ_64), ptr, ptr_phys); +	dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma);  	if (ret) {  		dev_err(__scm->dev,  			"Assign memory protection call failed %d.\n", ret); | 
