Index: arch/parisc/kernel/ccio-dma.c =================================================================== RCS file: /var/cvs/linux/arch/parisc/kernel/ccio-dma.c,v retrieving revision 1.55 diff -u -p -r1.55 ccio-dma.c --- arch/parisc/kernel/ccio-dma.c 3 Aug 2002 08:18:20 -0000 1.55 +++ arch/parisc/kernel/ccio-dma.c 20 Sep 2002 23:43:32 -0000 @@ -1461,10 +1461,28 @@ static void __init ccio_init_resources(s static void expand_ioc_area(struct ioc *ioc, unsigned long size, unsigned long min, unsigned long max, unsigned long align) { -#ifdef NASTY_HACK_FOR_K_CLASS - __raw_writel(0xfffff600, (unsigned long)&(ioc->ioc_hpa->io_io_high)); - ioc->mmio_region[0].end = 0xf5ffffff; -#endif + int i; + + for (i = 0; i < 2; i++) { + unsigned long addr; + signed int val; + struct resource *parent = ioc->mmio_region + i; + + if (parent->sibling->start - parent->end < size) + continue; + + parent->end += size; + + if (i == 0) { + addr = (unsigned long) &ioc->ioc_hpa->io_io_high; + } else { + addr = (unsigned long) &ioc->ioc_hpa->io_io_high_hv; + } + + val = parent->end + 1; + val >>= 16; /* sign extends */ + __raw_writel(val, addr); + } } static struct resource *ccio_get_resource(struct ioc* ioc, @@ -1490,17 +1508,22 @@ int ccio_allocate_resource(const struct void *alignf_data) { struct ioc *ioc = ccio_get_iommu(dev); - struct resource *parent = ccio_get_resource(ioc, dev); - if (!parent) - return -EBUSY; - if (!allocate_resource(parent, res, size, min, max, align, alignf, - alignf_data)) + if (!allocate_resource(ioc->mmio_region, res, size, min, max, align, alignf, + alignf_data)) + return 0; + + if (!allocate_resource(ioc->mmio_region + 1, res, size, min, max, align, alignf, + alignf_data)) return 0; expand_ioc_area(ioc, size, min, max, align); - return allocate_resource(parent, res, size, min, max, align, alignf, - alignf_data); + if (!allocate_resource(ioc->mmio_region, res, size, min, max, align, alignf, + alignf_data)) + return 0; + + return allocate_resource(ioc->mmio_region + 1, res, size, min, max, align, alignf, + alignf_data); } int ccio_request_resource(const struct parisc_device *dev,