[PATCH v3 1/2] make xhci platform driver use 64 bit or 32 bit DMA
The xhci platform driver needs to work on systems that either only support 64-bit DMA or only support 32-bit DMA. Attempt to set a coherent dma mask for 64-bit DMA, and attempt again with 32-bit DMA if that fails. Signed-off-by: Mark Langsdorf Tested-by: Mark Salter --- Changes from v2: None Changes from v1: Consolidated to use dma_set_mask_and_coherent Got rid of the check against sizeof(dma_addr_t) drivers/usb/host/xhci-plat.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 3d78b0c..34cbf65 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -96,14 +96,14 @@ static int xhci_plat_probe(struct platform_device *pdev) return ret; } - /* Initialize dma_mask and coherent_dma_mask to 32-bits */ - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; - if (!pdev->dev.dma_mask) - pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; - else - dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + /* Try setting the coherent_dma_mask to 64 bits, then try 32 bits */ + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + if (ret) { + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } + hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 2/2] [usb] dd support for ACPI identification to xhci-platform
Provide the methods to let ACPI identify the need to use xhci-platform. Change the Kconfig files so the xhci-plat.o file is selectable during kernel config. This has been tested on an ARM64 machine with platform XHCI, an x86_64 machine with XHCI, and an x86_64 machine without XHCI. There were no regressions or error messages on the machines without platform XHCI. Signed-off-by: Mark Langsdorf --- Changes from v2 Replaced tristate with a boolean as the driver doesn't compile as a module Correct --help-- to ---help--- Changes from v1 Renamed from "add support for APM X-Gene to xhci-platform" Removed changes to arm64/Kconfig Made CONFIG_USB_XHCI_PLATFORM a user selectable config option drivers/usb/host/Kconfig | 7 ++- drivers/usb/host/xhci-plat.c | 11 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index a3ca137..f6c6e86 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -32,7 +32,12 @@ config USB_XHCI_PCI default y config USB_XHCI_PLATFORM - tristate + boolean "xHCI platform driver support" + ---help--- + Say 'Y' to enable the support for the xHCI host controller + as a platform device. Many ARM SoCs provide USB this way. + + If unsure, say 'Y'. config USB_XHCI_MVEBU tristate "xHCI support for Marvell Armada 375/38x" diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 34cbf65..8951eaa 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "xhci.h" #include "xhci-mvebu.h" @@ -236,6 +237,15 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + { "PNP0D10", }, + { "PNP0D15", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif + static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -243,6 +253,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), }, }; MODULE_ALIAS("platform:xhci-hcd"); -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/2] [usb] add support for ACPI identification to xhci-platform
On 11/18/2014 02:05 PM, Feng Kan wrote: On Thu, Nov 13, 2014 at 10:36 AM, Mark Langsdorf wrote: On 11/04/2014 11:12 AM, Greg KH wrote: On Tue, Nov 04, 2014 at 10:50:33AM -0600, Mark Langsdorf wrote: #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, Mark, would it be better to use PRP0001 instead as in this patch? https://lkml.org/lkml/2014/9/16/230 Quoting Arnd, "In this case, the device does have an official ACPI ID "PNP0D10", so we should use that for compatibility with other operating systems and with BIOS versions that provide the standard IDs." --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/2] [usb] add support for ACPI identification to xhci-platform
On 11/04/2014 11:12 AM, Greg KH wrote: On Tue, Nov 04, 2014 at 10:50:33AM -0600, Mark Langsdorf wrote: #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif That looks like a very "generic" PNP value, are you sure it is assigned only to this specific device? Although this is a generic PNP device, the specific implementation I'm testing has issues with USB3. Is there a flag or function call that will disable the USB3 host while keeping the USB2 host?? My naive attempts in finding one mostly hung the machine. --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/2] [usb] add support for ACPI identification to xhci-platform
On 11/05/2014 01:11 PM, Greg KH wrote: On Wed, Nov 05, 2014 at 07:59:32AM -0600, Mark Langsdorf wrote: static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -294,6 +304,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), Shouldn't the reworked driver core code handle this differently with the ability to handle either OF or ACPI in the same driver? I'm not sure I understand the question. With these changes, the driver handles both ACPI and DTB/OF. It's the same style of code as used in drivers/ata/plat-xgene.c, which also handles both ACPI and DTB/OF. Why do you think this code isn't correct? There is a new framework in the kernel that keeps a driver from having to query both of and acpi to get the needed resources, it just does one query and depending on the platform, everything "just works". Shouldn't that be used here as well? Would you send me a pointer to a driver that's using this new framework? I can't find any references to it and all the other drivers that support ACPI and OF are doing it the way I'm doing it. --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/2] [usb] add support for ACPI identification to xhci-platform
On 11/04/2014 11:12 AM, Greg KH wrote: On Tue, Nov 04, 2014 at 10:50:33AM -0600, Mark Langsdorf wrote: Provide the methods to let ACPI identify the need to use xhci-platform. Change the Kconfig files so the xhci-plat.o file is selectable during kernel config. Signed-off-by: Mark Langsdorf --- Changes from v1 Renamed from "add support for APM X-Gene to xhci-platform" Removed changes to arm64/Kconfig Made CONFIG_USB_XHCI_PLATFORM a user selectable config option drivers/usb/host/Kconfig | 7 ++- drivers/usb/host/xhci-plat.c | 11 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 82800a7..060a2361 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -27,7 +27,12 @@ config USB_XHCI_HCD if USB_XHCI_HCD config USB_XHCI_PLATFORM - tristate + tristate "xHCI platform driver support" + --help-- + Say 'Y' to enable the support for the xHCI host controller + as a platform device. Many ARM SoCs provide USB this way. + + If unsure, say 'Y'. You really want a 'default Y' response here? That's not good at all, what happens if I select this on a system without such hardware? Based on testing with my 2 x86 systems, nothing bad, but I'll make it 'M' because that's correct. config USB_XHCI_MVEBU tristate "xHCI support for Marvell Armada 375/38x" diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 91c7557..3db47ea 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "xhci.h" #include "xhci-mvebu.h" @@ -287,6 +288,15 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif That looks like a very "generic" PNP value, are you sure it is assigned only to this specific device? I'll adjust the comment. It is a generic PNP value and a lot of other SoCs will use this controller. + static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -294,6 +304,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), Shouldn't the reworked driver core code handle this differently with the ability to handle either OF or ACPI in the same driver? I'm not sure I understand the question. With these changes, the driver handles both ACPI and DTB/OF. It's the same style of code as used in drivers/ata/plat-xgene.c, which also handles both ACPI and DTB/OF. Why do you think this code isn't correct? --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2 2/2] [usb] add support for ACPI identification to xhci-platform
Provide the methods to let ACPI identify the need to use xhci-platform. Change the Kconfig files so the xhci-plat.o file is selectable during kernel config. Signed-off-by: Mark Langsdorf --- Changes from v1 Renamed from "add support for APM X-Gene to xhci-platform" Removed changes to arm64/Kconfig Made CONFIG_USB_XHCI_PLATFORM a user selectable config option drivers/usb/host/Kconfig | 7 ++- drivers/usb/host/xhci-plat.c | 11 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 82800a7..060a2361 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -27,7 +27,12 @@ config USB_XHCI_HCD if USB_XHCI_HCD config USB_XHCI_PLATFORM - tristate + tristate "xHCI platform driver support" + --help-- + Say 'Y' to enable the support for the xHCI host controller + as a platform device. Many ARM SoCs provide USB this way. + + If unsure, say 'Y'. config USB_XHCI_MVEBU tristate "xHCI support for Marvell Armada 375/38x" diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 91c7557..3db47ea 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "xhci.h" #include "xhci-mvebu.h" @@ -287,6 +288,15 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif + static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -294,6 +304,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), }, }; MODULE_ALIAS("platform:xhci-hcd"); -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2 1/2] [usb] make xhci platform driver use 64 bit or 32 bit DMA
The xhci platform driver needs to work on systems that either only support 64-bit DMA or only support 32-bit DMA. Attempt to set a coherent dma mask for 64-bit DMA, and attempt again with 32-bit DMA if that fails. Signed-off-by: Mark Langsdorf Tested-by: Mark Salter --- Changes from v1: Consolidated to use dma_set_mask_and_coherent Got rid of the check against sizeof(dma_addr_t) drivers/usb/host/xhci-plat.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 1a0cf9f..91c7557 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -147,14 +147,14 @@ static int xhci_plat_probe(struct platform_device *pdev) return ret; } - /* Initialize dma_mask and coherent_dma_mask to 32-bits */ - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; - if (!pdev->dev.dma_mask) - pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; - else - dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + /* Try setting the coherent_dma_mask to 64 bits, then try 32 bits */ + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + if (ret) { + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } + hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2] [usb] make xhci platform driver use 64 bit or 32 bit DMA
On 10/31/2014 10:49 AM, Arnd Bergmann wrote: On Friday 31 October 2014 09:22:26 Mark Langsdorf wrote: On 10/30/2014 04:05 PM, Arnd Bergmann wrote: On Thursday 30 October 2014 15:09:33 Mark Langsdorf wrote: You should not access pdev->dev.dma_mask here, that gets set by the platform code. You should be able to just use dma_set_mask_and_coherent to set both. So: if (sizeof(dma_addr_t) < 8 || dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) { ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret; } This doesn't actually work for me. I experimented a bit on the hardware and I always fail if I don't set the coherent mask first. Very strange, the code looks right to me. What is the initial value of dev->dma_mask? Did you mean &pdev->dev.dma_mask? It's 0xdc759df8. --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2] [usb] make xhci platform driver use 64 bit or 32 bit DMA
On 10/30/2014 04:05 PM, Arnd Bergmann wrote: On Thursday 30 October 2014 15:09:33 Mark Langsdorf wrote: On 10/30/2014 02:05 PM, Arnd Bergmann wrote: On Thursday 30 October 2014 13:16:28 Mark Langsdorf wrote: - /* Initialize dma_mask and coherent_dma_mask to 32-bits */ - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; + /* Try setting the coherent_dma_mask to 64 bits, then try 32 bits */ + if (sizeof(dma_addr_t) < 8 || + dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } if (!pdev->dev.dma_mask) pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; else - dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + dma_set_mask(&pdev->dev, pdev->dev.coherent_dma_mask); hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) The logic here seems wrong: if dma_set_mask is successful, you can rely on on dma_set_coherent_mask suceeding as well, but not the other way round. That's the order in the existing driver. Would you prefer I switch it to: if (sizeof(dma_addr_t) < 8 || dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) { ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret; } dma_set_coherent_mask(&pdev->dev, pdev->dev.dma_mask); or based on the comment below: ret = dma_set_mask(&pdev->dev, pdev->dev.dma_mask); if (ret) return ret; dma_set_coherent_mask(&pdev->dev, pdev->dev.dma_mask); I prefer this version but I don't know if it would work. You should not access pdev->dev.dma_mask here, that gets set by the platform code. You should be able to just use dma_set_mask_and_coherent to set both. So: if (sizeof(dma_addr_t) < 8 || dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) { ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret; } This doesn't actually work for me. I experimented a bit on the hardware and I always fail if I don't set the coherent mask first. Also, we should no longer need to worry about the case where pdev->dev.dma_mask is NULL, as this now gets initialized from the DT setup. I'm running this on a system with ACPI enabled and no DT. Does that make a difference? I don't know how the DMA mask gets initialized on ACPI, I assume it doesn't at the moment, but that is something that should be fixed in the ACPI code, not worked around in the driver. You should definitely make sure that this also works with DT, as I don't think it's possible to support X-Gene with ACPI. I know that Al Stone has experimented with it in the past, but he never came back with any results, so I assume the experiment failed. I'm running my test code on an X-Gene with ACPI. Al Stone, Mark Salter, and I got it working. --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 2/2] [usb] add support for APM X-Gene to xhci-platform
On 10/30/2014 02:07 PM, Arnd Bergmann wrote: On Thursday 30 October 2014 13:16:29 Mark Langsdorf wrote: Applied Micro's X-Gene platform uses the xhci-platform for USB. Add the glue to decode it from ACPI and change the Kconfig files so the xhci-plat.o file gets built. Signed-off-by: Mark Langsdorf I don't see anything x-gene specific in this patch, the PNP0D10 ID should work on any platform. Okay. diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 042f785..07549ec 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -149,6 +149,7 @@ config ARCH_XGENE bool "AppliedMicro X-Gene SOC Family" select MFD_SYSCON select POWER_RESET_SYSCON + select USB_XHCI_XGENE help This enables support for AppliedMicro X-Gene SOC Family diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 82800a7..9fd52db 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -45,6 +45,14 @@ config USB_XHCI_RCAR Say 'Y' to enable the support for the xHCI host controller found in Renesas R-Car ARM SoCs. +config USB_XHCI_XGENE + tristate "xHCI support for Applied Micro X-Gene SoCs" + select USB_XHCI_PLATFORM + depends on ARCH_XGENE || COMPILE_TEST + ---help--- + Say 'Y' to enable the support for the xHCI host controller + found in Applied Micro X-Gene ARM SoCs. + So just remove this symbol and let the user select USB_XHCI_PLATFORM USB_XHCI_PLATFORM isn't currently user selectable since it doesn't have a string after the tristate. It gets automatically selected by USB_XHCI_RCAR and USB_XHCI_MVEBU and I was continuing the pattern. Do you want me to make it user selectable instead? @@ -290,6 +291,15 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif + static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -297,6 +307,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), }, }; MODULE_ALIAS("platform:xhci-hcd"); This change looks good, just the comment is a bit misleading. I'll change the comment in the resubmit. --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2] [usb] make xhci platform driver use 64 bit or 32 bit DMA
On 10/30/2014 02:05 PM, Arnd Bergmann wrote: On Thursday 30 October 2014 13:16:28 Mark Langsdorf wrote: - /* Initialize dma_mask and coherent_dma_mask to 32-bits */ - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; + /* Try setting the coherent_dma_mask to 64 bits, then try 32 bits */ + if (sizeof(dma_addr_t) < 8 || + dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } if (!pdev->dev.dma_mask) pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; else - dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + dma_set_mask(&pdev->dev, pdev->dev.coherent_dma_mask); hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) The logic here seems wrong: if dma_set_mask is successful, you can rely on on dma_set_coherent_mask suceeding as well, but not the other way round. That's the order in the existing driver. Would you prefer I switch it to: if (sizeof(dma_addr_t) < 8 || dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) { ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret; } dma_set_coherent_mask(&pdev->dev, pdev->dev.dma_mask); or based on the comment below: ret = dma_set_mask(&pdev->dev, pdev->dev.dma_mask); if (ret) return ret; dma_set_coherent_mask(&pdev->dev, pdev->dev.dma_mask); I prefer this version but I don't know if it would work. Also, we should no longer need to worry about the case where pdev->dev.dma_mask is NULL, as this now gets initialized from the DT setup. I'm running this on a system with ACPI enabled and no DT. Does that make a difference? --Mark Langsdorf -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/2] [usb] make xhci platform driver use 64 bit or 32 bit DMA
The xhci platform driver needs to work on systems that either only support 64-bit DMA or only support 32-bit DMA. Attempt to set a coherent dma mask for 64-bit DMA, and attempt again with 32-bit DMA if that fails. Signed-off-by: Mark Langsdorf --- drivers/usb/host/xhci-plat.c | 13 - 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 1a0cf9f..3045e77 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -147,14 +147,17 @@ static int xhci_plat_probe(struct platform_device *pdev) return ret; } - /* Initialize dma_mask and coherent_dma_mask to 32-bits */ - ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; + /* Try setting the coherent_dma_mask to 64 bits, then try 32 bits */ + if (sizeof(dma_addr_t) < 8 || + dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } if (!pdev->dev.dma_mask) pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; else - dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + dma_set_mask(&pdev->dev, pdev->dev.coherent_dma_mask); hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 2/2] [usb] add support for APM X-Gene to xhci-platform
Applied Micro's X-Gene platform uses the xhci-platform for USB. Add the glue to decode it from ACPI and change the Kconfig files so the xhci-plat.o file gets built. Signed-off-by: Mark Langsdorf --- arch/arm64/Kconfig | 1 + drivers/usb/host/Kconfig | 8 drivers/usb/host/xhci-plat.c | 11 +++ 3 files changed, 20 insertions(+) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 042f785..07549ec 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -149,6 +149,7 @@ config ARCH_XGENE bool "AppliedMicro X-Gene SOC Family" select MFD_SYSCON select POWER_RESET_SYSCON + select USB_XHCI_XGENE help This enables support for AppliedMicro X-Gene SOC Family diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 82800a7..9fd52db 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -45,6 +45,14 @@ config USB_XHCI_RCAR Say 'Y' to enable the support for the xHCI host controller found in Renesas R-Car ARM SoCs. +config USB_XHCI_XGENE + tristate "xHCI support for Applied Micro X-Gene SoCs" + select USB_XHCI_PLATFORM + depends on ARCH_XGENE || COMPILE_TEST + ---help--- + Say 'Y' to enable the support for the xHCI host controller + found in Applied Micro X-Gene ARM SoCs. + endif # USB_XHCI_HCD config USB_EHCI_HCD diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 3045e77..5012c68 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "xhci.h" #include "xhci-mvebu.h" @@ -290,6 +291,15 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id usb_xhci_acpi_match[] = { + /* APM X-Gene USB Controller */ + { "PNP0D10", }, + { } +}; +MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); +#endif + static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, @@ -297,6 +307,7 @@ static struct platform_driver usb_xhci_driver = { .name = "xhci-hcd", .pm = DEV_PM_OPS, .of_match_table = of_match_ptr(usb_xhci_of_match), + .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), }, }; MODULE_ALIAS("platform:xhci-hcd"); -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[usb] add support for APM X-Gene to xhci-platform
Applied Micro's X-Gene platform uses ARM64 processors and a standard, XHCI compatible piece of silicon for USB connectivity. It only supports 64 bit DMA. Modify the xhci platform driver to use either 32 bit or 64 bit DMA, as appropriate, and then modify the platform driver to recognize the ACPI signature of the silicon. -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html