Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
32f6e431
Commit
32f6e431
authored
Sep 06, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
2cd24267
eb2e58de
Changes
32
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
569 additions
and
222 deletions
+569
-222
arch/arm/Makefile
arch/arm/Makefile
+2
-2
arch/arm/kernel/traps.c
arch/arm/kernel/traps.c
+2
-2
arch/arm/mach-pxa/irq.c
arch/arm/mach-pxa/irq.c
+72
-22
arch/arm/mm/Makefile
arch/arm/mm/Makefile
+2
-1
arch/arm/mm/cache-v3.S
arch/arm/mm/cache-v3.S
+14
-0
arch/arm/mm/cache-v4.S
arch/arm/mm/cache-v4.S
+14
-0
arch/arm/mm/cache-v4wb.S
arch/arm/mm/cache-v4wb.S
+14
-0
arch/arm/mm/cache-v4wt.S
arch/arm/mm/cache-v4wt.S
+14
-0
arch/arm/mm/cache-v6.S
arch/arm/mm/cache-v6.S
+17
-0
arch/arm/mm/copypage-v6.c
arch/arm/mm/copypage-v6.c
+74
-18
arch/arm/mm/fault-armv.c
arch/arm/mm/fault-armv.c
+13
-48
arch/arm/mm/flush.c
arch/arm/mm/flush.c
+94
-0
arch/arm/mm/proc-arm1020.S
arch/arm/mm/proc-arm1020.S
+14
-0
arch/arm/mm/proc-arm1020e.S
arch/arm/mm/proc-arm1020e.S
+13
-0
arch/arm/mm/proc-arm1022.S
arch/arm/mm/proc-arm1022.S
+14
-0
arch/arm/mm/proc-arm1026.S
arch/arm/mm/proc-arm1026.S
+13
-0
arch/arm/mm/proc-arm920.S
arch/arm/mm/proc-arm920.S
+14
-0
arch/arm/mm/proc-arm922.S
arch/arm/mm/proc-arm922.S
+14
-0
arch/arm/mm/proc-arm925.S
arch/arm/mm/proc-arm925.S
+14
-0
arch/arm/mm/proc-arm926.S
arch/arm/mm/proc-arm926.S
+14
-0
arch/arm/mm/proc-xscale.S
arch/arm/mm/proc-xscale.S
+17
-0
include/asm-arm/arch-ebsa110/param.h
include/asm-arm/arch-ebsa110/param.h
+1
-1
include/asm-arm/arch-l7200/param.h
include/asm-arm/arch-l7200/param.h
+1
-1
include/asm-arm/arch-pxa/hardware.h
include/asm-arm/arch-pxa/hardware.h
+3
-4
include/asm-arm/arch-pxa/irqs.h
include/asm-arm/arch-pxa/irqs.h
+42
-12
include/asm-arm/arch-pxa/pxa-regs.h
include/asm-arm/arch-pxa/pxa-regs.h
+9
-9
include/asm-arm/arch-s3c2410/param.h
include/asm-arm/arch-s3c2410/param.h
+1
-1
include/asm-arm/atomic.h
include/asm-arm/atomic.h
+4
-50
include/asm-arm/cacheflush.h
include/asm-arm/cacheflush.h
+12
-0
include/asm-arm/param.h
include/asm-arm/param.h
+5
-6
include/asm-arm/system.h
include/asm-arm/system.h
+32
-0
include/asm-arm/unistd.h
include/asm-arm/unistd.h
+0
-45
No files found.
arch/arm/Makefile
View file @
32f6e431
...
...
@@ -55,8 +55,8 @@ tune-$(CONFIG_CPU_XSCALE) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110)
tune-$(CONFIG_CPU_V6)
:=
-mtune
=
strongarm
# Need -Uarm for gcc < 3.x
CFLAGS
+=
-mapcs-32
$
(
arch-y
)
$
(
tune-y
)
$(
call
cc-option,-malignment-traps,-mshort-load-bytes
)
-msoft-float
-
Wa
,-mno-fpu
-
Uarm
AFLAGS
+=
-mapcs-32
$
(
arch-y
)
$
(
tune-y
)
-msoft-float
-Wa
,-mno-fpu
CFLAGS
+=
-mapcs-32
$
(
arch-y
)
$
(
tune-y
)
$(
call
cc-option,-malignment-traps,-mshort-load-bytes
)
-msoft-float
-Uarm
AFLAGS
+=
-mapcs-32
$
(
arch-y
)
$
(
tune-y
)
-msoft-float
CHECKFLAGS
+=
-D__arm__
=
1
...
...
arch/arm/kernel/traps.c
View file @
32f6e431
...
...
@@ -381,7 +381,7 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
{
struct
vm_area_struct
*
vma
;
if
(
end
<
start
)
if
(
end
<
start
||
flags
)
return
;
vma
=
find_vma
(
current
->
active_mm
,
start
);
...
...
@@ -391,7 +391,7 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
if
(
end
>
vma
->
vm_end
)
end
=
vma
->
vm_end
;
flush_cache_range
(
vma
,
start
,
end
);
flush_cache_
user_
range
(
vma
,
start
,
end
);
}
}
...
...
arch/arm/mach-pxa/irq.c
View file @
32f6e431
...
...
@@ -25,34 +25,58 @@
/*
* This is for
IRQs known as PXA_IRQ([8...31])
.
* This is for
peripheral IRQs internal to the PXA chip
.
*/
static
void
pxa_mask_irq
(
unsigned
int
irq
)
static
void
pxa_mask_
low_
irq
(
unsigned
int
irq
)
{
ICMR
&=
~
(
1
<<
(
irq
+
PXA_IRQ_SKIP
));
}
static
void
pxa_unmask_irq
(
unsigned
int
irq
)
static
void
pxa_unmask_
low_
irq
(
unsigned
int
irq
)
{
ICMR
|=
(
1
<<
(
irq
+
PXA_IRQ_SKIP
));
}
static
struct
irqchip
pxa_internal_chip
=
{
.
ack
=
pxa_mask_irq
,
.
mask
=
pxa_mask_irq
,
.
unmask
=
pxa_unmask_irq
,
static
struct
irqchip
pxa_internal_chip
_low
=
{
.
ack
=
pxa_mask_
low_
irq
,
.
mask
=
pxa_mask_
low_
irq
,
.
unmask
=
pxa_unmask_
low_
irq
,
};
#if PXA_INTERNAL_IRQS > 32
/*
* This is for the second set of internal IRQs as found on the PXA27x.
*/
static
void
pxa_mask_high_irq
(
unsigned
int
irq
)
{
ICMR2
&=
~
(
1
<<
(
irq
-
32
+
PXA_IRQ_SKIP
));
}
static
void
pxa_unmask_high_irq
(
unsigned
int
irq
)
{
ICMR2
|=
(
1
<<
(
irq
-
32
+
PXA_IRQ_SKIP
));
}
static
struct
irqchip
pxa_internal_chip_high
=
{
.
ack
=
pxa_mask_high_irq
,
.
mask
=
pxa_mask_high_irq
,
.
unmask
=
pxa_unmask_high_irq
,
};
#endif
/*
* PXA GPIO edge detection for IRQs:
* IRQs are generated on Falling-Edge, Rising-Edge, or both.
* Use this instead of directly setting GRER/GFER.
*/
static
long
GPIO_IRQ_rising_edge
[
3
];
static
long
GPIO_IRQ_falling_edge
[
3
];
static
long
GPIO_IRQ_mask
[
3
];
static
long
GPIO_IRQ_rising_edge
[
4
];
static
long
GPIO_IRQ_falling_edge
[
4
];
static
long
GPIO_IRQ_mask
[
4
];
static
int
pxa_gpio_irq_type
(
unsigned
int
irq
,
unsigned
int
type
)
{
...
...
@@ -106,13 +130,13 @@ static void pxa_ack_low_gpio(unsigned int irq)
static
struct
irqchip
pxa_low_gpio_chip
=
{
.
ack
=
pxa_ack_low_gpio
,
.
mask
=
pxa_mask_irq
,
.
unmask
=
pxa_unmask_irq
,
.
mask
=
pxa_mask_
low_
irq
,
.
unmask
=
pxa_unmask_
low_
irq
,
.
type
=
pxa_gpio_irq_type
,
};
/*
* Demux handler for GPIO
2-80
edge detect interrupts
* Demux handler for GPIO
>=2
edge detect interrupts
*/
static
void
pxa_gpio_demux_handler
(
unsigned
int
irq
,
struct
irqdesc
*
desc
,
...
...
@@ -169,6 +193,23 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irqdesc *desc,
}
while
(
mask
);
loop
=
1
;
}
#if PXA_LAST_GPIO >= 96
mask
=
GEDR3
;
if
(
mask
)
{
GEDR3
=
mask
;
irq
=
IRQ_GPIO
(
96
);
desc
=
irq_desc
+
irq
;
do
{
if
(
mask
&
1
)
desc
->
handle
(
irq
,
desc
,
regs
);
irq
++
;
desc
++
;
mask
>>=
1
;
}
while
(
mask
);
loop
=
1
;
}
#endif
}
while
(
loop
);
}
...
...
@@ -208,17 +249,18 @@ void __init pxa_init_irq(void)
int
irq
;
/* disable all IRQs */
ICMR
=
0
;
ICMR
=
ICMR2
=
0
;
/* all IRQs are IRQ, not FIQ */
ICLR
=
0
;
ICLR
=
ICLR2
=
0
;
/* clear all GPIO edge detects */
GFER0
=
GFER1
=
GFER2
=
0
;
GRER0
=
GRER1
=
GRER2
=
0
;
GFER0
=
GFER1
=
GFER2
=
GFER3
=
0
;
GRER0
=
GRER1
=
GRER2
=
GRER3
=
0
;
GEDR0
=
GEDR0
;
GEDR1
=
GEDR1
;
GEDR2
=
GEDR2
;
GEDR3
=
GEDR3
;
/* only unmasked interrupts kick us out of idle */
ICCR
=
1
;
...
...
@@ -227,10 +269,18 @@ void __init pxa_init_irq(void)
GPIO_IRQ_mask
[
0
]
=
3
;
for
(
irq
=
PXA_IRQ
(
PXA_IRQ_SKIP
);
irq
<=
PXA_IRQ
(
31
);
irq
++
)
{
set_irq_chip
(
irq
,
&
pxa_internal_chip
);
set_irq_chip
(
irq
,
&
pxa_internal_chip_low
);
set_irq_handler
(
irq
,
do_level_IRQ
);
set_irq_flags
(
irq
,
IRQF_VALID
);
}
#if PXA_INTERNAL_IRQS > 32
for
(
irq
=
PXA_IRQ
(
32
);
irq
<
PXA_IRQ
(
PXA_INTERNAL_IRQS
);
irq
++
)
{
set_irq_chip
(
irq
,
&
pxa_internal_chip_high
);
set_irq_handler
(
irq
,
do_level_IRQ
);
set_irq_flags
(
irq
,
IRQF_VALID
);
}
#endif
for
(
irq
=
IRQ_GPIO0
;
irq
<=
IRQ_GPIO1
;
irq
++
)
{
set_irq_chip
(
irq
,
&
pxa_low_gpio_chip
);
...
...
@@ -238,13 +288,13 @@ void __init pxa_init_irq(void)
set_irq_flags
(
irq
,
IRQF_VALID
|
IRQF_PROBE
);
}
for
(
irq
=
IRQ_GPIO
(
2
);
irq
<=
IRQ_GPIO
(
80
);
irq
++
)
{
for
(
irq
=
IRQ_GPIO
(
2
);
irq
<=
IRQ_GPIO
(
PXA_LAST_GPIO
);
irq
++
)
{
set_irq_chip
(
irq
,
&
pxa_muxed_gpio_chip
);
set_irq_handler
(
irq
,
do_edge_IRQ
);
set_irq_flags
(
irq
,
IRQF_VALID
|
IRQF_PROBE
);
}
/* Install handler for GPIO
2-80
edge detect interrupts */
set_irq_chip
(
IRQ_GPIO_2_
80
,
&
pxa_internal_chip
);
set_irq_chained_handler
(
IRQ_GPIO_2_
80
,
pxa_gpio_demux_handler
);
/* Install handler for GPIO
>=2
edge detect interrupts */
set_irq_chip
(
IRQ_GPIO_2_
x
,
&
pxa_internal_chip_low
);
set_irq_chained_handler
(
IRQ_GPIO_2_
x
,
pxa_gpio_demux_handler
);
}
arch/arm/mm/Makefile
View file @
32f6e431
...
...
@@ -3,7 +3,8 @@
#
obj-y
:=
consistent.o extable.o fault-armv.o
\
fault.o init.o ioremap.o mmap.o mm-armv.o
fault.o flush.o init.o ioremap.o mmap.o
\
mm-armv.o
obj-$(CONFIG_MODULES)
+=
proc-syms.o
...
...
arch/arm/mm/cache-v3.S
View file @
32f6e431
...
...
@@ -57,6 +57,19 @@ ENTRY(v3_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
v3_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
v3_coherent_user_range
)
mov
pc
,
lr
/*
...
...
@@ -116,6 +129,7 @@ ENTRY(v3_cache_fns)
.
long
v3_flush_user_cache_all
.
long
v3_flush_user_cache_range
.
long
v3_coherent_kern_range
.
long
v3_coherent_user_range
.
long
v3_flush_kern_dcache_page
.
long
v3_dma_inv_range
.
long
v3_dma_clean_range
...
...
arch/arm/mm/cache-v4.S
View file @
32f6e431
...
...
@@ -59,6 +59,19 @@ ENTRY(v4_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4_coherent_user_range
)
mov
pc
,
lr
/*
...
...
@@ -118,6 +131,7 @@ ENTRY(v4_cache_fns)
.
long
v4_flush_user_cache_all
.
long
v4_flush_user_cache_range
.
long
v4_coherent_kern_range
.
long
v4_coherent_user_range
.
long
v4_flush_kern_dcache_page
.
long
v4_dma_inv_range
.
long
v4_dma_clean_range
...
...
arch/arm/mm/cache-v4wb.S
View file @
32f6e431
...
...
@@ -121,6 +121,19 @@ ENTRY(v4wb_flush_kern_dcache_page)
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4wb_coherent_kern_range
)
/
*
fall
through
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4wb_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
mcr
p15
,
0
,
r0
,
c7
,
c6
,
1
@
invalidate
D
entry
...
...
@@ -195,6 +208,7 @@ ENTRY(v4wb_cache_fns)
.
long
v4wb_flush_user_cache_all
.
long
v4wb_flush_user_cache_range
.
long
v4wb_coherent_kern_range
.
long
v4wb_coherent_user_range
.
long
v4wb_flush_kern_dcache_page
.
long
v4wb_dma_inv_range
.
long
v4wb_dma_clean_range
...
...
arch/arm/mm/cache-v4wt.S
View file @
32f6e431
...
...
@@ -97,6 +97,19 @@ ENTRY(v4wt_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4wt_coherent_kern_range
)
/
*
FALLTRHOUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
v4wt_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c5
,
1
@
invalidate
I
entry
add
r0
,
r0
,
#
CACHE_DLINESIZE
...
...
@@ -167,6 +180,7 @@ ENTRY(v4wt_cache_fns)
.
long
v4wt_flush_user_cache_all
.
long
v4wt_flush_user_cache_range
.
long
v4wt_coherent_kern_range
.
long
v4wt_coherent_user_range
.
long
v4wt_flush_kern_dcache_page
.
long
v4wt_dma_inv_range
.
long
v4wt_dma_clean_range
...
...
arch/arm/mm/cache-v6.S
View file @
32f6e431
...
...
@@ -75,6 +75,22 @@ ENTRY(v6_flush_user_cache_range)
*
-
the
Icache
does
not
read
data
from
the
write
buffer
*/
ENTRY
(
v6_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
v6_coherent_user_range
(
start
,
end
)
*
*
Ensure
that
the
I
and
D
caches
are
coherent
within
specified
*
region
.
This
is
typically
used
when
code
has
been
written
to
*
a
memory
region
,
and
will
be
executed
.
*
*
-
start
-
virtual
start
address
of
region
*
-
end
-
virtual
end
address
of
region
*
*
It
is
assumed
that
:
*
-
the
Icache
does
not
read
data
from
the
write
buffer
*/
ENTRY
(
v6_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_LINE_SIZE
-
1
1
:
#ifdef HARVARD_CACHE
...
...
@@ -203,6 +219,7 @@ ENTRY(v6_cache_fns)
.
long
v6_flush_user_cache_all
.
long
v6_flush_user_cache_range
.
long
v6_coherent_kern_range
.
long
v6_coherent_user_range
.
long
v6_flush_kern_dcache_page
.
long
v6_dma_inv_range
.
long
v6_dma_clean_range
...
...
arch/arm/mm/copypage-v6.c
View file @
32f6e431
...
...
@@ -31,14 +31,46 @@ static spinlock_t v6_lock = SPIN_LOCK_UNLOCKED;
#define DCACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
/*
* Copy the user page. No aliasing to deal with so we can just
* attack the kernel's existing mapping of these pages.
*/
void
v6_copy_user_page_nonaliasing
(
void
*
kto
,
const
void
*
kfrom
,
unsigned
long
vaddr
)
{
copy_page
(
kto
,
kfrom
);
}
/*
* Clear the user page. No aliasing to deal with so we can just
* attack the kernel's existing mapping of this page.
*/
void
v6_clear_user_page_nonaliasing
(
void
*
kaddr
,
unsigned
long
vaddr
)
{
clear_page
(
kaddr
);
}
/*
* Copy the page, taking account of the cache colour.
*/
void
v6_copy_user_page
(
void
*
kto
,
const
void
*
kfrom
,
unsigned
long
vaddr
)
void
v6_copy_user_page
_aliasing
(
void
*
kto
,
const
void
*
kfrom
,
unsigned
long
vaddr
)
{
unsigned
int
offset
=
DCACHE_COLOUR
(
vaddr
);
unsigned
long
from
,
to
;
/*
* Discard data in the kernel mapping for the new page.
* FIXME: needs this MCRR to be supported.
*/
__asm__
(
"mcrr p15, 0, %1, %0, c6 @ 0xec401f06"
:
:
"r"
(
kto
),
"r"
((
unsigned
long
)
kto
+
PAGE_SIZE
-
L1_CACHE_BYTES
)
:
"cc"
);
/*
* Now copy the page using the same cache colour as the
* pages ultimate destination.
*/
spin_lock
(
&
v6_lock
);
set_pte
(
from_pte
+
offset
,
pfn_pte
(
__pa
(
kfrom
)
>>
PAGE_SHIFT
,
from_pgprot
));
...
...
@@ -55,11 +87,30 @@ void v6_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr)
spin_unlock
(
&
v6_lock
);
}
void
v6_clear_user_page
(
void
*
kaddr
,
unsigned
long
vaddr
)
/*
* Clear the user page. We need to deal with the aliasing issues,
* so remap the kernel page into the same cache colour as the user
* page.
*/
void
v6_clear_user_page_aliasing
(
void
*
kaddr
,
unsigned
long
vaddr
)
{
unsigned
int
offset
=
DCACHE_COLOUR
(
vaddr
);
unsigned
long
to
=
to_address
+
(
offset
<<
PAGE_SHIFT
);
/*
* Discard data in the kernel mapping for the new page
* FIXME: needs this MCRR to be supported.
*/
__asm__
(
"mcrr p15, 0, %1, %0, c6 @ 0xec401f06"
:
:
"r"
(
kaddr
),
"r"
((
unsigned
long
)
kaddr
+
PAGE_SIZE
-
L1_CACHE_BYTES
)
:
"cc"
);
/*
* Now clear the page using the same cache colour as
* the pages ultimate destination.
*/
spin_lock
(
&
v6_lock
);
set_pte
(
to_pte
+
offset
,
pfn_pte
(
__pa
(
kaddr
)
>>
PAGE_SHIFT
,
to_pgprot
));
...
...
@@ -70,26 +121,31 @@ void v6_clear_user_page(void *kaddr, unsigned long vaddr)
}
struct
cpu_user_fns
v6_user_fns
__initdata
=
{
.
cpu_clear_user_page
=
v6_clear_user_page
,
.
cpu_copy_user_page
=
v6_copy_user_page
,
.
cpu_clear_user_page
=
v6_clear_user_page
_nonaliasing
,
.
cpu_copy_user_page
=
v6_copy_user_page
_nonaliasing
,
};
static
int
__init
v6_userpage_init
(
void
)
{
pgd_t
*
pgd
;
pmd_t
*
pmd
;
pgd
=
pgd_offset_k
(
from_address
);
pmd
=
pmd_alloc
(
&
init_mm
,
pgd
,
from_address
);
if
(
!
pmd
)
BUG
();
from_pte
=
pte_alloc_kernel
(
&
init_mm
,
pmd
,
from_address
);
if
(
!
from_pte
)
BUG
();
to_pte
=
pte_alloc_kernel
(
&
init_mm
,
pmd
,
to_address
);
if
(
!
to_pte
)
BUG
();
if
(
cache_is_vipt_aliasing
())
{
pgd_t
*
pgd
;
pmd_t
*
pmd
;
pgd
=
pgd_offset_k
(
from_address
);
pmd
=
pmd_alloc
(
&
init_mm
,
pgd
,
from_address
);
if
(
!
pmd
)
BUG
();
from_pte
=
pte_alloc_kernel
(
&
init_mm
,
pmd
,
from_address
);
if
(
!
from_pte
)
BUG
();
to_pte
=
pte_alloc_kernel
(
&
init_mm
,
pmd
,
to_address
);
if
(
!
to_pte
)
BUG
();
v6_user_fns
.
cpu_clear_user_page
=
v6_clear_user_page_aliasing
;
v6_user_fns
.
cpu_copy_user_page
=
v6_copy_user_page_aliasing
;
}
return
0
;
}
...
...
arch/arm/mm/fault-armv.c
View file @
32f6e431
...
...
@@ -76,52 +76,6 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
return
0
;
}
static
void
__flush_dcache_page
(
struct
page
*
page
)
{
struct
address_space
*
mapping
=
page_mapping
(
page
);
struct
mm_struct
*
mm
=
current
->
active_mm
;
struct
vm_area_struct
*
mpnt
;
struct
prio_tree_iter
iter
;
unsigned
long
offset
;
pgoff_t
pgoff
;
__cpuc_flush_dcache_page
(
page_address
(
page
));
if
(
!
mapping
)
return
;
/*
* With a VIVT cache, we need to also write back
* and invalidate any user data.
*/
pgoff
=
page
->
index
<<
(
PAGE_CACHE_SHIFT
-
PAGE_SHIFT
);
flush_dcache_mmap_lock
(
mapping
);
vma_prio_tree_foreach
(
mpnt
,
&
iter
,
&
mapping
->
i_mmap
,
pgoff
,
pgoff
)
{
/*
* If this VMA is not in our MM, we can ignore it.
*/
if
(
mpnt
->
vm_mm
!=
mm
)
continue
;
if
(
!
(
mpnt
->
vm_flags
&
VM_MAYSHARE
))
continue
;
offset
=
(
pgoff
-
mpnt
->
vm_pgoff
)
<<
PAGE_SHIFT
;
flush_cache_page
(
mpnt
,
mpnt
->
vm_start
+
offset
);
}
flush_dcache_mmap_unlock
(
mapping
);
}
void
flush_dcache_page
(
struct
page
*
page
)
{
struct
address_space
*
mapping
=
page_mapping
(
page
);
if
(
mapping
&&
!
mapping_mapped
(
mapping
))
set_bit
(
PG_dcache_dirty
,
&
page
->
flags
);
else
__flush_dcache_page
(
page
);
}
EXPORT_SYMBOL
(
flush_dcache_page
);
static
void
make_coherent
(
struct
vm_area_struct
*
vma
,
unsigned
long
addr
,
struct
page
*
page
,
int
dirty
)
{
...
...
@@ -188,10 +142,21 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
if
(
page_mapping
(
page
))
{
int
dirty
=
test_and_clear_bit
(
PG_dcache_dirty
,
&
page
->
flags
);
if
(
dirty
)
if
(
dirty
)
{
/*
* This is our first userspace mapping of this page.
* Ensure that the physical page is coherent with
* the kernel mapping.
*
* FIXME: only need to do this on VIVT and aliasing
* VIPT cache architectures. We can do that
* by choosing whether to set this bit...
*/
__cpuc_flush_dcache_page
(
page_address
(
page
));
}
make_coherent
(
vma
,
addr
,
page
,
dirty
);
if
(
cache_is_vivt
())
make_coherent
(
vma
,
addr
,
page
,
dirty
);
}
}
...
...
arch/arm/mm/flush.c
0 → 100644
View file @
32f6e431
/*
* linux/arch/arm/mm/flush.c
*
* Copyright (C) 1995-2002 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/pagemap.h>
#include <asm/cacheflush.h>
#include <asm/system.h>
static
void
__flush_dcache_page
(
struct
address_space
*
mapping
,
struct
page
*
page
)
{
struct
mm_struct
*
mm
=
current
->
active_mm
;
struct
vm_area_struct
*
mpnt
;
struct
prio_tree_iter
iter
;
pgoff_t
pgoff
;
/*
* Writeback any data associated with the kernel mapping of this
* page. This ensures that data in the physical page is mutually
* coherent with the kernels mapping.
*/
__cpuc_flush_dcache_page
(
page_address
(
page
));
/*
* If there's no mapping pointer here, then this page isn't
* visible to userspace yet, so there are no cache lines
* associated with any other aliases.
*/
if
(
!
mapping
)
return
;
/*
* There are possible user space mappings of this page:
* - VIVT cache: we need to also write back and invalidate all user
* data in the current VM view associated with this page.
* - aliasing VIPT: we only need to find one mapping of this page.
*/
pgoff
=
page
->
index
<<
(
PAGE_CACHE_SHIFT
-
PAGE_SHIFT
);
flush_dcache_mmap_lock
(
mapping
);
vma_prio_tree_foreach
(
mpnt
,
&
iter
,
&
mapping
->
i_mmap
,
pgoff
,
pgoff
)
{
unsigned
long
offset
;
/*
* If this VMA is not in our MM, we can ignore it.
*/
if
(
mpnt
->
vm_mm
!=
mm
)
continue
;
if
(
!
(
mpnt
->
vm_flags
&
VM_MAYSHARE
))
continue
;
offset
=
(
pgoff
-
mpnt
->
vm_pgoff
)
<<
PAGE_SHIFT
;
flush_cache_page
(
mpnt
,
mpnt
->
vm_start
+
offset
);
if
(
cache_is_vipt
())
break
;
}
flush_dcache_mmap_unlock
(
mapping
);
}
/*
* Ensure cache coherency between kernel mapping and userspace mapping
* of this page.
*
* We have three cases to consider:
* - VIPT non-aliasing cache: fully coherent so nothing required.
* - VIVT: fully aliasing, so we need to handle every alias in our
* current VM view.
* - VIPT aliasing: need to handle one alias in our current VM view.
*
* If we need to handle aliasing:
* If the page only exists in the page cache and there are no user
* space mappings, we can be lazy and remember that we may have dirty
* kernel cache lines for later. Otherwise, we assume we have
* aliasing mappings.
*/
void
flush_dcache_page
(
struct
page
*
page
)
{
struct
address_space
*
mapping
=
page_mapping
(
page
);
if
(
cache_is_vipt_nonaliasing
())
return
;
if
(
mapping
&&
!
mapping_mapped
(
mapping
))
set_bit
(
PG_dcache_dirty
,
&
page
->
flags
);
else
__flush_dcache_page
(
mapping
,
page
);
}
EXPORT_SYMBOL
(
flush_dcache_page
);
arch/arm/mm/proc-arm1020.S
View file @
32f6e431
...
...
@@ -196,6 +196,19 @@ ENTRY(arm1020_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1020_coherent_kern_range
)
/
*
FALLTRHOUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1020_coherent_user_range
)
mov
ip
,
#
0
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
mcr
p15
,
0
,
ip
,
c7
,
c10
,
4
...
...
@@ -317,6 +330,7 @@ ENTRY(arm1020_cache_fns)
.
long
arm1020_flush_user_cache_all
.
long
arm1020_flush_user_cache_range
.
long
arm1020_coherent_kern_range
.
long
arm1020_coherent_user_range
.
long
arm1020_flush_kern_dcache_page
.
long
arm1020_dma_inv_range
.
long
arm1020_dma_clean_range
...
...
arch/arm/mm/proc-arm1020e.S
View file @
32f6e431
...
...
@@ -193,6 +193,18 @@ ENTRY(arm1020e_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1020e_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1020e_coherent_user_range
)
mov
ip
,
#
0
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
...
...
@@ -304,6 +316,7 @@ ENTRY(arm1020e_cache_fns)
.
long
arm1020e_flush_user_cache_all
.
long
arm1020e_flush_user_cache_range
.
long
arm1020e_coherent_kern_range
.
long
arm1020e_coherent_user_range
.
long
arm1020e_flush_kern_dcache_page
.
long
arm1020e_dma_inv_range
.
long
arm1020e_dma_clean_range
...
...
arch/arm/mm/proc-arm1022.S
View file @
32f6e431
...
...
@@ -180,6 +180,19 @@ ENTRY(arm1022_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1022_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1022_coherent_user_range
)
mov
ip
,
#
0
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
...
...
@@ -291,6 +304,7 @@ ENTRY(arm1022_cache_fns)
.
long
arm1022_flush_user_cache_all
.
long
arm1022_flush_user_cache_range
.
long
arm1022_coherent_kern_range
.
long
arm1022_coherent_user_range
.
long
arm1022_flush_kern_dcache_page
.
long
arm1022_dma_inv_range
.
long
arm1022_dma_clean_range
...
...
arch/arm/mm/proc-arm1026.S
View file @
32f6e431
...
...
@@ -175,6 +175,18 @@ ENTRY(arm1026_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1026_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm1026_coherent_user_range
)
mov
ip
,
#
0
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
...
...
@@ -286,6 +298,7 @@ ENTRY(arm1026_cache_fns)
.
long
arm1026_flush_user_cache_all
.
long
arm1026_flush_user_cache_range
.
long
arm1026_coherent_kern_range
.
long
arm1026_coherent_user_range
.
long
arm1026_flush_kern_dcache_page
.
long
arm1026_dma_inv_range
.
long
arm1026_dma_clean_range
...
...
arch/arm/mm/proc-arm920.S
View file @
32f6e431
...
...
@@ -182,6 +182,19 @@ ENTRY(arm920_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm920_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
,
end
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm920_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
mcr
p15
,
0
,
r0
,
c7
,
c5
,
1
@
invalidate
I
entry
...
...
@@ -277,6 +290,7 @@ ENTRY(arm920_cache_fns)
.
long
arm920_flush_user_cache_all
.
long
arm920_flush_user_cache_range
.
long
arm920_coherent_kern_range
.
long
arm920_coherent_user_range
.
long
arm920_flush_kern_dcache_page
.
long
arm920_dma_inv_range
.
long
arm920_dma_clean_range
...
...
arch/arm/mm/proc-arm922.S
View file @
32f6e431
...
...
@@ -184,6 +184,19 @@ ENTRY(arm922_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm922_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
,
end
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm922_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
mcr
p15
,
0
,
r0
,
c7
,
c5
,
1
@
invalidate
I
entry
...
...
@@ -279,6 +292,7 @@ ENTRY(arm922_cache_fns)
.
long
arm922_flush_user_cache_all
.
long
arm922_flush_user_cache_range
.
long
arm922_coherent_kern_range
.
long
arm922_coherent_user_range
.
long
arm922_flush_kern_dcache_page
.
long
arm922_dma_inv_range
.
long
arm922_dma_clean_range
...
...
arch/arm/mm/proc-arm925.S
View file @
32f6e431
...
...
@@ -225,6 +225,19 @@ ENTRY(arm925_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm925_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
,
end
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm925_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
mcr
p15
,
0
,
r0
,
c7
,
c5
,
1
@
invalidate
I
entry
...
...
@@ -329,6 +342,7 @@ ENTRY(arm925_cache_fns)
.
long
arm925_flush_user_cache_all
.
long
arm925_flush_user_cache_range
.
long
arm925_coherent_kern_range
.
long
arm925_coherent_user_range
.
long
arm925_flush_kern_dcache_page
.
long
arm925_dma_inv_range
.
long
arm925_dma_clean_range
...
...
arch/arm/mm/proc-arm926.S
View file @
32f6e431
...
...
@@ -185,6 +185,19 @@ ENTRY(arm926_flush_user_cache_range)
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm926_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
,
end
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*/
ENTRY
(
arm926_coherent_user_range
)
bic
r0
,
r0
,
#
CACHE_DLINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
mcr
p15
,
0
,
r0
,
c7
,
c5
,
1
@
invalidate
I
entry
...
...
@@ -289,6 +302,7 @@ ENTRY(arm926_cache_fns)
.
long
arm926_flush_user_cache_all
.
long
arm926_flush_user_cache_range
.
long
arm926_coherent_kern_range
.
long
arm926_coherent_user_range
.
long
arm926_flush_kern_dcache_page
.
long
arm926_dma_inv_range
.
long
arm926_dma_clean_range
...
...
arch/arm/mm/proc-xscale.S
View file @
32f6e431
...
...
@@ -241,6 +241,22 @@ ENTRY(xscale_flush_user_cache_range)
*
it
also
trashes
the
mini
I
-
cache
used
by
JTAG
debuggers
.
*/
ENTRY
(
xscale_coherent_kern_range
)
/
*
FALLTHROUGH
*/
/*
*
coherent_user_range
(
start
,
end
)
*
*
Ensure
coherency
between
the
Icache
and
the
Dcache
in
the
*
region
described
by
start
.
If
you
have
non
-
snooping
*
Harvard
caches
,
you
need
to
implement
this
function
.
*
*
-
start
-
virtual
start
address
*
-
end
-
virtual
end
address
*
*
Note
:
single
I
-
cache
line
invalidation
isn
't used here since
*
it
also
trashes
the
mini
I
-
cache
used
by
JTAG
debuggers
.
*/
ENTRY
(
xscale_coherent_user_range
)
bic
r0
,
r0
,
#
CACHELINESIZE
-
1
1
:
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
add
r0
,
r0
,
#
CACHELINESIZE
...
...
@@ -341,6 +357,7 @@ ENTRY(xscale_cache_fns)
.
long
xscale_flush_user_cache_all
.
long
xscale_flush_user_cache_range
.
long
xscale_coherent_kern_range
.
long
xscale_coherent_user_range
.
long
xscale_flush_kern_dcache_page
.
long
xscale_dma_inv_range
.
long
xscale_dma_clean_range
...
...
include/asm-arm/arch-ebsa110/param.h
View file @
32f6e431
/*
* linux/include/asm-arm/arch-ebsa110/param.h
*/
#define
__KERNEL_
HZ 200
#define HZ 200
include/asm-arm/arch-l7200/param.h
View file @
32f6e431
...
...
@@ -16,4 +16,4 @@
/*
* See 'time.h' for how the RTC HZ rate is set
*/
#define
__KERNEL_
HZ 128
#define HZ 128
include/asm-arm/arch-pxa/hardware.h
View file @
32f6e431
...
...
@@ -59,10 +59,9 @@ typedef struct { volatile u32 offset[4096]; } __regbase;
# define __REG(x) __REGP(io_p2v(x))
#endif
/* Let's kick gcc's ass again... */
# define __REG2(x,y) \
( __builtin_constant_p(y) ? (__REG((x) + (y))) \
: (*(volatile u32 *)((u32)&__REG(x) + (y))) )
/* With indexed regs we don't want to feed the index through io_p2v()
especially if it is a variable, otherwise horrible code will result. */
# define __REG2(x,y) (*(volatile u32 *)((u32)&__REG(x) + (y)))
# define __PREG(x) (io_v2p((u32)&(x)))
...
...
include/asm-arm/arch-pxa/irqs.h
View file @
32f6e431
...
...
@@ -12,19 +12,34 @@
#include <linux/config.h>
#define PXA_IRQ_SKIP 7
/* The first 7 IRQs are not yet used */
#ifdef CONFIG_PXA27x
#define PXA_IRQ_SKIP 0
#else
#define PXA_IRQ_SKIP 7
#endif
#define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP)
#define IRQ_HWUART PXA_IRQ(7)
/* HWUART Transmit/Receive/Error */
#define IRQ_SSP3 PXA_IRQ(0)
/* SSP3 service request */
#define IRQ_MSL PXA_IRQ(1)
/* MSL Interface interrupt */
#define IRQ_USBH2 PXA_IRQ(2)
/* USB Host interrupt 1 (OHCI) */
#define IRQ_USBH1 PXA_IRQ(3)
/* USB Host interrupt 2 (non-OHCI) */
#define IRQ_KEYPAD PXA_IRQ(4)
/* Key pad controller */
#define IRQ_MEMSTK PXA_IRQ(5)
/* Memory Stick interrupt */
#define IRQ_PWRI2C PXA_IRQ(6)
/* Power I2C interrupt */
#define IRQ_HWUART PXA_IRQ(7)
/* HWUART Transmit/Receive/Error (PXA26x) */
#define IRQ_OST_4_11 PXA_IRQ(7)
/* OS timer 4-11 matches (PXA27x) */
#define IRQ_GPIO0 PXA_IRQ(8)
/* GPIO0 Edge Detect */
#define IRQ_GPIO1 PXA_IRQ(9)
/* GPIO1 Edge Detect */
#define IRQ_GPIO_2_
80 PXA_IRQ(10)
/* GPIO[2-80
] Edge Detect */
#define IRQ_GPIO_2_
x PXA_IRQ(10)
/* GPIO[2-x
] Edge Detect */
#define IRQ_USB PXA_IRQ(11)
/* USB Service */
#define IRQ_PMU PXA_IRQ(12)
/* Performance Monitoring Unit */
#define IRQ_I2S PXA_IRQ(13)
/* I2S Interrupt */
#define IRQ_AC97 PXA_IRQ(14)
/* AC97 Interrupt */
#define IRQ_ASSP PXA_IRQ(15)
/* Audio SSP Service Request */
#define IRQ_NSSP PXA_IRQ(16)
/* Network SSP Service Request */
#define IRQ_ASSP PXA_IRQ(15)
/* Audio SSP Service Request (PXA25x) */
#define IRQ_USIM PXA_IRQ(15)
/* Smart Card interface interrupt (PXA27x) */
#define IRQ_NSSP PXA_IRQ(16)
/* Network SSP Service Request (PXA25x) */
#define IRQ_SSP2 PXA_IRQ(16)
/* SSP2 interrupt (PXA27x) */
#define IRQ_LCD PXA_IRQ(17)
/* LCD Controller Service Request */
#define IRQ_I2C PXA_IRQ(18)
/* I2C Service Request */
#define IRQ_ICP PXA_IRQ(19)
/* ICP Transmit/Receive/Error */
...
...
@@ -41,13 +56,28 @@
#define IRQ_RTC1Hz PXA_IRQ(30)
/* RTC HZ Clock Tick */
#define IRQ_RTCAlrm PXA_IRQ(31)
/* RTC Alarm */
#
define GPIO_2_80_TO_IRQ(x) \
PXA_IRQ((x) - 2 + 32)
#define IRQ_
GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_80_TO_IRQ(x))
#
ifdef CONFIG_PXA27x
#define IRQ_TPM PXA_IRQ(32)
/* TPM interrupt */
#define IRQ_
CAMERA PXA_IRQ(33)
/* Camera Interface */
#define IRQ_TO_GPIO_2_80(i) \
((i) - PXA_IRQ(32) + 2)
#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2) - 2 : IRQ_GPIO(0)))
#define PXA_INTERNAL_IRQS 34
#else
#define PXA_INTERNAL_IRQS 32
#endif
#define GPIO_2_x_TO_IRQ(x) \
PXA_IRQ((x) - 2 + PXA_INTERNAL_IRQS)
#define IRQ_GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_x_TO_IRQ(x))
#define IRQ_TO_GPIO_2_x(i) \
((i) - IRQ_GPIO(2) + 2)
#define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i))
#if defined(CONFIG_PXA25x)
#define PXA_LAST_GPIO 80
#elif defined(CONFIG_PXA27x)
#define PXA_LAST_GPIO 127
#endif
/*
* The next 16 interrupts are for board specific purposes. Since
...
...
@@ -55,7 +85,7 @@
* these. If you need more, increase IRQ_BOARD_END, but keep it
* within sensible limits.
*/
#define IRQ_BOARD_START (IRQ_GPIO(
80
) + 1)
#define IRQ_BOARD_START (IRQ_GPIO(
PXA_LAST_GPIO
) + 1)
#define IRQ_BOARD_END (IRQ_BOARD_START + 16)
#define IRQ_SA1111_START (IRQ_BOARD_END)
...
...
include/asm-arm/arch-pxa/pxa-regs.h
View file @
32f6e431
...
...
@@ -1134,15 +1134,15 @@ typedef void (*ExcpHndlr) (void) ;
#define _GEDR(x) __REG2(0x40E00048, ((x) & 0x60) >> 3)
#define _GAFR(x) __REG2(0x40E00054, ((x) & 0x70) >> 2)
#define GPLR(x) (
(((x) & 0x7f) < 96) ? _GPLR(x) : GPLR3
)
#define GPDR(x) (
(((x) & 0x7f) < 96) ? _GPDR(x) : GPDR3
)
#define GPSR(x) (
(((x) & 0x7f) < 96) ? _GPSR(x) : GPSR3
)
#define GPCR(x) (
(((x) & 0x7f) < 96) ? _GPCR(x) : GPCR3
)
#define GRER(x) (
(((x) & 0x7f) < 96) ? _GRER(x) : GRER3
)
#define GFER(x) (
(((x) & 0x7f) < 96) ? _GFER(x) : GFER3
)
#define GEDR(x) (
(((x) & 0x7f) < 96) ? _GEDR(x) : GEDR3
)
#define GAFR(x) (
(((x) & 0x7f) < 96) ?
_GAFR(x) : \
((((x) & 0x7f) < 112) ?
GAFR3_L : GAFR3_U
))
#define GPLR(x) (
*((((x) & 0x7f) < 96) ? &_GPLR(x) : &GPLR3)
)
#define GPDR(x) (
*((((x) & 0x7f) < 96) ? &_GPDR(x) : &GPDR3)
)
#define GPSR(x) (
*((((x) & 0x7f) < 96) ? &_GPSR(x) : &GPSR3)
)
#define GPCR(x) (
*((((x) & 0x7f) < 96) ? &_GPCR(x) : &GPCR3)
)
#define GRER(x) (
*((((x) & 0x7f) < 96) ? &_GRER(x) : &GRER3)
)
#define GFER(x) (
*((((x) & 0x7f) < 96) ? &_GFER(x) : &GFER3)
)
#define GEDR(x) (
*((((x) & 0x7f) < 96) ? &_GEDR(x) : &GEDR3)
)
#define GAFR(x) (
*((((x) & 0x7f) < 96) ? &
_GAFR(x) : \
((((x) & 0x7f) < 112) ?
&GAFR3_L : &GAFR3_U)
))
#else
#define GPLR(x) __REG2(0x40E00000, ((x) & 0x60) >> 3)
...
...
include/asm-arm/arch-s3c2410/param.h
View file @
32f6e431
...
...
@@ -22,6 +22,6 @@
* add a software pre-scaler to the evil timer systems.
*/
#define
__KERNEL_
HZ 200
#define HZ 200
#endif
/* __ASM_ARCH_PARAM_H */
include/asm-arm/atomic.h
View file @
32f6e431
...
...
@@ -44,21 +44,6 @@ static inline void atomic_set(atomic_t *v, int i)
:
"cc"
);
}
static
inline
void
atomic_add
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
tmp
,
tmp2
;
__asm__
__volatile__
(
"@ atomic_add
\n
"
"1: ldrex %0, [%2]
\n
"
" add %0, %0, %3
\n
"
" strex %1, %0, [%2]
\n
"
" teq %1, #0
\n
"
" bne 1b"
:
"=&r"
(
tmp
),
"=&r"
(
tmp2
)
:
"r"
(
&
v
->
counter
),
"Ir"
(
i
)
:
"cc"
);
}
static
inline
int
atomic_add_return
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
tmp
;
...
...
@@ -77,21 +62,6 @@ static inline int atomic_add_return(int i, atomic_t *v)
return
result
;
}
static
inline
void
atomic_sub
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
tmp
,
tmp2
;
__asm__
__volatile__
(
"@ atomic_sub
\n
"
"1: ldrex %0, [%2]
\n
"
" sub %0, %0, %3
\n
"
" strex %1, %0, [%2]
\n
"
" teq %1, #0
\n
"
" bne 1b"
:
"=&r"
(
tmp
),
"=&r"
(
tmp2
)
:
"r"
(
&
v
->
counter
),
"Ir"
(
i
)
:
"cc"
);
}
static
inline
int
atomic_sub_return
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
tmp
;
...
...
@@ -135,15 +105,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
#define atomic_set(v,i) (((v)->counter) = (i))
static
inline
void
atomic_add
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
v
->
counter
+=
i
;
local_irq_restore
(
flags
);
}
static
inline
int
atomic_add_return
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
flags
;
...
...
@@ -157,15 +118,6 @@ static inline int atomic_add_return(int i, atomic_t *v)
return
val
;
}
static
inline
void
atomic_sub
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
v
->
counter
-=
i
;
local_irq_restore
(
flags
);
}
static
inline
int
atomic_sub_return
(
int
i
,
atomic_t
*
v
)
{
unsigned
long
flags
;
...
...
@@ -190,8 +142,10 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
#endif
/* __LINUX_ARM_ARCH__ */
#define atomic_inc(v) atomic_add(1, v)
#define atomic_dec(v) atomic_sub(1, v)
#define atomic_add(i, v) (void) atomic_add_return(i, v)
#define atomic_inc(v) (void) atomic_add_return(1, v)
#define atomic_sub(i, v) (void) atomic_sub_return(i, v)
#define atomic_dec(v) (void) atomic_sub_return(1, v)
#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
...
...
include/asm-arm/cacheflush.h
View file @
32f6e431
...
...
@@ -157,6 +157,7 @@ struct cpu_cache_fns {
void
(
*
flush_user_range
)(
unsigned
long
,
unsigned
long
,
unsigned
int
);
void
(
*
coherent_kern_range
)(
unsigned
long
,
unsigned
long
);
void
(
*
coherent_user_range
)(
unsigned
long
,
unsigned
long
);
void
(
*
flush_kern_dcache_page
)(
void
*
);
void
(
*
dma_inv_range
)(
unsigned
long
,
unsigned
long
);
...
...
@@ -175,6 +176,7 @@ extern struct cpu_cache_fns cpu_cache;
#define __cpuc_flush_user_all cpu_cache.flush_user_all
#define __cpuc_flush_user_range cpu_cache.flush_user_range
#define __cpuc_coherent_kern_range cpu_cache.coherent_kern_range
#define __cpuc_coherent_user_range cpu_cache.coherent_user_range
#define __cpuc_flush_dcache_page cpu_cache.flush_kern_dcache_page
/*
...
...
@@ -193,12 +195,14 @@ extern struct cpu_cache_fns cpu_cache;
#define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all)
#define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range)
#define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range)
#define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range)
#define __cpuc_flush_dcache_page __glue(_CACHE,_flush_kern_dcache_page)
extern
void
__cpuc_flush_kern_all
(
void
);
extern
void
__cpuc_flush_user_all
(
void
);
extern
void
__cpuc_flush_user_range
(
unsigned
long
,
unsigned
long
,
unsigned
int
);
extern
void
__cpuc_coherent_kern_range
(
unsigned
long
,
unsigned
long
);
extern
void
__cpuc_coherent_user_range
(
unsigned
long
,
unsigned
long
);
extern
void
__cpuc_flush_dcache_page
(
void
*
);
/*
...
...
@@ -267,6 +271,14 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr)
}
}
/*
* flush_cache_user_range is used when we want to ensure that the
* Harvard caches are synchronised for the user space address range.
* This is used for the ARM private sys_cacheflush system call.
*/
#define flush_cache_user_range(vma,start,end) \
__cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))
/*
* Perform necessary cache operations to ensure that data previously
* stored within this range of addresses can be executed by the CPU.
...
...
include/asm-arm/param.h
View file @
32f6e431
...
...
@@ -10,14 +10,13 @@
#ifndef __ASM_PARAM_H
#define __ASM_PARAM_H
#include <asm/arch/param.h>
/* for HZ */
#ifdef __KERNEL__
# include <asm/arch/param.h>
/* for kernel version of HZ */
#
ifndef __KERNEL_
HZ
#
define __KERNEL_HZ 100
#endif
#
ifndef
HZ
#
define HZ 100
/* Internal kernel timer frequency */
#
endif
#ifdef __KERNEL__
# define HZ __KERNEL_HZ
/* Internal kernel timer frequency */
# define USER_HZ 100
/* User interfaces are in "ticks" */
# define CLOCKS_PER_SEC (USER_HZ)
/* like times() */
#else
...
...
include/asm-arm/system.h
View file @
32f6e431
...
...
@@ -55,6 +55,38 @@
__val; \
})
#define __cacheid_present(val) (val != read_cpuid(CPUID_ID))
#define __cacheid_vivt(val) ((val & (15 << 25)) != (14 << 25))
#define __cacheid_vipt(val) ((val & (15 << 25)) == (14 << 25))
#define __cacheid_vipt_nonaliasing(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25))
#define __cacheid_vipt_aliasing(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25 | 1 << 23))
#define cache_is_vivt() \
({ \
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
(!__cacheid_present(__val)) || __cacheid_vivt(__val); \
})
#define cache_is_vipt() \
({ \
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
__cacheid_present(__val) && __cacheid_vipt(__val); \
})
#define cache_is_vipt_nonaliasing() \
({ \
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
__cacheid_present(__val) && \
__cacheid_vipt_nonaliasing(__val); \
})
#define cache_is_vipt_aliasing() \
({ \
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
__cacheid_present(__val) && \
__cacheid_vipt_aliasing(__val); \
})
/*
* This is used to ensure the compiler did actually allocate the register we
* asked it for some inline assembly sequences. Apparently we can't trust
...
...
include/asm-arm/unistd.h
View file @
32f6e431
...
...
@@ -475,51 +475,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6
#include <linux/types.h>
#include <linux/syscalls.h>
static
inline
pid_t
setsid
(
void
)
{
return
sys_setsid
();
}
static
inline
long
write
(
int
fd
,
const
char
*
buf
,
off_t
count
)
{
return
sys_write
(
fd
,
buf
,
count
);
}
static
inline
long
read
(
int
fd
,
char
*
buf
,
off_t
count
)
{
return
sys_read
(
fd
,
buf
,
count
);
}
static
inline
off_t
lseek
(
int
fd
,
off_t
offset
,
int
count
)
{
return
sys_lseek
(
fd
,
offset
,
count
);
}
static
inline
long
dup
(
int
fd
)
{
return
sys_dup
(
fd
);
}
static
inline
long
open
(
const
char
*
file
,
int
flag
,
int
mode
)
{
return
sys_open
(
file
,
flag
,
mode
);
}
static
inline
long
close
(
int
fd
)
{
return
sys_close
(
fd
);
}
static
inline
long
_exit
(
int
exitcode
)
{
return
sys_exit
(
exitcode
);
}
static
inline
pid_t
waitpid
(
pid_t
pid
,
int
*
wait_stat
,
int
options
)
{
return
sys_wait4
((
int
)
pid
,
wait_stat
,
options
,
NULL
);
}
extern
long
execve
(
const
char
*
file
,
char
**
argv
,
char
**
envp
);
struct
pt_regs
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment