From: mathias.nyman@linux.intel.com (Mathias Nyman)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA
Date: Tue, 01 Sep 2015 14:54:17 +0300 [thread overview]
Message-ID: <55E591E9.60008@linux.intel.com> (raw)
In-Reply-To: <CADaLNDnPaeHcMjywsuQ4oiUpWsNpStshdKVtW=tuUorrcQkZ=g@mail.gmail.com>
On 31.08.2015 21:58, Duc Dang wrote:
> On Thu, Aug 20, 2015 at 12:38 PM, Duc Dang <dhdang@apm.com> wrote:
>> 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.
>>
>> [dhdang: regenerate the patch over 4.2-rc5 and address new comments]
>> Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
>> Tested-by: Mark Salter <msalter@redhat.com>
>> Signed-off-by: Duc Dang <dhdang@apm.com>
>>
>> ---
>> Changes from v6:
>> -Add WARN_ON if dma_mask is NULL
>> -Use dma_coerce_mask_and_coherent to assign
>> dma_mask and coherent_dma_mask
>>
>> Changes from v5:
>> -Change comment
>> -Assign dma_mask to coherent_dma_mask if dma_mask is NULL
>> to make sure dma_set_mask_and_coherent does not fail prematurely.
>>
>> Changes from v4:
>> -None
>>
>> Changes from v3:
>> -Re-generate the patch over 4.2-rc5
>> -No code change.
>>
>> 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 | 21 +++++++++++++--------
>> 1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
>> index 890ad9d..e4c7f9d 100644
>> --- a/drivers/usb/host/xhci-plat.c
>> +++ b/drivers/usb/host/xhci-plat.c
>> @@ -93,14 +93,19 @@ static int xhci_plat_probe(struct platform_device *pdev)
>> if (irq < 0)
>> return -ENODEV;
>>
>> - /* 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));
>> + /* Throw a waring if broken platform code didn't initialize dma_mask */
>> + WARN_ON(!pdev->dev.dma_mask);
>> + /*
>> + * Try setting dma_mask and coherent_dma_mask to 64 bits,
>> + * then try 32 bits
>> + */
>> + ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
>> + if (ret) {
>> + ret = dma_coerce_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.1
>>
>
> Hi Greg, Arnd, Russell,
>
> Do you have any more comment about this patch set?
>
I'm not sure I fully understand why we need to try the 64 bit DMA mask in platform probe.
As I understood it we just want to have some DMA mask set before calling usb_create_hcd()
to make sure USB core gets the "uses_dma" flag set and dma_set_mask() won't fail because of
missing dev->dma_mask.
The correct DMA mask is set later in xhci_gen_setup()
We also need to make sure the controller supports 64bit addressing capability before setting a 64 bit DMA mask.
(bit 0 in HCCPARAMS)
So for platform devices it goes look go this:
xhci_plat_probe()
usb_create_hcd()
usb_create_shared_hcd()
hcd->self.uses_dma = (dev->dma_mask != NULL);
usb_add_hcd()
hcd->driver->reset() (.reset = xhci_plat_setup)
xhci_plat_setup()
xhci_gen_setup()
if (HCC_64BIT_ADDR(xhci->hcc_params) && !dma_set_mask(dev, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
dma_set_coherent_mask(dev, DMA_BIT_MASK(64));
}
or do we end up with dev->dma_mask = NULL on 64-bit DMA only after trying to set it to 32 in xhci_plat_probe(),
and thus also failing the dma_set_mask() in xhci_gen_setup()?
-Mathias
WARNING: multiple messages have this Message-ID (diff)
From: Mathias Nyman <mathias.nyman@linux.intel.com>
To: Duc Dang <dhdang@apm.com>, Greg KH <gregkh@linuxfoundation.org>,
Russell King - ARM Linux <linux@arm.linux.org.uk>,
Loc Ho <lho@apm.com>, Arnd Bergmann <arnd@arndb.de>
Cc: USB list <linux-usb@vger.kernel.org>,
linux-arm <linux-arm-kernel@lists.infradead.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
mathias.nyman@intel.com, Mark Langsdorf <mlangsdo@redhat.com>,
patches <patches@apm.com>, Feng Kan <fkan@apm.com>
Subject: Re: [PATCH v7 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA
Date: Tue, 01 Sep 2015 14:54:17 +0300 [thread overview]
Message-ID: <55E591E9.60008@linux.intel.com> (raw)
In-Reply-To: <CADaLNDnPaeHcMjywsuQ4oiUpWsNpStshdKVtW=tuUorrcQkZ=g@mail.gmail.com>
On 31.08.2015 21:58, Duc Dang wrote:
> On Thu, Aug 20, 2015 at 12:38 PM, Duc Dang <dhdang@apm.com> wrote:
>> 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.
>>
>> [dhdang: regenerate the patch over 4.2-rc5 and address new comments]
>> Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
>> Tested-by: Mark Salter <msalter@redhat.com>
>> Signed-off-by: Duc Dang <dhdang@apm.com>
>>
>> ---
>> Changes from v6:
>> -Add WARN_ON if dma_mask is NULL
>> -Use dma_coerce_mask_and_coherent to assign
>> dma_mask and coherent_dma_mask
>>
>> Changes from v5:
>> -Change comment
>> -Assign dma_mask to coherent_dma_mask if dma_mask is NULL
>> to make sure dma_set_mask_and_coherent does not fail prematurely.
>>
>> Changes from v4:
>> -None
>>
>> Changes from v3:
>> -Re-generate the patch over 4.2-rc5
>> -No code change.
>>
>> 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 | 21 +++++++++++++--------
>> 1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
>> index 890ad9d..e4c7f9d 100644
>> --- a/drivers/usb/host/xhci-plat.c
>> +++ b/drivers/usb/host/xhci-plat.c
>> @@ -93,14 +93,19 @@ static int xhci_plat_probe(struct platform_device *pdev)
>> if (irq < 0)
>> return -ENODEV;
>>
>> - /* 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));
>> + /* Throw a waring if broken platform code didn't initialize dma_mask */
>> + WARN_ON(!pdev->dev.dma_mask);
>> + /*
>> + * Try setting dma_mask and coherent_dma_mask to 64 bits,
>> + * then try 32 bits
>> + */
>> + ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
>> + if (ret) {
>> + ret = dma_coerce_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.1
>>
>
> Hi Greg, Arnd, Russell,
>
> Do you have any more comment about this patch set?
>
I'm not sure I fully understand why we need to try the 64 bit DMA mask in platform probe.
As I understood it we just want to have some DMA mask set before calling usb_create_hcd()
to make sure USB core gets the "uses_dma" flag set and dma_set_mask() won't fail because of
missing dev->dma_mask.
The correct DMA mask is set later in xhci_gen_setup()
We also need to make sure the controller supports 64bit addressing capability before setting a 64 bit DMA mask.
(bit 0 in HCCPARAMS)
So for platform devices it goes look go this:
xhci_plat_probe()
usb_create_hcd()
usb_create_shared_hcd()
hcd->self.uses_dma = (dev->dma_mask != NULL);
usb_add_hcd()
hcd->driver->reset() (.reset = xhci_plat_setup)
xhci_plat_setup()
xhci_gen_setup()
if (HCC_64BIT_ADDR(xhci->hcc_params) && !dma_set_mask(dev, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
dma_set_coherent_mask(dev, DMA_BIT_MASK(64));
}
or do we end up with dev->dma_mask = NULL on 64-bit DMA only after trying to set it to 32 in xhci_plat_probe(),
and thus also failing the dma_set_mask() in xhci_gen_setup()?
-Mathias
next prev parent reply other threads:[~2015-09-01 11:54 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CADaLNDkeOP+gBw0qdSDha551w+w+q4ry9-EevDw5giyiQGdnqA@mail.gmail.com>
2015-08-08 1:03 ` [PATCH v4 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA Duc Dang
2015-08-08 1:03 ` Duc Dang
2015-08-08 1:03 ` [PATCH v4 2/2] usb: Add support for ACPI identification to xhci-platform Duc Dang
2015-08-08 1:03 ` Duc Dang
2015-08-08 1:29 ` Greg KH
2015-08-08 1:29 ` Greg KH
2015-08-08 2:40 ` Duc Dang
2015-08-08 2:40 ` Duc Dang
2015-08-08 3:18 ` [PATCH v5 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA Duc Dang
2015-08-08 3:18 ` Duc Dang
2015-08-08 3:18 ` [PATCH v5 2/2] usb: Add support for ACPI identification to xhci-platform Duc Dang
2015-08-08 3:18 ` Duc Dang
2015-08-08 9:22 ` [PATCH v5 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA Russell King - ARM Linux
2015-08-08 9:22 ` Russell King - ARM Linux
2015-08-08 20:31 ` Duc Dang
2015-08-08 20:31 ` Duc Dang
2015-08-15 20:05 ` Arnd Bergmann
2015-08-15 20:05 ` Arnd Bergmann
2015-08-19 21:28 ` Duc Dang
2015-08-19 21:28 ` Duc Dang
2015-08-20 13:09 ` Arnd Bergmann
2015-08-20 13:09 ` Arnd Bergmann
2015-08-20 19:38 ` [PATCH v7 " Duc Dang
2015-08-20 19:38 ` Duc Dang
2015-08-20 19:38 ` [PATCH v7 2/2] usb: Add support for ACPI identification to xhci-platform Duc Dang
2015-08-20 19:38 ` Duc Dang
2015-08-31 18:58 ` [PATCH v7 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA Duc Dang
2015-08-31 18:58 ` Duc Dang
2015-09-01 11:54 ` Mathias Nyman [this message]
2015-09-01 11:54 ` Mathias Nyman
2015-09-01 12:07 ` Russell King - ARM Linux
2015-09-01 12:07 ` Russell King - ARM Linux
2015-09-10 20:53 ` Duc Dang
2015-09-10 20:53 ` Duc Dang
2015-09-17 18:19 ` [PATCH v8 0/3] usb: xhci-platform: Configure 64-bit DMA mask if the platform is capable Duc Dang
2015-09-17 18:19 ` Duc Dang
2015-09-17 18:19 ` [PATCH v8 1/3] usb: make xhci platform driver use 64 bit or 32 bit DMA Duc Dang
2015-09-17 18:19 ` Duc Dang
2015-09-17 19:51 ` Arnd Bergmann
2015-09-17 19:51 ` Arnd Bergmann
2015-09-17 20:29 ` Duc Dang
2015-09-17 20:29 ` Duc Dang
2015-09-17 18:19 ` [PATCH v8 2/3] usb: Add support for ACPI identification to xhci-platform Duc Dang
2015-09-17 18:19 ` Duc Dang
2015-09-17 18:19 ` [PATCH v8 3/3] usb: xhci: configure 32-bit DMA if the controller does not support 64-bit DMA Duc Dang
2015-09-17 18:19 ` Duc Dang
2015-09-30 21:24 ` [PATCH v8 0/3] usb: xhci-platform: Configure 64-bit DMA mask if the platform is capable Duc Dang
2015-09-30 21:24 ` Duc Dang
2015-10-04 9:10 ` Greg KH
2015-10-04 9:10 ` Greg KH
2015-10-07 13:20 ` Mathias Nyman
2015-10-07 13:20 ` Mathias Nyman
2015-08-10 7:37 ` [PATCH v6 1/2] usb: make xhci platform driver use 64 bit or 32 bit DMA Duc Dang
2015-08-10 7:37 ` Duc Dang
2015-08-10 7:37 ` [PATCH v6 2/2] usb: Add support for ACPI identification to xhci-platform Duc Dang
2015-08-10 7:37 ` Duc Dang
2015-08-08 5:43 ` [PATCH v4 " Javier Martinez Canillas
2015-08-08 5:43 ` Javier Martinez Canillas
2015-08-08 15:37 ` Greg KH
2015-08-08 15:37 ` Greg KH
2015-08-08 16:45 ` Duc Dang
2015-08-08 16:45 ` Duc Dang
2015-08-08 21:05 ` Javier Martinez Canillas
2015-08-08 21:05 ` Javier Martinez Canillas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55E591E9.60008@linux.intel.com \
--to=mathias.nyman@linux.intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.