|
Thanks David Miller, Jay Estabrook and Richard Henderson for
reviewing the patch and for corrections.
Description:
The ISA dma falls into 2 classes.
1. True busmastering (aka DMA_MODE_CASCADE) when the ISA device
generate bus addresses by itself. Obviously, such devices are
limited to lower 16 Mb as there are only 24 address lines on
the ISA bus. Drivers for these devices pass NULL pdev
argument to pci mapping functions, and we must always use
dma_mask = 0x00ffffff in this case.
2. ISA devices using i8237 DMA controller functionality:
floppy, all soundcards (AFAIK) and a lot of other cheap ISA cards.
In this case actual device doing DMA is a PCI-to-ISA bridge.
Quite a few of ISA bridges can do 32-bit DMA (using "high page"
extensions), and alpha traditionally uses this.
I propose the following:
introduce 'struct pci_dev *isa_bridge' global variable; this
will be pointer to either real bridge device found by pci
probing code, or a fake device in special cases (like jensen running
generic kernel). isa_bridge->dma_mask will be set depending on DMA
capabilities of particular bridge (either using generic quirk list or
in an arch specific manner).
This would allow devices like floppy and audio utilize 32-bit DMA
just by replacing 'NULL' with 'isa_bridge' in the pci mapping calls.
Also, this helps to resolve ISA dma vs. MAX_DMA_ADDRESS mess on alpha.
Setting MAX_DMA_ADDRESS depending on the number of address lines
on the ISA bridge became bogus since early 2.4 when we started to
use the SG windows. Basically, if we have a working iommu, we don't
have any dma limitations. All we need is a correct dma_mask to choose
proper dma window.
OTOH, there are 'iommuless' alphas (rx164, nautilus, possibly early
miata) which need to have 16 Mb GFP_DMA zone (just like i386) even
if their ISA bridge is 32-bit.
Proposed changes:
- rename all XXX_MAX_DMA_ADDRESS to XXX_MAX_ISA_DMA_ADDRESS;
alpha_mv.max_dma_address - ditto (it's about 90% of the patch);
- ISA bridge on nautilus does support 32-bit dma;
- MAX_DMA_ADDRESS is 16 Mb if there is no iommu, ~0UL (unlimited)
otherwise;
- if needed, fall back to GFP_DMA allocations in
pci_alloc_consistent();
- pci_dma_supported() also returns success if GFP_DMA is helpful;
- isa_bridge stuff. Used only by floppy as yet.
Ivan.
|