2002-02-14 17:26:39

by Luigi Genoni

[permalink] [raw]
Subject: cleanup for i810 chipset for 2.5.5-pre1. Second...

Well, my mailer did some bad things with tabs, spaces and so on...
What can I say, I hate when it happens, I hope this time is the good one.

Luigi (definitelly should find a better mailer)

--- linux/sound/oss/i810_audio.c.old Thu Feb 14 10:33:12 2002
+++ linux/sound/oss/i810_audio.c Thu Feb 14 12:29:15 2002
@@ -939,7 +939,7 @@

for(i=0;i<dmabuf->numfrag;i++)
{
- sg->busaddr=virt_to_bus(dmabuf->rawbuf+dmabuf->fragsize*i);
+ sg->busaddr=virt_to_phys(dmabuf->rawbuf+dmabuf->fragsize*i);
// the card will always be doing 16bit stereo
sg->control=dmabuf->fragsamples;
if(state->card->pci_id == PCI_DEVICE_ID_SI_7012)
@@ -954,7 +954,7 @@
}
spin_lock_irqsave(&state->card->lock, flags);
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(virt_to_phys(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);

@@ -1669,7 +1669,7 @@
if (size > (PAGE_SIZE << dmabuf->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start,
size, vma->vm_page_prot))
goto out;
dmabuf->mapped = 1;
@@ -1722,7 +1722,7 @@
}
if (c != NULL) {
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(virt_to_phys(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);
}
--- linux/sound/oss/dmabuf.c.old Thu Feb 14 12:34:45 2002
+++ linux/sound/oss/dmabuf.c Thu Feb 14 12:35:00 2002
@@ -113,7 +113,7 @@
}
}
dmap->raw_buf = start_addr;
- dmap->raw_buf_phys = virt_to_bus(start_addr);
+ dmap->raw_buf_phys = virt_to_phys(start_addr);

for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
mem_map_reserve(page);
--- linux/drivers/char/drm/i810_dma.c.old Thu Feb 14 12:36:36 2002
+++ linux/drivers/char/drm/i810_dma.c Thu Feb 14 12:36:53 2002
@@ -491,7 +491,7 @@
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);

- I810_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+ I810_WRITE(0x02080, virt_to_phys((void *)dev_priv->hw_status_page));
DRM_DEBUG("Enabled hardware status page\n");

/* Now we need to init our freelist */
--- linux/sound/oss/i810_audio.c.old Thu Feb 14 10:33:12 2002
+++ linux/sound/oss/i810_audio.c Thu Feb 14 12:29:15 2002
@@ -939,7 +939,7 @@

for(i=0;i<dmabuf->numfrag;i++)
{
- sg->busaddr=virt_to_bus(dmabuf->rawbuf+dmabuf->fragsize*i);
+ sg->busaddr=virt_to_phys(dmabuf->rawbuf+dmabuf->fragsize*i);
// the card will always be doing 16bit stereo
sg->control=dmabuf->fragsamples;
if(state->card->pci_id == PCI_DEVICE_ID_SI_7012)
@@ -954,7 +954,7 @@
}
spin_lock_irqsave(&state->card->lock, flags);
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(virt_to_phys(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);

@@ -1669,7 +1669,7 @@
if (size > (PAGE_SIZE << dmabuf->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
goto out;
dmabuf->mapped = 1;
@@ -1722,7 +1722,7 @@
}
if (c != NULL) {
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(virt_to_phys(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);
}





2002-02-15 07:30:28

by Martin Dalecki

[permalink] [raw]
Subject: Re: cleanup for i810 chipset for 2.5.5-pre1. Second...

diff -ur linux-2.5.4/Documentation/IO-mapping.txt linux/Documentation/IO-mapping.txt
--- linux-2.5.4/Documentation/IO-mapping.txt Mon Feb 11 02:50:14 2002
+++ linux/Documentation/IO-mapping.txt Thu Feb 14 23:08:05 2002
@@ -76,9 +76,13 @@

phys_addr = virt_to_phys(virt_addr);
virt_addr = phys_to_virt(phys_addr);
- bus_addr = virt_to_bus(virt_addr);
+ bus_addr = xxx_virt_to_bus(virt_addr);
virt_addr = bus_to_virt(bus_addr);

+Where xxx is denotifying the particular bus architecture tragetted like:
+
+ ias_virt_to_bus();
+
Now, when do you need these?

You want the _virtual_ address when you are actually going to access that
diff -ur linux-2.5.4/sound/oss/i810_audio.c linux/sound/oss/i810_audio.c
--- linux-2.5.4/sound/oss/i810_audio.c Thu Feb 14 23:26:47 2002
+++ linux/sound/oss/i810_audio.c Thu Feb 14 23:09:50 2002
@@ -66,7 +66,7 @@
*
* This driver is cursed. (Ben LaHaise)
*/
-
+
#include <linux/module.h>
#include <linux/version.h>
#include <linux/string.h>
@@ -135,14 +135,17 @@

/* the 810's array of pointers to data buffers */

+/* Since this structure get's accessed by the AC'97 codec device, we fixup the
+ * in core layout of it by adding the packed attribute here. */
+
struct sg_item {
#define BUSADDR_MASK 0xFFFFFFFE
- u32 busaddr;
-#define CON_IOC 0x80000000 /* interrupt on completion */
+ u32 bus_addr;
+#define CON_IOC 0x80000000 /* interrupt on completion */
#define CON_BUFPAD 0x40000000 /* pad underrun with last sample, else 0 */
#define CON_BUFLEN_MASK 0x0000ffff /* buffer length in samples */
u32 control;
-};
+} __attribute__ ((packed));

/* an instance of the i810 channel */
#define SG_LEN 32
@@ -936,10 +939,10 @@
* Load up 32 sg entries and take an interrupt at half
* way (we might want more interrupts later..)
*/
-
+
for(i=0;i<dmabuf->numfrag;i++)
{
- sg->busaddr=virt_to_bus(dmabuf->rawbuf+dmabuf->fragsize*i);
+ sg->bus_addr= dmabuf->dma_handle + dmabuf->fragsize * i;
// the card will always be doing 16bit stereo
sg->control=dmabuf->fragsamples;
if(state->card->pci_id == PCI_DEVICE_ID_SI_7012)
@@ -954,7 +957,7 @@
}
spin_lock_irqsave(&state->card->lock, flags);
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(isa_virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);

@@ -1669,7 +1672,7 @@
if (size > (PAGE_SIZE << dmabuf->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
goto out;
dmabuf->mapped = 1;
@@ -1722,7 +1725,7 @@
}
if (c != NULL) {
outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
- outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
+ outl(isa_virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
outb(0, state->card->iobase+c->port+OFF_CIV);
outb(0, state->card->iobase+c->port+OFF_LVI);
}


Attachments:
i810_audio.patch (3.12 kB)

2002-02-15 07:55:35

by Jeff Garzik

[permalink] [raw]
Subject: Re: cleanup for i810 chipset for 2.5.5-pre1. Second...

Martin Dalecki wrote:
>
> Luigi Genoni wrote:
>
> >Well, my mailer did some bad things with tabs, spaces and so on...
> >What can I say, I hate when it happens, I hope this time is the good one.
> >
>
> Well better take this, it should make even DM and JG as well as other
> "portability" fanatics happy ;-).
> And as a bonus I'm just adding a fixing note to the documentation, which
> by the way is
> no longer accurate.

Well, I've mentioned this at least three times, Pete Zaitcev has a patch
which fixes i810_audio properly -- and he even posted it to lkml less
than 24 hours ago. Subject "Re: 2.5.5-pre1 and i810_audio.c",
message-id <[email protected]>

Further, Alan Cox pointed out that the i810_audio workalike chipsets
exist on Alpha, so your solution is still non-portable specifically for
case where portability is needed.

Jeff


--
Jeff Garzik | "I went through my candy like hot oatmeal
Building 1024 | through an internally-buttered weasel."
MandrakeSoft | - goats.com

2002-02-15 19:34:27

by Pete Zaitcev

[permalink] [raw]
Subject: Re: cleanup for i810 chipset for 2.5.5-pre1. Second...

> diff -ur linux-2.5.4/sound/oss/i810_audio.c linux/sound/oss/i810_audio.c
> --- linux-2.5.4/sound/oss/i810_audio.c Thu Feb 14 23:26:47 2002
> +++ linux/sound/oss/i810_audio.c Thu Feb 14 23:09:50 2002
> @@ -66,7 +66,7 @@
> *
> * This driver is cursed. (Ben LaHaise)
> */
> -
> +
> #include <linux/module.h>
> #include <linux/version.h>
> #include <linux/string.h>

Leave the syntax sugar out, will you? It's dledford's job to clean it.

> @@ -135,14 +135,17 @@
>
> /* the 810's array of pointers to data buffers */
>
> +/* Since this structure get's accessed by the AC'97 codec device, we fixup the
> + * in core layout of it by adding the packed attribute here. */
> +
> struct sg_item {
> #define BUSADDR_MASK 0xFFFFFFFE
> - u32 busaddr;
> -#define CON_IOC 0x80000000 /* interrupt on completion */
> + u32 bus_addr;
> +#define CON_IOC 0x80000000 /* interrupt on completion */
> #define CON_BUFPAD 0x40000000 /* pad underrun with last sample, else 0 */
> #define CON_BUFLEN_MASK 0x0000ffff /* buffer length in samples */
> u32 control;
> -};
> +} __attribute__ ((packed));
>
> /* an instance of the i810 channel */
> #define SG_LEN 32

Sounds like a nonsense to me. Show me one architecture that
does not pack the structure correctly without ((packed)).
You got Linux on CRAY-1 going?

> - sg->busaddr=virt_to_bus(dmabuf->rawbuf+dmabuf->fragsize*i);
> + sg->bus_addr= dmabuf->dma_handle + dmabuf->fragsize * i;

Close, but no cigar, see below.

> @@ -954,7 +957,7 @@
> }
> spin_lock_irqsave(&state->card->lock, flags);
> outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */
> - outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
> + outl(isa_virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
> outb(0, state->card->iobase+c->port+OFF_CIV);
> outb(0, state->card->iobase+c->port+OFF_LVI);
>

Why not to use pci_alloc_consistent here? I did it in 10 minutes,
even posted a patch here.

> @@ -1669,7 +1672,7 @@
> if (size > (PAGE_SIZE << dmabuf->buforder))
> goto out;
> ret = -EAGAIN;
> - if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
> + if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
> size, vma->vm_page_prot))
> goto out;
> dmabuf->mapped = 1;

OK

> - outl(virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);
> + outl(isa_virt_to_bus(&c->sg[0]), state->card->iobase+c->port+OFF_BDBAR);

Same as above - must be reworked.

-- Pete