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 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.