1 #include <linux/types.h>
2 #include <linux/kernel.h>
6 #include <linux/console.h>
9 #include <asm/bootinfo.h>
10 #include <asm/system.h>
11 #include <asm/pgtable.h>
12 #include <asm/apollodma.h>
15 /* note only works for 16 Bit 1 page DMA's */
17 static unsigned short next_free_xlat_entry
=0;
19 unsigned short dma_map_page(unsigned long phys_addr
,int count
,int type
) {
21 unsigned long page_aligned_addr
=phys_addr
& (~((1<<12)-1));
22 unsigned short start_map_addr
=page_aligned_addr
>> 10;
23 unsigned short free_xlat_entry
, *xlat_map_entry
;
26 free_xlat_entry
=next_free_xlat_entry
;
27 for(i
=0,xlat_map_entry
=addr_xlat_map
+(free_xlat_entry
<<2);i
<8;i
++,xlat_map_entry
++) {
29 printk("phys_addr: %x, page_aligned_addr: %x, start_map_addr: %x\n",phys_addr
,page_aligned_addr
,start_map_addr
+i
);
31 out_be16(xlat_map_entry
, start_map_addr
+i
);
34 next_free_xlat_entry
+=2;
35 if(next_free_xlat_entry
>125)
36 next_free_xlat_entry
=0;
39 printk("next_free_xlat_entry: %d\n",next_free_xlat_entry
);
42 return free_xlat_entry
<<10;
45 void dma_unmap_page(unsigned short dma_addr
) {