Lines Matching refs:iounit
43 struct iounit_struct *iounit;
47 iounit = kzalloc(sizeof(struct iounit_struct), GFP_ATOMIC);
48 if (!iounit) {
49 prom_printf("SUN4D: Cannot alloc iounit, halting.\n");
53 iounit->limit[0] = IOUNIT_BMAP1_START;
54 iounit->limit[1] = IOUNIT_BMAP2_START;
55 iounit->limit[2] = IOUNIT_BMAPM_START;
56 iounit->limit[3] = IOUNIT_BMAPM_END;
57 iounit->rotor[1] = IOUNIT_BMAP2_START;
58 iounit->rotor[2] = IOUNIT_BMAPM_START;
66 op->dev.archdata.iommu = iounit;
67 iounit->page_table = xpt;
68 spin_lock_init(&iounit->lock);
70 xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t);
96 /* One has to hold iounit->lock to call this */
97 static unsigned long iounit_get_area(struct iounit_struct *iounit, unsigned long vaddr, int size)
115 rotor = iounit->rotor[j - 1];
116 limit = iounit->limit[j];
118 nexti: scan = find_next_zero_bit(iounit->bmap, limit, scan);
122 scan = iounit->limit[j - 1];
131 if (test_bit(scan++, iounit->bmap))
133 iounit->rotor[j - 1] = (scan < limit) ? scan : iounit->limit[j - 1];
138 set_bit(scan, iounit->bmap);
139 sbus_writel(iopte_val(iopte), &iounit->page_table[scan]);
150 struct iounit_struct *iounit = dev->archdata.iommu;
157 spin_lock_irqsave(&iounit->lock, flags);
158 ret = iounit_get_area(iounit, (unsigned long)vaddr, len);
159 spin_unlock_irqrestore(&iounit->lock, flags);
166 struct iounit_struct *iounit = dev->archdata.iommu;
172 spin_lock_irqsave(&iounit->lock, flags);
174 sg->dma_address = iounit_get_area(iounit, (unsigned long) sg_virt(sg), sg->length);
177 spin_unlock_irqrestore(&iounit->lock, flags);
184 struct iounit_struct *iounit = dev->archdata.iommu;
187 spin_lock_irqsave(&iounit->lock, flags);
192 clear_bit(vaddr, iounit->bmap);
193 spin_unlock_irqrestore(&iounit->lock, flags);
199 struct iounit_struct *iounit = dev->archdata.iommu;
204 spin_lock_irqsave(&iounit->lock, flags);
210 clear_bit(vaddr, iounit->bmap);
212 spin_unlock_irqrestore(&iounit->lock, flags);
219 struct iounit_struct *iounit = dev->archdata.iommu;
254 iopte = iounit->page_table + i;