forked from rpms/kernel
		
	Patch to fix USB on Raspberry Pi
This commit is contained in:
		
							parent
							
								
									d43706f9e1
								
							
						
					
					
						commit
						a747539924
					
				| @ -0,0 +1,127 @@ | ||||
| From patchwork Thu Aug  3 15:52:08 2017 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v3] dma-mapping: skip USB devices when configuring DMA during probe | ||||
| From: Johan Hovold <johan@kernel.org> | ||||
| X-Patchwork-Id: 9879371 | ||||
| Message-Id: <20170803155208.22165-1-johan@kernel.org> | ||||
| To: Christoph Hellwig <hch@lst.de>, | ||||
|  Marek Szyprowski <m.szyprowski@samsung.com>, | ||||
|  Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||||
| Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= <afaerber@suse.de>, | ||||
|  linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, | ||||
|  Alan Stern <stern@rowland.harvard.edu>, Johan Hovold <johan@kernel.org>, | ||||
|  stable <stable@vger.kernel.org>, Robin Murphy <robin.murphy@arm.com>, | ||||
|  Sricharan R <sricharan@codeaurora.org>, | ||||
|  Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Date: Thu,  3 Aug 2017 17:52:08 +0200 | ||||
| 
 | ||||
| USB devices use the DMA mask and offset of the controller, which have | ||||
| already been setup when a device is probed. Note that modifying the | ||||
| DMA mask of a USB device would change the mask for the controller (and | ||||
| all devices on the bus) as the mask is literally shared. | ||||
| 
 | ||||
| Since commit 2bf698671205 ("USB: of: fix root-hub device-tree node | ||||
| handling"), of_dma_configure() would be called also for root hubs, which | ||||
| use the device node of the controller. A separate, long-standing bug | ||||
| that makes of_dma_configure() generate a 30-bit DMA mask from the RPI3's | ||||
| "dma-ranges" would thus set a broken mask also for the controller. This | ||||
| in turn prevents USB devices from enumerating when control transfers | ||||
| fail: | ||||
| 
 | ||||
| 	dwc2 3f980000.usb: Cannot do DMA to address 0x000000003a166a00 | ||||
| 
 | ||||
| Note that the aforementioned DMA-mask bug was benign for the HCD itself | ||||
| as the dwc2 driver overwrites the mask previously set by | ||||
| of_dma_configure() for the platform device in its probe callback. The | ||||
| mask would only later get corrupted when the root-hub child device was | ||||
| probed. | ||||
| 
 | ||||
| Fix this, and similar future problems, by adding a flag to struct device | ||||
| which prevents driver core from calling dma_configure() during probe and | ||||
| making sure it is set for USB devices. | ||||
| 
 | ||||
| Fixes: 09515ef5ddad ("of/acpi: Configure dma operations at probe time for platform/amba/pci bus devices") | ||||
| Cc: stable <stable@vger.kernel.org>	# 4.12 | ||||
| Cc: Robin Murphy <robin.murphy@arm.com> | ||||
| Cc: Sricharan R <sricharan@codeaurora.org> | ||||
| Cc: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Reported-by: Hans Verkuil <hverkuil@xs4all.nl> | ||||
| Signed-off-by: Johan Hovold <johan@kernel.org> | ||||
| ---
 | ||||
| 
 | ||||
| v3 | ||||
|  - add flag to struct device to prevent DMA configuration during probe instead | ||||
|    of checking for the USB bus type, which is not available when USB is built | ||||
|    as a module as noted by Alan | ||||
|  - drop moderated rpi list from CC | ||||
| 
 | ||||
| v2 | ||||
|  - amend commit message and point out that the long-standing 30-bit DMA-mask | ||||
|    bug was benign to the dwc2 HCD itself (Robin) | ||||
|  - add and use a new dev_is_usb() helper (Robin) | ||||
| 
 | ||||
| 
 | ||||
|  drivers/base/dma-mapping.c | 6 ++++++ | ||||
|  drivers/usb/core/usb.c     | 1 + | ||||
|  include/linux/device.h     | 3 +++ | ||||
|  3 files changed, 10 insertions(+) | ||||
| 
 | ||||
| diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c
 | ||||
| index b555ff9dd8fc..f9f703be0ad1 100644
 | ||||
| --- a/drivers/base/dma-mapping.c
 | ||||
| +++ b/drivers/base/dma-mapping.c
 | ||||
| @@ -345,6 +345,9 @@ int dma_configure(struct device *dev)
 | ||||
|  	enum dev_dma_attr attr; | ||||
|  	int ret = 0; | ||||
|   | ||||
| +	if (dev->skip_dma_configure)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
|  	if (dev_is_pci(dev)) { | ||||
|  		bridge = pci_get_host_bridge_device(to_pci_dev(dev)); | ||||
|  		dma_dev = bridge; | ||||
| @@ -369,6 +372,9 @@ int dma_configure(struct device *dev)
 | ||||
|   | ||||
|  void dma_deconfigure(struct device *dev) | ||||
|  { | ||||
| +	if (dev->skip_dma_configure)
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	of_dma_deconfigure(dev); | ||||
|  	acpi_dma_deconfigure(dev); | ||||
|  } | ||||
| diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
 | ||||
| index 17681d5638ac..2a85d905b539 100644
 | ||||
| --- a/drivers/usb/core/usb.c
 | ||||
| +++ b/drivers/usb/core/usb.c
 | ||||
| @@ -588,6 +588,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
 | ||||
|  	 * Note: calling dma_set_mask() on a USB device would set the | ||||
|  	 * mask for the entire HCD, so don't do that. | ||||
|  	 */ | ||||
| +	dev->dev.skip_dma_configure = true;
 | ||||
|  	dev->dev.dma_mask = bus->sysdev->dma_mask; | ||||
|  	dev->dev.dma_pfn_offset = bus->sysdev->dma_pfn_offset; | ||||
|  	set_dev_node(&dev->dev, dev_to_node(bus->sysdev)); | ||||
| diff --git a/include/linux/device.h b/include/linux/device.h
 | ||||
| index 723cd54b94da..022cf258068b 100644
 | ||||
| --- a/include/linux/device.h
 | ||||
| +++ b/include/linux/device.h
 | ||||
| @@ -877,6 +877,8 @@ struct dev_links_info {
 | ||||
|   * @offline:	Set after successful invocation of bus type's .offline(). | ||||
|   * @of_node_reused: Set if the device-tree node is shared with an ancestor | ||||
|   *              device. | ||||
| + * @skip_dma_configure: Set if driver core should not configure DMA for this
 | ||||
| + *              device during probe.
 | ||||
|   * | ||||
|   * At the lowest level, every device in a Linux system is represented by an | ||||
|   * instance of struct device. The device structure contains the information | ||||
| @@ -965,6 +967,7 @@ struct device {
 | ||||
|  	bool			offline_disabled:1; | ||||
|  	bool			offline:1; | ||||
|  	bool			of_node_reused:1; | ||||
| +	bool			skip_dma_configure:1;
 | ||||
|  }; | ||||
|   | ||||
|  static inline struct device *kobj_to_dev(struct kobject *kobj) | ||||
							
								
								
									
										10
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -615,16 +615,19 @@ Patch312: qcom-display-iommu.patch | ||||
| # https://patchwork.kernel.org/patch/9839803/ | ||||
| Patch313: qcom-Force-host-mode-for-USB-on-apq8016-sbc.patch | ||||
| 
 | ||||
| # Breaking mustang booting | ||||
| Patch314: 0001-Revert-xgene-Don-t-fail-probe-if-there-is-no-clk-res.patch | ||||
| 
 | ||||
| # http://www.spinics.net/lists/dri-devel/msg132235.html | ||||
| Patch320: bcm283x-vc4-Fix-OOPSes-from-trying-to-cache-a-partially-constructed-BO..patch | ||||
| 
 | ||||
| # Fix USB on the RPi https://patchwork.kernel.org/patch/9879371/ | ||||
| Patch321: bcm283x-dma-mapping-skip-USB-devices-when-configuring-DMA-during-probe.patch | ||||
| 
 | ||||
| # This breaks RPi booting with a LPAE kernel, we don't support the DSI ports currently | ||||
| # Revert it while I engage upstream to work out what's going on | ||||
| Patch322: Revert-ARM-dts-bcm2835-Add-the-DSI-module-nodes-and-.patch | ||||
| 
 | ||||
| # Breaking mustang booting | ||||
| Patch323: 0001-Revert-xgene-Don-t-fail-probe-if-there-is-no-clk-res.patch | ||||
| 
 | ||||
| # 400 - IBM (ppc/s390x) patches | ||||
| 
 | ||||
| # 500 - Temp fixes/CVEs etc | ||||
| @ -2198,6 +2201,7 @@ fi | ||||
| %changelog | ||||
| * Fri Aug  4 2017 Peter Robinson <pbrobinson@fedoraproject.org> | ||||
| - ARM QCom updates | ||||
| - Patch to fix USB on Raspberry Pi | ||||
| 
 | ||||
| * Fri Aug 04 2017 Laura Abbott <labbott@fedoraproject.org> - 4.13.0-0.rc3.git4.1 | ||||
| - Linux v4.13-rc3-152-g869c058fbe74 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user