aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-11-10 03:16:27 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-10 03:16:27 -0500
commit4ecd33d930591d41fe356160593a9076467b961c (patch)
treeb9051a334540bbce38db1b2b03cebb4cf1d51f73 /arch/sparc64
parent7d5a78cd98c3a5eb83bd6a061c5ea6ef1e9b8fcb (diff)
parentf7160c7573615ec82c691e294cf80d920b5d588d (diff)
Merge commit 'v2.6.28-rc4' into x86/apic
Diffstat (limited to 'arch/sparc64')
-rw-r--r--arch/sparc64/Kconfig3
-rw-r--r--arch/sparc64/Kconfig.debug2
-rw-r--r--arch/sparc64/kernel/Makefile2
-rw-r--r--arch/sparc64/kernel/ftrace.c26
-rw-r--r--arch/sparc64/kernel/pci.c10
-rw-r--r--arch/sparc64/kernel/time.c34
-rw-r--r--arch/sparc64/lib/PeeCeeI.c139
-rw-r--r--arch/sparc64/lib/mcount.S4
8 files changed, 72 insertions, 148 deletions
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
index 035b15af90d8..3b96e70b4670 100644
--- a/arch/sparc64/Kconfig
+++ b/arch/sparc64/Kconfig
@@ -11,8 +11,7 @@ config SPARC
11config SPARC64 11config SPARC64
12 bool 12 bool
13 default y 13 default y
14 select HAVE_DYNAMIC_FTRACE 14 select HAVE_FUNCTION_TRACER
15 select HAVE_FTRACE
16 select HAVE_IDE 15 select HAVE_IDE
17 select HAVE_LMB 16 select HAVE_LMB
18 select HAVE_ARCH_KGDB 17 select HAVE_ARCH_KGDB
diff --git a/arch/sparc64/Kconfig.debug b/arch/sparc64/Kconfig.debug
index d6d32d178fc8..c40515c06690 100644
--- a/arch/sparc64/Kconfig.debug
+++ b/arch/sparc64/Kconfig.debug
@@ -33,7 +33,7 @@ config DEBUG_PAGEALLOC
33 33
34config MCOUNT 34config MCOUNT
35 bool 35 bool
36 depends on STACK_DEBUG || FTRACE 36 depends on STACK_DEBUG || FUNCTION_TRACER
37 default y 37 default y
38 38
39config FRAME_POINTER 39config FRAME_POINTER
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile
index c0b8009ab196..b3e0b986bef8 100644
--- a/arch/sparc64/kernel/Makefile
+++ b/arch/sparc64/kernel/Makefile
@@ -5,6 +5,8 @@
5EXTRA_AFLAGS := -ansi 5EXTRA_AFLAGS := -ansi
6EXTRA_CFLAGS := -Werror 6EXTRA_CFLAGS := -Werror
7 7
8CFLAGS_REMOVE_ftrace.o = -pg
9
8extra-y := head.o init_task.o vmlinux.lds 10extra-y := head.o init_task.o vmlinux.lds
9 11
10obj-y := process.o setup.o cpu.o idprom.o reboot.o \ 12obj-y := process.o setup.o cpu.o idprom.o reboot.o \
diff --git a/arch/sparc64/kernel/ftrace.c b/arch/sparc64/kernel/ftrace.c
index 4298d0aee713..d0218e73f982 100644
--- a/arch/sparc64/kernel/ftrace.c
+++ b/arch/sparc64/kernel/ftrace.c
@@ -9,12 +9,12 @@
9 9
10static const u32 ftrace_nop = 0x01000000; 10static const u32 ftrace_nop = 0x01000000;
11 11
12notrace unsigned char *ftrace_nop_replace(void) 12unsigned char *ftrace_nop_replace(void)
13{ 13{
14 return (char *)&ftrace_nop; 14 return (char *)&ftrace_nop;
15} 15}
16 16
17notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) 17unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
18{ 18{
19 static u32 call; 19 static u32 call;
20 s32 off; 20 s32 off;
@@ -25,7 +25,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
25 return (unsigned char *) &call; 25 return (unsigned char *) &call;
26} 26}
27 27
28notrace int 28int
29ftrace_modify_code(unsigned long ip, unsigned char *old_code, 29ftrace_modify_code(unsigned long ip, unsigned char *old_code,
30 unsigned char *new_code) 30 unsigned char *new_code)
31{ 31{
@@ -59,7 +59,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
59 return faulted; 59 return faulted;
60} 60}
61 61
62notrace int ftrace_update_ftrace_func(ftrace_func_t func) 62int ftrace_update_ftrace_func(ftrace_func_t func)
63{ 63{
64 unsigned long ip = (unsigned long)(&ftrace_call); 64 unsigned long ip = (unsigned long)(&ftrace_call);
65 unsigned char old[MCOUNT_INSN_SIZE], *new; 65 unsigned char old[MCOUNT_INSN_SIZE], *new;
@@ -69,24 +69,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func)
69 return ftrace_modify_code(ip, old, new); 69 return ftrace_modify_code(ip, old, new);
70} 70}
71 71
72notrace int ftrace_mcount_set(unsigned long *data)
73{
74 unsigned long ip = (long)(&mcount_call);
75 unsigned long *addr = data;
76 unsigned char old[MCOUNT_INSN_SIZE], *new;
77
78 /*
79 * Replace the mcount stub with a pointer to the
80 * ip recorder function.
81 */
82 memcpy(old, &mcount_call, MCOUNT_INSN_SIZE);
83 new = ftrace_call_replace(ip, *addr);
84 *addr = ftrace_modify_code(ip, old, new);
85
86 return 0;
87}
88
89
90int __init ftrace_dyn_arch_init(void *data) 72int __init ftrace_dyn_arch_init(void *data)
91{ 73{
92 ftrace_mcount_set(data); 74 ftrace_mcount_set(data);
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
index 242ac1ccae7d..bdb7c0a6d83d 100644
--- a/arch/sparc64/kernel/pci.c
+++ b/arch/sparc64/kernel/pci.c
@@ -889,6 +889,7 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
889 889
890 for (i = 0; i <= PCI_ROM_RESOURCE; i++) { 890 for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
891 struct resource *rp = &pdev->resource[i]; 891 struct resource *rp = &pdev->resource[i];
892 resource_size_t aligned_end;
892 893
893 /* Active? */ 894 /* Active? */
894 if (!rp->flags) 895 if (!rp->flags)
@@ -906,8 +907,15 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
906 continue; 907 continue;
907 } 908 }
908 909
910 /* Align the resource end to the next page address.
911 * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1),
912 * because actually we need the address of the next byte
913 * after rp->end.
914 */
915 aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK;
916
909 if ((rp->start <= user_paddr) && 917 if ((rp->start <= user_paddr) &&
910 (user_paddr + user_size) <= (rp->end + 1UL)) 918 (user_paddr + user_size) <= aligned_end)
911 break; 919 break;
912 } 920 }
913 921
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
index 80d71a5ce1e3..141da3759091 100644
--- a/arch/sparc64/kernel/time.c
+++ b/arch/sparc64/kernel/time.c
@@ -490,6 +490,7 @@ static struct of_device_id __initdata bq4802_match[] = {
490 .name = "rtc", 490 .name = "rtc",
491 .compatible = "bq4802", 491 .compatible = "bq4802",
492 }, 492 },
493 {},
493}; 494};
494 495
495static struct of_platform_driver bq4802_driver = { 496static struct of_platform_driver bq4802_driver = {
@@ -503,39 +504,16 @@ static struct of_platform_driver bq4802_driver = {
503static unsigned char mostek_read_byte(struct device *dev, u32 ofs) 504static unsigned char mostek_read_byte(struct device *dev, u32 ofs)
504{ 505{
505 struct platform_device *pdev = to_platform_device(dev); 506 struct platform_device *pdev = to_platform_device(dev);
506 struct m48t59_plat_data *pdata = pdev->dev.platform_data; 507 void __iomem *regs = (void __iomem *) pdev->resource[0].start;
507 void __iomem *regs; 508
508 unsigned char val; 509 return readb(regs + ofs);
509
510 regs = (void __iomem *) pdev->resource[0].start;
511 val = readb(regs + ofs);
512
513 /* the year 0 is 1968 */
514 if (ofs == pdata->offset + M48T59_YEAR) {
515 val += 0x68;
516 if ((val & 0xf) > 9)
517 val += 6;
518 }
519 return val;
520} 510}
521 511
522static void mostek_write_byte(struct device *dev, u32 ofs, u8 val) 512static void mostek_write_byte(struct device *dev, u32 ofs, u8 val)
523{ 513{
524 struct platform_device *pdev = to_platform_device(dev); 514 struct platform_device *pdev = to_platform_device(dev);
525 struct m48t59_plat_data *pdata = pdev->dev.platform_data; 515 void __iomem *regs = (void __iomem *) pdev->resource[0].start;
526 void __iomem *regs; 516
527
528 regs = (void __iomem *) pdev->resource[0].start;
529 if (ofs == pdata->offset + M48T59_YEAR) {
530 if (val < 0x68)
531 val += 0x32;
532 else
533 val -= 0x68;
534 if ((val & 0xf) > 9)
535 val += 6;
536 if ((val & 0xf0) > 0x9A)
537 val += 0x60;
538 }
539 writeb(val, regs + ofs); 517 writeb(val, regs + ofs);
540} 518}
541 519
diff --git a/arch/sparc64/lib/PeeCeeI.c b/arch/sparc64/lib/PeeCeeI.c
index 8b313f11bc8d..46053e6ddd7b 100644
--- a/arch/sparc64/lib/PeeCeeI.c
+++ b/arch/sparc64/lib/PeeCeeI.c
@@ -20,107 +20,62 @@ void outsw(unsigned long __addr, const void *src, unsigned long count)
20{ 20{
21 void __iomem *addr = (void __iomem *) __addr; 21 void __iomem *addr = (void __iomem *) __addr;
22 22
23 if (count) { 23 while (count--) {
24 u16 *ps = (u16 *)src; 24 __raw_writew(*(u16 *)src, addr);
25 u32 *pi; 25 src += sizeof(u16);
26
27 if (((u64)src) & 0x2) {
28 u16 val = le16_to_cpup(ps);
29 outw(val, addr);
30 ps++;
31 count--;
32 }
33 pi = (u32 *)ps;
34 while (count >= 2) {
35 u32 w = le32_to_cpup(pi);
36
37 pi++;
38 outw(w >> 0, addr);
39 outw(w >> 16, addr);
40 count -= 2;
41 }
42 ps = (u16 *)pi;
43 if (count) {
44 u16 val = le16_to_cpup(ps);
45 outw(val, addr);
46 }
47 } 26 }
48} 27}
49 28
50void outsl(unsigned long __addr, const void *src, unsigned long count) 29void outsl(unsigned long __addr, const void *src, unsigned long count)
51{ 30{
52 void __iomem *addr = (void __iomem *) __addr; 31 void __iomem *addr = (void __iomem *) __addr;
32 u32 l, l2;
53 33
54 if (count) { 34 if (!count)
55 if ((((u64)src) & 0x3) == 0) { 35 return;
56 u32 *p = (u32 *)src;
57 while (count--) {
58 u32 val = cpu_to_le32p(p);
59 outl(val, addr);
60 p++;
61 }
62 } else {
63 u8 *pb;
64 u16 *ps = (u16 *)src;
65 u32 l = 0, l2;
66 u32 *pi;
67
68 switch (((u64)src) & 0x3) {
69 case 0x2:
70 count -= 1;
71 l = cpu_to_le16p(ps) << 16;
72 ps++;
73 pi = (u32 *)ps;
74 while (count--) {
75 l2 = cpu_to_le32p(pi);
76 pi++;
77 outl(((l >> 16) | (l2 << 16)), addr);
78 l = l2;
79 }
80 ps = (u16 *)pi;
81 l2 = cpu_to_le16p(ps);
82 outl(((l >> 16) | (l2 << 16)), addr);
83 break;
84
85 case 0x1:
86 count -= 1;
87 pb = (u8 *)src;
88 l = (*pb++ << 8);
89 ps = (u16 *)pb;
90 l2 = cpu_to_le16p(ps);
91 ps++;
92 l |= (l2 << 16);
93 pi = (u32 *)ps;
94 while (count--) {
95 l2 = cpu_to_le32p(pi);
96 pi++;
97 outl(((l >> 8) | (l2 << 24)), addr);
98 l = l2;
99 }
100 pb = (u8 *)pi;
101 outl(((l >> 8) | (*pb << 24)), addr);
102 break;
103 36
104 case 0x3: 37 switch (((unsigned long)src) & 0x3) {
105 count -= 1; 38 case 0x0:
106 pb = (u8 *)src; 39 /* src is naturally aligned */
107 l = (*pb++ << 24); 40 while (count--) {
108 pi = (u32 *)pb; 41 __raw_writel(*(u32 *)src, addr);
109 while (count--) { 42 src += sizeof(u32);
110 l2 = cpu_to_le32p(pi); 43 }
111 pi++; 44 break;
112 outl(((l >> 24) | (l2 << 8)), addr); 45 case 0x2:
113 l = l2; 46 /* 2-byte alignment */
114 } 47 while (count--) {
115 ps = (u16 *)pi; 48 l = (*(u16 *)src) << 16;
116 l2 = cpu_to_le16p(ps); 49 l |= *(u16 *)(src + sizeof(u16));
117 ps++; 50 __raw_writel(l, addr);
118 pb = (u8 *)ps; 51 src += sizeof(u32);
119 l2 |= (*pb << 16); 52 }
120 outl(((l >> 24) | (l2 << 8)), addr); 53 break;
121 break; 54 case 0x1:
122 } 55 /* Hold three bytes in l each time, grab a byte from l2 */
56 l = (*(u8 *)src) << 24;
57 l |= (*(u16 *)(src + sizeof(u8))) << 8;
58 src += sizeof(u8) + sizeof(u16);
59 while (count--) {
60 l2 = *(u32 *)src;
61 l |= (l2 >> 24);
62 __raw_writel(l, addr);
63 l = l2 << 8;
64 src += sizeof(u32);
65 }
66 break;
67 case 0x3:
68 /* Hold a byte in l each time, grab 3 bytes from l2 */
69 l = (*(u8 *)src) << 24;
70 src += sizeof(u8);
71 while (count--) {
72 l2 = *(u32 *)src;
73 l |= (l2 >> 8);
74 __raw_writel(l, addr);
75 l = l2 << 24;
76 src += sizeof(u32);
123 } 77 }
78 break;
124 } 79 }
125} 80}
126 81
diff --git a/arch/sparc64/lib/mcount.S b/arch/sparc64/lib/mcount.S
index fad90ddb3a28..7ce9c65f3592 100644
--- a/arch/sparc64/lib/mcount.S
+++ b/arch/sparc64/lib/mcount.S
@@ -93,7 +93,7 @@ mcount:
93 nop 93 nop
941: 941:
95#endif 95#endif
96#ifdef CONFIG_FTRACE 96#ifdef CONFIG_FUNCTION_TRACER
97#ifdef CONFIG_DYNAMIC_FTRACE 97#ifdef CONFIG_DYNAMIC_FTRACE
98 mov %o7, %o0 98 mov %o7, %o0
99 .globl mcount_call 99 .globl mcount_call
@@ -119,7 +119,7 @@ mcount_call:
119 .size _mcount,.-_mcount 119 .size _mcount,.-_mcount
120 .size mcount,.-mcount 120 .size mcount,.-mcount
121 121
122#ifdef CONFIG_FTRACE 122#ifdef CONFIG_FUNCTION_TRACER
123 .globl ftrace_stub 123 .globl ftrace_stub
124 .type ftrace_stub,#function 124 .type ftrace_stub,#function
125ftrace_stub: 125ftrace_stub: