3 * baget.c: Baget low level stuff
5 * Copyright (C) 1998 Gleb Raiko & Vladimir Roganov
10 #include <linux/kernel.h>
12 #include <asm/system.h>
13 #include <asm/bootinfo.h>
14 #include <asm/mipsregs.h>
15 #include <asm/pgtable.h>
17 #include <asm/baget/baget.h>
20 * Following values are set by BALO into RAM disk buffer parameters
22 unsigned long balo_ramdisk_base
= 0xBA; /* Signature for BALO ! */
23 unsigned long balo_ramdisk_size
= 0;
27 * Following code is based on routines from 'mm/vmalloc.c'
28 * Additional parameters ioaddr is needed to iterate across real I/O address.
30 static inline int alloc_area_pte(pte_t
* pte
, unsigned long address
,
31 unsigned long size
, unsigned long ioaddr
)
39 while (address
< end
) {
42 printk("kseg2_alloc_io: page already exists\n");
44 * For MIPS looks pretty to have transparent mapping
45 * for KSEG2 areas -- user can't access one, and no
46 * problems with virtual <--> physical translation.
48 page
= ioaddr
& PAGE_MASK
;
50 set_pte(pte
, __pte(page
| pgprot_val(PAGE_USERIO
) |
51 _PAGE_GLOBAL
| __READABLE
| __WRITEABLE
));
59 static inline int alloc_area_pmd(pmd_t
* pmd
, unsigned long address
,
60 unsigned long size
, unsigned long ioaddr
)
64 address
&= ~PGDIR_MASK
;
68 while (address
< end
) {
69 pte_t
* pte
= pte_alloc_kernel(pmd
, address
);
72 if (alloc_area_pte(pte
, address
, end
- address
, ioaddr
))
74 address
= (address
+ PMD_SIZE
) & PMD_MASK
;
81 int kseg2_alloc_io (unsigned long address
, unsigned long size
)
84 unsigned long end
= address
+ size
;
86 dir
= pgd_offset_k(address
);
88 while (address
< end
) {
92 pmd
= pmd_alloc_kernel(dir
, address
);
95 if (alloc_area_pmd(pmd
, address
, end
- address
, address
))
97 if (pgd_val(olddir
) != pgd_val(*dir
))
98 set_pgdir(address
, *dir
);
99 address
= (address
+ PGDIR_SIZE
) & PGDIR_MASK
;