diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /arch/mips/loongson/common/mem.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'arch/mips/loongson/common/mem.c')
-rw-r--r-- | arch/mips/loongson/common/mem.c | 96 |
1 files changed, 90 insertions, 6 deletions
diff --git a/arch/mips/loongson/common/mem.c b/arch/mips/loongson/common/mem.c index 7c92f79b6480..30eba6001205 100644 --- a/arch/mips/loongson/common/mem.c +++ b/arch/mips/loongson/common/mem.c | |||
@@ -12,24 +12,108 @@ | |||
12 | 12 | ||
13 | #include <loongson.h> | 13 | #include <loongson.h> |
14 | #include <mem.h> | 14 | #include <mem.h> |
15 | #include <pci.h> | ||
15 | 16 | ||
16 | void __init prom_init_memory(void) | 17 | void __init prom_init_memory(void) |
17 | { | 18 | { |
18 | add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM); | 19 | add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM); |
20 | |||
21 | add_memory_region(memsize << 20, LOONGSON_PCI_MEM_START - (memsize << | ||
22 | 20), BOOT_MEM_RESERVED); | ||
23 | |||
24 | #ifdef CONFIG_CPU_SUPPORTS_ADDRWINCFG | ||
25 | { | ||
26 | int bit; | ||
27 | |||
28 | bit = fls(memsize + highmemsize); | ||
29 | if (bit != ffs(memsize + highmemsize)) | ||
30 | bit += 20; | ||
31 | else | ||
32 | bit = bit + 20 - 1; | ||
33 | |||
34 | /* set cpu window3 to map CPU to DDR: 2G -> 2G */ | ||
35 | LOONGSON_ADDRWIN_CPUTODDR(ADDRWIN_WIN3, 0x80000000ul, | ||
36 | 0x80000000ul, (1 << bit)); | ||
37 | mmiowb(); | ||
38 | } | ||
39 | #endif /* !CONFIG_CPU_SUPPORTS_ADDRWINCFG */ | ||
40 | |||
19 | #ifdef CONFIG_64BIT | 41 | #ifdef CONFIG_64BIT |
20 | if (highmemsize > 0) | 42 | if (highmemsize > 0) |
21 | add_memory_region(LOONGSON_HIGHMEM_START, | 43 | add_memory_region(LOONGSON_HIGHMEM_START, |
22 | highmemsize << 20, BOOT_MEM_RAM); | 44 | highmemsize << 20, BOOT_MEM_RAM); |
23 | #endif /* CONFIG_64BIT */ | 45 | |
46 | add_memory_region(LOONGSON_PCI_MEM_END + 1, LOONGSON_HIGHMEM_START - | ||
47 | LOONGSON_PCI_MEM_END - 1, BOOT_MEM_RESERVED); | ||
48 | |||
49 | #endif /* !CONFIG_64BIT */ | ||
24 | } | 50 | } |
25 | 51 | ||
26 | /* override of arch/mips/mm/cache.c: __uncached_access */ | 52 | /* override of arch/mips/mm/cache.c: __uncached_access */ |
27 | int __uncached_access(struct file *file, unsigned long addr) | 53 | int __uncached_access(struct file *file, unsigned long addr) |
28 | { | 54 | { |
29 | if (file->f_flags & O_SYNC) | 55 | if (file->f_flags & O_DSYNC) |
30 | return 1; | 56 | return 1; |
31 | 57 | ||
32 | return addr >= __pa(high_memory) || | 58 | return addr >= __pa(high_memory) || |
33 | ((addr >= LOONGSON_MMIO_MEM_START) && | 59 | ((addr >= LOONGSON_MMIO_MEM_START) && |
34 | (addr < LOONGSON_MMIO_MEM_END)); | 60 | (addr < LOONGSON_MMIO_MEM_END)); |
35 | } | 61 | } |
62 | |||
63 | #ifdef CONFIG_CPU_SUPPORTS_UNCACHED_ACCELERATED | ||
64 | |||
65 | #include <linux/pci.h> | ||
66 | #include <linux/sched.h> | ||
67 | #include <asm/current.h> | ||
68 | |||
69 | static unsigned long uca_start, uca_end; | ||
70 | |||
71 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | ||
72 | unsigned long size, pgprot_t vma_prot) | ||
73 | { | ||
74 | unsigned long offset = pfn << PAGE_SHIFT; | ||
75 | unsigned long end = offset + size; | ||
76 | |||
77 | if (__uncached_access(file, offset)) { | ||
78 | if (uca_start && (offset >= uca_start) && | ||
79 | (end <= uca_end)) | ||
80 | return __pgprot((pgprot_val(vma_prot) & | ||
81 | ~_CACHE_MASK) | | ||
82 | _CACHE_UNCACHED_ACCELERATED); | ||
83 | else | ||
84 | return pgprot_noncached(vma_prot); | ||
85 | } | ||
86 | return vma_prot; | ||
87 | } | ||
88 | |||
89 | static int __init find_vga_mem_init(void) | ||
90 | { | ||
91 | struct pci_dev *dev = 0; | ||
92 | struct resource *r; | ||
93 | int idx; | ||
94 | |||
95 | if (uca_start) | ||
96 | return 0; | ||
97 | |||
98 | for_each_pci_dev(dev) { | ||
99 | if ((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { | ||
100 | for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) { | ||
101 | r = &dev->resource[idx]; | ||
102 | if (!r->start && r->end) | ||
103 | continue; | ||
104 | if (r->flags & IORESOURCE_IO) | ||
105 | continue; | ||
106 | if (r->flags & IORESOURCE_MEM) { | ||
107 | uca_start = r->start; | ||
108 | uca_end = r->end; | ||
109 | return 0; | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | |||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | late_initcall(find_vga_mem_init); | ||
119 | #endif /* !CONFIG_CPU_SUPPORTS_UNCACHED_ACCELERATED */ | ||