From: Michael Buesch <mb@bu3sch.de>
To: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Ingo Molnar <mingo@elte.hu>, Alan Cox <alan@lxorguk.ukuu.org.uk>,
Andi Kleen <andi@firstfloor.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
vojtech@suse.cz, muli@il.ibm.com, jdmason@kudzu.us,
tglx@linutronix.de, mingo@redhat.com
Subject: Re: [PATCH RFC] x86: Fix 64-bit DMA masks on VIA
Date: Mon, 28 Apr 2008 23:48:14 +0200 [thread overview]
Message-ID: <200804282348.15330.mb@bu3sch.de> (raw)
In-Reply-To: <200804281004.07989.jbarnes@virtuousgeek.org>
On Monday 28 April 2008 19:04:07 Jesse Barnes wrote:
> On Monday, April 28, 2008 9:53 am Ingo Molnar wrote:
> > * Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> > > > > > This untested patch is supposed to fix DMAing on some VIA
> > > > > > boards. Currently the DMA subsystem returns an error, if the
> > > > > > driver does tell that it supports a 64bit DMA mask. So the
> > > > > > driver probing would fail in that case.
> > > > >
> > > > > The driver is broken then. It is supposed to retry with a small
> > > > > mask on an error. Please fix the driver.
> > > >
> > > > I already added a workaround to the driver. Why do we need to
> > > > workaround this in _every_ driver? (Note that _every_ driver
> > > > supporting a 64bit mask is affected). Why not fix it in the DMA
> > > > layer?
> > >
> > > Some hardware wants to know it can get a given DMA mask or failure. I
> > > agree however that a "pci_prefer_64bit_dma(pdev)" function would be a
> > > good patch for someone to submit tot he PCI layer code.
> >
> > yes, and i suspect Michael is correct in suggesting that the majority of
> > drivers would use that interface and would let the PCI layer handle the
> > probing/fallback details. (Jesse Cc:-ed)
>
> With an implied fallback to 32 bits? Michael's right (at least I think
> Michael's the one being quoted there) that "try 64 then fallback to 32 on
> error" is a pretty common sight, so having a hint that says you'd like 64 but
> don't really care would be a win for drivers.
>
> Michael, want to hack something up?
Something like this? (untested)
Index: wireless-testing/drivers/base/dma-mapping.c
===================================================================
--- wireless-testing.orig/drivers/base/dma-mapping.c 2008-04-28 23:34:19.000000000 +0200
+++ wireless-testing/drivers/base/dma-mapping.c 2008-04-28 23:46:25.000000000 +0200
@@ -216,3 +216,38 @@ void dmam_release_declared_memory(struct
EXPORT_SYMBOL(dmam_release_declared_memory);
#endif
+
+/**
+ * dma_set_mask_weak - Set the DMA mask. Retry with smaller masks.
+ * @dev: Device to set the mask on.
+ * @mask: Pointer to the mask that you want to set. The function will
+ * modify the mask and set it to the actually used mask, in case
+ * it had to fall back to a smaller mask.
+ *
+ * Set the DMA mask and allow falling back to smaller masks in
+ * case of an error.
+ *
+ * RETURNS:
+ * 0 on success, -errno on failure.
+ */
+int dma_set_mask_weak(struct device *dev, u64 *mask)
+{
+ u64 m = *mask;
+ int err;
+
+ if (m < DMA_MIN_FALLBACK_MASK)
+ return -EINVAL;
+ while (1) {
+ err = dma_set_mask(dev, m);
+ if (!err)
+ break;
+ /* Did not like this one. Try a smaller one. */
+ m >>= 1;
+ if (m < DMA_MIN_FALLBACK_MASK)
+ return err;
+ }
+ *mask = m;
+
+ return 0;
+}
+EXPORT_SYMBOL(dma_set_mask_weak);
Index: wireless-testing/include/linux/dma-mapping.h
===================================================================
--- wireless-testing.orig/include/linux/dma-mapping.h 2008-04-28 23:34:19.000000000 +0200
+++ wireless-testing/include/linux/dma-mapping.h 2008-04-28 23:35:35.000000000 +0200
@@ -60,6 +60,11 @@ static inline int is_device_dma_capable(
extern u64 dma_get_required_mask(struct device *dev);
+extern int dma_set_mask_weak(struct device *dev, u64 *mask);
+/* Smallest mask fallback used by dma_set_mask_weak(). */
+#define DMA_MIN_FALLBACK_MASK DMA_BIT_MASK(24) /* 16 MB */
+
+
static inline unsigned int dma_get_max_seg_size(struct device *dev)
{
return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
--
Greetings Michael.
prev parent reply other threads:[~2008-04-28 21:49 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-23 18:55 [PATCH RFC] x86: Fix 64-bit DMA masks on VIA Michael Buesch
2008-04-24 13:43 ` Andi Kleen
2008-04-24 14:06 ` Michael Buesch
2008-04-24 14:12 ` Andi Kleen
2008-04-24 14:18 ` David Miller
2008-04-24 14:32 ` Alan Cox
2008-04-24 15:19 ` Michael Buesch
2008-04-28 16:53 ` Ingo Molnar
2008-04-28 17:04 ` Jesse Barnes
2008-04-28 21:48 ` Michael Buesch [this message]
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=200804282348.15330.mb@bu3sch.de \
--to=mb@bu3sch.de \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=andi@firstfloor.org \
--cc=jbarnes@virtuousgeek.org \
--cc=jdmason@kudzu.us \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--cc=muli@il.ibm.com \
--cc=tglx@linutronix.de \
--cc=vojtech@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox