File: mm-init.h

package info (click to toggle)
kernel-source-2.1.125 2.1.125-1
  • links: PTS
  • area: main
  • in suites: slink
  • size: 61,100 kB
  • ctags: 177,944
  • sloc: ansic: 1,045,652; asm: 47,658; makefile: 7,656; sh: 1,038; perl: 836; cpp: 521; tcl: 427; lisp: 218; awk: 133; sed: 72
file content (47 lines) | stat: -rw-r--r-- 1,166 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
 * linux/include/asm-arm/arch-rpc/mmap.h
 *
 * Copyright (C) 1996 Russell King
 */

#define HAVE_MAP_VID_MEM

unsigned long map_screen_mem(unsigned long log_start, unsigned long kmem, int update)
{
	static int updated = 0;
	unsigned long address;
	pgd_t *pgd;

	if (updated)
		return 0;
	updated = update;

	address = SCREEN_START | PMD_TYPE_SECT | PMD_DOMAIN(DOMAIN_KERNEL) | PMD_SECT_AP_WRITE;
	pgd = swapper_pg_dir + (SCREEN2_BASE >> PGDIR_SHIFT);
	pgd_val(pgd[0]) = address;
	pgd_val(pgd[1]) = address + (1 << PGDIR_SHIFT);

	if (update) {
		unsigned long pgtable = PAGE_ALIGN(kmem), *p;
		int i;

		memzero ((void *)pgtable, 4096);
		
		pgd_val(pgd[-2]) = __virt_to_phys(pgtable) | PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_KERNEL);
		pgd_val(pgd[-1]) = __virt_to_phys(pgtable + PTRS_PER_PTE*4) | PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_KERNEL);
		p = (unsigned long *)pgtable;

		i = PTRS_PER_PTE * 2 - ((SCREEN1_END - log_start) >> PAGE_SHIFT);
		address = SCREEN_START | PTE_TYPE_SMALL | PTE_AP_WRITE;

		while (i < PTRS_PER_PTE * 2) {
			p[i++] = address;
			address += PAGE_SIZE;
		}

		flush_page_to_ram(pgtable);

		kmem = pgtable + PAGE_SIZE;
	}
	return kmem;
}